Skip to main content
Glama

STM32 Flashing & Hardware Control MCP Server (stmctl-mcp)

A production-grade Model Context Protocol (MCP) server wrapping STM32CubeCLT (STM32_Programmer_CLI.exe). This MCP server enables any AI coding assistant or agent framework (Antigravity, Claude Desktop, Cursor, custom Node.js/Python agents) to perform hardware flashing, memory dumps, option byte modification, chip erase, board resets, and live SWO printf log tracing.


Hardware & Software Requirements

1. Host Computer Requirements

  • Node.js: v18.0.0 or higher

  • Operating System: Windows 10 / 11, Linux, or macOS

2. Platform Installation Scripts (scripts/)

Automated installer & environment setup scripts are provided in the scripts/ folder:

  • Windows: scripts/install_win.bat

  • Linux: scripts/install_linux.sh (Includes ST-LINK USB udev permission rules setup)

  • macOS: scripts/install_mac.sh (Includes Homebrew stlink fallback check)


Related MCP server: stm32-mcp

Flexible Path Configuration & Dynamic Resolution Hierarchy

To accommodate different computers, OS environments, and version numbers (e.g., STM32CubeCLT_1.17.0, 1.22.0, 2.0.0), stmctl-mcp resolves STM32_Programmer_CLI.exe using the following priority sequence:

Priority 1: Local Configuration File (stmctl_config.json)

You can manually specify any custom path in stmctl_config.json in the server root directory:

{
  "cli_path": "C:\\MyCustomPath\\STM32_Programmer_CLI.exe",
  "default_port": "SWD",
  "default_mode": "HOTPLUG"
}

Priority 2: Environment Variable

Set STM32_PROGRAMMER_CLI_PATH in your environment or MCP launcher configuration:

STM32_PROGRAMMER_CLI_PATH=C:\ST\STM32CubeCLT_1.22.0\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe

Priority 3: Automatic Dynamic Version Scanning (C:\ST\STM32CubeCLT_*)

If no manual path is specified, stmctl-mcp automatically scans C:\ST\ for any installed version number (sorting highest version first) to locate: C:\ST\STM32CubeCLT_<version>\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe

Priority 4: Standard Program Files Directories

Scans standard Program Files, Program Files (x86), /usr/local/STMicroelectronics/..., /opt/st/..., and /Applications/... directories.

Priority 5: System PATH Fallback

Tries executing STM32_Programmer_CLI directly from system environment PATH.


Capabilities & Tools Exposed

  1. stm32_list_probes: Discover connected ST-LINK, J-Link, UART COM ports, USB devices.

  2. stm32_connect_info: Query chip ID, Flash/RAM size, revision ID, CPU core.

  3. stm32_flash_firmware: Program .bin, .hex, .elf, .srec files with automatic erase, verification, reset, and run flags.

  4. stm32_erase_memory: Perform full chip mass erase or sector/page erase.

  5. stm32_read_memory: Read raw memory addresses or dump to .bin/.hex files.

  6. stm32_write_memory: Write bytes/words to specific memory addresses or peripheral registers.

  7. stm32_read_option_bytes: Read RDP protection level, BOR level, Watchdog, and Boot flags.

  8. stm32_write_option_bytes: Modify Option Bytes (e.g. RDP=0xAA, nBOOT0=1).

  9. stm32_reset_mcu: Hardware (HWrst), Software (SWrst), or Core (Crst) reset.

  10. stm32_run_mcu: Start or resume program execution at specified address.

  11. stm32_start_swv_trace: Stream/capture live SWO Serial Wire Viewer printf logs.

  12. stm32_raw_cli: Direct passthrough for any custom STM32_Programmer_CLI flags.


Installation & Build

1. Install Dependencies

npm install

2. Build TypeScript Source

npm run build

This compiles TypeScript files into ./dist/index.js.


How to Integrate stmctl-mcp into Any Agent

Method 1: Desktop IDEs & Apps (Antigravity, Claude Desktop, Cursor, VS Code)

Add the JSON configuration block below to your application's MCP settings file (e.g., claude_desktop_config.json or .vscode/mcp.json):

{
  "mcpServers": {
    "stmctl-mcp": {
      "command": "node",
      "args": [
        "c:/Users/kunur/OneDrive/Documents/Smarttrak/Firmware_Agent/STMCTL_MCP/dist/index.js"
      ]
    }
  }
}

Method 2: Custom Node.js / TypeScript Agent

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

