Plex MCP server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLEX_URL | Yes | The URL of your Plex media server (e.g., http://127.0.0.1:32400) | |
| PLEX_TOKEN | Yes | Your Plex authentication token (X-Plex-Token) |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_result_pageA | Read more of a result that was too large to return in one piece. Any tool whose answer is too large returns its first page with a
Args:
result_id: From the |
| list_library_sectionsB | Get Library Sections (Fallback). GET /library/sections/ |
| get_library_sections_by_section_id_allB | Get items in the section. GET /library/sections/{sectionId}/all Args: section_id: The id of the section include_meta: Adds the Meta object to the response include_guids: Adds the Guid object to the response include_collections: Include collection items in results include_external_media: Include external or online media include_advanced: Include advanced settings check_files: Verify file existence include_related: Include related items include_extras: Include trailers, behind-the-scenes, etc. include_popular_leaves: Include popular episodes include_concerts: Include concert items include_on_deck: Include On Deck status include_chapters: Include chapter markers include_preferences: Include user preferences include_bandwidths: Include bandwidth info include_loudness_ramps: Include loudness ramp data include_stations: Include radio station data include_external_ids: Include external GUIDs include_reviews: Include user reviews include_credits: Include full credits include_art: Force inclusion of artwork fields include_thumb: Force inclusion of thumbnail fields include_banner: Force inclusion of banner fields include_theme: Force inclusion of theme fields include_fields: Whitelist of fields to return exclude_fields: Blacklist of fields to omit async_augment_metadata: Async metadata augmentation async_refresh_local_media_agent: Async local media agent refresh nocache: Bypass cache skip_refresh: Skip synchronous refresh exclude_elements: Comma-separated list of elements to exclude from the response filters: General filtering expression. unwatched: Filter to unwatched only (1 = true). genre: Filter by genre. studio: Filter by studio. content_rating: Filter by content rating. resolution: Filter by resolution. year: Filter by year. first_character: Filter by first character of title. |
| get_library_sections_by_section_id_unwatchedB | Get Unwatched for Section. GET /library/sections/{sectionId}/unwatched Args: section_id: The unique identifier of the library section |
| get_library_sections_by_section_id_collectionsC | Get collections in a section. GET /library/sections/{sectionId}/collections Args: section_id: Section identifier |
| get_library_collections_by_collection_id_itemsB | Get items in a collection. GET /library/collections/{collectionId}/items Args: collection_id: The collection id |
| list_hubs_searchB | Search Hub. GET /hubs/search Args: query: The query term section_id: This gives context to the search, and can result in re-ordering of search result hubs. limit: The number of items to return per hub. 3 if not specified include_collections: Include collection results in search hubs |
| get_library_metadata_by_idsA | Get a metadata item. GET /library/metadata/{ids} Args:
ids: Comma-separated list of IDs
async_check_files: Determines if file check should be performed asynchronously. An activity is created to indicate progress. Default is false.
async_refresh_local_media_agent: Determines if local media agent refresh should be performed asynchronously. An activity is created to indicate progress. Default is false.
async_refresh_analysis: Determines if analysis refresh should be performed asynchronously. An activity is created to indicate progress. Default is false.
check_files: Determines if file check should be performed synchronously. Specifying |
| get_library_metadata_by_id_childrenC | Get Metadata Children. GET /library/metadata/{id}/children Args: id: The unique identifier of the item |
| get_library_metadata_by_ids_similarB | Get similar items. GET /library/metadata/{ids}/similar Args: ids: Comma-separated list of IDs |
| list_library_recently_addedA | Get Global Recently Added. GET /library/recentlyAdded |
| list_hubs_continue_watching_itemsB | Get Continue Watching Items. GET /hubs/continueWatching/items |
| list_status_sessionsB | List Sessions. GET /status/sessions |
| list_status_sessions_history_allA | List Playback History. GET /status/sessions/history/all Args:
account_id: The account id to restrict view history
viewed_at: The time period to restrict history (typically of the form |
| list_playlistsC | List playlists. GET /playlists Args: playlist_type: Limit to a type of playlist type: Filter by playlist type. Use 42 for optimized/conversion items. |
| get_playlists_by_playlist_id_itemsA | Retrieve Playlist Contents. GET /playlists/{playlistId}/items Args: playlist_id: The ID of the playlist type: The metadata types of the item to return. Values past the first are only used in fetching items from the background processing playlist. |
| create_playlistsB | Create a Playlist. POST /playlists Args:
uri: The content URI for what we're playing (e.g. |
| update_playlists_by_playlist_id_itemsC | Adding to a Playlist. PUT /playlists/{playlistId}/items Args: playlist_id: The ID of the playlist uri: The content URI for the playlist. play_queue_id: The play queue to add to a playlist. |
| update_scrobbleB | Mark an item as played. PUT /:/scrobble Args:
identifier: The identifier of the media provider containing the media to rate. Typically |
| update_unscrobbleB | Mark an item as unplayed. PUT /:/unscrobble Args:
identifier: The identifier of the media provider containing the media to rate. Typically |
| update_rateA | Rate an item. PUT /:/rate Args:
identifier: The identifier of the media provider containing the media to rate. Typically |
| create_library_sections_by_section_id_refreshB | Refresh Section. POST /library/sections/{sectionId}/refresh Args: section_id: Section identifier force: Whether the update of metadata and items should be performed even if modification dates indicate the items have not change path: Restrict refresh to the specified path |
| list_library_sections_watchlist_allB | Get Watchlist. GET /library/sections/watchlist/all |
| create_actions_add_to_watchlistB | Add to Watchlist. POST /actions/addToWatchlist Args: uri: The URI of the item to add or remove |
| create_actions_remove_from_watchlistC | Remove from Watchlist. POST /actions/removeFromWatchlist Args: uri: The URI of the item to add or remove |
| list_identityB | Get PMS identity. GET /identity |
| find_operationA | Search all 405 Plex API operations, including those not exposed as tools. Returns each match's name, route, summary and arguments. Run one with run_operation. Args: query: Words describing what you want, such as "delete playlist item", "butler tasks" or "transcode sessions". limit: How many matches to return. |
| run_operationA | Run any Plex API operation by name, as found with find_operation. Some operations change or delete things; check Args: name: Operation name from find_operation. arguments: Its arguments as listed there, by name. |
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 28 tools
Most tools map to distinct Plex endpoints (sections, metadata, playlists, sessions, scrobble/rate). Some blurring exists: get_library_metadata_by_id_children vs get_library_metadata_by_ids, get_library_sections_by_section_id_all vs list_library_sections, and the find_operation/run_operation pair can do anything any other tool does, so overlap is inherent.
Names follow a fairly predictable verb_path snake_case pattern (list_/get_/create_/update_ + route segments). Minor deviations: singular 'by_id' vs plural 'by_ids', get vs list used for analogous reads, and awkward appends like 'children' or '_all' at the end.
28 tools is on the heavy side for curation, and because find_operation/run_operation already expose all 405 API operations, several of the explicit tools are effectively redundant duplicates of the escape hatch. The set is usable but not tightly scoped.
The surface covers library browsing, playlists, sessions/history, search, scrobble/rate, watchlist and refresh, and run_operation makes the remaining API operations reachable, so no hard dead ends. Direct CRUD is patchy, though: playlist deletion, playlist item removal, and library section mutation require going through run_operation.