Fix idf.py path bug (tools/idf.py in ESP-IDF v5.x) that prevented
auto-detection. Add get_idf_path_found() for toolchain management
without requiring a fully configured environment.
Tier 1 (idf_path_found): idf_tools_list, idf_tools_check,
idf_tools_install, idf_env_info — always available when IDF directory
exists with idf_tools.py.
Tier 2 (idf_available): idf_build_project, idf_flash_project,
idf_monitor — require full IDF env, gate checked at invocation time
so they unlock after install without restart.
Includes input validation (target names, tool names, baud rates),
centralized subprocess cleanup via _run_idf_py, mtime-based cache
invalidation for tools.json, and esp://idf/status resource with
per-target readiness map.
Adds esp_smart_backup and esp_smart_restore tools with chunked reads,
adaptive sizing, skip-empty detection, gzip compression, SHA256
verification, and an esp_backup_plan prompt for pre-flight planning.
Hardened against 11 code review findings including path traversal
protection, atomic manifest writes, and timeout caps.
Adds SmartBackupManager component that reads the partition table first,
then backs up each partition individually with chunked reads to stay
under the 300s MCP timeout. Solves timeout issues on large flash devices
(e.g. 16 MB ESP32-P4).
Tools: esp_smart_backup, esp_smart_restore
Prompt: esp_backup_plan (estimates backup time per partition)
Features:
- Adaptive chunk sizing based on measured throughput
- Skip-empty detection (0xFF regions)
- Optional gzip compression per partition
- SHA256 manifest for integrity verification
- Dry-run mode for time estimation
- Progress reporting via MCP context
Espressif product data fetched at build time via Content Layer API
and rendered as browsable Starlight pages. Alpine.js provides
client-side filtering by series, type, connectivity, and status.
- Products content collection with inline API loader + Zod schema
- Filterable browse page at /products/ with card grid
- Individual spec sheet pages at /products/[id]/ (94 products)
- Separate CSS with dark/light theme support
- Sidebar section linking to catalog
- Cross-references to MCP tool reference docs
5 new MCP tools for chip/module discovery, comparison, and procurement
planning using Espressif's public product catalog API. Data is lazily
fetched and cached in-memory with a 24h TTL.
Tools: esp_product_search, esp_product_info, esp_chip_compare,
esp_product_recommend, esp_product_availability
Resource: esp://products/catalog
Enriches the splash page from a bare title + 4 cards into a full
product page: hero SVG illustration, example detect→flash→verify
conversation, tabbed install instructions, supported chips table,
and capability summary. Frames content around MCP protocol rather
than any specific client.
New tools:
- esp_flash_multi: Flash multiple binaries at different addresses in one operation
- esp_verify_flash: Verify flash contents match a file without re-flashing
- esp_load_ram: Load and execute binary in RAM for rapid development
- esp_serial_monitor: Capture serial output from device
- esp_elf_to_ram_binary: Convert ELF to RAM-loadable binary
Fixes:
- Use hyphenated esptool commands (load-ram, verify-flash) to avoid deprecation warnings
- Fix verify_flash parser for esptool v5.x output format
- Fix flash_multi command ordering for esptool v5.x CLI structure
Documentation updated with flash operations table and RAM loading workflow.
No real esptool operation backs "optimize firmware binary". Size
optimization happens at compile-time via ESP-IDF menuconfig, not as
a post-processing step on a .bin file. The analysis use case is
already covered by esp_firmware_analyze.
The ROM bootloader (--no-stub) runs at ~62 kbit/s which causes
timeouts on large images. The stub flasher is dramatically faster
and works correctly over QEMU socket connections.
Replace stub implementations with real esptool subprocess calls.
Each operation runs esptool as an async subprocess with timeout,
matching the chip_control pattern. All four tools now work with
both physical ports and QEMU socket:// URIs.
Port allocator was counting stopped QEMU instances as occupying ports,
preventing new starts after stop-all. Only running instances now block
port reuse. Stopped instances with flash images on disk are preserved
for esp_qemu_flash; truly stale entries are purged.
Sort glob results when auto-detecting QEMU binaries to reliably
pick the newest version. Previously filesystem ordering could select
an older build (8.2.0 instead of 9.0.0), missing ESP32-S3 support.
Remove ESP32-S2 from CHIP_MACHINES — the Espressif QEMU fork has
no esp32s2 machine type.
Add QEMU section to README with install instructions and tool reference.
Enrich MCP tool docstrings with workflow context, cross-references to
related tools, and guidance on when to use each tool — these descriptions
are read by the calling LLM to decide tool selection.
Smoke tested against real Espressif QEMU fork — esptool successfully
identifies, reads flash_id, and writes firmware to emulated ESP32 via
socket://localhost:5555. Enriched CHIP_MACHINES with per-chip efuse
data, GPIO strap values, and watchdog timer driver names derived from
ESP-IDF's qemu_ext.py.