LSP MCP Server

Se integra con el Protocolo de Servidor de Lenguaje (LSP) para proporcionar funciones como autocompletado de código, diagnósticos e información al pasar el cursor.

Documentación

LSP MCP Server

Un servidor MCP (Model Context Protocol) para interactuar con la interfaz LSP (Language Server Protocol). Este servidor actúa como un puente que permite a los LLMs consultar los proveedores de Hover y Completion de LSP.

Descripción general

El servidor MCP funciona de la siguiente manera:

  1. Inicia un cliente LSP que se conecta a un servidor LSP
  2. Expone herramientas MCP que envían solicitudes al servidor LSP
  3. Devuelve los resultados en un formato que los LLMs pueden entender y utilizar

Esto permite a los LLMs utilizar los LSP para obtener sugerencias de código más precisas.

Configuración:

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "tritlo/lsp-mcp",
        "<language-id>",
        "<path-to-lsp>",
        "<lsp-args>"
      ]
    }
  }
}

Características

Herramientas MCP

  • get_info_on_location: Obtener información de hover en una ubicación específica de un archivo
  • get_completions: Obtener sugerencias de autocompletado en una ubicación específica de un archivo
  • get_code_actions: Obtener acciones de código para un rango específico en un archivo
  • open_document: Abrir un archivo en el servidor LSP para su análisis
  • close_document: Cerrar un archivo en el servidor LSP
  • get_diagnostics: Obtener mensajes de diagnóstico (errores, advertencias) para archivos abiertos
  • start_lsp: Iniciar el servidor LSP con un directorio raíz especificado
  • restart_lsp_server: Reiniciar el servidor LSP sin reiniciar el servidor MCP
  • set_log_level: Cambiar el nivel de verbosidad del registro del servidor en tiempo de ejecución

Recursos MCP

  • Recursos lsp-diagnostics:// para acceder a mensajes de diagnóstico con actualizaciones en tiempo real mediante suscripciones
  • Recursos lsp-hover:// para recuperar información de hover en ubicaciones específicas de archivos
  • Recursos lsp-completions:// para obtener sugerencias de autocompletado de código en posiciones específicas

Características adicionales

  • Sistema de registro integral con múltiples niveles de severidad
  • Salida de consola con colores para una mejor legibilidad
  • Nivel de registro configurable en tiempo de ejecución
  • Manejo y reporte detallado de errores
  • Interfaz de línea de comandos simple

Requisitos previos

  • Node.js (v16 o posterior)
  • npm

Para el servidor de demostración:

  • GHC (8.10 o posterior)
  • Cabal (3.0 o posterior)

Instalación

Compilación del servidor MCP

  1. Clonar este repositorio:

    git clone https://github.com/your-username/lsp-mcp.git
    cd lsp-mcp
    
  2. Instalar dependencias:

    npm install
    
  3. Compilar el servidor MCP:

    npm run build
    

Pruebas

El proyecto incluye pruebas de integración para el soporte de TypeScript LSP. Estas pruebas verifican que el servidor LSP-MCP maneja correctamente las operaciones LSP como información de hover, autocompletado, diagnósticos y acciones de código.

Ejecución de pruebas

Para ejecutar las pruebas de TypeScript LSP:

npm test

o específicamente:

npm run test:typescript

Cobertura de pruebas

Las pruebas verifican la siguiente funcionalidad:

  • Inicialización del LSP de TypeScript con un proyecto simulado
  • Apertura de archivos TypeScript para análisis
  • Obtención de información de hover para funciones y tipos
  • Obtención de sugerencias de autocompletado de código
  • Obtención de mensajes de error de diagnóstico
  • Obtención de acciones de código para errores

El proyecto de prueba se encuentra en test/ts-project/ y contiene archivos TypeScript con errores intencionales para probar la retroalimentación de diagnóstico.

Uso

Ejecute el servidor MCP proporcionando la ruta al ejecutable LSP y cualquier argumento para pasar al servidor LSP:

