dbgprobe-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DBGPROBE_BACKEND | No | Debug probe backend. Future: openocd, pyocd. | jlink |
| DBGPROBE_GDB_TRACE | No | Log all GDB RSP packets to file. Set to 1, true, or yes to enable. | disabled |
| DBGPROBE_INTERFACE | No | Debug interface: SWD or JTAG. | SWD |
| DBGPROBE_MCP_TRACE | No | JSONL tracing of every tool call. Set to 0, false, or no to disable. | enabled |
| DBGPROBE_SPEED_KHZ | No | Interface clock speed in kHz. | 4000 |
| DBGPROBE_JLINK_PATH | No | Explicit path to JLinkExe (or JLink.exe on Windows). | auto-detect |
| DBGPROBE_MCP_PLUGINS | No | Plugin policy: all or comma-separated plugin names. | disabled |
| DBGPROBE_JLINK_DEVICE | No | Default target device string (e.g. nRF52840_xxAA). Can be overridden per-session. | |
| DBGPROBE_MCP_LOG_LEVEL | No | Python log level (DEBUG, INFO, WARNING, ERROR). Logs go to stderr. | WARNING |
| DBGPROBE_GDB_TRACE_FILE | No | Path for GDB RSP trace log (only when GDB_TRACE is on). | /tmp/gdb_trace.log |
| DBGPROBE_MCP_TOOL_SEPARATOR | No | Character used to separate tool name segments. Set to _ for MCP clients that reject dots (e.g. Cursor). | . |
| DBGPROBE_MCP_TRACE_PAYLOADS | No | Include memory data payloads in traced args (stripped by default). | disabled |
| DBGPROBE_MCP_TRACE_MAX_BYTES | No | Max payload chars before truncation (only when TRACE_PAYLOADS is on). | 16384 |
| DBGPROBE_JLINK_GDBSERVER_PATH | No | Explicit path to JLinkGDBServerCLExe. | auto-detect |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| dbgprobe.probes.listA | List attached debug probes. Returns vendor/backend-specific info (serial number, description). For J-Link, enumerates via JLinkExe. |
| dbgprobe.connectA | Establish a debug probe session. Returns a session_id and the resolved configuration (backend, executable paths, defaults applied). The target is halted after connecting — this is inherent to the debug probe connection. Use dbgprobe.go to resume execution if needed. For symbol-aware debugging, attach an ELF file with dbgprobe.elf.attach after connecting — this enables breakpoints by function name and address-to-symbol resolution in status/step/halt responses. For register-level peripheral access, attach an SVD file with dbgprobe.svd.attach. |
| dbgprobe.eraseA | Erase target flash. With no address params: full chip erase (unlocks secured/read-protected devices like Nordic APPROTECT). With start_addr and end_addr: erase only that range. If session_id is provided, erases through the active GDB session (preferred — no USB contention). Without session_id, uses JLinkExe directly (for session-less erase, e.g. unlocking a secured device before connect). |
| dbgprobe.disconnectC | Close a debug probe session and release resources. |
| dbgprobe.resetA | Reset the target. Modes: 'soft' (default) — software reset and resume, 'hard' — hardware reset, 'halt' — reset and halt at first instruction. |
| dbgprobe.haltC | Halt the target CPU. |
| dbgprobe.goC | Resume target execution (run/go). |
| dbgprobe.flashA | Program a firmware image to the target. Supports .hex, .elf (address auto-detected) and raw .bin (requires explicit addr). Optionally verify and reset after flashing. If session_id is provided, tears down GDB, flashes, and restarts (preferred). Without session_id, uses JLinkExe directly (session-less, no debug session needed). |
| dbgprobe.mem.readA | Read memory from the target. Returns data in the requested format: 'hex' (hex string), 'base64', or 'u32' (array of 32-bit words, little-endian). If an SVD file is attached and the read is exactly one register wide, the response includes decoded SVD field names and values. |
| dbgprobe.mem.writeB | Write data to target memory. Provide data in one of: 'hex' (hex string), 'base64', or 'u32' (array of 32-bit words, little-endian). |
| dbgprobe.stepA | Single-step one instruction. Target must be halted first. Returns the new PC and stop reason. |
| dbgprobe.statusA | Query target state. Returns whether the target is running or halted, and if halted, the current PC and stop reason (e.g. breakpoint hit). |
| dbgprobe.breakpoint.setA | Set a breakpoint at a target address or symbol name. Software breakpoints (default) are handled by the debug probe and work on both flash and RAM. Hardware breakpoints use the CPU's FPB and are limited in number (typically 4-6). If 'symbol' is provided and an ELF is attached, resolves the symbol to an address. |
| dbgprobe.breakpoint.clearC | Clear a breakpoint at a target address. |
| dbgprobe.breakpoint.listB | List all active breakpoints for a session. |
| dbgprobe.connections.listA | List all open probe sessions with their status, backend, device, and config. Useful for recovering session IDs after context loss. |
| dbgprobe.elf.attachA | Parse an ELF file and attach it to a session. Enables symbol-based breakpoints (by function name), address-to-symbol resolution in status/step/halt responses, and symbol search. Re-attaching replaces the previous ELF. |
| dbgprobe.elf.infoA | Get ELF metadata for a session: file path, symbol count, entry point, sections. Returns null if no ELF is attached. |
| dbgprobe.elf.lookupA | Bidirectional symbol lookup. Provide 'symbol' for name-to-address, or 'address' for address-to-name+offset. Exactly one is required. |
| dbgprobe.elf.symbolsB | Search or list ELF symbols. Optional substring filter, optional type filter (FUNC, OBJECT, NOTYPE, etc.), default limit 50. |
| dbgprobe.svd.attachA | Parse an SVD file and attach it to a session. Enables named register reads/writes, field-level access, and auto-decode on mem.read. Re-attaching replaces the previous SVD. |
| dbgprobe.svd.infoB | Get SVD metadata for a session: device name, peripheral count. Returns null if no SVD is attached. |
| dbgprobe.svd.readB | Read a register or field by name. For registers (e.g. 'GPIO.OUT'), returns the raw value and all decoded fields. For fields (e.g. 'GPIO.PIN_CNF[3].PULL'), returns just the field value and enum name. |
| dbgprobe.svd.writeA | Write a raw value to a full register. No read-modify-write — the entire register is overwritten. For field-level writes, use svd.set_field. |
| dbgprobe.svd.set_fieldA | Read-modify-write a single register field. Reads the current register value, modifies the specified field, and writes back. Accepts enum names (e.g. 'PullUp') or integer values. |
| dbgprobe.svd.update_fieldsA | Batch read-modify-write: update multiple fields in one register with a single read and write. Accepts a dict of field names to values (enum names or integers). |
| dbgprobe.svd.list_peripheralsC | List all peripherals defined in the attached SVD. |
| dbgprobe.svd.list_registersB | List all registers for a peripheral. |
| dbgprobe.svd.list_fieldsB | List all fields for a register. |
| dbgprobe.svd.describeB | Detailed description of a peripheral, register, or field. Includes description, access type, reset value, and enum values as appropriate. |
| dbgprobe.rtt.startA | Start RTT (Real-Time Transfer) on a connected session. Connects to the JLinkGDBServer RTT telnet port and begins buffering target output (channel 0). Optional address hint for the RTT control block in target RAM. |
| dbgprobe.rtt.stopC | Stop RTT and disconnect from the telnet port. |
| dbgprobe.rtt.readA | Read buffered RTT data from the target. Returns data as text (UTF-8 by default) or hex. Non-blocking — returns whatever is buffered, waiting up to timeout seconds for initial data. |
| dbgprobe.rtt.writeA | Write data to the target via RTT channel 0. Input is text (UTF-8 by default) or hex-encoded bytes. |
| dbgprobe.rtt.statusA | Return RTT status: active, bytes buffered, total read/written. |
| dbgprobe.trace.statusB | Return tracing config and event count. |
| dbgprobe.trace.tailB | Return last N trace events (default 50). |
| dbgprobe.plugin.listA | List loaded plugins with their tool names and metadata. Each plugin may include a 'meta' dict with matching hints like device_name_contains or description — use these to determine which plugin fits the connected device. Also returns whether plugins are enabled and the current policy. Plugins require DBGPROBE_MCP_PLUGINS env var — set to 'all' for all or 'name1,name2' to allow specific plugins. If disabled, tell the user to set this variable when adding the MCP server. |
| dbgprobe.plugin.reloadA | Hot-reload a plugin by name. Re-imports the module and refreshes tools. Requires DBGPROBE_MCP_PLUGINS env var to be set. |
| dbgprobe.plugin.templateA | Return a Python plugin template. Use this when creating a new plugin. Optionally pre-fill with a device name. Save the result to .dbgprobe_mcp/plugins/.py, fill in the tools and handlers, then load with dbgprobe.plugin.load. |
| dbgprobe.plugin.loadB | Load a new plugin from a file or directory path. Requires DBGPROBE_MCP_PLUGINS env var to be set. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/es617/dbgprobe-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server