stm32-mcp
stm32-mcp
MCP-сервер, который позволяет Claude Code собирать, прошивать и общаться с оборудованием STM32.
stm32-mcp довольно специфичен для моего подхода к разработке железа, но, вероятно, будет полезен и другим! Его можно адаптировать под множество рабочих процессов, но он сфокусирован именно на моём (stlink-v3 mini, VCP на этом разъёме, микроконтроллер STM32).
Вы можете делать такие вещи:
я: эй, кто сейчас подключён?
claude: два безымянных пробника подключены к двум безымянным платам
я: ок, спроси их, кто они, и дай им прозвища на основе их ответа
claude: понял, хотите также дать прозвища пробникам? ваши платы — «дверной звонок A» и «синтезатор B»
я: да, я пометил эти пробники краской. назови звонок «синим», а синт — «красным»
claude: готово. что дальше?
я: дай им обоим VCP-команды, чтобы они могли общаться друг с другом, а затем пусть дверной звонок пригласит синт на свидание
claude: думает... готово, синт отказался. в море полно рыбы, дверной звонок!
MCP (Model Context Protocol) — это открытый стандарт, который позволяет ИИ-ассистентам вроде Claude использовать внешние инструменты. Этот сервер даёт Claude возможность компилировать вашу прошивку, прошивать её на плату, общаться с ней по последовательному порту и читать память через SWD. Он гибкий и разговорный.
[!WARNING] Этот сервер даёт ИИ прямой доступ к вашему компилятору, отладочному пробнику и последовательным портам. Он может прошивать прошивку, перезаписывать память и отправлять произвольные данные на ваше оборудование. Это мощно и полезно, но это не песочница. Знайте, что подключено, прежде чем позволить ему действовать.
Предварительные требования
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"Прозвища пробников и прозвища плат разрешаются.
Сборки используют ту же блокировку рабочего пространства headless CubeIDE, что и MCP, поэтому stm32-build/stm32-bf, соревнующиеся с управляемой агентом сборкой, будут ожидать в очереди.
Доступные инструменты
Сборка и прошивка
Инструмент | Описание |
| Компиляция прошивки с помощью headless-сборщика CubeIDE |
| Прошивка .elf/.bin/.hex на плату через ST-Link SWD |
| Сборка + прошивка за один шаг (случай в 90% случаев) |
| Чтение информации ST-Link/MCU (ID устройства, размер флеша, напряжение) |
Управление несколькими платами
Инструмент | Описание |
| Показать все подключённые платы с прозвищами и ID MCU |
| Назвать плату (по UID MCU) или пробник (по SN ST-Link) |
Прозвища плат следуют за физическим MCU (сохраняются при замене пробников). Прозвища пробников следуют за оборудованием ST-Link. Используйте прозвища в любом параметре probe во всех инструментах.
Последовательная связь
Инструмент | Описание |
| Список последовательных портов (помечает порты ST-Link VCP прозвищами) |
| Открыть последовательное соединение |
| Отправить данные и прочитать ответ |
| Прочитать буферизованные последовательные данные |
| Закрыть последовательное соединение |
| Выполнить многошаговую последовательность отправки/задержки/памяти за один вызов |
Отладка и мониторинг
Инструмент | Описание |
| Чтение памяти по адресу или имени переменной (из символов ELF) |
| Запись памяти по адресу или имени переменной |
| Запуск непрерывного фонового мониторинга памяти через SWD |
| Чтение последних записей из сеанса live memory |
| Остановка сеанса live memory |
Аппаратные последовательности
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принимает SN ST-Link, прозвище пробника или прозвище платы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"— разрешаются из ELF черезarm-none-eabi-nmСловари с символом и типом:
{"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 Inspector
source .venv/bin/activate
mcp dev src/stm32_mcp/server.pyТестирование с замыканием
Последовательные инструменты можно тестировать без оборудования, используя loopback 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