激光控制服务器

Beyond MCP 是一个用于 Pangolin BEYOND 激光软件的 MCP 服务器,通过 OSC 协议提供 117 种工具,覆盖演出控制、提示管理、区域配置、几何校正、实时参数控制等功能,专为现场演出设计。

  • by drohi-r
  • Python
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 drohi-r/beyond-mcp

使用说明

超越MCP

MCP服务器 穿山甲BEYOND 激光软件。通过OSC展示20个类别的117个工具,涵盖演出控制、线索管理、区域配置、几何校正、现场参数控制、效果、投影仪对齐、安全限制器等。

为现场制作而建。与配对 grandMA2 MCP, Resolume MCP, MADRIX MCP,以及 配套MCP 完全由人工智能驱动的节目控制。

为什么存在

Pangolin BEYOND是行业标准的激光表演软件,但编程激光提示、调整区域和调整实时参数完全是手动的。操作员点击BEYOND UI,一次一个参数,跨越数十个区域和提示。

此MCP服务器允许AI助手通过OSC控制BEYOND。它可以触发提示、调整主亮度、静音区域、设置BPM、控制投影仪对齐、应用几何校正、管理安全限制器和控制实时参数——所有这些都可以通过一次对话完成。结合MA2 Agent、Resolume MCP和Companion MCP,AI助手可以编排整个节目控制堆栈。

快速开始

git clone https://github.com/drohi-r/beyond-mcp && cd beyond-mcp
uv sync
uv run python -m beyond_mcp

确保BEYOND在启用OSC输入的情况下运行(可通过以下方式配置 BEYOND_OSC_PORT,默认为12000)。

对于远程控制:

  • 使用局域网或WireGuard,而不是公共互联网
  • 允许UDP BEYOND_OSC_PORT
  • 集 BEYOND_HOST 连接到远程计算机并将其包含在 BEYOND_ALLOWED_HOSTS

实时验证的构建说明

这个仓库已经在局域网上对一个真正的BEYOND实例进行了测试,而不仅仅是模拟的单元测试。

已验证版本上的实时确认工具:

  • display_popup
  • set_bpm
  • select_next_page / select_prev_page
  • select_next_tab / select_prev_tab
  • start_cue_by_name / stop_cue_by_name
  • set_master_brightness

构建特定注释:

  • load_cue 发送干净,但在测试工作区中没有产生明显的可见状态变化。
  • display_preview("main", ...) 发送得很干净,但 main 似乎不是已验证BEYOND设置的正确预览标识符。

完整注释: docs/live-validation.md

另请参见:

配置

变量 默认值 描述
BEYOND_HOST 127.0.0.1 BEYOND实例IP
BEYOND_OSC_PORT 12000 OSC接收端口
BEYOND_ALLOWED_HOSTS 127.0.0.1,localhost,::1 目标主机的逗号分隔的列表。集 * 允许任何。
BEYOND_SAFETY_PROFILE lab 安全预设: lab, show-safe,或 read-only
BEYOND_READ_ONLY 0 设置为 1 用于只读模式(阻止所有写入操作)
BEYOND_CONFIRM_DESTRUCTIVE 0 设置为 1 要求 confirm=true 破坏性操作(停电、全面停工等)
BEYOND_TRANSPORT stdio MCP传输(stdio, sse, streamable-http)

建筑

graph TD
    A["Beyond MCP Server<br/><code>beyond_mcp</code><br/>117 tools · 20 categories · safety gate"] --> B
    B["OSC Client<br/>UDP fire-and-forget"] --> C
    C["Pangolin BEYOND<br/>OSC input on port 12000"]

    D["Safety Profiles<br/>lab · show-safe · read-only"] -.-> A
    E["Preview Engine<br/>Dry-run OSC inspection"] -.-> A
    F["Bundle Support<br/>Atomic multi-message delivery"] -.-> B

    style A fill:#1a1a2e,stroke:#F59E0B,color:#fff
    style B fill:#1a1a2e,stroke:#F59E0B,color:#fff
    style C fill:#1a1a2e,stroke:#0f3460,color:#fff
    style D fill:#0f3460,stroke:#0f3460,color:#fff
    style E fill:#0f3460,stroke:#0f3460,color:#fff
    style F fill:#0f3460,stroke:#0f3460,color:#fff

安全简介

BEYOND_SAFETY_PROFILE 给你一个理智的起点,而不必记住多个标志:

  • lab
    • read_only = false
    • confirm_destructive = false
  • show-safe
    • read_only = false
    • confirm_destructive = true
  • read-only
    • read_only = true
    • confirm_destructive = true

如果您需要覆盖配置文件,显式环境标志仍然有效:

BEYOND_SAFETY_PROFILE=show-safe \
BEYOND_CONFIRM_DESTRUCTIVE=0 \
uv run python -m beyond_mcp

工具

系统

工具 它做什么
get_server_config 返回当前MCP服务器配置和安全设置
health_check 检查BEYOND目标是否可访问,并报告已解析的套接字详细信息
send_osc_raw 为任何未被命名工具包装的地址发送原始OSC消息
send_osc_bundle 将多个OSC消息作为原子包发送
preview_osc 预览OSC消息而不发送它(干运行检查)
preview_osc_bundle 预览OSC捆绑包而不发送它

主控制

工具 它做什么
set_master_brightness 设置主亮度(0-100)
blackout 激活断电——禁用所有激光输出
enable_laser_output 启用激光输出(取消断电)
disable_laser_output 禁用激光输出
master_pause 暂停或取消暂停主播放
master_pause_time 暂停或取消暂停带有时间同步的主播放
set_master_speed 设置主播放速度(0-10)
stop_all_now 立即停止所有播放
stop_all_sync 停止所有同步淡入淡出播放
stop_all_async 使用淡入淡出异步停止所有播放

BPM/节拍

工具 它做什么
set_bpm 设置BPM速度值(1-999)
set_bpm_delta 按增量值调整BPM
beat_tap 注册节拍检测
beat_resync 重新同步节拍计时
beat_source_timer 将节拍源设置为内部计时器
beat_source_audio 将节拍源设置为音频输入
beat_source_manual 将节拍源设置为手动轻击

提示模式

工具 它做什么
set_cue_mode_single 将提示模式设置为单提示(一次一个活动提示)
set_cue_mode_one_per 将提示模式设置为“一人一组”
set_cue_mode_multi 将提示模式设置为多提示(多个同时提示)

点击行为

工具 它做什么
click_mode_select 将单击行为设置为“选择”模式
click_mode_toggle 将单击行为设置为切换模式
click_mode_restart 将单击行为设置为“重新启动”模式
click_mode_flash 将点击行为设置为Flash模式
click_mode_solo_flash 将点击行为设置为单独闪光模式
click_mode_live 将点击行为设置为实时模式
set_click_scroll 设置点击滚动参数(缩放、大小、淡入淡出、vpoints、扫描率、颜色、速度、红色、绿色、蓝色、阿尔法)

过渡

工具 它做什么
set_transition_type 按索引设置转换类型
set_master_transition_index 设置主过渡效果指标
set_master_transition_time 设置主转换时间(秒)

线索/细胞控制

工具 它做什么
select_cue 按名称选择线索
start_cue_by_name 按名称开始提示
stop_cue_by_name 按名称停止提示
stop_cue_now 立即停止特定提示
stop_cue_sync 使用同步淡出功能停止特定提示
cue_down 向下导航提示选择
cue_up 向上导航提示选择
pause_cue 暂停或取消暂停提示
restart_cue 从头开始重新启动提示
focus_cell 逐页关注单元格并提示坐标
focus_cell_index 通过线性指数聚焦于一个单元格
start_cell 启动当前聚焦的单元格
restart_cell 重新启动当前聚焦的单元格
stop_cell 停止当前聚焦的单元格
shift_focus 通过方向偏移移动单元格焦点
move_focus 通过增量X和Y移动单元格焦点
unselect_all_cues 取消选择所有活动提示

工作区