async function main() {
  const transport = new StdioClientTransport({
    command: "node",
    args: ["c:/Users/kunur/OneDrive/Documents/Smarttrak/Firmware_Agent/STMCTL_MCP/dist/index.js"],
  });

  const client = new Client({ name: "firmware-agent-host", version: "1.0.0" }, { capabilities: {} });
  await client.connect(transport);

  const probeResult = await client.callTool({
    name: "stm32_list_probes",
    arguments: {},
  });
  console.log("Probes Result:", probeResult.content[0].text);
}

main().catch(console.error);

Method 3: Custom Python Agent (LangChain / LlamaIndex / CrewAI / AutoGen)

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def run_firmware_agent():
    server_params = StdioServerParameters(
        command="node",
        args=["c:/Users/kunur/OneDrive/Documents/Smarttrak/Firmware_Agent/STMCTL_MCP/dist/index.js"],
    )

    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool("stm32_list_probes", arguments={})
            print("Probe Result:", result.content[0].text)

asyncio.run(run_firmware_agent())

Method 4: Interactive Web Browser Debugging (MCP Inspector)

npm run inspector

This opens the MCP Inspector UI at http://localhost:5173.

Available Tools

12 tools
stm32_connect_infoA

Connect to target STM32 MCU and retrieve Chip ID, Flash size, Revision ID, and CPU Core details.

Inputs: sn, freq, mode, port, +1 more.

stm32_erase_memoryB

Perform Flash memory erase operation (Full Chip Mass Erase or Sector/Page Erase).

Inputs: sn, port, sectors, erase_type.

stm32_flash_firmwareA

Flash/program firmware file (.bin, .hex, .elf, .srec) to target STM32 MCU with optional verification, mass erase, reset, and run.

Inputs: file_path (required), sn, port, verify, +3 more.

stm32_list_probesA

List all connected ST-LINK debug probes, J-Link programmers, USB bootloaders, and COM serial ports.

Inputs: interface_type.

stm32_raw_cliA

Run raw parameters directly against STM32_Programmer_CLI for advanced/custom operations.

Inputs: args (required).

stm32_read_memoryA

Read target MCU memory or register contents and return hex dump or output to binary file.

Inputs: size (required), address (required), port, output_file.

stm32_read_option_bytesA

Read target MCU Option Bytes configuration (RDP protection level, BOR, Watchdog, Boot flags).

Inputs: sn, port.

stm32_reset_mcuB

Trigger reset signal on target MCU.

Inputs: port, reset_type.

stm32_run_mcuB

Start or resume program execution at specified address or entry point.

Inputs: port, address.

stm32_start_swv_traceA

Connect to Serial Wire Viewer (SWO/ITM) and stream printf log outputs.

Inputs: log_file, port_number, clock_freq_mhz.

stm32_write_memoryB

Write value or file payload directly to memory address or peripheral register.

Inputs: address (required), data_or_file (required), port.

stm32_write_option_bytesA

Modify target MCU Option Bytes (e.g. set RDP=0xAA to remove read protection, set nBOOT0, etc.).

Inputs: option_bytes (required), port.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 12 tools

    Disambiguation5/5

    Each tool targets a distinct STM32 operation (probing, firmware flashing, memory access, option bytes, reset/run, tracing). Potential overlaps like read_memory vs read_option_bytes are clearly separated by the resource type they act on.

    Naming Consistency5/5

    All tools share the stm32_ prefix and use snake_case with a clear verb_noun structure (list_probes, flash_firmware, read_memory, write_option_bytes). Even the specialized stm32_raw_cli follows the same pattern and is easily recognizable.

    Tool Count5/5

    12 tools provide a well-scoped surface for STM32 programming and debugging, covering the full workflow without redundancy or bloat. The count is ideal for this domain.

    Completeness5/5

    The set covers the complete lifecycle: discovery, connection, flashing, memory and option byte read/write, erasing, reset, run, and tracing. Advanced needs are handled via raw_cli, ensuring no obvious dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      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
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude Code to build, flash, and communicate with STM32 hardware over SWD and serial, including multi-board management, live memory monitoring, and hardware sequences.
      25
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI coding assistants to perform complete headless STM32 embedded firmware development, including project creation, pin configuration, code generation, building, and flashing, by driving the official STM32 command-line toolchain.
      2
      9
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      This server enables AI agents to fully control STM32CubeIDE and STMicroelectronics hardware, including GUI automation, headless builds, flashing, GDB debugging, option bytes, serial telemetry, and CubeMX .ioc engineering.
      34
      2
      Apache 2.0