MCP *arr Server

Query and manage a self-hosted Sonarr, Radarr, Lidarr and Prowlarr media stack from an MCP client

By Jim Christian (individual) TypeScript Local · stdio Media

59 popularity score ★ 238 ↓ 1.3k/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs SONARR_URL, SONARR_API_KEY. Replace each <NAME> with your value.

Claude CodeTerminal
claude mcp add arr -e SONARR_URL=<SONARR_URL> -e SONARR_API_KEY=<SONARR_API_KEY> -- npx -y mcp-arr-server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "arr": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-arr-server"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "arr": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-arr-server"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "arr": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "mcp-arr-server"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.arr]
command = "npx"
args = ["-y", "mcp-arr-server"]

[mcp_servers.arr.env]
SONARR_URL = "<SONARR_URL>"
SONARR_API_KEY = "<SONARR_API_KEY>"
Gemini CLITerminal
gemini mcp add --scope user -e SONARR_URL=<SONARR_URL> -e SONARR_API_KEY=<SONARR_API_KEY> arr npx -- -y mcp-arr-server
Local (container)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs SONARR_URL, SONARR_API_KEY. Replace each <NAME> with your value.

Claude CodeTerminal
claude mcp add arr -e SONARR_URL=<SONARR_URL> -e SONARR_API_KEY=<SONARR_API_KEY> -- docker run --rm -i -e SONARR_URL -e SONARR_API_KEY ghcr.io/aplaceforallmystuff/mcp-arr:latest
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "arr": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "SONARR_URL",
        "-e",
        "SONARR_API_KEY",
        "ghcr.io/aplaceforallmystuff/mcp-arr:latest"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "arr": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "SONARR_URL",
        "-e",
        "SONARR_API_KEY",
        "ghcr.io/aplaceforallmystuff/mcp-arr:latest"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "arr": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "SONARR_URL",
        "-e",
        "SONARR_API_KEY",
        "ghcr.io/aplaceforallmystuff/mcp-arr:latest"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.arr]
command = "docker"
args = ["run", "--rm", "-i", "-e", "SONARR_URL", "-e", "SONARR_API_KEY", "ghcr.io/aplaceforallmystuff/mcp-arr:latest"]

[mcp_servers.arr.env]
SONARR_URL = "<SONARR_URL>"
SONARR_API_KEY = "<SONARR_API_KEY>"
Gemini CLITerminal
gemini mcp add --scope user -e SONARR_URL=<SONARR_URL> -e SONARR_API_KEY=<SONARR_API_KEY> arr docker -- run --rm -i -e SONARR_URL -e SONARR_API_KEY ghcr.io/aplaceforallmystuff/mcp-arr:latest
Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs SONARR_URL, SONARR_API_KEY. Replace each <NAME> with your value.

