mcpField
P
Plex Director

Plex Director

本地服务
github.com游戏娱乐06 天前更新

关于 Plex Director

Plex Director 是面向自托管 Plex 与 Servarr 媒体环境的助手和仪表板,提供媒体查询、下载与索引器监控、故障诊断及批量操作,并可通过 MCP 服务连接 Claude Desktop。

主要功能

  1. 01按名称、演员、类型、年份和媒体库搜索 Plex
  2. 02检查缺失剧集和即将播出的日期
  3. 03诊断缺失电影并添加到 Radarr
  4. 04监控下载队列和 Prowlarr 索引器
  5. 05规划并控制电影升级批处理
  6. 06查看主机状态和 Plex 观看统计

适用场景

  1. 01查找已有的 4K 影片或未观看剧集
  2. 02排查缺失剧集或电影
  3. 03检查下载队列与索引器状态
  4. 04运行受控的电影批量升级

MCP 相关

提供供 Claude Desktop 使用的 stdio MCP 服务,开放查询和管理已连接 Plex 及媒体服务的工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"honeybeartech-plex-director": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"PLEX_URL",
"-e",
"PLEX_TOKEN",
"-e",
"RADARR_URL",
"-e",
"RADARR_API_KEY",
"-e",
"SONARR_URL",
"-e",
"SONARR_API_KEY",
"-e",
"PROWLARR_URL",
"-e",
"PROWLARR_API_KEY",
"-e",
"SABNZBD_URL",
"-e",
"SABNZBD_API_KEY",
"-e",
"QBITTORRENT_URL",
"-e",
"QBITTORRENT_USER",
"-e",
"QBITTORRENT_PASS",
"-e",
"TAUTULLI_URL",
"-e",
"TAUTULLI_API_KEY",
"-e",
"TMDB_API_KEY",
"-e",
"WEB_PASSWORD",
"-e",
"SETTINGS_ENCRYPTION_KEY",
"docker.io/honeybeartech/plex-director-mcp:1.4.0"
],
"env": {
"PLEX_URL": "<PLEX_URL>",
"PLEX_TOKEN": "<PLEX_TOKEN>",
"RADARR_URL": "<RADARR_URL>",
"RADARR_API_KEY": "<RADARR_API_KEY>",
"SONARR_URL": "<SONARR_URL>",
"SONARR_API_KEY": "<SONARR_API_KEY>",
"PROWLARR_URL": "<PROWLARR_URL>",
"PROWLARR_API_KEY": "<PROWLARR_API_KEY>",
"SABNZBD_URL": "<SABNZBD_URL>",
"SABNZBD_API_KEY": "<SABNZBD_API_KEY>",
"QBITTORRENT_URL": "<QBITTORRENT_URL>",
"QBITTORRENT_USER": "<QBITTORRENT_USER>",
"QBITTORRENT_PASS": "<QBITTORRENT_PASS>",
"TAUTULLI_URL": "<TAUTULLI_URL>",
"TAUTULLI_API_KEY": "<TAUTULLI_API_KEY>",
"TMDB_API_KEY": "<TMDB_API_KEY>",
"WEB_PASSWORD": "<WEB_PASSWORD>",
"SETTINGS_ENCRYPTION_KEY": "<SETTINGS_ENCRYPTION_KEY>"
}
}
}
}
启动命令docker run -i --rm -e PLEX_URL -e PLEX_TOKEN -e RADARR_URL -e RADARR_API_KEY -e SONARR_URL -e SONARR_API_KEY -e PROWLARR_URL -e PROWLARR_API_KEY -e SABNZBD_URL -e SABNZBD_API_KEY -e QBITTORRENT_URL -e QBITTORRENT_USER -e QBITTORRENT_PASS -e TAUTULLI_URL -e TAUTULLI_API_KEY -e TMDB_API_KEY -e WEB_PASSWORD -e SETTINGS_ENCRYPTION_KEY docker.io/honeybeartech/plex-director-mcp:1.4.0
需要配置的环境变量
PLEX_URLPlex server URL, e.g. http://192.168.1.10:32400
PLEX_TOKEN密钥Plex token
RADARR_URLRadarr URL
RADARR_API_KEY密钥Radarr API key
SONARR_URLSonarr URL
SONARR_API_KEY密钥Sonarr API key
PROWLARR_URLProwlarr URL
PROWLARR_API_KEY密钥Prowlarr API key
SABNZBD_URLSABnzbd URL
SABNZBD_API_KEY密钥SABnzbd API key
QBITTORRENT_URLqBittorrent Web UI URL
QBITTORRENT_USERqBittorrent username
QBITTORRENT_PASS密钥qBittorrent password
TAUTULLI_URLTautulli URL
TAUTULLI_API_KEY密钥Tautulli API key
TMDB_API_KEY密钥TMDb API Read Access Token, for filmographies and the movie-choice grid
WEB_PASSWORD密钥Password for the web dashboard the same container serves on port 3000 (strongly recommended)
SETTINGS_ENCRYPTION_KEY密钥Encrypts the saved service credentials: 32 random bytes, base64 (openssl rand -base64 32). Every container sharing the data volume needs the same key (recommended)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocidocker.io/honeybeartech/plex-director-mcp:1.4.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

