mcpField
E
EmbeddedCI BenchPod

EmbeddedCI BenchPod

本地服务
embeddedci.com开发工具0今天更新

关于 EmbeddedCI BenchPod

EmbeddedCI BenchPod 是用于真实硬件在环测试设备的 MCP 服务,让 AI Agent 可操作连接的开发板。它通过 embeddedci SDK 提供供电、烧录、串口、总线和信号测量等能力,适用于嵌入式固件开发与测试。

主要功能

  1. 01控制目标板供电与复位
  2. 02通过 SWD 烧录固件
  3. 03监视 UART 并操作 SPI
  4. 04探测 I2C、CAN 与逻辑信号
  5. 05驱动并测量模拟信号
  6. 06采集电源电压、电流与能耗

适用场景

  1. 01在真实开发板上烧录并验证固件
  2. 02循环断电并观察设备启动输出
  3. 03模拟传感器并检查总线通信
  4. 04测量目标板的电源消耗

MCP 相关

该 MCP 服务将 BenchPod 硬件操作封装为工具,供 MCP 客户端连接并控制真实设备。服务支持 stdio 或 HTTP 传输;HTTP 非本机绑定时要求配置令牌。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"embeddedci-com-embeddedci": {
"command": "uvx",
"args": [
"embeddedci-mcp"
],
"env": {
"BENCHPOD_CONNECTION": "<BENCHPOD_CONNECTION>",
"BENCHPOD_LA_VOLTAGE": "<BENCHPOD_LA_VOLTAGE>",
"BENCHPOD_API_KEY": "<BENCHPOD_API_KEY>"
}
}
}
}
启动命令uvx embeddedci-mcp
需要配置的环境变量
BENCHPOD_CONNECTIONDefault BenchPod connection when neither --connection nor the connect tool gives one.
BENCHPOD_LA_VOLTAGELA I/O voltage (1.8 or 3.3) applied when connecting.
BENCHPOD_API_KEY密钥embeddedci API key: reach cloud pods (embeddedci:<device>) and the waveform library.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiembeddedci-mcp2.13.5

工具

74

收录的工具列表 · 更新于 今天

参数类型必填说明
connectionany否host[:port](TCP,默认端口为 8080)、串行设备路径、'usb'(自动检测)、'discover'(mDNS)或 'embeddedci:<device-name>'(云端)。省略时使用服务器默认值(--connection,否则使用 BENCHPOD_CONNECTION,否则使用通过 `benchpod set-connection` 保存的连接);若无默认连接,则通过 mDNS 查找局域网上唯一的 pod。
la_voltageany否连接后立即选择 LA I/O bank 电压(DUT 的 I/O 电压)。
lease_waitnumber否仅限云端:当另一个运行任务占用共享设备时,等待的秒数。

详细介绍

embeddedci-mcp

一个 MCP 服务,可让 AI Agent 操控 EmbeddedCI BenchPod——这是一款连接到真实电路板的硬件在环测试设备。你可以让 Claude(或任何 MCP 客户端)烧录构建版本、对目标设备执行电源循环、监视其 UART、模拟它所需的传感器、探测其 I2C/CAN 流量,或驱动并测量模拟信号,BenchPod 会执行这些操作。

它是 embeddedci SDK 的轻量封装:每个工具都映射到 SDK 调用,因此 Agent 通过交互发现的任何操作都可以变成 pytest 测试。

要求

  • Python 3.10+ 和 uv(用于 uvx),或 pip。
  • 可通过网络、embeddedci.com 云端或 USB 访问的 BenchPod。固件 3.9.0 及更高版本中,连接方式 usb 可通过 BenchPod 的 USB 网络适配器访问完整 API(除非已在 BenchPod 上配置 Wi-Fi,此时 USB 网络会关闭);此时 status 会报告类型 usb_net。串口设备路径,或旧版固件上的 usb,则会连接 USB 控制台:仅支持状态、LA 电压和电源,因为 STM32 BenchPod 的控制台没有 JSON 模式。一台电脑连接了多个 BenchPod 时,usb 会报错并按名称列出它们;请使用 usb:<name> 选择一个(例如 usb:benchpod-baea06)。
  • 使用 flash 时:运行服务的机器上需要安装带 cmsis_dap_tcp 后端的 OpenOCD(版本需高于 0.12.0,例如 brew install --HEAD open-ocd 或 xPack 构建版)。固件 file 也会从这台机器读取。通过云连接烧录上传到 embeddedci.com 的构建版本(build/repo/ref)则不需要这些条件:embeddedci.com 会运行 OpenOCD。

