# eu.madeinro/rotv-mcp (remote · tv.madeinro.eu)

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

- Trust score: 75/100 (medium)
- Change this week: +7
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `tv.madeinro.eu`: 75/100 (this document), [markdown](https://verifymcp.io/servers/eu-madeinro-rotv-mcp/tv.md), [page](https://verifymcp.io/servers/eu-madeinro-rotv-mcp/tv)

## Channel facts

- Endpoint: `https://tv.madeinro.eu/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `3.3.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 77/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2474 tokens (~154/item across 16 items; 14 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 87/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 53% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### Claude

```bash
claude mcp add --transport http eu-madeinro-rotv-mcp https://tv.madeinro.eu/mcp
```

### Codex

```toml
[mcp_servers.eu-madeinro-rotv-mcp]
url = "https://tv.madeinro.eu/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "eu-madeinro-rotv-mcp": {
      "type": "remote",
      "url": "https://tv.madeinro.eu/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add eu-madeinro-rotv-mcp --url https://tv.madeinro.eu/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  eu-madeinro-rotv-mcp:
    url: "https://tv.madeinro.eu/mcp"
```

### Other

```json
{
  "mcpServers": {
    "eu-madeinro-rotv-mcp": {
      "type": "http",
      "url": "https://tv.madeinro.eu/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 73, +3)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 70, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 68, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 67)

First indexed and scored.

## MCP tools (14)

### `tv_now_on_tv` (~174 tokens)

What is on TV right now

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.

Input parameters:

- `category` (string): Filter by channel category: Generaliste | Știri | Sport | Filme & Seriale | Documentare | Copii | Muzică | Altele
- `exclude_news` (boolean): Drop channels whose category is "Știri" (Romanian news channels)
- `limit` (integer): Max number of items to return
- `scope` (string): main = 14 main Romanian channels (PRO TV, Antena 1, Kanal D, TVR 1/2, Digi 24, etc.); all = all 254 channels

Output parameters:

- `asked_at_utc` (string)
- `count` (number)
- `generated_at` (string|null)
- `items` (array)
- `scope` (string)

### `tv_search_program` (~228 tokens)

Search Romanian TV programs

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".

Input parameters:

- `category` (string): Channel category: Generaliste | Știri | Sport | Filme & Seriale | Documentare | Copii | Muzică | Altele
- `channel` (string): Channel id, display name, or alias (e.g. "PRO TV", "tv-pro-tv", "HBO")
- `exclude_news` (boolean)
- `limit` (integer)
- `query` (string): Free text to match against program title (case/diacritic-insensitive)
- `timeframe` (string): Natural time reference: now | tonight | tomorrow | weekend | primetime | today | YYYY-MM-DD | ISO instant | ISO range "A/B"

Output parameters:

- `asked_at_utc` (string)
- `count` (number)
- `generated_at` (string|null)
- `items` (array)
- `timeframe_label` (string)
- `window` (object)

### `tv_get_prime_time` (~101 tokens)

Prime-time TV lineup

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 parameters:

- `date` (string): today | tomorrow | YYYY-MM-DD (interpreted in Europe/Bucharest)
- `exclude_news` (boolean)
- `scope` (string)

Output parameters:

- `asked_at_utc` (string)
- `channels` (array)
- `count` (number)
- `date` (string)
- `exclude_news` (boolean)
- `generated_at` (string|null)
- `scope` (string)
- `window` (object)
- `window_local` (string)

### `tv_recommend_today` (~132 tokens)

Recommend something to watch on Romanian TV

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 parameters:

- `exclude_news` (boolean): Drop news channels and news programs
- `limit` (integer)
- `prefer` (array): Preferred categories for ranking boost
- `timeframe` (string): now | tonight | primetime | tomorrow | weekend | today | YYYY-MM-DD | ISO range "A/B"

Output parameters:

- `asked_at_utc` (string)
- `count` (number)
- `exclude_news` (boolean)
- `generated_at` (string|null)
- `items` (array)
- `prefer` (array)
- `timeframe_label` (string)
- `window` (object)

### `tv_get_title_details` (~142 tokens)

Lookup a title across TV and streaming

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 parameters:

- `include_streaming` (boolean): Also look up the title in Netflix / HBO Max / Prime Video / Disney+ / Apple TV+ catalog for Romania
- `title` (string, required): Title to look up (case/diacritic-insensitive)
- `upcoming_window_hours` (integer): How far ahead (hours) to scan TV airings

Output parameters:

- `asked_at_utc` (string)
- `streaming` (array)
- `streaming_count` (number)
- `summary` (string)
- `title_query` (string)
- `tv_airings` (array)
- `tv_airings_count` (number)
- `upcoming_window_hours` (number)

### `tv_recommend_by_mood` (~196 tokens)

Recommend by mood

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 parameters:

- `dislike_genres` (array)
- `dislike_keywords` (array)
- `include_streaming_xref` (boolean)
- `limit` (integer)
- `mood` (string, required): Mood: obosit | vesel | concentrat | romantic | familie | captivant (also accepts tired, happy, focused, family, thrilling, etc.)
- `prefer` (array): Additional channel-category preferences (additive boost)
- `timeframe` (string): now | tonight | primetime | tomorrow | weekend | today | YYYY-MM-DD | ISO range "A/B"

Output parameters:

- `asked_at_utc` (string)
- `count` (number)
- `freshness` (object)
- `generated_at` (string|null)
- `items` (array)
- `mood` (string)
- `mood_label_ro` (string)
- `timeframe_label` (string)
- `window` (object)

### `tv_plan_evening` (~137 tokens)

Plan an evening

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.

Input parameters:

- `allow_channel_switch` (boolean)
- `duration_min` (integer)
- `max_gap_min` (integer)
- `max_segments` (integer)
- `mood` (string)
- `prefer` (array)
- `start` (string): Start time: "now" | "HH:MM" (Europe/Bucharest) | ISO instant

Output parameters:

- `alternatives` (array)
- `asked_at_utc` (string)
- `duration_budget_min` (number)
- `end_utc` (string)
- `freshness` (object)
- `mood` (string)
- `mood_label_ro` (string)
- `ok` (boolean)
- `plan` (array)
- `reason` (string|null)
- `start_utc` (string)
- `totals` (object)

### `tv_compare_options` (~108 tokens)

Compare TV options side-by-side

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 parameters:

- `mood` (string)
- `options` (array, required): Array of 2-5 titles (string) or { title, channel? } objects to compare
- `prefer` (array)
- `upcoming_window_hours` (integer)

Output parameters:

- `asked_at_utc` (string)
- `freshness` (object)
- `mood` (string)
- `mood_label_ro` (string)
- `options` (array)
- `winner`

### `tv_find_for_couple` (~142 tokens)

Find content for a couple

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.

Input parameters:

- `fairness` (string)
- `include_streaming_xref` (boolean)
- `limit` (integer)
- `min_score` (number)
- `person_a` (object, required): Preferences for person A
- `person_b` (object, required): Preferences for person B
- `timeframe` (string)

Output parameters:

- `asked_at_utc` (string)
- `count` (number)
- `degraded` (boolean)
- `fairness` (string)
- `freshness` (object)
- `items` (array)
- `min_score` (number)
- `person_a` (object)
- `person_b`
- `timeframe_label` (string)
- `window` (object)

### `tv_explain_recommendation` (~123 tokens)

Explain why a program was recommended

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 parameters:

- `channel` (string): Optional channel id/name/alias to disambiguate
- `context` (object)
- `start_utc` (string): Optional ISO start time to disambiguate
- `title` (string, required): Program title to explain

Output parameters:

- `alternatives_not_picked` (array)
- `confidence` (string)
- `context`
- `extracted_genres` (array)
- `fresh_status`
- `freshness` (object)
- `ok` (boolean)
- `reason` (string)
- `score_breakdown`
- `sources_used` (array)
- `streaming_xref`
- `subject` (object)

### `tv_check_freshness` (~77 tokens)

Check data freshness

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 parameters:

- `source` (string): Optional filter for which source to report

Output parameters:

- `asked_at_utc` (string)
- `freshness` (object)
- `now_utc` (string)
- `overall_stale` (boolean)
- `sources` (object)
- `summary` (string)

### `tv_concierge` (~523 tokens)

Personal Entertainment Concierge — decide for me

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".

Input parameters:

- `allow_pauses` (boolean)
- `duration_hours` (number): Shorthand when window is absent; starts at now.
- `exclude_categories` (array): Anti-noise filter (default: all four).
- `exclude_keywords` (array)
- `max_alternatives` (integer)
- `min_rating` (number)
- `mood` (string): obosit | vesel | concentrat | romantic | familie | captivant (RO/EN aliases accepted)
- `prefer` (array)
- `risk_aversion` (string): low = 3 alternatives, high = none
- `sources` (array)
- `window` (object): Explicit window. Skips lookahead.

Output parameters:

- `alternatives` (array)
- `anti_noise` (object)
- `asked_at_utc` (string)
- `context`
- `decision` (object)
- `freshness` (object)
- `important_today` (array)
- `lookahead`
- `ok` (boolean)
- `reason` (string)
- `reasoning` (array)
- `sources_used` (array)
- `window` (object)

### `tv_important_today` (~161 tokens)

Today's important broadcasts (major events)

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?".

Input parameters:

- `date` (string): Day to scan, YYYY-MM-DD in Europe/Bucharest. Default: today.
- `limit` (integer): Max number of events to return
- `min_tier` (integer): 1 = only major events (World Cup, Euro, Champions League, finals); 2 = also notable ones (national-team matches, knockout games)

Output parameters:

- `asked_at_utc` (string)
- `count` (number)
- `date` (string)
- `events` (array)
- `generated_at` (string|null)
- `hint` (string)
- `min_tier` (number)

### `tv_tonight_card` (~117 tokens)

Tonight's picks — visual card (MCP Apps)

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).

Output parameters:

- `date` (string)
- `decision`
- `generated_at` (string|null)
- `page_url` (string)
- `rail` (object)
- `stats`

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/eu-madeinro-rotv-mcp/tv#diagnostics

## Score history

- 2026-08-03: 75
- 2026-08-02: 74
- 2026-08-01: 74
- 2026-07-31: 73
- 2026-07-30: 70
- 2026-07-29: 69
- 2026-07-28: 69
- 2026-07-27: 68
- 2026-07-26: 67

## Links

- Remote endpoint: https://tv.madeinro.eu/mcp
- Repository: https://github.com/marian5070/rotv.mcp
- Website: https://tv.madeinro.eu/
- Changelog RSS feed: https://verifymcp.io/servers/eu-madeinro-rotv-mcp/tv/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/eu-madeinro-rotv-mcp/tv/changelog.json
- HTML version of this page: https://verifymcp.io/servers/eu-madeinro-rotv-mcp/tv
