mcp-xtream
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| XTREAM_TZ | No | Timezone used to display times, e.g. Europe/Dublin | your system timezone |
| XTREAM_SERVER | Yes | The address your IPTV app uses, e.g. http://provider.example:80 | |
| XTREAM_PASSWORD | Yes | Your Xtream Codes password | |
| XTREAM_USERNAME | Yes | Your Xtream Codes username | |
| XTREAM_CACHE_DIR | No | Directory used to cache the channel list and guide | ~/Library/Caches/mcp-xtream (macOS), ~/.cache/mcp-xtream (Linux) |
| XTREAM_DOWNLOAD_DIR | No | Directory where downloaded programmes are saved | ~/Movies/IPTV (macOS), ~/Videos/IPTV (Linux) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| subscribe_eventsA | Register this session for server-push download events. Call once after connecting (and again after reconnecting; repeat calls are harmless). When a download finishes, fails or is cancelled, the server pushes an MCP log notification with logger="events" and a payload like {"event": "download_finished", "title": ..., "output": ..., "message": ...}. The first subscription from a client covers downloads that end from then on; later ones also catch up on any that ended while disconnected. Requires a persistent session (stdio). |
| account_infoA | Account status: expiry, connection limit and current active connections (fetched live). |
| list_channelsA | Find live channels by name or category (case-insensitive; all words must match). Each result includes stream_id, epg_id, catchup_days (0 = no catch-up archive; still fine for live TV) and what's on now. catchup_only keeps just channels with an archive. |
| search_programmesA | Search the TV guide by programme title (all words must match). channel: optional channel-name filter (e.g. "bbc one"). The window is hours_back before now to hours_ahead after. Each result lists every channel carrying that guide entry, best catch-up bet first, each with a catchup_status (see server instructions) and catchup_available (true for in_window / just_aired). catchup_only keeps only channels where it's true, and drops programmes with none. Results are newest first. |
| channel_scheduleC | A channel's guide for one day. date: 'today', 'yesterday', 'tomorrow' or YYYY-MM-DD (local time). |
| programme_detailsA | Everything the guide knows about one programme: full description, air times and every channel carrying it (with catchup availability). Use this to identify the episode yourself before downloading; the guide has no season/episode numbers. |
| check_recordingA | Ask the provider whether this channel's catch-up recording of a programme exists right now (the advertised window is only a hint). Opens the recording briefly (a 1 KB request) and reports whether it's there and how big it is. That uses one of the account's connections for a moment, so it refuses while they're all in use (e.g. the user is watching TV) unless force=True, and while a download is running. |
| download_programmeA | Download a past programme from a channel's catchup archive in the background. Returns a job_id; poll download_status. Identify the programme with programme_id (from search_programmes / channel_schedule), or give start/end as ISO local datetimes (e.g. 2026-10-18T10:00) plus a title. The default format 'ts' saves the provider's stream untouched (Jellyfin/Plex play it). 'mkv' remuxes with ffmpeg (no re-encode, keeps subtitles) only if the user asks for it; it stays .ts if ffmpeg is missing or the video is interlaced (fields don't convert cleanly), with a warning on the job. force=True skips the free-connection check. Providers often take a few hours after a programme ends to make its recording available; a "not ready yet" failure means try again later. Media-server naming (optional): give show (the series name as your media server knows it) to save as Jellyfin/Plex TV layout with an .nfo file: with season+episode -> 'Show/Season 02/Show - S02E05 - <episode_title>', without them -> date-based 'Show/Show - 2026-10-18'. season/episode are your best-effort identification (see programme_details); only pass them when confident. Without show, files are named ' - - '. |
| download_statusB | Progress of a download job: state is queued, downloading, converting, done, failed or cancelled. |
| list_downloadsC | Recent download jobs, newest first. |
| cancel_downloadA | Cancel a running download (including its MKV conversion) and delete its partial file. Poll download_status to see it reach 'cancelled'. |
| refresh_dataA | Re-fetch the channel list and TV guide from the provider now. They refresh automatically (guide every 3h, channels every 6h) when a tool is used; past programmes are kept for 7 days so catchup stays searchable. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 12 tools
Each tool targets a distinct step in the workflow: channel discovery (list_channels), guide lookup (search_programmes, channel_schedule, programme_details), availability probing (check_recording), and download lifecycle (download_programme, download_status, list_downloads, cancel_download). The guide-related trio (search_programmes / channel_schedule / programme_details) and the two availability signals (programme_details' catchup_available vs check_recording) are close enough that an agent may occasionally hesitate, but descriptions draw clear boundaries.
All snake_case, which is good, but the convention is mixed: about half are verb_noun (list_channels, search_programmes, download_programme, cancel_download, refresh_data) and the rest are bare noun phrases (account_info, download_status, channel_schedule, programme_details). Readable and semantically sensible, but not a predictable pattern an agent can extrapolate from.
Twelve tools for an IPTV/catch-up download server is well-scoped: discovery, EPG, availability check, download controls, event subscription and cache refresh each earn their place with no filler or redundancy.
The catch-up download lifecycle is fully covered (search → verify recording → download → status → list → cancel), plus account info, push events and cache refresh. The main gap is live playback: list_channels returns stream_ids but there is no tool to obtain a playable stream URL or otherwise watch live TV, and there is no way to delete or manage completed files.