Skip to main content
Glama

esp32sim-mcp

"Your agent writes ESP32 firmware, boots it and tests it. No board, no account."

CI npm version License: MIT

esp32sim-mcp lets an AI coding agent (Claude Code, Codex, Cursor, or any MCP client) boot, drive and test the ESP32 firmware it builds with ESP-IDF, inside the local esp32sim emulator: real mask ROM, real bootloader, unmodified binaries.

No physical development board. No cloud account or token.

Requirements: Node.js 22+ and ESP-IDF to build firmware. npx esp32sim-mcp setup installs the emulator (prebuilt for macOS arm64, Linux x64 and Linux arm64) and the mask ROMs. Tested on macOS and Linux.


⚡ 1-Minute Quickstart

1. Install the emulator

npx -y esp32sim-mcp setup

This downloads a prebuilt esp32sim into ~/.esp32sim/bin and Espressif's mask ROM ELFs into ~/.esp32sim/roms, both pinned and SHA-256 verified. The binaries are built from source by this repo's emulator workflow with signed build provenance (gh attestation verify <archive> -R stramanu/esp32sim-mcp).

2. Configure your Agent

From your firmware project, detect installed agents (Claude Code, Codex, Cursor) and register the MCP server plus the esp32sim skill that teaches the write → build → simulate → verify loop:

npx -y esp32sim-mcp init              # this project: .mcp.json, .cursor/, .claude/skills, .agents/skills
npx -y esp32sim-mcp init --global     # user level, also Claude Desktop
npx -y esp32sim-mcp init --agent codex --dry-run

Agent

MCP server (project / --global)

Skill (project / --global)

Claude Code

.mcp.json / claude mcp add --scope user

.claude/skills/ / ~/.claude/skills/

Codex

~/.codex/config.toml (user only)

.agents/skills/ / ~/.codex/skills/

Cursor

.cursor/mcp.json / ~/.cursor/mcp.json

.cursor/skills/ / ~/.cursor/skills/

Claude Desktop

--global only

—

Existing entries are kept, reruns are no-ops, and a config file that does not parse is left untouched. --no-skill skips the skill.

Or add it manually to any mcpServers config:

{
  "mcpServers": {
    "esp32sim": {
      "command": "npx",
      "args": ["-y", "esp32sim-mcp", "serve"]
    }
  }
}

3. Verify Your Environment

npx esp32sim-mcp doctor

Platforms without a prebuilt emulator

Build esp32sim with Cargo (rustup installs Rust). It is not on crates.io, so it comes from git, pinned to the commit this release is tested against:

cargo install --locked --git https://github.com/mikroverk/esp32sim --rev f535f3b42293a76ab64c231a0425f35857ab6cf1 esp32sim
npx esp32sim-mcp fetch-roms

The binary lands in ~/.cargo/bin, where it is found automatically. ESP32SIM_PATH points at a binary elsewhere and ESP32SIM_ROM_DIR at another ROM directory; ROMs in an ESP-IDF install are found automatically.


Related MCP server: Chiplab

🛠️ MCP Tools for Agents

When connected, coding agents gain access to the following specialized tools:

Tool

Input

Output

Description

sim_run

projectDir, appBin, chip, board, maxSeconds

UART console log, stop reason, exit code, panic details

Boots real mask ROM & bootloader, runs app, captures UART output and crash logs.

sim_script

events (array of press, release, gpio, knob, uart, serial, touch, stop)

Timed UART logs

Injects hardware events (button presses, rotary encoder, UART RX data) at emulated timestamps.

sim_expect

patterns (strings or regexes), ordered

Pass/Fail status, matched lines, diff of missing line

Asserts expected UART output for autonomous Red-Green-Refactor testing loops.

sim_screenshot

board (e.g. atech14), timeSeconds

PNG image & base64 data

Captures the virtual ST7735/ST7789/ST7701S/CO5300 display buffer at specific emulated moment.

sim_list_boards

