
OpenOCD Debugger
io.github.microhenrio由 GitHub 账号 microhenrio 发布v0.4.5更新于 Oct 24, 2026
Debug microcontrollers via OpenOCD: flash, breakpoints, memory, registers and variables.
概览
让 AI 助手通过 OpenOCD 烧录、暂停、单步和检查单片机固件,并按名称读写变量与外设寄存器。
- 可以做什么
- 烧录并校验固件镜像,控制执行:暂停、继续、单步、复位
- 读写 CPU 寄存器与内存,导出内存区域
- 设置硬件与软件断点(含条件断点和命中计数断点),以及数据观察点
- 依据 ELF 符号按名称读写固件变量,并在不暂停 CPU 的情况下按时间采样
- 依据 CMSIS-SVD 文件按名称读取外设寄存器,并解码为具名位域
- 查看并修改会话配置与权限设置
- 适用场景
- 适合通过调试探针在真实开发板上调试嵌入式固件时使用,让助手直接连接目标、检查状态、设置断点并烧录构建产物,无需切换到独立的调试器界面。适用于 OpenOCD 支持的芯片的迭代调试与问题定位。
- 运行要求
- 以 stdio 本地进程运行(需 Python 3.10+,可从 PyPI 安装或用 uvx 运行)。需要连接目标的调试探针(ST-Link、J-Link、CMSIS-DAP 等),以及 OpenOCD,可自动下载并缓存,或通过 OPENOCD_BIN 指定已有安装。可选 OPENOCD_MCP_CONFIG 指向包含目标配置、SVD 与 ELF 的项目配置;OPENOCD_MCP_READONLY 可强制只读模式。
安装
在 SourceWeft 中
- 打开 控制台中的 OpenOCD Debugger,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
[Last Commit] [License] [MCP Server] [AI Ready] [uvx compatible] [PyPI Version] [PyPI Downloads] [Python Versions]
OpenOCD MCP Server
Debug microcontrollers directly from your AI assistant. This is an MCP server that drives OpenOCD, letting any MCP-compatible AI flash firmware, control execution, and inspect a running target — and read your variables and peripheral registers by name instead of raw addresses.
Description
Once connected to a target through a debug probe (ST-Link, J-Link, CMSIS-DAP, …), your AI assistant can:
- Flash firmware — program and verify
.elf/.bin/.heximages - Control execution — halt, resume, single-step, reset
- Inspect state — read/write CPU registers and memory
- Set breakpoints — hardware & software, including conditional breakpoints (halt only when an expression is true) and hit-count breakpoints
- Watch memory — hardware watchpoints that halt on read/write/access to an address
- Read variables by name — from your firmware's
.elfsymbols (e.g.read_variable uart_rx_count) - Live-watch variables — a window that samples variables over time without halting the CPU, with expandable structs/arrays auto-typed from DWARF (signed/float/pointer/enum)
- Read peripheral registers by name — from a CMSIS-SVD file, decoded into named bitfields (e.g.
RCC.CR,GPIOA.MODER) - Safety gates — permission layer (read-only mode, gated flash-erase, flash path/size limits) so the agent can't damage a target unexpectedly
The server is chip-agnostic — it works with any target OpenOCD supports; you point it at your chip's config and (optionally) SVD/ELF. It can also start OpenOCD for you and download OpenOCD automatically for your platform, so there's nothing else to install by hand.
Supported AI clients
Any MCP-compatible client works. Tested and known to work:
Installation
Prerequisites: Python 3.10+ and a debug probe connected to your target.
Clone and install the package into a virtual environment:
Install it (creates the openocd-mcp command):
Windows shortcut: run
setup.bat— it creates the environment, installs the package, and registers it with Claude Code automatically.
OpenOCD is obtained automatically: a build for your OS/architecture is
downloaded and cached on first connect (checksum-verified). You can also fetch it
ahead of time with openocd-mcp install-openocd, or use an existing install by
setting the OPENOCD_BIN environment variable.
Registering with your AI client
The server executable is:
Claude Code
Restart Claude Code, then verify with claude mcp list.
Claude Desktop
Add to claude_desktop_config.json (Edit → Settings → Developer → Edit Config):
Restart Claude Desktop.
Cursor
Add to ~/.cursor/mcp.json (or .cursor/mcp.json in your project):
Restart Cursor.
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
Restart Windsurf.
Cline (VS Code)
Open the Cline panel → MCP Servers → Add Server → Manual, then enter:
Continue (VS Code / JetBrains)
Add to ~/.continue/config.json:
VS Code + GitHub Copilot
Add to .vscode/mcp.json in your workspace (or user settings.json):
Enable via Chat → Agent mode in VS Code.
Updating
There's no self-update tool exposed over MCP — updating means running commands in
a terminal, either yourself or by asking an AI that has shell access (e.g. Claude
Code). After updating, restart your AI client so it loads the new server;
if it was mid-session, it may need to stop the old openocd-mcp process first
(a file lock can block the reinstall while it's running).
PyPI install (pip install openocd-mcp or uvx):
Editable git-clone install (what setup.bat / this repo's instructions set up):
Check the installed version with pip show openocd-mcp.
How to work with it
1. Point it at your chip
Each firmware project tells the server which target it's debugging. Create an
openocd-mcp.json in your project root (a template is in
openocd-mcp.example.json):
target_cfg/interface_cfg— OpenOCD configs (relative to its scripts dir). Defaults to an ST-Link probe; settarget_cfgfor your chip.transport—"swd"or"jtag". Set"swd"for a J-Link on Cortex-M (withinterface_cfg: "interface/jlink.cfg"); leave empty for ST-Link.svd_file— CMSIS-SVD file for the chip (enables peripheral registers by name).elf_file— your firmware build output (enables variables by name).
J-Link on Windows: OpenOCD reaches J-Links via libusb, so bind the J-Link's debug interface to libusbK (or WinUSB) with Zadig once (Interface 2 / MI_02). Newer SEGGER software (v7.x+) is compatible with libusbK, so both OpenOCD and SEGGER tools can coexist. ST-Link works without that step.
Or simply tell the AI the chip you're using and it will configure the session for
you. show_config reports the active settings at any time.
2. Describe what you want
With the board plugged in, describe what you want — the AI picks the right tools:
You don't call tools by name — describe the goal and the AI maps it to the underlying tools.
3. Conditional breakpoints & watchpoints
Conditional breakpoints halt only when a condition holds — useful for catching one specific case in code that runs constantly. Conditions are TCL expressions and can use two helpers:
get_reg <name>— a CPU register value (e.g.get_reg r0,get_reg pc)get_mem <addr> [width]— a memory value (e.g.get_mem 0x20000000)
Just describe the intent; the AI builds the condition:
When the condition is false the server resumes automatically and keeps going until it's true (or you stop it).
Watchpoints halt the CPU when it accesses a memory location — ideal for finding what corrupts a variable:
- "watch for writes to
0x20000000" - "watch address
0x20000010for any read or write"
Live-watching variables
There are two separate ways to watch a variable without halting the CPU — one the AI can trigger, one you run yourself:
Ask the AI for a quick, bounded look at a value over time — "watch tick_count
for 10 samples", "sample sensor_value every 200ms for 2 seconds". This calls the
watch_variables tool directly; no extra setup needed beyond an ELF loaded.
Run the GUI yourself for an open-ended live view, especially of structs/arrays. It's a standalone app that opens its own connection to OpenOCD, so it works fine alongside any AI session driving the same target — but it is not an MCP tool, so the AI cannot open it for you; run it directly:
It samples the variables without halting the CPU and refreshes a tree in a window. Add entries with the box (press Enter or Add) and remove a selected row with Remove (or the Delete key). Each entry is resolved automatically and can be:
- a variable name (
uwTick,commsService) → looked up in the ELF; if it's a struct, union, or array it gets an expand triangle, and its members/elements are shown auto-typed from DWARF (signed, float, pointer, enum, bitfields, nested structs). Enums show the symbolic name (STATE_HEATING (1)), and C bitfields show just their own bit(s) rather than the whole storage word; - a hex address with optional size (
0x20000000,0x20000000:2) → read directly.
A Format dropdown switches how values are shown — Auto (by C type) / Hex /
Decimal / Signed / Float (f32) / Binary — and re-renders instantly. Use
--interval to change the poll rate, --format to set the initial format, or
--samples N for a headless printout. Requires Tkinter (ships with standard Python)
and a debug build (-g) for the type info.
If OpenOCD isn't already running, add --autostart and the window launches it
for you (and stops it on close) — fully standalone, no AI client or .bat needed:
CPU core registers (
r0,pc,sp, …) require the target to be halted — the AI halts first when needed. Memory, variables, and peripheral registers are memory-mapped and can be read while the CPU is running (as the live-watch window does). The firstconnectof a session starts OpenOCD automatically.
Safety / permissions
Mutating operations are gated so the agent can't damage a target unexpectedly. Reads are always allowed; the gates apply to writes, flashing, erasing, and the raw-command escape hatch.
Set them three ways (later wins):
- A
permissionsobject inopenocd-mcp.json(seeopenocd-mcp.example.json). - The
set_permissionstool at runtime — e.g. ask the AI to "make the target read-only" or "allow flash erase for this session". - The
OPENOCD_MCP_READONLY=1environment variable (forces read-only).
A blocked call returns a clear BLOCKED: … message explaining which permission to
enable. show_config lists the active permissions.
来源:README.md,提交 2e3307f
工具
0版本历史
1- v0.4.5最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分