EmbeddedCI BenchPod について
EmbeddedCI BenchPodは、実機に接続されたハードウェア・イン・ザ・ループテスターを操作するMCPサーバーです。embeddedci SDKを介して、電源制御、書き込み、シリアルやバス通信、信号測定を行い、組み込みファームウェアの開発とテストを支援します。
主な機能
- 01ターゲットの電源とリセットを制御
- 02SWD経由でファームウェアを書き込み
- 03UARTを監視しSPIを操作
- 04I2C、CAN、ロジック信号を観測
- 05アナログ信号の出力と測定
- 06電圧、電流、電力量を測定
活用シーン
- 01実機ボードにファームウェアを書き込んでテスト
- 02電源を再投入して起動時の出力を確認
- 03センサーを模擬してバス通信を調査
- 04ターゲットボードの消費電力を測定
MCP 対応
BenchPodのハードウェア操作をツールとして公開し、MCPクライアントから実機への接続と制御を可能にします。stdioとHTTPに対応し、ループバック以外へのHTTPバインドにはトークンが必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx embeddedci-mcpBENCHPOD_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
74掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| connection | any | いいえ | host[:port](TCP、デフォルトポート 8080)、シリアルデバイスのパス、'usb'(自動検出)、'discover'(mDNS)、または 'embeddedci:<device-name>'(クラウド)。省略すると、サーバーのデフォルト(--connection、次に BENCHPOD_CONNECTION、次に `benchpod set-connection` で保存された接続)を使用します。いずれもない場合は、mDNS 経由で LAN 上にある唯一の pod を探します。 |
| la_voltage | any | いいえ | 接続直後に LA I/O バンクの電圧(DUT の I/O 電圧)を選択します。 |
| lease_wait | number | いいえ | クラウドのみ:別の実行が共有デバイスを使用している場合に待機する秒数。 |
詳細
embeddedci-mcp
AI エージェントから EmbeddedCI BenchPod を操作できる MCP サーバーです。BenchPod は実際のボードに接続されたハードウェア・イン・ザ・ループのテスターです。Claude(または任意の MCP クライアント)にビルドの書き込み、ターゲットの電源再投入、UART の監視、想定されるセンサーの代役、I2C/CAN トラフィックのプローブ、アナログ信号の駆動と測定を依頼すれば、BenchPod が実行します。
embeddedci SDK の薄いラッパーです。各ツールは SDK 呼び出しに対応しているため、エージェントが対話的に見つけた操作はすべて pytest テストにできます。
必要条件
- Python 3.10+ と uv(
uvx用)、またはpip。 - ネットワーク、embeddedci.com クラウド、または USB 経由で接続できる BenchPod。ファームウェア 3.9.0 以降では、接続先に
usbを指定すると、ポッドの USB ネットワークアダプター経由で完全な API にアクセスできます(ポッドで Wi-Fi を設定すると USB ネットワークは無効になります)。この場合、statusは種類としてusb_netを報告します。シリアルデバイスのパス、または古いファームウェアでのusbは USB コンソールです。STM32 ポッドのコンソールには JSON モードがないため、ステータス、LA 電圧、電源のみを利用できます。1 台のコンピューターに複数のポッドを接続していると、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)を書き込む場合は、どちらも必要ありません。OpenOCD は embeddedci.com 側で実行されます。
クライアントのセットアップ
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 を指定してください。設定しない場合、エージェントは LA バンクに触れる前に set_la_voltage を呼び出すよう指示されます。
どちらの変数も省略できます。connect は次の順に接続先を選び、最初に見つかったものを使います。
connection引数。- サーバーのデフォルトである
--connection。 BENCHPOD_CONNECTION。benchpod set-connection <address|device|usb>で保存したbenchpod-cliのデフォルト接続先(読み取り専用。~/.config/benchpod-cli/config.jsonまたは$XDG_CONFIG_HOME配下から読み込みます)。- LAN 上の mDNS 検出。
これにより、CLI、SDK、MCP サーバーで保存済みの接続先を共有できます。最初の 4 つがどれも指定されていない場合、connect は discover と同様に mDNS 経由で LAN 上の BenchPod を探し、1 台だけ見つかった場合はそれに接続します。見つからない場合、または複数見つかった場合は、検出したポッド(名前とアドレス)と、代わりに指定する値(host[:port]、usb、またはクラウドポッド用の embeddedci:<device>。クラウドポッドは cloud_list_devices で一覧表示できます)を含むエラーが表示されます。そのため、ネットワーク上にポッドが 1 台だけなら、claude mcp add benchpod -- uvx embeddedci-mcp だけで十分です。エージェントに接続を依頼してください。
TLS。 ネットワークアドレスでは、ポッドが対応している場合(ファームウェア 3.9.3 以降)、ポート 8443 で TLS を使用し、初回利用時にポッドの証明書を benchpod-cli と共有する known_pods.json にピン留めします。古いポッドでは、従来どおり暗号化されていないポート 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 を妨げることはありません。
オプション
| フラグ | 環境変数 | デフォルト | |
|---|---|---|---|
--connection | BENCHPOD_CONNECTION | CLI に保存された接続。なければ mDNS | host[:port]、シリアルデバイス、usb、usb:<name>、discover、saved、またはembeddedci:<device>。未設定の場合は、benchpod set-connectionで保存された接続を使用し、それもなければ LAN 上のポッドを 1 台検索します |
--la-voltage | BENCHPOD_LA_VOLTAGE | — | 接続時に適用する LA I/O 電圧(1.8 または 3.3) |
| — | BENCHPOD_API_KEY | — | クラウドポッドおよび波形ライブラリ用(設定されていない場合、クラウドツールはbenchpod loginのセッションを使用します) |
| — | BENCHPOD_API_BASE | https://www.embeddedci.com | 別の embeddedci サーバー |
| — | BENCHPOD_WIRING | — | 保存済みプロファイルより優先される配線プロファイルファイル(.json/.toml) |
| — | BENCHPOD_WIRING_SOURCE | auto | localを指定すると、ポッドに保存された配線プロファイルを embeddedci.com に問い合わせません |
--lease-wait | — | 30 | クラウド:使用中のポッドを待つ秒数 |
--idle-timeout | — | 600 | クラウド:アイドル状態がこの秒数続いた後にリースを解放します(0 = 解放しません) |
--timeout | — | 30 | コマンドごとのデバイスタイムアウト |
--transport | — | stdio | stdioまたはhttp |
--host / --port | — | 127.0.0.1 / 8000 | HTTP バインドアドレス |
--auth-token | EMBEDDEDCI_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 クライアントで共有するポッド接続を 1 つ保持し、各クライアントのツール呼び出しを順番に処理します。
ツール
各ツールは、サーバー内での分類に従ってまとめられています。太字のパラメーターは必須です。それ以外はオプションで、デフォルトがある場合はそれが表示されています(デフォルトがない場合は、「配線プロファイルから取得」、「現在の設定を維持」、または「使用しない」を意味します)。単位はボルト、アンペア、秒、ヘルツです。LA チャネルの引数には数値(1~14)または配線プロファイル内の名前を指定します。各ツールの入力スキーマには説明、範囲、列挙値がすべて含まれているため、エージェントはこの表よりも詳しい情報を確認できます。
接続
| ツール | 用途 | パラメーター |
|---|---|---|
connect | 接続を開き(以前の接続があれば閉じ)、ステータス、機能、配線プロファイルの取得元を報告します。connection、または設定済みのデフォルト(--connection、BENCHPOD_CONNECTION、CLI に保存された接続)がない場合は、mDNS 経由で LAN 上のポッドを検索します。 | connection、la_voltage、lease_wait=30 |
disconnect | UART/CAN セッションと接続を閉じ、クラウドリースを解放します。 | なし |
status | ファームウェア、機能、LA 電圧、開いているセッション、警告を表示します(未接続時も動作します)。 | なし |
set_la_voltage | DUT に合わせて LA の I/O 電圧を選択します(1.8 V には rev3 ポッドが必要です)。 | voltage |
クラウド(embeddedci.com)
| ツール | 用途 | パラメーター |
|---|---|---|
cloud_list_devices | 接続せずに、embeddedci.com 組織内のポッドと、それぞれのオンライン状態を確認します。 | なし |
配線プロファイル
| ツール | 用途 | パラメーター |
|---|---|---|
wiring | 各 DUT 信号がどの LA チャンネルに接続されているか、および電源レール、UART のボーレート、SWD ターゲットを確認します。 | なし |
set_wiring | この接続の配線プロファイルを置き換えるか、embeddedci.com に保存します。 | profile、save=false |
電源
| ツール | 用途 | パラメーター |
|---|---|---|
power_on | ターゲットの電源レールをオンにします(ポッド側でのスケジュール設定も可能です)。 | efuse、delay |
power_off | ターゲットの電源レールをオフにします。 | efuse、delay |
power_status | ターゲット電源レール(内部 5 V(efuse 1)と外部(efuse 2))のオン/オフ、トリップ状態、バス電圧と電流、ポッド自体の消費電流を表示します。 | なし |
reset_target | ポッドのリセットピンから 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 | ポッドの 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 バイトを 16 進数で読み取ります。 | addr、length、file、sck、mosi、miso、cs、hz=6000000、mode=0 |
spi_transfer | SPI ピン上の任意のデバイスと全二重 SPI トランザクションを 1 回実行します。 | 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 | ポッドを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_types | ポッドがエミュレートするモデルと、そのアドレスおよび読み取り値(キー、単位、範囲、デフォルト値)を示します。 | なし |
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受信機
NMEAセンテンス(u-blox形式:RMC、VTG、GGA、GSA、GSV、GLL)を、ポッドの2つ目のUARTから1つのLAチャンネル経由でDUTのUARTに送信します。これにより、uart_openでコンソールを使用し続けられます。ゲートウェアv48(gps機能)が必要です。
| ツール | 用途 | パラメーター |
|---|---|---|
enable_gps | DUTのRXに接続されたチャンネルであるtxで受信機を起動します。位置は、測位間にcourse_degの方向へspeed_kmhで移動します。 | 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、baud、rate、epochs、overruns)と、出力される測位情報を示します。 | なし |
プル抵抗
| ツール | 用途 | パラメーター |
|---|---|---|
set_pull | バイアス抵抗を有効または解除します。LA1~LA6はプルアップ、LA7/LA8はプルダウンです。 | las、enabled |
pull_status | LA1~LA8のバイアス抵抗の状態、方向、値を示します。 | なし |
lan_tls | TLS経由でポッドのLAN APIを操作します(ファームウェア3.9.3以降):ポート8443、HTTPS専用設定、証明書のsha256(クライアントがピン留めする値)。HTTPS専用を無効にする操作と証明書の再生成には、TLS、USB、またはクラウド接続が必要です。 | https_only、regenerate |
usb_network | ポッドの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 出力の経路を設定し、校正済みの DC 電圧を出力します。 | path、volts |
current_out | 4-20 mA 出力(J9)に電流をアンペア単位で保持するか、その範囲を読み取ります。 | current |
adc_read | フロント SMA、DAC ループバック、または 4-20 mA 入力(J8)の校正済み読み取り値を 1 つ取得します。 | 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 で 2 回測定し、このポッドの DAC 出力の校正直線を保存します(ファームウェア 3.9.4 以降)。 | path、code1、volts1、code2、volts2 |
calibrate_adc_gain | DMM 校正済み出力とのループバックを使って、ADC ソースのゲインを測定します(ファームウェア 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 | 1 つのハードウェアトリガーを使い、同じ時間基準で 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 秒)。 | image |
CAN
| ツール | 目的 | パラメーター |
|---|---|---|
can_open | ポッドの CAN インターフェースを起動します(通常、ループバック、またはリッスン専用)。 | bitrate=500000、mode=normal、term=false |
can_write | クラシック CAN フレームを 1 つキューに登録します。 | can_id、data、ext=false、rtr=false |
can_read | 受信フレームを読み取るか、特定の ID のフレームを待ちます。 | timeout=0、can_id、max_frames=32 |
can_respond | ポッドのファームウェアから 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(サーバーの説明書)。
動作について
- 指示。 サーバーは初期化時に使用方法を指示します。セッションの開始方法、一般的な手順、単位、エラーに関する仕様を伝えるため、エージェントは何よりも先に
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を返します。 - 拒否。 ポッドまたはサーバーがコマンドを拒否すると、エラーにはその種類が示され、最後に何をすべきかを示す 1 行のヒントが付加されます。
PodLockedError(ポッドの LAN ポリシーにより、コマンドはクラウドまたは USB からの実行に制限されています)、PodLeasedError(クラウドジョブがポッドを使用中です。メッセージには使用者と使用期間が示されます)、PodBusyError(キャプチャまたはアップロードが実行中です)、PermissionDeniedError(認証情報に必要な権限がありません。たとえば API キーにbenchpod:adminスコープがありません)、TransportTimeout(ポッドから応答がありません)があります。リンクが切断された場合はConnectionClosedErrorです。UnsupportedFeatureErrorは、ポッドがその機能に対応していないことを示します。ファームウェアまたはゲートウェアにその機能がない場合や、アナログフロントエンドのないデジタル専用ボードの場合に発生し、ヒントには該当する理由が示されます。クラウドジョブがポッドを使用中の場合や、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は、ポッドが実行できる処理をフラグで報告するため、エージェントはツールを呼び出す前に確認できます。たとえばla_pins、capture_trigger、power_profile、nrst_pin、can、calibrate、cal_dmm、current_out、pod_current、analog(デジタル専用ボードでは false)に加え、ポッドのポリシーとクラウド設定(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を一度読み取ったエージェントは、ピン番号を指定せずにflash()、uart_open()、power_on()を呼び出せます。set_wiringは接続中のプロファイルを置き換えます。または、save: trueを指定すると embeddedci.com に保存します。 Web UI の Wiring タブで編集するものと同じプロファイルです。SDK は次の順に解決し、最初に一致したものを使用します。BENCHPOD_WIRING(ファイル)、embeddedci.com にこのポッド用に保存されたプロファイル(クラウドポッドの場合は名前で、LAN または USB ポッドの場合は、BENCHPOD_API_KEYまたはbenchpod loginのセッションが利用可能で、そのデバイスが同じアカウントに登録されている場合に、デバイスが登録先として報告する情報を使用)、デフォルト値。wiringとconnect/status(wiring_source)は、取得元がserver、file、dict(set_wiringから)またはdefaultsのどれかを報告します。検索に失敗した場合(サインインしていない、ポッドが登録されていない、サーバーに到達できない、別のアカウントである場合)は、デフォルト値が適用され、エラーにはなりません。LAN または USB 経由の場合、約 3 秒で検索を打ち切ります。STM32 ポッドの USB テキストコンソールでは登録情報を報告できないため、USB 経由ではデフォルト値が適用されます。BENCHPOD_WIRING_SOURCE=localを指定すると、検索をスキップします。 - エージェント向けキャプチャ。
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 チャンネルの所有者は、一度に 1 つ(なし、GPIO、UART プロキシ、SWD、エミュレートされたセンサー、またはステップトレイン)です。
la_pinsは一覧を表示し、gpio_mode/gpio_write/gpio_read/gpio_wait/gpio_pulseはチャンネルを制御および監視し、gpio_releaseは解放します。2 つ目の割り当てはPinConflictError: pin conflict: LA5 is in use by uart_rx; …で失敗し、所有者と解放方法が示されます。そのため、エージェントはそのチャンネルで 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 バスを開いたままにします。 - ゲートウェアイメージ。 ポッドの FPGA は
loopイメージ(control_loop)またはdeep_replayイメージ(2048 サンプルを超えるリプレイ)を実行します。control_loop、replay、replay_waveformは自動的に切り替え(約 3 秒)、そのことをswitched_imageとして報告します。switch_image: falseの場合は失敗します。切り替えによって FPGA がリセットされるため、実行中の DAC 出力、UART セッション、I2C センサーのエミュレーションは停止します。サーバーの指示では、その後にそれらを開始するようエージェントに伝えます。fpga_imageは明示的に切り替えます。 - ノンブロッキング。 ツールは 1 つのデバイスロックの下でワーカースレッド上で実行されます。5 分かかるフラッシュ処理でもサーバーは停止せず、進行状況の通知が送信され、同時呼び出しによってコマンドが割り込むこともありません。
- アノテーション。 読み取り専用ツール(
status、power_status、adc_read、…)には、クライアントが自動承認できるようマークが付けられています。電源供給、フラッシュ、電圧の駆動を行うツールには、破壊的操作としてマークが付けられています。
使用例
ベンチに接続し、
build/app.elfを STM32F4 に書き込んで(SWCLK は LA11、SWDIO は LA12、 リセット線は接続済み)、電源を入れ直して、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* リリースワークフローは、GitHub OIDC で認証し、PyPI へのアップロード(uvx embeddedci-mcp の実行に必要です)の後に公開します。pyproject.toml と合わせて、server.json の両方の version フィールドを更新してください。値が異なるとリリースは失敗し、CI も失敗します。
代わりに手動で公開するには:
mcp-publisher login github
mcp-publisher publish
Registry は、この README の先頭にある mcp-name コメントを通じて PyPI の所有権を確認します。
開発
pip install -e "../embeddedci[dev]" -e ".[dev]"
pytest
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。