chip (optional: s3, c3, c6, esp32)

Board specs & peripherals

Catalogs supported chips, CPU cores, displays, and peripheral buttons.

sim_doctor

none

Environment health report

Checks the esp32sim binary and mask ROMs, and says how to install what is missing.

By default both UART0 and the USB-Serial/JTAG console are captured, so output shows up whichever console the project logs to; lines ESP-IDF mirrors on both are shown once. wifi (e.g. ssid=demo,psk=secret) attaches a virtual access point with DHCP, DNS and NAT.


💻 CLI Commands (Local & CI)

The same tools are available via CLI with stable exit codes (0 = pass, 1 = fail), making them drop-in ready for GitHub Actions CI:

# Run the ESP-IDF build in the current project for 5 emulated seconds
esp32sim-mcp run --max-seconds 5

# Assert UART output (patterns in order), on a virtual WiFi network
esp32sim-mcp expect --wifi "ssid=demo,psk=demo-pass" --pattern "app_main" "GOT_IP"

# Drive buttons from a timed action script
esp32sim-mcp expect --script ./test-button-script.txt --pattern "Button pressed"

# Supported boards, environment check, mask ROM download
esp32sim-mcp list
esp32sim-mcp doctor
esp32sim-mcp setup          # or install-emulator / fetch-roms separately

examples/hello-esp32 is a small ESP-IDF project with a button script; CI builds it and runs it this way.


🔄 The Autonomous Agent Loop

esp32sim-mcp ships with a standardized Agent Skill (skills/esp32sim/SKILL.md) that guides agents through embedded Test-Driven Development:

┌───────────────────────────────────────────┐
│ 1. Agent writes ESP-IDF C/C++ firmware    │
└─────────────────────┬─────────────────────┘
                      ▼
┌───────────────────────────────────────────┐
│ 2. Compile: `idf.py build`                │
└─────────────────────┬─────────────────────┘
                      ▼
┌───────────────────────────────────────────┐
│ 3. Agent calls `sim_expect` with patterns │
└─────────────────────┬─────────────────────┘
                      ▼
┌───────────────────────────────────────────┐
│ 4. Simulator returns UART logs / Panic    │
│    (Guru Meditation, Stack Overflow, etc.)│
└─────────────────────┬─────────────────────┘
                      ▼
┌───────────────────────────────────────────┐
│ 5. Agent inspects trace, fixes bug, reruns│
└───────────────────────────────────────────┘

Auto-Discovery of Firmware

esp32sim-mcp automatically detects ESP-IDF build artifacts:

  • Parses build/flasher_args.json to extract precise bootloader, partition table, and application binaries without manual path configuration.

  • With bootloader, partition table and app it boots through the real mask ROM (--boot rom); an app image alone is loaded directly (--boot app).


🎯 Supported Chips & Boards

Powered by esp32sim. sim_list_boards / esp32sim-mcp list show the details.

Chip

Boards (board)

ESP32-S3

atech14 (default: ST7735 TFT, buttons, rotary encoder, LED ring, audio), waveshare-lcd4b (480x480 touch), waveshare-amoled18-v2 (368x448 AMOLED touch), waveshare-cam (OV5640 camera), none

ESP32-C3

console only (no board models)

ESP32-C6

waveshare-c6-lcd147 (172x320 LCD), none

ESP32 (classic)

ttgo-tdisplay (135x240 TFT), esp32dev-loopback, none

WiFi (virtual access point) works on all four chips. BLE is not exposed by this wrapper.


📊 Landscape & Comparison

Solution

Emulates without physical board

Requires account or token

Supported in Coding Agents (MCP)

esp32sim-mcp

✅ Yes (Local)

❌ No (100% Free & Open Source)

✅ Yes (stdio MCP + Agent Skill)

Wokwi CLI MCP

✅ Yes (Cloud/Local)

⚠️ Yes (WOKWI_CLI_TOKEN)

⚠️ Experimental

esparagus (Espressif)