plex-director-mcp

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

Plex Director 是一款适用于 Plex + Servarr 媒体栈的可自托管助手。它连接 Plex、Radarr、Sonarr、Prowlarr、SABnzbd、qBittorrent、Tautulli 和 TMDb(也可选择通过 SSH 连接你的 Linux 主机),并提供两种使用方式:

  • 面向 Claude Desktop 的 MCP 服务——让 Claude 帮你查找已有的内容、分析电影缺失的原因、添加电影、检查索引器和下载队列,或运行批处理任务。
  • Web 仪表板——提供浏览器界面和聊天框(“我有 Harrison Ford 的哪些 4K 电影?”)、服务状态、主机资源利用率、下载队列、索引器运行状况和后台任务。

它专为家庭环境设计:在局域网上运行,放在它所连接的应用旁边即可。

警告

Plex Director 持有你所连接的每项服务的 API 密钥,不仅能读取数据,也能修改数据:它会将电影添加到 Radarr 并启动下载搜索、从 qBittorrent 中移除停滞的种子、运行批量升级任务,以及触发 Servarr 备份。添加电影前需要先选择再确认,批处理任务也会在运行前规划;但清除停滞的种子和启动备份会在收到请求后立即执行,聊天界面和 Claude Desktop 也会使用你的密钥。请设置 WEB_PASSWORD,不要将仪表板暴露在公共互联网上,并查看安全要求。

文档

目录

功能介绍

  • 查找你拥有的内容。 按类型、演员、标题、年份和媒体库搜索 Plex 媒体库中的电影和电视节目,也可以一次搜索所有媒体库(例如只搜索 4K 媒体库)。同一部影片如果同时存在于高清和 4K 媒体库中,只会显示为一个结果,并列出两个媒体库;电视节目还会显示季数、集数和观看进度。除非你明确指定,否则可以将 Sports 等媒体库排除在搜索之外。
  • 每集都齐了吗? 询问某部剧,Sonarr 的剧集列表会显示已播出的剧集中有多少集已下载,并准确列出缺少哪些剧集;也可以询问哪些剧集尚有缺漏,并按缺漏情况排序,包括接近完整的剧集。尚未播出的剧集和特别篇永远不会计为缺失。对于缺失的剧集,还可以根据 Sonarr 的历史记录和下载队列说明原因。
  • 最近播出什么,何时回归? 查看未来几天播出的剧集,并标记首播和季终集;也可以询问某部剧何时回归(或是否尚未公布日期)。
  • 接下来该看什么? 询问待看内容:你正在追看的每部剧的下一集,以及尚未看完的电影,并显示每部电影的观看进度。
  • 我看过什么,又有哪些内容已经搁置? 查询未看过的剧集、开始看了却从未看完的剧集、几年没看过的电影,或最新添加的内容;可以单独查询,也可以结合类型、媒体库等条件查询。对于 Plex 标记为已观看但未记录日期的影片,会将其单独列出并计数,而不会猜测日期。
  • 已拥有与缺失内容对比。 查询某位演员在 TMDb 上的电影作品列表,包括电影和电视节目,并查看哪些影片已在 Plex 中、哪些没有;还可以选择仅查看电影或剧集、按年份范围筛选,或筛选「4K」内容。会排除脱口秀节目和「本人」出演记录;即使演员在同一部影片中出演多个角色,也只会列出一次。
  • 诊断并添加电影。 追踪电影的 Radarr 元数据、历史记录和下载队列,了解影片缺失的原因;也可以搜索 TMDb,从网格中选择影片,并将所选影片添加到 Radarr,同时搜索下载资源。
  • 监控下载和索引器。 查看 SABnzbd 和 qBittorrent 队列、清理停滞的种子,并检查每个 Prowlarr 索引器的运行状况(包括正在退避的索引器)。
  • 安全运行批量任务。 规划电影升级批次,并让受速率限制的运行器每分钟搜索一部电影;支持暂停、恢复、取消,并在 Radarr 停止响应时自动暂停。
  • 监控主机。 通过 SSH 查看 Linux 主机的 CPU、内存、磁盘、运行时间和 Docker 容器健康状况,也可以按需查看 Radarr、Sonarr 和 Prowlarr 内置备份。每台主机首次连接时都会记住其 SSH 密钥;如果密钥发生变化,则会拒绝连接,直到你批准为止。
  • 了解使用情况。 通过 Tautulli 查看 Plex 实时串流和观看统计信息。
  • 及时了解动态。 批量任务完成或暂停时,可选择接收 Discord 通知。

