rotv-mcp
MCP serverSearchRotv gives your AI a guide to Romanian television. Once added, your AI can tell you what is airing live right now, what is on in prime time, and recommend programs worth watching tonight.
Use rotv-mcp in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add rotv-mcp and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the tv now on tv tool from rotv-mcp
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Details
Available today. Use it from your connected AI after setup.
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Add Rotv, then ask your AI what is on Romanian TV tonight.
What your AI can do with it
- See what is airing on Romanian TV right now
- Browse prime time schedules
- Search the TV guide for programs
- Get recommendations for what to watch
- Show a tonight card with the evening's top picks
Install rotv-mcp
The server’s own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each client’s config.
Claude Code
claude mcp add --transport http --scope user rotv-mcp 'https://tv.madeinro.eu/mcp'Run it once in your project, then open /mcp to approve any sign-in the server asks for.
Claude Desktop
https://tv.madeinro.eu/mcpAdd a custom connector in Settings, paste this address, and approve the sign-in.
Cursor
cursor://anysphere.cursor-deeplink/mcp/install?name=rotv-mcp&config=eyJ1cmwiOiJodHRwczovL3R2Lm1hZGVpbnJvLmV1L21jcCJ9Open the link and Cursor adds the server at that address.
ChatGPT
https://tv.madeinro.eu/mcpIn Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.
Codex
codex mcp add rotv-mcp --url 'https://tv.madeinro.eu/mcp'Run it once, then sign in with codex mcp login rotv-mcp if the server asks for an account.
From the project's README
As published by marian5070/rotv.mcp in README.md.
Read-only Model Context Protocol server for tv.madeinro.eu — Romanian TV guide, streaming catalog and an entertainment concierge, exposed as 14 tools to any MCP-compatible client (Claude, ChatGPT, or your own agent) — including an MCP Apps visual tonight-card.
Live endpoint: https://tv.madeinro.eu/mcp · no auth · streamable HTTP
Registry: eu.madeinro/rotv-mcp (official MCP registry)
Human-readable overview: tv.madeinro.eu/mcp/help
Quick start
No installation, no key — talk to the live server directly:
# What's important on Romanian TV today? (World Cup, finals, Romania playing…)
curl -X POST https://tv.madeinro.eu/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{
"name":"tv_important_today","arguments":{}}}'
# Decide for me: I have 2 free hours tonight
curl -X POST https://tv.madeinro.eu/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
"name":"tv_concierge","arguments":{"duration_hours":2,"mood":"captivant"}}}'
As an MCP client (e.g. Claude Code):
claude mcp add --transport http rotv https://tv.madeinro.eu/mcp
Tools
All tools are read-only and declare the standard MCP annotations
(readOnlyHint: true), so well-behaved clients can run them without
per-call confirmation. Time references accepted throughout: now, tonight,
tomorrow, weekend, primetime, or ISO 8601 instant/range.
Core EPG (v1)
| Tool | What it does |
|---|---|
tv_now_on_tv | What's on right now — the 14 main Romanian channels or all channels in the guide |
tv_search_program | Search the schedule by keywords and timeframe |
tv_get_prime_time | Tonight's 20:00–23:00 (Europe/Bucharest) lineup, grouped by channel |
tv_recommend_today | Ranked picks for today (channel quality, timing, preferences) |
tv_get_title_details | One title across TV airings + streaming providers |
Decision layer (v2)
| Tool | What it does |
|---|---|
tv_recommend_by_mood | Ranked list matched to a mood (obosit / vesel / concentrat / romantic / familie / captivant) |
tv_plan_evening | A TV plan that fills a long window with consecutive programmes (TV only; one pick incl. streaming = tv_concierge) |
tv_compare_options | Side-by-side trade-offs between candidate picks |
tv_find_for_couple | Picks that satisfy two different moods at once |
tv_explain_recommendation | Transparent scoring breakdown for any candidate |
tv_check_freshness | How fresh the underlying EPG/streaming data is |
Concierge (v3)
| Tool | What it does |
|---|---|
tv_concierge | One decision, not a list. A single primary pick for your free-time window with a confidence % and full reasoning, plus up to 3 diverse alternatives with explicit trade-offs. Built-in anti-noise filter (news/politics/reality), title dedup, opportunity-cost lookahead — and event awareness (below). |
tv_important_today | What actually matters today: World Cup / Euro / Champions League matches, finals, knockout games, Romania's team and clubs. Every event ships with quoted evidence from the EPG text. |
MCP Apps (v3.2+)
| Tool | What it does |
|---|---|
tv_concierge (card since v3.3) | The concierge decision above also renders as a visual card (ui://rotv/concierge-card): the single primary pick with channel/platform, local time, disclosed confidence and reasoning, the important-event banner, and the alternatives with their explicit trade-offs. |
tv_tonight_card | Tonight's picks as a visual card. The daily 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), cinema (box office ∩ today's screenings) — and measured stats. Declares _meta.ui.resourceUri → ui://rotv/tonight-card; hosts supporting the MCP Apps extension (Claude, ChatGPT, VS Code, Goose) render it as an interactive card in a sandboxed iframe, everyone else gets the same structured JSON. |
The importance layer
Romanian EPG data is diffuse: every program's genre is literally "General",
descriptions are often empty, and a World Cup knockout match can appear as just
"Fotbal World Cup". There is no structured field that says "this matters".
So importance is detected from real text, with quoted evidence (src/lib/importance.mjs):
- Tier 1 — major: World Cup / Euro / Champions League / Olympics / Grand Slams / finals in the title
- Tier 2 — notable: country-vs-country fixtures ("Spania - Belgia"), competition mentions in descriptions
- Boosts: Romania playing (national team or clubs in European cups), knockout stages, mainstream national channel
- Demotions: recaps, studio/practice shows, broadcasts too short to be the live event
Every result carries reasons[] quoting the text that matched — the detector
never claims more than the data supports. The same signal feeds
tv_concierge as an event_importance confidence axis, so a description-less
World Cup match no longer loses to a well-tagged filler movie, and every
concierge answer lists tier-1 events in an important_today field even when
the mood-based pick is something else.
Architecture
MCP client ── POST /mcp (streamable HTTP, stateless: fresh server per request)
│
express (loopback :3010)
access log → rate limit (60 rpm) → optional bearer auth
│
14 tools over in-memory EPG/streaming caches
+ 2 MCP Apps UI resources (tonight-card · concierge-card)
│
JSON artifacts produced by the rotv-guide pipeline
(epg-normalized.json · epg-homepage.json · streaming-full.json
· tonight-picks.json)
hot-reloaded via fs.watch (debounced 750 ms)
- Stateless streamable HTTP (
enableJsonResponse) — oneMcpServer+ transport per POST; safe behind any proxy/tunnel. - Data (read-only, produced by the rotv-guide
pipeline, never modified by this service):
epg-normalized.json— all TV channels in the guide (260+; the count is computed, not fixed), −6h to +72h, ISO 8601 UTCepg-homepage.json— 15 main channels, −2h to +36hstreaming-full.json— Netflix / HBO Max / Prime / Disney+ / Apple TV+ catalogs- Paths configurable via
ROTV_DATA_DIR.
- Telemetry: every tool call logs one JSON line
(
{evt:"tool", tool, ms, ok, q:{…}}) to stdout for log analysis.
Running it yourself
Requires Node ≥ 24 and the rotv-guide data artifacts.
cp .env.example .env # PORT, RATE_LIMIT_RPM, optional MCP_AUTH_TOKEN
npm install
ROTV_DATA_DIR=/path/to/rotv-guide/public/data npm start
Production runs under pm2 behind a Cloudflare tunnel — the path-based ingress
rule routes tv.madeinro.eu/mcp/* to localhost:3010, above the catch-all of
the main site:
pm2 start ecosystem.config.cjs && pm2 save
curl https://tv.madeinro.eu/mcp/health
Tests
node --test test/importance.test.mjs # importance detector, 12 cases
npm run smoke # 26 end-to-end JSON-RPC checks
BASE=https://tv.madeinro.eu npm run smoke # same suite against production
License
MIT © 2026 Marian Matinca. The live server surfaces data from public EPG sources, refreshed automatically by the rotv-guide pipeline.
Tools it offers (14)
What this server listed when Ahel dialed its public endpoint in Sep 2026, with no key and no account of yours. The names are the server’s own.
tv_now_on_tvtv_search_programtv_get_prime_timetv_recommend_todaytv_get_title_detailstv_recommend_by_moodtv_plan_eveningtv_compare_optionstv_find_for_coupletv_explain_recommendationtv_check_freshnesstv_conciergetv_important_todaytv_tonight_card
Signals
- Last commit
- Sep 2026
Advanced
- Delivery
- rotv-mcp MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
- Item type
- mcp-server
- Key
eu-madeinro-rotv-mcp- Source
- github.com/marian5070/rotv.mcp
- Hosted endpoint
https://tv.madeinro.eu/mcp
github.com/marian5070/rotv.mcp