❌ No (Needs hardware)

❌ No

✅ Yes (Hardware flasher)

esp32sim (Upstream)

✅ Yes

❌ No

❌ No MCP / No Skill


⚠️ Limitations

  • Prebuilt emulator binaries cover macOS arm64 and Linux x64/arm64; elsewhere build esp32sim with Cargo. doctor tells you what is missing.

  • The agent builds firmware itself with ESP-IDF (idf.py build); there is no build tool in the MCP server.

  • Windows is untested.

  • An emulator is not silicon: peripherals esp32sim does not model, RF timing and BLE are out of reach. Confirm on hardware before you ship.

🤝 Contributing

Issues and pull requests are welcome; see CONTRIBUTING.md and CHANGELOG.md.


🙏 Acknowledgments & Credits


📄 License

MIT © Emanuele Strazzullo

Available Tools

6 tools
sim_doctorA

Validates local environment: checks if esp32sim binary is installed, checks Rust/Cargo, and provides setup instructions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/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 usefully signals that this is an informational diagnostic (checks + provides instructions, implying no mutation), but it never explicitly states that it is side-effect free or describes what the validation report looks like.

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?

One front-loaded sentence with a colon-separated list of checks; every clause earns its place and nothing is padded.

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?

For a no-argument diagnostic with no output schema and no annotations, the description conveys enough to call it correctly — what it inspects and that it emits setup guidance. Only the shape of the returned report is left unstated, a minor gap.

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 and the schema confirms an empty object, so there is nothing for the description to disambiguate. Baseline 4 applies.

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 ('Validates local environment') and enumerates exactly what it inspects: the esp32sim binary, Rust/Cargo, plus setup instructions. This clearly separates it from the simulation-execution siblings, though it never names those siblings for contrast.

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?

No when-to-use guidance is given. With siblings sim_run/sim_script/sim_expect, the natural question — run this before simulating, or only after a failure? — is left entirely to inference, and no alternatives or prerequisites are mentioned.

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

sim_expectA

Runs firmware in simulation and asserts that specific text or regex patterns appear on UART. Ideal for automated unit & integration testing in a Red-Green-Refactor agent loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
chipNoTarget chip family. Default is s3 (ESP32-S3).
wifiNoAttach a virtual access point with DHCP/DNS/NAT. Spec like 'ssid=demo,psk=secret' (keys: ssid, psk, chan, bssid), or a bare SSID for an open network. Station gets 10.0.2.15.
boardNoBoard model: S3 'atech14' (default), 'waveshare-lcd4b', 'waveshare-amoled18-v2', 'waveshare-cam'; C6 'waveshare-c6-lcd147'; ESP32 'ttgo-tdisplay', 'esp32dev-loopback'; 'none' for a bare module. Omit on the C3, which has no boards. See sim_list_boards.
appBinNoDirect path to the application binary (.bin).
eventsNoOptional interaction events before checking patterns.
orderedNoWhether patterns must appear in exact chronological sequence (default: true).
patternsYesList of expected strings or regex patterns on UART output.
ptableBinNoDirect path to partition-table.bin (needed with appBin for a real ROM boot).
maxSecondsNoMax emulated seconds to wait for patterns (default 10).
projectDirNoPath to the ESP-IDF project root or build folder. If omitted, uses current working directory.
bootloaderBinNoDirect path to bootloader.bin (needed with appBin for a real ROM boot).

TDQS

A3.7/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 does disclose the core behavior (boots firmware in a simulator and matches patterns against UART output, with ordering semantics implied elsewhere), but it never says what happens on a mismatch — error, failing result payload, or timeout — nor explains side effects of launching a simulation, which is the key behavioral fact for an assertion tool.

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 sentences, zero waste, and the primary purpose is front-loaded ahead of the testing use case. Nothing is repeated or padded.

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?

