protogrid

Search / com.my-tv-channel/my-tv-channel

My TV Channel

R1· needs a key

Create and run 24/7 linear TV channels. Import videos by URL; we transcode, schedule and stream.

v1.1.0 · active · website · descriptor JSON · versions

An agent can connect on its own if it already holds MY_TV_CHANNEL_TOKEN.Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.
Quality97strong
Trust80of 100
Uptime, 30 days100%
Latency p50354 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "my-tv-channel": {
      "type": "http",
      "url": "https://my-tv-channel.com/api/mytvchannel/mcp",
      "headers": {
        "Authorization": "Bearer ${MY_TV_CHANNEL_TOKEN}"
      }
    }
  }
}
claude mcp add --transport http my-tv-channel https://my-tv-channel.com/api/mytvchannel/mcp --header "Authorization: Bearer ${MY_TV_CHANNEL_TOKEN}"
[mcp_servers.my-tv-channel]
url = "https://my-tv-channel.com/api/mytvchannel/mcp"
bearer_token_env_var = "MY_TV_CHANNEL_TOKEN"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "my-tv-channel": {
      "type": "remote",
      "url": "https://my-tv-channel.com/api/mytvchannel/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer {env:MY_TV_CHANNEL_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "my-tv-channel": {
      "type": "http",
      "url": "https://my-tv-channel.com/api/mytvchannel/mcp",
      "headers": {
        "Authorization": "Bearer ${MY_TV_CHANNEL_TOKEN}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=my-tv-channel&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vbXktdHYtY2hhbm5lbC5jb20vYXBpL215dHZjaGFubmVsL21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciAke01ZX1RWX0NIQU5ORUxfVE9LRU59In19"
}
{
  "servers": {
    "my-tv-channel": {
      "type": "http",
      "url": "https://my-tv-channel.com/api/mytvchannel/mcp",
      "headers": {
        "Authorization": "Bearer ${MY_TV_CHANNEL_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "my-tv-channel": {
      "httpUrl": "https://my-tv-channel.com/api/mytvchannel/mcp",
      "headers": {
        "Authorization": "Bearer ${MY_TV_CHANNEL_TOKEN}"
      }
    }
  }
}
extensions:
  "my-tv-channel":
    enabled: true
    name: "my-tv-channel"
    type: streamable_http
    uri: "https://my-tv-channel.com/api/mytvchannel/mcp"
    headers:
      "Authorization": "Bearer ${MY_TV_CHANNEL_TOKEN}"
    timeout: 300

Placeholders to fill from your own secret store: ${MY_TV_CHANNEL_TOKEN}. The registry never accepts secret values.

Quality 97 / 100strong

protocol100 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • pass
    protocol.list_ttltool list is cacheable (ttlMs 300000)
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length1 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations19 of 19 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 3,763 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

19 tools, about 3,763 tokens to load them all · tool set 51ad5f416844 · checked 2026-10-21 02:10 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 80 / 100

no-repository
provenance55
liveness100
freshness85
hygiene80

+dns-namespace +website +reachable +uptime-100% ~updated-70d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://my-tv-channel.com/api/mytvchannel/mcp streamable-httpapi_key ${MY_TV_CHANNEL_TOKEN}yes100%354 ms2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-052026-10-20

Tools (19)

archive_channeldestructiveTake a channel off the air and out of every listing. This ARCHIVES rather than destroys: the handle stays reserved and assets and schedule history are retained, so it can be restored. Refuses with 409 while transcodes are still running. Idempotent. This is the reversible way to take a channel down; delete_asset removes individual videos instead.
check_handle_availableread-onlyCheck whether a channel handle is free before trying to create it. The handle becomes the subdomain: {handle}.my-tv-channel.com. 3-63 chars, lowercase a-z, 0-9 and hyphens.
create_channelCreate a 24/7 linear TV channel. It will NOT be live yet — a channel goes live automatically once it has at least 4 ready assets AND at least 15 minutes of total content. is_public lists it in Discover and is available on every subscription tier, including Starter.
delete_assetdestructiveRemove a video from a channel. Soft delete — it stops being scheduled immediately and the schedule regenerates automatically. Idempotent. The asset is retained and stops being scheduled; it is not erased. Affects one video — archive_channel takes a whole channel off the air.
get_account_statusread-onlyStart here. Returns who the account is, its subscription tier and limits, how much weekly upload/stream quota is used and remaining, and every channel the owner has with its ready-asset count and what it still needs to go live (launchGaps). Call this before creating anything so you know the real limits for THIS account rather than assuming.
get_channelread-onlyGet one channel by id. Includes scheduleStatus (inactive | pending | active | error) — poll this to confirm a channel has gone live — plus watchUrl, launchedAt and isArchived.
get_scheduleread-onlyRead the channel's EPG — what is playing and what is coming up. Note this one returns a plain array of entries (unlike other tools, which return an object).
get_schedule_rulesread-onlyRead the channel's declarative schedule rules (fixed time slots and dayparts), plus its scheduling mode and timezone.
get_transcode_statusread-onlyPoll transcode progress. Give either channel_id (all its videos) or asset_id (one). Each asset reports uploadStatus (downloading -> pending -> transcoding -> ready) and the summary tells you when meetsLaunchRequirements becomes true: 4+ ready assets AND 900+ seconds. Poll every 30-60s; transcoding takes roughly real-time/4.
import_video_from_urlAdd a video to a channel from a direct media URL. THIS IS THE MAIN WAY TO ADD CONTENT over MCP — you cannot upload local file bytes through this interface, so if the owner has local files, ask them to host them somewhere reachable or upload via the app. The URL must be a direct, public, unauthenticated link to mp4/mov/m4v/mpeg/mpg/avi, or a FINITE .m3u8 (VOD, not a live stream) — not a web page, not behind a login, not a YouTube/Vimeo watch page. The server downloads it. Returns immediately; the asset then goes downloading -> pending -> transcoding -> ready. Duration counts against the weekly upload quota. Re-submitting the same URL to the same channel returns the original asset instead of importing twice.
import_youtube_videoImport a YouTube video that the OWNER UPLOADED THEMSELVES. This will not work for anyone else's video, by design — a channel built from other people's videos is a copyright problem for the owner. Ownership is proved by a tag only the uploader can add: 1. The owner's tag looks like 'MyTVChannelApp#<device-id>'. When the import fails for a missing tag, the 403 error message contains that account's exact tag string. 2. They paste that exact string into the video's description or tags on YouTube. 3. Retry the import. You cannot do step 2 for them and you cannot bypass it. Public finished videos only: no live streams, no private or age-restricted videos, no playlists or channel URLs. Capped at 10 per day. Counts against the same weekly upload quota as everything else.
list_assetsread-onlyList the videos on a channel.
list_channelsread-onlyList the channels owned by this account.
regenerate_scheduledestructiveRebuild the channel's schedule now using the current weights. Call this after changing weights on a channel that is ALREADY live, otherwise the change will not air until the hourly cron. Throttled to one call per channel per 5 minutes; exceeding that returns 429 with a Retry-After header giving the seconds remaining. Requires the channel to meet launch requirements.
retry_transcodeRe-queue a video whose transcode failed. Only works on assets in a failed state.
set_asset_weightChange how often a video plays (weight 0-10, default 5; 0 removes it from rotation entirely), and optionally its title or tags. IMPORTANT ORDERING: weights only affect what actually airs when the schedule is (re)generated. A channel builds its schedule the instant it crosses the launch threshold, so weights set AFTER that are stored but do not air. Either set the weight when you import each video, or call regenerate_schedule afterwards. Weights are relative: identical weights across every video produce a uniform rotation, and the spread between them is what shapes airtime.
set_schedule_rulesdestructiveGive the channel a durable schedule: fixed slots ("news at 18:00") and dayparts ("no kids content after 22:00"). The scheduler re-honours these on EVERY rebuild, so you set them once instead of babysitting the grid. **Pro tier or higher.** This REPLACES the entire ruleset — send every rule you want, not just new ones. Sending an empty array removes all rules and returns the channel to plain weighted-random. Validate first with validate_schedule_rules. Rule shapes: time_slot {rule_type:'time_slot', start_time:'18:00', end_time?:'21:00', days_mask:127, selector_type:'asset'|'tag'|'playlist', selector_value:<id|tag|[ids]>, priority?:0} daypart_weight {rule_type:'daypart_weight', start_time:'22:00', end_time:'06:00', days_mask:127, selector_type:'asset'|'tag', selector_value:..., weight_multiplier:0-10} days_mask is a bitmask: bit0=Mon … bit6=Sun. 127=daily, 31=Mon-Fri, 96=weekend. end_time on a time_slot makes it a BLOCK that keeps drawing from the selector until that time — that is how you get 'cartoons 06:00-09:00' rather than one cartoon. selector_type 'playlist' with an array of asset ids plays them IN ORDER. weight_multiplier 0 removes matching assets from that window entirely. Set `timezone` (IANA) or the times mean UTC, which is almost never what the owner meant. Slots start ON-OR-AFTER their time: the programme running into a slot is never cut short, so an 18:00 slot may begin at 18:02. That is intended.
update_channelUpdate an existing channel: name, description, visibility, category, language, age rating, or the community chat link. Only send the fields you are changing.
validate_schedule_rulesread-onlyDRY-RUN a ruleset. Saves nothing. Returns {valid, errors, warnings, preview} where preview is a simulated 24h grid of what would actually air. Intended as the dry run for set_schedule_rules: rules are wall-clock, slots start on-or-after their time, and dayparts reweight the random fill, so the airing result is hard to predict from the rules alone. Unlike set_schedule_rules this is not tier-gated and works on any tier. Same payload as set_schedule_rules.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.my-tv-channel/my-tv-channel",
  "title": "My TV Channel",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://my-tv-channel.com/api/mytvchannel/mcp",
      "type": "streamable-http",
      "headers": [
        {
          "name": "Authorization",
          "isSecret": true,
          "isRequired": true,
          "description": "Bearer token: an API key created at https://my-tv-channel.com/agent-keys/ or in the app under Profile → Agent Access. Requires an active subscription (any tier). Format: 'Bearer mytv_sk_...'"
        }
      ]
    }
  ],
  "version": "1.1.0",
  "websiteUrl": "https://my-tv-channel.com",
  "description": "Create and run 24/7 linear TV channels. Import videos by URL; we transcode, schedule and stream."
}