Skip to main content
Glama

stm32-mcp

Claude Code가 STM32 하드웨어를 빌드, 플래시, 통신할 수 있게 해주는 MCP 서버입니다.

stm32-mcp는 제가 하드웨어 개발에 접근하는 방식에 상당히 특화되어 있지만, 다른 사람들에게도 유용할 가능성이 높습니다! 다양한 워크플로우에 맞게 조정할 수 있지만, 이 프로젝트는 제 환경(stlink-v3 mini, 해당 헤더의 VCP, STM32 마이크로컨트롤러)에 초점을 맞추고 있습니다.

다음과 같은 작업을 할 수 있습니다:

나: 지금 누가 연결되어 있어?

claude: 이름 없는 프로브 두 개가 이름 없는 PCB 두 개에 연결되어 있습니다

나: 좋아, 그들에게 누구인지 물어보고 응답에 따라 별명을 지어줘

claude: 알겠습니다, 프로브에도 별명을 지어드릴까요? 보드는 '초인종 A'와 '신디사이저 B'입니다

나: 응, 그 프로브들에 페인트 마커로 표시해뒀어. 초인종 건 '파란색', 신디사이저 건 '빨간색'이라고 불러줘

claude: 완료했습니다. 다음은 무엇인가요?

나: 둘 다 서로 통신할 수 있게 VCP 명령을 주고, 초인종이 신디사이저에게 데이트를 신청하게 해줘

claude: 생각 중... 완료했습니다, 신디사이저가 거절했습니다. 바다에는 물고기가 많으니까요, 초인종!

MCP (Model Context Protocol)는 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 도구가 사용하는 것과 동일한 코드에 대한 4개의 얇은 래퍼가 포함되어 있습니다

명령어

사용법

stm32-list

별명이 있는 연결된 프로브 + 보드 나열

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

이 명령어들을 사용법과 함께 나열 (스크립트에서 자동 생성)

bin/을 PATH에 추가:

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

프로브 별명과 보드 별명이 해석됩니다.

빌드는 MCP의 헤드리스 CubeIDE 워크스페이스 잠금을 공유하므로, 에이전트 주도 빌드와 경쟁하는 stm32-build/stm32-bf는 그 뒤에서 대기합니다.

사용 가능한 도구

빌드 및 플래시

도구

설명

stm32_build

CubeIDE 헤드리스 빌더를 사용하여 펌웨어 컴파일

stm32_flash

ST-Link SWD를 통해 .elf/.bin/.hex를 보드에 플래시

stm32_build_and_flash

빌드 + 플래시를 한 번에 (90%의 경우)

stm32_board_info

ST-Link/MCU 정보 읽기 (디바이스 ID, 플래시 크기, 전압)

다중 보드 관리

도구

설명

stm32_list_probes

별명과 MCU ID가 있는 모든 연결된 보드 표시

stm32_set_nickname

보드(MCU UID 기준) 또는 프로브(ST-Link SN 기준) 이름 지정

보드 별명은 물리적 MCU를 따릅니다(프로브 교체에도 유지됨). 프로브 별명은 ST-Link 하드웨어를 따릅니다. 모든 도구의 probe 매개변수에 별명을 사용할 수 있습니다.

시리얼 통신

도구

설명

serial_list_ports

시리얼 포트 나열 (ST-Link VCP 포트에 별명 표시)

serial_connect

시리얼 연결 열기

serial_send

데이터 전송 및 응답 읽기

serial_read

버퍼링된 시리얼 데이터 읽기

serial_disconnect

시리얼 연결 닫기

serial_sequence

한 번의 호출로 다단계 전송/지연/메모리 시퀀스 실행

디버그 및 모니터링

도구

설명

stm32_read_memory

주소 또는 변수 이름으로 메모리 읽기 (ELF 심볼에서)

stm32_write_memory

주소 또는 변수 이름으로 메모리 쓰기

live_memory_start

SWD를 통한 연속 백그라운드 메모리 모니터링 시작

live_memory_read

라이브 메모리 세션에서 최근 항목 읽기

live_memory_stop

라이브 메모리 세션 중지

하드웨어 시퀀스

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?}toserial_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는 16진수(예: "0x48000418"); 또는 symbol + elf_path를 사용하여 이름으로 해석

  • width는 8/16/32비트, 기본값은 32 (symbol 사용 시 심볼 크기에서 자동 감지)

  • 각 메모리 작업은 현재 새 OpenOCD 프로세스를 시작하므로(작업당 수십 ms 오버헤드), 메모리 작업 간 타이밍이 ~50ms 미만이면 근사치입니다. 지연 자체는 정확합니다.

매개변수

  • 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_flashstm32_read/write_memory는 실패합니다

  • TCL 포트 6666 — OpenOCD의 기본값입니다. 충돌이 있으면 다른 OpenOCD 인스턴스를 먼저 중지하세요

시리얼 기본값

  • 전송 속도: 115200

  • 줄 끝: LF (\n)

  • 읽기 폴링: 50ms 바이트 간 대기, 200ms 무음 중단

  • 버퍼 제한: 최대 4096바이트 읽기

개발

MCP Inspector

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'
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