MCP server for interacting with a Plex media server. Provides tools to search for movies, retrieve movie details, manage playlists, and obtain recent movies and movie genres.
Plex MCP has complete input schemas with proper types and descriptions for all 10 tools, which is a strong foundation. Tool names follow verb_noun convention (search_movies, get_movie_details, list_playlists, etc.). However, tool descriptions are inconsistent in depth and actionability. search_movies has a detailed 200+ char description with parameter explanations, but get_plex_server's description is vague ('Asynchronously get a PlexServer instance via the singleton PlexClient'). Most critically, output schemas are NOT documented, the rubric requires documentation of what fields are returned so LLMs can plan downstream calls. Error handling is minimal; tools do not guide recovery (e.g., 'no movies found' returns a string but does not suggest alternative searches). Parameter descriptions are present but some lack constraints (e.g., 'limit' has no min/max bounds). The server lacks tool annotations (readOnlyHint, destructiveHint) despite having clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Composition is good, tools are single-purpose and chainable (search_movies → get_movie_details → add_to_playlist).
Add a movie to an existing playlist on your Plex server.
Create a new playlist on your Plex server with the specified title.
Delete a playlist from your Plex server by its playlist key.
Retrieve detailed information about a specific movie from your Plex library by its rating key.
Retrieve all available movie genres from your Plex library.
Retrieve all items in a specific playlist by its playlist key.
Output schemas not documented. Tools return formatted strings or objects, but LLMs cannot see field structure to plan downstream calls. E.g., search_movies returns 'formatted string of up to 5 matching movies', what fields does each movie object contain? Does it include rating_key for chaining to get_movie_details?
Tool annotations missing. Despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE), tools lack readOnlyHint, destructiveHint, and idempotentHint annotations in the MCP schema. This prevents clients from warning users before destructive operations like delete_playlist.
Error handling lacks recovery guidance. Tools return generic error messages (e.g., 'search fails or no movies are found') without suggesting next steps. Per pattern:recovery-guide, errors should tell LLMs what to do: 'No movies found. Try broadening filters (remove year/director) or call get_movie_genres() to see available genres.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | <=2025-11-25 | v2 |
Asynchronously get a PlexServer instance via the singleton PlexClient. Returns: A PlexServer instance. Raises: Exception: When the Plex server connection fails.
List all playlists available on your Plex server.
Retrieve a list of recently added movies from your Plex library.
Search for movies in your Plex library using optional filters. Parameters: title: Optional title or substring to match. year: Optional release year to filter by. director: Optional director name to filter by. studio: Optional studio name to filter by. genre: Optional genre tag to filter by. actor: Optional actor name to filter by. rating: Optional rating (e.g., "PG-13") to filter by. country: Optional country of origin to filter by. language: Optional audio or subtitle language to filter by. watched: Optional boolean; True returns only watched movies, False only unwatched. min_duration: Optional minimum duration in minutes. max_duration: Optional maximum duration in minutes. Returns: A formatted string of up to 5 matching movies (with a count of any additional results), or an error message if the search fails or no movies are found.
Parameter constraints incomplete. 'limit' parameter in search_movies and recent_movies lacks min/max bounds. Unbounded integers let LLMs pass absurd values (limit=999999) that break APIs or cause timeouts. Should specify: 'limit: integer, 1 - 100, default 5'.
Vague tool descriptions. get_plex_server ('Asynchronously get a PlexServer instance via the singleton PlexClient') is implementation-focused, not user-intent-focused. LLMs cannot determine when to call it vs other tools. Should explain: 'Internal tool. Validates Plex server connection. Called automatically by other tools; rarely invoked directly.'