By jmagar
Connects Claude Code to the rustarr MCP server — one tool surface over a media-automation fleet (Sonarr, Radarr, Prowlarr, Tautulli, Overseerr, qBittorrent, SABnzbd, Plex, Jellyfin, and more). Also bundles standalone per-service skills (sonarr, radarr, prowlarr, overseerr, sabnzbd, qbittorrent, plex, jellyfin, tautulli, tracearr, bazarr) that drive each service's REST API directly as an offline fallback when the MCP server is unavailable.
This skill should be used when the user wants to manage subtitles in Bazarr. Triggers include: "missing subtitles", "wanted subtitles", "search subtitles", "download subtitles", "subtitle providers", "Bazarr status", "what subtitles are missing", "find subtitles for", or any mention of subtitle management for movies or TV series.
This skill should be used when the user asks about Jellyfin media server. Triggers include: "check Jellyfin", "Jellyfin library", "who's watching on Jellyfin", "active Jellyfin sessions", "add a Jellyfin user", "Jellyfin metadata", "Jellyfin transcoding", "Jellyfin health", "Jellyfin scheduled tasks", "Jellyfin plugins", or any mention of Jellyfin media server management.
This skill should be used when the user wants to request movies or TV shows via Overseerr, monitor or manage media requests, or check request status. Triggers include: "request a movie", "request a TV show", "add to Overseerr", "check request status", "pending requests", "is my request done", "Overseerr status", "approve a request", "decline a request", "delete a request", or any mention of Overseerr media requesting.
This skill should be used when the user wants to interact with their Plex Media Server. Triggers include: "check Plex", "search Plex", "what's on Plex", "what's playing on Plex", "who's watching", "Plex sessions", "active streams", "Plex library", "browse movies", "browse TV shows", "recently added", "on deck", "continue watching", "Plex status", or any mention of Plex Media Server.
This skill should be used when the user asks to search indexers, find a release, check indexer status, list indexers, sync indexers to Sonarr or Radarr, connect Prowlarr to another app, or mentions Prowlarr or indexer management.
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
This plugin requires configuration values that are prompted when the plugin is enabled. Sensitive values are stored in your system keychain.
no_authRun the MCP server without authentication. ONLY safe when the server is bound to 127.x (loopback). Use this for local development only — never expose an unauthed MCP server on a network interface.
${user_config.no_auth}plex_urlPlex Media Server base URL. Maps to RUSTARR_PLEX_URL.
${user_config.plex_url}api_tokenBearer token for MCP HTTP authentication. Every request to /mcp includes: Authorization: Bearer <token>. Server mode: pick any value and use the same value in RUSTARR_MCP_TOKEN. Client mode: paste the token your server admin configured. Generate one with: openssl rand -hex 32 or just gen-token.
${user_config.api_token}auth_modeServer auth mode. 'bearer' uses only the static API token. 'oauth' enables Google OAuth/JWT for clients like Codex while the static token remains accepted for this Claude Code plugin connection. OAuth mode requires public_url, google_client_id, google_client_secret, and auth_admin_email.
${user_config.auth_mode}bazarr_urlBazarr base URL, e.g. http://localhost:6767. Maps to RUSTARR_BAZARR_URL / BAZARR_URL.
${user_config.bazarr_url}plex_tokenPlex authentication token (X-Plex-Token). Maps to RUSTARR_PLEX_TOKEN.
${user_config.plex_token}public_urlPublic base URL for OAuth issuer metadata, e.g. https://rustarr.tootie.tv. Required when auth_mode=oauth. If empty, setup derives it from an https server_url by stripping /mcp suffix. Server mode only.
${user_config.public_url}radarr_urlRadarr base URL. Maps to RUSTARR_RADARR_URL.
${user_config.radarr_url}server_urlBase URL of the MCP HTTP server this Claude Code session connects to. If running locally: keep http://localhost:40070. If connecting to a remote server: set to http://hostname:40070 or https://rustarr.tootie.tv. Do NOT include a trailing /mcp — the plugin appends it automatically.
${user_config.server_url}sonarr_urlSonarr base URL. Maps to RUSTARR_SONARR_URL.
${user_config.sonarr_url}sabnzbd_urlSABnzbd base URL, e.g. http://localhost:8080. Maps to RUSTARR_SABNZBD_URL / SABNZBD_URL.
${user_config.sabnzbd_url}jellyfin_urlJellyfin base URL. Maps to RUSTARR_JELLYFIN_URL.
${user_config.jellyfin_url}prowlarr_urlProwlarr base URL. Maps to RUSTARR_PROWLARR_URL.
${user_config.prowlarr_url}tautulli_urlTautulli base URL incl. port, e.g. http://localhost:8181. Maps to RUSTARR_TAUTULLI_URL / TAUTULLI_URL.
${user_config.tautulli_url}tracearr_urlTracearr base URL for its public API, e.g. http://localhost:3000.
${user_config.tracearr_url}overseerr_urlOverseerr base URL. Maps to RUSTARR_OVERSEERR_URL.
${user_config.overseerr_url}bazarr_api_keyBazarr API key (Settings -> General -> Security).
${user_config.bazarr_api_key}radarr_api_keyRadarr API key. Maps to RUSTARR_RADARR_API_KEY.
${user_config.radarr_api_key}sonarr_api_keySonarr API key. Maps to RUSTARR_SONARR_API_KEY.
${user_config.sonarr_api_key}qbittorrent_urlqBittorrent Web UI base URL. Maps to RUSTARR_QBITTORRENT_URL.
${user_config.qbittorrent_url}sabnzbd_api_keySABnzbd API key (Config -> General).
${user_config.sabnzbd_api_key}auth_admin_emailBootstrap allowed Google account for OAuth mode. The server refuses to start OAuth mode without at least one allowlisted email address. Server mode only.
${user_config.auth_admin_email}google_client_idGoogle OAuth client ID used when auth_mode=oauth. Create a Web application OAuth client in Google Cloud Console (console.cloud.google.com). The plugin setup script adds the required redirect URIs automatically. Server mode only.
${user_config.google_client_id}jellyfin_api_keyJellyfin API key. Maps to RUSTARR_JELLYFIN_API_KEY.
${user_config.jellyfin_api_key}prowlarr_api_keyProwlarr API key. Maps to RUSTARR_PROWLARR_API_KEY.
${user_config.prowlarr_api_key}rustarr_servicesComma-separated Rustarr service names to configure, for example: sonarr,radarr,prowlarr,overseerr,qbittorrent,plex,jellyfin. Maps to RUSTARR_SERVICES.
${user_config.rustarr_services}tautulli_api_keyTautulli API key (Settings -> Web Interface).
${user_config.tautulli_api_key}overseerr_api_keyOverseerr API key. Maps to RUSTARR_OVERSEERR_API_KEY.
${user_config.overseerr_api_key}google_client_secretGoogle OAuth client secret from the same Google Cloud Console credential. Stored in the generated plugin env file with mode 600 (owner-read-only). Server mode only.
${user_config.google_client_secret}qbittorrent_passwordqBittorrent Web UI login password. Maps to RUSTARR_QBITTORRENT_PASSWORD.
${user_config.qbittorrent_password}qbittorrent_usernameqBittorrent Web UI login username. Maps to RUSTARR_QBITTORRENT_USERNAME.
${user_config.qbittorrent_username}radarr_default_quality_profileQuality profile id the bundled radarr fallback skill uses when adding movies.
${user_config.radarr_default_quality_profile}sonarr_default_quality_profileQuality profile id the bundled sonarr fallback skill uses when adding series.
${user_config.sonarr_default_quality_profile}Rust MCP and CLI server for a media automation fleet: Sonarr, Radarr, Prowlarr, Tautulli, Overseerr, Bazarr, Tracearr, SABnzbd, qBittorrent, Plex, and Jellyfin.
rustarr is an upstream-client MCP server. It does not try to replace those applications or mirror every REST endpoint as a web UI. Its job is to provide one consistent tool surface for agents and one equivalent CLI surface for operators.
| Surface | Status | Purpose |
|---|---|---|
| MCP | Required | A single yarr tool that runs a Code Mode script over the whole fleet |
| CLI | Required | Scriptable parity surface for debugging and automation |
| REST | Not shipped | Upstream-client servers do not expose a local REST action API |
| Web | Not shipped | Upstream-client servers do not serve an embedded web UI |
The MCP surface is one tool, yarr: it takes a JavaScript async arrow function
(code) and runs it in an in-process QuickJS sandbox (Code Mode). Inside the
script the whole fleet is reached through per-service callables with the service
baked in — for the 6 spec-backed services (Sonarr, Radarr, Prowlarr, Overseerr,
Jellyfin, Plex) these are generated from the upstream OpenAPI specs (e.g.
sonarr.get_series(), radarr.post_movie({...})); the 2 doc-based download/stats
capabilities keep curated commands; plus api.<service>.{get,post,put,delete} raw
passthrough and callTool as an escape hatch. codemode.search/describe discover
callables and response types on demand. The CLI is service-grouped
(rustarr <service> <command> [flags], plus rustarr codemode --code <JS>); CLI ↔
MCP parity is mechanically enforced by tests/parity.rs.
These work for every configured service kind:
| Action | Scope | CLI | Description |
|---|---|---|---|
service_status | rustarr:read | rustarr <service> status | Fetch an upstream service status endpoint |
api_get | rustarr:write | rustarr <service> get --path <path> | Proxy a safe credentialed GET request to a configured service |
api_post | rustarr:write | rustarr <service> post --path <path> --body <json> | Proxy a POST request to a configured service (runs immediately) |
api_put | rustarr:write | rustarr <service> put --path <path> --body <json> | Proxy a PUT request to a configured service (runs immediately) |
api_delete | rustarr:write | rustarr <service> delete --path <path> --confirm | Proxy a DELETE request to a configured service (destructive; requires confirm) |
help | public | rustarr help | Return action reference |
Paths must be relative API paths. Query-string secrets such as apikey=, token=, and X-Plex-Token are rejected; credentials belong in config or environment variables.
The MCP yarr tool dispatches the codemode action, and a script reaches the rest
of the fleet through these (MCP-only) actions, also available on the CLI via
rustarr codemode / rustarr snippet:
| Action | Scope | Surface | Description |
|---|---|---|---|
codemode | rustarr:write | yarr tool / rustarr codemode --code <JS>|--file <path> | Run a JS arrow function over the fleet; returns {result, calls, logs, artifacts} |
op | rustarr:write | inside Code Mode (<service>.<operation>()) | Dispatch a generated OpenAPI operation for a spec-backed service. DELETE ops are refused mid-script |
snippet_list | rustarr:read | rustarr snippet list / codemode.snippets() | List saved Code Mode snippets |
snippet_save | rustarr:write | rustarr snippet save | Save a named, reusable Code Mode snippet |
snippet_run | rustarr:write | rustarr snippet run / codemode.run(name, input) | Run a saved snippet (one level deep) |
snippet_delete | rustarr:write | rustarr snippet delete | Delete a saved snippet |
Destructive deletes are refused inside Code Mode (no confirmation channel mid-script); call them directly with --confirm.
The 6 spec-backed services are served by generated OpenAPI operations — the
entire upstream API surface (e.g. Sonarr's ~235 operations / ~136 component types),
generated from the vendored specs in specs/ by cargo xtask gen-openapi into
src/openapi/generated/. Inside Code Mode they are per-service callables you
discover with codemode.search/describe and invoke directly, with the service
baked in:
async () => {
const status = await sonarr.get_system_status(); // generated op
const movie = await radarr.post_movie({ body }); // generated op (POST)
return { status, added: movie };
}
The 2 doc-based capabilities (no machine-readable spec) keep curated, slimmed CLI
commands. Mutating download commands require --confirm; stats_delete_image_cache
is the one destructive stats command and is also confirm-gated.
npx claudepluginhub jmagar/dendrite --plugin rustarrQuery, monitor, and manage Unraid servers via GraphQL API through MCP tools. Supports system info, Docker, VMs, array/parity, notifications, plugins, rclone, and live telemetry.
Core homelab agents, commands, and setup/health skills for self-hosted service management. Includes interactive credential setup wizard and unified service health dashboard.
Unraid NAS/homelab monitoring via MCP
SWAG reverse proxy configuration management via MCP. Create, edit, view, and manage nginx proxy configurations with auth integration.
Tailscale network management via MCP — query devices, ACL, DNS, users, and API keys from Claude
Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques
Harness-native ECC plugin for engineering teams - 67 agents, 278 skills, 94 legacy command shims, reusable hooks, rules, MCP conventions, and operator workflows for Claude Code plus adjacent agent harnesses
Supergraph enforces a complete, evidence-based coding pipeline — scan → plan → TDD → fix → verify → review — grounded in real codebase analysis at every step. It combines AST dependency graphs, LSP-level code intelligence, and a structured skill chain so Claude never guesses about impact before making a change.
Superpowers Plus core skills library for Claude Code: planning, execution routing, TDD, debugging, and collaboration workflows
Claude harness - A harness for solo developers (Vibecoders) to handle full-cycle contract development.
Memory compression system for Claude Code - persist context across sessions