Skip to main content
Glama
servarr-mcp

servarr-mcp

by CarlDog

servarr-mcp

code confidence · claude-fable-5-1 · 2026-11-08 · 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

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_get_episode

Episode details by ID

sonarr_calendar

Upcoming episodes

sonarr_queue

Current download queue

sonarr_list_import_lists

Compact/redacted import-list inspection

sonarr_list_notifications

Compact/redacted notification and event inspection

sonarr_manual_import_candidates

Discover bounded manual-import candidates with episode/file context

sonarr_history

Recent history (newest first)

sonarr_history_series

History for one series

sonarr_wanted_missing

Monitored episodes with no file

sonarr_wanted_cutoff

Episodes below their quality cutoff

sonarr_release_search

Live indexer search for candidate releases

sonarr_get_command

Poll an async command's status

sonarr_health

Health check results

sonarr_diskspace

Disk space per root folder

sonarr_list_quality_profiles

Quality profiles

sonarr_list_root_folders

Root folders

sonarr_list_tags

Tags

Write:

Tool

Description

sonarr_add_series

Add a series to the library

sonarr_edit_series

Edit a tracked series (monitoring, profile, etc.)

sonarr_grab_release

Grab a release from sonarr_release_search results

sonarr_manual_import

Confirm-gated import of one exact candidate into explicit episode ids

sonarr_queue_remove

Remove one queue item or a confirm-gated batch of up to 100

sonarr_set_import_list_state

Confirm-gated automatic-add state update

sonarr_set_notification_manual_interaction

Confirm-gated manual-interaction event update

sonarr_queue_regrab

Force re-grab of a stuck queue item

sonarr_history_mark_failed

Mark a history record failed (triggers re-search)

sonarr_search_missing

Trigger a search for missing episodes

sonarr_search_series

Trigger a search for a whole series

sonarr_search_season

Trigger a search for one season

sonarr_search_episode

Trigger a search for specific episodes

sonarr_refresh_series

Refresh series metadata and rescan disk

Radarr (movies)

Read:

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_lookup_tmdb

Look up a movie by TMDB ID

radarr_lookup_imdb

Look up a movie by IMDb ID

radarr_calendar

Upcoming movie releases

radarr_queue

Current download queue

radarr_list_import_lists

Compact/redacted import-list inspection

radarr_list_notifications

Compact/redacted notification and event inspection

radarr_manual_import_candidates

Discover bounded manual-import candidates with movie/file context

radarr_history

Recent history (newest first)

radarr_history_movie

History for one movie

radarr_wanted_missing

Monitored movies with no file

radarr_wanted_cutoff

Movies below their quality cutoff

radarr_release_search

Live indexer search for candidate releases

radarr_get_command

Poll an async command's status

radarr_health

Health check results

radarr_diskspace

Disk space per root folder

radarr_list_quality_profiles

Quality profiles

radarr_list_root_folders

Root folders

radarr_list_tags

Tags

Write:

Tool

Description

radarr_add_movie

Add a movie to the library

radarr_edit_movie

Edit a tracked movie (monitoring, profile, etc.)

radarr_grab_release

Grab a release from radarr_release_search results

radarr_manual_import

Confirm-gated import of one exact candidate into an explicit movie id

radarr_queue_remove

Remove one queue item or a confirm-gated batch of up to 100

radarr_set_import_list_state

Confirm-gated provider/automatic-add state update

radarr_set_notification_manual_interaction

Confirm-gated manual-interaction event update

radarr_queue_regrab

Force re-grab of a stuck queue item

radarr_history_mark_failed

Mark a history record failed (triggers re-search)

radarr_search_missing

Trigger a search for missing movies

radarr_search_movie

Trigger a search for specific movies

radarr_refresh_movie

Refresh movie metadata and rescan disk

Lidarr (music)

Read:

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_get_album

Album details by ID

lidarr_get_track

Track details

lidarr_list_trackfiles

Track files on disk

lidarr_queue

Current download queue

lidarr_list_import_lists

Compact/redacted import-list inspection

lidarr_list_notifications

Compact/redacted notification and event inspection

lidarr_manual_import_candidates

Discover bounded manual-import candidates with album/track context

lidarr_history

Recent history

lidarr_history_artist

History for one artist

lidarr_wanted_missing

Monitored albums with no files

lidarr_wanted_cutoff

Albums below their quality cutoff

lidarr_release_search

Live indexer search for candidate releases

lidarr_get_command

Poll an async command's status

lidarr_health

Health check results

lidarr_diskspace

Disk space per root folder

lidarr_list_quality_profiles

Quality profiles

lidarr_list_metadata_profiles

Metadata profiles

