EmbeddedCI BenchPod
PYPI · EMBEDDEDCI-MCP · SCANNED SEP 23
Drive a BenchPod hardware-in-the-loop bench: power, flash, UART, I2C, CAN, analog and logic.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 31 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability0
- Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.Unverified
Stability & Change Management0
- Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.Unverified
Tool Coverage0
- Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet.Unverified
Tool Safety0
- Tool safety not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet.Unverified
Capabilities0
- Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet.Unverified
Unverified: 5 categories
Categories scored 0 because our sandbox run of this package has not given us the schema these checks need to read. That is a gap on our side rather than a finding about the package, and we only credit what we can confirm, so the score stands at 0 until the capture succeeds. We are working through the fleet, so this normally clears without any action from you. How we score packages →
How do I install the EmbeddedCI BenchPod MCP server?
EmbeddedCI BenchPod runs locally as a PyPI package, launched with uvx embeddedci-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · embeddedci-mcp
claude mcp add embeddedci-com-embeddedci-mcp -- uvx embeddedci-mcp
{
"mcpServers": {
"embeddedci-com-embeddedci-mcp": {
"command": "uvx",
"args": [
"embeddedci-mcp"
]
}
}
} {
"servers": {
"embeddedci-com-embeddedci-mcp": {
"command": "uvx",
"args": [
"embeddedci-mcp"
]
}
}
} codex mcp add embeddedci-com-embeddedci-mcp -- uvx embeddedci-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"embeddedci-com-embeddedci-mcp": {
"type": "local",
"command": [
"uvx",
"embeddedci-mcp"
],
"enabled": true
}
}
} openclaw mcp add embeddedci-com-embeddedci-mcp --command uvx --arg embeddedci-mcp
mcp_servers:
embeddedci-com-embeddedci-mcp:
command: "uvx"
args: ["embeddedci-mcp"] {
"McpServers": {
"embeddedci-com-embeddedci-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"embeddedci-mcp"
]
}
}
} assistant mcp add embeddedci-com-embeddedci-mcp -t stdio -c uvx -a embeddedci-mcp
{
"mcpServers": {
"embeddedci-com-embeddedci-mcp": {
"command": "uvx",
"args": [
"embeddedci-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 23 Sept 26 −33
- Stability: 0.03 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 2.1.0 → 2.1.1 functional
- 22 Sept 26 0
- Tool safety: pass → unverified ▼ security
- Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Stability: unverified → 0.03 ▲ functional
- Package version: 2.0.0 → 2.1.0 functional
- 21 Sept 26 69
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 23 Sept 2026 · Analysed pypi/embeddedci-mcp@2.1.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 31 packages
| Packages resolved | 31 |
|---|---|
| Stale | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
adc_read ~59
One calibrated voltage: ext = front SMA (true volts), cal1/cal2 = DAC loopbacks, amp = current terminal. Refused while the input is still moving (e.g. a DAC output left running).
| Name | Type | Req | Description |
|---|---|---|---|
| source | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| source | string | yes | – |
| span | integer | yes | – |
| voltage | number | yes | – |
No examples provided.
analog_path ~90
Set every analog mux and relay for a named path in one step. dac_3v3/dac_5v/dac_12v route the DAC to an output; adc_ext connects the ADC to the front SMA; cal1/cal2 loop the 5 V/12 V DAC output back into the ADC; amp reads the current terminal; off parks everything.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
No examples provided.
can_close ~20
Clear responder rules and stop CAN (safe when not open).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| bitrate | – | – | – |
| mode | – | – | – |
| open | boolean | yes | – |
| term | – | – | – |
No examples provided.
can_open ~72
Bring up the pod's CAN interface (replacing any open CAN session).
| Name | Type | Req | Description |
|---|---|---|---|
| bitrate | integer | – | – |
| mode | string | – | normal = on a bus with other nodes; internal/external = loopback self-test; listen = silent. |
| term | boolean | – | Engage the 120 ohm termination. |
| Name | Type | Req | Description |
|---|---|---|---|
| bitrate | – | – | – |
| mode | – | – | – |
| open | boolean | yes | – |
| term | – | – | – |
No examples provided.
can_read ~68
Read received CAN frames (id, data, timestamps in pod milliseconds).
| Name | Type | Req | Description |
|---|---|---|---|
| can_id | – | – | – |
| max_frames | integer | – | – |
| timeout | number | – | With can_id: wait up to this long for it. Without: collect frames for this long (0 = what is buffered). |
| Name | Type | Req | Description |
|---|---|---|---|
| frames | array | yes | – |
| matched | – | – | – |
No examples provided.
can_respond ~77
Make the pod firmware answer a CAN id instantly (ECU simulation), or clear all rules.
| Name | Type | Req | Description |
|---|---|---|---|
| clear | boolean | – | Remove all responder rules instead of adding one. |
| match_ext | boolean | – | – |
| match_id | – | – | – |
| reply_data | – | – | – |
| reply_ext | boolean | – | – |
| reply_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cleared | boolean | – | – |
| rules | – | – | – |
No examples provided.
can_status ~22
CAN link state: mode, bitrate, error counters, bus-off.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| reply | object | – | – |
No examples provided.
can_write ~53
Queue one classic CAN frame.
| Name | Type | Req | Description |
|---|---|---|---|
| can_id | integer | yes | – |
| data | – | – | 0-8 data bytes. |
| ext | boolean | – | 29-bit extended identifier. |
| rtr | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| queued | boolean | – | – |
No examples provided.
capture_adc ~224
Capture the ADC and summarise it: calibrated stats, dominant frequency and a min/max envelope. Above 32768 samples the capture streams from PSRAM (multi-second captures work). With trigger_la the capture waits for that edge or level, so t = 0 is the trigger moment. The capture is kept for replay and save_capture_as_recording.
| Name | Type | Req | Description |
|---|---|---|---|
| points | integer | – | Points in the returned min/max envelope. |
| sample_rate_hz | – | – | Sample rate in Hz; omit for the device maximum. |
| samples | integer | – | – |
| source | – | – | Route this ADC source first; omit to keep routing. |
| trigger_edge | string | – | What starts the capture on trigger_la. |
| trigger_la | – | – | Wait for an edge or level on this LA channel (a number, or a wiring-profile name) before sampling, so t = 0 is that moment. Omit for a free-running capture. Needs the capture_trigger capability. |
| trigger_timeout | number | – | Seconds to wait for the trigger before the capture is abandoned with a TriggerTimeout. |
| Name | Type | Req | Description |
|---|---|---|---|
| dominant_frequency_hz | – | – | – |
| duration | number | yes | – |
| envelope_max | array | yes | – |
| envelope_min | array | yes | – |
| envelope_step | number | yes | Seconds covered by each envelope point. |
| max | number | yes | – |
| mean | number | yes | – |
| min | number | yes | – |
| peak_to_peak | number | yes | – |
| rms | number | yes | – |
| rms_ac | number | yes | – |
| sample_rate_hz | number | yes | – |
| samples | integer | yes | – |
| source | – | – | – |
| trigger | – | – | The trigger that started the capture, e.g. 'LA9 rising'; null for a free-running capture. t = 0 is the trigger moment. |
No examples provided.
capture_correlated ~214
ADC and LA captured from one hardware trigger, so their timebases align. Both are kept. With trigger_la both streams start on that edge or level.
| Name | Type | Req | Description |
|---|---|---|---|
| adc_sample_rate_hz | – | – | Sample rate in Hz; omit for the device maximum. |
| adc_samples | integer | – | – |
| la_sample_rate_hz | – | – | Sample rate in Hz; omit for the device maximum. |
| la_samples | integer | – | – |
| points | integer | – | Points in the returned min/max envelope. |
| stop_dac_after | – | – | Seconds into the capture to cut a running DAC. |
| trigger_edge | string | – | What starts both streams on trigger_la. |
| trigger_la | – | – | Wait for an edge or level on this LA channel (a number, or a wiring-profile name) before sampling, so t = 0 is that moment. Omit for a free-running capture. Needs the capture_trigger capability. |
| trigger_timeout | number | – | Seconds to wait for the trigger before the capture is abandoned with a TriggerTimeout. |
| Name | Type | Req | Description |
|---|---|---|---|
| adc | – | yes | – |
| la | – | yes | – |
No examples provided.
capture_la ~208
Capture all 14 LA channels and summarise each: levels, edge count, first edge, estimated frequency. With trigger_la the capture starts on that edge or level instead of immediately, so a short event can be caught at a high sample rate. The capture is kept for decode_la and la_timing.
| Name | Type | Req | Description |
|---|---|---|---|
| sample_rate_hz | – | – | Sample rate in Hz; omit for the device maximum. |
| samples | integer | – | – |
| stop_dac_after | – | – | Seconds into the capture to cut a running DAC output (see the DUT react). |
| trigger_edge | string | – | What starts the capture on trigger_la. |
| trigger_la | – | – | Wait for an edge or level on this LA channel (a number, or a wiring-profile name) before sampling, so t = 0 is that moment. Omit for a free-running capture. Needs the capture_trigger capability. |
| trigger_timeout | number | – | Seconds to wait for the trigger before the capture is abandoned with a TriggerTimeout. |
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | yes | – |
| duration | number | yes | – |
| sample_rate_hz | number | yes | – |
| samples | integer | yes | – |
| trigger | – | – | The trigger that started the capture, e.g. 'LA9 rising'; null for a free-running capture. t = 0 is the trigger moment. |
No examples provided.
capture_uart ~134
Record the DUT's UART output for a fixed window (or until until_regex matches). The channels and baud come from the wiring profile when omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| baud | – | – | UART baud rate; omit for the wiring profile's uart_baud. |
| duration | number | yes | Capture window in seconds. |
| rx | – | – | LA channel (or wiring name) wired to the DUT's TX; omit for the profile's uart_rx. |
| tx | – | – | LA channel (or wiring name) wired to the DUT's RX; omit for the profile's uart_tx. |
| until_regex | – | – | Python regular expression; stop as soon as it matches. |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | – |
| matched | boolean | yes | – |
| text | string | yes | – |
| truncated | boolean | yes | text keeps the start and the end when output is long. |
No examples provided.
command ~49
Escape hatch for firmware commands no tool covers. Prefer the dedicated tools.
| Name | Type | Req | Description |
|---|---|---|---|
| request | object | yes | A firmware JSON command with a "cmd" key, e.g. {"cmd": "usb_cc"}. |
| Name | Type | Req | Description |
|---|---|---|---|
| reply | – | – | – |
No examples provided.
connect ~159
Open a BenchPod connection (closing any previous one and its sessions) and report status. Over the cloud the device is shared: this takes an exclusive lease, released by `disconnect` or after the server's idle timeout (the next tool call then reconnects).
| Name | Type | Req | Description |
|---|---|---|---|
| connection | – | – | host[:port] (TCP, default port 8080), a serial device path, 'usb' (auto-detect), 'discover' (mDNS) or 'embeddedci:<device-name>' (cloud). Omit for the server default. |
| la_voltage | – | – | Select the LA I/O-bank voltage right after connecting (the DUT's I/O voltage). |
| lease_wait | number | – | Cloud only: seconds to wait when another run holds the shared device. |
| Name | Type | Req | Description |
|---|---|---|---|
| capabilities | – | – | – |
| connected | boolean | yes | – |
| connection | – | – | – |
| firmware | object | – | The pod's raw status report. |
| kind | – | – | tcp, serial, discover or embeddedci (cloud). |
| la_voltage | – | – | Selected LA bank voltage; null = not set. |
| leased | boolean | – | – |
| session | – | – | – |
| warnings | array | – | – |
No examples provided.
control_loop ~271
Run a tabulated transfer function in the FPGA: each tick out = curve[input], damped and clamped. Needs the loop gateware image, switched to automatically. Poll with loop_probe, move the input with loop_input, stop with dac_stop.
| Name | Type | Req | Description |
|---|---|---|---|
| curve | – | – | Transfer function: DAC output codes indexed by input (1-2048 points, spread over the input range). |
| input_code | integer | – | – |
| input_map | – | – | – |
| k | integer | – | Damping, Q15 (32767 = jump straight to the target). |
| points | integer | – | – |
| sharpness | number | – | Knee sharpness of the panel preset. |
| source | – | – | adc = closed loop; fixed = hold input_code (open loop); sweep = advance by step each tick. |
| step | integer | – | – |
| switch_image | boolean | – | If the pod is on the other gateware image, switch it first (~3 s). The switch resets the FPGA, stopping any DAC output, UART session or I2C sensor emulation. false = fail instead. |
| tick_div | integer | – | – |
| vmax | integer | – | – |
| vmin | integer | – | – |
| voc_code | – | – | Instead of curve: solar-panel I-V preset with this open-circuit code. |
| Name | Type | Req | Description |
|---|---|---|---|
| armed | boolean | yes | – |
| curve_points | integer | yes | – |
| input_code | integer | yes | – |
| k | integer | yes | – |
| source | – | yes | – |
| step | integer | yes | – |
| switched_image | – | – | The gateware image this call switched the pod to; null when no switch was needed. |
| tick_div | integer | yes | – |
| vmax | integer | yes | – |
| vmin | integer | yes | – |
No examples provided.
dac_output ~65
Route a DAC output (3v3, 5v, 12v = ±12 V, or off) and drive a calibrated DC voltage on it.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| volts | – | – | Calibrated DC volts to drive; omit to only route. |
| Name | Type | Req | Description |
|---|---|---|---|
| code | – | yes | – |
| path | string | yes | – |
| voltage | – | yes | Voltage produced; null when only routing. |
No examples provided.
dac_stop ~20
Stop any DAC output: generator, replay or control loop.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| stopped | boolean | – | – |
No examples provided.
decode_la ~174
Decode I2C (sda, scl), UART (rx, baud) or SPI (sclk + mosi/miso/cs, mode) from LA data. Sample at least ~10x the bit rate. Decoding the last capture again with other channels is free.
| Name | Type | Req | Description |
|---|---|---|---|
| baud | – | – | – |
| capture | string | – | last = decode the previous capture_la; new = capture first (needs samples/sample_rate_hz). |
| cs | – | – | – |
| max_items | integer | – | – |
| miso | – | – | – |
| mode | integer | – | – |
| mosi | – | – | – |
| protocol | string | yes | – |
| rx | – | – | – |
| sample_rate_hz | number | – | – |
| samples | integer | – | – |
| scl | – | – | – |
| sclk | – | – | – |
| sda | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| items | array | yes | – |
| protocol | string | yes | – |
| text | – | – | UART only: the decoded bytes as text. |
| truncated | boolean | yes | – |
No examples provided.
disable_i2c_sensor ~24
Disarm the emulated sensor (safe when none is active).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| stopped | boolean | – | – |
No examples provided.
disconnect ~26
Close UART/CAN sessions and the connection, releasing a cloud lease. Safe when not connected.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| capabilities | – | – | – |
| connected | boolean | yes | – |
| connection | – | – | – |
| firmware | object | – | The pod's raw status report. |
| kind | – | – | tcp, serial, discover or embeddedci (cloud). |
| la_voltage | – | – | Selected LA bank voltage; null = not set. |
| leased | boolean | – | – |
| session | – | – | – |
| warnings | array | – | – |
No examples provided.
enable_i2c_sensor ~155
Make the pod act as a BMP280 on sda/scl for the DUT to read. Engage pull-ups on both lines first (set_pull). The channels and address come from the wiring profile when omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| address | – | – | 7-bit address (BMP280: 0x76 or 0x77); omit for the profile's i2c_addr. |
| pressure_pa | – | – | – |
| scl | – | – | LA channel (or wiring name) of the bus's SCL; omit for the profile's i2c_scl. |
| sda | – | – | LA channel (or wiring name) of the bus's SDA; omit for the profile's i2c_sda. |
| temperature_c | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| reply | object | – | – |
No examples provided.
flash ~326
Program the DUT over SWD through the pod's CMSIS-DAP probe (OpenOCD runs on this server's host). The SWD pins, the reset flag and the target config come from the wiring profile when omitted. A failed flash is a normal result (ok=false): read target_unreachable (unpowered, mis-wired or held in reset), stalled, and the log tails to decide what to change.
| Name | Type | Req | Description |
|---|---|---|---|
| connect_attempts | integer | – | – |
| connect_under_reset | – | – | – |
| extra_args | – | – | – |
| extra_configs | – | – | – |
| file | string | – | Firmware image path on the machine running this server. |
| load_address | string | – | Load address for raw .bin images, e.g. 0x08000000. |
| nreset | – | – | The target's reset line is wired to the pod's reset pin: enables connect-under-reset. Omit for the profile's swd_nreset. |
| reset | boolean | – | – |
| swclk | – | – | LA channel (or wiring name) wired to the DUT's SWCLK; omit for the profile's swd_swclk. |
| swdio | – | – | LA channel (or wiring name) wired to the DUT's SWDIO; omit for the profile's swd_swdio. |
| target | string | – | OpenOCD target config, e.g. target/stm32f4x.cfg; omit for the profile's swd_target. |
| target_power | – | – | Power this eFuse on before flashing. |
| timeout | number | – | – |
| verify | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| ok | boolean | yes | – |
| returncode | integer | yes | – |
| stalled | boolean | yes | – |
| stderr_tail | string | yes | – |
| stdout_tail | string | yes | – |
| target_unreachable | boolean | yes | – |
No examples provided.
fpga_image ~87
Reprogram the pod's FPGA with another stored gateware image (~2-3 s). Rarely needed: control_loop, replay and replay_waveform switch automatically. The switch resets the FPGA (any DAC output, UART session or I2C sensor emulation stops).
| Name | Type | Req | Description |
|---|---|---|---|
| image | string | yes | loop = control-loop image; deep_replay = deep DAC replay from PSRAM. |
| Name | Type | Req | Description |
|---|---|---|---|
| features | integer | yes | – |
| image | string | yes | – |
| version | integer | yes | – |
No examples provided.
generate ~174
Drive a sine, square or sawtooth on a DAC output (built from 8-bit levels).
| Name | Type | Req | Description |
|---|---|---|---|
| amplitude | number | yes | Peak volts. |
| dac_path | string | – | – |
| duration | – | – | Seconds; omit to run until dac_stop. |
| freq_hz | number | yes | – |
| offset | – | – | Centre volts; default mid-range of dac_path. |
| on_capture | boolean | – | Start on the next capture's hardware t0 (phase-locked). |
| route | boolean | – | Route dac_path first. false = keep the current analog path (e.g. after analog_path('cal1') for a DAC-to-ADC loopback); dac_path then only sets the volts scaling. |
| sample_rate_hz | – | – | Sample rate in Hz; omit for the device maximum. |
| waveform | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cotrig | boolean | yes | – |
| dac_path | string | yes | – |
| freq_hz | number | yes | – |
| waveform | string | yes | – |
No examples provided.
gpio_mode ~182
Claim LA channels as GPIO so the pod can drive or read them. A channel stays GPIO — across disconnects — until gpio_release, and while it is GPIO nothing else can use it: release it before uart_open, flash or enable_i2c_sensor on that channel. A channel already owned by another function is refused with a PinConflictError naming the owner, and an engaged bias resistor that would fight the mode with a PullConflictError.
| Name | Type | Req | Description |
|---|---|---|---|
| la | array | yes | LA channels as numbers 1-14 or wiring-profile names. |
| level | – | – | Starting level of an output (default 0) or open-drain channel (default 1, released). Not allowed for input. |
| mode | string | – | output = push-pull; open_drain = 0 pulls low and 1 releases; input = high-Z, level readable. |
| Name | Type | Req | Description |
|---|---|---|---|
| pins | array | yes | The channels this call configured or released. |
No examples provided.
gpio_pulse ~153
Emit FPGA-timed pulses on an LA channel — a trigger for the DUT, or a step/dir motor train. The channel must be free or a GPIO output at level 0 (it returns to its GPIO level afterwards). The FPGA runs the train by itself, so this returns as soon as it starts.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Number of pulses. |
| la | – | yes | LA channel 1-14, or a name from the wiring profile — a signal ('READY') or a role ('uart_rx', 'i2c_sda', 'swd_swclk'). Call `wiring` to see the names. |
| width | number | yes | Seconds the pulse is high (and low between pulses). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| la | integer | yes | – |
| width | number | yes | Seconds each pulse is high (and low between pulses). |
No examples provided.
gpio_read ~65
The live level (0/1) of LA channels — omit `la` for all 14. Works whatever owns a channel; a GPIO input is the usual way to watch a DUT output.
| Name | Type | Req | Description |
|---|---|---|---|
| la | – | – | LA channels as numbers 1-14 or wiring-profile names. |
| Name | Type | Req | Description |
|---|---|---|---|
| levels | array | yes | – |
No examples provided.
gpio_release ~80
Stop using channels as GPIO — they go back to high-Z, watched by captures. Omit `la` to release every GPIO channel (channels owned by other functions are left alone). Do this before starting a UART session, flashing or emulating a sensor on those channels.
| Name | Type | Req | Description |
|---|---|---|---|
| la | – | – | LA channels as numbers 1-14 or wiring-profile names. |
| Name | Type | Req | Description |
|---|---|---|---|
| released | array | yes | Channels released; empty list = every GPIO channel. |
No examples provided.
gpio_wait ~152
Wait until an LA channel reads `level` (reached=false when the timeout passes first). Polled from this host, so it resolves to a few milliseconds plus the round trip — for precise timing use a triggered capture (capture_la trigger_la) and la_timing instead.
| Name | Type | Req | Description |
|---|---|---|---|
| la | – | yes | LA channel 1-14, or a name from the wiring profile — a signal ('READY') or a role ('uart_rx', 'i2c_sda', 'swd_swclk'). Call `wiring` to see the names. |
| level | integer | – | 0 = low; 1 = high (open_drain: released). |
| timeout | number | – | Seconds to wait. |
| Name | Type | Req | Description |
|---|---|---|---|
| la | integer | yes | – |
| level | integer | yes | – |
| reached | boolean | yes | False means the timeout passed without the channel reaching level. |
| waited | number | yes | Seconds spent waiting. |
No examples provided.
gpio_write ~86
Set the level of GPIO output / open-drain channels (all of them in one pod command). The channels must already be in an output or open_drain mode (gpio_mode).
| Name | Type | Req | Description |
|---|---|---|---|
| la | array | yes | LA channels as numbers 1-14 or wiring-profile names. |
| level | integer | yes | 0 = low; 1 = high (open_drain: released). |
| Name | Type | Req | Description |
|---|---|---|---|
| la | array | yes | – |
| level | integer | yes | – |
No examples provided.
i2c_sensor_capture ~85
Capture and decode the emulated sensor's I2C bus into a transaction trace (S/Sr/P, addr, data, ACK).
| Name | Type | Req | Description |
|---|---|---|---|
| address | – | – | Also report whether the DUT addressed this device. |
| register | – | – | With address: the bytes the DUT read from this register. |
| sample_rate_hz | number | – | – |
| samples | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| addressed | – | – | – |
| addresses | array | yes | – |
| register_value | – | – | – |
| trace | string | yes | – |
| transactions | integer | yes | – |
| truncated | boolean | yes | – |
No examples provided.
i2c_sensor_regs ~34
Read the emulated sensor's register image.
| Name | Type | Req | Description |
|---|---|---|---|
| length | integer | – | – |
| start | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | array | yes | – |
| start | integer | yes | – |
No examples provided.
i2c_sensor_status ~29
Emulated sensor state plus bus activity counters — did the DUT talk to it at all?
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| reply | object | – | – |
No examples provided.
la_pins ~108
What owns each of the 14 LA channels — none (free), gpio, uart_rx/uart_tx, swd_clk/swd_dio, i2c_sda/i2c_scl or step — plus each channel's GPIO mode, commanded level and bias resistor. Read this when a tool is refused with a pin conflict: it names the owner to stop. Live pin levels come along when the gateware can read them. Captures observe every channel whatever owns it.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| levels | – | – | Live pin levels; null when the gateware cannot read them (no gpio_read capability). |
| pins | array | yes | – |
No examples provided.
la_step ~96
Emit step pulses on an LA channel (step/dir motor drivers); with dir_la, set direction first. The FPGA runs the train by itself; this returns as soon as it starts.
| Name | Type | Req | Description |
|---|---|---|---|
| delay | number | yes | Seconds between step pulses. |
| dir_la | – | – | – |
| direction | integer | – | – |
| la | integer | yes | LA channel (1-14) the signal is wired to. |
| steps | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| delay | number | yes | – |
| la | integer | yes | – |
| status | string | – | – |
| steps | integer | yes | – |
No examples provided.
la_timing ~164
Timing of one channel of the last capture_la / capture_correlated: edge timestamps, pulse widths, frequency and duty cycle; with to_la, the delay from its first edge to the next edge on to_la (e.g. a trigger pin to a "result ready" pin). Resolution is one sample; no new capture is taken.
| Name | Type | Req | Description |
|---|---|---|---|
| after | number | – | Ignore edges earlier than this many seconds into the capture. |
| edge | string | – | Which transitions to list and to time the delay from. |
| la | integer | yes | LA channel (1-14) the signal is wired to. |
| max_edges | integer | – | – |
| to_edge | string | – | – |
| to_la | – | – | Also measure the delay to the next to_edge on this channel. |
| Name | Type | Req | Description |
|---|---|---|---|
| delay | – | – | Seconds from the first `edge` on la (at or after `after`) to the next `to_edge` on to_la; null when to_la is not given or either edge is missing. |
| duty_cycle | number | yes | – |
| edge | string | yes | – |
| edge_times | array | yes | Edge timestamps in seconds from the capture start. |
| frequency_hz | – | – | From the rising edges; null with fewer than two. |
| high_pulses | – | yes | – |
| la | integer | yes | – |
| low_pulses | – | yes | – |
| resolution | number | yes | Timestamp resolution in seconds (one sample). |
| to_la | – | – | – |
| truncated | boolean | yes | More edges exist than edge_times lists. |
No examples provided.
list_waveforms ~28
The organisation's cloud waveform library (needs a cloud connection or BENCHPOD_API_KEY).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| waveforms | array | yes | – |
No examples provided.
loop_input ~45
Re-target the running loop's input without re-arming (hold a point, meter, move on).
| Name | Type | Req | Description |
|---|---|---|---|
| input_code | – | – | – |
| source | – | – | – |
| step | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| input_code | integer | yes | – |
| output_code | integer | yes | – |
| source | – | yes | – |
| step | integer | yes | – |
No examples provided.
loop_probe ~29
The running loop's live operating point; assert against loop_input, not i, in open-loop runs.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| i | integer | yes | Latest raw ADC reading. |
| input_code | – | yes | – |
| loop_input | integer | yes | The value the loop indexed the curve with. |
| source | – | yes | – |
| v | integer | yes | DAC code driven this tick. |
No examples provided.
measure_power ~209
Measure the DUT's supply current and voltage for a window: average, minimum and peak current, voltage, energy and charge (gap-free sampling, so energy is integrated, not estimated). Use this for a self-contained window (a boot, a sleep interval). To profile across other tool calls, bracket them with power_profile_start / power_profile_stop.
| Name | Type | Req | Description |
|---|---|---|---|
| duration | number | yes | Seconds to sample (blocking). |
| efuse | – | – | Target-power eFuse: 1 = internal 5 V, 2 = external supply. Omit for the wiring profile's rail. |
| points | integer | – | Points of current/voltage trace to return alongside the statistics; 0 = statistics only. |
| rate_hz | number | – | Samples per second. Accurate to ~200 Hz; above that the pod delivers what its sampling loop allows, flattening near 365 Hz. rate_hz in the result is what you actually got, adc_rate_hz what the sensor… |
| Name | Type | Req | Description |
|---|---|---|---|
| adc_rate_hz | number | – | Conversion rate the current sensor was configured for — the ceiling, not what arrived. |
| avg_current | number | yes | – |
| avg_power | number | yes | Watts (energy over duration). |
| avg_voltage | number | yes | – |
| charge | number | yes | Coulombs. |
| duration | number | yes | – |
| efuse | integer | yes | – |
| energy | number | yes | Joules, integrated over every sample. |
| fault | boolean | yes | The eFuse tripped (over-current or short) during the profile. |
| max_voltage | number | yes | – |
| min_current | number | yes | – |
| min_voltage | number | yes | – |
| n | integer | yes | Raw samples the statistics cover. |
| peak_current | number | yes | – |
| rate_hz | number | yes | Samples per second actually delivered (measured). The pod reads one sensor register per firmware pass, so this lands below what was asked for — roughly 350-450 Hz. Every sample carries its own timest… |
| trace_current | array | – | Amps per trace point. |
| trace_step | number | – | Seconds covered by each trace point. |
| trace_voltage | array | – | Volts per trace point. |
| truncated | boolean | yes | Sampling stopped at max_duration rather than on request. |
No examples provided.
power_cycle_and_capture ~205
Power the target off, then capture UART while it powers back on — the boot banner lands in the window. The channels, baud and power rail come from the wiring profile when omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| baud | – | – | UART baud rate; omit for the wiring profile's uart_baud. |
| delay | number | – | Seconds into the capture the power comes back. |
| duration | number | – | Capture window in seconds; must exceed delay. |
| efuse | – | – | Target-power eFuse: 1 = internal 5 V, 2 = external supply. Omit for the wiring profile's rail. |
| off_settle | number | – | – |
| rx | – | – | LA channel (or wiring name) wired to the DUT's TX; omit for the profile's uart_rx. |
| tx | – | – | LA channel (or wiring name) wired to the DUT's RX; omit for the profile's uart_tx. |
| until_regex | – | – | Python regular expression; stop as soon as it matches. |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | – |
| matched | boolean | yes | – |
| text | string | yes | – |
| truncated | boolean | yes | text keeps the start and the end when output is long. |
No examples provided.
power_off ~70
Switch the target's power rail off. The result says which rail was used.
| Name | Type | Req | Description |
|---|---|---|---|
| delay | – | – | Seconds: schedule the power-off pod-side. |
| efuse | – | – | Target-power eFuse: 1 = internal 5 V, 2 = external supply. Omit for the wiring profile's rail. |
| Name | Type | Req | Description |
|---|---|---|---|
| delay | – | – | – |
| efuse | integer | yes | – |
| on | boolean | yes | – |
No examples provided.
power_on ~84
Switch the target's power rail on. The result says which rail was used.
| Name | Type | Req | Description |
|---|---|---|---|
| delay | – | – | Seconds: schedule the power-on pod-side and return at once (e.g. to power on during a capture). |
| efuse | – | – | Target-power eFuse: 1 = internal 5 V, 2 = external supply. Omit for the wiring profile's rail. |
| Name | Type | Req | Description |
|---|---|---|---|
| delay | – | – | – |
| efuse | integer | yes | – |
| on | boolean | yes | – |
No examples provided.
power_profile_start ~124
Start sampling the target-power rail in the background, then run the steps you want to profile and call power_profile_stop. Replaces any profile already running.
| Name | Type | Req | Description |
|---|---|---|---|
| efuse | – | – | Target-power eFuse: 1 = internal 5 V, 2 = external supply. Omit for the wiring profile's rail. |
| max_duration | number | – | Seconds after which the pod stops sampling by itself (the result is then truncated). |
| rate_hz | number | – | Samples per second; accurate to ~200 Hz, flattening near 365 Hz above that. |
| Name | Type | Req | Description |
|---|---|---|---|
| efuse | integer | yes | – |
| max_duration | number | yes | Seconds after which the pod stops sampling by itself. |
| rate_hz | number | yes | Sample rate asked for; the achieved rate is in the stop result. |
| running | boolean | – | – |
No examples provided.
power_profile_stop ~52
Stop the running power profile and return its statistics (and, with points, a trace).
| Name | Type | Req | Description |
|---|---|---|---|
| points | integer | – | Points of current/voltage trace to return alongside the statistics; 0 = statistics only. |
| Name | Type | Req | Description |
|---|---|---|---|
| adc_rate_hz | number | – | Conversion rate the current sensor was configured for — the ceiling, not what arrived. |
| avg_current | number | yes | – |
| avg_power | number | yes | Watts (energy over duration). |
| avg_voltage | number | yes | – |
| charge | number | yes | Coulombs. |
| duration | number | yes | – |
| efuse | integer | yes | – |
| energy | number | yes | Joules, integrated over every sample. |
| fault | boolean | yes | The eFuse tripped (over-current or short) during the profile. |
| max_voltage | number | yes | – |
| min_current | number | yes | – |
| min_voltage | number | yes | – |
| n | integer | yes | Raw samples the statistics cover. |
| peak_current | number | yes | – |
| rate_hz | number | yes | Samples per second actually delivered (measured). The pod reads one sensor register per firmware pass, so this lands below what was asked for — roughly 350-450 Hz. Every sample carries its own timest… |
| trace_current | array | – | Amps per trace point. |
| trace_step | number | – | Seconds covered by each trace point. |
| trace_voltage | array | – | Volts per trace point. |
| truncated | boolean | yes | Sampling stopped at max_duration rather than on request. |
No examples provided.
power_status ~28
Both target-power rails: eFuse on/off and tripped state, bus voltage and current draw.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| external | – | yes | – |
| internal | – | yes | – |
No examples provided.
pull_status ~24
State, direction and value of the bias resistor on LA1-LA8.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | yes | – |
No examples provided.
What is the EmbeddedCI BenchPod MCP server?
EmbeddedCI BenchPod is an MCP server listed in the public MCP registry as io.github.embeddedci-com/embeddedci-mcp. Drive a BenchPod hardware-in-the-loop bench: power, flash, UART, I2C, CAN, analog and logic. This page covers its PyPI package (embeddedci-mcp).
Is the EmbeddedCI BenchPod MCP server safe to use?
EmbeddedCI BenchPod scores 36 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the EmbeddedCI BenchPod MCP server expose?
EmbeddedCI BenchPod exposes 61 tools: connect, disconnect, status, set_la_voltage, wiring, and 56 more. Their descriptions and schemas cost roughly 6,278 tokens of context every time the server is loaded.
Is the EmbeddedCI BenchPod MCP server still maintained?
EmbeddedCI BenchPod is still listed as active in the MCP registry. We last reached this channel on 23 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.