Skip to main content
Glama

AE-HW-BRIDGE (Agents Engine Hardware Bridge)

License: Apache 2.0 Python: >=3.10 Model Context Protocol

Hardware-in-the-Loop (HIL) automation gateway and FastMCP server for the Agents Engine (ae) ecosystem.

ae-hw-bridge provides AI agents (Agents Engine, Claude, Gemini, Cursor) with a safe, programmable, tool-based interface to interact with physical development boards (DUTs) via the Model Context Protocol (MCP).

It pairs with the hw-puppet Dual-CDC USB bridge. Precompiled firmware binaries are available on the hw-puppet Releases page.


1. System Architecture

[ AI Agent / Claude / Cursor ]          [ Human Developer (Terminal) ]
             │                                        │
             │ stdio / SSE (MCP JSON-RPC)             │ Virtual PTY (/tmp/ae-hw-bridge-uart)
             ▼                                        ▼
   [ FastMCP Server ]                    [ tio / picocom / ae-hw-bridge console ]
             │                                        │
             │ Scoped Unix Domain Sockets             │
             └───────────────────┬────────────────────┘
                                 ▼
                     [ ae-hw-bridge Daemon ]
             ├─ Bounded Circular Log Buffer (collections.deque)
             ├─ Virtual Pseudoterminal Mirror (Master/Slave PTY)
             ├─ Target Domain Logic (.ae-hw-bridge/targets/)
             │
             ├─── CDC 0: MicroPython Raw REPL (/dev/ttyACM* or sysfs-paired) ──┐
             └─── CDC 1: Target UART Console  (/dev/ttyACM* or sysfs-paired) ──┐│
                                                                               ││ (USB Full-Speed)
                                                                               ▼▼
                                                                     [ hw-puppet (ESP32-S3) ]
                                                                     (Firmware & HIL Adapter)
                                                                           │        │
                                                                (Control lines)  (TX/RX UART)
                                                                           ▼        ▼
                                                                   [ Target Dev Board ]
                                                               (NVIDIA Jetson, Pi, STM32)

Key Principles

  • Separation of Concerns: Low-level hardware drivers and USB descriptors live in hw-puppet, while high-level orchestration, IPC multiplexing, and MCP tools live in ae-hw-bridge.

  • Zero Host Contention & Virtual PTY: An auto-spawning, target-scoped daemon (ae-hw-bridge-daemon) manages exclusive access to physical serial devices and exposes a virtual pseudoterminal symlink (/tmp/ae-hw-bridge-uart). Developers can watch UART logs live (via tio, minicom, or ae-hw-bridge console) concurrently with AI agents running tasks without port collision (Device or resource busy).

  • Multi-Target & Multi-Puppet: Safely binds multiple physical boards via hardware badges (stored in ESP32-S3 NVS) and Linux sysfs USB pairing without serial port number guessing or symlink collisions.

  • Agent Safety: Internal @repl methods are filtered out from MCP exposure; agents interact strictly through vetted, high-level business tools (full_reboot, login, send_target_command, wait_for_console_pattern, etc.).

  • Dynamic Target Loading: Target behavior (pin definitions, boot sequences, login credentials) is defined modularly under .ae-hw-bridge/targets/<target_name>/target.py or .ae-hw-bridge/config.yml.


Related MCP server: mcp-micropython-bridge

2. FastMCP Tools & Naming Convention

Tools exposed to AI agents adhere to a strict and predictable prefix convention:

  • When target modules are configured (e.g. jetson, stm32), all tools are strictly prefixed with <target>_:

    • jetson_read_target_console

    • jetson_send_target_command

    • jetson_full_reboot, jetson_enter_recovery

    • stm32_read_target_console, stm32_flash_firmware This guarantees consistent agent tool contracts regardless of whether a project has 1 or N targets.

  • In clean bench mode (no targets defined, single BaseTarget), tools carry no prefix:

    • read_target_console

    • send_target_command

    • clear_target_console

Core Inherited Tools

MCP Tool

Description

get_bridge_info()

Software version, connected ESP32-S3 hw-puppet firmware metadata, badge, and port paths.