工具 它做什么
load_cue 按名称加载提示而不启动它
load_workspace 按名称加载工作区

页面/选项卡/类别导航

工具 它做什么
select_page 按索引选择页面
select_next_page 导航到下一页
select_prev_page 导航至上一页
select_tab 按索引选择选项卡
select_tab_by_name 按名称选择选项卡
select_next_tab 导航到下一个选项卡
select_prev_tab 导航到上一个选项卡
select_all_categories 选择所有内容类别
select_category 按索引选择内容类别
select_category_by_name 按名称选择内容类别
select_next_category 导航到下一个内容类别
select_prev_category 导航到上一个内容类别

网格化管理

工具 它做什么
set_grid_size 设置提示网格尺寸
select_grid 按索引选择网格

区域控制

工具 它做什么
mute_zone 按索引将投影区域静音
unmute_zone 按索引取消投影区域的静音
toggle_mute_zone 切换投影区域的静音状态
unmute_all_zones 取消所有投影区域的静音
stop_zone 在具有可选淡入淡出时间的区域上停止输出
stop_zone_by_name 按名称停止区域上的输出
stop_zones_of_projector 停止分配给投影仪的所有区域
stop_projector_by_name 按名称停止投影仪的所有区域
select_zone 选择投影区域
select_zone_by_name 按名称选择投影区域
unselect_zone 取消选择投影区域
unselect_all_zones 取消选择所有投影区域
toggle_select_zone 切换投影区域的选择状态
store_zone_selection 存储当前区域选择以供以后调用
restore_zone_selection 恢复以前存储的区域选择
set_zone_brightness 设置特定区域的亮度(0-100)

实时控制参数(主范围)

工具 它做什么
set_master_size 设置主尺寸X和Y(-400到400)
set_master_position 设置主位置X和Y(-32768至32768)
set_master_rotation 设置主旋转角度X、Y、Z(-2880至2880)
set_master_rotation_speed 设置主连续转速X、Y、Z(-1440至1440)
set_master_color 设置主色RGB(每个0-255)
set_master_alpha 设置主阿尔法/不透明度(0-255)
set_master_zoom 设置主变焦(0-100)
set_master_scan_rate 设置主扫描速率(10-200)
set_master_visible_points 设置主可见点百分比(0-100)
set_master_color_slider 设置主颜色滑块(0-255)
set_master_animation_speed 设置主动画速度(0-400)

现场控制:效果(主范围)

工具 它做什么
set_master_effect 在主FX插槽(插槽1-4,effect_index-1..47)上设置效果
set_master_effect_action 设置主FX插槽的动作/强度(插槽1-4,值0-100)

投影机控制

工具 它做什么
set_projector_size 设置投影仪输出大小X和Y(-100到100)
set_projector_position 设置投影仪输出位置X和Y(-100到100)
projector_swap_xy 切换投影仪X/Y轴交换
projector_invert_x 切换投影仪X轴反转
projector_invert_y 切换投影仪Y轴反转

区域设置/几何校正

工具 它做什么
zone_setup_select 选择一个区域进行几何设置
zone_setup_next_zone 导航到设置中的下一个区域
zone_setup_prev_zone 导航到设置中的上一个区域
zone_setup_select_param 按索引选择几何参数进行编辑
zone_setup_next_param 导航到下一个几何参数
zone_setup_prev_param 导航到上一个几何参数
zone_setup_set 设置区域几何校正参数(xsize、ysize、exposition、yposition、zrotation、梯形失真、挤压、弓形、剪切等)

安全限制器

工具 它做什么
set_limiter 设置安全限制器(轮廓、每个区域、每个网格、闪光、保持、光束、dmx、显示)

显示

工具 它做什么
display_popup 在BEYOND中显示弹出消息
display_preview 显示或隐藏命名预览窗口

DMX/通道输出

工具 它做什么
channel_out 将值发送到BEYOND输出通道

控制范围

工具 它做什么
set_control_scope 设置实时控制目标范围(主控、提示、区域、轨道、投影仪、智能)

虚拟LJ