npx tritlo/lsp-mcp <language> /path/to/lsp [lsp-args...]

Por ejemplo:

npx tritlo/lsp-mcp haskell /usr/bin/haskell-language-server-wrapper lsp

Importante: Iniciar el servidor LSP

Con la versión 0.2.0 y posteriores, debe iniciar explícitamente el servidor LSP llamando a la herramienta start_lsp antes de usar cualquier funcionalidad LSP. Esto garantiza una inicialización adecuada con el directorio raíz correcto, lo cual es especialmente importante al usar herramientas como npx:

{
  "tool": "start_lsp",
  "arguments": {
    "root_dir": "/path/to/your/project"
  }
}

Registro

El servidor incluye un sistema de registro integral con 8 niveles de severidad:

  • debug: Información detallada para fines de depuración
  • info: Mensajes informativos generales sobre el funcionamiento del sistema
  • notice: Eventos operativos significativos
  • warning: Problemas potenciales que podrían requerir atención
  • error: Condiciones de error que afectan la operación pero no detienen el sistema
  • critical: Condiciones críticas que requieren atención inmediata
  • alert: El sistema se encuentra en un estado inestable
  • emergency: El sistema no es utilizable

De forma predeterminada, los registros se envían a:

  1. Salida de consola con codificación de colores para una mejor legibilidad
  2. Notificaciones MCP al cliente (mediante el método notifications/message)

Visualización de registros de depuración

Para una depuración detallada, puede:

  1. Usar la bandera claude --mcp-debug al ejecutar Claude para ver todo el tráfico MCP entre Claude y el servidor:

    claude --mcp-debug
    
  2. Cambiar el nivel de registro en tiempo de ejecución usando la herramienta set_log_level:

    {
      "tool": "set_log_level",
      "arguments": {
        "level": "debug"
      }
    }
    

El nivel de registro predeterminado es info, que muestra un detalle operativo moderado mientras filtra mensajes de depuración verbosos.

API

El servidor proporciona las siguientes herramientas MCP:

get_info_on_location

Obtiene información de hover en una ubicación específica de un archivo.

Parámetros:

  • file_path: Ruta al archivo
  • language_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")
  • line: Número de línea
  • column: Posición de columna

Ejemplo:

{
  "tool": "get_info_on_location",
  "arguments": {
    "file_path": "/path/to/your/file",
    "language_id": "haskell",
    "line": 3,
    "column": 5
  }
}

get_completions

Obtiene sugerencias de autocompletado en una ubicación específica de un archivo.

Parámetros:

  • file_path: Ruta al archivo
  • language_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")
  • line: Número de línea
  • column: Posición de columna

Ejemplo:

{
  "tool": "get_completions",
  "arguments": {
    "file_path": "/path/to/your/file",
    "language_id": "haskell",
    "line": 3,
    "column": 10
  }
}

get_code_actions

Obtiene acciones de código para un rango específico en un archivo.

Parámetros:

  • file_path: Ruta al archivo
  • language_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")
  • start_line: Número de línea de inicio
  • start_column: Posición de columna de inicio
  • end_line: Número de línea de fin
  • end_column: Posición de columna de fin

Ejemplo:

{
  "tool": "get_code_actions",
  "arguments": {
    "file_path": "/path/to/your/file",
    "language_id": "haskell",
    "start_line": 3,
    "start_column": 5,
    "end_line": 3,
    "end_column": 10
  }
}

start_lsp

Inicia el servidor LSP con un directorio raíz especificado. Debe llamarse antes de usar cualquier otra herramienta relacionada con LSP.

Parámetros:

  • root_dir: El directorio raíz para el servidor LSP (se recomienda una ruta absoluta)

Ejemplo:

{
  "tool": "start_lsp",
  "arguments": {
    "root_dir": "/path/to/your/project"
  }
}

restart_lsp_server

Reinicia el proceso del servidor LSP sin reiniciar el servidor MCP. Esto es útil para recuperarse de problemas del servidor LSP o para aplicar cambios en la configuración del servidor LSP.