read_target_console(tail_lines=50, head_lines=None, grep=None)

Read lines from circular console buffer (passive UART reception).

send_target_command(command, wait_timeout=5.0, idle_threshold=0.3)

Send interactive shell command to target UART and capture delta response.

wait_for_console_pattern(pattern, timeout=30.0, check_history=True)

Wait for regex pattern on console stream (e.g. login prompt, bootloader).

clear_target_console()

Clear the background circular console buffer.

run_custom_code(code, timeout=10.0)

Execute custom MicroPython script in ESP32-S3 RAM via raw REPL (zero flash wear).

Custom Target Tools

Any public method declared in target.py (e.g. login, software_reboot, enter_recovery — see Jetson Example).


3. Configuration (.ae-hw-bridge/config.yml)

You can configure hardware mappings in .ae-hw-bridge/config.yml:

Single Target / Clean Bench

# Match connected board by persistent hardware badge:
puppet: jetson

# Or bind directly by port:
# port: /dev/ttyACM1

Multi-Target Setup

targets:
  jetson:
    puppet: jetson-desk     # Matches HW-Puppet with badge "jetson-desk"
  stm32:
    puppet: stm32-bench    # Matches HW-Puppet with badge "stm32-bench"
    port: /dev/ttyACM5     # Or explicit port
IMPORTANT

Fail-Safe Ambiguity Protection: If multiple HW-Puppet boards are plugged into your machine and no configuration or explicit port is provided, ae-hw-bridge safely halts with an informative error rather than guessing a port randomly.


4. CLI Utilities & Virtual UART Console

ae-hw-bridge provides built-in CLI commands for managing hardware test benches and viewing UART logs without serial port contention:

# Connect to live target UART console (interactive terminal session via tio / picocom / built-in)
ae-hw-bridge console

# Inspect recent UART console logs (non-interactive, exit immediately)
ae-hw-bridge console -n 50

# Continuously follow live console logs
ae-hw-bridge console -f

# Filter and pipe live output into standard Unix tools
ae-hw-bridge console | grep "ERROR"
ae-hw-bridge console -n 100 --grep "kernel"

# External terminal access (works simultaneously with AI agents!):
# Use your favorite terminal tool directly via the virtual PTY symlink:
tio /tmp/ae-hw-bridge-uart
picocom -b 115200 /tmp/ae-hw-bridge-uart

# View daemon status, connected MCP clients, physical ports, and virtual PTY
ae-hw-bridge status

# Stop background daemons and release serial ports
ae-hw-bridge stop
ae-hw-bridge stop --all

# List all connected HW-Puppet devices, serial numbers, badges, and configured targets
ae-hw-bridge list

# Set a persistent hardware badge in ESP32-S3 NVS
ae-hw-bridge label jetson-bench
ae-hw-bridge label stm32-bench --port /dev/ttyACM1

# Explore and execute target actions directly from Bash
ae-hw-bridge actions [-t <target>]
ae-hw-bridge call reset [-t <target>]
ae-hw-bridge send "uname -a" [-t <target>]
ae-hw-bridge exec "print('MicroPython alive')" [-t <target>]

# Run the FastMCP server
ae-hw-bridge
TIP

5. Installation & Setup

Prerequisites

  • Linux (with udev support)

  • Python 3.10+

  • A connected hw-puppet (ESP32-S3) device

Automated Installation (Smithery)

Install automatically to your preferred AI assistant using the Smithery CLI:

# Claude Desktop / Claude Code
npx -y @smithery/cli install ae-hw-bridge --client claude

# Cursor
npx -y @smithery/cli install ae-hw-bridge --client cursor

Zero-Install Execution (uvx)

Run the MCP server directly using uvx without installing into your local Python environment:

uvx ae-hw-bridge

Manual Installation

pip install ae-hw-bridge
# Or editable mode for development:
pip install -e .

Install the provided udev rules to enable non-root access for all HW-Puppet CDC devices:

sudo cp udev/99-hw-puppet.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

6. MCP Client Configuration

Claude Code CLI

