My TV Channel
by my-tv-channel.com · remote · no sign-in to list tools · v1.1.0 · published by com.my-tv-channel
Create and run 24/7 linear TV channels. Import videos by URL; we transcode, schedule and stream.
19 tools: 4 can delete or cancel things, 8 change things and 7 only read.
Scanned Oct 21, 2026
- Deletes or cancels4Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things8Claude Code: ask: see these tools
- Only reads7Claude Code: allow: see these tools
2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http my-tv-channel https://my-tv-channel.com/api/mytvchannel/mcp --header 'Authorization: <your-authorization>'Findings
Matches of fixed checks, with the text they matched.
The server marks "get_account_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_account_status" says "get": a word for reading.
The server marks "check_handle_available" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "check_handle_available" says "handle": a word for a change.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
19 tools
Deletes or cancels 4Claude Code: deny
archive_channelTake a channel off the air and out of every listing.No findings
Why it is in this group
- The name "archive_channel" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Take 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Archive channel
delete_assetRemove a video from a channel.No findings
Why it is in this group
- The name "delete_asset" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Remove 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Delete asset
regenerate_scheduleRebuild the channel's schedule now using the current weights.No findings
Why it is in this group
- The name "regenerate_schedule" says "schedule": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Rebuild 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: false
- title: Regenerate schedule
set_schedule_rulesGive the channel a durable schedule: fixed slots ("news at 18:00") and dayparts ("no kids content after 22:00").No findings
Why it is in this group
- The name "set_schedule_rules" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Give 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Set schedule rules
Changes things 8Claude Code: ask
check_handle_availableCheck whether a channel handle is free before trying to create it.1 finding
Why it is in this group
- The name "check_handle_available" says "handle": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "check_handle_available" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "check_handle_available" says "handle": a word for a change.
Description, as the server wrote it Check 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Check handle availability
create_channelCreate a 24/7 linear TV channel.No findings
Why it is in this group
- The name "create_channel" says "create": a word for a change.
Description, as the server wrote it Create 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Create channel
get_account_statusStart here.1 finding
Why it is in this group
- The name "get_account_status" says "get": a word for reading.
- The description's first verb is "start": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "get_account_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_account_status" says "get": a word for reading.
Description, as the server wrote it Start 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Get account status
import_video_from_urlAdd a video to a channel from a direct media URL.No findings
Why it is in this group
- The name "import_video_from_url" says "import": a word for a change.
Description, as the server wrote it Add 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
- title: Import video from URL
import_youtube_videoImport a YouTube video that the OWNER UPLOADED THEMSELVES.No findings
Why it is in this group
- The name "import_youtube_video" says "import": a word for a change.
Description, as the server wrote it Import 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
- title: Import YouTube video
retry_transcodeRe-queue a video whose transcode failed.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Re-queue a video whose transcode failed. Only works on assets in a failed state.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
- title: Retry transcode
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.No findings
Why it is in this group
- The name "set_asset_weight" says "set": a word for a change.
Description, as the server wrote it Change 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.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Set asset weight
update_channelUpdate an existing channel: name, description, visibility, category, language, age rating, or the community chat link.No findings
Why it is in this group
- The name "update_channel" says "update": a word for a change.
Description, as the server wrote it Update an existing channel: name, description, visibility, category, language, age rating, or the community chat link. Only send the fields you are changing.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Update channel
Only reads 7Claude Code: allow
get_channelGet one channel by id.No findings
Why it is in this group
- The name "get_channel" says "get": a word for reading.
Description, as the server wrote it Get one channel by id. Includes scheduleStatus (inactive | pending | active | error) — poll this to confirm a channel has gone live — plus watchUrl, launchedAt and isArchived.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Get channel
get_scheduleRead the channel's EPG — what is playing and what is coming up.No findings
Why it is in this group
- The name "get_schedule" says "get": a word for reading.
Description, as the server wrote it Read 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).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Get schedule
get_schedule_rulesRead the channel's declarative schedule rules (fixed time slots and dayparts), plus its scheduling mode and timezone.No findings
Why it is in this group
- The name "get_schedule_rules" says "get": a word for reading.
Description, as the server wrote it Read the channel's declarative schedule rules (fixed time slots and dayparts), plus its scheduling mode and timezone.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Get schedule rules
get_transcode_statusPoll transcode progress.No findings
Why it is in this group
- The name "get_transcode_status" says "get": a word for reading.
Description, as the server wrote it Poll 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Get transcode status
list_assetsList the videos on a channel.No findings
Why it is in this group
- The name "list_assets" says "list": a word for reading.
Description, as the server wrote it List the videos on a channel.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: List assets
list_channelsList the channels owned by this account.No findings
Why it is in this group
- The name "list_channels" says "list": a word for reading.
Description, as the server wrote it List the channels owned by this account.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: List channels
validate_schedule_rulesDRY-RUN a ruleset.No findings
Why it is in this group
- The name "validate_schedule_rules" says "validate": a word for reading.
Description, as the server wrote it DRY-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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Validate schedule rules
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http my-tv-channel https://my-tv-channel.com/api/mytvchannel/mcp --header 'Authorization: <your-authorization>'Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__my-tv-channel__list_channels",
"mcp__my-tv-channel__get_channel",
"mcp__my-tv-channel__list_assets",
"mcp__my-tv-channel__get_transcode_status",
"mcp__my-tv-channel__get_schedule",
"mcp__my-tv-channel__get_schedule_rules",
"mcp__my-tv-channel__validate_schedule_rules"
],
"ask": [
"mcp__my-tv-channel__get_account_status",
"mcp__my-tv-channel__check_handle_available",
"mcp__my-tv-channel__create_channel",
"mcp__my-tv-channel__update_channel",
"mcp__my-tv-channel__import_video_from_url",
"mcp__my-tv-channel__import_youtube_video",
"mcp__my-tv-channel__set_asset_weight",
"mcp__my-tv-channel__retry_transcode"
],
"deny": [
"mcp__my-tv-channel__archive_channel",
"mcp__my-tv-channel__delete_asset",
"mcp__my-tv-channel__regenerate_schedule",
"mcp__my-tv-channel__set_schedule_rules"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as my-tv-channel. Review it before you use it.