快速开始

从 v1.2.0 起,Plex Director 已列入官方 MCP 注册表,标识为 io.github.HoneyBearTech/plex-director-mcp,因此可以浏览注册表的 MCP 客户端能够直接安装(其设置见 server.json)。除此之外,最快的试用方式是使用 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

然后打开 **http://localhost:3000**,登录并在 Settings 页面填写你的服务信息(Radarr、Sonarr、Prowlarr、SABnzbd、qBittorrent、Tautulli、Plex、TMDb)。包含所有选项的完整指南见下方的 Docker。若要通过 Claude Desktop 使用,请参阅 通过 Docker 使用 Claude Desktop。

Docker

镜像已发布到两个注册表,并且均已签名(参见 CI/CD):

注册表镜像
Docker Hubhoneybeartech/plex-director-mcp
GitHub Container Registryghcr.io/honeybeartech/plex-director-mcp

以下内容适用于任一镜像;示例使用 Docker Hub。

支持的架构

我们会发布多架构清单,因此拉取镜像时会自动获取适用于你设备的版本。

架构可用
x86-64 (linux/amd64)✅
arm64 (linux/arm64)✅
镜像标签
标签说明
latestmain 分支的最新构建版本,包含尚未分配版本号的更改。
1.4.0特定发行版。如果你想自行选择升级时机,请固定使用其中一个版本。
1.1某个次要版本中最新的补丁版本。
sha-<commit>特定提交的构建版本,可用于固定版本或二分查找。

编号版本的发行说明请参阅 Releases 页面。

应用设置
  1. 启动容器:使用用法中的示例之一,然后在 http://<host>:3000 打开 Web UI。
  2. 设置密码。 将 WEB_PASSWORD 添加到容器的环境变量中。未设置时,任何能访问该端口的人都可以使用控制面板,包括 Settings 页面,并且页面会显示警告横幅。请参阅安全。
  3. 添加服务。 打开 Settings 并填写各个选项卡。每个字段也可以通过环境变量设置(请参阅环境变量参考),这对自动化设置很方便。你只需配置实际使用的服务。
  4. 为聊天框配置 AI。 Query 页面使用 Claude 回答问题,因此需要在容器的环境变量中设置 ANTHROPIC_API_KEY。这是按使用量付费的 Anthropic API 密钥,与 Claude 订阅分开。控制面板的其余部分无需此密钥也能正常工作。
  5. 保留数据卷。 你的设置、任务历史记录以及用于保持登录状态的密钥都存储在 /app/data 下的 SQLite 数据库中。请在此处挂载数据卷,否则每次重新创建容器时都会丢失这些数据。

各项凭据的获取位置:

服务填写内容
Radarr、Sonarr、ProwlarrURL,以及 Settings → General 中的 API 密钥。
SABnzbdURL,以及 Config → General 中的 API 密钥。
qBittorrentWeb UI URL、用户名和密码。
TautulliURL(不含 /api/v2),以及 Settings → Web Interface 中的 API 密钥。
Plex服务器 URL(例如 http://192.168.1.10:32400)和 X-Plex-Token:在 Plex Web 中打开任意一部电影,选择 ⋯ → Get Info → View XML,然后从地址栏中复制 X-Plex-Token= 后面的值。请像密码一样妥善保管。
TMDb你的 API Read Access Token(较长的那个,可在 TMDb 账户的 API 设置中找到),而不是较短的 v3 API 密钥。

**网络:**在容器内部,localhost 指的是容器本身,而不是你的服务器。请使用每个服务的局域网地址(例如 http://192.168.1.10:7878);如果其他应用位于同一个 Compose 项目或 Docker 网络中,也可以使用它们的服务名称(http://radarr:7878)。

用法

以下示例片段可帮助你开始创建容器。推荐使用 Docker Compose。

Docker Compose(推荐)
---
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

镜像内置健康检查(容器启动后,docker ps 会显示 healthy),因此无需另行添加。

若要避免在 compose 文件中暴露凭据,请将它们放在旁边的 .env 格式文件中,并引用该文件,而不是逐项列出:

    env_file:
      - plex-director.env

然后启动:

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

你可以通过更多 -e 标志添加参考中的其他变量,也可以将它们放入文件并传入 --env-file plex-director.env。若要监控 SSH 主机,还要添加 -v /path/to/ssh/id_ed25519:/ssh/id_ed25519:ro。

**--env-file 与 Node 的 .env 文件不同。**Docker 会按原样读取值:不要在值两侧加引号,也不要在同一行的值后添加注释(KEY=abc # my key 会被读取为值 abc # my key)。请将注释放在单独一行。

通过 Docker 使用 Claude Desktop

同一镜像也可以作为 MCP 服务,通过 stdio 通信。让 Claude Desktop 在配置中使用 docker run -i 运行它(设置 → 开发者 → 编辑配置,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"
      ]
    }
  }
}