lidarr_list_root_folders

Root folders

lidarr_list_tags

Tags

Write:

Tool

Description

lidarr_add_artist

Add an artist to the library

lidarr_edit_artist

Edit a tracked artist (monitoring, profiles, etc.)

lidarr_grab_release

Grab a release from lidarr_release_search results

lidarr_manual_import

Confirm-gated import with explicit artist/album/release/track ids and replacement choice

lidarr_queue_remove

Remove one queue item or a confirm-gated batch of up to 100

lidarr_set_import_list_state

Confirm-gated automatic-add state update

lidarr_queue_regrab

Force re-grab of a stuck queue item

lidarr_history_mark_failed

Mark a history record failed (triggers re-search)

lidarr_search_missing

Trigger a search for missing albums

lidarr_search_artist

Trigger a search for an artist's albums

lidarr_search_album

Trigger a search for specific albums

lidarr_refresh_artist

Refresh artist metadata and rescan disk

Readarr (books)

Read:

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_get_book

Book details by ID

readarr_queue

Current download queue

readarr_list_import_lists

Compact/redacted import-list inspection

readarr_list_notifications

Compact/redacted notification and event inspection

readarr_manual_import_candidates

Discover bounded manual-import candidates with book/edition context

readarr_history

Recent history

readarr_history_author

History for one author

readarr_wanted_missing

Monitored books with no files

readarr_wanted_cutoff

Books below their quality cutoff

readarr_release_search

Live indexer search for candidate releases

readarr_get_command

Poll an async command's status

readarr_health

Health check results

readarr_diskspace

Disk space per root folder

readarr_list_quality_profiles

Quality profiles

readarr_list_metadata_profiles

Metadata profiles

readarr_list_root_folders

Root folders

readarr_list_tags

Tags

Write:

Tool

Description

readarr_add_author

Add an author to the library

readarr_edit_author

Edit a tracked author (monitoring, profiles, etc.)

readarr_grab_release

Grab a release from readarr_release_search results

readarr_manual_import

Confirm-gated import with explicit author/book/edition ids and replacement choice

readarr_queue_remove

Remove one queue item or a confirm-gated batch of up to 100

readarr_set_import_list_state

Confirm-gated automatic-add state update

readarr_queue_regrab

Force re-grab of a stuck queue item

readarr_history_mark_failed

Mark a history record failed (triggers re-search)

readarr_search_missing

Trigger a search for missing books

readarr_search_author

Trigger a search for an author's books

readarr_search_book

Trigger a search for specific books

readarr_refresh_author

Refresh author metadata and rescan disk

Prowlarr (indexer manager)

Read-only:

Tool

Description

prowlarr_list_indexers

All configured indexers

prowlarr_indexer_stats

Per-indexer query/grab stats

prowlarr_indexer_status

Indexer health / disabled status

prowlarr_search

Search across enabled indexers

prowlarr_history

Recent history (queries, grabs)

prowlarr_health

Health check results

Related MCP server: Arr-MCP

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

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.

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-mcp

Published 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:latest

Run 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 up

The MCP endpoint will be at http://<host>:${HOST_PORT}/mcp.

Deploy via Portainer (Stack from Git)

  1. In Portainer, Stacks → Add Stack → Repository.

  2. Repository URL: https://github.com/CarlDog/servarr-mcp

  3. Compose path: docker-compose.yml

  4. Environment variables: set whichever <APP>_URL/<APP>_API_KEY pairs apply, plus optionally HOST_PORT.

  5. 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 dev

Security

  • 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-commit runs gitleaks on every commit. Activate it once per clone: git config core.hooksPath .githooks.

Available Tools

29 tools
sonarr_add_seriesSonarr: Add SeriesA

Add a new series to Sonarr by TVDB id. Internally calls /series/lookup to fetch the full series metadata, then POSTs /series with the merged body. Returns the created SeriesResource. Workflow: call sonarr_lookup_series first to get the tvdbId, sonarr_list_quality_profiles for quality_profile_id, sonarr_list_root_folders for root_folder_path. Note: search_for_missing_episodes defaults to false here — Sonarr's server-side default is true, which may immediately hit indexers; flip explicitly if you want that.

Inputs: tvdb_id (required), quality_profile_id (required), root_folder_path (required), monitored, +3 more.

sonarr_calendarSonarr: CalendarA
Read-only

Get upcoming/recent episodes from Sonarr's calendar within an ISO date window. Use for 'what's airing this week?' queries. Movies live in radarr_calendar; Lidarr/Readarr/Prowlarr have no calendar surface.

Inputs: start, end.

sonarr_diskspaceSonarr: Disk SpaceA
Read-only