claude mcp add ae-hw-bridge uvx ae-hw-bridge

Claude Desktop (claude_desktop_config.json) / Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "ae-hw-bridge": {
      "command": "uvx",
      "args": ["ae-hw-bridge"]
    }
  }
}

7. Target Definitions

Target dev boards (DUTs) are configured modularly in .ae-hw-bridge/targets/<target_name>/.

TIP

Complete Target Guide & Examples:

Quick Target Example

# .ae-hw-bridge/targets/jetson/target.py
from typing import Any
from ae_hw_bridge.targets.base import BaseTarget, repl

class JetsonTarget(BaseTarget):
    PIN_RST: int = 12

    @repl
    def reset_pulse(self, pin: int = 12):
        """MicroPython code executed directly in HW-Puppet RAM (hidden from MCP)."""
        import time
        from machine import Pin  # MicroPython imports MUST be inside @repl!

        rst = Pin(pin, Pin.OUT, value=1)
        rst.value(0)
        time.sleep(0.2)
        rst.value(1)

    def full_reboot(self, timeout: float = 30.0) -> dict[str, Any]:
        """High-level target operation automatically registered as an MCP tool."""
        self.clear_target_console()
        self.reset_pulse(pin=self.PIN_RST)
        res = self.wait_for_console_pattern(r"login:", timeout=timeout)
        return {"booted": res.get("matched", False), "line": res.get("line")}

8. Running Tests

pytest

55 unit and integration tests covering the console reader, raw REPL client, IPC protocol, daemon server/client, target loader, sysfs discovery, YAML/JSON configuration, and MCP tool registration.

Available Tools

6 tools
clear_target_consoleA

Clear the target UART console circular buffer.

Recommended before triggering a reset or running a test scenario to isolate fresh output.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It implicitly discloses that buffered output is discarded ('clear the ... buffer'), which is the key destructive consequence, and frames it as a preparatory step. However, it says nothing about whether the clear is reversible, permission requirements, or effects on concurrent readers. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, action first, rationale second. Every clause earns its place and there is no restatement of the tool name or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (no params, output schema present so return values are covered), and the description supplies purpose plus a usage trigger. Only the absence of any behavioral caveats (reversibility, permissions) keeps it from being fully complete for a mutation-style tool with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. The baseline of 4 for a parameterless tool is appropriate; the description adds scoping context by identifying the exact buffer affected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource: 'Clear the target UART console circular buffer.' This clearly separates it from read_target_console and wait_for_console_pattern by stating it removes buffered output rather than reading or watching it. It does not explicitly name siblings, but the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit timing guidance: 'Recommended before triggering a reset or running a test scenario to isolate fresh output.' This tells the agent a concrete situation in which to call the tool and why. It stops short of stating when NOT to use it or naming an alternative, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bridge_infoA

Get bridge software version, connected hardware puppet firmware info, and active ports.

Returns metadata including ae-hw-bridge package version, ESP32-S3 hw-puppet firmware build details (version, platform, git hash), and serial port paths.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It does add genuine value by enumerating what is returned (package version, firmware version/platform/git hash, serial port paths), and 'Get' makes the read-only nature reasonably clear, but it says nothing about permissions, side effects, failure modes, or whether the call is safe to repeat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose in the first sentence, and the second sentence specifies the returned metadata. Some redundancy remains (return contents are also captured by the output schema), but nothing is padded or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and with zero parameters and no annotations the description only needs to convey purpose and read-only intent, which it does. A note on preconditions (a connected bridge) would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate. The description's mention of ports/firmware is return content, not input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') plus three concrete resources: bridge software version, hw-puppet firmware info, and active ports. The subject matter (bridge/hardware diagnostics) is clearly distinct from the console- and code-execution siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies a diagnostics/introspection use case, but the description never states when to call it, what preconditions exist (e.g., bridge must be connected), or how it relates to siblings like run_custom_code. Usage is inferable but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_target_consoleA

Read lines from the target board UART console buffer (CDC1).

NOTE: This reads the passive UART reception ring buffer (e.g. bootloader or kernel output). To read system logs from an already running Linux target, use send_target_command.

