MCP server exposing the EmbeddedCI BenchPod SDK as tools for AI agents
Project description
embeddedci-mcp
An MCP server that exposes the
embeddedci
BenchPod SDK as tools, so an AI agent can drive a real hardware-in-the-loop bench:
power a target board, flash it over SWD, capture its UART, and emulate/decode an
I2C sensor.
It's a thin consumer of the SDK — every tool maps directly to a
embeddedci.benchpod.BenchPod method.
Install
pip install embeddedci-mcp # pulls embeddedci from PyPI
# or run without installing:
uvx embeddedci-mcp --help
For local development from this repo, see the workspace README.
Run
# stdio (launched by an MCP client as a subprocess — the usual case):
embeddedci-mcp --transport stdio
# streamable HTTP (for a remote bench):
embeddedci-mcp --transport http --host 0.0.0.0 --port 8000
# preset a default connection so the `connect` tool needs no argument:
embeddedci-mcp --connection /dev/tty.usbserial-0001
embeddedci-mcp --connection 192.168.1.213 # wifi/TCP, default port 8080
The connection can also come from the BENCHPOD_CONNECTION environment variable.
Client configuration
Claude Desktop / Cursor (mcp.json / claude_desktop_config.json)
{
"mcpServers": {
"benchpod": {
"command": "uvx",
"args": ["embeddedci-mcp"],
"env": { "BENCHPOD_CONNECTION": "192.168.1.213" }
}
}
}
Use "command": "embeddedci-mcp" instead if it's installed on PATH.
Claude Code
claude mcp add benchpod -- uvx embeddedci-mcp
Tools
| Group | Tools |
|---|---|
| Lifecycle / status | connect, disconnect, ping, status |
| Power | power_on, power_off, target_power, target_status |
| Flash | flash |
| UART | capture_uart, power_cycle_and_capture |
| I2C sensor | enable_i2c_sensor, set_i2c_sensor, disable_i2c_sensor, i2c_sensor_status, i2c_sensor_regs, i2c_sensor_la_decoded, i2c_read_register |
| Pull-ups | enable_pullup, disable_pullup, pullup_status |
| Low-level | command, gpio_set, capture_adc, signal_generate, measure |
Device/firmware failures come back as {"ok": false, "error": ..., "error_type": ...}
rather than raising, so the agent can reason about them.
Resources
benchpod://wiring— the default LA channel → DUT signal pin map and eFuse table.benchpod://help— the canonical HIL workflow order.
Example agent flow
connect("192.168.1.213")flash(swclk=11, swdio=12, nreset=3, target="target/stm32f4x.cfg", file="app.elf", target_power=1)enable_pullup([1, 2])thenenable_i2c_sensor(sda=2, scl=1, temperature_c=22.5, pressure_pa=101000)power_cycle_and_capture(rx=5, tx=4, delay=1.5, duration=6.0, until_regex="APP_OK")i2c_sensor_status()/i2c_read_register(address=0x76, register=0xD0)to confirm the DUT probed the sensor.
Publishing to the MCP Registry
server.json is starter metadata for the
Official MCP Registry (currently in
preview). Ship the package to PyPI first (that's what makes uvx embeddedci-mcp
work), then publish the registry entry once the name is stable:
mcp-publisher publish # GitHub-authenticated; reads server.json
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file embeddedci_mcp-0.1.0.tar.gz.
File metadata
- Download URL: embeddedci_mcp-0.1.0.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6653c70373e9d126489f709148a9f54118d097467771e7d574c96ebe9ce6052f
|
|
| MD5 |
1dc0629a8932d21dff162ae109d0d039
|
|
| BLAKE2b-256 |
095f044210eed0aa623819934eb3f18363312d847b9918e6689d3abf0f3d089b
|
Provenance
The following attestation bundles were made for embeddedci_mcp-0.1.0.tar.gz:
Publisher:
publish.yml on embeddedci-com/embeddedci-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
embeddedci_mcp-0.1.0.tar.gz -
Subject digest:
6653c70373e9d126489f709148a9f54118d097467771e7d574c96ebe9ce6052f - Sigstore transparency entry: 1810226600
- Sigstore integration time:
-
Permalink:
embeddedci-com/embeddedci-python@716f16414dae1fb62cc8e60b05d4d1918ae2586a -
Branch / Tag:
refs/tags/embeddedci-mcp-v0.1.0 - Owner: https://github.com/embeddedci-com
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@716f16414dae1fb62cc8e60b05d4d1918ae2586a -
Trigger Event:
push
-
Statement type:
File details
Details for the file embeddedci_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: embeddedci_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f41c69a76c29f28eed76c9228d51e3464c5972e90933405e4d2925890a431ff3
|
|
| MD5 |
3fb25af314e5d1794a9163b44949376a
|
|
| BLAKE2b-256 |
da7d842bdfb5e5d0ffbdd8864992b5cb1b8ef2f0dd0529d022a805c59a2ac5e8
|
Provenance
The following attestation bundles were made for embeddedci_mcp-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on embeddedci-com/embeddedci-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
embeddedci_mcp-0.1.0-py3-none-any.whl -
Subject digest:
f41c69a76c29f28eed76c9228d51e3464c5972e90933405e4d2925890a431ff3 - Sigstore transparency entry: 1810226624
- Sigstore integration time:
-
Permalink:
embeddedci-com/embeddedci-python@716f16414dae1fb62cc8e60b05d4d1918ae2586a -
Branch / Tag:
refs/tags/embeddedci-mcp-v0.1.0 - Owner: https://github.com/embeddedci-com
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@716f16414dae1fb62cc8e60b05d4d1918ae2586a -
Trigger Event:
push
-
Statement type: