Skip to main content
Glama
ZMC1011

Keil5 MCP Server

by ZMC1011

Keil5 MCP Server

Python License: MIT MCP PyPI PRs Welcome

English | 中文

Ein Model Context Protocol (MCP)‑Server, der DeepSeek Harness einen Edit Code → flashen → debuggen → Feedback lesen → Code korrigieren‑Kreislauf für die STM32‑Entwicklung mit Keil MDK bietet.

Anstatt manuell zwischen IDE, Programmer und Terminal zu wechseln, kann ein Agent:

  1. Ein Keil-Projekt bauen und den Echtzeit-Compile-Fortschritt beobachten.

  2. Strukturierte Fehler aus UV4-Logs erhalten (Datei / Zeile / Spalte / Code / Meldung).

  3. Fehlercodes mit Ursachen und Lösungsvorschlägen erklären.

  4. Quelldateien sicher bearbeiten (jede Änderung wird automatisch gesichert).

  5. Firmware über den offiziellen UV4-Kanal oder per pyOCD flashen.

  6. Hardware-Debugging durchführen: Breakpoints, Einzelschrittverfahren, Register, Speicher, RTT-Logs.

  7. Den offiziellen Keil-Debug-Kanal ausführen (UV4 -d + .ini-Skripte).


Inhaltsverzeichnis


Related MCP server: stm32-mcp

Funktionen

  • 27 MCP-Tools, registriert als mcp__<serverName>__<tool> (z. B. mcp__keil__build_project)

  • Echtzeit-Build-Fortschritt: monitor der letzten Log-Einträge mit Prozent / aktueller Datei / Phase, begrenzt auf 95 %, bis das Linken abgeschlossen ist

  • Strukturierte UV4-Log-Analyse: Compiler-Fehler (main.c(25:1): error C2065: ...), Linker-Fehser (L6218E), Programmgröße, Build-Zeit

  • Fehlercode-Wissensbasis: eingebaute Erläuterungen und Lösungen für gängige armcc/armclang-Codes (C2065, L6218E, L6406E, ...)

  • Sichere Quellcode-Bearbeitung: automatische .keil-mcp-backups/ vor jeder Änderung, Zeilenbereich ersetzen, Regex-Suche

  • Offizieller Flash-Pfad: UV4 -f verwendet die Flash-Algorithmen des Projekts; pyOCD kann direkt .axf übernehmen

  • Hardware-Debugging: pyOCD-Steuerung (Connect / Halt / Resume / Step / Breakpoint / Register / Memory / RTT)

  • Probe-Leasing: Exklusivzugriff pro Probe (asyncio-Lock + Datei-Lock), damit UV4 und pyOCD nicht den Debug-Port streiten

  • Ausführungsgrenze: Lese-werkzeuge-Cursor laufen parallel; mutierende Tools werden per Session-Lock serialisiert; durch asyncio.shield abbruchsicher

  • Ohne Keun funktioniert: keil_doctor meldet fehlende Komponenten klar; der Server startet trotzdem

Voraussetzungen

Komponente

Version / Hinweise

Python

3.10+ (getestet mit 3.12)

Keil MDK

UV4.exe (Build -b, Flash -f, Debug -) — optional, aber erforderlich für Build-/Flash-Tools

pyOCD

wird automatisch über pip installiert; benötigt einen Probe-Treiber (ST-Link / J-Link / CMSIS-DAP)

Probe

ST-Link V2/V3, J-Link, CMSIS-DAP, Keil ULINKplus

Target-Pack

z. B. pyocd pack install stm32f103c8 oder Keil-DFP ersetzen

Installation

Von PyPI

python -m venv .venv
.venv/Scripts/activate        # Windows
# source .venv/bin/activate   # Linux / macOS
pip install keil-mcp-server

Das Paket ist PyPI-fertig (pyproject.toml + LICENSE + server.json enthalten). Falls es noch nicht veröffentlicht ist, verwenden Sie die Installationsanleitung unten aus dem Quellcode.

Aus dem Quellcode (GitHub)

git clone https://github.com/ZMC1011/dsh-keil-mcp.git
cd ds-keil-mcp
python -m venv .venv
.venv/Scripts/activate                       # Windows
# source .venv/bin/activate                  # Linux / macOS
pip install -e ".[dev]"

Installation prüfen

# Environment self-check (UV4.exe, pyocd, connected probes)
python -m keil_mcp_server --check

# List all registered tools
python -m keil_mcp_server --tools

# Run the unit tests
pytest tests -q

Schnellstart

# 1. Start the MCP server (stdio transport — the MCP client will spawn this)
python -m keil_mcp_server

