配套MCP
MCP服务器 Bitfocus伴侣.公开了53个工具,涵盖了经过验证的按钮控制、样式、页面发现、运行时摘要、库存差异、检查点回滚/恢复工作流、预设管理、变量管理和批处理显示编程,因此AI助手可以通过Companion的当前API操作Stream Deck表面和其他Companion连接的设备。
该仓库还包括一个轻量级的本地浏览器UI,供那些希望在不手动发出MCP工具调用的情况下获得相同验证流的人使用。
为什么存在
Companion是将实时生产堆栈连接在一起的物理按钮层。操作员按下Stream Deck按钮,它会发出grandMA2提示,触发Resolume片段,或启动激光序列。但是对这些按钮进行编程是手动的——你一次点击一个按钮,配置操作、标签和颜色。
这个MCP服务器允许AI完成这项工作。它可以读取您当前的按钮布局,在应用更改之前预览更改,并在几秒钟内对整个页面进行批处理。结合MA2 Agent和Resolume MCP,AI助手可以从一次对话中对整个节目控制界面进行编程。
快速开始
git clone https://github.com/drohi-r/companion-mcp && cd companion-mcp
uv sync
uv run python -m companion_mcp浏览器用户界面
运行本地操作员UI:
uv run companion-mcp-ui然后打开:
http://127.0.0.1:8088UI首先是本地的。它与MCP工具位于相同的后端逻辑之上,因此经过验证的写入、快照、预设和回滚在浏览器中的行为与通过MCP的行为相同。
确保Companion正在目标主机和端口上运行。当前Companion版本使用:
- 用于按钮操作和样式写入的HTTP端点
- websocket-tRPC位于
/trpc用于更丰富的读取、发现、预览和变量检查
配置
| 变量 | 默认值 | 描述 |
|---|---|---|
COMPANION_HOST | 127.0.0.1 | 配套实例IP |
COMPANION_PORT | 8000 | 配套HTTP和websocket端口 |
COMPANION_TIMEOUT_S | 10.0 | HTTP请求超时(秒) |
COMPANION_ALLOWED_HOSTS | 127.0.0.1,localhost,::1 | 目标主机的逗号分隔的列表。集 * 允许任何。 |
COMPANION_WRITE_ENABLED | 1 | 设置为 0 用于只读模式 |
COMPANION_TRANSPORT | stdio | MCP传输(stdio, sse, streamable-http) |
COMPANION_UI_HOST | 127.0.0.1 | 浏览器UI绑定地址 |
COMPANION_UI_PORT | 8088 | 浏览器UI端口 |
建筑
graph TD
A["Companion MCP Server
companion_mcp
53 tools · safety gate"] --> B
B["HTTP Client
Button actions · style writes"] --> D
A --> C
C["WebSocket tRPC Client
Discovery · preview · variables"] --> D
D["Bitfocus Companion
HTTP + WebSocket at /trpc"]
E["Browser UI
companion-mcp-ui
Local operator console"] -.-> A
F["Snapshot Engine
Inventory · presets · rollback"] -.-> A
G["Verification Layer
Render polling · diff · transactions"] -.-> A
style A fill:#1a1a2e,stroke:#14B8A6,color:#fff
style B fill:#1a1a2e,stroke:#14B8A6,color:#fff
style C fill:#1a1a2e,stroke:#14B8A6,color:#fff
style D fill:#1a1a2e,stroke:#0f3460,color:#fff
style E fill:#0f3460,stroke:#0f3460,color:#fff
style F fill:#0f3460,stroke:#0f3460,color:#fff
style G fill:#0f3460,stroke:#0f3460,color:#fff工具
发现和阅读
用于了解Companion当前状态的安全只读工具。
| 工具 | 它做什么 |
|---|---|
get_server_config | 返回当前MCP服务器配置和安全设置 |
health_check | Probe Companion API可达性和返回状态 |
list_surfaces | 列出连接的控制面(流甲板等) |
get_button_info | 读取特定按钮的当前控件和预览状态 |
get_button_runtime_summary | 返回按钮的紧凑的面向操作员的运行时摘要 |
get_page_grid | 从页面读取矩形按钮网格 |
snapshot_page_inventory | 导出具有简洁按钮摘要、样式、反馈和预览哈希的页面区域 |
save_page_inventory_snapshot | 将命名页面清单检查点保存到磁盘 |
load_page_inventory_snapshot | 从磁盘加载已保存的页面清单检查点 |
list_page_inventory_snapshots | 列出已保存的页面库存检查点文件 |
delete_page_inventory_snapshot | 删除已保存的页面清单检查点文件 |
diff_page_inventory | 比较两页库存快照并总结更改的按钮 |
preview_restore_page_style_from_inventory | 将保存的库存快照转换为还原计划,而无需写入Companion |
preview_restore_page_style_from_snapshot | 从已命名的已保存快照预览还原计划 |
save_page_style_preset | 将当前页面样式条目另存为可重复使用的预设 |
load_page_style_preset | 加载已保存的页面样式预设 |
list_page_style_presets | 列出已保存的页面样式预设 |
delete_page_style_preset | 删除已保存的页面样式预设 |
preview_apply_page_style_preset | 预览应用带有可选偏移量的已保存页面样式预设 |
find_buttons | 按可见文本、控件id、控件类型、连接id或定义id搜索页面区域 |
export_page_layout | 将页面区域导出为可重用的布局有效负载 |
get_custom_variable | 读取Companion自定义变量 |
get_module_variable | 从Companion模块连接读取变量 |
snapshot_custom_variables | 在一次调用中读取自定义变量的命名列表 |
verify_button_render_change | 将当前按钮预览哈希与上一个进行比较 |
预览(写作前计划)
无需触摸Companion即可验证和预览操作。使用这些来检查批处理操作在提交之前会做什么。
| 工具 | 它做什么 |
|---|---|
preview_page_style | 验证并预览页面样式批处理 |
preview_label_button_grid | 将标签网格解析为坐标 |
preview_button_template | 将可重复使用的模板放置在原点并预览结果 |
按钮操作
要求 COMPANION_WRITE_ENABLED=1 (默认)。
| 工具 | 它做什么 |
|---|---|
press_button | 按下并松开按钮 |
press_button_verified | 按下按钮并轮询可见/运行时状态更改 |
hold_button | 按住(仅向下操作) |
release_button | 松开按住的按钮(向上动作) |
rotate_left | 向左旋转编码器 |
rotate_right | 将编码器向右旋转 |
set_step | 设置当前操作步骤 |
按钮样式
| 工具 | 它做什么 |
|---|---|
set_button_text | 更改按钮显示文本 |
set_button_color | 更改文本和/或背景颜色(6位十六进制) |
set_button_style | 一次设置多个样式属性 |
set_button_style_verified | 应用样式更改并轮询,直到渲染完成或超时到期 |
批量操作
| 工具 | 它做什么 |
|---|---|
press_button_sequence | 按顺序按下多个按钮,延迟可配置 |
set_page_style | 在页面上的多个按钮上批量设置样式 |
set_page_style_verified | 在页面上批量设置样式,按按钮返回验证以及库存差异 |
restore_page_style_from_inventory | 从以前捕获的页面清单中恢复按钮样式 |
restore_selected_page_style_from_inventory | 仅从库存快照中还原选定的坐标 |
restore_page_style_from_snapshot | 从已命名的已保存快照还原样式 |
apply_page_style_transaction | 保存回滚检查点,应用已验证的样式,并返回回滚元数据 |
rollback_page_style_transaction | 回滚命名事务快照 |
apply_page_style_preset | 应用带有可选偏移量的已保存页面样式预设 |
label_button_grid | 从简单的名称列表中标记按钮网格 |
apply_button_template | 在页面原点应用可重用的按钮模板 |
变量和系统
| 工具 | 它做什么 |
|---|---|
set_custom_variable | 编写Companion自定义变量 |
rescan_surfaces | 重新扫描连接的USB表面 |
press_bank_button | 传统银行API(已弃用,仍然有效) |
克劳德桌面版
{
"mcpServers": {
"companion": {
"command": "uv",
"args": ["run", "--directory", "/path/to/companion-mcp", "python", "-m", "companion_mcp"],
"env": {
"COMPANION_HOST": "127.0.0.1",
"COMPANION_PORT": "8000"
}
}
}
}VS代码/光标
{
"servers": {
"companion": {
"command": "uv",
"args": ["run", "--directory", "/path/to/companion-mcp", "python", "-m", "companion_mcp"],
"env": {
"COMPANION_HOST": "127.0.0.1",
"COMPANION_PORT": "8000"
}
}
}
}法典
创建一个 codex.json MCP配置文件:
{
"mcpServers": {
"companion": {
"command": "uv",
"args": ["run", "--directory", "/path/to/companion-mcp", "python", "-m", "companion_mcp"],
"env": {
"COMPANION_HOST": "127.0.0.1",
"COMPANION_PORT": "8000"
}
}
}
}然后使用以下命令运行Codex:
codex --mcp-config codex.json安全生产
此服务器专为现场表演环境而设计,意外写入可能会中断正在运行的生产。
- 主机分配 --只有
127.0.0.1,localhost,以及::1默认情况下是允许的。通过以下方式显式添加LAN主机COMPANION_ALLOWED_HOSTS. - 写控制 --set
COMPANION_WRITE_ENABLED=0以阻止所有写入操作。读取和预览工具仍然可用。 - 应用前预览 --每个批处理操作都有一个相应的预览工具,可以验证输入并准确显示将要更改的内容,而无需触摸Companion。
- 已验证写入 --更喜欢
press_button_verified和set_button_style_verified当你关心实际的可见或运行时状态变化时,而不仅仅是HTTP接受度。 - 快照和差异工作流 --使用
snapshot_page_inventory批量更改前后,或让set_page_style_verified自动生成库存差异。 - 回滚路径 --使用以下命令捕获页面
snapshot_page_inventory或save_page_inventory_snapshot,检查恢复计划preview_restore_page_style_from_inventory或preview_restore_page_style_from_snapshot,然后使用匹配还原工具将样式干净地回滚。 - 交易流程 —
apply_page_style_transaction在写入之前创建一个命名的回滚检查点。rollback_page_style_transaction从该命名快照恢复。 - 预设工作流程 --使用保存可重用的页面样式
save_page_style_preset,检查preview_apply_page_style_preset,并使用进行部署apply_page_style_preset. - 输入验证 -页面、行、列、颜色十六进制、延迟边界和模板结构都在进行任何API调用之前进行验证。无效输入返回结构化JSON错误,从不返回原始异常。
- 错误隔离 --所有工具都包裹在
_handle_errors。返回网络故障、JSON解析错误和验证失败{"ok": false, "error": "...", "blocked": true}而不是使MCP会话崩溃。
现场行为记录
- 成功的HTTP写入并不总是意味着按钮会立即发生明显的变化。
- 当前的Companion版本可以先更新存储的样式状态,然后在短时间内重新绘制预览。
set_button_style_verified和press_button_verified包括有界轮询,以便MCP可以区分:
- 已接受写入,但未观察到任何变化 - 写入已接受,预览在短暂延迟后更改 - 写入已接受,样式状态已更改,但可见渲染仍未更改
为什么UI有帮助
MCP后端已经是真正的产品了。UI不会取代它;它使人类更快、更安全:
- 点击页面网格中的按钮,而不是记住
page,row,column - 在一个地方检查预览、样式、运行时摘要和上次验证的响应
- 保存和浏览快照和预设,而无需打开JSON文件
- 在节目准备期间从浏览器运行经过验证的样式更改和事务回滚
- 将系统交给不会手动键入MCP呼叫的操作员
发展
uv sync
uv run python -m pytest -v