重启 Claude Desktop 后,plex-director 服务会作为工具提供方显示(共 26 个工具,见下文)。注意:

  • 必须使用 -i,因为 MCP 通过 stdin/stdout 通信。不要添加 -t。
  • 无需使用 -p。Web 仪表板也会在此容器中启动,但只有在想从此容器而不是 Compose 容器访问它时,才需要发布其端口。
  • 如果也运行上面的长期运行容器,请为两者使用相同的数据卷(或绑定挂载),以便共享设置和作业历史记录。
  • 如果 Claude 关闭 stdin,容器仍会继续运行;退出 Claude Desktop 会停止容器,也可以使用 docker stop。
参数

容器镜像通过运行时传入的参数进行配置。这些参数以冒号分隔,分别表示 <external>:<internal>。例如,-p 8080:3000 会将容器内部的端口 3000 暴露出来,使其可通过容器外部主机 IP 上的端口 8080 访问。

参数功能
-p 3000:3000Web 仪表板。更改左侧数字即可使用主机上的其他端口。
-e WEB_PASSWORD=Web 仪表板的密码。强烈建议设置。
-e ANTHROPIC_API_KEY=启用 Query 聊天功能。
-e RADARR_URL= 等服务连接详情;请参阅参考。此项可选,也可以在设置页面中填写。
-v /app/dataSQLite 数据库:保存的设置、作业历史记录和登录会话密钥。请在此处挂载卷。
-v /ssh/id_ed25519:ro可选。 用于主机监控的 SSH 私钥(配合 -e SSH_KEY_PATH=/ssh/id_ed25519 使用)。
环境变量参考

启动容器不需要任何配置:容器会在无配置的情况下启动,你可以在设置页面中填写相关信息。

服务连接。 首次启动时,这些值会复制到数据库中,此后以数据库中保存的值为准(设置页面编辑的就是这些值)。如果之后更改了其中一个变量却没有任何效果,原因就在这里;请在设置页面中更改,或删除数据库。

变量说明
RADARR_URL、RADARR_API_KEYRadarr。用于影片状态查询、诊断、添加影片和批量作业。
RADARR_DEFAULT_QUALITY_PROFILE可选。 添加新影片时使用的画质配置文件名称。留空则使用 Radarr 中的第一个配置文件。也可以在设置页面的 Radarr 选项卡中设置。
SONARR_URL、SONARR_API_KEYSonarr。可选;用于检查电视剧集的完整性和进行备份。
PROWLARR_URL、PROWLARR_API_KEYProwlarr,用于索引器健康状态检查和备份。
SABNZBD_URL、SABNZBD_API_KEYSABnzbd,用于队列管理和诊断缺失媒体。
QBITTORRENT_URL、QBITTORRENT_USER、QBITTORRENT_PASSqBittorrent Web UI。
TAUTULLI_URL、TAUTULLI_API_KEYTautulli,用于查看流媒体播放和观看统计数据。
PLEX_URL、PLEX_TOKENPlex,用于搜索你拥有的媒体。
PLEX_SKIP_LIBRARIES可选。 以逗号分隔的 Plex 媒体库名称,这些媒体库不会纳入搜索(完整名称,不区分大小写),例如 Sports。如果问题中提到某个媒体库,例如“在 Sports 中”,仍会搜索该媒体库。留空则搜索所有媒体库。也可以在设置页面的 Plex 选项卡中设置。
TMDB_API_KEYTMDb API Read Access Token,用于查询演员作品目录和显示电影选择网格。
UBUNTU_HOSTS以逗号分隔的主机列表,用于通过 SSH 进行监控,例如 192.168.1.10,192.168.1.11。非标准 SSH 端口可添加 :port(192.168.1.10:2222)。
SSH_USER这些主机的 SSH 用户名。

容器设置。 每次都会从环境中读取这些设置,且绝不会存储在数据库中或显示在设置页面上。

