关于 mediafleet
mediafleet 是用于编排已配置自托管媒体服务的 MCP 服务和命令行工具。它通过单个 JavaScript 沙盒工具调用多个服务,并可在一次运行中合并结果。
主要功能
- 01单个 MCP 工具运行 JavaScript 沙盒
- 02跨已配置媒体服务发起调用
- 03支持 GET、POST、PUT 和 DELETE 请求
- 04保存进程内代码片段
- 05返回生成的文件与捕获的日志
适用场景
- 01合并查询 Sonarr 和 Plex
- 02检查已配置服务的状态
- 03保存并重跑媒体工作流
MCP 相关
提供 `yarr` 工具,在沙盒中运行异步 JavaScript 函数,并将已配置的媒体服务作为可调用对象提供。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| code | string | 是 | 要在沙盒中执行的 JavaScript 异步箭头函数。 |
详细介绍
mediafleet
mediafleet 将整套可自托管媒体服务栈整合到一个 MCP
工具之后。无需为每项服务的每种操作分别提供一个工具,服务端只公开一个 Code Mode 工具 yarr:你向它传入一个 JavaScript 异步箭头
函数,它会在沙箱中运行,沙箱的全局变量是你配置的媒体服务对应的可调用对象——Sonarr、Radarr、Prowlarr、Tautulli、
Overseerr、Bazarr、SABnzbd、qBittorrent、Plex 和 Jellyfin。一次
调用即可查询三项服务、合并答案,并返回一个组合结果。
此软件包是对已记录功能界面进行的干净室重建。它实现了完整的已记录核心功能:下文所述的单个工具、沙箱全局变量、操作分发和代码片段存储。
配置
通过环境变量启用服务:
| 变量 | 含义 |
|---|---|
YARR_SERVICES | 以逗号分隔的已配置服务列表。未设置时,任何设置了 URL 变量的服务都视为已配置。 |
YARR_<SERVICE>_URL | 基础 URL,例如 YARR_SONARR_URL=http://localhost:8989。 |
YARR_<SERVICE>_API_KEY | API 密钥,通过 X-Api-Key 标头发送。 |
YARR_PLEX_TOKEN | Plex 的凭据,通过 X-Plex-Token 标头发送。 |
沙箱中只会出现已配置的服务。未配置的名称不会在其中定义,api.<service> 也不会为它们提供。
沙箱
code 参数是一个异步箭头函数。调用时不传入参数(运行代码片段时会传入输入;见下文),其返回值会被规范化为纯 JSON 形式的数据,并与写入的所有资源以及运行期间捕获的所有控制台输出一起,成为工具结果。
代码可用的全局变量:
- 每个服务对应的可调用对象——
sonarr、radarr等。调用其中一个会执行 GET 请求(await sonarr("/api/v3/series"));此外还附带.get、.post、.put和.delete(path, body),以及.status(),后者会探测服务的常规状态端点,并返回{service, ok, status}或{service, ok: false, error}。 api.<service>.get/post/put/delete(path, body)——每个已配置服务对应的显式 HTTP 接口。callTool(action, params)——用于分发已记录的操作。通用操作:service_status({service?})、api_get、api_post、api_put、api_delete(各自接受{service, path, body?})和help。Codemode 操作:codemode({code, input?}会运行嵌套代码,否则返回摘要)、op(传入{path}描述操作,传入{name, input?}运行代码片段,传入{code, input?}运行代码)、snippet_list、snippet_save({name, code})、snippet_run({name, input?})和snippet_delete({name})。codemode.search(query)——在服务、API 路径、操作和辅助函数目录中进行子字符串搜索。codemode.describe(path)——返回某个路径对应的目录条目,例如codemode.describe("api.sonarr.get")。codemode.snippets()——列出存储中的代码片段。codemode.run(name, input)——运行已保存的代码片段;其函数会接收input作为参数。writeArtifact(name, content)——存储命名的文本资源;运行期间写入的所有内容都会随该次运行的结果一并返回。console.log/info/warn/error——输出会被捕获并作为运行结果的logs返回,绝不会写入服务端的标准输出。
代码片段存储在每个进程独有的内存存储中:在服务端进程的生命周期内会跨调用保留,进程退出后即会消失。
有两点需要如实说明:沙箱使用 node:vm,它能隔离全局变量(其中没有 process 或 require),但并非经过加固的安全边界;破坏性动词也不会受到特别限制——如果代码发出 DELETE 请求,mediafleet 就会按原样执行。
安装
npx @reneturcios/mediafleet yarr '{"code":"async () => { return await callTool(\"help\"); }"}'
或者运行容器镜像:
docker run -i ghcr.io/cloudcorprecords/mediafleet
容器默认启动 MCP 服务。传入 CLI 参数即可将其用作 CLI。请记得将 YARR_* 环境变量传递给运行服务端的进程。
命令行
mediafleet yarr '{"code":"async () => { return await api.sonarr.get(\"/api/v3/system/status\"); }"}'
mediafleet yarr '{"code":"async () => { const s = await callTool(\"service_status\"); return s; }"}'
mediafleet --version
mediafleet mcp
退出代码:成功时为 0,执行或验证错误时为 1,
用法错误时为 2。
MCP 客户端配置
{
"mcpServers": {
"mediafleet": {
"command": "npx",
"args": ["-y", "@reneturcios/mediafleet", "mcp"],
"env": {
"YARR_SERVICES": "sonarr,radarr,plex",
"YARR_SONARR_URL": "http://localhost:8989",
"YARR_SONARR_API_KEY": "…",
"YARR_RADARR_URL": "http://localhost:7878",
"YARR_RADARR_API_KEY": "…",
"YARR_PLEX_URL": "http://localhost:32400",
"YARR_PLEX_TOKEN": "…"
}
}
}
}
MCP 工具
| 工具 | 参数 | 功能 |
|---|---|---|
yarr | code: string(必填) | 在 Code Mode 沙箱中执行异步箭头函数,并返回 {result, artifacts, logs}。 |
开发
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts — fake executor and fake fetch only, no network
npm run dev # tsx src/cli.ts
所有服务流量都通过单个可注入的执行器函数处理,默认执行器的 HTTP 请求则通过可注入的 fetch 处理,因此测试套件能够在无需连接实时服务的情况下测试整个功能面,包括 URL 和标头的构建。
许可证
MIT — 详见 LICENSE。版权所有 (c) 2026 Rene Turcios。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。