Get per-mount disk space (free/total bytes) seen by Sonarr. Useful for 'where do I have room to add this?' decisions; pair with sonarr_list_root_folders to map paths to capacity.

Inputs: no named parameters.

sonarr_edit_seriesSonarr: Edit SeriesA
DestructiveIdempotent

Edit settings on an existing Sonarr series. Internally GETs the current SeriesResource, applies your changes, and PUTs the full resource back. Pass only the fields you want to change — others are preserved. WARNING: changing root_folder_path moves files on disk; watch your storage and download client.

Inputs: id (required), monitored, quality_profile_id, root_folder_path, +2 more.

sonarr_get_commandSonarr: Get Command StatusA
Read-only

Poll the status of an async command queued by sonarr_search_*, sonarr_refresh_series, etc. Returns the current CommandResource (status: queued|started|completed|failed, exception, started/ended timestamps).

Inputs: id (required).

sonarr_get_episodeSonarr: Get EpisodeA
Read-only

Get full details for a single Sonarr episode by ID — air date, overview, file info, monitored state, etc.

Inputs: id (required).

sonarr_get_seriesSonarr: Get SeriesA
Read-only

Get full details for a Sonarr series by id — overview, cast, seasons, episode counts, file paths. Drill-down companion to sonarr_list_series and sonarr_lookup_series.

Inputs: id (required).

sonarr_grab_releaseSonarr: Grab ReleaseA

HIGH RISK. Immediately queues a download from the indexer for the given release. Pass the release object verbatim from sonarr_release_search output — Sonarr looks the release up server-side by guid+indexerId, so the cache must still be warm (re-run release_search if the grab fails with a 'not found' error). If the release was rejected by the quality profile, set should_override to true to grab anyway.

Inputs: release (required), should_override.

sonarr_healthSonarr: HealthA
Read-only

Get aggregated Sonarr health warnings (indexer down, low disk, etc.). Summary view; for actionable per-indexer failure detail (which indexers, since when, why) use prowlarr_indexer_status.

Inputs: no named parameters.

sonarr_historySonarr: HistoryA
Read-only

Get recent Sonarr history (newest first). For per-resource scope use sonarr_history_series. To re-trigger a search for a wrong-grab event, use sonarr_history_mark_failed.

Inputs: page_size.

sonarr_history_mark_failedSonarr: Mark History FailedA
DestructiveIdempotent

Mark a Sonarr history entry as failed. Triggers Sonarr to re-search for a replacement on the next interval. Useful when an episode imported as the wrong cut/quality/release. Returns a confirmation; no body from the *arr API.

Inputs: id (required).

sonarr_history_seriesSonarr: Series HistoryA
Read-only

Get history scoped to a single series — every grab/import/upgrade/delete event. Much narrower than sonarr_history, which is server-wide and routinely runs into hundreds of thousands of records.

Inputs: series_id (required).

sonarr_list_episodesSonarr: List EpisodesA
Read-only

List every episode for a Sonarr series. Returns episode ids you can drill into with sonarr_get_episode or pass to sonarr_release_search / sonarr_search_episode.

Inputs: series_id (required).

sonarr_list_quality_profilesSonarr: List Quality ProfilesA
Read-only

List Sonarr quality profiles. The id is required as qualityProfileId when adding a series.

Inputs: no named parameters.

sonarr_list_root_foldersSonarr: List Root FoldersA
Read-only

List Sonarr root folders (where series are stored on disk). The path is required as rootFolderPath when adding a series.

Inputs: no named parameters.

sonarr_list_seriesSonarr: List SeriesA
Read-only

List TV series tracked by Sonarr as a paged result. Default returns slim fields per series (id, title, year, monitored, tvdbId, imdbId, tmdbId, qualityProfileId, tags, path, network, status, ended, nextAiring, previousAiring, runtime, seasonFolder, statistics — statistics carries seasonCount / episodeFileCount / episodeCount / sizeOnDisk); set verbose=true for the full SeriesResource. Sonarr's upstream /series returns the entire library in one shot — paging here is server-side. For full details on one series (including all seasons), use sonarr_get_series. To find a series NOT yet tracked, use sonarr_lookup_series (TVDB metadata).

Inputs: page, page_size, verbose.

sonarr_list_tagsSonarr: List TagsA
Read-only

List Sonarr tags (label + id pairs). Useful for scoping queries by tag (e.g. 'show me everything tagged kids') and for setting tag ids on add/edit operations.

Inputs: no named parameters.

sonarr_lookup_seriesSonarr: Lookup Series (TVDB)A
Read-only

