内容
# reolink-mcp
一款适用于Reolink摄像头的开源MCP(Model Context Protocol)服务器:允许Claude或其他任何MCP客户端在本地网络上查看和控制Reolink摄像头。支持快照、设备状态、AI检测状态、PTZ预设和威慑控制(聚光灯、警报器、红外/白光LED)。仅限本地网络,无需云服务。
**市场空白(验证于2026-07-08):** GitHub、npm或PyPI上不存在专用的Reolink MCP服务器。最近的类似项目需要中间人:`dedsxc/mcp-frigate`(需要Frigate NVR),`homeassistant-mcp`(需要Home Assistant)。这是首个独立的细分市场。
用户添加`reolink-mcp`到其MCP客户端配置,询问“显示我前门摄像头”,并直接从摄像头获取实时快照,无需NVR或家庭自动化守护进程。
<!-- mcp-name: io.github.ed-dryha/reolink-mcp -->
## 快速入门
需要本地网络上可访问的Reolink摄像头及其管理员用户名/密码。
### 1. 创建摄像头配置
复制[`config.example.yaml`](config.example.yaml)到`~/.config/reolink-mcp/config.yaml`(或将`RMCP_CONFIG_FILE`指向磁盘上的其他副本):
```yaml
cameras:
front_door:
host: 192.168.1.44
username: admin
```
密码永远不会出现在该文件中。相反,为每个摄像头设置一个`RMCP_CAMERAS__<name>__PASSWORD`环境变量 - `<name>`必须与上面的YAML中的摄像头键完全匹配(小写蛇形命名):
```bash
RMCP_CAMERAS__front_door__PASSWORD=<camera-password>
```
> **并发会话限制:** Reolink摄像头只允许有限数量的并发会话。 `reolink-mcp`为每个配置的摄像头保持一个`reolink-aio`会话,直到服务器运行结束 - 在同一摄像头上运行另一个系统(例如NVR、另一个MCP服务器)可能会耗尽该限制。参见下面的[摄像头兼容性和会话限制](#camera-compatibility--session-limits)。
### 2. 添加到MCP客户端
**Claude 代码:**
```bash
claude mcp add reolink -- uvx reolink-mcp
```
**Claude 桌面版**(`claude_desktop_config.json` - macOS:`~/Library/Application Support/Claude/claude_desktop_config.json`,Windows:`%APPDATA%\Claude\claude_desktop_config.json`):
```json
{
"mcpServers": {
"reolink": {
"command": "uvx",
"args": ["reolink-mcp"],
"env": {
"RMCP_CAMERAS__front_door__PASSWORD": "<camera-password>"
}
}
}
}
```
**其他MCP客户端**(通用标准输入/输出):
```json
{
"command": "uvx",
"args": ["reolink-mcp"]
}
```
就这样 - 让您的MCP客户端询问“显示我前门摄像头”。
## 工具
基于[`reolink-aio`](https://github.com/starkillerOG/reolink_aio)和官方[MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)。每个工具都带有`readOnlyHint`/`destructiveHint`注解,以便MCP客户端可以控制审批 - 观察工具是只读的,控制工具会改变摄像头状态,而`set_siren`是唯一标记为破坏性的工具。
| 工具 | 类型 | 目的 | 破坏性 |
|------|------|---------|-------------|
| `list_cameras` | 观察 | 枚举每个配置的摄像头,带有实时连接状态、型号和主机 | 否 |
| `get_device_info` | 观察 | 摄像头的型号、固件、硬件详细信息 | 否 |
| `get_capabilities` | 观察 | 摄像头支持的功能 - PTZ、警报器、聚光灯、红外/白光LED、变焦、AI检测类型 - 中性功能词汇 | 否 |
| `get_states` | 观察 | 当前设备状态:日/夜模式、白光LED/聚光灯、红外灯、警报器功能和运动 | 否 |
| `get_recent_events` | 观察 | 当前AI检测状态(人/车辆/宠物以及摄像头报告的额外信息)来自按需轮询,以及普通运动标志 | 否 |
| `get_snapshot` | 观察 | 从摄像头获取实时静止图像,作为MCP图像内容块返回 | 否 |
| `set_siren` | 控制 | 声音或停止摄像头的警报器 - 约5秒安全默认值,60秒硬上限,超出上限请求拒绝不限制 | **是** |
| `set_audio_alarm` | 控制 | 启用或禁用摄像头的警报器/音频报警功能 - 当`set_siren`被固件接受但无声音时需要 | 否 |
| `set_spotlight` | 控制 | 打开或关闭摄像头的聚光灯 | 否 |
| `set_ir_lights` | 控制 | 将摄像头的红外灯设置为`auto`、`on`或`off` | 否 |
| `set_white_led` | 控制 | 打开或关闭摄像头的白光LED,带有可选亮度 | 否 |
| `set_zoom` | 控制 | 将摄像头缩放到绝对位置(0-100)或相对进/出步 | 否 |
| `list_presets` | 控制 | 列出摄像头的命名PTZ预设 | 否 |
| `ptz_move_to_preset` | 控制 | 将摄像头移动到命名(或数字)PTZ预设 | 否 |
| `ptz_position` | 控制 | 读取摄像头的当前平/倾/变焦位置,在接近时命名最近的保存预设 | 否 |
| `ptz_guard` | 控制 | 配置摄像头的PTZ守卫点和自动返回(`set`/`goto`/`enable`/`disable`) | 否 |
## 安全
- **`RMCP_READ_ONLY=true`** 启动服务器时,所有10个控制工具都被剥夺 - 它们根本不会被注册,而不是被隐藏。一行通知会打印到stderr;客户端会看到一个干净的、仅观察的服务器,其注册表中没有控制工具。
- **`set_siren`** 默认情况下,如果没有给出持续时间,则默认为约5秒的突发,并且拒绝任何超过60秒硬上限的请求 - 清晰的错误请求更短的持续时间。
- **功能控制:** 每个控制工具在发送任何命令之前检查目标摄像头的实际功能,然后干净地拒绝(例如,“摄像头“front_door”没有警报器”),而不是让不支持的功能的原始API错误到达客户端。
## 摄像头兼容性和会话限制
在开发过程中实时验证:
| 摄像头 | 验证功能 |
|--------|-------------------------|
| P437 | 警报器,聚光灯,变焦 |
| P320 | 红外灯 |
PTZ工具(`list_presets`,`ptz_move_to_preset`,`ptz_position`,`ptz_guard`)仅模拟验证 - 实际PTZ硬件验证待定。
**并发会话限制:** `reolink-aio`为每个摄像头在服务器进程生命周期内保持一个长会话。Reolink摄像头限制了单个摄像头可以接受的并发会话数量;在同一摄像头上运行`reolink-mcp`和其他独立持有会话的系统(NVR、Reolink自己的应用程序、第二个自动化堆栈)可能会达到该上限。该项目自己的开发设置在共享摄像头的第二个独立系统的情况下运行,并已在确切的同时性条件下进行测试 - 如果您看到登录/会话错误,请首先检查当前持有摄像头会话的其他设备。
## 许可证
MIT