stm32-mcp
stm32-mcp
MCP 服务器,让 Claude Code 能够构建、烧录并与 STM32 硬件通信。
stm32-mcp 非常针对我个人进行硬件开发的方式,但很可能对其他人也有用!它可以被调整以适应许多工作流程,但这是激光聚焦于我的工作流程(stlink-v3 mini、该接口上的 VCP、STM32 微控制器)。
你可以做类似这些事情:
我: 嘿,现在谁插着?
Claude: 两个未命名的探针连接着两块未命名的 PCB
我: 好,问问它们是谁,然后根据它们的回答给它们起个昵称
Claude: 明白了,你也想给探针起昵称吗?你的板子是“门铃 A”和“合成器 B”
我: 是的,我在那些探针上做了油漆标记。把门铃的叫做“蓝色”,合成器的叫做“红色”
Claude: 完成。接下来呢?
我: 给它们两个都发送 VCP 命令,让它们能互相通信,然后让门铃约合成器出去
Claude: 思考中... 完成,合成器拒绝了。天涯何处无芳草,门铃!
MCP(模型上下文协议) 是一个开放标准,允许像 Claude 这样的 AI 助手使用外部工具。这个服务器让 Claude 能够编译你的固件、将其烧录到板子、通过串口与之通信,并通过 SWD 读取内存。它灵活且具有对话性。
[!WARNING] 这个服务器让 AI 直接访问你的编译器、调试探针和串口。它可以烧录固件、覆盖内存,并向你的硬件发送任意数据。这强大且有用,但它不是沙箱。在让它大展身手之前,要清楚连接了什么。
先决条件
STM32CubeIDE 安装在
/Applications/STM32CubeIDE.app(macOS)或/opt/st/stm32cubeide_*(Linux)Python 3.10+
OpenOCD(
brew install open-ocd)——用于烧录、内存读写和实时监控开源 stlink 工具(
brew install stlink)——用于探针枚举ST-Link 通过 USB 连接(用于烧录/板卡信息)
串口可用(ST-Link VCP 或 USB-UART 适配器)
Related MCP server: jlink-mcp
安装
git clone https://github.com/shieldyguy/stm32-mcp.git
cd stm32-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e .注册到 Claude Code
选项 A:CLI
claude mcp add stm32 -- /path/to/stm32-mcp/.venv/bin/python -m stm32_mcp.server选项 B:项目配置
添加到你的项目的 .claude/settings.json 或 .claude.json:
{
"mcpServers": {
"stm32": {
"command": "/path/to/stm32-mcp/.venv/bin/python",
"args": ["-m", "stm32_mcp.server"]
}
}
}自助 CLI
bin/ 包含四个薄包装器,封装了 MCP 工具使用的相同代码
命令 | 用法 |
| 列出已连接的探针和板卡及其昵称 |
|
|
|
|
|
|
| 列出这些命令及其用法(从脚本自动生成) |
将 bin/ 添加到你的 PATH:
export PATH="/path/to/stm32-mcp/bin:$PATH"探针昵称和板卡昵称均可解析。
构建共享 MCP 的无头 CubeIDE 工作区锁,因此 stm32-build/stm32-bf 与代理驱动的构建竞争时,会排队等待。
可用工具
构建与烧录
工具 | 描述 |
| 使用 CubeIDE 无头构建器编译固件 |
| 通过 ST-Link SWD 将 .elf/.bin/.hex 烧录到板卡 |
| 一步完成构建 + 烧录(90% 的情况) |
| 读取 ST-Link/MCU 信息(设备 ID、闪存大小、电压) |
多板管理
工具 | 描述 |
| 显示所有已连接的板卡及其昵称和 MCU ID |
| 为板卡(按 MCU UID)或探针(按 ST-Link SN)命名 |
板卡昵称跟随物理 MCU(在探针更换后仍然保留)。探针昵称跟随 ST-Link 硬件。在所有工具的任何 probe 参数中都可以使用昵称。
串行通信
工具 | 描述 |
| 列出串口(用昵称标记 ST-Link VCP 端口) |
| 打开串行连接 |
| 发送数据并读取响应 |
| 读取缓冲的串行数据 |
| 关闭串行连接 |
| 在一次调用中运行多步发送/延迟/内存序列 |
调试与监控
工具 | 描述 |
| 按地址或变量名(从 ELF 符号)读取内存 |
| 按地址或变量名写入内存 |
| 通过 SWD 启动连续的后台内存监控 |
| 从实时内存会话中读取最近的条目 |
| 停止实时内存会话 |
硬件序列
serial_sequence 在一次工具调用中调度多个步骤(串行发送、延迟、摄像头捕获和 SWD 内存读写)。延迟使用执行器线程中的 time.sleep()。Claude 无法可靠地计时单个工具调用,因此这允许对命令和预期进行紧密计时。
步骤类型
[
{ "send": "SIM_LEFT", "to": "/dev/cu.usbmodem11202" },
{ "delay_ms": 500 },
{
"send": "GET_BLINK_STATE",
"to": "/dev/cu.usbmodem11402",
"expect": "BLINK"
},
{ "capture": true, "label": "post_brake" },
{
"mem_write": true,
"address": "0x48000418",
"value": "0x40",
"probe": "yellow"
},
{ "delay_ms": 1000 },
{
"mem_read": true,
"address": "0x48000400",
"count": 2,
"probe": "yellow",
"label": "gpio_post"
}
]发送步骤:
{send, to, expect?, read_timeout?, line_ending?}—to是来自serial_connect的端口路径延迟步骤:
{delay_ms}— 真正的time.sleep(),不是工具调用往返捕获步骤:
{capture: true, label?, device_index?}— PNG 保存到/tmp/stm32-captures/内存写入步骤:
{mem_write: true, address | symbol + elf_path, value, probe, width?}内存读取步骤:
{mem_read: true, address | symbol + elf_path, probe, count?, width?, label?}
内存步骤说明:
probe接受 ST-Link SN、探针昵称或板卡昵称address是十六进制(例如"0x48000418");或者使用symbol+elf_path按名称解析width为 8/16/32 位,默认为 32(使用symbol时从符号大小自动检测)每个内存操作目前都会启动一个新的 OpenOCD 进程(每次操作约几十毫秒的开销),因此内存操作之间的时间低于约 50 毫秒是近似的。延迟本身是准确的。
参数
on_failure:"continue"(默认)无论结果如何都运行所有步骤。"stop"在第一次失败时中止。filter_responses: 当为true时,expect模式仅匹配以>为前缀的 VCP 响应行(忽略调试噪声)。
输出
Step 1 [/dev/cu.usbmodem11202] SEND: SIM_LEFT
Response: >OK:SIM_LEFT
Step 2 DELAY: 500ms
Step 3 [/dev/cu.usbmodem11402] SEND: GET_BLINK_STATE
Response: >BLINK_STATE:BLINK
Expect "BLINK": PASS
Step 4 [yellow] MEM_WRITE: Wrote 0x00000040 to 0x48000418
Step 5 DELAY: 1000ms
Step 6 [yellow] MEM_READ: gpio_post 0x48000400: 0xabffdfff 0x00000080
Summary: 2/2 sends OK, 1/1 assertions PASS, 1/1 mem_writes OK, 1/1 mem_reads OK实时内存监控
通过 SWD 实时监控固件变量,无需修改固件或使用串口。OpenOCD 作为持久子进程运行,并通过其内置的 TCL 套接字轮询变量。
启动会话
live_memory_start(
variables='["blink", "ts"]', # symbol names from ELF
elf_path="/path/to/firmware.elf",
probe="taillight", # board/probe nickname
interval_ms=500 # min 250ms
)变量可以是:
符号名称(字符串):
"blink"— 通过arm-none-eabi-nm从 ELF 解析带有符号和类型的字典:
{"symbol": "temperature", "type": "float"}— 将 32 位值解释为 IEEE 754带有原始地址的字典:
{"address": "0x20000304", "name": "x", "width": 32}
读取最近的值
live_memory_read(session_id="abc123", last_n=10)返回内存环形缓冲区(最多 100 条)中的最近条目。完整历史记录写入 JSONL 输出文件。
JSONL 输出格式
{ "t": 1709830123.456, "elapsed_s": 1.002, "values": { "blink": 65539 } }停止会话
live_memory_stop(session_id="abc123")返回统计信息:持续时间、读取次数、错误次数、输出文件路径。
约束
每个探针一个会话 — 这是硬件约束(单个 SWD 连接)
烧录前停止 —
live_memory持有 SWD 连接;如果会话处于活动状态,stm32_flash和stm32_read/write_memory将失败TCL 端口 6666 — OpenOCD 的默认端口。如果存在冲突,请先停止其他 OpenOCD 实例
串行默认值
波特率: 115200
行尾: LF(
\n)读取轮询: 50 毫秒字节间休眠,200 毫秒静默中断
缓冲区限制: 最大读取 4096 字节
开发
MCP 检查器
source .venv/bin/activate
mcp dev src/stm32_mcp/server.py回环测试
串行工具可以在没有硬件的情况下使用 pyserial 的回环进行测试:
import serial
ser = serial.serial_for_url("loop://", baudrate=115200, timeout=0.1)
ser.write(b"PING\n")
print(ser.read(100)) # b'PING\n'This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI tools like Claude Code and Codex CLI to read and write serial port data, facilitating embedded development workflows such as coding, flashing, and debugging.42MIT
- AlicenseAqualityDmaintenanceEnables AI assistants like Claude to directly debug microcontrollers via JLink, supporting breakpoints, single-step, memory/register access, variable inspection, RTT logging, and firmware flashing.255MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to interact with STM32 development boards via J-Link debugger using RTT communication, supporting connection, logging, memory operations, and firmware flashing through natural language.121MIT
- FlicenseNot gradedqualityFmaintenanceEnables Claude Code to interact with embedded hardware test benches via MTIB gRPC API, supporting device discovery, flashing, debugging, serial and Zephyr logs, power measurement, and more.
Related MCP Connectors
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Live SEO workflow tools for Claude Code, Codex, and AI agents.
Read, edit, publish, and preview your pepita websites from Claude.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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/shieldyguy/stm32-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server