Tell an AI agent to build you a TV channel
My TV Channel runs 24/7 linear channels — the kind that just play, with no menu to browse. Connect Claude or any MCP client and it can do the whole job: create the channel, import the videos, decide how often each one plays, and hand you back a URL that is already broadcasting.
On air now
A channel that no human programmed
demo.my-tv-channel.com is a real, continuously broadcasting channel. It was created, filled, weighted and scheduled entirely through the tools on this page — the channel record, the five programmes, the per-video weights and the 24/7 schedule. Nobody opened the app.
It carries broadcast test patterns on a twenty-minute loop, so it runs forever with no rights questions. Open it on a phone, a laptop or an Apple TV; it is playing right now.
Connect in three minutes
1. Get a key. Create one at my-tv-channel.com/agent-keys/, or in the iOS or macOS app under Profile → Agent Access. Any subscription tier works. The key is shown exactly once, so paste it somewhere safe before you close the page.
2. Add the server. Streamable HTTP, stateless, no session id to track.
Claude Code
claude mcp add --transport http my-tv-channel \
https://my-tv-channel.com/mcp \
--header "Authorization: Bearer mytv_sk_YOUR_KEY"
Claude Desktop, or any client using mcpServers JSON
{
"mcpServers": {
"my-tv-channel": {
"type": "http",
"url": "https://my-tv-channel.com/mcp",
"headers": {
"Authorization": "Bearer mytv_sk_YOUR_KEY"
}
}
}
}
Anything else
Plain JSON-RPC 2.0 over HTTP POST. No SDK required:
curl -s -X POST https://my-tv-channel.com/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
initialize and tools/list answer without a key, so a client can inspect the
server before credentials are configured. tools/call needs one.
https://my-tv-channel.com/mcp is a short alias for
https://my-tv-channel.com/api/mytvchannel/mcp, which is what the MCP registry and
Smithery publish. They run the same script and will never disagree — use whichever you
already have.
Things to say once it is connected
These work as written. The arrow shows what the agent actually calls.
get_account_status. A good first call: it also lists every channel you have and exactly what each one still needs before it can go live.retro-arcade, import these four videos, and tell me when it’s broadcasting.”check_handle_available → create_channel → import_video_from_url ×4 → get_transcode_status until ready → get_channel until scheduleStatus is active. The channel then streams at https://retro-arcade.my-tv-channel.com.list_assets → set_asset_weight per video → regenerate_schedule. The last step is the one people forget; without it the new weights are stored but never reach the air.get_schedule returns the EPG with start and end times.validate_schedule_rules first — it saves nothing and returns a simulated 24-hour grid — then set_schedule_rules.The 19 tools
Every tool ships MCP annotations (readOnlyHint, destructiveHint,
idempotentHint, openWorldHint), so a client can decide for itself what to run
unattended. “Destructive” here means it changes or removes something you can see — none of it
is unrecoverable. Archiving keeps the handle and the videos; deleting a video is a soft delete.
| Tool | Does | Safe to autorun? |
|---|---|---|
| get_account_status | Tier, limits, quota used and remaining, all channels and what they need to go live | read-only |
| list_channels | Channels owned by this account | read-only |
| get_channel | One channel — includes scheduleStatus, poll this to confirm it went live | read-only |
| check_handle_available | Is a handle free | read-only |
| list_assets | Videos on a channel | read-only |
| get_transcode_status | Poll progress; tells you when launch requirements are met | read-only |
| get_schedule | Read the EPG | read-only |
| get_schedule_rules | Current ruleset | read-only |
| validate_schedule_rules | Dry-run a ruleset; saves nothing, returns a simulated 24-hour grid | read-only |
| create_channel | Create a channel | writes |
| update_channel | Rename, re-describe, re-tag, change visibility | writes |
| import_video_from_url | The main way to add content. Import from a direct media URL | writes, external |
| import_youtube_video | Import a YouTube video the owner proves they own | writes, external |
| set_asset_weight | How often a video plays (0–10), plus title and tags | writes |
| retry_transcode | Re-queue a failed transcode | writes |
| archive_channel | Take off air — archives, does not destroy | destructive |
| delete_asset | Remove a video (soft delete, auto-regenerates) | destructive |
| regenerate_schedule | Rebuild the schedule now — replaces what was going to air | destructive |
| set_schedule_rules | Replaces the whole ruleset | destructive |
Two things that surprise people
You cannot upload local files over MCP
MCP tool arguments are JSON; there is no multipart channel. import_video_from_url is
therefore the ingestion path for an agent, and the video has to be reachable at a direct,
public, unauthenticated URL — not a web page, not something behind a login. If your files are on
your laptop, upload them through the app and let the agent take it from there.
Weights only air when the schedule is generated
A channel builds its schedule the instant it crosses the launch threshold. Weights set after that
are stored but do not change what is on air until a regeneration. Either set each video’s weight as
you import it, or call regenerate_schedule when you are done.
No MCP? Drive the REST API
Everything the MCP server does, it does by forwarding to a REST endpoint that already implements it,
passing your Authorization header straight through. Auth, ownership, quota and tier gating
all live in the REST layer, so the two surfaces cannot drift apart. You can skip MCP entirely.
curl -s -H "Authorization: Bearer $KEY" \
https://my-tv-channel.com/api/mytvchannel/users/status.php
Written for a machine to read, in rough order of how much you will want them:
- /llms.txt — the short index; start here
- /llms-full.txt — every endpoint, its parameters and its traps, on one page
- /openapi.yaml — OpenAPI 3.1, 23 operations, if your client consumes a schema
- /api/mytvchannel/docs/AGENTS.md — the long-form agent guide, with a worked golden path from nothing to a live channel
- /api/mytvchannel/mcp/README.md — MCP setup and the tool catalogue
Where it is listed
Questions
initialize and tools/list — work without a key, so a client can inspect the server before credentials are configured.get_transcode_status and tells you when it is live.2025-06-18, 2025-03-26 and 2024-11-05. Anything that does not speak MCP can call the REST API directly.mcp.my-tv-channel.com?my-tv-channel.com is a TV channel — that is how {handle}.my-tv-channel.com works. An mcp. subdomain would be routed as somebody’s channel.Further reading
MCP in media, video and streaming: what exists, and the gap nobody has filled — a survey of every MCP server in the media stack as of August 2026, why they all stop at the clip rather than the channel, and the four things that make durable broadcast state harder to hand an agent than a render.
Start with a key
It takes about a minute, and the demo channel is proof the rest works.