Args: tail_lines: Number of most recent lines from the end of the buffer (default: 50 if head_lines not specified). head_lines: Number of earliest lines from the start of the buffer (e.g. first N lines of bootloader after reset). grep: Optional case-insensitive regex pattern to filter lines (e.g. 'panic|error|SafeRTOS').

NameRequiredDescriptionDefault
grepNo
head_linesNo
tail_linesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the data source (passive ring buffer, non-blocking reception implied) and the bootloader/kernel use case, but says nothing about whether the read is destructive to the buffer, whether it blocks waiting for new output, or how ring-buffer overflow affects results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then a scoping NOTE, then an Args block — a sensible order with no filler. Slightly verbose in the parenthetical examples, but each clause adds selection or invocation value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be explained. Given zero annotations, the description adequately covers purpose, source, and all three parameters; the only real gap is operational behavior (blocking, buffer consumption), which keeps it short of a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry all parameter meaning, and it largely does: `tail_lines` (most recent lines, with the 'default 50 if head_lines not specified' rule), `head_lines` (earliest lines, with a concrete bootloader scenario), and `grep` (case-insensitive regex, with an example pattern). It does not clarify whether head_lines and tail_lines may be combined or what happens if both are set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read lines from the target board UART console buffer (CDC1)') and immediately scopes what kind of buffer it is (passive UART reception ring buffer, e.g. bootloader/kernel output). It explicitly distinguishes itself from the sibling `send_target_command`, so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The NOTE gives an explicit when-to-use-this vs. use-another rule: passive UART/bootloader capture here, running-Linux logs via `send_target_command`. It does not address the other plausible siblings (`clear_target_console`, `wait_for_console_pattern`), so the guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_custom_codeA

Execute arbitrary MicroPython code directly in ESP32 RAM via CDC0 Raw REPL.

Args: code: MicroPython source code string to execute. timeout: Maximum execution time in seconds before aborting (default: 10.0s).

NameRequiredDescriptionDefault
codeYes
timeoutNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that code runs directly in RAM and that timeout aborts execution, which is useful. However, it doesn't state whether execution is destructive, whether it can brick the device, what happens to existing state, or what the return format is (output schema exists but isn't referenced).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the key action and mechanism; the parameter notes are given in a compact docstring style. It is appropriately sized, though the 'Args:' section is slightly verbose for a two-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained. However, for a tool that executes arbitrary code on embedded hardware, the description omits important context: error behavior, security implications, or interaction with sibling console tools. It is adequate but missing safety-relevant completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It documents both parameters: code as 'MicroPython source code string to execute' and timeout as 'Maximum execution time in seconds before aborting (default: 10.0s)'. This adds meaningful semantics beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Execute) and resource (arbitrary MicroPython code) with a precise mechanism (ESP32 RAM via CDC0 Raw REPL), clearly distinguishing it from sibling tools like send_target_command or read_target_console.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the 'how' but doesn't specify when to use this tool versus alternatives like send_target_command; no exclusions or prerequisites are stated. Usage context is implied but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_target_commandA

Send an interactive command string to the target console and collect ONLY new response lines.

Args: command: Shell command string to transmit to target UART (e.g. 'uname -a' or 'nvidia'). wait_timeout: Maximum seconds to wait before returning response (default: 5.0s hard ceiling). idle_threshold: Seconds of UART silence before considering output complete (default: 0.3s).

NameRequiredDescriptionDefault
commandYes
wait_timeoutNo
idle_thresholdNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It adds useful behavior context—only new response lines are returned, wait_timeout is a hard ceiling, and idle_threshold defines output completion—but it omits safety implications, side effects of sending commands to a UART, and what happens on timeout or error.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then provides a compact, well-structured Args section. Every sentence adds value without redundancy, making it easy to scan and parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. However, for a command-sending tool with no annotations, the description lacks usage context (when to use vs siblings) and safety/error-handling details, leaving gaps that an agent might need to call it correctly in a real workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully. It does: command is defined with examples ('uname -a', 'nvidia'), wait_timeout is described as maximum seconds to wait with a hard ceiling, and idle_threshold is explained as seconds of UART silence before output is considered complete, including defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Send) and resource (interactive command string to target console), and the phrase 'collect ONLY new response lines' distinguishes it from read_target_console, which likely reads existing output. However, it does not explicitly name or contrast with sibling tools, so it falls short of the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but provides no guidance on when to use it versus alternatives like read_target_console, run_custom_code, or wait_for_console_pattern. There are no exclusions or context cues to help an agent select the right tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_console_patternA