Parámetros:

  • root_dir: (Opcional) El directorio raíz para el servidor LSP. Si se proporciona, el servidor se inicializará con este directorio después del reinicio.

Ejemplo sin root_dir (usa el directorio raíz establecido previamente):

{
  "tool": "restart_lsp_server",
  "arguments": {}
}

Ejemplo con root_dir:

{
  "tool": "restart_lsp_server",
  "arguments": {
    "root_dir": "/path/to/your/project"
  }
}

open_document

Abre un archivo en el servidor LSP para su análisis. Debe llamarse antes de acceder a los diagnósticos o realizar otras operaciones en el archivo.

Parámetros:

  • file_path: Ruta al archivo a abrir
  • language_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")

Ejemplo:

{
  "tool": "open_document",
  "arguments": {
    "file_path": "/path/to/your/file",
    "language_id": "haskell"
  }
}

close_document

Cierra un archivo en el servidor LSP cuando haya terminado de trabajar con él. Esto ayuda a gestionar recursos y limpieza.

Parámetros:

  • file_path: Ruta al archivo a cerrar

Ejemplo:

{
  "tool": "close_document",
  "arguments": {
    "file_path": "/path/to/your/file"
  }
}

get_diagnostics

Obtiene mensajes de diagnóstico (errores, advertencias) para uno o todos los archivos abiertos.

Parámetros:

  • file_path: (Opcional) Ruta al archivo para obtener diagnósticos. Si no se proporciona, devuelve diagnósticos para todos los archivos abiertos.

Ejemplo para un archivo específico:

{
  "tool": "get_diagnostics",
  "arguments": {
    "file_path": "/path/to/your/file"
  }
}

Ejemplo para todos los archivos abiertos:

{
  "tool": "get_diagnostics",
  "arguments": {}
}

set_log_level

Establece el nivel de registro del servidor para controlar la verbosidad de los mensajes de registro.

Parámetros:

  • level: El nivel de registro a establecer. Uno de: debug, info, notice, warning, error, critical, alert, emergency.

Ejemplo:

{
  "tool": "set_log_level",
  "arguments": {
    "level": "debug"
  }
}

Recursos MCP

Además de las herramientas, el servidor proporciona recursos para acceder a las funciones de LSP, incluidos diagnósticos, información de hover y autocompletado de código:

Recursos de diagnóstico

El servidor expone información de diagnóstico mediante el esquema de recursos lsp-diagnostics://. Estos recursos se pueden suscribir para recibir actualizaciones en tiempo real cuando cambian los diagnósticos.

URI de recursos:

  • lsp-diagnostics:// - Diagnósticos para todos los archivos abiertos
  • lsp-diagnostics:///path/to/file - Diagnósticos para un archivo específico

Importante: Los archivos deben abrirse usando la herramienta open_document antes de poder acceder a los diagnósticos.

Recursos de información de hover

El servidor expone información de hover mediante el esquema de recursos lsp-hover://. Esto permite obtener información sobre elementos de código en posiciones específicas de los archivos.

Formato de URI de recurso:

lsp-hover:///path/to/file?line={line}&column={column}&language_id={language_id}

Parámetros:

  • line: Número de línea (basado en 1)
  • column: Posición de columna (basada en 1)
  • language_id: El lenguaje de programación (por ejemplo, "haskell")

Ejemplo:

lsp-hover:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell

Recursos de autocompletado de código

El servidor expone sugerencias de autocompletado de código mediante el esquema de recursos lsp-completions://. Esto permite obtener candidatos de autocompletado en posiciones específicas de los archivos.

Formato de URI de recurso:

lsp-completions:///path/to/file?line={line}&column={column}&language_id={language_id}

Parámetros:

  • line: Número de línea (basado en 1)
  • column: Posición de columna (basada en 1)
  • language_id: El lenguaje de programación (por ejemplo, "haskell")

Ejemplo:

lsp-completions:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell

Listado de recursos disponibles