设置客户端

Claude Code
claude mcp add benchpod \
  -e BENCHPOD_CONNECTION=192.168.1.213 -e BENCHPOD_LA_VOLTAGE=3.3 \
  -- uvx embeddedci-mcp

BENCHPOD_LA_VOLTAGE 是电路板的 I/O 电压,只需在此配置一次;1V8 电路板请使用 1.8。如果未设置,Agent 会被告知在操作 LA 通道组之前调用 set_la_voltage。

这两个变量都是可选的。connect 会选择 BenchPod,按以下顺序使用第一个匹配项:

  1. connection 参数;
  2. 服务默认值 --connection;
  3. BENCHPOD_CONNECTION;
  4. 使用 benchpod set-connection <address|device|usb> 保存的 benchpod-cli 默认连接(只读,来自 ~/.config/benchpod-cli/config.json,或 $XDG_CONFIG_HOME 下的文件);
  5. 通过 mDNS 发现局域网中的 BenchPod。

因此,CLI、SDK 和 MCP 服务共享同一个已保存的连接。如果前四项均不可用,connect 会通过 mDNS 在局域网中查找 BenchPod(与 discover 类似),并在恰好找到一个时使用它。如果一个也没找到或找到多个,错误消息会列出检测到的 BenchPod(名称和地址),并说明应改用什么参数:host[:port]、usb 或云端 BenchPod 使用的 embeddedci:<device>(cloud_list_devices 会列出这些设备)。因此,如果网络上只有一个 BenchPod,只需运行 claude mcp add benchpod -- uvx embeddedci-mcp,然后让 Agent 连接即可。

TLS。 网络地址会在 BenchPod 支持 TLS 时(固件 3.9.3+)通过 8443 端口使用 TLS,并在首次使用时固定 BenchPod 的证书;证书信息与 benchpod-cli 一起保存在同一个 known_pods.json 文件中。旧版 BenchPod 则仍使用明文连接的 8080 端口。BENCHPOD_TLS=on|off 和 BENCHPOD_TLS_CA 的用法与 SDK 相同。如果证书发生变化,connect 会停止,并显示两个指纹;确认这是有意更改后,用户需运行 benchpod lan-tls trust。lan_tls 工具会显示证书并切换为仅使用 HTTPS。

Claude Desktop / Cursor

claude_desktop_config.json(Claude Desktop)或 .cursor/mcp.json(Cursor):

{
  "mcpServers": {
    "benchpod": {
      "command": "uvx",
      "args": ["embeddedci-mcp"],
      "env": {
        "BENCHPOD_CONNECTION": "192.168.1.213",
        "BENCHPOD_LA_VOLTAGE": "3.3"
      }
    }
  }
}
Codex

Codex CLI 会将 MCP 服务保存在 ~/.codex/config.toml 中。使用 CLI 添加:

codex mcp add benchpod \
  --env BENCHPOD_CONNECTION=192.168.1.213 --env BENCHPOD_LA_VOLTAGE=3.3 \
  -- uvx embeddedci-mcp

……或者自行编写配置项(运行 codex mcp list 可查看已配置的内容):

# ~/.codex/config.toml
[mcp_servers.benchpod]
command = "uvx"
args = ["embeddedci-mcp"]
env = { BENCHPOD_CONNECTION = "192.168.1.213", BENCHPOD_LA_VOLTAGE = "3.3" }
云端测试舱

使用设备名称和一个 API 密钥——其中已包含云传输:

"env": {
  "BENCHPOD_CONNECTION": "embeddedci:my-bench",
  "BENCHPOD_API_KEY": "eci_…",
  "BENCHPOD_LA_VOLTAGE": "3.3"
}

