Plex MCP Server (vladimir-tutin/plex-mcp-server) is an MCP server listed on the M8ven Trust Index. It scores 58 out of 100, grade D. It declares 55 tools. No publisher has claimed this listing.

D
Caution
58/100

Plex MCP Server

MCP Server for Plex to allow LLMs to converse with Plex.

Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.

How we verified

⚡ Live Monitored: not connected

Verified is a snapshot. Live keeps it current, and builds your track record.

⚡ Connect GitHub → continuous verification on every pushwhy connect →

Who stands behind it

vladimir-tutin

Source: mcp.so · also listed on Glama

Is this your MCP?

Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →

Install from

The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.

// key findings
🚨
Secret credentials may flow to a network call
1 flow detected: PLEX_TOKEN. We can’t prove the destination matches the brand the credential belongs to.
⚠️
Tool descriptions don’t match what handlers do
2 tools describe read intent but their handlers mutate — server_get_plex_logs (line 157: os.remove(logs_path_or_data)); media_get_artwork (line 813: with open(file_path, 'wb') as f:)
🔐
You'll be asked for 1 credential: PLEX_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes55 tools

These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.

server_get_plex_logs

Get Plex server logs. Args: num_lines: Number of log lines (or matches) to retrieve (default: 100) log_type: Type of log to retrieve (server, scanner, transcoder, updater) or specific filename/partial match start_line: Starting line number to retrieve (0-indexed). If None, retrieves last num_lines.

server_get_info

Get detailed information about the Plex server. Returns: Dictionary containing server details including version, platform, etc.

server_get_bandwidth

Get bandwidth statistics from the Plex server. Args: timespan: Time span for bandwidth data (months, weeks, days, hours, seconds) lan: Filter by local network (true/false) Returns: Dictionary containing bandwidth statistics

server_get_current_resources

Get resource usage information from the Plex server. Returns: Dictionary containing resource usage statistics

server_get_butler_tasks

Get information about Plex Butler tasks. Returns: Dictionary containing information about scheduled and running butler tasks

server_get_alerts

Get real-time alerts from the Plex server by listening on a websocket. Args: timeout: Number of seconds to listen for alerts (default: 15) Returns: Dictionary containing server alerts and their details

server_run_butler_task

Manually run a specific Plex Butler task now. Args: task_name: Name of the butler task to run Returns: Success or error message

server_empty_trash

Empty trash for a specific library or all libraries. This permanently deletes all items that have been marked for deletion. Args: library_name: Optional name of the library to empty trash for. If not provided, empties trash for all libraries. Returns: Success or error message

server_optimize_database

Optimize the Plex database. This runs database optimization to improve performance and reduce database size. Returns: Success or error message

server_clean_bundles

Clean unused media bundles. This removes unused media bundles (metadata, artwork) that are no longer associated with any media items. Returns: Success or error message

client_list

List all available Plex clients including idle players. Uses myPlexAccount.resources() to discover all players (both active and idle), not just those with active sessions. Args: include_details: Whether to include detailed information about each client active_only: If True, only return clients that

client_get_details

Get detailed information about a specific Plex client. Args: client_name: Name or machineIdentifier of the client to get details for Returns: Dictionary containing client details

client_get_timelines

Get the current timeline information for a specific Plex client. Args: client_name: Name or machineIdentifier of the client to get timeline for Returns: Timeline information for the client

client_start_playback

Start playback of media on a specified client. Args: media_title: Title of the media to play (optional if rating_key is provided) client_name: Optional name of the client to play on (will prompt if not provided) offset: Optional time offset in milliseconds to start from library_name: Optional name o

client_control_playback

Control playback on a specified client. Args: client_name: Name of the client to control (use machine identifier or title from client_list) action: Action to perform (play, pause, stop, skipNext, skipPrevious, stepForward, stepBack, seekTo, seekForward, seekBack, mute, unmute, setVolume) parameter:

client_navigate

Navigate a Plex client interface. Args: client_name: Name or machineIdentifier of the client to navigate action: Navigation action to perform (moveUp, moveDown, moveLeft, moveRight, select, back, home, contextMenu)

client_set_streams

Set audio, subtitle, or video streams for current playback on a client. Args: client_name: Name or machineIdentifier of the client to set streams for audio_stream_id: ID of the audio stream to switch to subtitle_stream_id: ID of the subtitle stream to switch to, use '0' to disable video_stream_id: I

collection_list

List all collections on the Plex server or in a specific library. Args: library_name: Optional name of the library to list collections from

collection_create

Create a new collection with specified items. Args: collection_title: Title for the new collection library_name: Name of the library to create the collection in item_titles: List of media titles to include in the collection (optional if item_ids is provided) item_ids: List of media IDs to include in

