Skip to content
Debugging
Skill

/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,

BOOST
From plugin
embedded-debugger
2101 skill
Install
$ npx -y skills add Adancurusul/embedded-debugger-mcp --skill embedded-debugger --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/embedded-debugger

Context preview

The summary Claude sees to decide when to auto-load this skill.

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,

SKILL.md

embedded-debugger.SKILL.md
name: embedded-debugger
description: 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.

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.

Entry Decision

1. If the user has an MCP client configured, start or verify the server: `embedded-debugger-mcp serve` 2. If the user wants no MCP install, use CLI-first mode: `embedded-debugger-mcp doctor`, `embedded-debugger-mcp probes list`, and `embedded-debugger-mcp skill print-prompt`. 3. If hardware access is required, confirm the probe and target are connected before destructive actions such as flash erase or program.

CLI Workflow

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

Backends

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 `openocd`

over 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.

  • Start openocd with `gdb_memory_map disable`, otherwise it probes flash on

the 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.

MCP Workflow

Use MCP tools for session-based operations:

1. `list_probes` 2. `connect` (add `backend: "openocd"` and `openocd_address` to use OpenOCD) 3. Read-only checks such as `probe_info`, `get_status`, and `read_memory` 4. On a crash or halt, call `diagnose_fault`: it reads the Cortex-M SCB fault registers (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). 5. Mutating operations only after the user confirms target, file path, and risk: `write_memory`, `flash_erase`, `flash_program`, `run_firmware` (probe-rs) 6. RTT operations after firmware is running: `rtt_attach`, `rtt_channels`, `rtt_read`, `rtt_write`, `rtt_detach` (probe-rs) 7. `disconnect`

Fetch authoritative info yourself

You 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:

1. The target itself (runtime, most authoritative for this exact chip): registers are self-described by the GDB target description; memory is read with `read_memory`; core identity from CPUID / the connected target. 2. The firmware ELF (what is actually running): symbols and source lines come from DWARF — use `unwind_exception` (pass `elf_path`) to map addresses to `file:line`. 3. The chip datasheet / reference manual (external, per-chip): for a peripheral 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. 4. ARM Cortex-M architecture registers (SCB fault regs, CPUID) are fixed by the 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.

Know your versions

Behavior and target support depend on tool versions — check them before concluding something is unsupported or broken:

  • probe-rs version determines which chips and architectures are supported

(e.g. Xtensa support is comparatively new). Check `embedded-debugger-mcp doctor`.

  • OpenOCD version and fork matter: the Espressif fork (openocd-esp32) is needed

for Xtensa ESP32, and some targets need flags like `gdb_memory_map disable`. Check `openocd --version`.

  • Probe firmware (ST-Link / J-Link) can affect connectivity; `probes list`

reports the connected probe.

Safety Rules

  • Treat flash erase, flash program, memory write, reset, run, and RTT write as

mutating hardware operations.

  • Prefer read-only discovery before mutation.
  • Respect project configuration limits for file paths, file sizes, memory

ranges, and flash erase permissions.

  • Do not claim hardware success from command text alone; cite the command or MCP

tool result that produced the evidence.

Prompt Reference

For a reusable CLI+Skill prompt, read `references/default-prompt.md`.

Read more
Ships withembedded-debugger

Embedded Debugger MCP is a Rust server for embedded debugging through either probe-rs (native) or OpenOCD (via the GDB Remote Serial Protocol).

Get the whole plugin
Stats
210
Stars
33
Forks
Maintained
Maintenance
Rust
Language
MIT
License
3mo ago
Last commit
1y ago
Created
3d ago
Added

Repo: Adancurusul/embedded-debugger-mcp