Skip to main content
Glama

plex-director-mcp

CI/CD CodeQL OpenSSF Scorecard Docker Pulls Docker Version Image Size Node License

Plex Director is a self-hosted assistant for a Plex + Servarr media stack. It connects to Plex, Radarr, Sonarr, Prowlarr, SABnzbd, qBittorrent, Tautulli and TMDb (and, optionally, your Linux hosts over SSH), and gives you two ways to work with them:

  • An MCP server for Claude Desktop — ask Claude to find what you own, work out why a movie is missing, add movies, check your indexers and download queues, or run batch jobs.

  • A web dashboard — a browser UI with a chat box ("Which of Harrison Ford's movies do I have in 4K?"), server status, host utilization, download queues, indexer health, and background jobs.

It is built for a home-run setup: run it on your LAN, next to the apps it talks to.

Contents

Related MCP server: Plex-MCP

What it can do

  • Find what you own. Search your Plex library, movies and TV shows, by genre, actor, title, year and library (for example just the 4K libraries) across every library at once. A title held in both HD and 4K is one result with both libraries shown, and shows come with their season and episode counts and how much you have watched. You can leave a library such as Sports out of searches unless you name it.

  • Owned versus missing. Look up an actor's TMDb filmography and see which of those movies are in Plex and which are not, optionally narrowed by year range, or by "in 4K".

  • Diagnose and add movies. Trace a movie through Radarr metadata, history and the download queues to see why it is missing, or search TMDb, pick from a grid, and add the choices to Radarr with a download search.

  • Watch your downloads and indexers. See SABnzbd and qBittorrent queues, clean up stalled torrents, and check every Prowlarr indexer's health (including ones that are backing off).

  • Run batch jobs safely. Plan a movie-upgrade batch and let a rate-limited runner search one movie a minute, with pause, resume, cancel, and automatic pausing if Radarr stops responding.

  • Keep an eye on your hosts. CPU, memory, disk, uptime and Docker container health for your Linux hosts over SSH, plus Radarr, Sonarr and Prowlarr built-in backups on demand. Each host's SSH key is remembered the first time it connects, and a changed key is refused until you approve it.

  • Understand usage. Live Plex streams and watch statistics through Tautulli.

  • Stay informed. Optional Discord notifications when a batch job finishes or is paused.

Quick start

The fastest way to try it is Docker Compose:

---
services:
  plex-director:
    image: honeybeartech/plex-director-mcp:latest
    container_name: plex-director
    environment:
      - WEB_PASSWORD=choose-a-password
    volumes:
      - ./data:/app/data
    ports:
      - 3000:3000
    restart: unless-stopped
docker compose up -d

Then open http://localhost:3000, sign in, and fill in your services on the Settings page (Radarr, Sonarr, Prowlarr, SABnzbd, qBittorrent, Tautulli, Plex, TMDb). The full guide, with every option, is in Docker below. To use it from Claude Desktop instead, see Claude Desktop via Docker.

Docker

Images are published to both registries, and both are signed (see CI/CD):

Registry

Image

Docker Hub

honeybeartech/plex-director-mcp

GitHub Container Registry

ghcr.io/honeybeartech/plex-director-mcp

Everything below works with either; the examples use Docker Hub.

Supported architectures

Multi-arch manifests are published, so pulling the image gets the right one for your machine automatically.

Architecture

Available

x86-64 (linux/amd64)

arm64 (linux/arm64)

Image tags

Tag

Description

latest

The most recent build of the main branch. Includes changes that have not been given a version number yet.

1.1.0

A specific release. Pin one of these if you want to choose when to upgrade.

1.1

The newest patch release of a minor version.

sha-<commit>

The build of one specific commit, for pinning or bisecting.

Release notes for the numbered versions are on the Releases page.

Application setup

  1. Start the container with one of the usage examples and open the web UI at http://<host>:3000.

  2. Set a password. Add WEB_PASSWORD to the container's environment. Without it, the dashboard is open to anyone who can reach the port, including the Settings page, and shows a warning banner. See Security.

  3. Add your services. Open Settings and fill in each tab. Every field can also be given as an environment variable (see the reference), which is handy for automated setups. You only need the services you actually use.

  4. Give the chat box a brain. The Query page uses Claude to answer questions, so it needs ANTHROPIC_API_KEY in the container's environment. This is a pay-per-use Anthropic API key, separate from a Claude subscription. The rest of the dashboard works without it.

  5. Keep the data volume. Your settings, job history and the secret that keeps you signed in live in a SQLite database at /app/data. Mount a volume there or you will lose them each time the container is recreated.

Where to find each credential:

Service

What to enter

Radarr, Sonarr, Prowlarr

The URL, and the API key from Settings → General.

SABnzbd

The URL, and the API key from Config → General.

qBittorrent

The Web UI URL, username and password.

Tautulli

The URL (without /api/v2) and the API key from Settings → Web Interface.

Plex

