Advertisers
← Back to home

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.

Connect your agent Watch the demo channel

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.

Two URLs, one server.

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.

“What’s my My TV Channel account status — what tier am I on and how much upload quota is left?”
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.
“Create a channel called Retro Arcade TV, handle retro-arcade, import these four videos, and tell me when it’s broadcasting.”
check_handle_availablecreate_channelimport_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.
“Play the long-plays twice as often as the reviews on my arcade channel, starting now.”
list_assetsset_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.
“Show me what’s on my channel this evening.”
get_schedule returns the EPG with start and end times.
“Put cartoons on 6–9am on weekdays and news every day at 6pm.” (Pro tier and above)
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.

ToolDoesSafe to autorun?
get_account_statusTier, limits, quota used and remaining, all channels and what they need to go liveread-only
list_channelsChannels owned by this accountread-only
get_channelOne channel — includes scheduleStatus, poll this to confirm it went liveread-only
check_handle_availableIs a handle freeread-only
list_assetsVideos on a channelread-only
get_transcode_statusPoll progress; tells you when launch requirements are metread-only
get_scheduleRead the EPGread-only
get_schedule_rulesCurrent rulesetread-only
validate_schedule_rulesDry-run a ruleset; saves nothing, returns a simulated 24-hour gridread-only
create_channelCreate a channelwrites
update_channelRename, re-describe, re-tag, change visibilitywrites
import_video_from_urlThe main way to add content. Import from a direct media URLwrites, external
import_youtube_videoImport a YouTube video the owner proves they ownwrites, external
set_asset_weightHow often a video plays (0–10), plus title and tagswrites
retry_transcodeRe-queue a failed transcodewrites
archive_channelTake off air — archives, does not destroydestructive
delete_assetRemove a video (soft delete, auto-regenerates)destructive
regenerate_scheduleRebuild the schedule now — replaces what was going to airdestructive
set_schedule_rulesReplaces the whole rulesetdestructive

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:

Where it is listed

Questions

Can an AI agent upload a video file from my computer?
Not over MCP — tool arguments are JSON, so there is no multipart channel for a file. Importing from a public URL is the ingestion path for agents. For files on your own machine, upload through the iOS, iPadOS or macOS app, or post them to the REST endpoint directly.
Do I need a subscription?
Yes. Creating an API key requires an active subscription on any tier, from $0.99 a week. The key inherits the owner’s tier limits for upload minutes, streaming minutes and features. Discovery calls — initialize and tools/list — work without a key, so a client can inspect the server before credentials are configured.
Can an agent create its own API key?
No, by design. Keys are minted only by a signed-in human, in the web portal or in the app. An agent holding a key cannot escalate to issuing more.
How long until a channel is on air?
A channel launches automatically once it has at least 4 ready videos and at least 15 minutes of content. The gating step is transcoding, which runs on an encoding farm after each import. The agent polls get_transcode_status and tells you when it is live.
Which clients work?
Any client that speaks Streamable HTTP, including Claude Code and Claude Desktop. The server is stateless, so there is no session id to track, and it supports protocol revisions 2025-06-18, 2025-03-26 and 2024-11-05. Anything that does not speak MCP can call the REST API directly.
Is it safe to let an agent run unattended?
Every tool carries MCP annotations, so a client can decide for itself what to run without asking. Nothing in the tool set is unrecoverable: archiving a channel keeps its handle and its videos, and deleting a video is a soft delete. The rate limit is 1,000 requests an hour per key.
Why is the endpoint a path and not mcp.my-tv-channel.com?
Because every subdomain of 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.

Create an API key