collection_add_to

Add items to an existing collection. Args: collection_title: Title of the collection to add to (optional if collection_id is provided) collection_id: ID of the collection to add to (optional if collection_title is provided) library_name: Name of the library containing the collection (required if usi

collection_remove_from

Remove items from a collection. Args: collection_title: Title of the collection to remove from (optional if collection_id is provided) collection_id: ID of the collection to remove from (optional if collection_title is provided) library_name: Name of the library containing the collection (required i

collection_delete

Delete a collection. Args: collection_title: Title of the collection to delete (optional if collection_id is provided) collection_id: ID of the collection to delete (optional if collection_title is provided) library_name: Name of the library containing the collection (required if using collection_ti

collection_edit

Comprehensively edit a collection's attributes. Args: collection_title: Title of the collection to edit (optional if collection_id is provided) collection_id: ID of the collection to edit (optional if collection_title is provided) library_name: Name of the library containing the collection (required

library_list

List all available libraries on the Plex server.

library_get_stats

Get statistics for a specific library. Args: library_name: Name of the library to get stats for

library_refresh

Refresh a specific library or all libraries. Args: library_name: Optional name of the library to refresh (refreshes all if None)

library_scan

Scan a specific library or part of a library. Args: library_name: Name of the library to scan path: Optional specific path to scan within the library

library_get_details

Get detailed information about a specific library, including folder paths and settings. Args: library_name: Name of the library to get details for

library_get_recently_added

Get recently added media across all libraries or in a specific library. Args: count: Number of items to return (default: 50) library_name: Optional library name to limit results to

library_get_contents

Get the filtered and paginated contents of a specific library. Args: library_name: Name of the library to get contents from unwatched: If True, only return unwatched items watched: If True, only return watched items sort: Sort order (e.g., 'addedAt:desc', 'title:asc') offset: Number of items to skip

media_search

Search for media across all libraries. Args: query: Search term to look for content_type: Optional content type to limit search to (movie, show, episode, track, album, artist or use comma-separated values for HTTP API like movies,music,tv)

media_get_details

Get detailed information about a specific media item using PlexAPI's Media and Mixin functions. Args: media_title: Title of the media to get details for (optional if media_id is provided) media_id: Plex media ID/rating key to directly fetch the item (optional if media_title is provided) library_name

media_edit_metadata

Edit metadata for a specific media item. Args: media_title: Title of the media to edit library_name: Optional library name to limit search to new_title: New title for the item new_summary: New summary/description new_rating: New rating (0-10) new_release_date: New release date (YYYY-MM-DD) new_genre

media_get_artwork

Get images for a specific media item. Args: media_title: Title of the media to get images for (optional if media_id is provided) media_id: ID of the media to get images for (optional if media_title is provided) library_name: Optional library name to limit search to when using media_title image_types

media_delete

Delete a media item from the Plex library. Args: media_title: Title of the media to delete (optional if media_id is provided) media_id: ID of the media to delete (optional if media_title is provided) library_name: Optional library name to limit search to when using media_title

media_set_artwork

Set artwork for a specific media item. Args: media_title: Title of the media to set artwork for library_name: Optional library name to limit search to art_type: Type of artwork to set (poster, background/art, logo) filepath: Path to the local image file url: URL to the image file lock: Whether to lo

media_list_available_artwork

List all available artwork for a specific media item. Args: media_title: Title of the media to list artwork for (optional if media_id is provided) media_id: ID of the media to list artwork for (optional if media_title is provided) library_name: Optional library name to limit search to when using med

playlist_list

List all playlists on the Plex server. Args: library_name: Optional library name to filter playlists from content_type: Optional content type to filter playlists (audio, video, photo)

playlist_create

Create a new playlist with specified items. Args: playlist_title: Title for the new playlist item_titles: List of media titles to include in the playlist library_name: Optional library name to limit search to summary: Optional summary description for the playlist

playlist_edit

Edit a playlist's details such as title and summary. Args: playlist_title: Title of the playlist to edit (optional if playlist_id is provided) playlist_id: ID of the playlist to edit (optional if playlist_title is provided) new_title: Optional new title for the playlist new_summary: Optional new sum

playlist_upload_poster

Upload a poster image for a playlist. Args: playlist_title: Title of the playlist to set poster for (optional if playlist_id is provided) playlist_id: ID of the playlist to set poster for (optional if playlist_title is provided) poster_url: URL to an image to use as poster poster_filepath: Local fil

playlist_copy_to_user

Copy a playlist to another user account. Args: playlist_title: Title of the playlist to copy (optional if playlist_id is provided) playlist_id: ID of the playlist to copy (optional if playlist_title is provided) username: Username of the user to copy the playlist to

playlist_add_to

Add items to a playlist. Args: playlist_title: Title of the playlist to add to (optional if playlist_id is provided) playlist_id: ID of the playlist to add to (optional if playlist_title is provided) item_titles: List of media titles to add to the playlist (optional if item_ids is provided) item_ids

playlist_remove_from

Remove items from a playlist. Args: playlist_title: Title of the playlist to remove from (optional if playlist_id is provided) playlist_id: ID of the playlist to remove from (optional if playlist_title is provided) item_titles: List of media titles to remove from the playlist

playlist_delete

Delete a playlist. Args: playlist_title: Title of the playlist to delete (optional if playlist_id is provided) playlist_id: ID of the playlist to delete (optional if playlist_title is provided)

playlist_get_contents

Get the contents of a playlist. Args: playlist_title: Title of the playlist to get contents of (optional if playlist_id is provided) playlist_id: ID of the playlist to get contents of (optional if playlist_title is provided) Returns: JSON object containing the playlist contents

sessions_get_active

Get information about current playback sessions, including IP addresses. Args: unused: Unused parameter to satisfy the function signature

sessions_get_media_playback_history

Get playback history for a specific media item. Args: media_title: Title of the media to get history for (optional if media_id is provided) library_name: Optional library name to limit search to media_id: Plex media ID/rating key to directly fetch the item (optional if media_title is provided)

user_search_users

Search for users with names, usernames, or emails containing the search term, or list all users if no search term is provided. Args: search_term: Optional term to search for in user information

user_list_all_users

List all users (owner, home users, and shared users) with their IDs and types. This is useful for getting the correct user IDs to filter watch history, especially for home users.

user_get_info

Get detailed information about a specific Plex user. Args: username: Optional. Name of the user to get information for. Defaults to the authenticated owner.

user_get_on_deck

Get on deck (in progress) media for a specific user. Args: username: Name of the user to get on-deck items for

user_get_continue_watching

Get items the user has partially watched and can continue. Unlike on_deck which shows the next unwatched episode in a series, continue_watching shows items that were started but not finished. Args: limit: Maximum number of items to return (default 10) Returns: List of partially-watched items with pr

user_get_watch_history

Get recent watch history for a specific user. Args: username: Name of the user to get watch history for (ignored if user_id is provided) limit: Maximum number of recently watched items to show content_type: Optional filter for content type (movie, show, episode, etc) user_id: Optional user ID to fil

user_get_statistics

Get statistics about user watch activity over different time periods. Args: time_period: Time period for statistics - options: "last_24_hours", "last_7_days", "last_30_days", "last_90_days", "last_year", "all_time" username: Optional. Filter statistics for a specific user. If not provided, returns s

// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
configPLEX_URL
🔐 secretPLEX_TOKEN
configMCP_OAUTH_ENABLED1. Set =true in your environment.
configMCP_OAUTH_ISSUER2. Configure (e.g., your OAuth provider URL).
configMCP_SERVER_URL3. Set to your public-facing URL.
configMCP_OAUTH_JWKS_CACHE_TTL
// quality suggestions

Tool annotations

No tools have read-only/destructive annotations

Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.

All four hints declared on every tool

55/55 tools missing one or more hints — server_get_plex_logs (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); server_get_info (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); server_get_bandwidth (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +52 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.

For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.

Destructive tools are labelled

1 tool perform destructive updates without destructiveHint — server_get_plex_logs deletes at line 157 (os.remove(logs_path_or_data))

Add destructiveHint:true to any tool whose handler calls .delete(), .upsert(), .update(), unlink, rm, DELETE, DROP, REPLACE INTO, or any operation that overwrites existing data.

Descriptions match behaviour

2 tools describe read intent but their handlers mutate — server_get_plex_logs (line 157: os.remove(logs_path_or_data)); media_get_artwork (line 813: with open(file_path, 'wb') as f:)

Rename the tool, rewrite the description, or move the side-effect into a separate clearly-named tool.

License file

No license file

Add a LICENSE file (MIT, Apache-2.0, etc.).

Tests exist

No test files found

Add tests that exercise each declared tool.

Tool description accuracy

server_get_plex_logs: description implies read-only but handler writes/deletes/executes; media_get_artwork: description implies read-only but handler writes/deletes/executes

Update tool descriptions to accurately reflect all capabilities — especially write, delete, or execute operations.

Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 7 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/vladimir-tutin/plex-mcp-server?variant=verified)](https://m8ven.ai/mcp/vladimir-tutin/plex-mcp-server)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: 0723c720498c4ab1eaf3a22ffc7b5a451985f0c0
code hash: 9169ae0c2404e72f7ffa0aa5806646dd7ce7ec8647a655cdee19ad95134db771
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.

https://m8ven.ai/api/mcp/tool-check
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client