关于 Blink Camera
Blink Camera 是面向 Amazon Blink 摄像头及云台的 MCP 服务,供 MCP 客户端查看画面、获取摄像头状态并控制朝向。它管理 Blink 的实时会话,并在云台报告停止后才确认移动结果。
主要功能
- 01查询摄像头状态与朝向
- 02云台绝对角度与相对微调
- 03停止、归位与设置归位点
- 04执行 360° 全景扫转
- 05获取单帧图像
- 06管理并轮换实时会话
适用场景
- 01将 Blink 摄像头转向指定位置
- 02读取当前位置并微调视角
- 03拍摄当前画面的静态帧
- 04让多个使用方共享摄像头会话
MCP 相关
MCP 服务向客户端提供摄像头状态、云台控制和图像快照工具。它管理或复用 Blink 实时会话,并通过会话中的配件消息控制云台。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx blink-camera-mcpBLINK_USERNAMEBlink account email address.BLINK_PASSWORD密钥Blink account password.BLINK_2FA_FILE密钥Path to a file holding the 2FA code, when the account has verification enabled. The code is read from the file, never from the command line.BLINK_CAMERA_NAMEWhich camera to drive, when the account has more than one.BLINK_STATE_FILEWhere to cache the login token. Defaults to ~/.blink-mcp/state.json.BLINK_FFMPEGPath to the ffmpeg binary, if it is not on PATH.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
8收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
blink-camera-mcp
一个适用于 Amazon Blink 摄像头的 MCP 服务,还支持 云台支架——Blink 自带的 API 无法控制它移动。
使用 uvx blink-camera-mcp 安装。它已收录在官方 MCP Registry 中,名称为
io.github.AbhijatSaxena/blink-camera-mcp。
让任何 MCP 宿主——Claude Desktop、IDE Agent 或你自己的客户端——都能查看摄像头的朝向、控制其指向并通过摄像头查看画面。
camera_status where it points, travel limits, session state, stream URL
pan_tilt aim at an absolute angle, wait until the hardware confirms
pan_tilt_nudge turn relative to where it points now
pan_tilt_stop stop the motors
pan_tilt_home go to the saved home position
pan_tilt_set_home save the current angle as home
pan_tilt_overview 360° sweep
snapshot one still frame, returned as image content
为什么要开发它
Blink 摄像头是云端设备。它没有本地 API、ONVIF 或 UVC——视频只能通过 Blink 云端代理的短时会话获取,最长为 300 秒。由此带来两个后果:
- 任何想要使用摄像头的程序都必须保持会话开启并刷新会话。
- 云台支架并不是一个可以直接通信的设备。它没有自己的端点:它在摄像头的媒体会话内部运行,其位置会通过同一个套接字返回。只读取视频并跳过其他所有消息的客户端永远看不到这些流量,这也是云台多年来一直无法控制的原因。
本服务管理会话(或复用现有会话)、正确地处理帧、路由配件消息,并以闭环语义将所有功能公开为 MCP 工具。
安装
pip install blink-camera-mcp # or without installing: uvx blink-camera-mcp
发行包名为 blink-camera-mcp;安装后提供的命令为 blink-mcp。
你需要 Python 3.10+、Blink 账户,以及 PATH 中的 ffmpeg,供 snapshot 使用(如果它位于不常见的位置,请设置 BLINK_FFMPEG)。
配置
凭据通过环境变量提供,且只需在首次运行时设置:
export BLINK_USERNAME="[email protected]"
export BLINK_PASSWORD="..."
export BLINK_CAMERA_NAME="Front Door" # optional; defaults to the only camera
令牌会被缓存(仅缓存令牌材料,绝不会将密码写入磁盘),因此后续运行无需提供凭据。缓存位置默认为 ~/.blink-mcp/state.json;可通过 BLINK_STATE_FILE 覆盖。
如果 Blink 要求输入 2FA 验证码,服务不会提示你输入,也不会从文件以外的任何地方读取验证码:
export BLINK_2FA_FILE=/path/to/code.txt
将最新的验证码写入该文件;服务会读取一次,然后删除文件。这样可以避免有效凭据出现在聊天记录、Shell 历史记录和参数列表中。
将其添加到 MCP 宿主
blink-mcp --print-config
{
"mcpServers": {
"blink": {
"command": "uvx",
"args": ["blink-camera-mcp", "--stream-port", "9000"]
}
}
}
会自行管理 Python 的宿主(Claude Desktop、VS Code、LM Studio 等)会像上面一样运行 uvx。
如果你将其安装在虚拟环境中,请将 command 设为该环境的解释器,并将 args 设为
["-m", "blink_mcp", …]。
Claude Desktop — 一键安装
从发布页面下载
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
Hermes 的精选目录面向通过 OAuth 认证的远程服务,而本服务必须运行在能够连接到摄像头的机器上——因此,请将其作为普通的 stdio 服务添加到
~/.hermes/config.yaml 中:
mcp_servers:
blink:
command: "uvx"
args: ["blink-camera-mcp"]
env:
BLINK_USERNAME: "[email protected]"
BLINK_PASSWORD: "…"
重启会话(或运行 /reload-mcp),八个工具就会像其他工具一样显示出来。
两种运行方式
独立运行(默认) —— 服务端拥有摄像头的实时会话,并将视频发布到本地 TCP 端口(tcp://127.0.0.1:<port>,或使用 --stream-port 9000 指定固定端口)。如果还想把摄像头用作网络摄像头,可以将 OBS 指向该端口,并将其设为媒体源。
通过桥接服务运行 —— 如果实时会话已由其他程序占用:
blink-mcp --control-url http://127.0.0.1:9100 --stream-url tcp://127.0.0.1:9000
这很重要,因为 Blink 每个摄像头只允许一个实时会话:观看者和控制器必须共享该会话,或轮流使用。若有两个程序都坚持使用各自的会话,其中一个就会失败。
这里所说的“闭环”是什么意思
云台会在移动过程中报告角度。因此,pan_tilt 不会靠等待来碰运气:它发送命令后,只有在硬件报告电机已在目标角度停止时才会返回——通常不到一秒。
pan_tilt_nudge(+4) -> settled=True moved=True elapsed=0.67s -> pan=117 tilt=-75
pan_tilt_nudge(-4) -> settled=True moved=True -> pan=113 tilt=-75
为避免出现自信却错误的回答,我们特意设计了两种行为,因为相比失败,自信地给出错误答案更糟:
- 如果云台始终未确认,工具会失败,而不是返回它碰巧知道的最后角度(把过时的位置伪装成成功,会让 Agent 声称一次实际上并未发生的移动);
- 如果命令指定的角度与摄像头当前角度相同,则视为无操作,并报告
moved: false——这是成功,而非失败。
隐私与安全
snapshot会解码摄像头所拍摄画面中的一帧。工具描述对此有说明,并告知 Agent 仅在用户提出要求时使用。此工具不会自行捕获任何内容。- 服务端直接与 Blink 通信,令牌缓存不保存密码。
- 任何桥接控制平面在设计上都仅限环回地址:它会操控实体摄像头。
构建方式
配件通道没有公开文档。我们从官方 Android 应用中还原了该通道——通过 dex 字节码和原生库的符号表——随后在硬件上进行了验证:
frame [flag:1][id:4 big-endian][length:4 big-endian][payload]
send flag 0x14 INLINE_COMMAND, id = commandId
move=3 [0,0,0,0,<pan>,<tilt>,0] stop=4 home=5 set_home=6 overview=7
receive flag 0x15 ACCESSORY_MESSAGE, id = message id
POSITION=2 / HOME_POSITION=3 [<counter>,<pan>,<tilt>,<status>]
ROSIE_LIMITS=4 PAN_OVERVIEW_COMPLETE=5 lights/siren = 0/1/6/7
status 为 0x00 时表示空闲,为 0x10 时表示正在移动。角度以单个有符号字节表示。
我们正在将这些协议知识贡献给上游项目 blinkpy,让所有 Blink 集成都能受益,而不只是本服务。blink_mcp/immi.py 与提交给该项目的模块逐字节相同,并会在上游版本发布后自动切换到上游副本。
本项目基于 blinkpy,该项目实现了 Blink 云 API 和 IMMI 传输。
限制
- 已在搭配云台的 Blink Mini 上验证。其他摄像头系列使用不同的实时传输方式(通过 JSON-RPC 命令的 WebRTC,而非此二进制通道),目前尚不支持。
- 每个摄像头只允许一个实时会话,如上所述。
- Blink 将会话时长限制为 300 s;服务端会在约 270 s 时轮换会话,使用者不会察觉。
snapshot需要ffmpeg;它会从视频流中解码一帧,而不是开启第二个会话。
测试
pytest # 68 offline tests: protocol bytes, closed-loop logic, tool layer,
# a real stdio handshake, and a stub control plane
测试套件可离线运行,无需摄像头。使用真实硬件时:
python tests/live_smoke.py --state-file ~/.blink-mcp/state.json
此命令会登录,将摄像头移出后再移回,并捕获一帧画面。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。