也可以跳过 API 密钥:执行 benchpod login 后,服务会复用该会话 (~/.config/benchpod-cli/token.json;令牌过期时会刷新并写回),用于 cloud_list_devices、connect("embeddedci:<name>"),以及通过 LAN 或 USB 连接时使用测试舱中存储的接线配置文件。设置了 BENCHPOD_API_KEY 时会优先使用它;在 GitHub Actions 中,SDK 则会改用 OIDC。

cloud_list_devices 会列出你账户中的测试舱及其在线状态,无需连接;将某个结果的 connection 传给 connect 即可。云连接使用的会话令牌会在过期前续期,因此长时间会话也能持续工作。

云端测试舱由多人共享,因此 connect 会申请独占租约(如果另一个运行实例正在占用,会最多等待 --lease-wait 秒)。调用 disconnect 后会释放租约;如果在 --idle-timeout 秒内没有调用工具,也会释放租约——下次调用时会自动重新连接,因此闲置的聊天会话不会占用测试舱,阻塞 CI。

选项

标志环境变量默认值
--connectionBENCHPOD_CONNECTIONCLI 保存的连接,否则为 mDNShost[:port]、串行设备、usb、usb:<name>、discover、saved 或 embeddedci:<device>;未设置时使用 benchpod set-connection 保存的连接,否则查找 LAN 上唯一的测试舱
--la-voltageBENCHPOD_LA_VOLTAGE—连接时应用的 LA I/O 电压(1.8 或 3.3)
—BENCHPOD_API_KEY—云端测试舱和波形库(未设置时,云端工具使用 benchpod login 会话)
—BENCHPOD_API_BASEhttps://www.embeddedci.com其他 embeddedci 服务
—BENCHPOD_WIRING—接线配置文件(.json/.toml),优先于已存储的配置文件
—BENCHPOD_WIRING_SOURCEautolocal 表示不向 embeddedci.com 请求测试舱中存储的接线配置文件
--lease-wait—30云端:等待被占用的测试舱的秒数
--idle-timeout—600云端:空闲这么多秒后释放租约(0 = 永不释放)
--timeout—30每条命令的设备超时时间
--transport—stdiostdio 或 http
--host / --port—127.0.0.1 / 8000HTTP 绑定地址
--auth-tokenEMBEDDEDCI_MCP_TOKEN—要求提供 Authorization: Bearer <token>(非回环地址时必须设置)
--allowed-host——网络绑定时接受的 Host 标头(DNS 重绑定防护)
--allow-unauthenticated—关闭在网络地址上提供服务而不使用令牌(仅限隔离网络)
通过 HTTP 提供测试台服务

在测试舱旁边的机器上运行服务,并让客户端连接到该服务:

export EMBEDDEDCI_MCP_TOKEN=$(openssl rand -hex 32)
embeddedci-mcp --transport http --host 0.0.0.0 --connection 192.168.1.213 --la-voltage 3.3
claude mcp add --transport http benchpod http://bench-host:8000/mcp \
  --header "Authorization: Bearer $EMBEDDEDCI_MCP_TOKEN"

该服务会驱动真实硬件,因此拒绝在没有令牌的情况下绑定非回环地址。它会维持一个供所有 HTTP 客户端共享的测试舱连接,并串行执行它们的工具调用。

工具

所有工具按服务中的分组排列。粗体参数为必填项;其他参数均为可选项,如果有默认值则会显示(没有默认值表示“取自接线配置文件”“保留当前设置”或“不使用”)。单位为伏、安、秒和赫兹。LA 通道参数可以是数字(1-14),也可以是接线配置文件中的名称。每个工具的输入架构都包含完整说明、范围和枚举值,因此 Agent 能看到的信息比此表更完整。

