内容
# rustarr
Rust MCP 和 CLI 服务器,适用于媒体自动化舰队:Sonarr, Radarr, Prowlarr, Tautulli, Overseerr, Bazarr, Tracearr, SABnzbd, qBittorrent, Plex, 和 Jellyfin.
`rustarr` 是一个上游客户端 MCP 服务器。它不试图取代这些应用程序或镜像每个 REST 端点作为 Web UI。它的任务是为代理提供一个一致的工具表面,为操作员提供一个等效的 CLI 表面。
## 界面
| 界面 | 状态 | 目的 |
|---|---:|---|
| MCP | 必需 | 通过服务命名工具的代理面对工具调用 |
| CLI | 必需 | 用于调试和自动化的可脚本化对等表面 |
| REST | 不发货 | 上游客户端服务器不公开本地 REST 操作 API |
| Web | 不发货 | 上游客户端服务器不提供嵌入式 Web UI |
每个业务操作都在 `src/app/` 下实现,并通过 MCP 和 CLI 暴露。`src/mcp/tools.rs` 和 `src/cli.rs` 解析输入并仅委托。
CLI 是 **服务分组** 的(`rustarr <服务> <命令> [标志]`);MCP 通过 `action` 调度每个服务类型的工具。CLI ↔ MCP 对等性由 `tests/parity.rs` 机械强制执行。
## 通用操作
这些适用于每个配置的服务类型:
| 操作 | 范围 | CLI | 描述 |
|---|---|---|---|
| `integrations` | `rustarr:read` | `rustarr integrations` | 列出支持的服务和配置的服务名称(不含密钥) |
| `service_status` | `rustarr:read` | `rustarr <服务> status` | 获取上游服务状态端点 |
| `api_get` | `rustarr:write` | `rustarr <服务> get --path <路径>` | 代理一个安全的凭证 GET 请求到配置的服务 |
| `api_post` | `rustarr:write` | `rustarr <服务> post --path <路径> --body <json> --confirm` | 代理一个确认的 POST 请求到配置的服务 |
| `api_put` | `rustarr:write` | `rustarr <服务> put --path <路径> --body <json> --confirm` | 代理一个确认的 PUT 请求到配置的服务 |
| `api_delete` | `rustarr:write` | `rustarr <服务> delete --path <路径> --confirm` | 代理一个确认的 DELETE 请求到配置的服务 |
| `help` | 公共 | `rustarr help` | 返回操作参考 |
路径必须是相对 API 路径。查询字符串密钥(如 `apikey=`、`token=` 和 `X-Plex-Token`)被拒绝;凭证属于配置或环境变量。
## 精选命令
除了通用直通外,每个功能都暴露了精选的、精简的、确认门控命令。运行 `rustarr --help` 获取生成的每个服务列表,或运行 `rustarr help` 获取 JSON 操作参考。读取操作为 `rustarr:read`;变异命令为 `rustarr:write`。两种确认行为适用:
- **Arr 意图命令**(`set-quality`、`add`、`delete`、`search`、`refresh`、`monitor`/`unmonitor`)在缺少 `--confirm` 时返回结构化的试运行 **预览**,并且仅在传递 `--confirm` 时才会变异。
- **所有其他变异命令**(下载 `add`/`pause`/`resume`/`remove`、请求 `create`/`approve`/`decline`、媒体 `scan`、索引器 `test` 和通用 `api_post`/`api_put`/`api_delete`)**需要** `--confirm`,并且在没有它时会出错。
| 功能(类型) | 示例命令 |
|---|---|
| ArrManager (sonarr, radarr) | `rustarr sonarr list`、`rustarr sonarr set-quality --from X --to Y --confirm`、`wanted`、`queue`、`history`、`add`、`delete` |
| Indexer (prowlarr) | `rustarr prowlarr indexers`、`search --query X`、`stats`、`test --confirm` |
| DownloadClient (sabnzbd, qbittorrent) | `rustarr qbittorrent queue`、`add --url X --confirm`、`pause`、`resume`、`remove --hash H --confirm` |
| MediaServer (plex, jellyfin) | `rustarr plex sessions`、`libraries`、`search --query X`、`scan --library N --confirm` |
| Requests (overseerr) | `rustarr overseerr requests`、`request --media-type movie --media-id N --confirm`、`approve`、`decline`、`search` |
| Stats (tautulli) | `rustarr tautulli activity`、`history`、`users`、`libraries` |
Tracearr 和 bazarr 尚未有精选的界面 - 使用通用直通。
## 配置
复制 `.env.example` 或使用 `config.example.toml` 作为起点。常见变量:
```bash
RUSTARR_MCP_HOST=127.0.0.1
RUSTARR_MCP_PORT=40070
RUSTARR_MCP_TOKEN=change-me
RUSTARR_SERVICES=sonarr,radarr,prowlarr,tautulli,overseerr,bazarr,tracearr,sabnzbd,qbittorrent,plex,jellyfin
RUSTARR_SONARR_URL=http://sonarr:8989
RUSTARR_SONARR_API_KEY=...
RUSTARR_RADARR_URL=http://radarr:7878
RUSTARR_RADARR_API_KEY=...
RUSTARR_QBITTORRENT_URL=http://qbittorrent:8080
RUSTARR_QBITTORRENT_USERNAME=...
RUSTARR_QBITTORRENT_PASSWORD=...
RUSTARR_PLEX_URL=http://plex:32400
RUSTARR_PLEX_TOKEN=...
```
`*_API_KEY` 模式涵盖了大多数 Arr 样式的服务。qBittorrent 使用用户名/密码登录。Plex 和 Jellyfin 令牌头单独处理。
## 运行
```bash
cargo run -- integrations
cargo run -- radarr status
cargo run -- sonarr get --path /api/v3/system/status
cargo run -- radarr post --path /api/v3/command --body '{"name":"RefreshMovie"}' --confirm
# 精选命令
cargo run -- sonarr list
cargo run -- tautulli activity
cargo run -- serve
cargo run -- mcp
```
HTTP MCP 端点:
```bash
curl -s http://127.0.0.1:40070/mcp \
-H "Authorization: Bearer $RUSTARR_MCP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"sonarr","arguments":{"action":"integrations"}}}'
```
## MCP 客户端配置
可流式 HTTP:
```json
{
"mcpServers": {
"rustarr": {
"url": "http://127.0.0.1:40070/mcp",
"headers": {
"Authorization": "Bearer ${RUSTARR_MCP_TOKEN}"
}
}
}
}
```
标准输入输出:
```json
{
"mcpServers": {
"rustarr": {
"command": "/path/to/rustarr/target/release/rustarr",
"args": ["mcp"],
"env": {
"RUST_LOG": "info,rustarr=debug"
}
}
}
}
```
## 架构
```text
RustarrClient (src/rustarr.rs) 网络调用和身份验证头
↓
RustarrService (src/app.rs) 验证、服务查找、响应塑形
↓
MCP shim (src/mcp/tools.rs) JSON 参数 -> 服务 -> 值
CLI shim (src/cli.rs) argv -> 服务 -> 标准输出
```
服务层拥有业务规则:
- 支持的服务目录和配置查找
- 安全路径验证
- 凭证隐藏
- qBittorrent 登录流程
- 响应规范化
## 开发
```bash
cargo fmt --check
cargo test
cargo clippy -- -D warnings
cargo build --release
```
有用的文档:
- `docs/API.md` 操作合约
- `docs/CONFIG.md` 环境和配置详情
- `docs/QUICKSTART.md` 本地烟雾测试
- `docs/MCP_SCHEMA.md` 模式漂移规则
- `plugins/rustarr/README.md` 和 `plugins/rustarr/skills/rustarr/SKILL.md` 插件打包