Skip to main content
Glama
dannyj

sonarr-radarr-mcp

by dannyj

sonarr-radarr-mcp

One MCP server that exposes both Sonarr (TV) and Radarr (movies) to an AI assistant, built with FastMCP. Look up a title, add it with your configured quality profile and root folder, kick off an indexer search, and ask what the download queue is doing — in plain language.

Both services are optional. Each is enabled only when both its URL and its API key are set; configuring exactly one of a pair is an error and the server refuses to start. At least one service must be configured.

Tools

Radarr (movies)

Tool

What it does

search_movie

Search TMDB for movies matching a title (use before adding).

add_movie

Add a movie to the library by TMDB id, optionally searching immediately.

list_movies

List library movies, optionally filtered.

get_movie

Details for one movie already in the library.

search_movie_releases

Ask Radarr to search indexers for a tracked movie.

delete_movie

Remove a movie, optionally deleting its files.

Sonarr (TV)

Tool

What it does

search_series

Search TVDB for series matching a title (use before adding).

add_series

Add a series by TVDB id, optionally starting a search.

list_series

List library series, optionally filtered.

get_series

Details for one series, including per-season status.

get_episodes

List episodes for a series, optionally one season.

search_season

Search indexers for every missing episode of one season.

search_episodes

Search indexers for specific episode ids.

delete_series

Remove a series, optionally deleting its files.

Both (take a service argument: "radarr" or "sonarr")

Tool

What it does

get_queue

What is downloading now, and whether it is actually progressing.

get_calendar

Upcoming movie releases / episode air dates in a date window.

get_history

Recent grabs, imports, failures and upgrades.

get_config

Quality profiles and root folders the instance offers.

system_status

Reachability check plus health warnings.

Related MCP server: MCP *arr Server

Where to find your API keys

In each app: Settings → General → Security → API Key. Radarr and Sonarr have separate keys.

Quick start

a) Docker Compose (homelab)

cp .env.example .env   # fill in the URLs and API keys
docker compose up -d

The server listens on http://<host>:8000/mcp.

If your *arr apps run in Docker too, put this container on their network and address them by container name (http://radarr:7878) — see the comments in docker-compose.yml. Otherwise use the host's LAN IP; localhost inside the container means the container.

Set MCP_API_KEY in .env before exposing the port beyond a trusted network — without it the endpoint is unauthenticated, and these tools can delete media.

b) Connect Claude Code (HTTP)

claude mcp add --transport http sonarr-radarr http://HOST:8000/mcp

With MCP_API_KEY set:

claude mcp add --transport http sonarr-radarr http://HOST:8000/mcp \
  --header "Authorization: Bearer YOUR_MCP_API_KEY"

c) Local stdio (Claude Desktop)

Runs the server as a child process — no port, no bearer token needed.

{
  "mcpServers": {
    "sonarr-radarr": {
      "command": "uv",
      "args": [
        "run",
        "--no-editable",
        "--directory", "/absolute/path/to/sonarr_radarr_mcp",
        "sonarr-radarr-mcp"
      ],
      "env": {
        "TRANSPORT": "stdio",
        "RADARR_URL": "http://192.168.1.10:7878",
        "RADARR_API_KEY": "...",
        "SONARR_URL": "http://192.168.1.10:8989",
        "SONARR_API_KEY": "..."
      }
    }
  }
}

TRANSPORT=stdio is required here — the default is http. The env block is also required: the server does not read .env itself. For a manual local run, export it first:

set -a; . ./.env; set +a
uv run --no-editable sonarr-radarr-mcp

Configuration

Variable

Required

Default

Notes

RADARR_URL

with RADARR_API_KEY

Base URL, no /api/v3 suffix. Trailing / is stripped.

RADARR_API_KEY

with RADARR_URL

Settings → General → Security.

RADARR_QUALITY_PROFILE

no

first on instance

Profile name, e.g. HD-1080p.

RADARR_ROOT_FOLDER

no

first on instance

Path as Radarr sees it, e.g. /movies.

SONARR_URL

with SONARR_API_KEY

Base URL, no /api/v3 suffix.

SONARR_API_KEY

with SONARR_URL

Settings → General → Security.

SONARR_QUALITY_PROFILE

no

first on instance

Profile name.

SONARR_ROOT_FOLDER

no

first on instance

Path as Sonarr sees it, e.g. /tv.

TRANSPORT

no

http

http (streamable HTTP at /mcp) or stdio.

HOST

no

0.0.0.0

HTTP transport only.

PORT

no

8000

HTTP transport only.

MCP_API_KEY

no

unset

When set, HTTP clients must send Authorization: Bearer <key>. Ignored for stdio.

Quality profiles and root folders are configured by name/path, not id — ids differ between instances. Names are resolved against the live instance at call time.

Example prompts

  • "Download the film Dune Part Three"

  • "Is my download finished?"

  • "Add Severance and start searching for season 2"

  • "What's airing this week?"

  • "Which movies in my library are still missing files?"

Development

uv sync          # install, including dev dependencies
uv run pytest    # 105 tests

Tests are fully offline — HTTP is mocked with respx, so no live Sonarr or Radarr instance is needed.

CI/CD

Every push runs the test suite; pushes to main additionally build and publish ghcr.io/dannyj/sonarr-radarr-mcp:latest (see .github/workflows/ci.yml). The Docker host runs a systemd timer (deploy/sonarr-radarr-mcp-deploy.timer, every 10 minutes) that pulls the image and restarts the stack only when the digest changed, then verifies the MCP endpoint answers before declaring success (deploy/pull-and-deploy.sh). The host pulls rather than CI pushing, so no inbound access or host credentials live in GitHub. One-time host setup:

git clone https://github.com/dannyj/sonarr-radarr-mcp.git ~/Documents/repos/sonarr-radarr-mcp
cd ~/Documents/repos/sonarr-radarr-mcp && cp .env.example .env  # fill in URLs + keys
sudo cp deploy/sonarr-radarr-mcp-deploy.{service,timer} /etc/systemd/system/
sudo systemctl daemon-reload && sudo systemctl enable --now sonarr-radarr-mcp-deploy.timer

macOS gotcha: if uv run sonarr-radarr-mcp fails with ModuleNotFoundError: No module named 'sonarr_radarr_mcp' despite a clean uv sync, the repo is in an iCloud-synced folder (e.g. ~/Documents): iCloud re-marks the editable-install .pth file hidden+dataless, and CPython silently skips hidden .pth files. chflags nohidden does not stick — iCloud re-applies the flag within a minute. Run with uv run --no-editable sonarr-radarr-mcp instead (real files, no .pth), as all examples above do. pytest is immune (pythonpath = ["src"] in pyproject.toml), and so is the Docker image.

F
license - not found
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

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/dannyj/sonarr-radarr-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server