Skip to main content
Glama
ZMC1011

Keil5 MCP Server

by ZMC1011

Keil5 MCP Server

Python License: MIT MCP PyPI PRs Welcome

Español | 中文

Un servidor de Model Context Protocol (MCP) que le proporciona a deepseek harness un bucle cerrado de editar código → flashear → depurar → leer la retroalimentación → corregir código para el desarrollo de STM32 con Keil MDK.

En lugar de cambiar manualmente entre el IDE, el programador y la terminal, un agente puede:

  1. Compilar un proyecto de Keil y observar el progreso de compilación en tiempo real

  2. Obtener errores estructurados de los registros de UV4 (archivo / línea / columna / código / mensaje)

  3. Explicar los códigos de error con causas y soluciones sugeridas

  4. Editar los archivos de código fuente de forma segura (cada edición se respaldada automáticamente)

  5. Flashear firmware a través del canal oficial de UV4 o de pyOCD

  6. Depurar en hardware mediante pyOCD: puntos de interrupción, ejecución paso a paso, registros, memoria, registros RTT

  7. Ejecutar el canal de depuración oficial de Keil (UV4 -d + scripts .ini)


Tabla de contenido


Related MCP server: stm32-mcp

Características

  • 27 herramientas MCP registradas como mcp__<serverName>__<tool> (p. ej., mcp__keil__build_project)

  • Progreso de compilación en tiempo real: monitor basado en tail con porcentaje / archivo actual / fase, limitado al 95 % hasta que finalice el enlazado

  • Análisis estructurado de registros de UV4: errores de compilación (main.c(25:1): error C2065: ...), errores de enlazado (L6218E), tamaño del programa, tiempo de compilación

  • Base de conocimiento de códigos de error: explicaciones y correcciones integradas para códigos comunes de error de armcc/armclang (C2065, L6218E, L6406E, ...)

  • Edición segura del código fuente: copia de respaldo automática en .keil-mcp-backups/ antes de cada edición, reemplazo por rango de líneas, búsqueda con regex

  • Vía de flasheo oficial: UV4 -f usa el algoritmo de Flash configurado del proyecto; pyOCD como respaldo acepta .axf directamente

  • Depuración en hardware: control de la sonda pyOCD (conectar / detener / reanudar / paso / punto de interrupción / registros / memoria / RTT)

  • Permiso de sonda: acceso exclusivo por sonda (block de asyncio + bloqueo de archivo) para que UV4 y pyOCD no se peleen por el puerto de depuración

  • Frontera de ejecución: las herramientas de solo lectura se ejecutan cláusulas, las herramientas de mutación se serializan con un bloqueo de sesión; seguro frente a la cancelación mediante asyncio.shield

  • Funciona sin Keil instalado: keil_doctor informa claramente de los componentes que faltan; el servidor de serie

Requisitos

Componente

Versión / Notas

Python

3.10+ (probado en 3.12)

Keil MDK

UV4.exe (compilar -b, flashear -f, depurar -d) — opcional pero requerido para las herramientas de compilación/flasheo

pyOCD

se instala automáticamente mediante pip; requiere un controlador para la sonda (ST-Link / J-Link / CMSIS-DAP)

Sonda

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

Paquete de destino

p. ej., pyocd pack install stm32f103c8 o reutilizar el paquete DFP de Keil

Instalación

Desde PyPI

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

El paquete está listo para PyPI (incluye pyproject.toml + LICENSE + server.json). Si el paquete aún no se ha publicado, instala desde el código fuente que aparece a continuación.

Desde el código fuente (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]"

Verificar la instalación

# 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

Inicio rápido

# 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 }

Configuración del cliente MCP

DeepSeek Harness (DSH)

Según la documentación oficial de DSH para MCP: una instancia del plugin = un servidor MCP, se conecta a través del plugin puente oficial @deepseek-ai/dsh-mcp-client. Añade esto al cordis.patch.yml de tu perfil (o a cordis.yml):

- 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

Verífcalo con:

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

Nota: serverName debe cumplir con [A-Za-z0-9_-]{1,32} y ser único entre las instancias activas.

Claude Desktop / otros clientes MCP stdio

La mayoría de los clientes MCP usan la convención JSON mcpServers:

{
  "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"
      }
    }
  }
}

Para una copia del código fuente sin venv, uv también funciona:

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

Herramientas

Las 27 herramientas devuelven JSON estructurado. Las operaciones destructivas (flasheo / borrado) requieren confirm=True.

Compilar y errores

Herramienta

Descripción

Parámetros clave → Resultado

compile_project

Compila con UV4 -b (o -r para recompilar / -c para limpiar), con progreso en tiempo real

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

compile_progress_status

Consulta el progreso de una compilación en curso

build_id{status, percent, current_file, phase}

build_cancel

Solicita la cancelación de la compilación

build_id{success}

parse_build_errors

Analiza el registro de UV4 en errores estructurados

log_path? o log_content?{errors[], warnings[], summary}

explain_build_error

Código de error → explicación + causas + soluciones

error_code, message?, file?, line?{explanation, common_causes[], suggested_fixes[]}

Edición de código fuente

Herramienta

Descripción

Parámetros clave → resultado

source_edit

Lee el código fuente con números de línea

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

source_safe_edit

Reemplaza un rango de líneas; primero hace una copia de respaldo automática

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

source_search

