rotv-mcp

Romanian TV guide MCP: live listings, prime time, search, recommendations, MCP Apps tonight card.

Should I use this

Quality & Safety

B
Description quality
100%
Schema completeness
82%
Naming quality
80%
Poisoning risk
60%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains suspicious base64-like encoded stringin tv_recommend_by_mood
  • MEDIUMTool description contains suspicious base64-like encoded stringin tv_concierge

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~8,079Tokens (tool definitions)
~5.1 KBTypical response size
Significant attention impact (6.31% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "rotv-mcp": {
      "url": "https://tv.madeinro.eu/mcp"
    }
  }
}

Remote endpoints

https://tv.madeinro.eu/mcpstreamable-http

What it can do

Tool inventory

Tools (14)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢tv_now_on_tv(scope, exclude_news, category, limit)

Returns the programs currently broadcasting on Romanian TV channels. Use this for "What is on TV now?" type questions. Default scope is the main channels; pass scope="all" for every channel in the guide.

Input Schema

{
  "type": "object",
  "properties": {
    "scope": {
      "type": "string",
      "enum": [
        "main",
        "all"
      ],
      "default": "main",
      "description": "main = the main Romanian channels (PRO TV, Antena 1, Kanal D, TVR 1/2, Digi 24, etc.); all = every channel in the guide (the live count is in tv_tonight_card stats.channelsMonitored)"
    },
    "exclude_news": {
      "type": "boolean",
      "default": false,
      "description": "Drop channels whose category is \"Știri\" (Romanian news channels)"
    },
    "category": {
      "type": "string",
      "description": "Filter by channel category: Generaliste | Știri | Sport | Filme & Seriale | Documentare | Copii | Muzică | Altele"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 15,
      "description": "Max number of items to return"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "scope": {
      "type": "string"
    },
    "count": {
      "type": "number"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "channel_id": {
            "type": "string"
          },
          "channel_name": {
            "type": "string"
          },
          "channel_category": {
            "type": [
              "string",
              "null"
            ]
          },
          "program": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "start_local": {
                "type": "string"
              },
              "start_utc": {
                "type": "string"
              },
              "stop_local": {
                "type": "string"
              },
              "stop_utc": {
                "type": "string"
              },
              "duration_min": {
                "type": "number"
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "start_local",
              "start_utc",
              "stop_local",
              "stop_utc",
              "duration_min"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "channel_id",
          "channel_name",
          "program"
        ],
        "additionalProperties": true
      }
    }
  },
  "required": [
    "asked_at_utc",
    "scope",
    "count",
    "items"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_search_program(query, channel, category, timeframe, exclude_news, ...)

Search programs across all Romanian TV channels in the guide by free-text title, channel, category, and time window. Use for queries like "documentaries on Discovery tomorrow", "football on Saturday", "what is on Antena 1 right now". Time references accepted: now, tonight, tomorrow, weekend, primetime, today, YYYY-MM-DD, ISO instant, or ISO range "A/B".

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Free text to match against program title (case/diacritic-insensitive)"
    },
    "channel": {
      "type": "string",
      "description": "Channel id, display name, or alias (e.g. \"PRO TV\", \"tv-pro-tv\", \"HBO\")"
    },
    "category": {
      "type": "string",
      "description": "Channel category: Generaliste | Știri | Sport | Filme & Seriale | Documentare | Copii | Muzică | Altele"
    },
    "timeframe": {
      "type": "string",
      "default": "now",
      "description": "Natural time reference: now | tonight | tomorrow | weekend | primetime | today | YYYY-MM-DD | ISO instant | ISO range \"A/B\""
    },
    "exclude_news": {
      "type": "boolean",
      "default": false
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 10
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "timeframe_label": {
      "type": "string"
    },
    "window": {
      "type": "object",
      "properties": {
        "from_utc": {
          "type": "string"
        },
        "to_utc": {
          "type": "string"
        }
      },
      "required": [
        "from_utc",
        "to_utc"
      ],
      "additionalProperties": true
    },
    "count": {
      "type": "number"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "channel_id": {
            "type": "string"
          },
          "channel_name": {
            "type": "string"
          },
          "channel_category": {
            "type": [
              "string",
              "null"
            ]
          },
          "program": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "start_local": {
                "type": "string"
              },
              "start_utc": {
                "type": "string"
              },
              "stop_local": {
                "type": "string"
              },
              "stop_utc": {
                "type": "string"
              },
              "duration_min": {
                "type": "number"
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "start_local",
              "start_utc",
              "stop_local",
              "stop_utc",
              "duration_min"
            ],
            "additionalProperties": true
          },
          "match_reason": {
            "type": "string"
          }
        },
        "required": [
          "channel_id",
          "channel_name",
          "program"
        ],
        "additionalProperties": true
      }
    }
  },
  "required": [
    "asked_at_utc",
    "timeframe_label",
    "window",
    "count",
    "items"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_get_prime_time(date, scope, exclude_news)

Returns the prime-time lineup (20:00–23:00 Europe/Bucharest) for a given date, grouped by channel. Use for queries like "what is on prime time tonight" or "tomorrow night TV". By default, news channels are excluded.

Input Schema

{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "default": "today",
      "description": "today | tomorrow | YYYY-MM-DD (interpreted in Europe/Bucharest)"
    },
    "scope": {
      "type": "string",
      "enum": [
        "main",
        "all"
      ],
      "default": "main"
    },
    "exclude_news": {
      "type": "boolean",
      "default": true
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "date": {
      "type": "string"
    },
    "window_local": {
      "type": "string"
    },
    "window": {
      "type": "object",
      "properties": {
        "from_utc": {
          "type": "string"
        },
        "to_utc": {
          "type": "string"
        }
      },
      "required": [
        "from_utc",
        "to_utc"
      ],
      "additionalProperties": true
    },
    "scope": {
      "type": "string"
    },
    "exclude_news": {
      "type": "boolean"
    },
    "count": {
      "type": "number"
    },
    "channels": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "channel_id": {
            "type": "string"
          },
          "channel_name": {
            "type": "string"
          },
          "channel_category": {
            "type": [
              "string",
              "null"
            ]
          },
          "programs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "start_local": {
                  "type": "string"
                },
                "start_utc": {
                  "type": "string"
                },
                "stop_local": {
                  "type": "string"
                },
                "stop_utc": {
                  "type": "string"
                },
                "duration_min": {
                  "type": "number"
                },
                "category": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "description": {
                  "type": "string"
                }
              },
              "required": [
                "title",
                "start_local",
                "start_utc",
                "stop_local",
                "stop_utc",
                "duration_min"
              ],
              "additionalProperties": true
            }
          }
        },
        "required": [
          "channel_id",
          "channel_name",
          "programs"
        ],
        "additionalProperties": true
      }
    }
  },
  "required": [
    "asked_at_utc",
    "date",
    "window_local",
    "window",
    "scope",
    "exclude_news",
    "count",
    "channels"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_recommend_today(timeframe, prefer, exclude_news, limit)

Returns up to N ranked program recommendations for a given timeframe. Uses a deterministic scorer that rewards films / documentaries / generalist channels, penalises news, and boosts programs starting within the next hour. Use for queries like "recommend me something for tonight", "ce e bun la TV diseară".

Input Schema

{
  "type": "object",
  "properties": {
    "timeframe": {
      "type": "string",
      "default": "tonight",
      "description": "now | tonight | primetime | tomorrow | weekend | today | YYYY-MM-DD | ISO range \"A/B\""
    },
    "prefer": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "filme",
          "seriale",
          "documentare",
          "sport",
          "copii",
          "muzica"
        ]
      },
      "default": [
        "filme",
        "documentare"
      ],
      "description": "Preferred categories for ranking boost"
    },
    "exclude_news": {
      "type": "boolean",
      "default": true,
      "description": "Drop news channels and news programs"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "default": 5
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "timeframe_label": {
      "type": "string"
    },
    "window": {
      "type": "object",
      "properties": {
        "from_utc": {
          "type": "string"
        },
        "to_utc": {
          "type": "string"
        }
      },
      "required": [
        "from_utc",
        "to_utc"
      ],
      "additionalProperties": true
    },
    "prefer": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "exclude_news": {
      "type": "boolean"
    },
    "count": {
      "type": "number"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "channel_id": {
            "type": "string"
          },
          "channel_name": {
            "type": "string"
          },
          "channel_category": {
            "type": [
              "string",
              "null"
            ]
          },
          "program": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "start_local": {
                "type": "string"
              },
              "start_utc": {
                "type": "string"
              },
              "stop_local": {
                "type": "string"
              },
              "stop_utc": {
                "type": "string"
              },
              "duration_min": {
                "type": "number"
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "start_local",
              "start_utc",
              "stop_local",
              "stop_utc",
              "duration_min"
            ],
            "additionalProperties": true
          },
          "score": {
            "type": "number"
          },
          "why_recommended": {
            "type": "string"
          }
        },
        "required": [
          "channel_id",
          "channel_name",
          "program",
          "score",
          "why_recommended"
        ],
        "additionalProperties": true
      }
    }
  },
  "required": [
    "asked_at_utc",
    "timeframe_label",
    "window",
    "prefer",
    "exclude_news",
    "count",
    "items"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_get_title_details(title, include_streaming, upcoming_window_hours)

Looks up a title across upcoming Romanian TV airings (next N hours, default 48) and the live streaming catalog for Romania (Netflix, HBO Max, Prime Video, Disney+, Apple TV+). Use for queries like "is Avatar on Netflix?", "when does Game of Thrones air next?".

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 2,
      "maxLength": 200,
      "description": "Title to look up (case/diacritic-insensitive)"
    },
    "include_streaming": {
      "type": "boolean",
      "default": true,
      "description": "Also look up the title in Netflix / HBO Max / Prime Video / Disney+ / Apple TV+ catalog for Romania"
    },
    "upcoming_window_hours": {
      "type": "integer",
      "minimum": 1,
      "maximum": 72,
      "default": 48,
      "description": "How far ahead (hours) to scan TV airings"
    }
  },
  "required": [
    "title"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "title_query": {
      "type": "string"
    },
    "asked_at_utc": {
      "type": "string"
    },
    "upcoming_window_hours": {
      "type": "number"
    },
    "tv_airings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "channel_id": {
            "type": "string"
          },
          "channel_name": {
            "type": "string"
          },
          "channel_category": {
            "type": [
              "string",
              "null"
            ]
          },
          "program": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "start_local": {
                "type": "string"
              },
              "start_utc": {
                "type": "string"
              },
              "stop_local": {
                "type": "string"
              },
              "stop_utc": {
                "type": "string"
              },
              "duration_min": {
                "type": "number"
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "start_local",
              "start_utc",
              "stop_local",
              "stop_utc",
              "duration_min"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "channel_id",
          "channel_name",
          "program"
        ],
        "additionalProperties": true
      }
    },
    "tv_airings_count": {
      "type": "number"
    },
    "streaming": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": true
      }
    },
    "streaming_count": {
      "type": "number"
    },
    "summary": {
      "type": "string"
    }
  },
  "required": [
    "title_query",
    "asked_at_utc",
    "upcoming_window_hours",
    "tv_airings",
    "tv_airings_count",
    "streaming",
    "streaming_count",
    "summary"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_recommend_by_mood(mood, timeframe, prefer, dislike_genres, dislike_keywords, ...)

Returns top-N Romanian TV programs ranked for a given mood (obosit/vesel/concentrat/romantic/familie/captivant — RO/EN aliases accepted). Combines: channel category, mood-fit (genre + duration + keywords), time proximity, and streaming cross-reference. Output includes mood_parts breakdown and freshness embedded.

Input Schema

{
  "type": "object",
  "properties": {
    "mood": {
      "type": "string",
      "minLength": 2,
      "maxLength": 40,
      "description": "Mood: obosit | vesel | concentrat | romantic | familie | captivant (also accepts tired, happy, focused, family, thrilling, etc.)"
    },
    "timeframe": {
      "type": "string",
      "default": "tonight",
      "description": "now | tonight | primetime | tomorrow | weekend | today | YYYY-MM-DD | ISO range \"A/B\""
    },
    "prefer": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Additional channel-category preferences (additive boost)"
    },
    "dislike_genres": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "dislike_keywords": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "default": 5
    },
    "include_streaming_xref": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "mood"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "mood": {
      "type": "string"
    },
    "mood_label_ro": {
      "type": "string"
    },
    "timeframe_label": {
      "type": "string"
    },
    "window": {
      "type": "object",
      "properties": {
        "from_utc": {
          "type": "string"
        },
        "to_utc": {
          "type": "string"
        }
      },
      "required": [
        "from_utc",
        "to_utc"
      ],
      "additionalProperties": true
    },
    "count": {
      "type": "number"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": true
      }
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "asked_at_utc",
    "mood",
    "mood_label_ro",
    "timeframe_label",
    "window",
    "count",
    "items",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_plan_evening(start, duration_min, mood, prefer, max_segments, ...)

Builds a TV watching plan that FILLS a window of time — either one long programme or 2-3 consecutive programmes with small gaps, ordered as a timeline. Use it when the user wants a schedule for the whole evening or a long window (3+ hours) rather than a single pick: "plan my evening", "ce văd toată seara", "fă-mi un program pentru 20–24". TV only (live Romanian EPG, no streaming titles); for ONE decision that may also be a streaming title, use tv_concierge. Accepts start time, duration budget, mood, and channel preferences. Output: ordered timeline + alternatives dropped + totals.

Input Schema

{
  "type": "object",
  "properties": {
    "start": {
      "type": "string",
      "default": "20:00",
      "description": "Start time: \"now\" | \"HH:MM\" (Europe/Bucharest) | ISO instant"
    },
    "duration_min": {
      "type": "integer",
      "minimum": 30,
      "maximum": 360,
      "default": 180
    },
    "mood": {
      "type": "string"
    },
    "prefer": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "max_segments": {
      "type": "integer",
      "minimum": 1,
      "maximum": 3,
      "default": 3
    },
    "allow_channel_switch": {
      "type": "boolean",
      "default": true
    },
    "max_gap_min": {
      "type": "integer",
      "minimum": 0,
      "maximum": 30,
      "default": 10
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "reason": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "start_utc": {
      "type": "string"
    },
    "end_utc": {
      "type": "string"
    },
    "duration_budget_min": {
      "type": "number"
    },
    "mood": {
      "type": "string"
    },
    "mood_label_ro": {
      "type": "string"
    },
    "plan": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": true
      }
    },
    "totals": {
      "type": "object",
      "properties": {
        "segments": {
          "type": "number"
        },
        "total_filled_min": {
          "type": "number"
        },
        "gap_min": {
          "type": "number"
        },
        "switches": {
          "type": "number"
        }
      },
      "required": [
        "segments",
        "total_filled_min",
        "gap_min",
        "switches"
      ],
      "additionalProperties": true
    },
    "alternatives": {
      "type": "array",
      "items": {
        "$ref": "#/properties/plan/items"
      }
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "ok",
    "asked_at_utc",
    "start_utc",
    "end_utc",
    "duration_budget_min",
    "mood",
    "mood_label_ro",
    "plan",
    "totals",
    "alternatives",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_compare_options(options, mood, prefer, upcoming_window_hours)

Compares 2-5 program titles by scoring each against the chosen mood, finding the next TV airing (next 48h by default) and looking each up in the streaming catalog. Returns side-by-side breakdown and a winner with reasoning.

Input Schema

{
  "type": "object",
  "properties": {
    "options": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "channel": {
                "type": "string"
              }
            },
            "required": [
              "title"
            ],
            "additionalProperties": false
          }
        ]
      },
      "minItems": 2,
      "maxItems": 5,
      "description": "Array of 2-5 titles (string) or { title, channel? } objects to compare"
    },
    "mood": {
      "type": "string"
    },
    "prefer": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "upcoming_window_hours": {
      "type": "integer",
      "minimum": 1,
      "maximum": 72,
      "default": 48
    }
  },
  "required": [
    "options"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "asked_at_utc": {
      "type": "string"
    },
    "mood": {
      "type": "string"
    },
    "mood_label_ro": {
      "type": "string"
    },
    "options": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": true
      }
    },
    "winner": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "total_score": {
              "type": "number"
            },
            "reason": {
              "type": "string"
            }
          },
          "required": [
            "query",
            "total_score",
            "reason"
          ],
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "asked_at_utc",
    "mood",
    "mood_label_ro",
    "options",
    "winner",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_find_for_couple(person_a, person_b, timeframe, fairness, min_score, ...)