Wait for a line matching regex pattern in target UART console stream.

First checks recent buffer history (unless check_history=False). If not found, blocks until matching line appears or timeout expires. Ideal for waiting for bootloader, kernel messages, login prompts or errors after reset.

Args: pattern: Regular expression to match (e.g. 'login:', r'(?:[$#]\s*$|\w+@\w+:.[$#]\s)', or 'kernel panic'). timeout: Maximum seconds to wait (default: 30.0s). check_history: If True, inspect recent buffered lines first before waiting for new lines (default: True).

NameRequiredDescriptionDefault
patternYes
timeoutNo
check_historyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full load and does well: it discloses the history-check-first behavior, the blocking-until-match semantics, and the timeout bound. It stops short of saying what happens on timeout (error vs. empty result), leaving one behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a short behavioral paragraph and a clean Args block. Every line earns its place; the regex example in the Args is slightly verbose but useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be re-explained, and the description covers purpose, blocking behavior, history handling, and each parameter. The only residual gap is timeout-failure semantics, which is minor for a well-typed 3-param tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates well: it explains check_history's meaning (inspect buffered lines before waiting), gives regex examples for pattern, and restates the timeout default. Only minor value-add beyond type/default repetition keeps it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: waiting for a regex-matched line in the target UART console stream. An agent can distinguish it from read_target_console (non-blocking read) and send_target_command, though the description never explicitly contrasts with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use context: 'Ideal for waiting for bootloader, kernel messages, login prompts or errors after reset.' It also explains the history-vs-new-lines decision via check_history, but never states when NOT to use it or names an alternative sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedclear_target_console
    • First observedget_bridge_info
    • First observedread_target_console
    • First observedrun_custom_code
    • First observedsend_target_command
    • First observedwait_for_console_pattern

TDQS

A4/5.0

Scored across 6 tools

Disambiguation4/5

Tools mostly target distinct actions: clearing buffer, reading buffer, sending commands, waiting for patterns, executing MicroPython, and fetching bridge info. The three console-related tools (read, send, wait) have some inherent overlap but descriptions clarify when to use each, preventing most misselection.

Naming Consistency5/5

All tool names use consistent snake_case with a verb_object pattern (clear_target_console, get_bridge_info, read_target_console, run_custom_code, send_target_command, wait_for_console_pattern). No deviations in style.

Tool Count5/5

Six tools is well-scoped for a hardware bridge server; each tool covers a necessary operation (buffer management, info retrieval, console I/O, code execution, pattern waiting) without redundancy.

Completeness4/5

The surface covers core interactions: buffer clear/read, command send, pattern wait, code execution, and bridge info. An explicit reset tool is absent despite being mentioned in clear_target_console's description, but resets may be achievable via send_target_command or run_custom_code, leaving only a minor gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Stateful MCP server for driving debug probes (J-Link) to flash, debug, and inspect embedded targets. Enables AI agents to perform flash, memory, breakpoint, and ELF/SVD-aware operations conversationally.
    41
    53 PyPI
    10
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for simulating firmware on virtual microcontroller instances, allowing AI agents to upload, run, and read UART output from supported boards such as STM32 and Nordic.
    18
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Agentic Hardware-in-the-Loop (Agentic HIL) lets coding agents develop firmware on real embedded boards: flash, reset, read UART and exchange CAN traffic, diagnose and fix. Local, policy-gated MCP tools support OpenOCD, pyOCD and STM32CubeProgrammer, with pytest for CI.
    44
    745 PyPI
    21
    Apache 2.0