rotv-mcp
Romanian TV guide MCP: live listings, prime time, search, recommendations, MCP Apps tonight card.
¿Debería usar esto?
Calidad y seguridad
Hallazgos (3)
- HIGH
- MEDIUMen tv_recommend_by_mood
- MEDIUMen tv_concierge
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"rotv-mcp": {
"url": "https://tv.madeinro.eu/mcp"
}
}
}Puntos de conexión remotos
https://tv.madeinro.eu/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (14)
🟢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 14 main channels; pass scope="all" for the full 254-channel list.
Esquema de entrada
{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"main",
"all"
],
"default": "main",
"description": "main = 14 main Romanian channels (PRO TV, Antena 1, Kanal D, TVR 1/2, Digi 24, etc.); all = all 254 channels"
},
"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#"
}Esquema de salida
{
"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 254 Romanian TV channels 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".
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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.
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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ă".
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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?".
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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.
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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 coherent TV watching plan for an evening — either one long program filling the budget or 2-3 segments with small gaps. Accepts start time, duration budget, mood, and channel preferences. Output: ordered timeline + alternatives dropped + totals.
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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.
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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). Auto-falls-back to fairness=average if strict returns empty, marked with degraded:true. Returns per-person score breakdown + compromise note when one side wins by >1.5 points.
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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"
},
"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.
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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).
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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, 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, tv_plan_evening, and tv_recommend_today whenever the user wants ONE answer / a single decision / a plan for a specific window — those tools return ranked LISTS for browsing, this tool returns a DECISION. 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".
Esquema de entrada
{
"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
},
"prefer": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Esquema de salida
{
"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"
}
},
"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. Use this FIRST for questions like "what's important to watch today?".
Esquema de entrada
{
"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#"
}Esquema de salida
{
"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 (online + stage union), cinema (box office ∩ today's real screenings) — 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).
Esquema de entrada
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}Esquema de salida
{
"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#"
}Comunidad
Evidencia