For an 11-parameter tool with no annotations and no output schema, the description leaves meaningful gaps: it never states the outcome contract (pass/fail semantics, behavior on unmet patterns or timeout), nor how it relates to sim_run/sim_script. The rich input schema compensates for parameter-level detail, but the assertion-result behavior remains undocumented.

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

Parameters3/5

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

Schema description coverage is 100% across 11 parameters, including chip, board, events, maxSeconds and the bin paths, so the schema does the heavy lifting. The description only loosely reinforces semantics ('text or regex patterns on UART'), adding little beyond what the schema already documents. Baseline 3 is appropriate.

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: it runs firmware in simulation and asserts that text/regex patterns appear on UART output. That is a precise purpose an agent can distinguish from a plain run tool, though the description never names a sibling (sim_run, sim_script) to sharpen the boundary.

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 clear usage context — automated unit and integration testing inside a Red-Green-Refactor agent loop — which tells the agent when this tool is appropriate. It stops short of explicit exclusions or naming the alternative (e.g. use sim_run when no assertion is needed).

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

sim_list_boardsA

Returns the catalogue of all supported ESP32 chips, boards, displays, peripherals and capabilities.

ParametersJSON Schema
NameRequiredDescriptionDefault
chipNoFilter boards by chip family.

TDQS

A3.6/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 burden. 'Returns the catalogue' implies a safe, read-only lookup, which is the key behavioral trait, but it does not disclose whether a running simulator/session is required, whether the data is static, or any other operational constraint.

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?

A single front-loaded sentence with no filler; the verb and resource lead, and every word earns its place.

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?

For a one-parameter, read-only listing tool with no output schema, enumerating the catalogue's contents (chips, boards, displays, peripherals, capabilities) is reasonably complete. The main gap is that the optional chip filter is not acknowledged, which could matter for the agent's filtering decision.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'chip' parameter has a documented enum, so the schema already explains filtering. The description adds no syntax or semantics beyond that, and saying it returns the catalogue of 'all' chips arguably understates the existence of the filter; baseline 3 applies.

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 ('Returns') and a concrete resource (catalogue of ESP32 chips, boards, displays, peripherals, capabilities). The resource is unambiguous and clearly distinct from the action-oriented siblings (sim_run, sim_script, sim_expect, sim_screenshot, sim_doctor), but the description never names or contrasts with them.

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 listing/catalogue nature implies a discovery use case, so usage is inferable. However, there is no explicit statement of when to call this versus the simulation siblings, and no mention that the 'chip' filter can be used to narrow the catalogue, which is the one meaningful usage decision.

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

sim_runB

Boots and simulates ESP32 firmware in a local emulator without hardware. Captures UART logs, FreeRTOS asserts, memory faults, and stop reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
chipNoTarget chip family. Default is s3 (ESP32-S3).
wifiNoAttach a virtual access point with DHCP/DNS/NAT. Spec like 'ssid=demo,psk=secret' (keys: ssid, psk, chan, bssid), or a bare SSID for an open network. Station gets 10.0.2.15.
boardNoBoard model: S3 'atech14' (default), 'waveshare-lcd4b', 'waveshare-amoled18-v2', 'waveshare-cam'; C6 'waveshare-c6-lcd147'; ESP32 'ttgo-tdisplay', 'esp32dev-loopback'; 'none' for a bare module. Omit on the C3, which has no boards. See sim_list_boards.
appBinNoDirect path to the application binary (.bin).
consoleNoConsole source to capture (default: both = UART0 + USB-Serial/JTAG). Lines ESP-IDF mirrors on both consoles are shown once.
ptableBinNoDirect path to partition-table.bin (needed with appBin for a real ROM boot).
maxSecondsNoMaximum emulated time in seconds (default: 10s). Emulation usually runs faster than real time.
projectDirNoPath to the ESP-IDF project root or build folder. If omitted, uses current working directory.
bootloaderBinNoDirect path to bootloader.bin (needed with appBin for a real ROM boot).
stopAfterExceptionsNoStop after N CPU exceptions (unset by default). Counts every exception, including the window overflow/underflow ones Xtensa firmware takes constantly, so it is a debugging aid, not a crash detector. Panics are detected from the log regardless.

