关于 UniFi Protect MCP
UniFi Protect MCP 是一个 MCP 服务,用于管理 UniFi Protect 摄像头、事件、录像和智能检测。它面向 AI 助手和其他 MCP 客户端,默认只读,所有修改操作均采用先预览后确认的流程。
主要功能
- 01摄像头查询、快照、RTSP 流与 PTZ 控制
- 02历史事件与智能检测(人员、车辆、动物、包裹)查询
- 03Find Anything 检测搜索与缩略图
- 04录像状态、可用性查询与片段导出
- 05Known Faces、车牌、灯光、传感器与门铃管理
- 06Alarm Manager 告警规则管理
适用场景
- 01查询指定时间段内某摄像头的人员或车辆检测事件
- 02检查摄像头离线或连接异常情况
- 03导出夜间某段时间的录像片段
- 04通过 AI 助手调整灯光或摄像头设置前先预览变更
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露 UniFi Protect 的各类工具,包括摄像头、事件、录像和告警等。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx unifi-protect-mcpUNIFI_HOSTController IP/hostnameUNIFI_USERNAME密钥Admin usernameUNIFI_PASSWORD密钥Admin passwordUNIFI_API_KEY密钥API key (optional, experimental)UNIFI_PORTController HTTPS portUNIFI_VERIFY_SSLSSL certificate verification本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
UniFi Protect MCP 服务器
为 AI 助手及其他支持 MCP 的客户端提供 UniFi Protect 工具的 MCP 服务。可查询摄像头、事件、智能检测、「查找所有内容」检测搜索、录像、灯光、传感器、蜂鸣器、已知人脸、车牌和 Alarm Manager,并采用默认安全的权限设置,所有变更操作都须先预览再确认。
通过 HTTP 集成的软件,包括自动化服务和 MCP 适配器,应使用 unifi-api-server 执行 REST 和 GraphQL 查询、操作及 SSE 事件。
安装
Claude Code(推荐)
此插件会安装 MCP 服务、用于发现工具的 Agent 技能,以及引导式设置命令:
/plugin marketplace add sirkirby/unifi-mcp
/plugin install unifi-protect@unifi-plugins
然后运行交互式设置,配置控制器连接:
/unifi-protect:unifi-protect-setup
此流程会引导你输入控制器主机、凭据和权限偏好。凭据通过文件或命令提供,不会在聊天中输入。设置结果会保存为插件的 Claude Code 选项,并应用于每个项目;作为选项输入的密码或 API 密钥会存储在系统钥匙串中。完成设置后,启动新的 Claude Code 会话以连接。
从 1.0.0 之前的插件版本升级,该版本将设置保存在项目的 .claude/settings.local.json 中?请参阅插件升级指南。
Codex
注册市场,然后在 Codex 的 /plugins 界面中安装 unifi-protect:
codex plugin marketplace add sirkirby/unifi-mcp
安装后,让 Codex 使用 UniFi Protect 设置技能。设置会将版本固定的 MCP 服务条目及控制器设置保存到 Codex 的 config.toml 中,并提示你重启 Codex。每次升级插件后,都使用 --refresh 重新运行设置。
PyPI / Docker
# PyPI
uvx unifi-protect-mcp@latest
# or: pip install unifi-protect-mcp
# Docker
docker pull ghcr.io/sirkirby/unifi-protect-mcp:latest
# From source
git clone https://github.com/sirkirby/unifi-mcp.git
cd unifi-mcp && uv sync
使用示例
连接后,只需用自然语言向 AI Agent 提问:
“列出过去一小时检测到运动的所有摄像头”
“显示今天前门摄像头的智能检测事件——仅限人员和车辆”
“查找本周车道中的白色厢式货车检测记录”
“本周哪些摄像头的运动事件最多?有没有异常模式?”
“有没有摄像头离线或连接质量下降?”
“显示昨晚凌晨 2 点到 5 点之间车道摄像头的所有录像事件”
“今天哪些传感器触发了警报?读数是多少?”
所有摄像头和事件查询默认均为只读。变更操作(摄像头设置、灯光控制)须遵循先预览再确认流程。
配置
在服务器的进程环境中设置这些变量。插件设置技能已为 Codex 和 OpenClaw 完成此操作;在 Claude Code 中,插件会将其选项映射到这些变量。服务器不会自动加载 .env 或工作目录中的 YAML 文件;请在启动器中显式加载可信的环境文件(支持 Docker env_file:),或使用绝对路径 CONFIG_PATH 选择自定义 YAML。迁移示例请参阅配置。
如果未配置控制器主机,服务器仍会以设置模式启动:告知客户端如何进行配置,仅提供只读的 protect_setup_status 工具,并且不会连接任何控制器。
# Server-specific variables (recommended)
UNIFI_PROTECT_HOST=192.168.1.1 # Controller IP or hostname
UNIFI_PROTECT_USERNAME=admin # Local admin username
UNIFI_PROTECT_PASSWORD=your-password # Admin password
# Optional:
# UNIFI_PROTECT_API_KEY= # Required for camera HDR/mic volume and light power/brightness/PIR settings
# UNIFI_PROTECT_PORT=443 # Controller HTTPS port
# UNIFI_PROTECT_VERIFY_SSL=false # SSL certificate verification
摄像头 HDR 和麦克风音量,以及泛光灯功率、亮度、PIR 灵敏度和持续时间,现在使用 uiprotect 16.x 提供的 Protect 公共 Integration API。
使用这些设置前,请设置 UNIFI_PROTECT_API_KEY(或共享备用变量 UNIFI_API_KEY),然后重启服务器。其他 Protect 操作仍需会话凭据。缺少密钥或设备 ID 与公共 API 不兼容时,会在写入请求中的任何设置之前失败。
麦克风音量更新接受 1–100;公共 API 不接受 0。保留现有 HDR 别名:true/on/normal 表示 auto,false 表示 off,而 always/superHdr 表示公共 HDR 的 on。灯光亮度仍为 1–6,灵敏度为 0–100,持续时间为 15–900 秒。light_on 和 is_light_on 是等效输入,用于控制强制照明;关闭强制照明不会停用运动触发照明。
设置更新仍受预览/确认和策略门控约束。写入前会验证请求;控制器故障仍可能导致部分更新。更新失败时会返回错误及已应用的设置,调用方可先检查当前状态,再重试。
备用方案: 共享的 UNIFI_* 变量(例如 UNIFI_HOST)也可使用。服务器会优先检查 UNIFI_PROTECT_*,若未设置服务器专用变量,则回退到 UNIFI_*。对于单控制器配置,只需使用共享变量。
MCP 响应大小
对于已提供结构化输出的工具结果,默认响应模式为 adaptive。它根据 MCP 初始化期间公布的规范日期格式 protocolVersion 对每个请求进行分类,而不依据客户端的产品名称或应用版本。对于公布 MCP 2025-06-18 或更高版本的请求,响应会在 content 中提供简洁内容,并在 structuredContent 中完整提供一次结果;对于公布更早版本(如 2024-11-05 或 2025-03-26)的请求,或版本元数据缺失或格式错误的请求,则会在 content 中保留完整的兼容性 JSON。将 UNIFI_PROTECT_MCP_CONTENT_MODE 设为 compat,可强制使用重复的兼容格式;设为 compact,可在协商请求之外强制使用简洁文本加完整结构化输出。此服务专用变量优先于 UNIFI_MCP_CONTENT_MODE;对于任何只从 content 获取完整结果的客户端,无论其公布的版本如何,都应使用 compat。
惰性加载元工具(*_tool_index、*_execute、*_batch、*_batch_status 和仅用于惰性加载的 *_load_tools)仍然仅提供 content;它们不属于上述 2025-06-18 之前的协议类别。对于结构化的内部结果,*_execute 和 *_batch_status 会在 content 中提供一个规范化的 JSON 载荷,而不是嵌套的传输对;仅提供 content 的执行结果保持不变。响应模式不会将这些元工具转换为使用 structuredContent。
启用 Network 并同时启用 Protect 时,其最大来源响应会分别受到限制:unifi_get_dashboard 默认使用 summary=true,而 unifi_list_rogue_aps 默认返回最多包含 100 条记录的摘要页面;summary=false 会恢复完整的所选数据。
AI 驱动的警报需要 SuperAdmin。 警报规则工具(
protect_alarm_list_rules/protect_alarm_get_rule/protect_alarm_create_rule/protect_alarm_update_rule/protect_alarm_delete_rule)会在账号为 SuperAdmin 时透明地使用现代 UniFi-OS Alarm Manager,否则回退到经典自动化视图。现代路径会显示和管理 AI 驱动的警报(例如 AI Natural Language);旧版路径无法查看这些规则,且响应会包含一条标准 MCP_meta提示,说明视图受限。要查看或管理 AI 警报,请在运行 Protect 的控制台上为账号授予 SuperAdmin 权限。影响范围:在独立的 UNVR 上,权限仅限于 Protect;在组合式 UDM 控制台上,SuperAdmin 还会授予 Network/UniFi-OS 控制权限。
敏感响应字段
Protect 工具在向 MCP 客户端返回数据前,默认会对包含机密信息的流字段进行脱敏。这包括来自 protect_get_camera_streams 的 RTSP/RTSPS 流别名和 URL。当可信的本地管理进程需要原始流值时,可将 UNIFI_PROTECT_REDACT_SENSITIVE_FIELDS=false 或全局 UNIFI_REDACT_SENSITIVE_FIELDS=false 策略标志设为禁用脱敏。
运行
# stdio transport (default -- for Claude Desktop, LM Studio, etc.)
unifi-protect-mcp
# Docker
docker run -i --rm \
-e UNIFI_PROTECT_HOST=192.168.1.1 \
-e UNIFI_PROTECT_USERNAME=admin \
-e UNIFI_PROTECT_PASSWORD=secret \
ghcr.io/sirkirby/unifi-protect-mcp:latest
Claude Desktop
添加到 claude_desktop_config.json:
{
"mcpServers": {
"unifi-protect": {
"command": "uvx",
"args": ["unifi-protect-mcp"],
"env": {
"UNIFI_PROTECT_HOST": "192.168.1.1",
"UNIFI_PROTECT_USERNAME": "admin",
"UNIFI_PROTECT_PASSWORD": "your-password"
}
}
}
}
功能
- 摄像头 -- 列出、检查、拍摄快照、查看 RTSP 流、PTZ 控制、设置、录制开关、重启
- 事件 -- 查询历史事件、智能检测(人员/车辆/动物/包裹)、查找任何内容的检测搜索、缩略图
- 实时流 -- WebSocket 事件缓冲区,支持 MCP 资源订阅和轮询
- 录制 -- 状态、可用性、支持延时摄影的片段导出
- 已知人脸 -- 列出、重命名、合并和移除人脸识别组
- 设备 -- 灯具(亮度、PIR 灵敏度)、传感器(温度、湿度、运动)、门铃(音量、触发)
- 实时视图 -- 列出和检查多摄像头布局
- 系统 -- NVR 信息、健康指标、固件状态、已连接的查看者
Agent 技能
Protect 插件附带一项可与 MCP 工具配合使用的 Agent 技能:
安全摘要
跨产品事件情报,可汇总所有已连接的 UniFi 系统并生成简明的安全摘要。
- 来源: Protect 摄像头事件、Access 门禁事件、Network 防火墙活动
- 严重程度分类: 根据时段背景(工作时间、非工作时间或深夜)和事件类型(人员检测、车辆、门禁访问、防火墙拦截等)对事件进行分类
- 跨产品关联: 五条内置关联规则可发现跨产品的模式:
- 门口摄像头检测到移动,但没有对应的刷卡记录
- 短时间内多次门禁访问失败
- 人员检测与同一时段的防火墙拦截同时发生
- 非工作时间的摄像头活动没有对应的 Access 事件
- 周界反复检测到车辆
- 活动计数: 汇总所有来源的总数,便于快速了解概况
安装插件后,通过技能命令调用:
/unifi-protect:security-digest
事件改进
事件响应中的 camera_name
现在,所有与事件相关的工具都会在每个事件对象中同时返回 camera_name 和 camera_id。摄像头名称从启动时缓存的引导数据中解析,无需额外的 API 调用。
受影响的工具:protect_list_events、protect_list_smart_detections、protect_recent_events
之前:
{ "camera_id": "abc123", "type": "motion", ... }
之后:
{ "camera_id": "abc123", "camera_name": "Front Door", "type": "motion", ... }
这样就无需再单独调用 protect_list_cameras 来将 ID 映射为名称。
紧凑模式
protect_list_events 和 protect_list_smart_detections 接受 compact=true 参数,可从响应中移除低信号字段:thumbnail_id、category、sub_category 和 is_favorite。这样生成的响应体积约可缩小 40%。
# Standard call
protect_list_events(limit=50)
# Compact — recommended for digests, summaries, and context-constrained workflows
protect_list_events(limit=50, compact=True)
在生成摘要或将事件传入对 token 预算敏感的下游提示词时,建议默认使用紧凑模式。
文档
- 配置 -- 完整的环境变量参考、YAML 配置、Protect 专属选项
- 权限 -- 权限系统、类别默认值、如何启用变更操作
- 工具目录 -- 按类别整理的全部 63 个工具
- 事件流 -- 实时事件架构、MCP 资源、轮询
- 故障排除和支持包 -- 经审核的支持证据、连接问题、SSL、缺失的工具
开发
cd apps/protect
make test # Run tests
make lint # Lint
make format # Format
make manifest # Regenerate tools_manifest.json
make pre-commit # All of the above
完整的 Monorepo 工作流请参阅根目录中的 CONTRIBUTING.md。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。