zig-mcp

Servidor MCP para Zig que conecta asistentes de codificación de IA a ZLS (Zig Language Server) a través de LSP — 16 herramientas para inteligencia de código, compilación y pruebas.

Documentación

zig-mcp

Servidor MCP para Zig que conecta asistentes de codificación con IA a ZLS a través del Protocolo de Servidor de Lenguaje.

Funciona con Claude Code, Cursor, Windsurf y cualquier cliente compatible con MCP.

AI assistant  <--(MCP stdio)-->  zig-mcp  <--(LSP pipes)-->  ZLS
                                    |
                             zig build / test / check

Requisitos

  • Zig 0.17.0-dev.1415+64dfaa568 o más reciente
  • ZLS (detección automática desde PATH, o especificar con --zls-path)

Instalación

Plugin de Claude Code (recomendado)

Instala directamente desde la interfaz de Claude Code — no se necesita compilación manual:

# 1. Add the marketplace
/plugin marketplace add nzrsky/zig-mcp

# 2. Install the plugin
/plugin install zig-mcp@zig

O como una línea desde la terminal:

claude plugin marketplace add nzrsky/zig-mcp && claude plugin install zig-mcp@zig

El binario se compila automáticamente en el primer uso. Solo asegúrate de que zig y zls estén en tu PATH.

Compilación manual

git clone https://github.com/nzrsky/zig-mcp.git
cd zig-mcp
zig build -Doptimize=ReleaseFast

El binario está en zig-out/bin/zig-mcp.

Configuración (solo instalación manual)

Si instalaste mediante el sistema de plugins, omite esta sección — todo está configurado automáticamente.

Claude Code

# add globally
claude mcp add zig-mcp -- /absolute/path/to/zig-mcp --workspace /path/to/your/zig/project

# add for current project only
claude mcp add --scope project zig-mcp -- /absolute/path/to/zig-mcp --workspace /path/to/your/zig/project

O edita ~/.claude/mcp_servers.json:

{
  "mcpServers": {
    "zig-mcp": {
      "command": "/absolute/path/to/zig-mcp",
      "args": ["--workspace", "/path/to/your/zig/project"]
    }
  }
}

Si omites --workspace, zig-mcp usa el directorio de trabajo actual.

Cursor

Añade a .cursor/mcp.json en tu proyecto:

{
  "mcpServers": {
    "zig-mcp": {
      "command": "/absolute/path/to/zig-mcp",
      "args": ["--workspace", "/path/to/your/zig/project"]
    }
  }
}

Windsurf

Añade a ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "zig-mcp": {
      "command": "/absolute/path/to/zig-mcp",
      "args": ["--workspace", "/path/to/your/zig/project"]
    }
  }
}

Opciones

--workspace, -w <path>   Project root directory (default: cwd)
--zls-path <path>        Path to ZLS binary (default: auto-detect from PATH)
--help, -h               Show help
--version                Show version

Herramientas

Todas responden desde el modelo semántico de ZLS — la parte que un shell y una búsqueda de texto no pueden alcanzar.

HerramientaLo que sabe que grep no sabe
zig_definitionLa única declaración verdadera, seguida a través de imports y alias. Toma symbol o file+line+character
zig_referencesUsos reales, conscientes del ámbito; omite identificadores con el mismo nombre, comentarios y cadenas. El modo symbol también busca a través de re-exportaciones
zig_hoverEl tipo después de la evaluación comptime y la inferencia — invisible en el texto fuente
zig_diagnosticsErrores para un archivo sin compilar el proyecto, re-sincronizado contra el disco primero
zig_workspace_symbolsDeclaraciones por nombre, no cada línea que las menciona
zig_document_symbolsEl esquema de un archivo: declaraciones, tipos, anidamiento
zig_completionLo que legalmente puede seguir en una posición, con tipos
zig_signature_helpLa firma real, incluidos parámetros comptime y genéricos
zig_renameQué archivos toca un renombrado, consciente del ámbito
zig_code_actionCorrecciones rápidas que ZLS ofrece para un rango
zig_inlay_hintsTodos los tipos inferidos en un archivo a la vez — nada de esto está en el texto fuente
zig_type_definitionLa declaración del tipo de un valor, no del valor
zig_ast_queryCódigo por forma: catch {} vacío, inicializadores catch unreachable, undefined, unreachable, @panic. Coincide sobre el árbol de sintaxis, por lo que los comentarios y literales de cadena nunca coinciden y las formas multilínea siempre lo hacen
zig_unused_privateDeclaraciones privadas a las que nada se refiere — exacto, porque un nombre no-pub no puede escapar de su archivo

Lo que está deliberadamente ausente

No hay zig_build, zig_test, zig_format, zig_version, zig_check ni zig_manage. Solían existir y envolvían zig build, zig test, zig fmt, zig version, zig ast-check y zvm — y un envoltorio pierde contra el shell que envuelve: sin tuberías, sin redirección, sin directorio de trabajo propio. Las transcripciones de sesión lo confirman: 526 invocaciones de zig build a través del shell, cero llamadas a la herramienta. Ejecuta esas con tu shell.

Cómo funciona

zig-mcp lanza ZLS como un proceso hijo y se comunica con él a través de stdin/stdout usando el protocolo LSP (encuadre Content-Length). En el otro lado, habla MCP (JSON-RPC delimitado por nuevas líneas) con el asistente de IA.

Tres hilos:

  • main — lee solicitudes MCP, despacha llamadas de herramientas, escribe respuestas
  • reader — lee respuestas LSP de ZLS, correlaciona por ID de solicitud
  • stderr — reenvía el stderr de ZLS al registro del servidor

Si ZLS falla, zig-mcp lo reinicia automáticamente y reabre todos los documentos rastreados.

Los archivos se abren en ZLS de forma perezosa en el primer acceso y se re-sincronizan (didChange) cuando su contenido cambia en disco — no es necesario gestionar el estado del documento manualmente.

Desarrollo

# build
zig build

# run tests (162 unit tests, including a fake-ZLS harness)
zig build test

# quality gates: lint, coverage, dead code, mutants
make lint cov deadcode mutants

# run manually
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"capabilities":{}}}' | \
  zig-out/bin/zig-mcp --workspace . 2>/dev/null

Licencia

MIT