变量默认值描述
WEB_PASSWORD(none)为仪表板启用登录。更改后会让所有人退出登录。
WEB_ALLOWED_HOSTS(none)仅在未设置 WEB_PASSWORD 时生效:仪表板会响应的额外主机名,以逗号分隔(例如,反向代理后的 plex.example.com)。IP 地址、localhost、单个词的名称以及 .local / .lan / .home.arpa / .internal 名称始终可用;其他名称会返回 403,以阻止 DNS 重绑定攻击。* 可关闭此检查。
WEB_TRUST_PROXY(none)仪表板前方的反向代理:填写其地址或子网,以逗号分隔(例如 192.168.40.10 或 192.168.40.0/24),也可填写 loopback。只有来自该代理的请求才能设置 X-Forwarded-For 和 X-Forwarded-Proto,这样登录次数限制会按真实客户端计算,且通过 HTTPS 访问时会话 Cookie 会设置为 Secure。未设置时,这两个请求头都会被忽略。true 和跳数会被拒绝。
SETTINGS_ENCRYPTION_KEY(none)加密保存在数据库中的服务凭据(AES-256-GCM)。需要 32 个随机字节,使用 base64 或 hex 编码:运行 openssl rand -base64 32 生成。已保存的凭据会在下次启动时加密。所有共用数据库的容器都必须使用相同的密钥;没有密钥,数据库将无法使用,因此请将密钥副本保存在备份之外的位置。建议设置。
WEB_PORT3000仪表板在容器内监听的端口。
ANTHROPIC_API_KEY(none)用于 Query 聊天的 Anthropic API 密钥。
SSH_KEY_PATH(none)用于主机监控的私钥路径(容器内)。容器用户必须具有读取权限。
SSH_KEY_PASSPHRASE(none)如果私钥受密码短语保护,则填写该密码短语。
DISCORD_WEBHOOK_URL(none)用于发送任务完成和任务暂停通知的 Discord webhook。
JOB_RUNNER_INTERVAL_SECONDS60任务运行器每隔多久推进已启动的任务一部电影(最小值为 10;0 会关闭运行器)。
只读和非 root 运行

从 1.3.0 版开始,容器以非 root 用户 UID 和 GID 65532(distroless 的 nonroot)运行;更早版本以 root 身份运行。镜像不包含 shell 或软件包管理器,且只会写入数据目录,因此也可以在只读文件系统且不授予任何权限的情况下运行:

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

也可通过 CLI 设置:--read-only --cap-drop ALL --security-opt no-new-privileges:true。

命名卷可直接使用:Docker 会将新卷的所有者设置为镜像中 /app/data 的所有者。主机文件夹必须先归 UID 65532 所有:sudo chown -R 65532:65532 /path/to/plex-director/data。若要改用其他用户运行(例如已拥有该文件夹的用户),请添加 user: "1000:1000"(或 --user 1000:1000)。如果数据目录不可写,容器会在启动时停止并打印需要运行的 chown 命令。从 1.2.x 或更早版本升级时,数据目录的所有者为 root;请参阅升级说明。如果使用 SSH 主机监控,挂载的密钥也必须可供容器用户读取。

更新

设置和任务历史记录都保存在数据卷中,因此更新时只需替换容器。

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

验证下载。 每个已发布的镜像都使用 GitHub 的 OIDC 身份通过 cosign 签名(无需管理密钥):

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
本地构建
git clone https://github.com/HoneyBearTech/plex-director-mcp.git
cd plex-director-mcp
docker build -t plex-director-mcp .

.dockerignore 会将 .env、本地数据库和其他机密排除在构建上下文之外。切勿将机密打包进镜像;请在运行时传入。

不使用 Docker 运行(Claude Desktop)

需要 Node.js 24。

git clone https://github.com/HoneyBearTech/plex-director-mcp.git
cd plex-director-mcp
npm install
# Build the dashboard; without this the web UI has nothing to serve.
cd web && npm install && npm run build && cd ..

在仓库根目录创建一个 .env 文件,填入你使用的服务(全部可选;你也可以稍后在「设置」页面填写服务详情):

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

每项配置的作用请参阅参考。以下两种情况很容易出错:

  • 注释要单独放在一行,不能跟在值后面(在某些工具中,KEY=abc # note 会让注释成为值的一部分)。
  • 路径中有空格时,需要用引号括住整个值: SSH_KEY_PATH="/Users/me/.ssh/my key",而不是 /Users/me/.ssh/'my key'。

将服务端添加到 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" }
    }
  }
}

将路径替换为实际路径,然后重启 Claude Desktop。服务端会在同一进程中,在 WEB_PORT 上启动 Web 控制面板。

