Intelligent MCP server for Plex and the complete *arr media automation suite (Sonarr, Radarr, Prowlarr, Bazarr, Overseerr)
The server defines 19 tools with explicit schemas and descriptions visible in server.py. Most tools follow verb_noun naming (arr_execute, arr_list_services, sonarr_search_series, etc.). However, critical quality gaps significantly limit production readiness: (1) Parameter descriptions are minimal or missing for most tools, e.g., sonarr_add_series accepts quality_profile_id and root_folder_path with only 1-2 word descriptions, no guidance on valid ranges or format; (2) Output schemas are completely undocumented, tool responses are never shown, forcing LLMs to infer result structure; (3) Error handling is absent from tool definitions, no guidance on what errors to expect, whether retryable, or how to recover; (4) Many parameters lack type constraints, quality_profile_id and series_id are integers but no min/max bounds; (5) Generic descriptions fail to convey prerequisites or dependencies, arr_execute's description lists examples but doesn't explain routing logic, failure modes, or when to use arr_explain_intent instead. The high-level intent router pattern (arr_execute + arr_explain_intent) is novel but reduces clarity for agents unfamiliar with natural-language routing. Per-tool analysis follows.
Execute arr suite operations using natural language. Intelligently routes to the correct service (Sonarr, Radarr, Prowlarr, Bazarr, or Overseerr) based on your request. Examples: 'add Breaking Bad', 'search for The Matrix', 'download English subtitles for Dune', 'list all indexers', 'request Inception'
Explain how a natural language query would be interpreted and routed to arr services. Useful for understanding what the system will do before executing.
Get system status for all configured arr services
List all configured and available arr services
Download a subtitle in Bazarr
Search for subtitles in Bazarr
Output schemas completely undocumented. No tool specifies the structure of returned results (field names, types, nested objects). LLMs cannot infer what fields to extract from responses or chain tools effectively.
Parameter descriptions are too terse. For example, quality_profile_id and root_folder_path in sonarr_add_series have 1-2 word descriptions with no guidance on valid formats, ranges, or how to obtain these IDs. Similar issues across all service-specific tools.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | D | 50 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 19 | - | v1 |
Request media in Overseerr
Search for media in Overseerr
Get all libraries from Plex
Get recently added items in Plex
Search the Plex library
Get all indexers or a specific indexer from Prowlarr
Search for indexers in Prowlarr
Add a new movie to Radarr
Get all movies or a specific movie from Radarr
Search for movies in Radarr
Add a new TV series to Sonarr
Get all series or a specific series from Sonarr
Search for TV series in Sonarr
No error handling guidance. Tools define no error scenarios, recovery hints, or error categorization (retryable vs. user-fixable vs. fatal). Agents cannot intelligently handle failures.
Numeric parameters lack constraints. quality_profile_id, media_id, limit, and season numbers are integers with no min/max bounds or example values documented. LLMs may pass invalid values without constraint feedback.
No pagination guidance for result-returning tools. sonarr_get_series, radarr_get_movies, prowlarr_get_indexers, and plex_search_library do not document page/limit/offset parameters or result count limits. Large result sets risk context window exhaustion.
Natural-language routing via arr_execute obscures tool semantics. The tool accepts freeform queries and intelligently routes to the correct service, but tool descriptions do not explain how this routing works, what queries are supported, or when to use arr_explain_intent vs direct service tools.
Parameter name ambiguity in sonarr_get_series and radarr_get_movies. The optional series_id/movie_id parameters suggest 'omit to get all', but this is not explicitly documented. Agents may not realize they can call without an ID.
overseerr_request_media 'seasons' parameter is poorly documented. Array of season numbers is vague, does it mean S01E01 format, season indices (1, 2, 3), or season ranges? No examples or format specification.