jellyctrl
ActiveOperating a Jellyfin server means dashboard-hopping: click into Sessions to see who is watching, click into another pane to pause a stream, click again to scan a library. jellyctrl hands your agent a typed control surface over stdio so "pause whatever is playing in the living room" or "scan the Movies library" becomes one tool call, with every destructive action gated behind explicit confirmation.
See it work
one question, the tools it calls, the answer
Representative session. Illustrative values, RFC 5737 addresses. Destructive and bulk actions require confirm: true; the tool talks HTTP to your server only.
What it does
Point any MCP client at jellyctrl (published to npm as jellyfin-mcp) and your Jellyfin media server becomes tools an agent can call: list active sessions, pause or cast a stream, scan a library, prune Continue Watching, run a scheduled task, or manage users, all as schema-validated tool calls instead of raw REST or dashboard clicks. It exists because inspecting and operating a running media server from a shell, cron, CI, or an agent is faster than clicking through the web UI, and because an agent can chain those steps end to end. Unlike a generic HTTP tool or a hand-written script, jellyctrl exposes 56 typed tools split into read-only discovery and reporting versus write operations, with every destructive or privileged call gated behind a confirm: true flag and a destructiveHint annotation so clients can route it to human approval. The same core also ships a jellyctrl CLI for the read and report commands, so shells and cron share one config with the MCP surface.
Capabilities
56 tools across the server
Set it up
Configure with JELLYFIN_URL and JELLYFIN_API_KEY (Dashboard > API Keys). Optional: JELLYFIN_TIMEOUT (default 30s), JELLYFIN_VERIFY_SSL.
MCP client config
{ "mcpServers": { "jellyfin": { "command": "npx", "args": ["-y", "jellyfin-mcp"], "env": { "JELLYFIN_URL": "http://192.0.2.10:8096", "JELLYFIN_API_KEY": "your-api-key-here" } } } }Discovery and reporting tools are read-only; every destructive or privileged operation (restart, shutdown, delete_user, set_user_password, Quick Connect authorize, Continue Watching clears, bulk session controls, resume-position writes) requires an explicit confirm: true flag plus a destructiveHint annotation, so clients can route it to human approval. Upstream Jellyfin error responses are summarized to status only before returning to the model; the full body is logged to stderr for operators, so internal server detail is not surfaced to the agent.