Agentic HIL
PYPI · AGENTIC-HIL · SCANNED SEP 20
Develop firmware on the real board behind a debug probe: flash, reset, UART and CAN, policy-gated.
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 Security99
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 9 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency35
- 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 12 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability83
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 5440 tokens (~104/item across 52 items; 43 tools + 9 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage70
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 11% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 45 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
How do I install the Agentic HIL MCP server?
Agentic HIL runs locally as a PyPI package, launched with uvx agentic-hil. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · agentic-hil
claude mcp add agentic-hil-agentic-hil -- uvx agentic-hil
{
"mcpServers": {
"agentic-hil-agentic-hil": {
"command": "uvx",
"args": [
"agentic-hil"
]
}
}
} {
"servers": {
"agentic-hil-agentic-hil": {
"command": "uvx",
"args": [
"agentic-hil"
]
}
}
} codex mcp add agentic-hil-agentic-hil -- uvx agentic-hil
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"agentic-hil-agentic-hil": {
"type": "local",
"command": [
"uvx",
"agentic-hil"
],
"enabled": true
}
}
} openclaw mcp add agentic-hil-agentic-hil --command uvx --arg agentic-hil
mcp_servers:
agentic-hil-agentic-hil:
command: "uvx"
args: ["agentic-hil"] {
"McpServers": {
"agentic-hil-agentic-hil": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"agentic-hil"
]
}
}
} assistant mcp add agentic-hil-agentic-hil -t stdio -c uvx -a agentic-hil
{
"mcpServers": {
"agentic-hil-agentic-hil": {
"command": "uvx",
"args": [
"agentic-hil"
]
}
}
} 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.
- 19 Sept 26 +1
- Stability: 0.97 → pass security
- 18 Sept 26 −1
- Stability: pass → 0.97 functional
- 15 Sept 26 +1
- Stability: 0.97 → pass security
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 −2
- Stability: pass → 0.90 functional
- 8 Sept 26 +1
- Stability: 0.97 → pass security
- 7 Sept 26 +14
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Capabilities: fail → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Stability: pass → 0.97 functional
- Package version: 0.21.4 → 0.21.5 functional
- 5 Sept 26 +1
- Stability: 0.97 → pass security
- Package version: 0.21.2 → 0.21.4 functional
- Package version: 0.21.2 → 0.21.3 functional
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 20 Sept 2026 · Analysed pypi/agentic-hil@0.21.5
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 | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 9 packages
| Packages resolved | 9 |
|---|---|
| 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 →
artifact_upload ~52
Upload a local or base64-encoded firmware artifact into the configured Agentic HIL artifact store.
| Name | Type | Req | Description |
|---|---|---|---|
| data_base64 | string | – | – |
| filename | string | – | – |
| image_path | string | – | – |
No output schema declared.
No examples provided.
bench_run_start ~121
Declare a multi-step run and lock every device it names for the whole run, not for one call. Call this before a sequence like flash, reset, read: without it each call takes and releases its own device, and between two calls the board is free for anything else on this machine. Declared devices are held until bench_run_stop, the only devices this run may touch, and a device already held fails the call immediately naming its holder.
| Name | Type | Req | Description |
|---|---|---|---|
| devices | array | yes | – |
| label | string | – | – |
| wait_s | number | – | – |
No output schema declared.
No examples provided.
bench_run_status ~42
Report whether a run is open on this server, which devices it declared, and since when. Read this if you are not sure whether you still hold the bench.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
bench_run_stop ~40
End the declared run and release every device it held. Always call this when the run is finished; it is safe to call when no run is open.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
can_buses_list ~54
List configured named CAN buses and active session status, with listen_only and the evidence that would back it on each adapter (listen_only_enforcement). Use this instead of ip link or candump on a SocketCAN interface.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
can_read ~51
Read CAN frames from an active configured CAN bus session. Use this instead of candump.
| Name | Type | Req | Description |
|---|---|---|---|
| bus_id | string | yes | – |
| max_frames | integer | – | – |
| wait_timeout_s | number | – | – |
No output schema declared.
No examples provided.
can_send ~65
Send one classic CAN frame on an active configured CAN bus session. Use this instead of cansend.
| Name | Type | Req | Description |
|---|---|---|---|
| bus_id | string | yes | – |
| data_hex | string | – | – |
| extended | boolean | – | – |
| frame_id | – | yes | – |
| rtr | boolean | – | – |
No output schema declared.
No examples provided.
can_session_start ~51
Open a configured CAN bus session. A bus configured listen_only refuses rather than opening when the adapter cannot be held to it.
| Name | Type | Req | Description |
|---|---|---|---|
| bus_id | string | yes | – |
| clear_rx_queue | boolean | – | – |
No output schema declared.
No examples provided.
can_session_stop ~24
Stop a configured CAN bus session.
| Name | Type | Req | Description |
|---|---|---|---|
| bus_id | string | yes | – |
No output schema declared.
No examples provided.
classify_last_error ~22
Classify the most recent Agentic HIL/debugger failure.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
com_ports_list ~44
List configured named COM ports and detected host serial ports. Use this instead of screen, minicom, picocom, or opening /dev/tty* or COM* directly.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
com_read ~56
Read buffered feedback from an active COM port session. Use this instead of screen, minicom, or picocom.
| Name | Type | Req | Description |
|---|---|---|---|
| max_bytes | integer | – | – |
| port_id | string | yes | – |
| wait_timeout_s | number | – | – |
No output schema declared.
No examples provided.
com_session_start ~37
Open a configured COM port and start a background feedback session.
| Name | Type | Req | Description |
|---|---|---|---|
| clear_buffer | boolean | – | – |
| port_id | string | yes | – |
No output schema declared.
No examples provided.
com_session_stop ~24
Stop a configured COM port session.
| Name | Type | Req | Description |
|---|---|---|---|
| port_id | string | yes | – |
No output schema declared.
No examples provided.
com_write ~42
Write text or hex stimulus to an active COM port session.
| Name | Type | Req | Description |
|---|---|---|---|
| hex | string | – | – |
| port_id | string | yes | – |
| text | string | – | – |
No output schema declared.
No examples provided.
debug_clear_breakpoints ~20
Clear all breakpoints from the active debug session.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
debug_continue ~24
Continue target execution until stop or timeout.
| Name | Type | Req | Description |
|---|---|---|---|
| timeout_s | number | – | – |
No output schema declared.
No examples provided.
debug_dump_symbol_ihex ~38
Read an allowed symbol from target memory and write Intel HEX.
| Name | Type | Req | Description |
|---|---|---|---|
| output_path | string | yes | – |
| symbol | string | yes | – |
No output schema declared.
No examples provided.
debug_get_session_status ~16
Return active debug-session status.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
debug_get_stop_reason ~17
Return the last structured stop reason.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
debug_halt ~26
Halt the target in the active debug session.
| Name | Type | Req | Description |
|---|---|---|---|
| timeout_s | number | – | – |
No output schema declared.
No examples provided.
debug_list_breakpoints ~19
List breakpoints in the active debug session.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
debug_set_breakpoint ~28
Set a typed breakpoint by symbol/function name or file and line.
| Name | Type | Req | Description |
|---|---|---|---|
| location | – | yes | – |
No output schema declared.
No examples provided.
debug_start_session ~51
Start a typed debug session for a validated ELF artifact.
| Name | Type | Req | Description |
|---|---|---|---|
| artifact_id | string | – | – |
| image_path | string | – | – |
| mode | string | – | – |
| timeout_s | number | – | – |
No output schema declared.
No examples provided.
debug_stop_session ~24
Stop the active typed debug session.
| Name | Type | Req | Description |
|---|---|---|---|
| timeout_s | number | – | – |
No output schema declared.
No examples provided.
debug_symbol_info ~22
Resolve an allowed debug symbol.
| Name | Type | Req | Description |
|---|---|---|---|
| symbol | string | yes | – |
No output schema declared.
No examples provided.
debug_symbol_value ~83
Read an allowed symbol's current bytes out of target memory and return them, as hex in memory order and, at 1, 2, 4 or 8 bytes, as an unsigned and a signed integer read in the byte order the firmware image declares. Use this instead of reading a variable through a raw gdb print.
| Name | Type | Req | Description |
|---|---|---|---|
| symbol | string | yes | – |
No output schema declared.
No examples provided.
debugger_info ~35
Check whether the configured debugger backend is available. Use this instead of running openocd, pyocd, or st-info yourself.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
debugger_probes_list ~41
List every connected probe ID visible to the configured debugger backend. Use this instead of st-info --probe, pyocd list, or JLinkExe.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
flash_firmware ~68
Flash a validated firmware artifact. Provide exactly one of image_path or artifact_id. Use this instead of openocd, st-flash, or pyocd flash.
| Name | Type | Req | Description |
|---|---|---|---|
| artifact_id | string | – | – |
| image_path | string | – | – |
| reset_after_flash | boolean | – | – |
No output schema declared.
No examples provided.
get_last_report ~20
Return the most recent structured Agentic HIL report.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
hardware_recover ~368
Clear this bench's quarantine. A quarantine is the audit halt: the evidence chain for this bench could not be written or read, and no hardware action rebuilds a record that was never written. Every other incident settles itself at the next contact and holds nothing, so on a bench with nothing standing this answers ok with nothing_to_recover: true and changes nothing. Of what does stand, a reason that names no hardware contact still clears with no argument. Anything else needs operator_statement: ask the operator in chat what state the bench is in, then pass back what they answered, in their words. It is written verbatim to the recovery ledger as their statement, relayed by you. Never write one you were not given: a ledger line that reflects no actual operator utterance is a false record with you recorded as the actor; when you have nobody to ask, relay the `agentic-hil recover --confirm-safe-state --quarantine-id <id>` line the refusal hands you and let them run it themselves. A refusal with error_type config_changed means the authoritative configuration was edited after the incident was recorded: show the operator the two digests on the result, and once they confirm the delta is understood, call again with accept_config_change: true (the operator's own line takes --accept-config-change instead). Needs permissions.allow_recover for the one route that clears something. Use this instead of deleting the server's state files, which is never the fix.
| Name | Type | Req | Description |
|---|---|---|---|
| accept_config_change | boolean | – | Accept that the authoritative configuration changed after the incident was recorded. Only after the operator has reviewed the delta between the two digests the config_changed refusal reports; it is w… |
| operator_statement | string | – | – |
No output schema declared.
No examples provided.
probe_target ~34
Probe the configured embedded target through the configured debugger. Use this instead of openocd, pyocd, or gdb.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
project_config_adopt_hardware ~256
Read the attached probe and carry its identity into this project's configuration: probe id, the backend's executable, the detected controller, and the probe's own COM device. Use this when a configuration was written before the board was plugged in and holds placeholders, instead of printing values for a person to retype. Returns the plan by default and writes only with apply:true, through project_config_set and its permissions. A key that already holds a value nobody generated is reported, never overwritten.
| Name | Type | Req | Description |
|---|---|---|---|
| apply | boolean | – | Write the plan. Without it the call reads hardware and the configuration and changes nothing. |
| com_port_id | string | – | Which com_ports entry receives the discovered device. Created with every permission false if it does not exist. |
| debugger_id | string | – | Which configured debugger entry receives the values. Only needed when the configuration declares more than one. |
| probe_id | string | – | Which attached probe this is about. Needed when more than one is attached, and on a host without STM32CubeProgrammer, where probes are read from the USB serial inventory that cannot rule out a VCP-le… |
No output schema declared.
No examples provided.
project_config_create ~281
Generate this workspace's Agentic HIL configuration from attached hardware when it has none yet. Takes no arguments. Every permission in the generated file is true (flashing, reset, COM and CAN writes, and all three permissions.allow_config_* grants) except allow_raw_debugger_commands and allow_mass_erase, which are false: either one being true refuses flash_firmware on that probe, and neither is a tool you have here. The bench is workable from that file without anybody editing YAML, flashing included. Report what it granted and ask the operator which of it this bench should not have; do not ask for those two to be turned on, because that is the one change that stops flashing. Regenerating an existing configuration needs allow_config_write and carries over the permissions of the configuration this server loaded at startup, for the entries that are still in it; an entry the regeneration discovers for the first time arrives at those same defaults, and a workspace whose configuration is gone gets a file at those defaults. Because this server does not reload, a narrowing you made with project_config_set in this session is not in what it loaded and a regeneration now puts that permission back. Regenerating is the operator's call, not a way to narrow or to re-open. Use this instead of writing a configuration by hand when a tool reports config_file_not_found.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
project_config_describe ~81
Report which keys of this project's configuration you may change right now, which you may not, and which permission would open a locked one, for this configuration in this state, not in general. Also carries each key's current value and the value shape the shipped schema declares for it. Read this before project_config_set instead of guessing a key and being refused.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
project_config_reload_description ~197
Re-read this bench's device description from the authoritative configuration without restarting the server: target, debuggers, com_ports and can_buses, minus every permissions: block. Call this when a board was plugged in and written into the file after this server started, instead of asking the operator for a restart. Permissions are not re-read at all, in either direction: a device this server has never seen arrives with no grant, so it can be probed and read and cannot be flashed, reset, mass-erased or written to until an operator restarts the server. Everything outside those four sections (version, workspace_root, state_root, debug, artifacts, validation, recovery, reports, logs, and the project permissions) still needs a restart, and the result names them. Refused while a run, a session or an unresolved incident holds this bench, and when the file is missing, unreadable or does not load.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
project_config_set ~136
Change named keys of this project's configuration, field-wise. Two separate permissions gate it: allow_config_description_write for what the bench is (target, probe id, port device and baudrate, CAN bus settings) and allow_config_permissions_write for every permission key (each permissions: block, and the two grants that sit directly on a section, artifacts.allow_upload and debug.allow_all_symbols). Values are scalars checked against the shipped schema; the changed file is validated before it replaces the working one, and a write is refused while a run holds hardware. Use this instead of editing the configuration file yourself.
| Name | Type | Req | Description |
|---|---|---|---|
| changes | array | yes | – |
No output schema declared.
No examples provided.
reset_target ~117
Reset the configured target through the configured debugger. Use this instead of st-util, openocd, or a raw gdb reset.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | How the target is left afterwards. 'run' resets and lets the target execute. 'halt' leaves the core stopped. 'init' additionally runs the target's reset-init event script (clock tree, wait states, wa… |
No output schema declared.
No examples provided.
server_upgrade ~182
Replace this Agentic HIL installation with the newest release, gated by permissions.allow_upgrade. Takes no arguments: it can only lift to the latest release, never to a version you name, so it cannot be used to install a build that reads this bench's permissions differently. It replaces the package on disk and does not change the code this server is running. A successful call answers upgraded_on_disk with previous_version, version, running_version and restart_required: true, and the operator restarting the MCP server is what loads it; the agentic-hil command line reads the new code straight away. Refused while a run or a session holds this bench, and refused on Windows, where the files of a running process are locked and only `agentic-hil upgrade` at a shell can replace them. Use this instead of running uv, pipx or pip yourself.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
test_reactor_run ~216
Run this project's declarative test plan against the bench. Use this instead of `agentic-hil test-reactor` at a shell. The plan is a reviewed file of ordered steps: it is validated in full before the first hardware action, the run holds every device the plan names from before its first step to after its last, each step is judged by the same permission the matching tool is judged by, and a step reaching for a device the plan did not declare is refused. test_config_path selects another plan, workspace-relative or absolute, and must resolve inside workspace_root; without it the project's default plan runs. detach: true runs the plan in its own process and answers at once with a run handle to ask test_reactor_status about and test_reactor_stop to end, which is what an hours-long endurance plan wants; the default runs the plan to its end and answers with the whole result and the path of the report it wrote.
| Name | Type | Req | Description |
|---|---|---|---|
| detach | boolean | – | – |
| test_config_path | string | – | – |
No output schema declared.
No examples provided.
test_reactor_status ~63
Say what a test run handle is doing: running and which step it is on, finished or stopped with its verdict and its report path, or its worker gone. Without run, list the runs this bench still has records of.
| Name | Type | Req | Description |
|---|---|---|---|
| run | string | – | – |
No output schema declared.
No examples provided.
test_reactor_stop ~93
Ask a test run to end after the step it is in, close its devices in the usual order and write its report. Cooperative and nothing else: this leaves a request the run reads between its steps, so a run cannot be left half way through a step by whoever asked it to stop. A run that had already ended is answered as such and nothing is asked of it.
| Name | Type | Req | Description |
|---|---|---|---|
| run | string | yes | – |
No output schema declared.
No examples provided.
What is the Agentic HIL MCP server?
Agentic HIL is an MCP server listed in the public MCP registry as io.github.agentic-hil/agentic-hil. Develop firmware on the real board behind a debug probe: flash, reset, UART and CAN, policy-gated. This page covers its PyPI package (agentic-hil).
Is the Agentic HIL MCP server safe to use?
Agentic HIL scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 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 Agentic HIL MCP server expose?
Agentic HIL exposes 43 tools: debugger_info, debugger_probes_list, probe_target, artifact_upload, flash_firmware, and 38 more. Their descriptions and schemas cost roughly 3,281 tokens of context every time the server is loaded.
Is the Agentic HIL MCP server still maintained?
Agentic HIL is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.