连接
工具用途参数
connect打开连接(关闭任何先前的连接),并报告状态、功能以及接线配置文件的来源。如果未指定 connection,也未配置默认值(--connection、BENCHPOD_CONNECTION、CLI 保存的连接),则通过 mDNS 查找 LAN 上的唯一 Pod。connection、la_voltage、lease_wait=30
disconnect关闭 UART/CAN 会话和连接,并释放云端租约。无
status固件、功能、LA 电压、已打开的会话和警告(未连接时也可用)。无
set_la_voltage选择与 DUT 匹配的 LA I/O 电压(1.8 V 需要 rev3 Pod)。voltage
云端(embeddedci.com)
工具用途参数
cloud_list_devices列出 embeddedci.com 组织中的 Pod,以及每个 Pod 是否在线,无需连接。无
接线配置文件
工具用途参数
wiring查看每个 DUT 信号对应的 LA 通道,以及电源轨、UART 波特率和 SWD 目标。无
set_wiring替换此连接的接线配置文件,或将其保存到 embeddedci.com。profile、save=false
电源
工具用途参数
power_on打开目标的电源轨(可选择在 Pod 端定时执行)。efuse、delay
power_off关闭目标的电源轨。efuse、delay
power_status查看两个目标电源轨、内部 5 V(efuse 1)和外部电源轨(efuse 2)的状态:开/关、跳闸状态、总线电压和电流,以及 Pod 自身的功耗。无
reset_target通过 Pod 的复位引脚驱动 DUT 的复位线。action=pulse、pulse=0.1
电源配置文件
工具用途参数
measure_power在一段时间内采样电源电流和电压:平均值、最小值、峰值、能量和电荷。duration、efuse、rate_hz=500、points=0
power_profile_start在后台开始对电源轨采样,同时运行其他工具。efuse、rate_hz=500、max_duration=60
power_profile_stop停止正在运行的配置文件,并返回统计数据(及曲线)。points=0
闪存
工具用途参数
flash通过 Pod 的 CMSIS-DAP 探针经由 SWD 对 DUT 编程:使用本地 file(OpenOCD 在服务旁运行),或使用上传到 embeddedci.com 的构建(build ID 或 latest、repo、ref;embeddedci.com 在云端连接上运行 OpenOCD,LAN/USB 则下载该构建)。swclk、swdio、target、file、nreset、load_address、target_power、verify=true、reset=true、connect_under_reset、extra_configs、extra_args、timeout=300、connect_attempts=5、build、repo、ref、artifact、server_side
SPI 闪存和 SPI 设备
工具用途参数
spi_flash_info读取 SPI 引脚上 SPI NOR 闪存的 JEDEC ID 和容量。sck、mosi、miso、cs、hz=1000000、mode=0
spi_flash_program擦除、写入并校验 SPI NOR 闪存中的映像。file、addr=0、erase=true、verify=true、hold_reset=false、sck、mosi、miso、cs、hz=6000000、mode=0
spi_flash_read将闪存字节读入文件,或以十六进制形式读取最多 4096 字节。addr、length、file、sck、mosi、miso、cs、hz=6000000、mode=0
spi_transfer使用 SPI 引脚上的任意设备执行一次全双工 SPI 事务。tx_hex、sck、mosi、miso、cs、hz=1000000、mode=0
UART
工具用途参数
capture_uart在指定时间窗口内记录 DUT 的 UART,或持续记录直到匹配正则表达式。duration、rx、tx、baud、until_regex
power_cycle_and_capture对目标设备执行电源循环,并在启动期间捕获 UART。rx、tx、efuse、delay=1、duration=4、baud、until_regex、off_settle=0.3
uart_open在后台开始缓冲 DUT 的 UART。rx、tx、baud
uart_write通过已打开的 UART 会话向 DUT 发送文本。text、line_ending=lf
uart_read返回上次读取后收到的输出,也可选择等待匹配项。until_regex、timeout=2
uart_close停止后台 UART 会话。无
模拟 I2C 传感器
工具用途参数
enable_i2c_sensor让 pod 充当 DUT 可读取的 I2C 传感器(先启用上拉电阻):sensor 可设为 bmp280、bme280、sht4x 或 mpu6050。sda、scl、address、temperature_c、pressure_pa、sensor="bmp280"、values(按键指定读数,例如 {"humidity_pct": 55})
set_i2c_sensor更改模拟传感器报告的内容;回复会列出所有读数。temperature_c、pressure_pa、values
i2c_sensor_typespod 可模拟的型号及其地址和读数(键、单位、范围、默认值)。无
disable_i2c_sensor停用模拟传感器。无
i2c_sensor_status传感器状态和总线活动计数器:DUT 是否与其通信?无
i2c_sensor_regs读取模拟传感器的寄存器映像。start=0、length=256
i2c_sensor_capture捕获并解码传感器的 I2C 总线,生成事务跟踪记录。samples=4096、sample_rate_hz=500000、address、register
模拟 GPS 接收器

