Skip to main content
Glama

stm32-mcp

Servidor MCP que permite a Claude Code compilar, flashear y comunicarse con hardware STM32.

stm32-mcp es bastante específico de cómo suelo abordar el desarrollo de hardware, ¡pero es probable que también sea útil para otros! Se podría adaptar para encajar en muchos flujos de trabajo, pero está centrado al máximo en el mío (stlink-v3 mini, VCP en ese conector, microcontrolador STM32).

Puedes hacer cosas como:

yo: oye, ¿quién está conectado ahora mismo?

claude: dos sondas sin nombre conectadas a dos PCB sin nombre

yo: vale, pregúntales quiénes son y ponles un apodo según su respuesta

claude: entendido, ¿quieres poner apodos también a las sondas? tus placas son 'timbre A' y 'sintetizador B'

yo: sí, les puse marcador de pintura a esas sondas. llama 'azul' a la del timbre y 'rojo' a la del sintetizador

claude: hecho. ¿qué sigue?

yo: dales a ambas comandos VCP para que puedan hablar entre sí, y luego haz que el timbre le pida una cita al sintetizador

claude: pensando... hecho, el sintetizador declinó. ¡hay más peces en el mar, timbre!

MCP (Model Context Protocol) es un estándar abierto que permite a asistentes de IA como Claude usar herramientas externas. Este servidor le da a Claude la capacidad de compilar tu firmware, flashearlo en una placa, hablar con ella por serie y leer memoria vía SWD. Es flexible y conversacional.

[!WARNING] Este servidor da a una IA acceso directo a tu compilador, sonda de depuración y puertos serie. Puede flashear firmware, sobrescribir memoria y enviar datos arbitrarios a tu hardware. Es potente y útil, pero no es un sandbox. Sabe qué está conectado antes de darle rienda suelta.

Requisitos previos

  • STM32CubeIDE instalado en /Applications/STM32CubeIDE.app (macOS) o /opt/st/stm32cubeide_* (Linux)

  • Python 3.10+

  • OpenOCD (brew install open-ocd) — para flasheo, lectura/escritura de memoria y monitorización en vivo

  • herramientas stlink de código abierto (brew install stlink) — para la enumeración de sondas

  • ST-Link conectado vía USB (para información de flasheo/placa)

  • Puerto serie disponible (VCP de ST-Link o adaptador USB-UART)

Related MCP server: jlink-mcp

Instalación

git clone https://github.com/shieldyguy/stm32-mcp.git
cd stm32-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

Registrar con Claude Code

Opción A: CLI

claude mcp add stm32 -- /path/to/stm32-mcp/.venv/bin/python -m stm32_mcp.server

Opción B: Configuración del proyecto

Añade a .claude/settings.json o .claude.json de tu proyecto:

{
  "mcpServers": {
    "stm32": {
      "command": "/path/to/stm32-mcp/.venv/bin/python",
      "args": ["-m", "stm32_mcp.server"]
    }
  }
}

CLI de autoservicio

bin/ contiene cuatro envoltorios finos sobre el mismo código que usan las herramientas MCP

Command

Usage

stm32-list

Lista las sondas y placas conectadas con sus apodos

stm32-flash

stm32-flash <probe|board> <file.elf> [--noverify] [--noreset]

stm32-build

stm32-build <project_path> [Debug|Release] [--clean]

stm32-bf

stm32-bf <project_path> <probe|board> [Debug|Release] [--clean]

stm32-help

Lista estos comandos con su uso (generado automáticamente desde los scripts)

Añade bin/ a tu PATH:

export PATH="/path/to/stm32-mcp/bin:$PATH"

Los apodos de sondas y de placas se resuelven.

Las compilaciones comparten el bloqueo del espacio de trabajo headless de CubeIDE del MCP, por lo que un stm32-build/stm32-bf que compita con una compilación impulsada por un agente se pondrá en cola detrás de ella.

Herramientas disponibles

Compilar y flashear

Tool

Description

stm32_build

Compila firmware con el compilador headless de CubeIDE

stm32_flash

Flashea .elf/.bin/.hex a la placa vía ST-Link SWD

stm32_build_and_flash

Compilar + flashear en un solo paso (el caso del 90%)

stm32_board_info

Lee información de ST-Link/MCU (ID de dispositivo, tamaño de flash, voltaje)

Gestión de múltiples placas

Tool

Description

stm32_list_probes

Muestra todas las placas conectadas con apodos e IDs de MCU

stm32_set_nickname

Pon nombre a una placa (por UID de MCU) o a una sonda (por SN de ST-Link)

Los apodos de placa siguen al MCU físico (persisten al cambiar de sonda). Los apodos de sonda siguen al hardware ST-Link. Usa apodos en cualquier parámetro probe de todas las herramientas.

Comunicación serie

Tool

Description

serial_list_ports

Lista los puertos serie (marca los puertos VCP de ST-Link con apodos)

serial_connect

Abre una conexión serie

serial_send

Envía datos y lee la respuesta

serial_read