Web 控制面板

控制面板与 MCP 服务运行在同一进程中,使用 WEB_PORT(默认为 3000)。

页面显示内容
查询一个聊天框,可使用 Claude 和你的服务回答有关媒体库的问题。搜索结果以带海报的表格形式显示(节目会显示季、集和观看进度),默认显示前 50 条,并提供展开按钮。后续问题会保留上下文;新建聊天会重新开始。需要 ANTHROPIC_API_KEY。
服务端状态Plex 实时流媒体播放情况和观看统计(来自 Tautulli)。
节点利用率每个 SSH 主机的 CPU、内存、磁盘、运行时间和容器健康状态。无法访问的主机会显示原因;SSH 密钥已更改的主机会显示标记,并提供信任新密钥按钮(参见安全性)。
队列SABnzbd 和 qBittorrent 下载队列。
索引器每个 Prowlarr 索引器的状态(运行正常、近期失败、退避中、已禁用),以及 Prowlarr 自身的健康警告。
任务批量任务及其进度。此处为只读:请通过 Claude 启动、暂停和取消任务。
设置每项服务的连接详情。密钥不会发回浏览器,只会显示是否已设置。

设置 WEB_PASSWORD 即可要求登录:用户先看到登录页面,随后获得一个签名的 7 天会话 Cookie(通过 HTTPS 提供服务时会自动标记为 Secure)。失败的登录尝试会受到速率限制。退出登录只会清除浏览器中的 Cookie;若要撤销所有会话,请更改密码。

健康检查接口为 GET /healthz,返回 {"ok":true},无需登录。Docker 镜像每 30 秒使用 Node 自行执行一次健康检查(镜像中没有 curl),检查端口为所设置的 WEB_PORT。

MCP 工具

Claude Desktop 可使用 26 个工具。标有 ★ 的 12 个工具也供控制面板的「查询」聊天使用。

服务端还会向 MCP 客户端发送简短的使用说明:哪些工具用于回答哪类问题,以及在执行任何会更改服务状态的操作前必须先确认。这些指引也包含在供加载技能的 Agent 使用的 Agent 技能(例如 Claude Code)以及「查询」聊天的提示词中。指引只在 src/guidance.ts 中编写一次。

你的媒体库