TDQS

B3.3/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 behavioral burden. It usefully discloses that execution is hardware-free and enumerates what is captured (UART logs, FreeRTOS asserts, memory faults, stop reason), but says nothing about blocking behavior, whether artifacts are written to disk, or how failures surface to the caller.

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 sentences, no filler, with the core action front-loaded and the diagnostic outputs listed compactly. Every clause earns its place.

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?

No output schema exists, and the description partially compensates by naming the captured artifacts. However, for a 10-parameter tool with two distinct input modes (projectDir vs explicit appBin/ptableBin/bootloaderBin), it gives no guidance on which mode to choose or what a run session returns beyond the diagnostic list.

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

Parameters3/5

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

Schema description coverage is 100%, so all 10 parameters are already documented with rich detail (chip defaults, wifi spec syntax, board models, console modes). The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

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 and resource (boots and simulates ESP32 firmware) plus the execution mode (local emulator, no hardware), which is unambiguous on its own. It never names or contrasts with siblings like sim_script or sim_expect, so an agent must infer that this is the raw run entry point rather than a scripted/scenario runner.

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?

There is no when-to-use guidance, no prerequisites (e.g. firmware must be built first), and no routing to sim_script / sim_expect / sim_doctor. The only implicit hint is that this is a run action, leaving the agent to guess how it relates to the other five sim_* tools.

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

sim_screenshotC

Captures a snapshot image of the virtual LCD/TFT display buffer at a specified emulated time.

ParametersJSON Schema
NameRequiredDescriptionDefault
chipNoTarget chip family. Default is s3 (ESP32-S3).
boardNoBoard with a display: 'atech14', 'waveshare-lcd4b', 'waveshare-amoled18-v2' (S3), 'waveshare-c6-lcd147' (C6), 'ttgo-tdisplay' (ESP32).atech14
appBinNoDirect path to the application binary (.bin).
ptableBinNoDirect path to partition-table.bin (needed with appBin for a real ROM boot).
projectDirNoPath to the ESP-IDF project root or build folder. If omitted, uses current working directory.
timeSecondsNoEmulated second at which to take the screenshot.
bootloaderBinNoDirect path to bootloader.bin (needed with appBin for a real ROM boot).

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It says what is captured but not where the image goes (file path, base64 return), whether the emulator boots the ROM on its own, whether a prior build/run is required, or any cost/time implications of advancing emulation to timeSeconds.

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?

A single front-loaded sentence with no filler or redundancy. It is efficient, though its brevity leaves the gaps noted in other dimensions rather than wasting words.

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

Completeness2/5

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

For a 7-parameter tool with no annotations and no output schema, the description omits the return value entirely (image path vs inline data) and says nothing about build/boot prerequisites implied by appBin, ptableBin and bootloaderBin. An agent would have to guess how to consume the result.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all 7 parameters including chip, board, binary paths and timeSeconds. The phrase 'at a specified emulated time' merely restates timeSeconds, adding no syntax or format detail beyond the schema. Baseline 3 applies.

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 (captures) and a precise resource (snapshot image of the virtual LCD/TFT display buffer) plus the timing scope. An agent can tell this apart from sim_run/sim_script by the display-capture framing, though no sibling is named explicitly.

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 gives no when-to-use, when-not-to-use, or alternative guidance. It does not clarify the relationship to sim_run (does the emulator need to be running/built first?) or when a screenshot is preferable to scripted assertions via sim_expect.

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

sim_scriptB

Simulates hardware interactions (button presses, GPIO levels, rotary encoder turns, touch, UART/console input) at specific emulated timestamps, capturing interactive firmware behavior.