# 2. In your MCP client, call e.g.:
#    keil_doctor
#    discover_keil_projects { directory: "D:/STM32Projects" }
#    configure_keil_project { project: "D:/STM32Projects/app/app.uvprojx" }
#    build_project { project: "...", target: "Target 1", stream_progress: true }
#    flash_firmware { project: "...", confirm: true }

MCP-Client-Konfiguration

DeepSeek Harness (DSH)

Gemäß offizieller DSH-MCP-Dokumentation: eine Plugin-Instanz = ein MCP-Server, verbunden über das offizielle Brücken-Plugin @deepseek-ai/dsh-mcp-client. Fügen Sie dies zur cordis.patch.yml (oder cordis.yml) Ihres Profils hinzu:

- insert:
    - id: mcp-keil
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: keil                 # tools appear as mcp__keil__build_project etc.
        transport: stdio
        command: D:/000_Environment/mcp-servers/ds-keil-mcp/.venv/Scripts/python.exe
        args: ['-m', 'keil_mcp_server']
        env:
          KEIL_UV4_PATH: D:/002_software/Keil5/UV4/UV4.exe
          KEIL_PROJECT_DIR: D:/STM32Projects
        # optional: toolCallTimeoutMs: 60000, failOnStartupError: false

Verifizieren mit:

dsh web --dump-config | grep -A3 mcp
# or check session logs for mcp__keil__* calls

Hinweis: serverName muss der Bedingung [A-Za-z0-9_-]{1,32} entsprechen und unter den laufenden Instanzen eindeutig sein.

Claude Desktop / andere stdio-MCP-Clients

Die meisten MCP-Clients verwenden die mcpServers-JSON-Konvention:

{
  "mcpServers": {
    "keil": {
      "command": "D:/000_Environment/mcp-servers/ds-keil-mcp/.venv/Scripts/python.exe",
      "args": ["-m", "keil_mcp_server"],
      "env": {
        "KEIL_UV4_PATH": "D:/002_software/Keil5/UV4/UV4.exe",
        "KEIL_PROJECT_DIR": "D:/STM32Projects"
      }
    }
  }
}

Für einen Quellcode-Checkout ohne venv funktioniert auch uv:

{
  "mcpServers": {
    "keil": {
      "command": "uv",
      "args": ["--directory", "D:/path/to/ds-keil-mcp", "run", "keil_mcp_server"]
    }
  }
}

Werkzeuge

Alle 27 Tools liefern strukturiertes JSON. Destruktive Operationen (flash / erase) erfordern confirm=True.

Build & Fehler

Tool

Beschreibung

Wichtige Parameter → Ergebnis

build_project

Mit UV4 -b kompilieren (oder -r Rebuild / -c Clean), Echtzeit-Fortschritt

project, target?, timeout_seconds?, stream_progress?, clean?, rebuild?{success, returncode, build_log, errors[], summary, progress?}

build_progress_status

In Betrieb den Build-Fortschritt abrufen

build_id{status, percent, current_file, phase}

build_cancel

Abbruch des Builds anfordern

build_id{success}

parse_build_errors

UV4-Log in strukturierte Fehler zerlegen