工具功能
★ search_plex_library按类型、演员、片名、年份和/或媒体库(例如 4k)搜索 Plex 媒体库中的电影和电视节目;可搜索所有媒体库,也可仅搜索电影或电视节目。电视节目会显示季、集和观看进度。可按观看状态(未观看、观看中、已观看)或“过去 N 年未观看”(从添加该片名时开始计算从未观看的情况)筛选,并按最近添加或最近观看排序。可按电视网或制片公司、内容分级(TV-MA、R……)、观众评分、发行年份(某个十年)或“过去 N 天内添加”进一步筛选。观看状态对应应用连接的 Plex 账户。大量结果会分页显示。
★ search_episodes查找单集电视节目,例如“《明星伙伴》中那集……”,按标题搜索单集、搜索某个日期范围内播出的剧集,或搜索某部剧的季首集或季终集。指定剧名时,会搜索单集标题和剧情简介;不指定剧名时,只搜索标题和播出日期,因为 Plex 无法跨整个媒体库搜索剧情简介。会显示季和集数、播出日期及观看状态。
★ get_on_deck从 Plex 的 On Deck(继续观看)中回答“接下来该看什么?”,列出看了一部分的电影,以及每部追更剧集的下一集(或正在观看的那一集),按最近活动时间倒序排列,并显示每项的观看进度。以 HD 和 4K 格式保存的同一部电影只显示一项。可仅显示电影或电视节目,也可限定某个媒体库,例如 kids。Plex 最多报告 50 项;观看状态对应应用连接的 Plex 账户。
★ resolve_actor_filmography列出演员在 TMDb 上的影视作品,可包含电影和电视节目,也可只显示其中一种;每个片名都会标记是否存在于 Plex 中。可按年份范围、是否已拥有及媒体库筛选。通过 TMDb ID 将作品与 Plex 匹配,因此 Plex 中没有 TMDb 匹配项的剧集不会被识别为已拥有。
★ check_series_completeness回答“这部剧的每一集我都有吗?”。根据 Sonarr 的剧集列表,显示已播出的剧集中有多少已下载、缺少哪些季和集、哪些尚未播出,以及 Sonarr 是否正在监控该剧(以便获取剩余剧集)。直接统计剧集,而非 Sonarr 的统计数据;后者会将只下载了一部分且未受监控的剧集视为完整。不会检查 Plex 扫描到的内容。
★ find_series_gaps列出缺少已播出剧集的电视节目,缺失最多的排在前面,并显示已下载的数量以及 Sonarr 是否正在寻找剩余剧集。可按是否受监控、是否未受监控或是否正在积极搜索筛选;可按缺失数量筛选(适用于“即将完整”的剧集),也可隐藏没有任何已下载剧集的节目。
★ find_series_by_quality按 Sonarr 下载的视频画质查找电视节目:例如“我有哪些剧只有 720p?”、“哪些剧有 1080p 或更高画质?”、“哪些剧混有不同画质?”(可作为升级候选)。按最佳画质中的最低画质优先显示,并列出各分辨率对应的文件数。它只能查看 Sonarr 下载的内容,因此不会统计单独 Plex 4K 媒体库中的 4K 副本(请使用 Plex 搜索并选择 4k 媒体库)。只读。
★ check_series_status查看 Sonarr 对某部剧的记录:是否受监控、画质配置文件和存储位置、下一集的播出时间、上次下载内容的时间、下载队列中的内容,以及已播出的剧集中有多少已下载。
★ diagnose_missing_episodes根据 Sonarr 的历史记录和下载队列,诊断某部剧已播出但没有文件的集数为何缺失:从未抓取、已抓取但从未导入、下载失败(并显示 Sonarr 给出的原因)、文件已被移除、卡在队列中,或未受监控,因此 Sonarr 从未查找过。可限定某一季或单集。只读。
★ get_upcoming_episodes根据 Sonarr 日历查看即将播出的电视节目。不指定片名时,可回答“本周有什么剧?”:按日期列出 Sonarr 监控的剧集在未来几天内播出的每一集(默认 7 天,最多 60 天),标记季首集和季终集,并标出已下载的剧集。指定片名时,可回答“这部剧什么时候回归?”,显示其接下来的剧集;如果尚未安排播出或已完结,也会说明。除非特别要求,否则不会显示 Sonarr 未监控的节目,并会报告这类节目的数量。
★ check_movie_status检查 Radarr 中是否有某部电影,以及其监控状态,并显示图片。
★ diagnose_missing_media追踪电影在 Radarr 元数据、历史记录和下载队列中的状态,以查明其缺失原因。
search_and_select_movies搜索 TMDb,并以带编号的网格显示匹配结果。
confirm_selected_choices将网格中选定编号对应的电影添加到 Radarr 并设为受监控,然后开始搜索下载。会报告已存在的电影,不会重复添加。使用指定的画质配置文件;若未指定,则使用 Settings 页面的 Radarr 选项卡中设置的默认配置文件;若那里也未设置,则使用 Radarr 的第一个配置文件。默认使用 Radarr 的第一个根文件夹,除非另行指定。
下载和索引器
工具功能
manage_stalled_downloadsAUDIT 会列出停滞或速度缓慢的 qBittorrent 下载及其哈希值;PURGE_STALLED 会根据你指定的哈希值删除对应下载及其文件,不会删除其他内容。
check_indexer_health报告故障、退避和已禁用的 Prowlarr 索引器,以及 Prowlarr 自身的警告。

后台任务

工具功能
plan_media_upgrade找出没有文件或分辨率低于 1080p 的电影,并将其安排为批量任务(仅限电影,默认每批最多 25 部)。
get_background_jobs列出任务及其进度。
update_job_status对任务执行 PAUSE、RESUME 或 CANCEL。恢复任务后,任务才会开始运行。
execute_next_job_step手动搜索任务中的下一部电影。已启动的任务也会由任务运行器自动推进,每分钟搜索一部电影。

基础设施和分析

工具功能
get_cluster_infrastructure_health查看每台 SSH 主机的 CPU、内存和 Docker 容器健康状况。
get_cluster_hardware_analytics以表格形式查看每台主机的 CPU 和内存使用情况。
trust_new_host_key重建受监控主机后,忘记其已记住的 SSH 密钥,以便下次检查时信任主机当前提供的密钥。仅当设置了 WEB_PASSWORD 时,仪表板上的 信任新密钥 按钮才会执行相同操作。
run_cluster_backup请求 Radarr、Sonarr 和 Prowlarr(已配置的应用)运行各自内置的数据库备份,等待每项备份完成(最长约一分钟;较慢的备份会报告为仍在运行),并确认有新的备份文件生成,同时报告文件名、大小和时间。备份保留在各应用自己的备份文件夹中;不会复制任何内容。
get_plex_activity通过 Tautulli 查看实时播放流和转码负载。
get_library_analytics通过 Tautulli 查看最常观看的标题、热门用户、平台和媒体库。

