MCP server for Plex Media Server: every documented API endpoint as a tool, plus curated library, session, analytics and playback tools.
Four tools with complete schemas and strong descriptions. All tools are read-only with clear, detailed docstrings (194 - 250 chars) explaining what they do, when to use them, and what they return. Schemas are well-formed with proper types and constraints. Tool names follow verb_noun pattern (plex_server_*). No parameters lack descriptions. However, no output schemas are documented, LLMs cannot see what fields to expect in responses. Error handling is absent, no guidance on what to do if a call fails. Tool composition is weak: all four are server-level diagnostics with no chaining support.
Bandwidth used by the server from `GET /statistics/bandwidth`, as Plex's dashboard reports it: `series` with one entry per bin (`at` as ISO, `bytes`, `lan`, `accountID`, `deviceID`) plus `totals` for LAN, WAN and all traffic in bytes. Required reading: `timespan` selects the bin size (see the tool's schema). Optional reading: the newest bins are kept when the series is longer than `PLEX_MAX_ITEMS`.
Identify the server by merging `GET /` (name, platform, version, `updatedAt`) with `GET /identity` (`machineIdentifier`, `claimed`). Returns `name`, `version`, `machineIdentifier`, `platform`, `platformVersion`, `claimed` and `updatedAt` as an ISO timestamp. Takes no arguments — use it to confirm which server the token is talking to.
Return the download URL of the server log bundle instead of its megabytes of binary: `GET /diagnostics/logs` answers with a zip archive, so this tool returns `{url, contentType, note}` for the caller to fetch out of band. The URL embeds the server token and is a secret. Takes no arguments.
Host and process load from `GET /statistics/resources`: `latest` is the newest sample (`at` as ISO, `hostCpuUtilization`, `hostMemoryUtilization`, `processCpuUtilization`, `processMemoryUtilization`, all percentages) and `series` the samples leading up to it. Optional `timespan` selects the bin size (default 6 = seconds), as Plex's own dashboard uses.
No output schemas documented. LLMs cannot see what fields to expect in responses (e.g., plex_server_info returns name, version, machineIdentifier, etc., but this is only in the description text, not in a structured schema). This forces LLMs to parse unstructured output and risks hallucination.
No error handling guidance. If a tool fails (e.g., invalid timespan, network error, auth failure), there is no recovery hint. LLMs receive raw errors with no actionable next step.
Tool composition is weak. All four tools are server-level diagnostics with no chaining support. No tool returns IDs or references that downstream tools accept. This limits agent ability to compose multi-step workflows.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | <=2025-11-25 | v2 |
plex_server_bandwidth and plex_server_resources accept 'timespan' with both integer (1 - 6) and string enum ('1d', '7d') in a oneOf union. This is valid JSON Schema but confusing for LLMs, the description should clarify which form is preferred and provide examples.
Tool descriptions mention result limits (e.g., 'newest bins are kept when series is longer than PLEX_MAX_ITEMS') but PLEX_MAX_ITEMS is not defined in the visible code. LLMs cannot reason about pagination without knowing the actual limit.