The server URL (e.g. http://192.168.1.10:32400) and an X-Plex-Token: open any movie in Plex Web, choose ⋯ → Get Info → View XML, and copy the X-Plex-Token= value from the address bar. Treat it like a password.

TMDb

Your API Read Access Token (the long one, from your TMDb account's API settings), not the short v3 API key.

Networking: inside the container, localhost is the container itself, not your server. Use the LAN address of each service (for example http://192.168.1.10:7878), or, if the other apps are in the same Compose project or Docker network, their service names (http://radarr:7878).

Usage

Here are some example snippets to help you get started creating a container. Docker Compose is recommended.

---
services:
  plex-director:
    image: honeybeartech/plex-director-mcp:latest
    container_name: plex-director
    environment:
      - WEB_PASSWORD=choose-a-password
      - ANTHROPIC_API_KEY=sk-ant-your-key #optional, needed for the Query chat
      - RADARR_URL=http://192.168.1.10:7878 #optional, or set on the Settings page
      - RADARR_API_KEY=your_radarr_api_key #optional
      - PLEX_URL=http://192.168.1.10:32400 #optional
      - PLEX_TOKEN=your_plex_token #optional
      - TMDB_API_KEY=your_tmdb_read_access_token #optional
      - DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/... #optional
    volumes:
      - /path/to/plex-director/data:/app/data
      - /path/to/ssh/id_ed25519:/ssh/id_ed25519:ro #optional, for host monitoring over SSH
    ports:
      - 3000:3000
    restart: unless-stopped

The image has a built-in health check (docker ps shows healthy once it is up), so you don't need to add one.

To keep your credentials out of the compose file, put them in a .env-style file next to it and reference it instead of listing them:

    env_file:
      - plex-director.env

Then start it:

docker compose up -d

Docker CLI

docker run -d \
  --name=plex-director \
  -e WEB_PASSWORD=choose-a-password \
  -e ANTHROPIC_API_KEY=sk-ant-your-key \
  -p 3000:3000 \
  -v /path/to/plex-director/data:/app/data \
  --restart unless-stopped \
  honeybeartech/plex-director-mcp:latest

Add any other variables from the reference with more -e flags, or put them in a file and pass --env-file plex-director.env. For SSH host monitoring, also add -v /path/to/ssh/id_ed25519:/ssh/id_ed25519:ro.

--env-file is not the same as a .env file for Node. Docker reads values literally: don't put quotes around values, and don't put a comment after a value on the same line (KEY=abc # my key becomes the value abc # my key). Put comments on their own line.

Claude Desktop via Docker

The same image is also the MCP server, which speaks over stdio. Tell Claude Desktop to run it with docker run -i in its config (Settings → Developer → Edit Config, claude_desktop_config.json):

{
  "mcpServers": {
    "plex-director": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "--env-file", "/absolute/path/to/plex-director.env",
        "-v", "plex-director-data:/app/data",
        "honeybeartech/plex-director-mcp:latest"
      ]
    }
  }
}

Restart Claude Desktop and the plex-director server appears as a tool provider (17 tools, listed below). Notes:

  • -i is required, since MCP talks over stdin/stdout. Don't add -t.

  • No -p is needed. The web dashboard also starts inside this container, but you only need to publish its port if you want to open it from this container instead of from the Compose one.

  • If you also run the long-lived container above, give both the same data volume (or bind mount) so they share settings and job history.

  • The container keeps running if Claude closes its stdin; quitting Claude Desktop stops it, or use docker stop.

Parameters

Container images are configured using parameters passed at runtime. These parameters are separated by a colon and indicate <external>:<internal> respectively. For example, -p 8080:3000 would expose port 3000 from inside the container to be accessible from the host's IP on port 8080 outside the container.

Parameter

Function

-p 3000:3000

The web dashboard. Change the left number to use a different port on your host.

-e WEB_PASSWORD=

Password for the web dashboard. Strongly recommended.

-e ANTHROPIC_API_KEY=

Enables the Query chat.

-e RADARR_URL= etc.

Service connection details; see the reference. Optional, since they can be entered on the Settings page.

-v /app/data

The SQLite database: your saved settings, job history and login-session secret. Mount a volume here.

-v /ssh/id_ed25519:ro

Optional. A private SSH key for host monitoring (with -e SSH_KEY_PATH=/ssh/id_ed25519).

Environment variable reference

Nothing is required to start the container: it boots with no configuration and lets you fill things in on the Settings page.

Service connections. On first start these are copied into the database, and from then on the value saved in the database wins (that is what the Settings page edits). If you change one of these variables later and nothing happens, that is why; change it on the Settings page, or delete the database.

Variable

Description

RADARR_URL, RADARR_API_KEY

Radarr. Used for movie status, diagnosis, adding movies, and batch jobs.

RADARR_DEFAULT_QUALITY_PROFILE

Optional. The name of the quality profile new movies get when you add them. Leave it blank to use Radarr's first profile. Also on the Radarr tab of the Settings page.

SONARR_URL, SONARR_API_KEY

Sonarr. Optional; used for backups.

PROWLARR_URL, PROWLARR_API_KEY

Prowlarr, for indexer health and backups.

SABNZBD_URL, SABNZBD_API_KEY

SABnzbd, for the queue and for diagnosing missing media.

QBITTORRENT_URL, QBITTORRENT_USER, QBITTORRENT_PASS

qBittorrent Web UI.

TAUTULLI_URL, TAUTULLI_API_KEY

Tautulli, for streams and watch statistics.

PLEX_URL, PLEX_TOKEN

Plex, for searching what you own.

PLEX_SKIP_LIBRARIES

Optional. Comma-separated Plex library names to leave out of searches (whole names, any case), e.g. Sports. A library you name in a question, such as "in Sports", is still searched. Blank searches every library. Also on the Plex tab of the Settings page.

TMDB_API_KEY

TMDb API Read Access Token, for actor filmographies and the movie-choice grid.

UBUNTU_HOSTS

Comma-separated hosts to monitor over SSH, e.g. 192.168.1.10,192.168.1.11. Add :port for a non-standard SSH port (192.168.1.10:2222).

SSH_USER

The SSH user for those hosts.

Container settings. These are read from the environment every time and are never stored in the database or shown on the Settings page.

Variable

Default

Description

WEB_PASSWORD

(none)

Requires a login for the dashboard. Changing it signs everyone out.

WEB_PORT

3000

The port the dashboard listens on inside the container.

ANTHROPIC_API_KEY

(none)

Anthropic API key for the Query chat.

SSH_KEY_PATH

(none)

Path (inside the container) to the private key for host monitoring. It must be readable by the container's user.

SSH_KEY_PASSPHRASE

(none)

The passphrase, if that private key is passphrase-protected.

DISCORD_WEBHOOK_URL

(none)

Discord webhook for job-completed and job-paused notifications.

JOB_RUNNER_INTERVAL_SECONDS

60

How often the job runner advances a started job by one movie (minimum 10; 0 turns the runner off).

Read-only and non-root operation

By default the container runs as root, which lets it write to whatever you mount at /app/data. The image itself has no shell or package manager. If you would rather it didn't run as root, or want a read-only filesystem, both work; the data directory is the only place it writes, so it just has to be writable by the user you choose.

services:
  plex-director:
    image: honeybeartech/plex-director-mcp:latest
    user: "1000:1000"
    read_only: true
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    volumes:
      - /path/to/plex-director/data:/app/data
    ports:
      - 3000:3000

Or with the CLI: --user 1000:1000 --read-only --cap-drop ALL --security-opt no-new-privileges:true.

Make sure the data directory is writable by that user first, for example chown -R 1000:1000 /path/to/plex-director/data (a Docker-created named volume is owned by root). If it is not, the container exits at startup with SqliteError: unable to open database file. If you use SSH host monitoring, the mounted key must also be readable by that user.

Updating

Your settings and job history live in the data volume, so updating just replaces the container.

Docker Compose

docker compose pull plex-director
docker compose up -d
docker image prune

Docker CLI

docker pull honeybeartech/plex-director-mcp:latest
docker stop plex-director
docker rm plex-director
# ...then run the same `docker run` command as before
docker image prune

Verify a download. Every published image is signed with cosign using GitHub's OIDC identity (no keys to manage):

cosign verify \
  --certificate-identity-regexp "https://github.com/HoneyBearTech/plex-director-mcp/.*" \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  honeybeartech/plex-director-mcp:latest

Building locally

git clone https://github.com/HoneyBearTech/plex-director-mcp.git
cd plex-director-mcp
docker build -t plex-director-mcp .

.dockerignore keeps .env, the local database and other secrets out of the build context. Never bake secrets into an image; pass them at run time.

Run without Docker (Claude Desktop)

Requires Node.js 24.

git clone https://github.com/HoneyBearTech/plex-director-mcp.git
cd plex-director-mcp
npm install

Create a .env file in the repo root with the services you use (all optional; you can also enter service details later on the Settings page):

RADARR_URL=http://radarr:7878
RADARR_API_KEY=your_radarr_api_key
RADARR_DEFAULT_QUALITY_PROFILE=Your Profile Name
SONARR_URL=http://sonarr:8989
SONARR_API_KEY=your_sonarr_api_key
PROWLARR_URL=http://prowlarr:9696
PROWLARR_API_KEY=your_prowlarr_api_key
SABNZBD_URL=http://sabnzbd:8080
SABNZBD_API_KEY=your_sabnzbd_api_key
QBITTORRENT_URL=http://qbittorrent:8080
QBITTORRENT_USER=your_qbittorrent_user
QBITTORRENT_PASS=your_qbittorrent_password
TAUTULLI_URL=http://tautulli:8181
TAUTULLI_API_KEY=your_tautulli_api_key
PLEX_URL=http://plex:32400
PLEX_TOKEN=your_plex_token
TMDB_API_KEY=your_tmdb_read_access_token
ANTHROPIC_API_KEY=your_anthropic_api_key
UBUNTU_HOSTS=192.168.1.10,192.168.1.11
SSH_USER=your_ssh_username
SSH_KEY_PATH=/path/to/id_ed25519
SSH_KEY_PASSPHRASE=only_if_the_key_has_one
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
WEB_PORT=3000
WEB_PASSWORD=choose-a-password

See the reference for what each one does. Two things that commonly go wrong:

  • Comments go on their own line, never after a value (KEY=abc # note makes the note part of the value in some tools).

  • A path with a space needs quotes around the whole value: SSH_KEY_PATH="/Users/me/.ssh/my key", not /Users/me/.ssh/'my key'.

Add the server to Claude Desktop (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "plex-director": {
      "command": "npx",
      "args": ["-y", "tsx", "/absolute/path/to/plex-director-mcp/src/index.ts"],
      "env": { "NODE_ENV": "production" }
    }
  }
}

Replace the path with the real one and restart Claude Desktop. The server starts the web dashboard on WEB_PORT in the same process.

Web dashboard

The dashboard runs on WEB_PORT (default 3000) in the same process as the MCP server.

Page

What it shows

Query

A chat box that answers questions about your library using Claude and your services. Search results appear as a table with posters (shows add seasons, episodes and watch progress), showing the first 50 with a button to expand. Follow-up questions keep the context; New chat starts over. Needs ANTHROPIC_API_KEY.

Server Status

Live Plex streams and watch statistics (from Tautulli).

Node Utilization

CPU, memory, disk, uptime and container health for each SSH host. A host that is unreachable shows why; a host whose SSH key changed is flagged with a Trust new key button (see Security).

Queues

The SABnzbd and qBittorrent download queues.

Indexers

Every Prowlarr indexer with its status (healthy, recent failures, backing off, disabled) and Prowlarr's own health warnings.

Jobs

Batch jobs and their progress. Read-only: start, pause and cancel jobs from Claude.

Settings

Connection details for every service. Secrets are never sent back to the browser, only whether they are set.

Set WEB_PASSWORD to require a login: a sign-in page, then a signed 7-day session cookie (marked Secure automatically when served over HTTPS). Failed logins are rate-limited. Logging out only clears your browser's copy, so to revoke every session, change the password.

The health check is GET /healthz, which returns {"ok":true} and needs no login. The Docker image runs it for you every 30 seconds using Node itself (the image has no curl), on whatever WEB_PORT is set to.

MCP tools

Seventeen tools are available to Claude Desktop. The four marked ★ are also what the dashboard's Query chat uses.

Your library

Tool

What it does

search_plex_library

Searches the movies and TV shows in your Plex library by genre, actor, title, year and/or library (e.g. 4k), across all libraries, or only movies or only shows. Shows report seasons, episodes and watch progress. Paged for large results.

resolve_actor_filmography

An actor's TMDb filmography with each movie marked as in Plex or not, filterable by year range, owned/missing, and library.

check_movie_status

Whether a movie is in Radarr, and its monitoring status, with artwork.

diagnose_missing_media

Traces a movie through Radarr metadata, history and the download queues to find why it is missing.

search_and_select_movies

Searches TMDb and shows a numbered grid of matches.

confirm_selected_choices

Adds the chosen numbers from that grid to Radarr as monitored movies and starts a download search. Already-present movies are reported, not added twice. Uses the quality profile you name, otherwise the default set on the Radarr tab of the Settings page, otherwise Radarr's first profile; and Radarr's first root folder unless you name another.

Downloads and indexers

Tool

What it does

manage_stalled_downloads

AUDIT lists stalled or slow qBittorrent downloads; PURGE_STALLED deletes them and their files.

check_indexer_health

Reports failing, backing-off and disabled Prowlarr indexers, and Prowlarr's own warnings.

Background jobs

Tool

What it does

plan_media_upgrade

Finds movies without a file or below 1080p and schedules them as a batch job (movies only, up to 25 at a time by default).

get_background_jobs

Lists jobs and their progress.

update_job_status

PAUSE, RESUME or CANCEL a job. Resuming a job is what starts it.

execute_next_job_step

Searches the next movie in a job by hand. Started jobs are also advanced automatically, one movie a minute, by the job runner.

Infrastructure and analytics

Tool

What it does

get_cluster_infrastructure_health

CPU, memory and Docker container health for each SSH host.

get_cluster_hardware_analytics

CPU and memory per host as a table.

run_cluster_backup

Asks Radarr, Sonarr and Prowlarr (whichever are configured) to run their built-in database backups, waits for each (up to about a minute; a slower one is reported as still running), and confirms a new backup file appeared, with its name, size and time. The backups stay in each app's own backup folder; nothing is copied.

get_plex_activity

Live playback streams and transcoding load, via Tautulli.

get_library_analytics

Most-watched titles, top users, platforms and libraries, via Tautulli.

How batch jobs work. plan_media_upgrade creates a job in the PENDING state; nothing runs until you RESUME it. A started job is then advanced by the job runner, one Radarr search per interval (default 60 seconds), so a large batch cannot flood your indexers. A paused, cancelled or pending job is never touched, and a job that fails three times in a row (for example because Radarr is down) is paused and reported to Discord.

Security

  • Run it on a trusted network. It is designed for a home LAN and is not designed or tested to be exposed to the public internet. If you do reach it from outside, put it behind HTTPS and a reverse proxy you trust. See SECURITY.md to report a vulnerability.

  • Set WEB_PASSWORD. Without it, anyone who can reach the port can use the dashboard and change its settings.

  • Secrets stay on the server. The Settings page never returns a saved key or token, and Plex artwork is fetched through a server-side proxy so the Plex token never reaches your browser.

  • SSH host monitoring uses key authentication, and remembers each host's key on first use. The first time a host connects, its key fingerprint is saved; from then on a different key is refused before any command is sent, and the Node Utilization page shows the host as offline with a Trust new key button for when you have legitimately rebuilt it. That protects against a host being swapped for an impostor after first contact, so if you want certainty about the first connection, compare the fingerprint with ssh-keyscan -t ed25519 <host> | ssh-keygen -lf -. Use a dedicated, unprivileged user, and keep it on a network you trust.

  • Some tools change things. confirm_selected_choices adds movies and starts downloads, manage_stalled_downloads with PURGE_STALLED deletes torrents and their files, and the job runner triggers searches. Claude Desktop asks for your permission before it uses a tool, so review what it proposes.

  • The image runs as root by default; see read-only and non-root operation to lock it down.

Development

npm install
npm start           # MCP server (stdio) + dashboard on WEB_PORT
npm test            # the test suite
npx tsc --noEmit    # typecheck the backend and the tests

The dashboard is a separate npm project in web/ (React, Vite and TypeScript, with its own package.json):

cd web
npm install
npm run dev         # dev server on :5173, proxies /api to the backend on :3000
npx tsc --noEmit
npm run build       # static assets the backend serves; the Dockerfile does this for you

Tests use Node's built-in test runner, so there is nothing extra to install. They run against a throwaway database, never read your real .env, have your service credentials removed from the environment, and fail every HTTP request unless a test installs a fake, so running them can't touch your real services. test/isolation.test.ts fails the run if any of that ever breaks.

Runtime notes

  • State (settings, job history, the login secret) is a SQLite database at data/plex_director.db, or /app/data in the container.

  • Uses the official MCP SDK.

  • The Query chat calls the Anthropic API with the tools above; nothing else leaves your network except calls to TMDb and, if you set it, Discord.

CI/CD

.github/workflows/ci.yml has three jobs:

  • Typecheck & audit (check) runs on every push and pull request against main: the TypeScript typecheck, the test suite, npm audit --audit-level=high, and the same typecheck and audit for the dashboard in web/.

  • Build, smoke test, and publish (publish) runs on every push to main, every v*.*.* tag push and every pull request, once check passes. Every run builds the image and boots it with dummy configuration to confirm it starts. Pushes then publish to both registries (branch pushes tag latest and the commit SHA; tag pushes also get the version, e.g. 1.2.3 and 1.2), run a Docker Scout vulnerability scan (reported in the job summary, non-blocking for now), and sign both images with cosign.

  • Create GitHub Release (release) runs only on v*.*.* tag pushes, after publish succeeds, and creates a release with generated notes.

Alongside it: CodeQL analyses the TypeScript on every push and pull request and weekly, OpenSSF Scorecard scores the repo's supply-chain practices weekly (see the badge above), and Dependabot opens weekly PRs for npm, Docker base image and GitHub Actions updates, which auto-merge once CI passes unless they are a major version bump.

License

MIT

Available Tools

17 tools
check_indexer_healthA

Audits all Usenet indexers and torrent trackers configured in Prowlarr to flag connection failures or bans, and reports Prowlarr's own system health warnings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It transparently states the actions: audits, flags failures/bans, and reports system health warnings. This conveys a read-only monitoring operation and makes side effects (or lack thereof) reasonably clear. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence that leads with the action verb 'Audits' and packs all relevant details without redundancy. Every word earns its place; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter tool with no output schema, the description fully covers what the tool does and what it reports. An agent has everything needed to invoke and interpret the result. No gaps that would hinder correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty (100% coverage). The description adds meaning by explaining the tool's purpose, but since there are no parameters to document, the baseline of 4 applies. Nothing more is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Audits'), a specific resource ('Usenet indexers and torrent trackers configured in Prowlarr'), and a precise outcome (flag connection failures/bans, report health warnings). This clearly distinguishes it from siblings like get_cluster_infrastructure_health, which targets a broader infrastructure scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this tool is for auditing indexer/tracker connectivity in Prowlarr. It does not explicitly name alternatives or when-not conditions, but the context is specific enough that an agent can infer when to use it. Lacks the explicit routing that a 5 would require.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_movie_statusA

Checks if a specific movie exists in the Radarr library on the Ubuntu cluster and returns its monitoring status with artwork.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe exact title of the movie to search for.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the behavioral burden. It conveys a read-only check and names the output (monitoring status and artwork), but it does not describe behavior when the movie is absent, error conditions, or explicitly confirm no side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the action, resource, and output with no filler or redundancy. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description should clarify the return contract more fully. It says monitoring status and artwork are returned, but not what the output looks like when the movie is not found or how 'monitoring status' is represented. This is adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is already documented as 'The exact title of the movie to search for.' The description adds context about the Radarr library but does not meaningfully enrich the title parameter beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Checks if a specific movie exists'), a concrete resource ('Radarr library on the Ubuntu cluster'), and a distinct outcome ('returns its monitoring status with artwork'). This clearly differentiates it from siblings like search_and_select_movies or diagnose_missing_media.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call it when you need to verify a movie's presence and monitoring status. However, the description never explicitly says when to prefer this tool over siblings, nor does it mention alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirm_selected_choicesA

Adds the user's numbered choices from the last search_and_select_movies grid to Radarr as monitored movies and starts a download search for each. Movies already in Radarr are reported, not added twice. Uses the quality profile you name, otherwise the default set on the Settings page, otherwise Radarr's first quality profile; and Radarr's first root folder unless told otherwise.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootFolderNoRadarr root folder path to add to instead of the first one (e.g. '/media/movieskids').
chosenIndexesYesAn array of chosen numbers selected by the user (e.g., [1, 3]).
qualityProfileNoRadarr quality profile name to use instead of the default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it discloses key behaviors: adding monitored movies, starting download searches, avoiding duplicate additions, and default quality profile/root folder fallbacks. It could go further by describing result reporting format, but the core side effects are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences cover the main action, duplicate handling, and defaulting logic without waste. The most important purpose is front-loaded, and each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a mutating workflow tool: it explains what happens, the dependency on a prior search grid, and fallback defaults. It does not describe the output/report format, and with no output schema this is a minor gap, but the essential invocation context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by explaining the fallback order for qualityProfile and the default rootFolder behavior. It also ties chosenIndexes to the user's numbered selections from the search grid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Adds the user's numbered choices... to Radarr as monitored movies and starts a download search for each.' This clearly distinguishes it from siblings like search_and_select_movies and check_movie_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Establishes clear context by referencing 'the last search_and_select_movies grid,' indicating this is a follow-up to that specific sibling tool. It does not explicitly state exclusions or alternatives, but the workflow context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_missing_mediaA

Traces a movie through Radarr metadata, history, and active download client queues to pinpoint why it is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe title of the media to diagnose.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that the tool reads multiple sources (metadata, history, download client queues) and produces a diagnosis, which is useful. However, it doesn't disclose whether the tool performs any mutations (e.g., triggering searches, changing statuses), what the output format is, or whether it can take actions beyond diagnosis. The word 'Traces' suggests read-only, but that is not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and resources, no filler. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter diagnostic tool, the description is mostly complete. However, with no annotations and no output schema, an agent doesn't know whether the tool is read-only or may trigger actions, nor what the diagnosis result looks like. Given the tool's complexity (tracing through multiple systems), a bit more context about side effects or output would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the only parameter 'title' is described as 'The title of the media to diagnose.' The description adds the context that the title refers to a movie, which is slightly more specific than the schema's 'media.' This is a minor addition; the schema already carries the meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Traces') and names the exact resources it inspects (Radarr metadata, history, active download client queues) and the goal (pinpoint why a movie is missing). This clearly distinguishes it from siblings like check_movie_status or manage_stalled_downloads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a diagnostic use case: when a movie is missing and the cause is unknown. It doesn't explicitly name alternatives or when-not-to-use, but the context of tracing through multiple sources makes the intended scenario clear. A small gap is not stating when to prefer check_movie_status or manage_stalled_downloads instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_next_job_stepA

Processes a single sequential block item from an active background batch queue entry to prevent API flooding. (Jobs that have been started are also advanced automatically, one item per minute, by the job runner.)

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesThe unique tracking ID of the active job array to step execute.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the disclosure burden. It usefully discloses that exactly one sequential block item is processed, that the job must be active, and that auto-advance already occurs. But it does not mention side effects on job state, error conditions, reversibility, or what happens when no steps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The first sentence front-loads the action and purpose; the second adds relevant automatic-advancement context. Appropriately sized for a single-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple one-parameter tool, but with no annotations and no output schema, the description must do more. It explains what and why, but omits return/outcome details and side-effect behavior, leaving the agent with only partial context for a mutating action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes jobId as the unique tracking ID of the active job array, so the baseline is 3. The description adds some contextual language around 'active' and 'block item' but does not materially extend the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States precise behavior: processes a single sequential block item from an active background batch queue entry, with a clear rationale (prevent API flooding). This is specific enough to distinguish it from sibling read/manage tools like get_background_jobs and update_job_status, even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than explicit: the description suggests manual stepping exists to prevent API flooding, and notes that started jobs also auto-advance one item per minute. However, it does not state when not to use this tool or name an alternative explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_background_jobsA

Retrieves active, pending, or completed persistent media processing jobs running on the server cluster.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, but it does not disclose behaviors like whether this is read-only (it implies retrieval, so likely safe), how results are ordered, or if there are any side effects. The description is clear about the action (retrieves) but lacks depth on return format or filtering, though the tool has no parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the verb and resource, with no wasted words. It is appropriately sized for a simple tool with no parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description is nearly complete. It specifies what it retrieves (jobs) and their states, but could mention whether it returns a list or counts, though without an output schema, the description does enough to guide basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and the description covers the full schema (100% coverage with no properties). The description clarifies the scope (server cluster) and job states, adding meaning beyond the empty schema, which justifies a score above the baseline for no params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves media processing jobs, specifying the job states (active, pending, completed) and the resource (persistent media processing jobs on the server cluster). It distinguishes from siblings like get_plex_activity or get_library_analytics, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool—when you need to check on media processing jobs—but does not explicitly contrast with siblings like update_job_status or execute_next_job_step. No exclusions or alternative conditions are stated, but the context is clear enough for most agents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cluster_hardware_analyticsA

Fetches real-time CPU load and memory allocation for every configured cluster host over SSH, as a Markdown table.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose that the tool connects over SSH and returns a Markdown table, which is useful. However, it does not mention potential side effects, authentication requirements, latency implications, or what happens if SSH fails. The description is honest but incomplete on behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose (real-time CPU load and memory allocation), specifies the scope (every configured cluster host), the method (over SSH), and the output format (Markdown table). Every element earns its place with zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description covers the main purpose and output format. However, it lacks context about failure modes, authentication prerequisites, or how this relates to sibling tools like get_cluster_infrastructure_health. An agent might not know when to prefer this over the infrastructure health tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides no parameter semantics to cover. The description compensates by explaining what data is fetched and how it is presented. With no parameters, the baseline is 4, and the description adds meaningful context about the tool's behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches real-time CPU load and memory allocation for every configured cluster host over SSH, and specifies the output format as a Markdown table. This is a specific verb+resource combination that distinguishes it from siblings like get_cluster_infrastructure_health, which likely covers broader health metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context (real-time hardware monitoring for cluster hosts) but does not explicitly state when to use this tool versus alternatives like get_cluster_infrastructure_health. There is no mention of when not to use it or what conditions would make a sibling tool more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cluster_infrastructure_healthA

Collects real-time CPU utilization, RAM usage, and active Docker container counts across all configured Ubuntu hosts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It does disclose that data is real-time, scoped to all configured Ubuntu hosts, and limited to CPU, RAM, and Docker container counts. It does not explicitly state whether the operation is read-only, describe potential side effects, error conditions, or output shape, so some behavioral detail is still missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-structured sentence conveys the action, the data collected, and the scope. Every word contributes meaning, and the most important information is front-loaded. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-style monitoring tool, the description is largely complete: it names the exact metrics and host scope. The main gap is the lack of explicit return-format or usage-context details, but the low complexity of this tool means an agent can reasonably infer how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so per the rubric the baseline is 4. The description appropriately focuses on what data is collected rather than parameter details, since there is no input schema to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Collects') and a specific resource ('cluster infrastructure health') with concrete metrics: CPU utilization, RAM usage, and active Docker container counts. It is clear and likely distinguishable from get_cluster_hardware_analytics, though it does not explicitly name the sibling or draw the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: call this when you need real-time resource metrics across the Ubuntu hosts. However, it provides no explicit guidance about when to prefer this tool over related siblings like get_cluster_hardware_analytics or check_indexer_health, and no exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_library_analyticsA

Queries historical statistics regarding most watched movies, total user count, and overall watch metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It indicates a read-only operation via 'Queries' and clarifies the data is historical aggregate statistics, but it does not disclose output structure, pagination, or authorization requirements. It is adequate for a simple query tool but leaves behavioral details unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Every clause contributes specific metrics or scope, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter analytics query with no output schema, the description gives the main return categories and scope, which is reasonably complete. It could specify the time window or output format, but the low complexity makes the current description sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% description coverage, and the tool takes no arguments. Per the 0-parameter baseline, this is a 4; there is no parameter semantics for the description to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Queries') and names the resource ('historical statistics') with concrete content examples: most watched movies, total user count, and overall watch metrics. It is clear and distinguishes itself from siblings like get_cluster_hardware_analytics by subject matter, though it does not explicitly contrast with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when historical library analytics are needed, but it provides no explicit when-to-use or when-not-to-use guidance and does not mention alternatives such as get_plex_activity or get_cluster_hardware_analytics. The context is understandable, but the guidance is indirect.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_plex_activityA

Fetches real-time playback streaming analytics from Plex via Tautulli to monitor user context and transcoding strain.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It states the tool 'fetches' data, implying a read operation, but does not explicitly say it is read-only, mention any side effects, rate limits, authentication requirements, or what happens if Tautulli is unavailable. It also doesn't clarify the output structure or that it returns current sessions only. This leaves significant gaps for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the primary action and purpose without any redundant filler. Every phrase adds value, and it is appropriately concise for a simple parameterless tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description is the sole source of context about the return value and limitations. It says it fetches 'analytics' but does not describe the shape of the response (e.g., list of active sessions, per-user details). For an agent to know what to do with the result, more detail on the return would be helpful. Still, the tool is simple enough that the current description is minimally viable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and the schema is empty. Per the rubric, 0 parameters sets a baseline of 4. The description adds no parameter information (since there are none), and no compensation is needed because the schema already fully covers the parameter surface.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetches'), names a clear resource ('real-time playback streaming analytics from Plex via Tautulli'), and states the purpose ('to monitor user context and transcoding strain'). This distinguishes it from siblings like get_library_analytics, which focus on broader analytics, and check_movie_status, which checks individual titles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by mentioning the monitoring purpose, but it does not explicitly state when to use this tool over alternatives or provide exclusions. No mention of siblings or conditions like 'use this for live streams, use get_library_analytics for historical data'. The purpose gives some context but falls short of clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_stalled_downloadsA

Scans qBittorrent download queues to isolate, pause, or blocklist items stuck below threshold download speeds.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAUDIT returns stalled candidates; PURGE_STALLED wipes them and flags a re-search.
minSpeedKbpsNoThe minimum allowed speed threshold before a torrent is considered stalled.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden; it does indicate the tool changes download state (isolate, pause, blocklist) rather than being read-only. However, it omits the destructive PURGE_STALLED side effect and the re-search flag, and gives no indication of reversibility or permissions; the schema's action descriptions partially compensate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence names the resource, the defect condition, and the possible actions with no filler. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with a rich schema, the definition is mostly adequate, but there is no output schema and no annotation-level safety information. The description does not specify what AUDIT returns in practice or the full effects of PURGE_STALLED beyond the schema, so an agent has to rely on enum descriptions for side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the action enum and minSpeedKbps descriptions are already explicit. The description adds only the 'below threshold' concept, which loosely maps to minSpeedKbps but adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: scans qBittorrent download queues and targets stalled items below a speed threshold. It is clear about the domain and intent, though it does not explicitly distinguish itself from siblings and its 'pause or blocklist' wording does not fully match the AUDIT/PURGE_STALLED action enum.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The qBittorrent queue context and below-threshold condition imply when to use it, but there is no explicit when-to-use or when-not-to-use guidance, nor any named alternative. An agent must infer that this is for stalled-download management rather than being told.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_media_upgradeB

Evaluates and safely schedules a controlled batch upgrade for specified media classes while enforcing storage policies.

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaTypeYesThe structural classification targeting upgrades.
maxBatchSizeNoLimits the maximum number of edits in a single batch.
targetResolutionYesThe target processing quality resolution threshold.

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'safely' and 'enforcing storage policies,' but does not clarify whether this tool mutates state by creating a persisted schedule, whether it is read-only, what its failure modes are, or whether it actually executes any upgrades.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly written sentence with no filler. It front-loads the primary action and includes constraints like 'controlled' and 'enforcing storage policies' without wasting words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema and no annotations, yet the description does not explain what the tool returns, whether a schedule is persisted, or how this planning step relates to execution siblings. An agent would still lack critical information needed to safely invoke and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already documented. The description adds loose context with 'specified media classes' and 'batch,' which roughly map to mediaType and maxBatchSize, but it does not meaningfully extend parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Evaluates and safely schedules a controlled batch upgrade for specified media classes.' It clearly distinguishes itself from execution-focused siblings by emphasizing planning and scheduling rather than executing, and from status tools by naming the upgrade action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrasing implies this should be used when a batch upgrade needs to be planned and validated against storage policies before execution. However, it does not explicitly state when to use this tool versus alternatives like execute_next_job_step or update_job_status, leaving the selection logic mostly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_actor_filmographyA

Resolves an actor's name to their official TMDb filmography, filtering out talk shows, self-appearances, and uncredited roles. When Plex is configured, marks which of those movies the user already has in their Plex library and which they don't. Use this to answer which of an actor's movies the user is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
showNoOnly titles the user has in Plex ('owned'), only those they don't ('missing'), or both (default).
limitNoHow many titles to list, newest first (default 15).
yearToNoOnly titles released in or before this year.
libraryNoJudge ownership only against Plex libraries whose name contains this text, e.g. '4k': 'owned' then means held in a 4K library and 'missing' means not held in any.
yearFromNoOnly titles released in or after this year.
actorNameYesThe exact name of the actor (e.g., 'Harrison Ford').

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does well by revealing the external TMDb source, the filtering of talk shows/self-appearances/uncredited roles, and the conditional Plex ownership marking. It does not cover edge cases like unknown actor names or what happens when Plex is not configured, but the core behavior is honestly and usefully described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences accomplish a lot: the first states the operation, source, and filters, and the second adds the Plex-dependent output and the intended use case. There is no repetition, filler, or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has six parameters, 100% schema coverage, no annotations, and no output schema, the description provides enough context for normal use: what the tool returns conceptually, what it filters, and when Plex data is included. It could add more edge-case transparency, but nothing essential is missing for selecting and invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains all six parameters, including enums, defaults, ranges, and the subsetting behavior of 'show'. The description adds only a general link to actorName and the owned/missing idea, not much additional meaning. Baseline 3 is appropriate because the description does not need to compensate for schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('resolves') and a clear resource ('actor's name to their official TMDb filmography'), then adds concrete scope by naming what is filtered out. The mention of marking Plex ownership and answering which movies the user is missing distinguishes it clearly from sibling tools like search_plex_library or check_movie_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to answer which of an actor's movies the user is missing,' which gives a direct use case. It also conditions the Plex ownership behavior on Plex being configured. However, it does not name alternative tools or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_cluster_backupA

Asks each configured Servarr app (Radarr, Sonarr, Prowlarr) to create its built-in database backup, waits for each to finish, and confirms a new backup file appeared, reporting the file's name, size and time. The backups stay in each app's own backup folder; nothing is copied.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the whole burden. It discloses that it waits for completion, verifies a new backup file, reports file metadata, leaves backups inside app folders, and copies nothing. It does not mention failure modes or authorization requirements, but the core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The action is front-loaded, the waiting behavior is clarified, and the non-copying boundary is stated at the end. Every sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-input, no-output-schema tool, this description is complete: it states target apps, action, synchonization behavior, verification step, return details, and side-effect boundary. No important invocation information appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema already covers everything. The description adds useful context by defining the scope ('each configured Servarr app'), and no parameter clarification is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('asks... to create'), the resource ('built-in database backup' for each Servarr app), and the observable outcome (waiting, confirming, reporting file name/size/time). This clearly distinguishes it from siblings like manage_stalled_downloads or get_plex_activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit alternative or 'use instead' guidance, but the context is unmistakable: use when you need each configured Servarr app to create a database backup and verify it. No sibling tool appears to compete for the same operation, so missing exclusions is a minor gap, not a critical one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_and_select_moviesA

Searches TMDb for matching movies and renders a structured Markdown multi-choice grid interface for confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe film name or fuzzy query text to search for (e.g. 'Heat').

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses a key behavior: rendering a Markdown multi-choice grid for confirmation, which goes beyond a simple search. However, it does not mention potential side effects, user interaction flow, or whether it blocks pending confirmation. This is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, efficient sentence that front-loads the primary action ('Searches TMDb') and follows with the output behavior. No wasted words; every phrase contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description is complete enough to understand its purpose and behavior. It explains the search and the confirmation grid. It does not detail what happens after confirmation, but this is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% coverage for the only parameter (query), including a description and example. The tool description adds no further semantics about the parameter beyond restating the search action, so it meets the baseline without extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: searching TMDb for movies, and the specific output: a Markdown multi-choice grid for confirmation. It distinguishes this tool from siblings like check_movie_status or get_plex_activity by its search-and-select nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when you need to search for a movie and let the user confirm a selection, but it does not explicitly contrast it with alternatives or state when not to use it. No explicit exclusions or comparisons are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_plex_libraryA

Searches the movies actually in the user's Plex library (across all movie libraries, including 4K) by genre, actor, title, release year, and/or library. Filters can be combined, e.g. genre 'Horror' with year 1982, or genre 'Horror' with library '4k'. Use this to answer what the user owns or can watch; use check_movie_status for Radarr/download status of one specific movie. Always express a narrowing the user asks for (4K, a genre, a year...) as a filter here rather than filtering results yourself, because the results table shown to the user contains exactly the rows this returns. The default limit is small: when the user wants everything ('all', 'every', 'list them'), pass limit 500; if the reply says more matches remain, call again with the offset it gives.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoRelease year.
actorNoFull actor name, e.g. 'Harrison Ford'.
genreNoGenre name, e.g. 'Horror' or 'Science Fiction'.
limitNoMaximum results to return (default 25, max 500).
titleNoPart of the movie title.
offsetNoMatches to skip, to fetch the next page of a long result.
libraryNoOnly search Plex libraries whose name contains this text, e.g. '4k' for the 4K libraries, 'kids', 'documentaries'.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden. It discloses that the results table shown to the user exactly matches the return, the default limit is small, and that pagination may require follow-up calls—context beyond the schema. It doesn't mention authentication or rate limits, but those may be less critical; still, it adds valuable operational behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with front-loaded purpose and usage, followed by practical tips. It uses clear examples and covers edge cases (default limit, pagination) without unnecessary fluff. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with 7 optional params and no output schema, the description is remarkably complete. It explains filtering, combination, limits, pagination, and the exact relation to the displayed results. Everything an agent needs to use it effectively is covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter is already documented with descriptions (year, actor, genre, limit, title, offset, library). The description reinforces filter combination and library semantics (e.g., '4k') but doesn't add much beyond schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the user's actual Plex library by multiple filters (genre, actor, title, year, library) and explicitly differentiates it from sibling tools like check_movie_status. It specifies what it answers ('what the user owns or can watch'), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance ('Use this to answer what the user owns or can watch') and when-not-to-use ('use check_movie_status for Radarr/download status'), naming the alternative. It also provides detailed operational instructions on how to express user requests as filters and how to handle pagination with limit and offset.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_job_statusA

Updates the operational state of an active or pending background batch job.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesThe unique ID of the target job
actionYesThe action to execute on the queue runtime.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It indicates the tool mutates job state, but does not disclose potential side effects (e.g., whether CANCEL is irreversibly destructive, or whether PAUSE/RESUME have any queuing effects). It also doesn't mention any permissions or whether actions are reversible. For a mutation tool, this is a moderate gap, but the action enum provides some clarity for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the purpose. It avoids fluff and is easy to scan, which is ideal for an agent's prompt context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with a clear schema, the description is mostly sufficient. However, given no annotations and no output schema, it could benefit from stating the expected response (e.g., success/failure indicators) or any constraints (e.g., actions only on active/pending jobs). The description is adequate but leaves some behavioral context unclear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with descriptions for jobId and action, including an enum for action. The description adds minimal extra meaning beyond the schema—it just restates that these actions operate on operational state. Baseline 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Updates the operational state of an active or pending background batch job.' It specifies a verb (updates), a resource (operational state of a job), and the scope (active or pending). It distinguishes from siblings like get_background_jobs (which likely reads) but does not explicitly differentiate from other update tools like execute_next_job_step or manage_stalled_downloads, though the specific action set (PAUSE/RESUME/CANCEL) is implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates usage: to change the state of an active or pending job, not for completed jobs. It does not explicitly state when to use this tool versus alternatives like execute_next_job_step (which might advance a job) or manage_stalled_downloads (which might handle stalled jobs). No explicit exclusions or alternative routing is provided, so guidance is adequate but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv1.1.0
    • Changedconfirm_selected_choices2 fields changed
      • addedInput schema / properties / qualityProfile
        Added value: +{
        +  "description": "Radarr quality profile name to use instead of the default.",
        +  "type": "string"
        +}
      • addedInput schema / properties / rootFolder
        Added value: +{
        +  "description": "Radarr root folder path to add to instead of the first one (e.g. '/media/movieskids').",
        +  "type": "string"
        +}
    • Changedresolve_actor_filmography5 fields changed
      • addedInput schema / properties / library
        Added value: +{
        +  "description": "Judge ownership only against Plex libraries whose name contains this text, e.g. '4k': 'owned' then means held in a 4K library and 'missing' means not held in any.",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "How many titles to list, newest first (default 15).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / show
        Added value: +{
        +  "description": "Only titles the user has in Plex ('owned'), only those they don't ('missing'), or both (default).",
        +  "enum": [
        +    "all",
        +    "owned",
        +    "missing"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / yearFrom
        Added value: +{
        +  "description": "Only titles released in or after this year.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / yearTo
        Added value: +{
        +  "description": "Only titles released in or before this year.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
    • Addedsearch_plex_library
  2. 16 tool updatesv1.0.0
    • First observedcheck_indexer_health
    • First observedcheck_movie_status
    • First observedconfirm_selected_choices
    • First observeddiagnose_missing_media
    • First observedexecute_next_job_step
    • First observedget_background_jobs
    • First observedget_cluster_hardware_analytics
    • First observedget_cluster_infrastructure_health
    • First observedget_library_analytics
    • First observedget_plex_activity
    • First observedmanage_stalled_downloads
    • First observedplan_media_upgrade
    • First observedresolve_actor_filmography
    • First observedrun_cluster_backup
    • First observedsearch_and_select_movies
    • First observedupdate_job_status

TDQS

A3.7/5.0

Scored across 17 tools

Disambiguation3/5

Most tools have distinct resource/action pairings, but get_cluster_hardware_analytics and get_cluster_infrastructure_health overlap heavily on CPU/RAM reporting, and the two search tools require careful reading to distinguish local Plex search from TMDb selection. Descriptions largely clarify the boundaries, so the issue is present but not severe.

Naming Consistency5/5

All tool names follow a clean snake_case verb_first pattern, with information retrieval consistently using get/check and actions using purpose-specific verbs like manage, resolve, confirm, and plan. There is no mixing of casing styles or chaotic verb usage.

Tool Count3/5

At 17 tools, the set sits in the borderline heavy range, though the breadth of subsystems covered—Plex, Tautulli, Radarr, Prowlarr, qBittorrent, and cluster infrastructure—partly justifies the count. Several overlapping health/analytics tools could be consolidated to make the surface feel tighter.

Completeness4/5

The core movie workflow is well covered: discover candidates via TMDb, confirm them into Radarr, check their status, diagnose missing media, and plan upgrades. Minor gaps exist, such as no direct remove/delete flow and no Sonarr/TV management, but they do not break the apparent movie-centric scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables full management of a Plex Media Server via Claude, including browsing libraries, fixing metadata, managing collections, and more.
    -
  • F
    license
    A
    quality
    D
    maintenance
    Exposes homelab and IT-ops tools to Claude, including system health monitoring, Grafana alert states, Docker container status, Loki logs, SMART disk health, and more.
    8
    1
    -