arr-doctor
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ARR_LANG | No | Language of errors and notes: en or es | en |
| RADARR_URL | No | Full URL for Radarr, e.g. http://192.168.1.10:7878 | |
| SONARR_URL | No | Full URL for Sonarr, e.g. http://192.168.1.10:8989 | |
| ARR_TIMEOUT | No | HTTP timeout in seconds. Scans and interactive searches use higher values | 15 |
| ARR_READONLY | No | true disables every write tool | false |
| PROWLARR_URL | No | Full URL for Prowlarr, e.g. http://192.168.1.10:9696 | |
| RADARR_API_KEY | No | Radarr API key | |
| SONARR_API_KEY | No | Sonarr API key | |
| PROWLARR_API_KEY | No | Prowlarr API key | |
| ARR_DOWNLOADS_PATH | No | Download folder as Sonarr/Radarr see it, used by find_orphan_downloads. If unset, it is detected from the queue and the import history | |
| ARR_SEARCH_CONFIRM_ABOVE | No | Searches or queue removals over this many items need confirmation | 10 |
| ARR_INDEXER_BUDGET_PER_HOUR | No | Max searches/grabs/indexer tests per hour (0 = unlimited) | 30 |
| ARR_SEARCH_COOLDOWN_MINUTES | No | Skip items searched less than this many minutes ago (0 = off) | 60 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_system_statusA | Version and reachability of every configured service (Sonarr, Radarr, Prowlarr). Use it first when something fails, to check connectivity and API keys. Examples: "Are Sonarr and Radarr up?", "Which Radarr version am I running?" |
| search_libraryA | Search the local Sonarr/Radarr library (what is already added) by title. Does not search the internet; use add_series/add_movie for that. Examples: "Do I have The Capture?", "Which Star Wars movies are in my library?" |
| get_seriesA | Details of one series in Sonarr, including per-season statistics (episodes on disk vs aired, monitored seasons, size). Examples: "How complete is The Capture?", "Which seasons of Severance are monitored?" |
| get_episodesA | Episodes of a series with has_file, monitored, air date and file quality. Examples: "Is S03E04 of The Capture downloaded?", "Which episodes of season 2 are missing?" |
| get_missingA | Wanted/missing: monitored episodes (Sonarr) or movies (Radarr) without a file. Examples: "What episodes am I missing?", "Which movies are still not downloaded?" |
| get_cutoff_unmetB | Items that have a file but below the quality profile cutoff (upgrade candidates). Examples: "What could be upgraded to better quality?", "Which movies are below cutoff?" |
| get_calendarA | Upcoming (or recent) episode air dates and movie releases. Examples: "What airs this week?", "What came out in the last 3 days?" |
| get_queueA | Download queue with tracked state (downloading, importBlocked, importPending, failed…), status messages explaining why an import is stuck, indexer and download client. Downloads that Sonarr/Radarr did not grab themselves are hidden (as in the web UI) and only counted, unless include_unknown=true. Stalled downloads (no activity, no metadata, no progress for 6 h) are marked with stall_reason and count as problems, even when Sonarr/Radarr report them as healthy. Examples: "What's stuck in the queue and why?", "Is S03E04 of The Capture still downloading?" |
| get_historyA | Activity history: grabs (with indexer), imports, failed downloads, deletions. Examples: "Which indexer did S03E04 of The Capture come from?", "What failed to download in the last 7 days?" |
| get_blocklistA | Blocklisted releases with the indexer they came from and the reason. Examples: "What's in the blocklist?", "Which indexer has the most blocklisted releases?" |
| get_healthA | Health warnings and errors reported by Sonarr/Radarr (and Prowlarr if configured): unreachable download client, missing root folder, indexers failing… each with the usual fix when it is a known check. Examples: "Any health warnings?", "Is something wrong with Radarr?" |
| get_logsA | Latest log entries at the given level (default: errors). Examples: "Show me Sonarr's recent errors", "Why is Radarr failing? check the logs" |
| get_disk_spaceA | Free and total space of the disks/volumes seen by Sonarr/Radarr. Examples: "How much disk space is left on the NAS?" |
| get_command_statusA | Status of an asynchronous command (search, refresh, manual import) started earlier. For a finished manual import it also checks that each file really reached the library. Examples: "Has the search for S03E04 finished?", "Did the manual import work?" |
| find_orphan_downloadsA | Importable files in the downloads folder that no queue item is tracking (e.g. Download Station removed the task before Sonarr imported it). Groups them by series/movie and says whether each episode/movie already has a file (duplicate) or is missing. Also flags several files for the same episode. If no folder is configured, the download folders are detected from the queue and the import history. The scan can take a while on a NAS. Examples: "Why wasn't S03E04 of The Capture imported?", "Is anything stuck in /downloads?" |
| find_suspicious_releasesA | Detect fake/malicious releases, with the indexer that provided them: executables (.exe .scr .lnk .bat .cmd .msi .zipx) in the queue, history and blocklist; grabs made more than a day before the episode aired or the movie's digital/physical release (likely="fake" if they never imported, "early_release" if they did, e.g. box sets); and different downloads for different episodes with the exact same size. Examples: "Is there any .exe in the queue?", "Which indexer is sending me fake releases?" |
| explain_searchA | Explain why Sonarr/Radarr did not grab something: run an interactive search and summarize every release found, grouped by rejection reason (language, size, quality, custom format score, already have it…), plus basic checks (monitored, aired, available). The guids returned can be grabbed with grab_release. Queries every indexer live, so it counts against the hourly indexer budget: use it for one item at a time, never in a loop. Examples: "Why didn't Sonarr grab S03E04 of The Capture?", "Why is Dune not downloading? What releases are out there?" |
| diagnose_importA | Diagnose why a download is not being imported: combines the queue status messages, Sonarr/Radarr's own rejections for the files in the download, and path visibility, and returns the probable cause with a concrete fix (remote path mapping, permissions, manual match, not an upgrade, sample, fake release…). Examples: "Why isn't S03E04 importing?", "Why is everything stuck in importBlocked?" |
| check_pathsA | Check the path setup that breaks most imports: root folders (accessible, free space), remote path mappings, download clients, whether Sonarr/Radarr can actually see the download clients' output folders, and the related health warnings. Examples: "Is my remote path mapping right?", "Why does Sonarr say the path does not exist?" |
| find_stalled_downloadsA | Find downloads that are stuck: reported as stalled / no connections / no seeds by the
download client, with a download client error, or — after Examples: "Which downloads are stalled?", "Remove the stuck torrents and find another release" |
| parse_releaseA | Show how Sonarr/Radarr interpret a release name: matched series/episodes or movie, quality, languages, custom formats and score. If the item already has a file, compares both and estimates whether it would be an upgrade under the quality profile and why. Examples: "How would Sonarr score 'The.Capture.S03E04.2160p.WEB.DV-GRP'?", "Why is this release 'not an upgrade'?" |
| grab_releaseA | Send a specific release (from explain_search) to the download client, even if it was rejected. Only works within ~30 minutes of the search; search again if it fails. Examples: "Grab that 1080p release anyway", "Download the second one from the list" |
| library_reportB | Disk usage and cleanup report: total size, biggest series/movies, unmonitored items that still have files, ended series that are complete, size per quality (movies) and free space per root folder. Read-only: it never deletes anything. Examples: "What takes the most space?", "What could I delete to free space?" |
| preview_renameA | Preview which files would be renamed by the current naming settings (current path -> new path). Nothing is changed. Show it to the user; if they agree, apply with rename_files and the confirmation_token returned here. Examples: "Which files of The Capture don't follow my naming scheme?", "Preview renaming Dune" |
| test_download_clientsA | Test the connection to every download client configured in Sonarr/Radarr and report which ones fail and why. Examples: "Can Sonarr reach my download client?", "Test the download clients" |
| bulk_edit_previewA | Preview a change to many series or movies at once (monitoring, quality profile, tags, series type, minimum availability): which items match and what would change. Changes nothing. Select items by IDs/titles and/or filters (status, monitored, quality profile, tag, year, complete). Show the preview to the user; if they agree, apply it with bulk_edit_apply and the confirmation_token returned here. Examples: "Which ended series would be unmonitored?", "Preview putting the 4K profile on all 2024 movies" |
| rename_filesA | Rename the files of a series (optionally one season) or a movie to match the current naming settings. Call preview_rename first, show it to the user and only call this once they agree, passing the preview's confirmation_token (required for more than one file). Examples: "Yes, rename the files of The Capture season 3", "Apply the rename to Dune" |
| bulk_edit_applyA | Apply a change to many series or movies at once. For several items or a filter selection, call bulk_edit_preview first, show it to the user and only call this once they agree, passing the preview's confirmation_token (same selection and changes). A single item named by the user can be changed directly. Root folders are not changed here because that would move files. Examples: "Yes, unmonitor those ended series", "Tag The Capture with 'uk'" |
| search_episodesA | Trigger an indexer search for specific episodes (by ID, or series + season + episode numbers). Episodes searched in the last hour are skipped (force=true to override) and searches over many episodes ask for confirmation first, to respect indexer limits. Examples: "Search S03E04 of The Capture again", "Look for episodes 3 and 4 of season 1 of Severance" |
| search_seasonA | Trigger an indexer search for a whole season (season packs or every episode). Examples: "Search season 2 of The Capture" |
| add_seriesA | Add a new series to Sonarr. Looks it up online first; if several results match it returns the candidates, and if quality profile or root folder are missing it returns the available options instead of guessing. Examples: "Add The Capture with the HD-1080p profile", "Add Severance and search for it" |
| search_missingA | Trigger a search for every monitored missing episode (Sonarr) and/or movie (Radarr). Sonarr/Radarr normally find new releases through RSS on their own; mass searches hit every indexer once per item and can exceed indexer limits. Over a few items it first returns how many would be searched and needs confirm=true. Prefer narrower searches. Examples: "Search everything that's missing", "Search all missing episodes of The Capture" |
| set_monitoredA | Monitor or unmonitor episodes (by ID, or series + season + episode numbers in one call), a whole season, a whole series, or a movie. Examples: "Stop monitoring S03E02 of Lioness", "Stop monitoring season 1 of The Capture", "Unmonitor the movie Cats" |
| remove_from_queueA | Remove items from the download queue, optionally deleting them from the download client and blocklisting the release. With blocklist=true and skip_redownload=false, Sonarr/Radarr automatically search for another release. Removing a torrent from the client stops seeding (private trackers may count it as hit-and-run). Many items at once need confirm=true. Examples: "Remove the .exe releases from the queue, blocklist them and find another version", "Delete queue item 42 from Download Station" |
| refresh_itemA | Refresh metadata and rescan files on disk for a series or movie. Examples: "Refresh The Capture", "Rescan the files of Dune" |
| manual_importA | Import specific files from the downloads folder into the library (all or nothing).
Never imports a whole folder blindly: every file must be listed, must be matched to a
series/episode or movie, must have no rejections, and no two files may target the same
episode or movie. If anything fails, nothing is imported and the problems are returned.
When Sonarr/Radarr cannot identify a file ("Unknown Series", "matched by ID, manual import
required"), pass Examples: "Import /downloads/The.Capture.S03E04.1080p.mkv", "Import that file as episode 4 of season 3 of The Capture" |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 36 tools
Most tools have clearly distinct purposes and detailed descriptions help differentiate (e.g., parse_release vs explain_search vs grab_release). However, several diagnostic tools overlap: find_stalled_downloads vs get_queue's stall detection, check_paths vs get_health, and library_report vs get_disk_space, creating some risk of misselection.
Almost all tools use snake_case with consistent verb_noun patterns (get_queue, search_episodes, add_series). Minor deviations like library_report (noun_report) and manual_import (adjective_noun) are readable but slightly break the convention.
36 tools far exceeds the typical 3-15 well-scoped range and surpasses the 25+ threshold for 'too many'. While the domain is broad, many tools could be consolidated or scoped down without losing core functionality.
The surface is extensive for diagnostics and many management tasks (queue, history, health, imports, renaming, bulk edits). But notable gaps exist: no add_movie tool despite Radarr support, and no way to delete a series/movie from the library, which can block common lifecycle operations.