ParametersJSON Schema
NameRequiredDescriptionDefault
chipNoTarget chip family. Default is s3 (ESP32-S3).
wifiNoAttach a virtual access point with DHCP/DNS/NAT. Spec like 'ssid=demo,psk=secret' (keys: ssid, psk, chan, bssid), or a bare SSID for an open network. Station gets 10.0.2.15.
boardNoBoard model: S3 'atech14' (default), 'waveshare-lcd4b', 'waveshare-amoled18-v2', 'waveshare-cam'; C6 'waveshare-c6-lcd147'; ESP32 'ttgo-tdisplay', 'esp32dev-loopback'; 'none' for a bare module. Omit on the C3, which has no boards. See sim_list_boards.
appBinNoDirect path to the application binary (.bin).
eventsNoHost actions at emulated times.
ptableBinNoDirect path to partition-table.bin (needed with appBin for a real ROM boot).
maxSecondsNoTotal simulation duration in seconds (default 15).
projectDirNoPath to the ESP-IDF project root or build folder. If omitted, uses current working directory.
bootloaderBinNoDirect path to bootloader.bin (needed with appBin for a real ROM boot).
scriptContentNoRaw esp32sim script text instead of events (e.g. "1.5 press btn1 150\n3.0 stop").

TDQS

B3.3/5.0
Behavior2/5

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

Annotations are absent, so the description must carry the full behavioral burden. It states that events fire at emulated timestamps and that interactive firmware behavior is captured, but it omits the execution model, side effects, permissions, error behavior, and whether the simulation is isolated or modifies persistent state.

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?

A single, front-loaded sentence that efficiently packs the tool's scope and key interaction types. There is no filler or redundancy.

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?

The rich input schema covers parameters, but the description does not explain the overall workflow, output or return behavior (no output schema exists), or how this tool relates to sim_run and sim_expect. For a complex simulation tool with no annotations, this leaves important contextual gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all ten parameters in detail. The description adds no parameter-level meaning beyond the general scope, so the baseline of 3 applies.

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 names the verb 'Simulates', the resource 'hardware interactions', and enumerates concrete interaction categories (button presses, GPIO levels, rotary encoder turns, touch, UART/console input). It does not explicitly differentiate this tool from siblings such as sim_run or sim_expect, which keeps it below a 5.

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?

No explicit when-to-use guidance or alternatives are given. The description implies the tool injects timed inputs into an emulated firmware session, but an agent must infer this from the purpose statement rather than being told directly when to choose it over sim_run or sim_expect.

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.1
    • First observedsim_doctor
    • First observedsim_expect
    • First observedsim_list_boards
    • First observedsim_run
    • First observedsim_screenshot
    • First observedsim_script

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct action (run, script inputs, assert, list boards, screenshot, validate env), and descriptions clarify boundaries. Minor overlap exists between sim_run and sim_expect, since both boot firmware, but the assertion-focused purpose of sim_expect distinguishes it well enough.

Naming Consistency5/5

All tools use a consistent sim_ prefix with snake_case naming (sim_run, sim_script, sim_expect, sim_list_boards, sim_screenshot, sim_doctor). The verb/noun pattern is predictable and readable throughout.

Tool Count5/5

Six tools is well-scoped for an ESP32 simulation server, covering execution, input scripting, assertions, board discovery, display capture, and environment validation. Each tool clearly earns its place with no redundancy.

Completeness4/5

The surface covers the core firmware-simulation lifecycle: boot/run, drive inputs, assert UART output, enumerate boards, capture display, and validate environment. Minor gaps like reading GPIO output state or finer run-control (pause/step) are worth noting but workable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server for managing ESP-IDF workflows, enabling LLMs to build, flash, and test firmware for ESP32 and related microcontrollers. It provides tools for project creation, target configuration, and serial port management to simplify embedded development.
    158
    -
  • 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
    890 PyPI
    18
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that lets AI coding agents drive the full STM32 development loop—code generation, build, flash, debug, serial monitoring, and fault diagnosis—end to end via CubeIDE, CubeMX, CubeProgrammer, OpenOCD, and GDB.
    1
    MIT