mcpField
B
Blink Camera

Blink Camera

本地服务
github.com媒体与设计05 周前更新

关于 Blink Camera

Blink Camera 是面向 Amazon Blink 摄像头及云台的 MCP 服务,供 MCP 客户端查看画面、获取摄像头状态并控制朝向。它管理 Blink 的实时会话,并在云台报告停止后才确认移动结果。

主要功能

  1. 01查询摄像头状态与朝向
  2. 02云台绝对角度与相对微调
  3. 03停止、归位与设置归位点
  4. 04执行 360° 全景扫转
  5. 05获取单帧图像
  6. 06管理并轮换实时会话

适用场景

  1. 01将 Blink 摄像头转向指定位置
  2. 02读取当前位置并微调视角
  3. 03拍摄当前画面的静态帧
  4. 04让多个使用方共享摄像头会话

MCP 相关

MCP 服务向客户端提供摄像头状态、云台控制和图像快照工具。它管理或复用 Blink 实时会话,并通过会话中的配件消息控制云台。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"abhijatsaxena-blink-camera": {
"command": "uvx",
"args": [
"blink-camera-mcp"
],
"env": {
"BLINK_USERNAME": "<BLINK_USERNAME>",
"BLINK_PASSWORD": "<BLINK_PASSWORD>",
"BLINK_2FA_FILE": "<BLINK_2FA_FILE>",
"BLINK_CAMERA_NAME": "<BLINK_CAMERA_NAME>",
"BLINK_STATE_FILE": "<BLINK_STATE_FILE>",
"BLINK_FFMPEG": "<BLINK_FFMPEG>"
}
}
}
}
启动命令uvx blink-camera-mcp
需要配置的环境变量
BLINK_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiblink-camera-mcp0.1.1

工具

8

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

blink-camera-mcp

ci pypi python

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 秒。由此带来两个后果:

  1. 任何想要使用摄像头的程序都必须保持会话开启并刷新会话。
  2. 云台支架并不是一个可以直接通信的设备。它没有自己的端点:它在摄像头的媒体会话内部运行,其位置会通过同一个套接字返回。只读取视频并跳过其他所有消息的客户端永远看不到这些流量,这也是云台多年来一直无法控制的原因。

本服务管理会话(或复用现有会话)、正确地处理帧、路由配件消息,并以闭环语义将所有功能公开为 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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。