Lee datos serie almacenados en búfer

serial_disconnect

Cierra una conexión serie

serial_sequence

Ejecuta secuencias de varios pasos de envío/retardo/memoria en una sola llamada

Depuración y monitorización

Tool

Description

stm32_read_memory

Lee memoria por dirección o nombre de variable (de los símbolos ELF)

stm32_write_memory

Escribe memoria por dirección o nombre de variable

live_memory_start

Inicia la monitorización continua de memoria en segundo plano vía SWD

live_memory_read

Lee las entradas recientes de una sesión de memoria en vivo

live_memory_stop

Detiene una sesión de memoria en vivo

Secuencias de hardware

serial_sequence programa varios pasos (envío serie, retardo, captura de webcam y lectura/escritura de memoria SWD) en una sola llamada de herramienta. Los retardos usan un time.sleep() en el hilo ejecutor. Claude no puede cronometrar de forma fiable llamadas individuales a herramientas, por lo que esto permite un control preciso del tiempo de los comandos y las expectativas.

Tipos de paso

[
  { "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"
  }
]
  • Paso de envío: {send, to, expect?, read_timeout?, line_ending?}to es la ruta del puerto de serial_connect

  • Paso de retardo: {delay_ms}time.sleep() real, no idas y vueltas de llamadas a herramientas

  • Paso de captura: {capture: true, label?, device_index?} — PNG guardado en /tmp/stm32-captures/

  • Paso de escritura de memoria: {mem_write: true, address | symbol + elf_path, value, probe, width?}

  • Paso de lectura de memoria: {mem_read: true, address | symbol + elf_path, probe, count?, width?, label?}

Notas sobre los pasos de memoria:

  • probe acepta SN de ST-Link, apodo de sonda o apodo de placa

  • address es hexadecimal (p. ej. "0x48000418"); alternativamente usa symbol + elf_path para resolver por nombre

  • width es de 8/16/32 bits, por defecto 32 (se detecta automáticamente a partir del tamaño del símbolo cuando se usa symbol)

  • Cada operación de memoria lanza actualmente un proceso OpenOCD nuevo (sobrecarga de ~decenas de ms por operación), por lo que el tiempo entre operaciones de memoria por debajo de ~50ms es aproximado. Los retardos en sí son precisos.

Parámetros

  • on_failure: "continue" (por defecto) ejecuta todos los pasos sin importar nada. "stop" aborta ante el primer fallo.

  • filter_responses: Cuando es true, los patrones de expect solo coinciden con líneas de respuesta VCP prefijadas con > (ignora el ruido de depuración).

Salida

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

Monitorización de memoria en vivo

Monitorea variables de firmware en tiempo real vía SWD, sin modificar el firmware ni usar serie. OpenOCD se ejecuta como un subproceso persistente y consulta las variables a través de su socket TCL integrado.

Iniciar una sesión

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
)

Las variables pueden ser:

  • Nombres de símbolo (cadenas): "blink" — resueltos desde el ELF mediante arm-none-eabi-nm

  • Diccionarios con símbolo + tipo: {"symbol": "temperature", "type": "float"} — interpreta el valor de 32 bits como IEEE 754

  • Diccionarios con dirección cruda: {"address": "0x20000304", "name": "x", "width": 32}

Leer valores recientes

live_memory_read(session_id="abc123", last_n=10)

Devuelve las entradas recientes de un búfer circular en memoria (máximo 100 entradas). El historial completo se escribe en el archivo de salida JSONL.

Formato de salida JSONL

{ "t": 1709830123.456, "elapsed_s": 1.002, "values": { "blink": 65539 } }

Detener una sesión

live_memory_stop(session_id="abc123")

Devuelve estadísticas: duración, número de lecturas, número de errores, ruta del archivo de salida.

Restricciones

  • Una sesión por sonda — esto es una restricción de hardware (una única conexión SWD)

  • Detener antes de flashearlive_memory mantiene la conexión SWD; stm32_flash y stm32_read/write_memory fallarán si hay una sesión activa

  • Puerto TCL 6666 — el predeterminado de OpenOCD. Detén antes otras instancias de OpenOCD si hay un conflicto

Valores predeterminados de serie

  • Velocidad en baudios: 115200

  • Fin de línea: LF (\n)

  • Sondeo de lectura: 50ms de espera entre bytes, corte tras 200ms de silencio

  • Límites de búfer: 4096 bytes máximos de lectura

Desarrollo

MCP Inspector

source .venv/bin/activate
mcp dev src/stm32_mcp/server.py

Pruebas de loopback

Las herramientas serie se pueden probar sin hardware usando el loopback de 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'
A
license - permissive license
Not graded
quality - not tested
D
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
    Not graded
    quality
    D
    maintenance
    Enables 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.
    42
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants like Claude to directly debug microcontrollers via JLink, supporting breakpoints, single-step, memory/register access, variable inspection, RTT logging, and firmware flashing.
    25
    5
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    12
    1
    MIT

View all related MCP servers

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.

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/shieldyguy/stm32-mcp'

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