Skip to main content
Glama
phryniszak

stm32-stlink-mcp

by phryniszak

stm32-stlink-mcp

MCP-сервер для отладки микроконтроллеров STM32 через ST-LINK, построенный на собственном наборе инструментов STMicroelectronics STM32CubeCLTST-LINK_gdbserver, STM32_Programmer_CLI и arm-none-eabi-gdb (управляется через GDB/MI2). Без участия OpenOCD, J-Link или probe-rs.

Архитектура

Сеанс отладки — это пара дочерних процессов, в точности повторяющая документированный рабочий процесс ST (UM2576, «STM32CubeIDE ST-LINK GDB server»):

 arm-none-eabi-gdb  --interpreter=mi2  --(TCP, target extended-remote)-->  ST-LINK_gdbserver  --(USB)-->  ST-LINK  --(SWD)-->  STM32

arm-none-eabi-gdb работает в режиме MI2, поэтому сервер получает пошаговое выполнение на уровне исходного кода, символьные точки останова и вычисление выражений с учётом символов без дополнительных усилий, вместо того чтобы самостоятельно реализовывать GDB Remote Serial Protocol. ST-LINK_gdbserver владеет USB-дескриптором программатора в течение всего времени жизни сеанса; прошивка через gdb-команду load (в MI — -target-download) прозрачно делегируется сервером инструменту STM32CubeProgrammer, поэтому для перепрошивки не требуется завершать сеанс. Автономная однократная прошивка (flash_standalone, сеанс не требуется) вызывает STM32_Programmer_CLI напрямую и поэтому конфликтует с уже открытым сеансом на том же программаторе — см. описание инструмента.

Related MCP server: dbgprobe-mcp-server

Настройка

npm install
npm run build

Требуется установленный STM32CubeCLT и доступные каталоги bin/ — либо уже в PATH (установщик CLT делает это по умолчанию), либо через STMCP_CUBECLT_PATH / переопределения для отдельных инструментов. Выполните npm run doctor для проверки.

Запуск

node dist/index.js serve     # starts the MCP server on stdio (default mode)
node dist/index.js doctor    # pre-flight check: tool resolution, connected probes, udev rules
node dist/index.js doctor --json

Регистрация в MCP-клиенте

{
  "mcpServers": {
    "stm32-stlink": {
      "command": "node",
      "args": ["<path-to-this-repo>/stmcp/dist/index.js"]
    }
  }
}

Конфигурация (переменные окружения)

Переменная

По умолчанию

Назначение

STMCP_GDBSERVER_PATH / STMCP_PROGRAMMER_CLI_PATH / STMCP_ARM_GDB_PATH

Переопределение пути к конкретному исполняемому файлу (наивысший приоритет)

STMCP_CUBECLT_PATH

Корневой каталог установки CubeCLT; вложенные пути определяются через STM32CubeCLT_metadata.sh -j

STMCP_STLINK_SERIAL

Серийный номер программатора по умолчанию (можно опустить для авто-выбора, если подключён ровно один)

STMCP_DEFAULT_DEVICE

STM32G431CBTx

Строка устройства микроконтроллера по умолчанию

STMCP_DEFAULT_INTERFACE

swd

swd или jtag

STMCP_DEFAULT_FREQUENCY_KHZ

4000

Тактовая частота SWD/JTAG

STMCP_MAX_SESSIONS

1

Максимум одновременных сеансов отладки

STMCP_GDBSERVER_READY_TIMEOUT_MS

8000

Сколько ждать сообщение «Waiting for debugger connection...»

STMCP_LOG_LEVEL

info

error | warn | info | debug

STMCP_LOG_FILE

Необязательный файл журнала (stderr используется всегда независимо от этого — stdout зарезервирован для сообщений MCP)

STMCP_ALLOW_FLASH_ERASE

false

Включает возможность стирания

STMCP_ALLOW_MEMORY_WRITE

true

Включает memory_write

STMCP_ALLOW_FLASH_ADDRESS_WRITE

false

Разрешает memory_write обращаться к окну адресов флеш-памяти (обычно заблокировано — используйте вместо этого инструменты для работы с флеш-памятью)

STMCP_ALLOWED_FILE_PATHS

(без ограничений)

Корневые каталоги из списка разрешённых (через запятую) для файловых аргументов ELF/bin

STMCP_MAX_FILE_SIZE_BYTES

16777216

Максимальный размер для файловых аргументов

STMCP_FLASH_RANGE_START / STMCP_FLASH_RANGE_END

0x08000000 / 0x08020000

Окно адресов флеш-памяти для защиты записи (по умолчанию: 128KB, STM32G431CB)

Инструменты

Область

Инструмент

Назначение

Программатор

list_probes

Список подключённых программаторов ST-LINK

Сеанс

debug_connect

Запускает gdbserver+gdb, загружает символы ELF, подключается

Сеанс

debug_disconnect

Корректное завершение сеанса

Сеанс

debug_session_status

Информация о сеансе (одном или всех)

Прошивка

flash_standalone

Однократная прошивка через STM32_Programmer_CLI, сеанс не требуется

Прошивка

flash_load_in_session