通过 pod 的第二个 UART,在一个 LA 通道上向 DUT 的 UART 发送 NMEA 语句(u-blox 风格:RMC VTG GGA GSA GSV GLL),这样 uart_open 就能继续使用控制台。需要 gateware v48(gps 能力)。

工具用途参数
enable_gps在连接到 DUT RX 的通道 tx 上启动接收器。两次定位之间,位置会按 speed_kmh 沿 course_deg 方向移动。tx、baud=9600、rate_hz=1、sentences、latitude_deg、longitude_deg、altitude_m、speed_kmh、course_deg、satellites、hdop、fix、utc(默认为当前时间)
set_gps更改定位信息(可指定任意子集);fix=0 会丢失定位。latitude_deg、longitude_deg、altitude_m、speed_kmh、course_deg、satellites、hdop、fix、utc
disable_gps停止接收器并释放其引脚。无
gps_status会话信息(tx、波特率、速率、历元数、溢出次数)以及接收器输出的定位信息。无
上拉和下拉电阻
工具用途参数
set_pull启用或释放偏置电阻:LA1-LA6 上拉,LA7/LA8 下拉。las、enabled
pull_status查看 LA1-LA8 偏置电阻的状态、方向和值。无
lan_tlspod 通过 TLS 提供的 LAN API(固件 3.9.3+):端口 8443、仅 HTTPS 设置以及证书的 sha256 值(客户端用于固定证书)。关闭仅 HTTPS 设置并重新生成证书需要 TLS、USB 或云连接。https_only、regenerate
usb_network读取 pod 的 USB 网络设置(固件 3.9.0+),或通过 USB 链路关闭适配器。只有设备本身可以更改该设置;若要重新开启,请在 USB 控制台运行 benchpod usb-network on。set=off
LA 引脚上的 GPIO
工具用途参数
la_pins查看 14 个 LA 通道各自的用途,以及 GPIO 模式、电平和偏置电阻。无
gpio_mode将 LA 通道设为 GPIO(输入、输出或开漏)。la、mode=output、level
gpio_write设置 GPIO 输出和开漏通道的电平。la、level
gpio_read查看 LA 通道的实时电平(省略 la 时查看全部 14 个通道)。la
gpio_wait等待 LA 通道读到指定电平(超时时返回 reached: false)。la、level=1、timeout=5
gpio_pulse在 LA 通道上输出由 FPGA 定时的脉冲:width 为 4 us 至 65.535 ms,count 最大为 65535。la、width、count=1
gpio_release将通道恢复为高阻态;采集会监测这些通道。la
模拟
工具用途参数
analog_path一步设置指定路径上的所有模拟多路复用器和继电器。path
dac_output路由 DAC 输出,并在其上输出经校准的直流电压。path、volts
current_out在 4-20 mA 输出端(J9)保持指定电流(单位为安培),或读取其量程。current
adc_read读取一次经校准的数值:前置 SMA、DAC 回环或 4-20 mA 输入端(J8)。source=ext
calibration查看已存储的校准信息:ADC 偏移量(在 4-20 mA 输入端测得)及其拟合方式,以及 DMM 线性参数和增益(固件 3.9.4+)。无
calibrate测量并存储 4-20 mA 输入端(J8 开路)的 ADC 偏移量,或清除校准(全部或其中一部分)。source=current_in、clear=false、clear_part
calibrate_dac根据用 dac_output 驱动设定点后取得的两次 DMM 读数,存储此 pod 的 DAC 输出线性参数(固件 3.9.4+)。path、code1、volts1、code2、volts2
calibrate_adc_gain通过回环,将 ADC 源与经 DMM 校准的输出进行比较,以测量其增益(固件 3.9.4+)。source
采集与解码
工具用途参数
capture_adc采集 ADC 数据:经校准的统计信息、主频和最小值/最大值包络。samples=4096、sample_rate_hz、source、points=200、trigger_la、trigger_edge=rising、trigger_timeout=10
capture_la采集全部 14 个 LA 通道:各通道的电平、边沿计数、首个边沿和频率。samples=4096、sample_rate_hz、stop_dac_after、trigger_la、trigger_edge=rising、trigger_timeout=10
capture_correlated由同一个硬件触发器在同一时间基准上采集 ADC 和 LA 数据。adc_samples=4096、adc_sample_rate_hz、la_samples=4096、la_sample_rate_hz、stop_dac_after、points=200、trigger_la、trigger_edge=rising、trigger_timeout=10、source
decode_la从上一次 LA 采集中解码 I2C、UART 或 SPI(也可进行新的采集)。protocol、sda、scl、rx、baud、sclk、mosi、miso、cs、mode=0、capture=last、samples=16384、sample_rate_hz=1000000、max_items=200
la_timing查看上一次采集中的边沿时间戳、脉冲宽度、频率、占空比和通道间延迟。la、edge=rising、to_la、to_edge=rising、after=0、max_edges=100
DAC
工具用途参数
generate在 DAC 输出端生成正弦波、方波或锯齿波(单位为伏特;current_out 上为安培)。waveform、freq_hz、amplitude、offset、dac_path=3v3、duration、sample_rate_hz、on_capture=false、route=true
dac_stop停止所有 DAC 输出:发生器、回放或控制环路。无
replay将自有样本或上一次 ADC 采集的数据从 DAC 输出并循环播放。volts、from_last_capture=false、dac_path=3v3、mapping=faithful、sample_rate_hz、fault、on_capture=false、route=true、switch_image=true
list_waveforms列出组织的云端波形库。无
replay_waveform将云端波形库中的波形从 DAC 输出并循环播放。waveform_id、dac_path、mapping=faithful、sample_rate_hz、window_start=0、window_len=0、target_samples=0、fault、on_capture=false、switch_image=true
save_capture_as_recording将上一次 ADC 采集的数据保存到云端波形库。name、full_scale_v
控制环路
工具用途参数
control_loop在 FPGA 中运行制表形式的传递函数(例如太阳能电池板的 I-V 曲线)。curve、voc_code、sharpness=4、points=256、k=8192、vmin=0、vmax=65535、tick_div=64、source、input_code=0、step=0、input_map、switch_image=true
loop_input重新指定运行中环路的输入,无需重新启用。input_code、source、step
loop_probe查看运行中环路的实时工作点。无
fpga_image将 FPGA 切换到 loop 或 deep_replay 门控逻辑镜像(约需 2-3 s)。image
CAN
工具用途参数
can_open启动 pod 的 CAN 接口(正常、环回或仅监听模式)。bitrate=500000、mode=normal、term=false
can_write将一帧经典 CAN 帧加入发送队列。can_id、data、ext=false、rtr=false
can_read读取接收到的帧,或等待指定 ID 的帧。timeout=0、can_id、max_frames=32
can_respond由 pod 固件响应 CAN ID(ECU 仿真),或清除所有规则。match_id、reply_id、reply_data、match_ext=false、reply_ext=false、clear=false
can_status链路状态:模式、比特率、错误计数器、总线关闭状态。无
can_close清除响应规则并停止 CAN。无
其他
工具用途参数
la_step为步进/方向电机驱动器生成步进脉冲:delay 是步进周期的一半(4 us 至 65.535 ms),steps 最大为 65535。la、steps、delay、dir_la、direction=0
command原始固件 JSON 命令,用于其他工具未涵盖的操作。request

