HDHomeRun MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@HDHomeRun MCPwhat channels are available on my HDHomeRun?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
HDHomeRun MCP
CLI or API | MCP | Agent
Version: 1.1.0
Documentation — Installation, deployment, usage across the API, CLI, and MCP interfaces, the integrated A2A agent server, and guidance for provisioning the backing platform are maintained in the official documentation.
Related MCP server: whmcs-mcp-server
Table of Contents
Overview
HDHomeRun MCP MCP Server + A2A Agent
A complete client + MCP server + A2A agent for SiliconDust HDHomeRun network TV
tuners, covering all four of SiliconDust's documented interfaces: the HTTP JSON
API (device discovery, channel lineup, scan control), the DVR API
(SiliconDust cloud recording rules + local record-engine operations), the
Discovery API (local UDP broadcast on port 65001 + the cloud discovery
endpoint), and the binary hdhomerun_config control protocol (TCP port
65001 — a different wire protocol from the HTTP API, used for per-tuner
status/vstatus/streaminfo/tuning/filters). Also ships a doctor diagnostic
tool matching this fleet's cm_doctor convention.
This repository is actively maintained - Contributions are welcome!
Key Features
All four HDHomeRun interfaces, one package — HTTP JSON API, DVR API, Discovery API (local UDP + cloud), and the binary hdhomerun_config control protocol, each its own action-routed tool domain.
doctordiagnostics — one call checks device reachability, firmware/model, tuner count vs. a paired Jellyfin instance, per-channel signal strength, DeviceAuth presence/validity, and discovery-cache freshness — pass/fail with an actionable next step per check.Action-routed MCP tools — each domain is exposed as a single MCP tool that routes to many underlying operations via an
actionargument, keeping the tool surface small.Three interfaces, one package — use it as a Python API client, an MCP server (
stdio/streamable-http/sse), or a Pydantic-AI A2A agent.agent-utilitiesnative — built on the shared framework (auth, action router, telemetry, governance) for fleet consistency.Per-tool toggles — enable or disable each tool domain with environment switches.
Enterprise-ready — OTEL/Langfuse telemetry and optional Eunomia access governance.
Available MCP Tools
Each tool is action-routed: pass an action and a JSON params_json payload. Tool
domains can be toggled on or off with the listed environment variable. The table below is
auto-generated from the live server by the mcp-readme-table pre-commit hook
(python -m agent_utilities.mcp.readme_tools) — do not edit it by hand.
Condensed action-routed tools (MCP_TOOL_MODE=condensed)
MCP Tool | Toggle Env Var | Description |
|
| Query/control a tuner via the binary hdhomerun_config TCP control |
|
| Discover HDHomeRun devices on the network — local UDP broadcast |
|
| Diagnose an HDHomeRun deployment: device reachability, firmware/model, |
|
| Manage the SiliconDust cloud DVR recording-rules API and the local |
|
| Query the HDHomeRun device HTTP JSON API — discover.json, channel |
Verbose 1:1 API-mapped tools (MCP_TOOL_MODE=verbose or both)
MCP Tool | Toggle Env Var | Description |
|
| POST /lineup.post?scan=abort — cancel an in-progress channel scan. |
|
| Add a DateTimeOnly-ChannelOnly rule (record one specific airing). |
|
| Add a Series (or Movie) recording rule for a SeriesID. |
|
| Build a record-engine buffered Live TV URL. |
|
| Build a live-stream URL: /{auto|tuner}/{v|ch[-]}. |
|
| Modify a rule, or reprioritize it via |
|
| Invoke the check_device_auth operation. |
|
| Invoke the check_device_reachable operation. |
|
| Invoke the check_discovery_cache_freshness operation. |
|
| Invoke the check_firmware_model operation. |
|
| Briefly tune each channel and sample ss/snq/seq, then release the tuner. |
|
| Invoke the check_tuner_count_vs_jellyfin operation. |
|
| POST cmd=delete[&rerecord=1]. |
|
| Delete a Series/Movie rule (by RecordingRuleID or SeriesID) or a |
|
| Disable the lineup-server connection ( |
|
| |
|
| Broadcast a DISCOVER_REQ on UDP port 65001 and collect DISCOVER_RPY replies. |
|
| Send a DISCOVER_REQ directly to a known IP (works across VLANs). |
|
|
|
|
|
|
|
| GET /discover.json — FriendlyName/ModelNumber/FirmwareVersion/DeviceID/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
| GET /lineup.{json,xml,m3u} — the channel list. |
|
| GET /lineup_status.json — scan state. |
|
|
|
|
|
|
|
| GET /discover.json — FriendlyName/Version/ |
|
| GET ( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| List all recording rules for the household's DeviceAuth(s). |
|
| Parse a |
|
| POST /recording_events.post?sync. |
|
|
|
|
| Run every check and return the aggregate report. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| POST /lineup.post?scan=start[&source=] — begin a channel scan. |
|
| Set |
5 action-routed tool(s) · 57 verbose 1:1 tool(s). Each is enabled unless its <DOMAIN>TOOL toggle is set false; MCP_TOOL_MODE selects the surface (intent default — the six verb-tools, granular set loaded on demand · condensed action-routed · verbose 1:1 · both). Auto-generated — do not edit.
Installation
Install with uvx (no install — run on demand)
uvx --from "hdhomerun-mcp[mcp]" hdhomerun-mcp # MCP server (slim deps)
uvx --from "hdhomerun-mcp[agent]" hdhomerun-agent # A2A agent server (full runtime)The
[mcp]extra installs only the FastMCP/FastAPI MCP-server tooling (agent-utilities[mcp]) — it excludes the heavy agent runtime (the epistemic-graph engine,pydantic-ai,dspy,llama-index), so it is far smaller. Use[agent]only when you run the integrated agent.
Install with pip
python -m pip install hdhomerun-mcp # core (API client)
python -m pip install "hdhomerun-mcp[all]" # + MCP server + A2A agent + telemetryConsole scripts
After installation the following entry points are available on your PATH:
Command | Description |
| Launch the MCP server |
| Launch the A2A agent server |
Usage
As a Python API client
from hdhomerun_mcp.auth import get_client
client = get_client() # reads HDHOMERUN_URL / HDHOMERUN_DEVICE_AUTH
info = client.get_discover() # device identity + tuner count
lineup = client.get_lineup() # channel list
stream_url = client.build_stream_url("24.1") # http://<device>:5004/auto/v24.1
report = client.run_doctor() # full health-check sweepAs an MCP server (CLI)
# Local stdio (for IDEs)
hdhomerun-mcp
# Networked streamable-http
hdhomerun-mcp --transport streamable-http --host 0.0.0.0 --port 8000Calling an MCP tool
Tools are action-routed — pass an action plus a JSON params_json string:
{
"tool": "http_operations",
"arguments": {
"action": "discover",
"params_json": "{}"
}
}MCP
Using as an MCP Server
The MCP Server can be run in stdio (local), streamable-http (networked), or
sse mode.
Environment Variables
Package environment variables
Variable | Example | Description |
|
| |
|
| |
|
| options: stdio, streamable-http, sse |
|
| |
|
| |
|
| |
|
| options: none, embedded, remote |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
Inherited agent-utilities variables (apply to every connector)
Variable | Example | Description |
| — | Comma-separated tool allow-list |
| — | Comma-separated tool deny-list |
| — | Comma-separated tag allow-list |
| — | Comma-separated tag deny-list |
| — | Outbound MCP child auth: |
| — | OIDC client id (service-account auth) |
|
| Runtime secret reference for the OIDC service account |
| — | HTTP Basic username ( |
|
| Runtime secret reference for HTTP Basic auth ( |
|
| Verbose logging |
|
| Unbuffered stdout (recommended in containers) |
|
| URL of the MCP server the agent connects to |
|
| LLM provider for the agent |
|
| Model id for the agent |
|
| Serve the AG-UI web interface |
18 package + 15 inherited variable(s). Auto-generated from .env.example + the shared agent-utilities set — do not edit.
HDHOMERUN_URL: The HDHomeRun device base URL (e.g.https://hdhomerun-device.example.invalid).HDHOMERUN_DEVICE_AUTH: The device'sDeviceAuthtoken (only needed for SiliconDust cloud DVR calls; rotates on reboot/firmware update — do not hardcode).
MCP Configuration Examples
Install the connector-focused
[mcp]extra. Examples usehdhomerun-mcp[mcp]to add FastMCP / FastAPI throughagent-utilities[mcp]; the required Agent Utilities core still carriesepistemic-graph[full]. The[agent-runtime]extra additionally enables model orchestration.
stdio Transport (local IDEs — Cursor, Claude Desktop, VS Code)
{
"mcpServers": {
"hdhomerun-mcp": {
"command": "uvx",
"args": [
"--from",
"hdhomerun-mcp[mcp]",
"hdhomerun-mcp"
],
"env": {
"MCP_TOOL_MODE": "intent",
"CONFIGTOOL": "True",
"DISCOVERYTOOL": "True",
"DOCTORTOOL": "True",
"DVRTOOL": "True",
"HDHOMERUN_DEVICE_AUTH": "your_device_auth_here",
"HDHOMERUN_SSL_VERIFY": "True",
"HDHOMERUN_URL": "http://hdhomerun.local",
"HTTPTOOL": "True"
}
}
}
}Runtime references require an alias-aware launcher such as GraphOS. Other launchers must omit those entries and inject the resolved values through their own runtime secret boundary.
Streamable-HTTP Transport (networked / production)
{
"mcpServers": {
"hdhomerun-mcp": {
"command": "uvx",
"args": [
"--from",
"hdhomerun-mcp[mcp]",
"hdhomerun-mcp",
"--transport",
"streamable-http",
"--port",
"8000"
],
"env": {
"TRANSPORT": "streamable-http",
"HOST": "127.0.0.1",
"PORT": "8000",
"MCP_TOOL_MODE": "intent",
"CONFIGTOOL": "True",
"DISCOVERYTOOL": "True",
"DOCTORTOOL": "True",
"DVRTOOL": "True",
"HDHOMERUN_DEVICE_AUTH": "your_device_auth_here",
"HDHOMERUN_SSL_VERIFY": "True",
"HDHOMERUN_URL": "http://hdhomerun.local",
"HTTPTOOL": "True"
}
}
}
}Alternatively, connect to a pre-deployed Streamable-HTTP instance by url:
{
"mcpServers": {
"hdhomerun-mcp": {
"url": "http://localhost:8000/hdhomerun-mcp/mcp"
}
}
}Run a reviewed container image as a least-privilege stdio child (no listener or published port):
docker run -i --rm \
--read-only \
--cap-drop=ALL \
--security-opt=no-new-privileges \
--pids-limit=256 \
--tmpfs /tmp:rw,noexec,nosuid,nodev,size=64m \
-e TRANSPORT=stdio \
-e MCP_TOOL_MODE=intent \
-e CONFIGTOOL=True \
-e DISCOVERYTOOL=True \
-e DOCTORTOOL=True \
-e DVRTOOL=True \
-e HDHOMERUN_DEVICE_AUTH=your_device_auth_here \
-e HDHOMERUN_SSL_VERIFY=True \
-e HDHOMERUN_URL=http://hdhomerun.local \
-e HTTPTOOL=True \
registry.example.invalid/hdhomerun-mcp@sha256:<digest> hdhomerun-mcpFor containerized network HTTP, supply an authenticated TLS ingress (or
direct server TLS), exact MCP_ALLOWED_HOSTS, and an exact trusted-proxy
CIDR policy through the operator-owned deployment profile. The generator
does not emit an unauthenticated non-loopback listener.
Auto-generated from the code-read env surface (MCP_TOOL_MODE + package vars) — do not edit.
Additional Deployment Options
hdhomerun-mcp can also run as a local container (Docker / Podman / uv) or be
consumed from a remote deployment. The
Deployment guide has full,
copy-paste mcp_config.json for all four transports — stdio, streamable-http,
local container / uv, and remote URL:
Local container / uv — launch the server from
mcp_config.jsonviauvx,docker run, orpodman run, or point at a local streamable-http container byurl.Remote URL — connect to a server deployed behind Caddy at
https://hdhomerun-mcp.example.invalid/mcpusing the"url"key.
Container images (:mcp vs :agent)
One multi-stage docker/Dockerfile builds two right-sized images, selected by --target:
Image tag | Build target | Contents | Entrypoint |
|
|
|
|
|
|
|
|
docker build --target mcp -t knucklessg1/hdhomerun-mcp:mcp docker/ # slim MCP server
docker build --target agent -t knucklessg1/hdhomerun-mcp:1.1.0 docker/ # full agentKnowledge-graph database (epistemic-graph)
The full agent ([agent] / :1.1.0) embeds the epistemic-graph engine (pulled in via
agent-utilities[agent]). For production — or to share one knowledge graph across multiple
agents — run epistemic-graph as its own database container and point the agent at it.
Deployment recipes (single-node + Raft HA), connection config, and the full database
architecture (with diagrams) are in the
epistemic-graph deployment guide.
The slim [mcp] server does not require the database.
Documentation
Full documentation is published to the GitHub Pages site and mirrored under docs/:
Governed capability contract
This package ships a compact canonical skill surface with specialist procedures
kept as referenced workflows. The current MCP tools, skill metadata,
connector_manifest.yml, ontology, mappings, shapes, fixtures, migrations,
tool-schema fingerprints, and certification metadata form one versioned
capability contract. Validate them together; do not rely on stale tool names or
historical per-task skill wrappers.
Runtime endpoints, credentials, certificate trust, tenant identity, retention, and observability policy are deployment inputs and are never packaged values. See Configuration, trust, and privacy before enabling a network transport, connector ingestion, GraphOS delegation, or trace export.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for the FFmpeg Micro video transcoding API — create, monitor, download transcodes.
The official MCP Server for the Mux API
QuLab MCP remote server (Streamable HTTP) for computational science and lab tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server for agents to control MultiViewer, the best way to watch motorsports. Works locally or remotely.19MIT
- AlicenseBqualityBmaintenanceMCP server to help manage a WHMCS installation.6225 npm20MIT
- AlicenseAqualityBmaintenanceMCP server for Plex Media Server, focused on media discovery, search, library management, and playback control.25MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for controlling Apple TV, HomePod, and AirPlay devices via pyatv, offering 32 tools for playback, navigation, volume, apps, and more.1MIT