Busca en archivos de código fuente (texto o regex)

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

Canal de depuración oficial

Herramienta

Descripción

Parámetros clave → resultado

uv4_debug_session

Ejecuta UV4 -d + script de depuración .ini es (sin modo interactivo: punto de interrupción / continuar / paso)

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

uv4_debug_poll

Lee la salida de la sesión por su id

session_id{output}

Proyecto y entorno

Herramienta

Cantidad

Parámetros clave → deja

keil_doctor

Presentación del arg. Realtà UV4 pro versiones

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

discover_keil_projects

Busca *.uvpo under un directorio

directory?, recursive?{projects[]}

configure_keil_project

Analiza el proyecto: targets, device, pack, groups, source files

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

Flasheo

Herramienta

Descripción

Parámetros clave → resultado

flash_firmware

Fyoung vía UV4 -f (preferido) o pyOCD

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

erase_flash

Borrar el flasheo del chip (pyOCD erase -c)

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

verify_flash

Verificar el chip contra una imagen (pyOCD verify)

image, probe_id?{success, output}

Depuración con sonda

Herramienta

Descripción

probe_connect / probe_disconnect

Conecta / libera una sonda de pyOCD; al desconectar se libera el puerto para UV4 -f

pause / resume / step

Control del núcleo

set_breakpoint / continue_target

Establece un punto de interrupción por símbolo o dirección, y continúa

read_registers

Lee r0-r15, sp, lr, pc, xpsr

read_memory

Lee memoria en una dirección (resultado bytes hexadecimales)

rtt_log

Lee la salida de SEGGER RTT (si está en ejecución)

Arquitectura

┌──────────────────────────────────────────────────────────────┐
│  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  │
      └───────────────────┘          └───────────────────┘

Dirección de la dependencia: capa MCP → herramientas → núcleo → Keil MDK / pyOCD → chip de destino.

Puntos de diseño clave:

  • Límite de ejecución (inspirado en McuBuddy): las herramientas de solo lectura se ejecutan de forma concurrente; todo lo demás se serializa con un asyncio.Lock por sesión, Mesh se ejecuta en un hilo de trabajo (asyncio.to_thread) y está protegido contra cancelaciones (asyncio.shield).

  • Concesión de la sonda: UV4 -f y pyOCD no pueden compartir el puerto de depuración. ProbeLease (bloqueo asyncio + filelock) serializa el acceso; el flujo de grabación se desconecta de pyOCD antes de que UV4 tome el control.

  • Progreso en tiempo real: un hilo daemon rastrea el registro de UV4, contando las líneas compiling contra el conteo de archivos fuente analizados desde .uvprojx (porcentaje limitado al 95 % hasta el marcador Build Time Elapsed).

  • Tolerancia a XML malformado: los proyectos antiguos de Keil contienen etiquetas no coincidentes (p. ej. <b498tele498>...</bUseTDR>); el analizador del proyecto las repara antes de analizar.

Configuración

config.yaml (incluido) + anulaciones por variables de entorno:

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"

Ejemplo de flujo de trabajo de extremo a extremo

Una sesión típica de agente (nombres de herramientas mostrados con el prefijo DSH mcp__keil__):

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

Reglas de seguridad

Nivel

Operaciones

Predeterminado

Solo lectura

coincidencia de chip, lecturas de registros/memoria/símbolos, logs

sin confirmación

Ejecutar

detener / reanudar / paso / reiniciar

preguntar

Escritura de estado

escrituras de memoria/registros, puntos de interrupción, puntos de observación

confirmación

Destructiva persistente

borrado / programación de flash

confirmación explícita + plan de recuperación

Proceso del host

compilación de Keil, servidor GDB

preguntar

Principios: reunir evidencia antes de actuar; identificar primero el componente objetivo; confirmar objetivo / rango / imagen / recuperación antes de grabar.

Pruebas

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

Pruebas de humo manuales (en 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

Solución de problemas

Síntoma

Causa / Solución

Target DLL has been cancelled al grabar

pyOCD todavía es el dueño de la sonda. Llama a probe_disconnect (o deja que la concesión de la sonda se encargue) antes de flash_firmware con el backend UV4.

UV4.exe not found

Configura KEIL_UV4_PATH o keil.uv4_path en la configuración; ejecuta keil_doctor para confirmar.

No module named keil_mcp_server

El instalado editable del venv apunta a una ruta antigua (instálalo de nuevo desde el repositorio actual): pip install -e .

No target connected

Comprueba el cableado / controlador de la sonda; keil_doctor lista las sondas detectadas.

Se necesita pyocd pack install

p. ej. pyocd pack install stm32f103c8 o apunta pyOCD a la carpeta DFP de Keil.

Hoja de ruta

  • Publicar en PyPI y registrarse en el registro de MCP

  • Conmutadores de dominio estilo MCUBUDDY_TOOLSETS

  • Resolución de símbolos ELF para set_breakpoint por nombre

  • Conocimiento de tareas RTOS (FreeRTOS)

  • CI de GitHub Actions para pruebas unitarias

  • Notas de soporte para Linux/macOS (Keil es solo para Windows; las partes de pyOCD son multiplataforma)

Contribuciones

¡Las contribuciones son bienvenidas! Abre primero una incidencia para discutir los cambios y, luego, envía un PR.

Licencia

MIT — libre de usar, modificar y distribuir con atribución.

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