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:
- Inicia un cliente LSP que se conecta a un servidor LSP
- Expone herramientas MCP que envían solicitudes al servidor LSP
- 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 archivoget_completions: Obtener sugerencias de autocompletado en una ubicación específica de un archivoget_code_actions: Obtener acciones de código para un rango específico en un archivoopen_document: Abrir un archivo en el servidor LSP para su análisisclose_document: Cerrar un archivo en el servidor LSPget_diagnostics: Obtener mensajes de diagnóstico (errores, advertencias) para archivos abiertosstart_lsp: Iniciar el servidor LSP con un directorio raíz especificadorestart_lsp_server: Reiniciar el servidor LSP sin reiniciar el servidor MCPset_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
-
Clonar este repositorio:
git clone https://github.com/your-username/lsp-mcp.git cd lsp-mcp -
Instalar dependencias:
npm install -
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óninfo: Mensajes informativos generales sobre el funcionamiento del sistemanotice: Eventos operativos significativoswarning: Problemas potenciales que podrían requerir atenciónerror: Condiciones de error que afectan la operación pero no detienen el sistemacritical: Condiciones críticas que requieren atención inmediataalert: El sistema se encuentra en un estado inestableemergency: El sistema no es utilizable
De forma predeterminada, los registros se envían a:
- Salida de consola con codificación de colores para una mejor legibilidad
- Notificaciones MCP al cliente (mediante el método
notifications/message)
Visualización de registros de depuración
Para una depuración detallada, puede:
-
Usar la bandera
claude --mcp-debugal ejecutar Claude para ver todo el tráfico MCP entre Claude y el servidor:claude --mcp-debug -
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 archivolanguage_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")line: Número de líneacolumn: 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 archivolanguage_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")line: Número de líneacolumn: 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 archivolanguage_id: El lenguaje de programación en el que está escrito el archivo (por ejemplo, "haskell")start_line: Número de línea de iniciostart_column: Posición de columna de inicioend_line: Número de línea de finend_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 abrirlanguage_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 abiertoslsp-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:
- Enfoque basado en herramientas: Use las herramientas
get_diagnostics,get_info_on_locationyget_completionspara una forma simple y directa de obtener información. - Enfoque basado en recursos: Use los recursos
lsp-diagnostics://,lsp-hover://ylsp-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:
-
Cree un nuevo archivo TypeScript en
src/extensions/con el nombre de su lenguaje (por ejemplo,typescript.ts) -
Implemente la interfaz Extension con cualquiera de estas funciones opcionales:
getToolHandlers(): Proporcionar implementaciones de herramientas personalizadasgetToolDefinitions(): Definir herramientas personalizadas en la API de MCPgetResourceHandlers(): Implementar manejadores de recursos personalizadosgetSubscriptionHandlers(): Implementar manejadores de suscripción personalizadosgetUnsubscriptionHandlers(): Implementar manejadores de cancelación de suscripción personalizadosgetResourceTemplates(): Definir plantillas de recursos personalizadasgetPromptDefinitions(): Definir prompts personalizados para tareas de lenguajegetPromptHandlers(): Implementar manejadores de prompts personalizados
-
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