jellyctrl

Active

Operating 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.

56 toolsread + writeconfirm-gated writesstdioNode 20+MIT

See it work

one question, the tools it calls, the answer

representative session · claude + jellyctrl
What is playing on Jellyfin right now, and pause whatever is on in the living room.
jellyfin_list_sessions{ activeOnly: true }
2 active Living Room TV Blade Runner 2049 01:12:40 / 02:43:00 playing 192.0.2.24 Office Laptop The Expanse S3E5 00:18:02 / 00:52:11 playing 192.0.2.31
jellyfin_pause_session{ sessionId: "a4f1c9" }
ok Living Room TV paused at 01:12:40
Living Room TV was on Blade Runner 2049 at 1:12:40. Paused it. The Office Laptop is still playing The Expanse; leaving that one alone.

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

System & libraries5 tools
Server status and update check; list virtual folders; trigger a scan; restart or shutdown (confirm-gated).
Sessions & playback18 tools
List active clients; pause, resume, stop, seek, skip, volume, mute, audio and subtitle streams, cast, and bulk controls.
User data & discovery11 tools
Mark played, favorites, watch history, resume queue, next-up per series, similar items, and Continue Watching clears.
Items, playlists & collections11 tools
Search and fetch item metadata; create, list, and edit playlists and collections.
Users & Quick Connect7 tools
List, create, delete, disable, and reset users; check and authorize Quick Connect login codes.
Tasks & activity3 tools
List and run scheduled tasks; query the recent server activity log.
Full reference on GitHub →

Set it up

npm i -g jellyfin-mcp

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" } } } }
[ shield ]

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.

56
MCP tools
confirm
gated writes
stdio
transport
MIT
license