rotv-mcp
Read-only MCP server for Romanian TV guide, streaming catalog, and entertainment concierge, exposing 13 tools for program search, recommendations, and event detection.
README
rotv-mcp
Read-only Model Context Protocol server for tv.madeinro.eu — Romanian TV guide, streaming catalog and an entertainment concierge, exposed as 13 tools to any MCP-compatible client (Claude, ChatGPT, or your own agent).
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 ~258 |
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 full evening plan across TV + streaming |
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. |
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
│
13 tools over in-memory EPG/streaming caches
│
JSON artifacts produced by the rotv-guide pipeline
(epg-normalized.json · epg-homepage.json · streaming-full.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— ~258 TV channels, −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.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。