Перепрошивка через gdb load в открытом сеансе

Выполнение

debug_run

Возобновить/продолжить

Выполнение

debug_halt

Прервать

Выполнение

debug_reset

Сброс (monitor reset [halt])

Выполнение

debug_step

Шаг с обходом/входом/выходом

Точки останова

breakpoint_set / breakpoint_clear / breakpoint_list

По адресу вида файл:строка, символу или *addr

Память

memory_read / memory_write

Прямой доступ к памяти (запись защищена)

Регистры

register_read / register_write

Именованные регистры ядра

Регистры

read_fault_registers

Вывод регистров сбоя Cortex-M SCB одним вызовом (расшифровка CFSR/HFSR/...)

Выражения

evaluate_expression

Вычисление с учётом символов через gdb MI

Отложено до v2

Инструменты для регистров периферии SVD (memory_read/write + evaluate_expression уже обращаются ко всему по адресу), живой/потоковый опрос памяти, система плагинов, списки разрешённых областей памяти для каждого чипа, произвольный проброс команд gdb monitor, а также инструменты option-bytes/RDP (способные «окирпичить» устройство; намеренно вне области охвата).

RTT

RTT (SEGGER Real Time Transfer — живая трассировка консоли/переменных без остановки ядра) намеренно не реализован в этом сервере. У GDB/MI-заглушки ST-LINK_gdbserver нет режима non-stop, поэтому чтение памяти через сеанс debug_connect этого сервера требует сначала остановить ядро — что сводит на нет смысл RTT. Правильный механизм — прямой доступ к памяти AP, который никогда не останавливает ядро (подтверждено чтением исходного кода STM32CubeMonitor от ST, в котором используется именно это, а также опцией -r32fast из STM32_Programmer_CLI).

Именно это уже делает strtt, а strtt-mcp оборачивает его в собственный MCP-сервер (strtt_start/strtt_stop/strtt_status/strtt_read/strtt_write). Регистрируйте его рядом с этим сервером, а не через него:

{
  "mcpServers": {
    "stm32-stlink": { "command": "node", "args": ["<...>/mcp-server/dist/index.js"] },
    "strtt": {
      "command": "node",
      "args": ["<path-to-strtt-repo>/mcp/dist/index.js"],
      "env": { "STRTT_BIN": "<path-to-strtt-binary>" }
    }
  }
}

Запускайте strtt_start с параметром tcp: true, чтобы подключаться через общий ST-LINK Server, а не захватывать USB-устройство напрямую — это позволяет ему работать одновременно с открытым сеансом debug_connect здесь, поскольку GdbServerProcess всегда передаёт -t/--shared серверу ST-LINK_gdbserver. Без tcp: true strtt и открытый сеанс отладки будут конкурировать за один и тот же программатор.

Сценарий проверки на оборудовании

При подключённых ST-LINK и целевом устройстве:

node dist/index.js doctor                     # confirm probe + tools resolve
npx @modelcontextprotocol/inspector node dist/index.js   # interactive tool testing

Затем через инспектор или MCP-клиент:

  1. list_probes → появляется серийный номер программатора.

  2. debug_connect { elfPath, device, interface: "swd", serial } → возвращает sessionId.

  3. breakpoint_set { sessionId, location: "main" } → возвращает номер точки останова.

  4. debug_run { sessionId } → останавливается с reason: "breakpoint-hit".

  5. register_read { sessionId, registers: ["pc","sp","lr","r0"] }.

  6. evaluate_expression { sessionId, expression: "<a known global>" }.

  7. read_fault_registers { sessionId } → безобидные/нулевые флаги сразу после сброса.

  8. debug_disconnect { sessionId } → убедитесь, что не осталось осиротевших процессов: ps aux | grep -E 'ST-LINK_gdbserver|arm-none-eabi-gdb'.

  9. flash_standalone { file, reset: "hard", run: true } без открытого сеанса.

  10. Негативный тест: откройте сеанс, затем вызовите flash_standalone на том же серийном номере → ожидайте DEVICE_BUSY.

Примечание: debug_connect останавливает CPU целевого устройства. Не подключайтесь к плате, которая активно управляет исполнительными механизмами/выходами, в ситуации, когда незапланированная остановка может быть небезопасна, предварительно не убедившись, что это допустимо.

Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    A
    quality
    C
    maintenance
    Stateful MCP server for driving debug probes (J-Link) to flash, debug, and inspect embedded targets. Enables AI agents to perform flash, memory, breakpoint, and ELF/SVD-aware operations conversationally.
    41
    11
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for embedded debugging based on probe-rs, providing 22 tools for ARM Cortex-M and RISC-V microcontrollers, including connection, memory operations, breakpoints, flash programming, and RTT communication.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that provides comprehensive debugging capabilities for J-Link debuggers, enabling memory, flash, register, and RTT operations through AI assistants.
    32
    MIT

View all related MCP servers

Related MCP Connectors

  • MCP server for Klever blockchain smart contract development.

  • An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform

  • A MCP server built for developers enabling Git based project management with project and personal…

View all MCP Connectors

Latest Blog Posts

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/phryniszak/stmcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server