esp32sim-mcp
Provides tools for booting, driving, and testing ESP32 firmware built with ESP-IDF in a local emulator, using official Espressif mask ROMs and supporting ESP32/S3/C3/C6 chips and related boards.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@esp32sim-mcpbuild and boot my ESP-IDF firmware, then assert the UART log contains 'Hello world'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
esp32sim-mcp
"Your agent writes ESP32 firmware, boots it and tests it. No board, no account."
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 setupThis 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-runAgent | MCP server (project / | Skill (project / |
Claude Code |
|
|
Codex |
|
|
Cursor |
|
|
Claude Desktop |
| — |
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 doctorPlatforms 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-romsThe 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 |
|
| UART console log, stop reason, exit code, panic details | Boots real mask ROM & bootloader, runs app, captures UART output and crash logs. |
|
| Timed UART logs | Injects hardware events (button presses, rotary encoder, UART RX data) at emulated timestamps. |
|
| Pass/Fail status, matched lines, diff of missing line | Asserts expected UART output for autonomous Red-Green-Refactor testing loops. |
|
| PNG image & base64 data | Captures the virtual ST7735/ST7789/ST7701S/CO5300 display buffer at specific emulated moment. |
|
| Board specs & peripherals | Catalogs supported chips, CPU cores, displays, and peripheral buttons. |
| none | Environment health report | Checks the |
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 separatelyexamples/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.jsonto 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 ( |
ESP32-S3 |
|
ESP32-C3 | console only (no board models) |
ESP32-C6 |
|
ESP32 (classic) |
|
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 ( | ⚠️ 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
esp32simwith Cargo.doctortells 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
mikroverk/esp32sim: The blazing-fast, instruction-level ESP32 emulator in Rust that powers the local execution engine.
Espressif Systems: For ESP-IDF and official mask ROMs.
Model Context Protocol (MCP): The open standard for connecting AI models to tools and development environments.
📄 License
MIT © Emanuele Strazzullo
Available Tools
6 toolssim_doctorA
Validates local environment: checks if esp32sim binary is installed, checks Rust/Cargo, and provides setup instructions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chip | No | Target chip family. Default is s3 (ESP32-S3). | |
| wifi | No | Attach 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. | |
| board | No | Board 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. | |
| appBin | No | Direct path to the application binary (.bin). | |
| events | No | Optional interaction events before checking patterns. | |
| ordered | No | Whether patterns must appear in exact chronological sequence (default: true). | |
| patterns | Yes | List of expected strings or regex patterns on UART output. | |
| ptableBin | No | Direct path to partition-table.bin (needed with appBin for a real ROM boot). | |
| maxSeconds | No | Max emulated seconds to wait for patterns (default 10). | |
| projectDir | No | Path to the ESP-IDF project root or build folder. If omitted, uses current working directory. | |
| bootloaderBin | No | Direct path to bootloader.bin (needed with appBin for a real ROM boot). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chip | No | Filter boards by chip family. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chip | No | Target chip family. Default is s3 (ESP32-S3). | |
| wifi | No | Attach 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. | |
| board | No | Board 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. | |
| appBin | No | Direct path to the application binary (.bin). | |
| console | No | Console source to capture (default: both = UART0 + USB-Serial/JTAG). Lines ESP-IDF mirrors on both consoles are shown once. | |
| ptableBin | No | Direct path to partition-table.bin (needed with appBin for a real ROM boot). | |
| maxSeconds | No | Maximum emulated time in seconds (default: 10s). Emulation usually runs faster than real time. | |
| projectDir | No | Path to the ESP-IDF project root or build folder. If omitted, uses current working directory. | |
| bootloaderBin | No | Direct path to bootloader.bin (needed with appBin for a real ROM boot). | |
| stopAfterExceptions | No | Stop 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chip | No | Target chip family. Default is s3 (ESP32-S3). | |
| board | No | Board with a display: 'atech14', 'waveshare-lcd4b', 'waveshare-amoled18-v2' (S3), 'waveshare-c6-lcd147' (C6), 'ttgo-tdisplay' (ESP32). | atech14 |
| appBin | No | Direct path to the application binary (.bin). | |
| ptableBin | No | Direct path to partition-table.bin (needed with appBin for a real ROM boot). | |
| projectDir | No | Path to the ESP-IDF project root or build folder. If omitted, uses current working directory. | |
| timeSeconds | No | Emulated second at which to take the screenshot. | |
| bootloaderBin | No | Direct path to bootloader.bin (needed with appBin for a real ROM boot). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| chip | No | Target chip family. Default is s3 (ESP32-S3). | |
| wifi | No | Attach 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. | |
| board | No | Board 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. | |
| appBin | No | Direct path to the application binary (.bin). | |
| events | No | Host actions at emulated times. | |
| ptableBin | No | Direct path to partition-table.bin (needed with appBin for a real ROM boot). | |
| maxSeconds | No | Total simulation duration in seconds (default 15). | |
| projectDir | No | Path to the ESP-IDF project root or build folder. If omitted, uses current working directory. | |
| bootloaderBin | No | Direct path to bootloader.bin (needed with appBin for a real ROM boot). | |
| scriptContent | No | Raw esp32sim script text instead of events (e.g. "1.5 press btn1 150\n3.0 stop"). |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.1- First observed
sim_doctor - First observed
sim_expect - First observed
sim_list_boards - First observed
sim_run - First observed
sim_screenshot - First observed
sim_script
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.
Disposable cloud Android emulators for coding agents: run an APK or PR build, tap, type, screenshot.
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn 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-
- AlicenseNot gradedqualityAmaintenanceMCP 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.18MIT
- AlicenseAqualityAmaintenanceAgentic 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.44890 PyPI18Apache 2.0
- AlicenseNot gradedqualityCmaintenanceAn 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.1MIT