Finds TV programs that satisfy two people with different moods/preferences. Default fairness=strict (min(scoreA,scoreB) >= threshold — no veto). If strict returns nothing it falls back in two declared steps: first fairness=average at the SAME min_score; only if that is still empty is min_score halved. The response always carries requested_fairness, requested_min_score, the effective fairness / min_score, threshold_relaxed and degraded — tell the user when their threshold was relaxed. Returns per-person score breakdown + compromise note when one side wins by >1.5 points.

Input Schema

{
  "type": "object",
  "properties": {
    "person_a": {
      "type": "object",
      "properties": {
        "mood": {
          "type": "string"
        },
        "prefer": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "dislike_genres": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "dislike_keywords": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false,
      "description": "Preferences for person A"
    },
    "person_b": {
      "type": "object",
      "properties": {
        "mood": {
          "$ref": "#/properties/person_a/properties/mood"
        },
        "prefer": {
          "$ref": "#/properties/person_a/properties/prefer"
        },
        "dislike_genres": {
          "$ref": "#/properties/person_a/properties/dislike_genres"
        },
        "dislike_keywords": {
          "$ref": "#/properties/person_a/properties/dislike_keywords"
        }
      },
      "additionalProperties": false,
      "description": "Preferences for person B"
    },
    "timeframe": {
      "type": "string",
      "default": "tonight"
    },
    "fairness": {
      "type": "string",
      "enum": [
        "strict",
        "average"
      ],
      "default": "strict"
    },
    "min_score": {
      "type": "number",
      "default": 1
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "default": 5
    },
    "include_streaming_xref": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "person_a",
    "person_b"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "asked_at_utc": {
      "type": "string"
    },
    "timeframe_label": {
      "type": "string"
    },
    "window": {
      "type": "object",
      "properties": {
        "from_utc": {
          "type": "string"
        },
        "to_utc": {
          "type": "string"
        }
      },
      "required": [
        "from_utc",
        "to_utc"
      ],
      "additionalProperties": true
    },
    "person_a": {
      "type": "object",
      "properties": {},
      "additionalProperties": true
    },
    "person_b": {
      "$ref": "#/properties/person_a"
    },
    "fairness": {
      "type": "string"
    },
    "min_score": {
      "type": "number"
    },
    "requested_fairness": {
      "type": "string"
    },
    "requested_min_score": {
      "type": "number"
    },
    "threshold_relaxed": {
      "type": "boolean"
    },
    "degraded": {
      "type": "boolean"
    },
    "count": {
      "type": "number"
    },
    "items": {
      "type": "array",
      "items": {
        "$ref": "#/properties/person_a"
      }
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "asked_at_utc",
    "timeframe_label",
    "window",
    "person_a",
    "person_b",
    "fairness",
    "min_score",
    "degraded",
    "count",
    "items",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_explain_recommendation(title, channel, start_utc, context)

Returns a full score breakdown for a specific program in a given mood/context: per-component value + reason, extracted genres, streaming cross-ref, freshness, sources used, and a list of alternatives that were not picked (with the specific reason each was dropped). Use to understand or debug a recommendation.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 2,
      "maxLength": 200,
      "description": "Program title to explain"
    },
    "channel": {
      "type": "string",
      "description": "Optional channel id/name/alias to disambiguate"
    },
    "start_utc": {
      "type": "string",
      "description": "Optional ISO start time to disambiguate"
    },
    "context": {
      "type": "object",
      "properties": {
        "mood": {
          "type": "string"
        },
        "prefer": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "timeframe": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "title"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "reason": {
      "type": "string"
    },
    "subject": {
      "type": "object",
      "properties": {},
      "additionalProperties": true
    },
    "context": {
      "$ref": "#/properties/subject"
    },
    "score_breakdown": {
      "$ref": "#/properties/subject"
    },
    "extracted_genres": {
      "type": "array",
      "items": {
        "$ref": "#/properties/subject"
      }
    },
    "streaming_xref": {
      "anyOf": [
        {
          "$ref": "#/properties/subject"
        },
        {
          "type": "null"
        }
      ]
    },
    "sources_used": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "fresh_status": {
      "$ref": "#/properties/subject"
    },
    "alternatives_not_picked": {
      "type": "array",
      "items": {
        "$ref": "#/properties/subject"
      }
    },
    "confidence": {
      "type": "string"
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "ok",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_check_freshness(source)

Reports the last-updated time of each underlying data source (EPG normalized, EPG homepage, streaming catalog), the age in minutes, the expected next refresh, and whether any source is stale (older than 1.5× the expected refresh interval).

Input Schema

{
  "type": "object",
  "properties": {
    "source": {
      "type": "string",
      "enum": [
        "all",
        "epg",
        "streaming"
      ],
      "default": "all",
      "description": "Optional filter for which source to report"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "asked_at_utc": {
      "type": "string"
    },
    "now_utc": {
      "type": "string"
    },
    "sources": {
      "type": "object",
      "properties": {},
      "additionalProperties": true
    },
    "overall_stale": {
      "type": "boolean"
    },
    "summary": {
      "type": "string"
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "asked_at_utc",
    "now_utc",
    "sources",
    "overall_stale",
    "summary",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_concierge(window, duration_hours, mood, exclude_categories, exclude_keywords, ...)

You have a window of free time — decide for me what to watch right now. Returns ONE primary decision (TV program OR streaming title) with confidence percentage, plus best_by_source when both TV and streaming were considered (the best TV airing in the window next to the best catalog title — present both to the user when gap_pct is small, since streaming is available any time and TV only now), full reasoning breakdown, and up to 3 diverse alternatives with explicit trade-offs (pros/cons, reason not picked). Picks across live Romanian TV EPG AND streaming catalog (Netflix, HBO Max, Disney+, Prime Video, Apple TV+, SkyShowtime). Built-in anti-noise filter automatically removes news, political talk, reality shows, talk-shows (NO manual filtering needed by the model). Built-in title dedup (handles ~46% duplicate-airing ratio in TV EPG). Built-in opportunity-cost lookahead (flags better options just outside the window). Event-aware: major broadcasts (World Cup / Euro / Champions League / finals) get an importance boost in ranking AND are always listed in the important_today field, even when the mood-based pick is something else — for questions like "what is important today?", prefer tv_important_today. PREFER THIS TOOL over tv_recommend_by_mood and tv_recommend_today whenever the user wants ONE answer / a single decision — those tools return ranked LISTS for browsing, this tool returns a DECISION. It returns exactly ONE pick and leaves the rest of the window as a pause: when the user wants the whole window FILLED with several programmes in sequence ("plan my evening", "ce văd toată seara", "fă-mi un program pentru 20–24", a TV window of 3+ hours), use tv_plan_evening instead. Routes any mood internally (obosit / vesel / concentrat / romantic / familie / captivant + EN aliases tired/happy/focused/romantic/family/thrilling). Trigger phrases: "what should I do", "decide for me", "pick for me", "I have X hours", "ce să fac", "am 2 ore", "alege tu", "mood X durată Y", "o singură decizie", "fii consilierul meu", "what to watch", "concierge me".

Input Schema

{
  "type": "object",
  "properties": {
    "window": {
      "type": "object",
      "properties": {
        "start": {
          "type": "string",
          "default": "now",
          "description": "\"now\" | \"HH:MM\" (Europe/Bucharest) | ISO instant"
        },
        "duration_min": {
          "type": "integer",
          "minimum": 30,
          "maximum": 360,
          "default": 120
        }
      },
      "additionalProperties": false,
      "description": "Explicit window. Skips lookahead."
    },
    "duration_hours": {
      "type": "number",
      "minimum": 0.5,
      "maximum": 6,
      "description": "Shorthand when window is absent; starts at now."
    },
    "mood": {
      "type": "string",
      "description": "obosit | vesel | concentrat | romantic | familie | captivant (RO/EN aliases accepted)"
    },
    "exclude_categories": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "politica",
          "reality",
          "talkshow",
          "stiri"
        ]
      },
      "default": [
        "politica",
        "reality",
        "talkshow",
        "stiri"
      ],
      "description": "Anti-noise filter (default: all four)."
    },
    "exclude_keywords": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "tv",
          "streaming"
        ]
      },
      "default": [
        "tv",
        "streaming"
      ]
    },
    "max_alternatives": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5,
      "default": 3
    },
    "risk_aversion": {
      "type": "string",
      "enum": [
        "low",
        "high"
      ],
      "default": "low",
      "description": "low = 3 alternatives, high = none"
    },
    "allow_pauses": {
      "type": "boolean",
      "default": true
    },
    "min_rating": {
      "type": "number",
      "minimum": 0,
      "maximum": 10,
      "default": 0,
      "description": "Hard minimum rating (0-10). When > 0, only titles with a MEASURED rating at or above it are eligible: streaming catalog rating, or the IMDb rating the TV guide declares. TV programmes without any rating (most sport, news, shows) are excluded, not waved through."
    },
    "prefer": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "reason": {
      "type": "string"
    },
    "asked_at_utc": {
      "type": "string"
    },
    "window": {
      "type": "object",
      "properties": {},
      "additionalProperties": true
    },
    "context": {
      "$ref": "#/properties/window"
    },
    "decision": {
      "type": "object",
      "properties": {
        "degraded": {
          "type": "boolean"
        },
        "primary_kind": {
          "type": [
            "string",
            "null"
          ]
        },
        "primary_title": {
          "type": [
            "string",
            "null"
          ]
        },
        "primary_summary": {
          "type": "string"
        },
        "segments": {
          "type": "array",
          "items": {
            "$ref": "#/properties/window"
          }
        },
        "confidence_pct": {
          "type": "number"
        },
        "confidence_label": {
          "type": "string"
        },
        "confidence_breakdown": {
          "anyOf": [
            {
              "$ref": "#/properties/window"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "degraded",
        "primary_kind",
        "primary_title",
        "segments",
        "confidence_pct",
        "confidence_label",
        "confidence_breakdown"
      ],
      "additionalProperties": true
    },
    "reasoning": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "anti_noise": {
      "type": "object",
      "properties": {
        "enabled_categories": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "filtered_count": {
          "type": "number"
        },
        "by_category": {
          "$ref": "#/properties/window"
        }
      },
      "required": [
        "enabled_categories",
        "filtered_count",
        "by_category"
      ],
      "additionalProperties": true
    },
    "alternatives": {
      "type": "array",
      "items": {
        "$ref": "#/properties/window"
      }
    },
    "best_by_source": {
      "$ref": "#/properties/window"
    },
    "lookahead": {
      "$ref": "#/properties/window"
    },
    "important_today": {
      "type": "array",
      "items": {
        "$ref": "#/properties/window"
      }
    },
    "sources_used": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "freshness": {
      "type": "object",
      "properties": {
        "epg_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "streaming_age_min": {
          "type": [
            "number",
            "null"
          ]
        },
        "stale": {
          "type": "boolean"
        }
      },
      "required": [
        "stale"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "ok",
    "asked_at_utc",
    "window",
    "context",
    "decision",
    "reasoning",
    "anti_noise",
    "alternatives",
    "lookahead",
    "sources_used",
    "freshness"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_important_today(date, min_tier, limit)

What actually matters on Romanian TV today: World Cup / Euro / Champions League matches, finals, knockout games, national-team fixtures. Detected from real EPG text (titles + descriptions) with quoted evidence — the EPG has no structured event metadata, so detection is keyword-based and honest about it. Each event carries live_status (live / replay / unknown) with the evidence it was derived from; unknown means the EPG does not say whether the broadcast is live. Use this FIRST for questions like "what's important to watch today?".

Input Schema

{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Day to scan, YYYY-MM-DD in Europe/Bucharest. Default: today."
    },
    "min_tier": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2,
      "default": 2,
      "description": "1 = only major events (World Cup, Euro, Champions League, finals); 2 = also notable ones (national-team matches, knockout games)"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25,
      "default": 10,
      "description": "Max number of events to return"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "asked_at_utc": {
      "type": "string"
    },
    "date": {
      "type": "string"
    },
    "min_tier": {
      "type": "number"
    },
    "count": {
      "type": "number"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": true
      }
    },
    "hint": {
      "type": "string"
    }
  },
  "required": [
    "asked_at_utc",
    "date",
    "min_tier",
    "count",
    "events",
    "hint"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢tv_tonight_card

The daily "what is worth watching tonight?" card: one main decision (importance-scored major event, or a deterministic prime-time film fallback) plus one pick per vertical — TV, streaming (official Netflix RO top 10), theater (a stage performance happening TODAY, else an online play; a future date only when nothing is on tonight, labelled as the next performance), cinema (box office ∩ today's real screenings, else one of today's most-screened films) — and measured stats. Same data as the tv.madeinro.eu homepage hero, regenerated daily. In MCP Apps-capable hosts this renders as an interactive card (ui://rotv/tonight-card).

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "generated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "date": {
      "type": "string"
    },
    "decision": {
      "anyOf": [
        {
          "type": "object",
          "properties": {},
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    },
    "rail": {
      "type": "object",
      "properties": {
        "tv": {
          "anyOf": [
            {
              "$ref": "#/properties/decision/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        },
        "streaming": {
          "anyOf": [
            {
              "$ref": "#/properties/decision/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        },
        "teatru": {
          "anyOf": [
            {
              "$ref": "#/properties/decision/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        },
        "cinema": {
          "anyOf": [
            {
              "$ref": "#/properties/decision/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "stats": {
      "anyOf": [
        {
          "$ref": "#/properties/decision/anyOf/0"
        },
        {
          "type": "null"
        }
      ]
    },
    "page_url": {
      "type": "string"
    }
  },
  "required": [
    "generated_at",
    "date",
    "decision",
    "rail",
    "stats",
    "page_url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools