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 and search whichever *arr apps you're running.
Apps are optional: configure only the ones you actually run, and only those tools register.
| Tool | Description |
|---|---|
sonarr_list_series |
List all TV series tracked by Sonarr |
sonarr_get_series |
Series details by ID |
sonarr_lookup_series |
Search TVDB for a new series to add |
sonarr_list_episodes |
List episodes for a series |
sonarr_calendar |
Upcoming episodes |
sonarr_queue |
Current download queue |
sonarr_history |
Recent history (newest first) |
| Tool | Description |
|---|---|
radarr_list_movies |
All movies tracked by Radarr |
radarr_get_movie |
Movie details by ID |
radarr_lookup_movie |
Search TMDB for a new movie to add |
radarr_calendar |
Upcoming movie releases |
radarr_queue |
Current download queue |
radarr_history |
Recent history (newest first) |
| Tool | Description |
|---|---|
lidarr_list_artists |
All artists tracked by Lidarr |
lidarr_get_artist |
Artist details by ID |
lidarr_lookup_artist |
Search for a new artist to add |
lidarr_list_albums |
List albums (optionally per-artist) |
lidarr_queue |
Current download queue |
lidarr_history |
Recent history |
| Tool | Description |
|---|---|
readarr_list_authors |
All authors tracked by Readarr |
readarr_get_author |
Author details by ID |
readarr_lookup_author |
Search for a new author to add |
readarr_list_books |
List books (optionally per-author) |
readarr_queue |
Current download queue |
readarr_history |
Recent history |
| Tool | Description |
|---|---|
prowlarr_list_indexers |
All configured indexers |
prowlarr_indexer_stats |
Per-indexer query/grab stats |
prowlarr_search |
Search across enabled indexers |
prowlarr_history |
Recent history (queries, grabs) |
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 | SONARR_URL |
SONARR_API_KEY |
8989 |
| Radarr | RADARR_URL |
RADARR_API_KEY |
7878 |
| Lidarr | LIDARR_URL |
LIDARR_API_KEY |
8686 |
| Readarr | READARR_URL |
READARR_API_KEY |
8787 |
| Prowlarr | PROWLARR_URL |
PROWLARR_API_KEY |
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.
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-mcpAfter 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:latestThe 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.
- In Portainer, Stacks → Add Stack → Repository.
- Repository URL:
https://github.com/CarlDog/servarr-mcp - Compose path:
docker-compose.yml - Environment variables: set whichever
<APP>_URL/<APP>_API_KEYpairs apply, plus optionallyHOST_PORT. - Deploy. Healthcheck reaches green within ~10 seconds.
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.
npm install
cp .env.example .env # then edit
SONARR_URL=... SONARR_API_KEY=... npm run dev- 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.