FirstTerminal
git clone https://github.com/aplaceforallmystuff/mcp-arr.git
cd mcp-arr
npm install
npm run build
Claude CodeTerminal
claude mcp add arr -e SONARR_URL=<SONARR_URL> -e SONARR_API_KEY=<SONARR_API_KEY> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "arr": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "arr": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "arr": {
      "type": "stdio",
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
      ],
      "env": {
        "SONARR_URL": "<SONARR_URL>",
        "SONARR_API_KEY": "<SONARR_API_KEY>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.arr]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]

[mcp_servers.arr.env]
SONARR_URL = "<SONARR_URL>"
SONARR_API_KEY = "<SONARR_API_KEY>"
Gemini CLITerminal
gemini mcp add --scope user -e SONARR_URL=<SONARR_URL> -e SONARR_API_KEY=<SONARR_API_KEY> arr node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'

Settings 12

SONARR_URL Required: Sonarr base URL, e.g. http://localhost:8989. Any one app pair works instead: RADARR_, LIDARR_ or PROWLARR_URL/API_KEY.
SONARR_API_KEY Required: Sonarr API key from Settings > General > Security.
RADARR_URL Optional: Radarr base URL, e.g. http://localhost:7878.
RADARR_API_KEY Optional: Radarr API key.
LIDARR_URL Optional: Lidarr base URL, e.g. http://localhost:8686.
LIDARR_API_KEY Optional: Lidarr API key.
PROWLARR_URL Optional: Prowlarr base URL, e.g. http://localhost:9696.
PROWLARR_API_KEY Optional: Prowlarr API key.
MCP_TRANSPORT Optional: Set to http to serve Streamable HTTP instead of stdio.
HOST Optional: HTTP bind address, 127.0.0.1 by default.
PORT Optional: HTTP port, 3000 by default.
MCP_PATH Optional: HTTP endpoint path, /mcp by default.

In a container, a setting goes in with -e NAME=value after docker run.

What it does

MCP *arr Server connects an MCP client to the self-hosted "*arr" apps people use to run a home media library: Sonarr for TV, Radarr for films, Lidarr for music and Prowlarr for indexers. It talks to each app's own HTTP API with that app's API key, so you can browse what is in the library, see what is downloading, check upcoming releases, look up new titles and add them, and start searches for missing episodes, albums or films.

Tools appear only for the apps you configure. For Sonarr, Radarr and Lidarr it also adds a set of read-only configuration tools (quality profiles, health checks, root folders and free space, download clients, naming rules, tags, and a one-call setup dump) so you can ask why something is not being grabbed. A further group of tools pulls reference quality profiles, custom formats, naming schemes and size limits from the TRaSH Guides GitHub repository and can compare your own profile or naming against them; those work with no *arr app configured at all.

It runs over stdio by default, or as a Streamable HTTP server (MCP_TRANSPORT=http) for clients such as ChatGPT that connect to a URL; for those it also offers generic search and fetch tools. With all four apps configured, version 1.7.3 registers 64 distinct tool names, more than the README tables suggest, because the seven configuration tools are generated once per app (src/index.ts).

The package description in the repository mentions Readarr, but the code at v1.7.3 reads settings only for Sonarr, Radarr, Lidarr and Prowlarr; there are no Readarr tools.

What it needs

RuntimeNode.js 18+orDocker

Node.js 18 or newer (for npx), or Docker for the published ghcr.io image. At least one running Sonarr, Radarr, Lidarr or Prowlarr instance reachable from where the server runs, plus that app's API key (Settings > General > Security). The TRaSH Guides tools need outbound access to GitHub.

Limits

No Readarr support in v1.7.3, despite the repository description. Configuration tools are read-only: profiles, naming and download clients must be changed in each app's own interface. Library and queue listings return 25 items by default, up to 100 with limit and offset; calendars look 7 days ahead for Sonarr and 30 for Radarr and Lidarr by default. Prowlarr gets no configuration tools. TRaSH data is cached for an hour. When Lidarr is configured, lidarr_get_root_folders and lidarr_get_quality_profiles are registered twice in the tool list (once explicitly, once by the per-app config set), which a strict client may reject.

Who it suits

Suits people who already run Sonarr, Radarr, Lidarr or Prowlarr at home and want to ask about their library, queue and setup in plain language, or have an assistant add titles and kick off searches. It is a community project, not from the *arr developers. Because several tools change the library or queue, give it only the apps you want it to act on. Readarr users will find nothing for books here. If you want to expose it to a remote client, plan your own access control, since the HTTP mode has none.

Tools 49 of 64

arr_status
Reports connection status of each configured *arr app
arr_search_all
Runs one search across every configured app
search
Generic search over *arr media and TRaSH profiles for URL-based clients
fetch
Returns full detail for an id from search
sonarr_get_series
Lists series in the Sonarr library, paged and filterable by title
sonarr_search
Looks up a TV series by name to get its tvdbId
sonarr_add_series
Adds a series to Sonarr, with optional tags
sonarr_get_root_folders
Lists Sonarr root folders and free space
sonarr_get_quality_profiles
Lists Sonarr quality profiles
sonarr_get_queue
Shows the Sonarr download queue, paged
sonarr_get_calendar
Shows upcoming episodes
sonarr_get_episodes
Lists a series' episodes and which are missing
sonarr_search_missing
Starts a search for all missing episodes of a series
sonarr_search_episode
Starts a search for chosen episodes
sonarr_refresh_series
Refreshes a series' metadata
radarr_get_movies
Lists films in the Radarr library, paged
radarr_search
Looks up a film by name to get its tmdbId
radarr_add_movie
Adds a film to Radarr, with optional tags
radarr_get_root_folders
Lists Radarr root folders and free space
radarr_get_quality_profiles
Lists Radarr quality profiles
radarr_get_queue
Shows the Radarr download queue, paged
radarr_get_calendar
Shows upcoming film releases
radarr_search_movie
Starts a download search for one film
radarr_search_movies
Starts download searches for several films at once
radarr_update_movie
Changes a film's profile, monitoring, availability, tags or path
radarr_delete_queue_item
Removes a queue item, optionally blocklisting the release
radarr_refresh_movie
Refreshes a film's metadata
lidarr_get_artists
Lists artists in the Lidarr library
lidarr_search
Looks up an artist by name to get its foreignArtistId
lidarr_add_artist
Adds an artist to Lidarr, with optional tags
lidarr_get_root_folders
Lists Lidarr root folders
lidarr_get_quality_profiles
Lists Lidarr quality profiles
lidarr_get_metadata_profiles
Lists Lidarr metadata profiles
lidarr_get_queue
Shows the Lidarr download queue, paged
lidarr_get_albums
Lists an artist's albums and which are missing
lidarr_search_album
Starts a search for one album
lidarr_search_missing
Starts a search for an artist's missing albums
lidarr_get_calendar
Shows upcoming album releases
prowlarr_get_indexers
Lists configured indexers
prowlarr_search
Searches across all indexers
prowlarr_test_indexers
Tests every indexer and reports health
prowlarr_get_stats
Shows indexer query, grab and failure counts
trash_list_profiles
Lists TRaSH Guides quality profiles for Radarr or Sonarr
trash_get_profile
Shows a TRaSH profile's formats, scores and qualities
trash_list_custom_formats
Lists TRaSH custom formats, filterable by category
trash_get_naming
Gives TRaSH naming schemes for Plex, Emby, Jellyfin or standard
trash_get_quality_sizes
Gives TRaSH size ranges per quality level
trash_compare_profile
Compares one of your profiles with a TRaSH profile
trash_compare_naming
Compares your naming settings with TRaSH recommendations

Similar servers