adancurusul/embedded-debugger
Embedded hardware debugging workflow for probe-rs targets using embedded-debugger-mcp. Use when Codex or Claude Code needs to inspect debug probes, validate embedded debugger setup, start the MCP server, guide a user through ARM Cortex-M/RISC-V flashing/debugging/RTT workflows, or operate without installing an MCP client by using the CLI plus prompts.
npx skills add https://github.com/Adancurusul/embedded-debugger-mcp --skill embedded-debugger
Use the local embedded-debugger-mcp binary as the source of truth. Prefer CLI
checks first, then MCP tools when an MCP client is available.
embedded-debugger-mcp serve
embedded-debugger-mcp doctor, embedded-debugger-mcp probes list, and
embedded-debugger-mcp skill print-prompt.
before destructive actions such as flash erase or program.
Run these in order and report the exact outcome:
embedded-debugger-mcp doctor
embedded-debugger-mcp probes list
embedded-debugger-mcp config show
Use JSON for automation:
embedded-debugger-mcp doctor --json
embedded-debugger-mcp probes list --json
One tool set runs over two interchangeable engines, chosen at connect:
backend: "probe-rs" (default) — native probe-rs; supports flash and RTT.backend: "openocd" (experimental) — talks to an already-running openocdover its GDB port via openocd_address (default 127.0.0.1:3333). Use for
chips probe-rs does not cover well (e.g. Xtensa ESP32 via openocd-esp32).
Memory access and halt/run/step/reset are validated on real ESP32-S3; flash
and RTT are not available on this backend. Register reads currently use ARM
gdb register numbers, so PC/SP are wrong on Xtensa (known limitation).
diagnose_fault and unwind_exception are Cortex-M specific and do not
apply to Xtensa targets.
gdb_memory_map disable, otherwise it probes flash onthe GDB connect, fails, and REJECTS the connection. Example:
openocd -f board/esp32s3-builtin.cfg -c "gdb_memory_map disable".
The AI uses the same tools regardless of backend; only connect differs.
Use MCP tools for session-based operations:
list_probesconnect (add backend: "openocd" and openocd_address to use OpenOCD)probe_info, get_status, and read_memorydiagnose_fault: it reads the Cortex-M SCB faultregisters (CFSR/HFSR/MMFAR/BFAR/SHCSR/CPUID) plus PC/SP/LR and returns a
compact structured evidence bundle in one call. Halt the target first for
meaningful values; reason over the set fault bits yourself. Then call
unwind_exception with elf_path to map the crash to a source line
(full DWARF backtrace on probe-rs; faulting PC/LR on OpenOCD).
write_memory, flash_erase, flash_program, run_firmware (probe-rs)
rtt_attach, rtt_channels,rtt_read, rtt_write, rtt_detach (probe-rs)
disconnectYou are a capable model: prefer fetching ground truth over relying on memorized
or hardcoded chip data. This skill points you to sources; it does not embed
register tables. In order of authority:
registers are self-described by the GDB target description; memory is read
with read_memory; core identity from CPUID / the connected target.
from DWARF — use unwind_exception (pass elf_path) to map addresses to
file:line.
or fault register, find the peripheral's base in the memory-map chapter, add
the register offset, then read_memory. Search the vendor document for the
exact value; do not guess addresses from memory. CMSIS-SVD files are a
machine-readable source for register maps.
ARM architecture and identical across vendors — diagnose_fault reads them.
They do not exist on non-Cortex-M targets (e.g. Xtensa ESP32).
Do not hardcode or invent register/peripheral addresses. If a value is not
recoverable from the target, the ELF, or a cited datasheet, say so.
Behavior and target support depend on tool versions — check them before
concluding something is unsupported or broken:
(e.g. Xtensa support is comparatively new). Check embedded-debugger-mcp doctor.
for Xtensa ESP32, and some targets need flags like gdb_memory_map disable.
Check openocd --version.
probes listreports the connected probe.
mutating hardware operations.
ranges, and flash erase permissions.
tool result that produced the evidence.
For a reusable CLI+Skill prompt, read
references/default-prompt.md.
Take adancurusul/embedded-debugger from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.