工具 它做什么
virtual_lj 启用或禁用虚拟LJ模式
virtual_lj_fx 触发虚拟LJ效果

克劳德桌面

{
  "mcpServers": {
    "beyond": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/beyond-mcp", "python", "-m", "beyond_mcp"],
      "env": {
        "BEYOND_HOST": "127.0.0.1",
        "BEYOND_OSC_PORT": "12000"
      }
    }
  }
}

VS代码/光标

{
  "servers": {
    "beyond": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/beyond-mcp", "python", "-m", "beyond_mcp"],
      "env": {
        "BEYOND_HOST": "127.0.0.1",
        "BEYOND_OSC_PORT": "12000"
      }
    }
  }
}

更多示例,包括针对局域网的设置: docs/mcp-config-examples.md

法典

创建一个 codex.json MCP配置文件:

{
  "mcpServers": {
    "beyond": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/beyond-mcp", "python", "-m", "beyond_mcp"],
      "env": {
        "BEYOND_HOST": "127.0.0.1",
        "BEYOND_OSC_PORT": "12000"
      }
    }
  }
}

然后使用以下命令运行Codex:

codex --mcp-config codex.json

安全生产

此服务器专为现场表演环境而设计,在这种环境中,意外命令可能会中断正在进行的激光表演。所有117个工具都包括完整的参数验证。

  • UDP即发即弃 --BEYOND OSC控件使用UDP,这意味着命令在没有确认的情况下发送。没有回滚。每次工具调用都是对激光系统的实际操作。
  • 主机分配 --只有 127.0.0.1, localhost,以及 ::1 默认情况下是允许的。通过以下方式显式添加LAN主机 BEYOND_ALLOWED_HOSTS.Set * 允许任何主机。
  • 只读模式 --set BEYOND_READ_ONLY=1 以阻止所有写入操作。仅 get_server_config, health_check, preview_osc,以及 preview_osc_bundle 保持可用。
  • 确认破坏性浇口 --set BEYOND_CONFIRM_DESTRUCTIVE=1 要求 confirm=true 破坏性操作,包括原始/捆绑发送破坏性OSC地址和破坏性命名工具,如 load_workspace, stop_zone,以及 stop_projector_by_name.
  • 健康检查 -- health_check 通过DNS解析和UDP套接字测试验证BEYOND目标可达性,并报告解析的地址族/套接字目标。
  • OSC捆绑包支持 -- send_osc_bundle 将多个OSC消息作为原子包发送,确保协调的多参数更改的全部或全部交付。
  • 发送前预览 -- preview_osc 和 preview_osc_bundle 在不传输任何内容的情况下返回确切的数据包详细信息。在高风险现场操作之前使用它们。
  • 输入验证 --所有117个具有记录参数范围的工具在构建任何OSC消息之前都会强制执行边界。亮度、缩放、扫描速率、大小、位置、旋转、颜色、BPM、速度、淡入淡出时间、效果槽、限制器类型、几何校正参数和非负索引都经过范围检查。无效输入返回结构化JSON错误,从不返回原始异常。
  • 错误隔离 --所有工具都包裹在 _handle_errors.OSC发送失败、JSON解析错误、验证失败和意外异常返回 {"ok": false, "error": "...", "blocked": true} 而不是使MCP会话崩溃。
  • 运输验证 --只有 stdio, sse,以及 streamable-http 运输被接受。无效的传输值在启动时立即升高。
  • 端口验证 -- BEYOND_OSC_PORT 在配置加载时被验证为1-65535范围内的整数。
  • 原始逃生舱口 -- send_osc_raw 允许任何OSC地址覆盖指定工具之外的范围,但需要显式的JSON数组输入,并在发送前验证结构。

建议的操作流程

首次在新的BEYOND机器上使用:

  1. get_server_config
  2. health_check
  3. display_popup
  4. set_bpm
  5. 页面/标签导航
  6. 非关键线索开始/停止
  7. 主亮度等实时参数测试

更实用的序列: docs/operator-workflows.md

发展

uv sync
uv run python -m pytest -v

许可证

Apache 2.0