mcpField
E
EmbeddedCI BenchPod

EmbeddedCI BenchPod

ローカル
embeddedci.com開発ツール0今日更新

EmbeddedCI BenchPod について

EmbeddedCI BenchPodは、実機に接続されたハードウェア・イン・ザ・ループテスターを操作するMCPサーバーです。embeddedci SDKを介して、電源制御、書き込み、シリアルやバス通信、信号測定を行い、組み込みファームウェアの開発とテストを支援します。

主な機能

  1. 01ターゲットの電源とリセットを制御
  2. 02SWD経由でファームウェアを書き込み
  3. 03UARTを監視しSPIを操作
  4. 04I2C、CAN、ロジック信号を観測
  5. 05アナログ信号の出力と測定
  6. 06電圧、電流、電力量を測定

活用シーン

  1. 01実機ボードにファームウェアを書き込んでテスト
  2. 02電源を再投入して起動時の出力を確認
  3. 03センサーを模擬してバス通信を調査
  4. 04ターゲットボードの消費電力を測定

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 経由で LAN 上にある唯一の pod を探します。
la_voltageanyいいえ接続直後に LA I/O バンクの電圧(DUT の I/O 電圧)を選択します。
lease_waitnumberいいえクラウドのみ:別の実行が共有デバイスを使用している場合に待機する秒数。

詳細

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 は次の順に接続先を選び、最初に見つかったものを使います。

  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. 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 を妨げることはありません。

オプション

フラグ環境変数デフォルト
--connectionBENCHPOD_CONNECTIONCLI に保存された接続。なければ mDNShost[:port]、シリアルデバイス、usb、usb:<name>、discover、saved、またはembeddedci:<device>。未設定の場合は、benchpod set-connectionで保存された接続を使用し、それもなければ LAN 上のポッドを 1 台検索します
--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 クライアントで共有するポッド接続を 1 つ保持し、各クライアントのツール呼び出しを順番に処理します。

ツール

各ツールは、サーバー内での分類に従ってまとめられています。太字のパラメーターは必須です。それ以外はオプションで、デフォルトがある場合はそれが表示されています(デフォルトがない場合は、「配線プロファイルから取得」、「現在の設定を維持」、または「使用しない」を意味します)。単位はボルト、アンペア、秒、ヘルツです。LA チャネルの引数には数値(1~14)または配線プロファイル内の名前を指定します。各ツールの入力スキーマには説明、範囲、列挙値がすべて含まれているため、エージェントはこの表よりも詳しい情報を確認できます。

接続
ツール用途パラメーター
connect接続を開き(以前の接続があれば閉じ)、ステータス、機能、配線プロファイルの取得元を報告します。connection、または設定済みのデフォルト(--connection、BENCHPOD_CONNECTION、CLI に保存された接続)がない場合は、mDNS 経由で LAN 上のポッドを検索します。connection、la_voltage、lease_wait=30
disconnectUART/CAN セッションと接続を閉じ、クラウドリースを解放します。なし
statusファームウェア、機能、LA 電圧、開いているセッション、警告を表示します(未接続時も動作します)。なし
set_la_voltageDUT に合わせて 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_infoSPI ピンに接続された SPI NOR フラッシュの JEDEC ID とサイズを読み取ります。sck、mosi、miso、cs、hz=1000000、mode=0
spi_flash_programSPI 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_transferSPI ピン上の任意のデバイスと全二重 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_openDUTの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_gpsDUTの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_statusLA1~LA8のバイアス抵抗の状態、方向、値を示します。なし
lan_tlsTLS経由でポッドの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_pins14 個の LA チャンネルそれぞれの用途、GPIO モード、レベル、バイアス抵抗を確認します。なし
gpio_modeLA チャンネルを GPIO として割り当てます(入力、出力、オープンドレイン)。la、mode=output、level
gpio_writeGPIO 出力チャンネルとオープンドレインチャンネルのレベルを設定します。la、level
gpio_readLA チャンネルの現在のレベルを取得します(la を省略すると、14 チャンネルすべてを取得します)。la
gpio_waitLA チャンネルが指定レベルを読み取るまで待機します(タイムアウト時は reached: false になります)。la、level=1、timeout=5
gpio_pulseLA チャンネルに FPGA タイミングのパルスを出力します。width は 4 us から 65.535 ms、count は最大 65535 です。la、width、count=1
gpio_releaseチャンネルをハイインピーダンスに戻します。キャプチャで監視されます。la
アナログ
ツール用途パラメーター
analog_path名前付きのパスに対応するすべてのアナログマルチプレクサーとリレーを一度に設定します。path
dac_outputDAC 出力の経路を設定し、校正済みの DC 電圧を出力します。path、volts
current_out4-20 mA 出力(J9)に電流をアンペア単位で保持するか、その範囲を読み取ります。current
adc_readフロント SMA、DAC ループバック、または 4-20 mA 入力(J8)の校正済み読み取り値を 1 つ取得します。source=ext
calibration保存済みの校正情報を確認します。ADC オフセット(4-20 mA 入力で測定)と適用する近似式に加え、DMM の校正値とゲインも確認できます(ファームウェア 3.9.4 以降)。なし
calibrate4-20 mA 入力(J8 開放)の ADC オフセットを測定して保存するか、校正情報(すべて、または一部)を消去します。source=current_in、clear=false、clear_part
calibrate_dacdac_output で出力した設定値を DMM で 2 回測定し、このポッドの DAC 出力の校正直線を保存します(ファームウェア 3.9.4 以降)。path、code1、volts1、code2、volts2
calibrate_adc_gainDMM 校正済み出力とのループバックを使って、ADC ソースのゲインを測定します(ファームウェア 3.9.4 以降)。source
キャプチャとデコード
ツール用途パラメーター
capture_adcADC をキャプチャし、校正済み統計値、支配的な周波数、最小/最大の包絡線を取得します。samples=4096、sample_rate_hz、source、points=200、trigger_la、trigger_edge=rising、trigger_timeout=10
capture_la14 個の LA チャンネルすべてをキャプチャし、チャンネルごとのレベル、エッジ数、最初のエッジ、周波数を取得します。samples=4096、sample_rate_hz、stop_dac_after、trigger_la、trigger_edge=rising、trigger_timeout=10
capture_correlated1 つのハードウェアトリガーを使い、同じ時間基準で 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
ツール目的パラメーター
generateDAC 出力に正弦波、矩形波、またはのこぎり波を出力します(電圧、または 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_loopFPGA でテーブル形式の伝達関数を実行します(例:ソーラーパネルの 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_imageFPGA を 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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。