Para descubrir los recursos disponibles, use el endpoint resources/list de MCP. La respuesta incluirá todos los recursos disponibles para los archivos actualmente abiertos, incluidos:

  • Recursos de diagnóstico para todos los archivos abiertos
  • Plantillas de información de hover para todos los archivos abiertos
  • Plantillas de autocompletado de código para todos los archivos abiertos

Suscripción a actualizaciones de recursos

Los recursos de diagnóstico admiten suscripciones para recibir actualizaciones en tiempo real cuando cambian los diagnósticos (por ejemplo, cuando se modifican archivos y aparecen nuevos errores o advertencias). Suscríbase a los recursos de diagnóstico usando el endpoint resources/subscribe de MCP.

Nota: Los recursos de hover y autocompletado no admiten suscripciones, ya que representan consultas puntuales.

Trabajar con recursos vs. herramientas

Puede elegir entre dos enfoques para acceder a las funciones de LSP:

  1. Enfoque basado en herramientas: Use las herramientas get_diagnostics, get_info_on_location y get_completions para una forma simple y directa de obtener información.
  2. Enfoque basado en recursos: Use los recursos lsp-diagnostics://, lsp-hover:// y lsp-completions:// para un enfoque más RESTful.

Ambos enfoques proporcionan los mismos datos en el mismo formato y aplican el mismo requisito de que los archivos deben abrirse primero.

Solución de problemas

  • Si el servidor no se inicia, asegúrese de que la ruta al ejecutable LSP sea correcta
  • Consulte el archivo de registro (si está configurado) para ver mensajes de error detallados

Licencia

Licencia MIT

Extensiones

El servidor LSP-MCP admite extensiones específicas de lenguaje que mejoran sus capacidades para diferentes lenguajes de programación. Las extensiones pueden proporcionar:

  • Herramientas y funcionalidad personalizadas específicas de LSP
  • Manejadores y plantillas de recursos específicos del lenguaje
  • Prompts especializados para tareas relacionadas con el lenguaje
  • Manejadores de suscripción personalizados para datos en tiempo real

Extensiones disponibles

Actualmente, están disponibles las siguientes extensiones:

  • Haskell: Proporciona prompts especializados para el desarrollo en Haskell, incluida la guía de exploración de typed-hole

Uso de extensiones

Las extensiones se cargan automáticamente cuando especifica un ID de lenguaje al iniciar el servidor:

npx tritlo/lsp-mcp haskell /path/to/haskell-language-server-wrapper lsp

Espacios de nombres de extensiones

Todas las funciones proporcionadas por las extensiones tienen un espacio de nombres con el ID del lenguaje. Por ejemplo, el prompt de typed-hole de la extensión de Haskell está disponible como haskell.typed-hole-use.

Creación de nuevas extensiones

Para crear una nueva extensión:

  1. Cree un nuevo archivo TypeScript en src/extensions/ con el nombre de su lenguaje (por ejemplo, typescript.ts)

  2. Implemente la interfaz Extension con cualquiera de estas funciones opcionales:

    • getToolHandlers(): Proporcionar implementaciones de herramientas personalizadas
    • getToolDefinitions(): Definir herramientas personalizadas en la API de MCP
    • getResourceHandlers(): Implementar manejadores de recursos personalizados
    • getSubscriptionHandlers(): Implementar manejadores de suscripción personalizados
    • getUnsubscriptionHandlers(): Implementar manejadores de cancelación de suscripción personalizados
    • getResourceTemplates(): Definir plantillas de recursos personalizadas
    • getPromptDefinitions(): Definir prompts personalizados para tareas de lenguaje
    • getPromptHandlers(): Implementar manejadores de prompts personalizados
  3. Exporte sus funciones de implementación El sistema de extensiones cargará automáticamente tu extensión cuando se especifique el ID de idioma correspondiente.

Agradecimientos

  • Equipo de HLS por la implementación del Language Server Protocol
  • Anthropic por la especificación del Model Context Protocol