资源:benchpod://wiring(已连接测试台自身的接线配置,以及 LA 通道、偏置电阻和模拟路径)和 benchpod://help(服务说明)。

工作方式

  • 说明。 服务器会在初始化时发送使用说明,包括会话开始方式、典型流程、单位和错误约定,让 Agent 知道必须先执行 connect 和 set_la_voltage。
  • 类型化、结构化的结果。 每个工具都有包含枚举值和范围的输入架构(路径、信号源、LA 通道 1-14、内部 5 V(efuse 1)或外部(efuse 2)等)以及输出架构;结果以结构化内容返回。单位为伏特、秒和赫兹。
  • 错误。 工具无法完成请求时,会返回 MCP 工具错误,消息会说明原因,例如 FirmwareError: la voltage not set 或 NotConnectedError: …。操作已完成但结果不理想时,则返回正常结果:flash 会返回 ok: false 及其日志,UART 捕获会返回 matched: false。
  • 拒绝。 pod 或服务器拒绝命令时,错误会指出类型,并以一行提示说明该怎么做:PodLockedError(pod 的 LAN 策略会将命令保留给云端或 USB)、PodLeasedError(云端作业正在占用 pod;消息会说明占用者和剩余时长)、PodBusyError(正在进行捕获或上传)、PermissionDeniedError(凭据缺少相应权限,例如 API 密钥没有 benchpod:admin 作用域)以及 TransportTimeout(pod 未响应)。链接断开时会返回 ConnectionClosedError。UnsupportedFeatureError 表示 pod 根本无法执行该操作:其固件或 gateware 缺少相应功能,或它是没有模拟前端的纯数字板;提示会说明具体原因。云端作业正在占用 pod 或 LAN 策略已锁定时,status 也会发出警告。 固件将解决方法描述为原始协议命令的拒绝错误会直接指出工具名称:FirmwareError: uart_proxy_start: la voltage not set; call set_la_voltage first with the DUT's I/O voltage (1.8 or 3.3) 和 PinConflictError: uart_proxy_start: pin conflict: LA4 is in use by gpio; release it with gpio_release(la=[4])。其他引脚占用方会提示使用 uart_close、disable_i2c_sensor 和 disable_gps;上拉冲突则会提示使用 set_pull(las=[7], enabled=false)。
  • 功能能力。 connect 和 status 会以标志报告 pod 支持的功能,让 Agent 能在调用工具前进行检查:例如 la_pins、capture_trigger、power_profile、nrst_pin、can、calibrate、cal_dmm、current_out、pod_current 和 analog(纯数字板上为 false),以及 pod 的策略和云端设置(dac_limits、flash_kb、ota_sig、sig_policy、lan_policy、tunnel_max_tier、lease_state、cloud_ca、cloud_proxy)。
  • 接线配置。 wiring 是工作台的 DUT 信号 → LA 通道映射,以及目标电源轨、UART 波特率和 SWD 目标。省略的通道、波特率、电源轨和 SWD 参数会使用其中的值;通道参数也接受其中的名称(trigger_la: "READY"、rx: "uart_rx"),因此,读取过一次 wiring 的 Agent 无需指定任何引脚编号,就能调用 flash()、uart_open() 或 power_on()。set_wiring 会替换当前连接的配置,或在设置 save: true 时将其保存到 embeddedci.com。 这是 Web UI 中 Wiring 选项卡编辑的同一份配置。SDK 按以下顺序解析,采用首个匹配项: BENCHPOD_WIRING(一个文件);embeddedci.com 上为此 pod 存储的配置(按名称识别云 pod;如果可以使用 BENCHPOD_API_KEY 或 benchpod login 会话,则按设备报告的注册身份识别 LAN 或 USB pod,且该设备必须属于同一账户);默认值。wiring 和 connect/status(wiring_source)会报告配置来源:server、file、dict(来自 set_wiring)或 defaults。查找失败时(未登录、pod 未注册、服务器无法访问、账户不匹配),将使用默认值,不会导致失败;通过 LAN 或 USB 查找时,等待约 3 秒后会放弃。STM32 pod 的 USB 文本控制台无法报告其注册信息,因此通过 USB 连接时将使用默认值。BENCHPOD_WIRING_SOURCE=local 会跳过查找。
  • 适合 Agent 的采集结果。 capture_adc 会返回校准后的统计数据、主导频率和最小值/最大值包络;capture_la 会返回各通道的电平、边沿和频率。最近的采集结果会保留在会话中,因此 decode_la、replay(from_last_capture=true) 和 save_capture_as_recording 不会重新采集。
  • 触发采集。 capture_adc、capture_la 和 capture_correlated 支持 trigger_la (以及 trigger_edge rising/falling/high/low 和 trigger_timeout),因此采样会在事件发生时开始——t = 0 即触发时刻——摘要会回显为 trigger: "LA9 rising"。如果条件始终未满足,则会失败并返回 TriggerTimeout: …。
  • 引脚和 GPIO。 每个 LA 通道同一时间只能由一个对象占用:无、GPIO、UART 代理、SWD、仿真传感器或步进序列。la_pins 会显示引脚表;gpio_mode / gpio_write / gpio_read / gpio_wait / gpio_pulse 可驱动和监视通道;gpio_release 可释放通道。第二次占用会失败并返回 PinConflictError: pin conflict: LA5 is in use by uart_rx; …,指出占用方及释放方法——因此 Agent 会在该通道打开 UART 会话前释放 GPIO。无论由谁占用,采集都会监视全部 14 个通道。
  • 电源配置文件。 measure_power(duration) 会报告平均、最小和峰值电流、电压、能量与电荷。每个采样点都会带时间戳,积分基于这些时间戳进行,因此能量是积分得出的,而非估算值。rate_hz(100-500,默认值为 500)会跟随请求提升至约 200 Hz,随后在接近 365 Hz 时趋于平稳——结果会在 rate_hz 中报告实际输出速率,并在 adc_rate_hz 中报告传感器配置的速率。可选的降采样轨迹(points)。power_profile_start / power_profile_stop 可用于包围其他工具调用;运行中的配置文件会保存在会话中(status 会报告它),并在 disconnect 时丢弃。
  • 会话。 uart_open 会在后台缓冲 DUT 的控制台(在 power_on 前打开,然后使用 uart_read / uart_write);can_open 会让 CAN 总线在多次调用之间保持打开状态。
  • Gateware 镜像。 pod 的 FPGA 运行 loop 镜像(control_loop)或 deep_replay 镜像(重放长度超过 2048 个样本时)。control_loop、replay 和 replay_waveform 会自动切换(约 3 秒)并通过 switched_image 报告;switch_image: false 则会直接失败。切换会重置 FPGA——正在运行的 DAC 输出、UART 会话或 I2C 传感器仿真都会停止——服务器指引会告知 Agent 在切换后重新启动这些功能。 fpga_image 可显式切换镜像。
  • 非阻塞。 工具在线程池中运行,并由单个设备锁保护:耗时 5 分钟的闪存操作不会冻结服务器,会发送进度通知,并发调用无法交错执行命令。
  • 注解。 只读工具(status、power_status、adc_read,等等)会标记为只读,以便客户端自动批准;供电、烧录或驱动电压的工具会标记为具有破坏性。

