blink-camera-mcp 是一个 MCP 服务器,用于控制 Amazon Blink 摄像头,特别是 Blink 官方 API 无法移动的云台底座。它通过未公开的配件协议实现查看、瞄准(平移/俯仰)和画面捕获,可接入任何 MCP 主机,如 Claude Desktop、IDE 智能体或自建客户端。
用途: Blink 摄像头是云设备,没有本地 API、ONVIF 或 UVC,视频仅以短时云会话形式存在(上限 300 秒)。任何使用摄像头的程序都必须保持会话并刷新。云台底座没有独立端点,它由摄像头媒体会话内部驱动,位置也通过同一 socket 返回。只读取视频而忽略其他消息的客户端永远看不到这些流量,因此云台多年来似乎无法控制。该服务器负责持有(或复用)会话、正确封装、路由配件消息,并以 MCP 工具形式暴露闭环控制语义。
主要能力:
- 查看摄像头指向位置及云台行程限制。
- 按绝对角度或相对角度瞄准摄像头,并确认新位置。
- 抓取画面(snapshot),从现有流中解码一帧,不额外开启会话。
- 闭环控制:云台移动时会上报角度,pan_tilt 发送指令后仅在硬件报告电机停在目标角度时返回,通常远低于一秒。
- 两种有意的行为:如果云台从未确认,工具会失败,而不是返回最后已知角度(避免智能体宣布未发生的移动);如果指令指向当前角度,则视为无操作并报告 moved: false(成功而非失败)。
使用方式: 安装:uvx blink-camera-mcp。该发行版名称为 blink-camera-mcp,安装的命令是 blink-mcp。已在官方 MCP Registry 登记为 io.github.AbhijatSaxena/blink-camera-mcp。 需要 Python 3.10+、Blink 账号,以及用于 snapshot 的 ffmpeg(若 ffmpeg 路径特殊,可设置 BLINK_FFMPEG)。 凭据来自环境变量,仅首次运行需要。令牌会被缓存(仅令牌材料,密码绝不写入磁盘),后续运行无需凭据。缓存位置默认为 ~/.blink-mcp/state.json,可用 BLINK_STATE_FILE 覆盖。 如果 Blink 要求 2FA 验证码,服务器不会提示,也不会从其他任何地方获取验证码,只从文件读取:将最新验证码写入该文件,读取一次后删除。这能避免实时凭据出现在聊天日志、shell 历史或参数列表中。 添加到 MCP 主机:
- 自行管理 Python 的主机(Claude Desktop、VS Code、LM Studio 等)直接运行 uvx。
- 若安装到 virtualenv,将 command 设为该解释器,args 设为 ["-m", "blink_mcp", ...]。
- Claude Desktop 一键安装:从 releases 页面下载 blink-camera-mcp-0.1.1.mcpb 并打开。Claude Desktop 会提示输入 Blink 邮箱和密码(保存在操作系统钥匙串中),仅当账号使用验证时才要求 2FA 验证码文件。该捆绑包不包含服务器代码,依赖 PyPI 上的此包,因此不会偏离发布版本。
- LM Studio、VS Code、Cursor、Cline 等:都读取相同的 JSON,粘贴到主机的 MCP 配置中(LM Studio: mcp.json;VS Code: .vscode/mcp.json;Cursor: .cursor/mcp.json;Cline 从 README 安装)。
- Hermes 的精选目录用于远程 OAuth 认证服务器,而此服务器必须在能访问摄像头的机器上运行,因此请在 ~/.hermes/config.yaml 中作为普通 stdio 服务器添加,重启会话(或 /reload-mcp)后八个工具会像其他工具一样出现。
两种运行模式:
- 独立模式(默认):服务器持有摄像头实时会话,并将视频发布到本地 TCP 端口(tcp://127.0.0.1:<port>,或使用 --stream-port 9000 固定端口)。可将 OBS 指向它作为媒体源,把摄像头当作网络摄像头。
- 针对桥接模式:如果其他程序已经持有会话,可复用该会话。这很重要,因为 Blink 允许每个摄像头一个实时会话:查看器和控制器必须共享或轮流使用。同时运行两个各自要求独立会话的程序会导致其中一个失败。
适用场景: 适用于需要以编程方式查看、瞄准和捕获 Blink 摄像头画面的场景,尤其是带云台底座的 Blink Mini。可集成到 Claude Desktop、IDE 智能体、OBS 等。
限制:
- 已在带云台底座的 Blink Mini 上验证。其他摄像头系列使用不同的实时传输(WebRTC 配合 JSON-RPC 命令,而非此二进制通道),暂不支持。
- 每个摄像头一个实时会话。
- Blink 将会话限制为 300 秒;服务器约在 270 秒时轮换,消费者无感知。
- snapshot 需要 ffmpeg;它从流中解码一帧,而不是打开第二个会话。
- 隐私与安全:snapshot 会解码摄像头指向的任何一帧。工具描述中已说明,并告知智能体仅在用户要求时使用。服务器自身不会捕获任何内容。服务器直接与 Blink 通信,令牌缓存不保存密码。任何桥接控制平面设计上仅限回环,因为它会移动物理摄像头。
构建方式: 配件通道未公开,是从官方 Android 应用中恢复的(dex 字节码和本机库符号表),并针对硬件验证:状态 0x00 为空闲,0x10 为移动中。角度为有符号单字节。相同的协议知识正在上游贡献给 blinkpy,使所有 Blink 集成受益,而不仅仅是此服务器。blink_mcp/immi.py 与提交给上游的模块字节完全相同,并在上游发布后自动切换到上游副本。基于 blinkpy,它实现了 Blink 云 API 和 IMMI 传输。