批量任务的工作方式。 plan_media_upgrade 会创建一个处于 PENDING 状态的任务;在你执行 RESUME 之前,不会运行任何操作。任务启动后,任务运行器会逐步推进,每个间隔(默认 60 秒)执行一次 Radarr 搜索,因此大型批次不会让索引器不堪重负。已暂停、已取消或待处理的任务不会被处理;如果任务连续失败三次(例如 Radarr 已停止运行),则会暂停该任务并向 Discord 报告。

安全

  • 在可信网络上运行。 它面向家庭局域网设计,未设计或测试用于暴露到公共互联网。如果确实需要从外部访问,请将其置于你信任的 HTTPS 和反向代理之后。请参阅 SECURITY.md 报告漏洞。
  • 设置 WEB_PASSWORD。 如果不设置,任何能够访问该端口的人都可以使用控制面板并更改其设置。
  • 密钥仅保留在服务端。 设置页面绝不会返回已保存的密钥或令牌;Plex 艺术图通过服务端代理获取,因此 Plex 令牌不会传到浏览器。
  • SSH 主机监控使用密钥认证,并会在首次使用时记住每台主机的密钥。 主机首次连接时,其密钥指纹会被保存;此后,如果密钥不同,连接会在发送任何命令之前被拒绝,且节点利用率页面会将该主机显示为离线,并提供 信任新密钥 按钮,供你在确实重建了主机时使用(该按钮需要 WEB_PASSWORD;如果未设置,请让 Claude Desktop 使用 trust_new_host_key)。如果未设置密码,你网络中的任何人都可能使用该按钮信任冒名顶替者,因此只有设置密码后才会提供该按钮。这可以防止首次联系后主机被替换成冒名顶替者;因此,如果你想确认首次连接的安全性,请将指纹与 ssh-keyscan -t ed25519 <host> | ssh-keygen -lf - 的结果进行比较。请使用专用的非特权用户,并将其置于你信任的网络中。
  • 有些工具会更改内容。 confirm_selected_choices 会添加电影并开始下载;manage_stalled_downloads 配合 PURGE_STALLED 使用时,会删除你在 AUDIT 后同意删除的种子及其文件;作业运行器会触发搜索。Claude Desktop 使用工具前会征求你的许可,因此请检查它提出的操作。
  • 镜像以非 root 用户(UID 65532)运行;请参阅只读和非 root 运行,进一步限制其权限。

开发

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

控制面板是 web/ 中一个独立的 npm 项目(使用 React、Vite 和 TypeScript,拥有自己的 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

测试使用 Node 内置的测试运行器,无需安装其他内容。测试使用临时数据库运行,绝不会读取你的真实 .env;服务凭据会从环境中移除,且除非测试安装了模拟对象,否则所有 HTTP 请求都会失败,因此运行测试不会触及你的真实服务。test/isolation.test.ts 会在上述任一隔离措施失效时令测试运行失败。

运行时说明

  • 状态(设置、作业历史记录、登录密钥)存储在 SQLite 数据库 data/plex_director.db 中;在容器中则位于 /app/data。
  • 使用官方 MCP SDK。
  • Query 聊天会使用上述工具调用 Anthropic API;除此之外,除 TMDb 的调用以及(如果你进行了设置)Discord 的调用外,没有任何内容会离开你的网络。

CI/CD

.github/workflows/ci.yml 包含三个作业:

  • 类型检查与审计(check)在每次向 main 推送以及每次针对 main 的拉取请求时运行:TypeScript 类型检查、测试套件、npm audit --audit-level=high,以及对 web/ 中的仪表盘执行相同的类型检查和审计。
  • 构建、冒烟测试与发布(publish)在每次向 main 推送、每次推送 v*.*.* 标签以及每次拉取请求时运行,并且仅在 check 通过后运行。每次运行都会构建镜像,并使用虚拟配置启动镜像以确认其正常运行。推送后会发布到两个镜像仓库(分支推送会标记为 latest 和提交 SHA;标签推送还会使用版本号,例如 1.2.3 和 1.2),运行 Docker Scout 漏洞扫描(结果会显示在作业摘要中,目前不会阻止发布),并使用 cosign 对两个镜像进行签名。
  • 创建 GitHub Release(release)仅在推送 v*.*.* 标签后运行,并在 publish 成功后创建带有自动生成说明的 Release。

此外,CodeQL 会在每次推送、每次拉取请求以及每周分析 TypeScript;OpenSSF Scorecard 每周评估仓库的供应链实践(见上方徽章);Dependabot 每周为 npm、Docker 基础镜像和 GitHub Actions 更新创建拉取请求,除非更新涉及主要版本,否则 CI 通过后会自动合并。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。