sonarr-radarr-mcp
Provides tools for managing movie libraries via Radarr, including searching TMDB, adding movies, listing library, getting details, searching indexers for releases, and deleting movies.
Provides tools for managing TV series libraries via Sonarr, including searching TVDB, adding series, listing series, getting series details with season status, listing episodes, searching indexers for seasons or specific episodes, and deleting series.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sonarr-radarr-mcpsearch for the movie Inception"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 TMDB for movies matching a title (use before adding). |
| Add a movie to the library by TMDB id, optionally searching immediately. |
| List library movies, optionally filtered. |
| Details for one movie already in the library. |
| Ask Radarr to search indexers for a tracked movie. |
| Remove a movie, optionally deleting its files. |
Sonarr (TV)
Tool | What it does |
| Search TVDB for series matching a title (use before adding). |
| Add a series by TVDB id, optionally starting a search. |
| List library series, optionally filtered. |
| Details for one series, including per-season status. |
| List episodes for a series, optionally one season. |
| Search indexers for every missing episode of one season. |
| Search indexers for specific episode ids. |
| Remove a series, optionally deleting its files. |
Both (take a service argument: "radarr" or "sonarr")
Tool | What it does |
| What is downloading now, and whether it is actually progressing. |
| Upcoming movie releases / episode air dates in a date window. |
| Recent grabs, imports, failures and upgrades. |
| Quality profiles and root folders the instance offers. |
| 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 -dThe 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/mcpWith 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-mcpConfiguration
Variable | Required | Default | Notes |
| with | — | Base URL, no |
| with | — | Settings → General → Security. |
| no | first on instance | Profile name, e.g. |
| no | first on instance | Path as Radarr sees it, e.g. |
| with | — | Base URL, no |
| with | — | Settings → General → Security. |
| no | first on instance | Profile name. |
| no | first on instance | Path as Sonarr sees it, e.g. |
| no |
|
|
| no |
| HTTP transport only. |
| no |
| HTTP transport only. |
| no | unset | When set, HTTP clients must send |
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 testsTests 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.timermacOS gotcha: if
uv run sonarr-radarr-mcpfails withModuleNotFoundError: No module named 'sonarr_radarr_mcp'despite a cleanuv sync, the repo is in an iCloud-synced folder (e.g.~/Documents): iCloud re-marks the editable-install.pthfile hidden+dataless, and CPython silently skips hidden.pthfiles.chflags nohiddendoes not stick — iCloud re-applies the flag within a minute. Run withuv run --no-editable sonarr-radarr-mcpinstead (real files, no.pth), as all examples above do.pytestis immune (pythonpath = ["src"]inpyproject.toml), and so is the Docker image.
This server cannot be installed
Maintenance
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
- 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/dannyj/sonarr-radarr-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server