Fuzzy search TVDB for a series to potentially add. Returns SeriesResource with tvdbId etc., suitable for sonarr_add_series. Searches TVDB's catalogue, NOT your tracked library — use sonarr_list_series / sonarr_get_series for what's already tracked.

Inputs: term (required).

sonarr_queueSonarr: QueueA
Read-only

Get the current Sonarr download queue, paged. Default returns the first 20 records. Bump page_size or step through pages when the queue is large.

Inputs: page, page_size.

sonarr_queue_regrabSonarr: Re-grab Queue ItemA

Force Sonarr to re-grab a stuck queue item from the indexer. Useful when a download is hung or the file is corrupt. Returns the updated queue entry.

Inputs: id (required).

sonarr_queue_removeSonarr: Remove from QueueA
DestructiveIdempotent

Remove a single item from Sonarr's download queue. All four flags are exposed because the server-side defaults are not obviously safe — in particular, removeFromClient defaults to true on Sonarr's side, which deletes the file from the download client. This tool defaults remove_from_client to false; flip it explicitly if you want the file gone.

Inputs: id (required), remove_from_client, blocklist, skip_redownload, +1 more.

sonarr_refresh_seriesSonarr: Refresh Series MetadataA
Idempotent

Trigger Sonarr to re-pull metadata from TVDB for one series (cast, episode list, artwork). Async — returns the queued CommandResource. Poll status with sonarr_get_command (use the returned id).

Inputs: series_id (required).

sonarr_search_episodeSonarr: Search EpisodesA
Idempotent

Trigger Sonarr to search indexers for one or more specific episodes. Async — returns the queued CommandResource. Poll status with sonarr_get_command (use the returned id).

Inputs: episode_ids (required).

sonarr_search_missingSonarr: Search Missing EpisodesA
Idempotent

Trigger Sonarr to search indexers for all monitored, missing episodes. Async — returns the queued CommandResource (id, status); the actual search runs in the background. Poll status with sonarr_get_command (use the returned id).

Inputs: no named parameters.

sonarr_search_seasonSonarr: Search SeasonA
Idempotent

Trigger Sonarr to search indexers for one season of one series. Async — returns the queued CommandResource. Poll status with sonarr_get_command (use the returned id).

Inputs: series_id (required), season_number (required).

sonarr_search_seriesSonarr: Search SeriesA
Idempotent

Trigger Sonarr to search indexers for all monitored, missing episodes of one series. Async — returns the queued CommandResource. Poll status with sonarr_get_command (use the returned id).

Inputs: series_id (required).

sonarr_wanted_cutoffSonarr: Wanted (Below Cutoff)A
Read-only

List episodes downloaded below cutoff quality — upgrade candidates. Filters to monitored items by default. Items here are upgrade candidates; trigger a re-search with sonarr_search_missing (which also picks up cutoff-unmet items by default).

Inputs: page_size, monitored.

sonarr_wanted_missingSonarr: Wanted (Missing)A
Read-only

List episodes that are wanted but not yet downloaded. Filters to monitored items by default. Once you've identified what's missing, trigger an indexer hunt with sonarr_search_missing.

Inputs: page_size, monitored.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 29 tools

    Disambiguation5/5

    Each tool targets a distinct action on a specific entity (series, episode, queue, history, etc.), with clear scoping differences (e.g., sonarr_list_series vs sonarr_lookup_series, sonarr_history vs sonarr_history_series). No two tools appear to do the same thing.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern with 'sonarr_' prefix (e.g., sonarr_add_series, sonarr_list_episodes, sonarr_get_command). No mixing of naming conventions.

    Tool Count4/5

    29 tools for a full-featured media management server is slightly high but justified given the breadth of operations (CRUD, search, queue, history, system). Each tool serves a distinct purpose without unnecessary duplication.

    Completeness4/5

    Covers core workflows: adding/editing series, managing episodes, queue control, history, health checks, and system info. Missing a delete series tool and some edge-case operations, but the surface is largely complete for typical usage.

    Maintenance

    ActivityActive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      MCP server for managing a media server stack (Plex, Radarr, Overseerr, Bazarr, Prowlarr, Trakt.tv) using natural language to browse, request, and discover content.
      12
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      MCP server to manage your *ARR media stack (Radarr, Sonarr, Lidarr, Readarr, Prowlarr) for searching, adding, and managing movies, TV shows, music, books, and indexers.
      1
      ISC
    • F
      license
      Not graded
      quality
      D
      maintenance
      A remote MCP server for managing your arr stack (Sonarr, Radarr, qBittorrent, Seerr) via Claude.ai on mobile, enabling you to fix bad downloads, block release groups, request new content, and check trending.
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server that enables local LLMs to manage a home media stack including Radarr, Sonarr, Prowlarr, and others.
      MIT