log_path? oder log_content?{(errors[], warnings[], summary}

explain_build_error

Fehlercode → Erläuterung + zugehörige Ursachen + Lösungen

error_code, message?, file?, line?{Erklärung, häufige_Ursachen[], vorgeschlagene_Lösungen[]}

Quellcode-Bearbeitung

Tool

Beschreibung

Wichtige Parameter → Ergebnis

source_read

Quelldatei mit Zeilennummern lesen

file, start_line?, end_line?{content, total_lines, ...}

source_edit

Zeilenbereich ersetzen; vorher automatische Zahlung

file, start_line, end_line, new_content{success, lines_changed, backup_path}

source_search

Quelldateien durchsuchen (Text oder Regex)

pattern, path?, files?, regex?{matches[]}

Offizieller Debug-Kanal

Tool

Beschreibung

Wichtige Parameter → Ergebnis

uv4_debug_session

UV4 -d + generiertes .ini-Debug-Skript (headless Breakpoint/Go/Step)

project, target?, ini_path?, breakpoint?, dump_vars?, timeout_seconds?{success, returncode, output}

uv4_debug_dde

Sitzungsausgabe per ID abrufen

session_id{output}

Projekt & Umgebung

Tool

Beschreibung

Wichtige Parameter → Ergebnis

keil_doctor

Umgebungsprüfung: UV4.exe, pyocd, Packs, verbundene Debug-Probes

— → {uv4_exists, pyocd_installed, probes[], status}

discover_keil_projects

Findet *.uvprojx in einem Verzeichnis

directory?, recursive?{projects[]}

configure_keil_project

Projekt Tun: Ziel, Gerät, Pack, Gruppen, Quelldateien

project, target?{targets[], device, probe_id?, source_files[]}

Flash

Tool

Beschreibung

Wichtige Parameter → Ergebnis

flash_firmware

Firmware über UV4 -f (bevorzugt) oder pyOCD nahmd

project?, image?, backend?, probe_id?, confirm{success, log}

erase_flash

Chip-Flash löschen (pyOCD erase -c)

confirm, probe_id?, chip?{success, output}

verify_flash

Chip gegen Image verifizieren (pyOCD verify)

image, probe_id?{success, output}

Probe-Debugging

Tool

Beschreibung

probe_connect / probe_disconnect

Verbindet bzw. gibt eine pyOCD-Probe frei (disconnect gibt den Port für UV4 -f frei)

probe_halt / probe_resume / probe_step

Kernsteuerung

set_breakpoint / continue_target

Breakpoint nach Symbol oder Adresse, dann fortfahren

probe_read_registers

Lesen von r0-r15, sp, lr, pc, xpsr

probe_read_memory

Speicherstellen an einer Adresse lesen (Hex-Byte)

read_rtt_log

SEGGER-RTT-Ausgabe lesen (falls verfügbar)

Architektur

┌──────────────────────────────────────────────────────────────┐
│  MCP Client (DeepSeek Harness / Claude Desktop / ...)        │
│  → tools registered as mcp__keil__*                          │
└──────────────────────────────┬───────────────────────────────┘
                               │ stdio (JSON-RPC 2.0)
┌──────────────────────────────▼───────────────────────────────┐
│  keil-mcp-server (Python, FastMCP)                           │
│                                                              │
│  server.py   — tool registration + Execution Boundary        │
│                (read-only whitelist → concurrent;            │
│                 mutating tools → session lock +              │
│                 asyncio.to_thread + asyncio.shield)          │
│                                                              │
│  tools/      — MCP tool layer (27 tools)                     │
│                                                              │
│  core/       — deliverable layer                             │
│    uv4_runner.py      UV4 -b/-r/-c/-f/-d process runner      │
│    build_progress.py  realtime log tail monitor              │
│    error_parser.py    UV4 log → structured errors + KB       │
│    source_editor.py   read/edit/search + auto-backup         │
│    uv4_debug.py       UV4 -d + .ini script engine            │
│    probe_lease.py     per-probe exclusive lease              │
│    project_utils.py   .uvprojx parser (namespace-tolerant)   │
│                                                              │
│  models.py / config.py / config.yaml                         │
└───────────────┬──────────────────────────────┬───────────────┘
                │                              │
      ┌─────────▼─────────┐          ┌─────────▼─────────┐
      │ Keil MDK (UV4.exe)│          │ pyOCD + probe     │
      │ build/flash/debug │          │ ST-Link/J-Link/   │
      │                   │          │ CMSIS-DAP → chip  │
      └───────────────────┘          └───────────────────┘

Abhängigkeitsrichtung: MCP-Schicht → Werkzeuge → Kern → Keil MDK / pyOCD → Ziel-Chip.

Wichtige Design-Eckpunkte:

  • Ausführungsebene (inspiriert von McuBuddy): Nur-Lese-Werkzeuge laufen ohne voneinender; a lles andere wrd pro Sitzung über ein asyncio.Lock serialisiert, in einem Worker-Thread (asyncio.to_thread) ausgeführt und ist gegen das Bruch geschützt (asyncio.shield).

  • Probe-Lease: UV4 - and pyOCD können sich den Debug-Port nicht teilen. ProbeLease (asyncio.Lock + filelock) serialisiert den Zugriff; der Flash-Ablauf trennt pyOCD, bevor UVå berimmt.

  • Echtzeit-Fortschritt: Ein Daemon-Thread verfolgt das UV4-Log und zält compiling-zeilen gegen die aus .uvprox geparste Anzahl der Quelldateien (bis zur Markierungen Build Time Elapsed auf 90 gedeckelt).

  • Toleranz bei fehlerhaften XML: Ältere Keil-Projekte enthalten nicht zueinander passende Tags (z. B. <b498tele498>...</bUseTDR>); der Projeckt-Parser repariert sie vor dem Parsen.

Konfiguration

config.yaml (mitgeliefert) + Übesschreibungen durch Umgebungsvariablen:

keil:
  uv4_path: "C:/Keil_v5/UV4/UV4.exe"        # or env KEIL_UV4_PATH
  default_project_dir: ""                   # or env KEIL_PROJECT_DIR
build:
  build_timeout: 300
  stream_progress: true
  tail_flush_wait: 3        # seconds to wait for UV4 log tail flush after exit
error:
  max_errors: 200
source:
  backup_dir: ".keil-mcp-backups"
probe_lease:
  lock_dir: ".keil-mcp-locks"
server:
  transport: "stdio"
  log_level: "INFO"

End-to-End-Orkflow-eispiel typische Agent-Sitzung (Tool-Namens werden mit dem DSH-Präfix mcp__keil__ angezeigt):

1. mcp__keil__keil_doctor                       # environment + probe OK?
2. mcp__keil__discover_keil_projects            # find .uvprojx files
3. mcp__keil__configure_keil_project            # parse targets/device/sources
4. mcp__keil__build_project (stream_progress)   # compile; on failure:
5. mcp__keil__parse_build_errors                # structured errors[]
6. mcp__keil__explain_build_error               # causes + fixes
7. mcp__keil__source_edit                       # fix code (auto-backup)
   → back to 4 until 0 errors
8. mcp__keil__flash_firmware (confirm=true)     # UV4 -f → "Verify OK"
9. mcp__keil__probe_connect + set_breakpoint    # attach debugger
10. mcp__keil__probe_read_registers / _memory   # observe chip state
11. mcp__keil__read_rtt_log                     # firmware logs
    → if logic bug found: source_edit → rebuild → reflash

Sicherheitsregeln

Ebene

Operationen

Standard

Nur-Lesen

Chip-Abgleich, Register-/Speicher-/Streices-Symbol, Leseug, Logistics

keien Bestäugung

Ausfüren

Anhalten / Fortsetzen / Einzelschritt / Reset

Nacfrfrage

Zustand schreiben

Speicher-/Register-Schreibzugriffe, Haltepunkte, Haltepunk op

Bestierung

Dauerhaft destruktiv

Flash löschen / programmieren

explizite Bestatigung + Widerherstellungsplan

Host-Prozess

Kiel-Build / GDB-Server

Rückfrage

Grundsätze: Vor dem Handeln Beweise sammeln; zuerst den Zielchip identifizieren; vor dem Flashken Ziel / Bereich / Image / Wiederherstellung bestätigen.

Testern

pytest tests -q        # 11 unit tests: log parsing, source editing, progress, project parsing

Manuelle Smoke-Tests (in tests/):

python tests/raw_handshake.py    # bare JSON-RPC initialize + tools/list over stdio
python tests/func_test.py        # end-to-end tool calls through the MCP client SDK

Fehlerbehebung

Syntom

Usache / Behebung

Target DLL has been cancelled beim Flashen

pyOCD besitzt die Probe noch. Auf probe_disconnect (oder der Proben-Lease), rufe flash_firmware mit dem UV4-Backend ab.

UV4.exe not found

Setzen Sie KEIL_UV4_PATH oder keil.uv4_path in der Konfiguration; führe keil_doctor zur Bestätigung aus.

No module named keil_mcp_server

Die editierbare Installation des venv zeigt on einen alte Pfad – installeren Sie es mit dem aktuellen Checkout neu: pip install -e .

No target connected

Prüen Sie die Verkabelung und den Treiber der Probe; keil_doctor listet erekannte Probes auf.

pyocd pack install needen.

z. B. pyocd pack install stm32f103c8 oder richten Sie pyOCD auf den Keil-OSP-Orderer.

Roadmap

  • In PyPI und im CMP-Registry vöffenten

  • MCUBUDDY_TOOLSETS-artige Domänen-Umschaltungen

  • ELF-Symbolauflösung für set_breakpoint nach dem anzeigten

  • ELS-Auflösung der Symbole for set_breachpoint by Namen.

  • RTOS-Task-Awarenes (FreeRTOS)

  • GitHub-Actions-CI für Unit-Tests

  • [o Linux/macOS-Unterstützungs-Hinweise (Keil ist nur Windows; pyOCD-Tei le sind plattformübergängig)

Mitwirrg

Beiträge are herzlich willkommen! Bitte öffnen Sie zuerst ein Issue, um Änderungen zu besprechen, und reichen Sie dann einen PR ein.

Lizenz

MIT — frei nutzubar, veränderbar und verbreitenbar mit Nangingung.

A
license - permissive license
Not graded
quality - not tested
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
    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
  • 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.
    21
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to flash firmware, program memory, modify option bytes, erase chips, reset boards, and capture SWO printf traces for STM32 microcontrollers via STM32CubeCLT.
    12

View all related MCP servers

Related MCP Connectors

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/ZMC1011/dsh-keil-mcp'

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