HDHomeRun MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOST | No | The host to bind the server to (e.g. 0.0.0.0). | |
| PORT | No | The port to bind the server to (e.g. 8000). | |
| DEBUG | No | Verbose logging (True/False). | |
| DVRTOOL | No | Enable the DVR operations tool domain (True/False). | |
| MCP_URL | No | URL of the MCP server the agent connects to (e.g. http://localhost:8000/mcp). | |
| HTTPTOOL | No | Enable the HTTP operations tool domain (True/False). | |
| MODEL_ID | No | Operator-configured model id for the agent. | |
| PROVIDER | No | Operator-configured LLM provider for the agent. | |
| TRANSPORT | No | The transport mode: stdio, streamable-http, or sse. | |
| CONFIGTOOL | No | Enable the Config operations tool domain (True/False). | |
| DOCTORTOOL | No | Enable the Doctor operations tool domain (True/False). | |
| ENABLE_OTEL | No | Enable OpenTelemetry telemetry (True/False). | |
| EUNOMIA_TYPE | No | The Eunomia access governance type: none, embedded, or remote. | |
| DISCOVERYTOOL | No | Enable the Discovery operations tool domain (True/False). | |
| ENABLE_WEB_UI | No | Serve the AG-UI web interface (True/False). | |
| HDHOMERUN_URL | Yes | The HDHomeRun device base URL (e.g. http://hdhomerun.local). | |
| MCP_TOOL_MODE | No | Tool surface mode: intent (default), condensed, verbose, or both. | |
| OIDC_CLIENT_ID | No | OIDC client id (service-account auth). | |
| MCP_CLIENT_AUTH | No | Outbound MCP child auth: oidc-client-credentials | basic | none. | |
| MCP_ENABLED_TAGS | No | Comma-separated tag allow-list. | |
| PYTHONUNBUFFERED | No | Unbuffered stdout (recommended in containers, e.g. 1). | |
| MCP_DISABLED_TAGS | No | Comma-separated tag deny-list. | |
| MCP_ENABLED_TOOLS | No | Comma-separated tool allow-list. | |
| EUNOMIA_REMOTE_URL | No | URL of the remote Eunomia server (e.g. http://eunomia-server:8000). | |
| MCP_DISABLED_TOOLS | No | Comma-separated tool deny-list. | |
| EUNOMIA_POLICY_FILE | No | Path to the Eunomia policy file (e.g. mcp_policies.json). | |
| HDHOMERUN_DEVICE_AUTH | No | The device's DeviceAuth token (only needed for SiliconDust cloud DVR calls; rotates on reboot/firmware update — do not hardcode). | |
| HDHOMERUN_TLS_PROFILE | No | Named outbound TLS policy from AgentConfig; only matters for the SiliconDust cloud recording-rules API (local tuner devices are plain HTTP). Verification is mandatory and cannot be disabled. | |
| OIDC_CLIENT_SECRET_REF | No | Runtime secret reference for the OIDC service account. | |
| MCP_BASIC_AUTH_USERNAME | No | HTTP Basic username (MCP_CLIENT_AUTH=basic). | |
| HDHOMERUN_TLS_PROFILE_REF | No | Reference to the named outbound TLS policy. | |
| MCP_BASIC_AUTH_PASSWORD_REF | No | Runtime secret reference for HTTP Basic auth (MCP_CLIENT_AUTH=basic). | |
| OTEL_EXPORTER_OTLP_ENDPOINT | No | The OTLP endpoint for telemetry (e.g. http://localhost:8080/api/public/otel). | |
| OTEL_EXPORTER_OTLP_PROTOCOL | No | The OTLP protocol (e.g. http/protobuf). |
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 |
|---|---|
| discovery_operations_cacheC | Cache (discovery_operations). Discover HDHomeRun devices on the network — local UDP broadcast (port 65001, may not cross VLANs), targeted UDP to a known IP, or the SiliconDust cloud discovery endpoint. CONCEPT:HDHR-discovery.network.device-location |
| hdhomerun_abort_scanA | POST /lineup.post?scan=abort — cancel an in-progress channel scan. |
| hdhomerun_add_datetime_ruleB | Add a DateTimeOnly-ChannelOnly rule (record one specific airing). |
| hdhomerun_add_series_ruleC | Add a Series (or Movie) recording rule for a SeriesID. |
| hdhomerun_build_live_tv_urlB | Build a record-engine buffered Live TV URL.
|
| hdhomerun_build_stream_urlB | Build a live-stream URL: /{auto|tuner}/{v|ch[-]}. Args:
channel: virtual channel number (e.g. "24.1") or RF frequency in Hz
when |
| hdhomerun_change_ruleC | Modify a rule, or reprioritize it via |
| hdhomerun_check_device_authD | Invoke the check_device_auth operation. |
| hdhomerun_check_device_reachableD | Invoke the check_device_reachable operation. |
| hdhomerun_check_discovery_cache_freshnessC | Invoke the check_discovery_cache_freshness operation. |
| hdhomerun_check_firmware_modelD | Invoke the check_firmware_model operation. |
| hdhomerun_check_signal_strengthC | Briefly tune each channel and sample ss/snq/seq, then release the tuner. |
| hdhomerun_check_tuner_count_vs_jellyfinD | Invoke the check_tuner_count_vs_jellyfin operation. |
| hdhomerun_delete_recordingA | POST cmd=delete[&rerecord=1]. Must be POST (HTTP GET is rejected with 400). Set |
| hdhomerun_delete_ruleB | Delete a Series/Movie rule (by RecordingRuleID or SeriesID) or a DateTimeOnly-ChannelOnly rule (RecordingRuleID, or SeriesID+DateTimeOnly+ChannelOnly). |
| hdhomerun_disable_lineup_locationA | Disable the lineup-server connection ( |
| hdhomerun_discover_cloudA | GET http://ipv4-api.hdhomerun.com/discover[?DeviceID=]. SiliconDust's cloud discovery endpoint — resolves a device's current
LAN IP by its DeviceID even when local broadcast can't reach it
(e.g. client on a different VLAN). Returns
|
| hdhomerun_discover_local_broadcastA | Broadcast a DISCOVER_REQ on UDP port 65001 and collect DISCOVER_RPY replies. May legitimately return an empty list — broadcast discovery does not
cross VLAN/subnet boundaries on most networks. Use
|
| hdhomerun_discover_local_targetedB | Send a DISCOVER_REQ directly to a known IP (works across VLANs). |
| hdhomerun_get_channelB |
|
| hdhomerun_get_channelmapC |
|
| hdhomerun_get_discoverC | GET /discover.json — FriendlyName/ModelNumber/FirmwareVersion/DeviceID/ DeviceAuth/BaseURL/LineupURL/TunerCount. |
| hdhomerun_get_filterC |
|
| hdhomerun_get_helpA |
|
| hdhomerun_get_ir_targetB |
|
| hdhomerun_get_itemC |
|
| hdhomerun_get_lineupB | GET /lineup.{json,xml,m3u} — the channel list. JSON entries: GuideNumber, GuideName, VideoCodec, AudioCodec, HD, Favorite, DRM, URL (per the http_api doc + observed live fields). |
| hdhomerun_get_lineup_statusB | GET /lineup_status.json — scan state. Idle: {ScanInProgress, ScanPossible, Source, SourceList}. Scanning: {ScanInProgress:1, Progress, Found}. |
| hdhomerun_get_lockkeyB |
|
| hdhomerun_get_programC |
|
| hdhomerun_get_record_engine_statusB | GET /discover.json — FriendlyName/Version/ BaseURL/StorageURL/FreeSpace of the local record engine. |
| hdhomerun_get_recorded_filesA | GET ( |
| hdhomerun_get_sys_copyrightA |
|
| hdhomerun_get_sys_debugC |
|
| hdhomerun_get_sys_featuresB |
|
| hdhomerun_get_sys_modelC |
|
| hdhomerun_get_sys_versionB |
|
| hdhomerun_get_targetC |
|
| hdhomerun_get_tuner_debugB |
|
| hdhomerun_get_tuner_statusC |
|
| hdhomerun_get_tuner_streaminfoC |
|
| hdhomerun_get_tuner_vstatusB |
|
| hdhomerun_list_recording_rulesB | List all recording rules for the household's DeviceAuth(s). |
| hdhomerun_parse_tuner_statusB | Parse a |
| hdhomerun_poke_record_engineA | POST /recording_events.post?sync. Tells the record engine to recompute upcoming record tasks — call after adding/changing/deleting a recording rule. |
| hdhomerun_restart_deviceB |
|
| hdhomerun_run_doctorC | Run every check and return the aggregate report. |
| hdhomerun_set_channelC |
|
| hdhomerun_set_channelmapC |
|
| hdhomerun_set_filterC |
|
| hdhomerun_set_ir_targetC |
|
| hdhomerun_set_itemC |
|
| hdhomerun_set_lineup_locationC |
|
| hdhomerun_set_lockkeyC |
|
| hdhomerun_set_programC |
|
| hdhomerun_set_targetC |
|
| hdhomerun_start_scanC | POST /lineup.post?scan=start[&source=] — begin a channel scan. |
| hdhomerun_stop_tunerA | Set |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| connector-status | Ask for this connector server's current operational status. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| _connector_status_resource | Native resource exposing this server's static status payload. |
| ontology://hdhomerun-mcp/hdhomerun.ttl | |
| connector-resources | Data sources, ontology mappings and resources of this connector. |
| hdhr-discovery-ops/SKILL.md | Find HDHomeRun tuner devices on the network via the hdhomerun-mcp MCP server — local UDP broadcast/targeted discovery on port 65001, and the SiliconDust cloud discovery endpoint (http://ipv4-api.hdhomerun.com/discover) for when broadcast can't reach the device (different VLAN/subnet). Use when the agent doesn't yet know a device's IP, or a previously-known IP may have changed (DHCP re-lease). Do NOT use once you have a working device URL — go straight to hdhr-http-api-ops/hdhr-tuner-control; and do NOT use for DVR record-engine discovery (that is a per-record-engine discover.json call documented under hdhr-dvr-ops). |
| hdhr-discovery-ops/_manifest | File listing for hdhr-discovery-ops |
| hdhr-dvr-ops/SKILL.md | Manage HDHomeRun DVR recording rules (SiliconDust cloud API, api.hdhomerun.com/api/recording_rules) and local record-engine operations (status, recorded_files listing, poke-after-rule-change, delete-a-recording, buffered Live TV URLs) via the hdhomerun-mcp MCP server. Use when the agent must add/change/delete a Series/Movie/DateTimeOnly recording rule, list or delete recordings, or build a Live TV playback URL against a SiliconDust cloud DVR (Scribe/Server/Connect+storage) setup. Do NOT use for tuner-only hardware with no DVR/record-engine (this package's own test device is tuner-only) — that's a hard prerequisite failure, not a usage error. |
| hdhr-dvr-ops/_manifest | File listing for hdhr-dvr-ops |
| hdhr-http-api-ops/SKILL.md | Query and control an HDHomeRun tuner's HTTP JSON API via the hdhomerun-mcp MCP server — discover.json device identity, the lineup.json/lineup_status.json channel list and scan state, scan start/abort control, and building auto/tuner<n> live-stream URLs. Use when the agent needs the channel lineup, device firmware/tuner-count info, or to kick off/monitor a channel scan on a known device URL. Do NOT use for local network discovery of an unknown device (use hdhr-discovery-ops), DVR recording rules/record-engine calls (use hdhr-dvr-ops), per-tuner signal/status/tuning via the binary control protocol (use hdhr-tuner-control), or aggregate health checks (use hdhr-doctor). |
| hdhr-http-api-ops/_manifest | File listing for hdhr-http-api-ops |
| hdhr-jellyfin-livetv-setup/SKILL.md | Wire a real HDHomeRun tuner into Jellyfin Live TV end-to-end: add it as a TunerHost, add free XMLTV guide data for users without a Schedules Direct subscription, map the tuner's lineup to XMLTV channels by call sign/ GuideNumber, and validate live playback. Grounded in a verified real setup (HDHomeRun FLEX 4K + Jellyfin 10.11.11, Austin TX OTA market) — not speculative. Use when the agent must onboard an HDHomeRun into Jellyfin Live TV or diagnose why channels/guide data aren't showing up. Do NOT use this to fix jellyfin-mcp's own dynamic-router bugs (out of scope; documented as a Gotcha with a workaround) or for SiliconDust cloud DVR recording rules (use hdhr-dvr-ops instead — this workflow is about Jellyfin's own Live TV/DVR). |
| hdhr-jellyfin-livetv-setup/_manifest | File listing for hdhr-jellyfin-livetv-setup |
| hdhomerun-mcp-development/SKILL.md | Develop, test, gate, and release the HDHomeRun connector while preserving its local tuner and cloud DVR boundaries, SDK connector wiring, packaged content, and source-backed Pages publication. |
| hdhomerun-mcp-development/_manifest | File listing for hdhomerun-mcp-development |
| hdhr-tuner-control/SKILL.md | Query and control individual HDHomeRun tuners via the binary hdhomerun_config TCP control protocol (port 65001 — a DIFFERENT wire protocol from the HTTP JSON API) through the hdhomerun-mcp MCP server: per-tuner status/vstatus/streaminfo/debug, channel/channelmap/filter/program/ target get-set, tuner lock, IR target, lineup location, and /sys/ firmware info. Use when the agent needs raw signal metrics (ss/snq/seq), to tune a physical RF channel directly, set a PID/program filter, or stream to a UDP/ RTP target — the same operations the official hdhomerun_config CLI performs. Do NOT use for the channel lineup or HTTP streaming URLs (use hdhr-http-api-ops) or DVR recording rules (use hdhr-dvr-ops). |
| hdhr-tuner-control/_manifest | File listing for hdhr-tuner-control |
| hdhr-doctor/SKILL.md | Run an actionable pass/fail health check on an HDHomeRun deployment via the hdhomerun-mcp MCP server's doctor tool — device reachability, firmware/model info, tuner count vs. a paired Jellyfin TunerHost, per-channel signal strength, DeviceAuth presence/validity, and discovery-cache freshness. Use when the agent must diagnose "Live TV isn't working" style problems, verify a fresh setup before wiring it into Jellyfin, or produce a status report for the user. Do NOT use for routine channel/tuning operations (use hdhr-http-api-ops/hdhr-tuner-control) — this skill is diagnostic-only and composes those, matching the fleet's cm_doctor convention (container-manager-mcp). |
| hdhr-doctor/_manifest | File listing for hdhr-doctor |
TDQS
Scored across 58 tools
There is substantial overlap between generic raw endpoints (hdhomerun_get_item/hdhomerun_set_item) and many specific getters/setters for the same tuner/sys paths. Discovery is split across several related tools, and multiple hdhomerun_check_* tools have only placeholder descriptions that do not clearly distinguish their behavior.
Nearly all tools use a consistent hdhomerun_ snake_case verb_noun pattern. The main outlier is discovery_operations_cache, which lacks the server prefix and uses a noun-oriented pattern unlike the rest.
With 58 tools, the surface is very large for an HDHomeRun control server and includes many low-level wrappers plus generic raw get/set tools that duplicate specific tools. The count exceeds a reasonable well-scoped set even for a device with tuner, DVR, discovery, and diagnostic operations.
The tool set covers discovery, tuner control, streaming URL construction, lineup scanning, recording rules, DVR file listing/deletion, diagnostics, and restart operations. Coverage is broad, with only minor gaps such as firmware update or higher-level DVR management workflows.