servarr-mcp
servarr-mcp
·
claude-opus-4-8[1m] · 2026-07-07 · details
An MCP server for the
Servarr stack — Sonarr, Radarr, Lidarr,
Readarr, and Prowlarr — packaged as a Docker container. Lets an MCP
client (Claude Desktop, etc.) browse, search, and manage whichever
*arr apps you're running: library reads plus add/edit, queue
management, interactive release grabbing, and search/refresh
commands. Every tool carries MCP annotations (readOnlyHint,
destructiveHint, idempotentHint) so clients can distinguish and
gate the write surface.
Apps are optional: configure only the ones you actually run, and only those tools register.
Tools
Sonarr (TV)
Read:
Tool | Description |
| List all TV series tracked by Sonarr |
| Series details by ID |
| Search TVDB for a new series to add |
| List episodes for a series |
| Episode details by ID |
| Upcoming episodes |
| Current download queue |
| Compact/redacted import-list inspection |
| Compact/redacted notification and event inspection |
| Discover bounded manual-import candidates with episode/file context |
| Recent history (newest first) |
| History for one series |
| Monitored episodes with no file |
| Episodes below their quality cutoff |
| Live indexer search for candidate releases |
| Poll an async command's status |
| Health check results |
| Disk space per root folder |
| Quality profiles |
| Root folders |
| Tags |
Write:
Tool | Description |
| Add a series to the library |
| Edit a tracked series (monitoring, profile, etc.) |
| Grab a release from |
| Confirm-gated import of one exact candidate into explicit episode ids |
| Remove one queue item or a confirm-gated batch of up to 100 |
| Confirm-gated automatic-add state update |
| Confirm-gated manual-interaction event update |
| Force re-grab of a stuck queue item |
| Mark a history record failed (triggers re-search) |
| Trigger a search for missing episodes |
| Trigger a search for a whole series |
| Trigger a search for one season |
| Trigger a search for specific episodes |
| Refresh series metadata and rescan disk |
Radarr (movies)
Read:
Tool | Description |
| All movies tracked by Radarr |
| Movie details by ID |
| Search TMDB for a new movie to add |
| Look up a movie by TMDB ID |
| Look up a movie by IMDb ID |
| Upcoming movie releases |
| Current download queue |
| Compact/redacted import-list inspection |
| Compact/redacted notification and event inspection |
| Discover bounded manual-import candidates with movie/file context |
| Recent history (newest first) |
| History for one movie |
| Monitored movies with no file |
| Movies below their quality cutoff |
| Live indexer search for candidate releases |
| Poll an async command's status |
| Health check results |
| Disk space per root folder |
| Quality profiles |
| Root folders |
| Tags |
Write:
Tool | Description |
| Add a movie to the library |
| Edit a tracked movie (monitoring, profile, etc.) |
| Grab a release from |
| Confirm-gated import of one exact candidate into an explicit movie id |
| Remove one queue item or a confirm-gated batch of up to 100 |
| Confirm-gated provider/automatic-add state update |
| Confirm-gated manual-interaction event update |
| Force re-grab of a stuck queue item |
| Mark a history record failed (triggers re-search) |
| Trigger a search for missing movies |
| Trigger a search for specific movies |
| Refresh movie metadata and rescan disk |
Lidarr (music)
Read:
Tool | Description |
| All artists tracked by Lidarr |
| Artist details by ID |
| Search for a new artist to add |
| List albums (optionally per-artist) |
| Album details by ID |
| Track details |
| Track files on disk |
| Current download queue |
| Compact/redacted import-list inspection |
| Compact/redacted notification and event inspection |
| Discover bounded manual-import candidates with album/track context |
| Recent history |
| History for one artist |
| Monitored albums with no files |
| Albums below their quality cutoff |
| Live indexer search for candidate releases |
| Poll an async command's status |
| Health check results |
| Disk space per root folder |
| Quality profiles |
| Metadata profiles |
| Root folders |
| Tags |
Write:
Tool | Description |
| Add an artist to the library |
| Edit a tracked artist (monitoring, profiles, etc.) |
| Grab a release from |
| Confirm-gated import with explicit artist/album/release/track ids and replacement choice |
| Remove one queue item or a confirm-gated batch of up to 100 |
| Confirm-gated automatic-add state update |
| Force re-grab of a stuck queue item |
| Mark a history record failed (triggers re-search) |
| Trigger a search for missing albums |
| Trigger a search for an artist's albums |
| Trigger a search for specific albums |
| Refresh artist metadata and rescan disk |
Readarr (books)
Read:
Tool | Description |
| All authors tracked by Readarr |
| Author details by ID |
| Search for a new author to add |
| List books (optionally per-author) |
| Book details by ID |
| Current download queue |
| Compact/redacted import-list inspection |
| Compact/redacted notification and event inspection |
| Discover bounded manual-import candidates with book/edition context |
| Recent history |
| History for one author |
| Monitored books with no files |
| Books below their quality cutoff |
| Live indexer search for candidate releases |
| Poll an async command's status |
| Health check results |
| Disk space per root folder |
| Quality profiles |
| Metadata profiles |
| Root folders |
| Tags |
Write:
Tool | Description |
| Add an author to the library |
| Edit a tracked author (monitoring, profiles, etc.) |
| Grab a release from |
| Confirm-gated import with explicit author/book/edition ids and replacement choice |
| Remove one queue item or a confirm-gated batch of up to 100 |
| Confirm-gated automatic-add state update |
| Force re-grab of a stuck queue item |
| Mark a history record failed (triggers re-search) |
| Trigger a search for missing books |
| Trigger a search for an author's books |
| Trigger a search for specific books |
| Refresh author metadata and rescan disk |
Prowlarr (indexer manager)
Read-only:
Tool | Description |
| All configured indexers |
| Per-indexer query/grab stats |
| Indexer health / disabled status |
| Search across enabled indexers |
| Recent history (queries, grabs) |
| Health check results |
Configuration
Each app uses two environment variables. Set both for an app to enable its tools; leave them unset to skip the app entirely.
App | URL var | API key var | Default port |
Sonarr |
|
| 8989 |
Radarr |
|
| 7878 |
Lidarr |
|
| 8686 |
Readarr |
|
| 8787 |
Prowlarr |
|
| 9696 |
API keys are found under each app's Settings → General → API Key.
At least one app must be configured or the server exits with an error.
Same-host deployments
When the *arr apps run on the same Docker host as this container
(typical home-lab setup), don't use the host's hostname (e.g.
my-nas) in the *_URL vars — Docker's DNS context can't resolve
the host's own name from inside a container. Use
http://host.docker.internal:<port> instead. The provided
docker-compose.yml already maps host.docker.internal to the host
gateway via extra_hosts, so this works on Linux Docker too (not
just Docker Desktop).
Run with Docker
docker build -t servarr-mcp .
docker run -i --rm \
-e SONARR_URL=http://192.168.1.50:8989 -e SONARR_API_KEY=... \
-e RADARR_URL=http://192.168.1.50:7878 -e RADARR_API_KEY=... \
-e PROWLARR_URL=http://192.168.1.50:9696 -e PROWLARR_API_KEY=... \
servarr-mcpPublished image
After each push to main, GitHub Actions builds and pushes a multi-arch
image to GHCR:
ghcr.io/carldog/servarr-mcp:latest (linux/amd64 + linux/arm64)
Pull instead of building locally:
docker pull ghcr.io/carldog/servarr-mcp:latest
docker run -i --rm \
-e SONARR_URL=... -e SONARR_API_KEY=... \
ghcr.io/carldog/servarr-mcp:latestRun with Docker Compose (HTTP, long-lived)
The compose file runs the server in HTTP mode (Streamable HTTP) for
long-lived deployment via Portainer or Compose. It pulls the published
image from ghcr.io/carldog/servarr-mcp:latest.
# Set whichever app credentials apply:
export SONARR_URL=http://192.168.1.50:8989; export SONARR_API_KEY=...
export RADARR_URL=http://192.168.1.50:7878; export RADARR_API_KEY=...
# ... (other apps as needed)
export HOST_PORT=3002 # optional, defaults to 3002
docker compose upThe MCP endpoint will be at http://<host>:${HOST_PORT}/mcp.
Deploy via Portainer (Stack from Git)
In Portainer, Stacks → Add Stack → Repository.
Repository URL:
https://github.com/CarlDog/servarr-mcpCompose path:
docker-compose.ymlEnvironment variables: set whichever
<APP>_URL/<APP>_API_KEYpairs apply, plus optionallyHOST_PORT.Deploy. Healthcheck reaches green within ~10 seconds.
Use with Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"servarr": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "SONARR_URL", "-e", "SONARR_API_KEY",
"-e", "RADARR_URL", "-e", "RADARR_API_KEY",
"-e", "PROWLARR_URL", "-e", "PROWLARR_API_KEY",
"servarr-mcp"
],
"env": {
"SONARR_URL": "http://192.168.1.50:8989",
"SONARR_API_KEY": "...",
"RADARR_URL": "http://192.168.1.50:7878",
"RADARR_API_KEY": "...",
"PROWLARR_URL": "http://192.168.1.50:9696",
"PROWLARR_API_KEY": "..."
}
}
}
}Repeat the -e and env block patterns for whichever apps you run.
Local development
npm install
cp .env.example .env # then edit
SONARR_URL=... SONARR_API_KEY=... npm run devSecurity
The container runs as a non-root user (
servarr).API keys are passed via env vars — never bake them into the image.
A
.githooks/pre-commitruns gitleaks on every commit. Activate it once per clone:git config core.hooksPath .githooks.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/CarlDog/servarr-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server