示例

连接到测试台,将 build/app.elf 刷写到 STM32F4(LA11 接 SWCLK,LA12 接 SWDIO, 已连接复位线),然后断电再上电,并告诉我 UART 上是否出现 APP_OK(DUT TX 接 LA5, RX 接 LA4)。

connect()                                   # BENCHPOD_CONNECTION + BENCHPOD_LA_VOLTAGE
flash(swclk=11, swdio=12, nreset=true, target="target/stm32f4x.cfg", file="build/app.elf", target_power=1)
power_cycle_and_capture(rx=5, tx=4, delay=1.0, duration=5.0, until_regex="APP_OK")

为测试台存储接线配置后,同样的运行无需指定引脚编号:

connect()
wiring()                                    # SWCLK on LA11, DUT TX on LA5, rail internal 5 V (efuse 1), …
flash(file="build/app.elf")
power_cycle_and_capture(delay=1.0, duration=5.0, until_regex="APP_OK")
measure_power(duration=2.0, points=100)     # what the firmware draws once it is up

稳定性

2.x 固定工具名称、输入架构和注释(tests/tools_surface.json;CI 会因任何未经审核的变更而失败):可以添加工具和可选参数,但在同一主版本内不会重命名或移除任何内容。有关从 0.1 迁移的信息,请参阅 CHANGELOG.md。

发布到 MCP Registry

server.json 描述了此软件包在 MCP Registry 中的信息。embeddedci-mcp-v* 发布工作流会在上传到 PyPI 后发布此软件包(上传后 uvx embeddedci-mcp 才能运行),并通过 GitHub OIDC 登录。请同时更新 server.json 中的两个 version 字段以及 pyproject.toml:如果它们不一致,发布和 CI 都会失败。

如需手动发布:

mcp-publisher login github
mcp-publisher publish

Registry 会通过本 README 顶部的 mcp-name 注释验证 PyPI 所有权。

开发

pip install -e "../embeddedci[dev]" -e ".[dev]"
pytest

评论

支持 Markdown

第一次接触 MCP?

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

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