LSP MCP Server
Integra-se ao Language Server Protocol (LSP) para fornecer recursos como conclusão de código, diagnósticos e informações ao passar o mouse.
Documentação
LSP MCP Server
Um servidor MCP (Model Context Protocol) para interagir com a interface LSP (Language Server Protocol). Este servidor atua como uma ponte que permite que LLMs consultem os provedores de Hover e Completion do LSP.
Visão Geral
O MCP Server funciona da seguinte forma:
- Inicia um cliente LSP que se conecta a um servidor LSP
- Expõe ferramentas MCP que enviam solicitações ao servidor LSP
- Retorna os resultados em um formato que os LLMs possam entender e usar
Isso permite que os LLMs utilizem LSPs para sugestões de código mais precisas.
Configuração:
{
"mcpServers": {
"lsp-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"tritlo/lsp-mcp",
"<language-id>",
"<path-to-lsp>",
"<lsp-args>"
]
}
}
}
Recursos
Ferramentas MCP
get_info_on_location: Obter informações de hover em um local específico de um arquivoget_completions: Obter sugestões de conclusão em um local específico de um arquivoget_code_actions: Obter ações de código para um intervalo específico em um arquivoopen_document: Abrir um arquivo no servidor LSP para análiseclose_document: Fechar um arquivo no servidor LSPget_diagnostics: Obter mensagens de diagnóstico (erros, avisos) para arquivos abertosstart_lsp: Iniciar o servidor LSP com um diretório raiz especificadorestart_lsp_server: Reiniciar o servidor LSP sem reiniciar o servidor MCPset_log_level: Alterar o nível de verbosidade de registro do servidor em tempo de execução
Recursos MCP
- Recursos
lsp-diagnostics://para acessar mensagens de diagnóstico com atualizações em tempo real via assinaturas - Recursos
lsp-hover://para recuperar informações de hover em locais específicos de arquivos - Recursos
lsp-completions://para obter sugestões de conclusão de código em posições específicas
Recursos Adicionais
- Sistema de registro abrangente com múltiplos níveis de severidade
- Saída de console colorida para melhor legibilidade
- Nível de registro configurável em tempo de execução
- Tratamento e relatório de erros detalhados
- Interface de linha de comando simples
Pré-requisitos
- Node.js (v16 ou posterior)
- npm
Para o servidor de demonstração:
- GHC (8.10 ou posterior)
- Cabal (3.0 ou posterior)
Instalação
Compilando o MCP Server
-
Clone este repositório:
git clone https://github.com/your-username/lsp-mcp.git cd lsp-mcp -
Instale as dependências:
npm install -
Compile o servidor MCP:
npm run build
Testes
O projeto inclui testes de integração para o suporte LSP do TypeScript. Esses testes verificam se o servidor LSP-MCP lida corretamente com operações LSP, como informações de hover, conclusões, diagnósticos e ações de código.
Executando Testes
Para executar os testes LSP do TypeScript:
npm test
ou especificamente:
npm run test:typescript
Cobertura de Testes
Os testes verificam as seguintes funcionalidades:
- Inicializar o LSP do TypeScript com um projeto simulado
- Abrir arquivos TypeScript para análise
- Obter informações de hover para funções e tipos
- Obter sugestões de conclusão de código
- Obter mensagens de erro de diagnóstico
- Obter ações de código para erros
O projeto de teste está localizado em test/ts-project/ e contém arquivos TypeScript com erros intencionais para testar o feedback de diagnóstico.
Uso
Execute o servidor MCP fornecendo o caminho para o executável LSP e quaisquer argumentos a serem passados ao servidor LSP:
npx tritlo/lsp-mcp <language> /path/to/lsp [lsp-args...]
Por exemplo:
npx tritlo/lsp-mcp haskell /usr/bin/haskell-language-server-wrapper lsp
Importante: Iniciando o Servidor LSP
A partir da versão 0.2.0 e posteriores, você deve iniciar explicitamente o servidor LSP chamando a ferramenta start_lsp antes de usar qualquer funcionalidade LSP. Isso garante a inicialização adequada com o diretório raiz correto, o que é especialmente importante ao usar ferramentas como npx:
{
"tool": "start_lsp",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
Registro
O servidor inclui um sistema de registro abrangente com 8 níveis de severidade:
debug: Informações detalhadas para fins de depuraçãoinfo: Mensagens informativas gerais sobre a operação do sistemanotice: Eventos operacionais significativoswarning: Problemas potenciais que podem precisar de atençãoerror: Condições de erro que afetam a operação, mas não interrompem o sistemacritical: Condições críticas que exigem atenção imediataalert: O sistema está em um estado instávelemergency: O sistema está inutilizável
Por padrão, os registros são enviados para:
- Saída do console com codificação de cores para melhor legibilidade
- Notificações MCP para o cliente (via método
notifications/message)
Visualizando Registros de Depuração
Para depuração detalhada, você pode:
-
Usar o sinalizador
claude --mcp-debugao executar o Claude para ver todo o tráfego MCP entre o Claude e o servidor:claude --mcp-debug -
Alterar o nível de registro em tempo de execução usando a ferramenta
set_log_level:{ "tool": "set_log_level", "arguments": { "level": "debug" } }
O nível de registro padrão é info, que mostra detalhes operacionais moderados enquanto filtra mensagens de depuração verbosas.
API
O servidor fornece as seguintes ferramentas MCP:
get_info_on_location
Obtém informações de hover em um local específico de um arquivo.
Parâmetros:
file_path: Caminho para o arquivolanguage_id: A linguagem de programação em que o arquivo está escrito (por exemplo, "haskell")line: Número da linhacolumn: Posição da coluna
Exemplo:
{
"tool": "get_info_on_location",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell",
"line": 3,
"column": 5
}
}
get_completions
Obtém sugestões de conclusão em um local específico de um arquivo.
Parâmetros:
file_path: Caminho para o arquivolanguage_id: A linguagem de programação em que o arquivo está escrito (por exemplo, "haskell")line: Número da linhacolumn: Posição da coluna
Exemplo:
{
"tool": "get_completions",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell",
"line": 3,
"column": 10
}
}
get_code_actions
Obtém ações de código para um intervalo específico em um arquivo.
Parâmetros:
file_path: Caminho para o arquivolanguage_id: A linguagem de programação em que o arquivo está escrito (por exemplo, "haskell")start_line: Número da linha inicialstart_column: Posição da coluna inicialend_line: Número da linha finalend_column: Posição da coluna final
Exemplo:
{
"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 o servidor LSP com um diretório raiz especificado. Isso deve ser chamado antes de usar qualquer outra ferramenta relacionada ao LSP.
Parâmetros:
root_dir: O diretório raiz para o servidor LSP (caminho absoluto recomendado)
Exemplo:
{
"tool": "start_lsp",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
restart_lsp_server
Reinicia o processo do servidor LSP sem reiniciar o servidor MCP. Isso é útil para se recuperar de problemas do servidor LSP ou para aplicar alterações na configuração do servidor LSP.
Parâmetros:
root_dir: (Opcional) O diretório raiz para o servidor LSP. Se fornecido, o servidor será inicializado com este diretório após a reinicialização.
Exemplo sem root_dir (usa o diretório raiz definido anteriormente):
{
"tool": "restart_lsp_server",
"arguments": {}
}
Exemplo com root_dir:
{
"tool": "restart_lsp_server",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
open_document
Abre um arquivo no servidor LSP para análise. Isso deve ser chamado antes de acessar diagnósticos ou realizar outras operações no arquivo.
Parâmetros:
file_path: Caminho para o arquivo a ser abertolanguage_id: A linguagem de programação em que o arquivo está escrito (por exemplo, "haskell")
Exemplo:
{
"tool": "open_document",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell"
}
}
close_document
Fecha um arquivo no servidor LSP quando você terminar de trabalhar com ele. Isso ajuda a gerenciar recursos e limpeza.
Parâmetros:
file_path: Caminho para o arquivo a ser fechado
Exemplo:
{
"tool": "close_document",
"arguments": {
"file_path": "/path/to/your/file"
}
}
get_diagnostics
Obtém mensagens de diagnóstico (erros, avisos) para um ou todos os arquivos abertos.
Parâmetros:
file_path: (Opcional) Caminho para o arquivo para obter diagnósticos. Se não fornecido, retorna diagnósticos para todos os arquivos abertos.
Exemplo para um arquivo específico:
{
"tool": "get_diagnostics",
"arguments": {
"file_path": "/path/to/your/file"
}
}
Exemplo para todos os arquivos abertos:
{
"tool": "get_diagnostics",
"arguments": {}
}
set_log_level
Define o nível de registro do servidor para controlar a verbosidade das mensagens de registro.
Parâmetros:
level: O nível de registro a ser definido. Um de:debug,info,notice,warning,error,critical,alert,emergency.
Exemplo:
{
"tool": "set_log_level",
"arguments": {
"level": "debug"
}
}
Recursos MCP
Além das ferramentas, o servidor fornece recursos para acessar recursos LSP, incluindo diagnósticos, informações de hover e conclusões de código:
Recursos de Diagnóstico
O servidor expõe informações de diagnóstico por meio do esquema de recurso lsp-diagnostics://. Esses recursos podem ser assinados para atualizações em tempo real quando os diagnósticos mudam.
URIs de recurso:
lsp-diagnostics://- Diagnósticos para todos os arquivos abertoslsp-diagnostics:///path/to/file- Diagnósticos para um arquivo específico
Importante: Os arquivos devem ser abertos usando a ferramenta open_document antes que os diagnósticos possam ser acessados.
Recursos de Informações de Hover
O servidor expõe informações de hover por meio do esquema de recurso lsp-hover://. Isso permite obter informações sobre elementos de código em posições específicas em arquivos.
Formato do URI do recurso:
lsp-hover:///path/to/file?line={line}&column={column}&language_id={language_id}
Parâmetros:
line: Número da linha (baseado em 1)column: Posição da coluna (baseada em 1)language_id: A linguagem de programação (por exemplo, "haskell")
Exemplo:
lsp-hover:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell
Recursos de Conclusão de Código
O servidor expõe sugestões de conclusão de código por meio do esquema de recurso lsp-completions://. Isso permite obter candidatos de conclusão em posições específicas em arquivos.
Formato do URI do recurso:
lsp-completions:///path/to/file?line={line}&column={column}&language_id={language_id}
Parâmetros:
line: Número da linha (baseado em 1)column: Posição da coluna (baseada em 1)language_id: A linguagem de programação (por exemplo, "haskell")
Exemplo:
lsp-completions:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell
Listando Recursos Disponíveis
Para descobrir recursos disponíveis, use o endpoint MCP resources/list. A resposta incluirá todos os recursos disponíveis para arquivos atualmente abertos, incluindo:
- Recursos de diagnóstico para todos os arquivos abertos
- Modelos de informações de hover para todos os arquivos abertos
- Modelos de conclusão de código para todos os arquivos abertos
Assinando Atualizações de Recursos
Os recursos de diagnóstico suportam assinaturas para receber atualizações em tempo real quando os diagnósticos mudam (por exemplo, quando os arquivos são modificados e novos erros ou avisos aparecem). Assine os recursos de diagnóstico usando o endpoint MCP resources/subscribe.
Nota: Os recursos de hover e conclusão não suportam assinaturas, pois representam consultas pontuais.
Trabalhando com Recursos vs. Ferramentas
Você pode escolher entre duas abordagens para acessar os recursos LSP:
- Abordagem baseada em ferramentas: Use as ferramentas
get_diagnostics,get_info_on_locationeget_completionspara uma maneira simples e direta de buscar informações. - Abordagem baseada em recursos: Use os recursos
lsp-diagnostics://,lsp-hover://elsp-completions://para uma abordagem mais RESTful.
Ambas as abordagens fornecem os mesmos dados no mesmo formato e impõem o mesmo requisito de que os arquivos devem ser abertos primeiro.
Solução de Problemas
- Se o servidor falhar ao iniciar, certifique-se de que o caminho para o executável LSP esteja correto
- Verifique o arquivo de registro (se configurado) para mensagens de erro detalhadas
Licença
Licença MIT
Extensões
O servidor LSP-MCP suporta extensões específicas de linguagem que aprimoram suas capacidades para diferentes linguagens de programação. As extensões podem fornecer:
- Ferramentas e funcionalidades personalizadas específicas do LSP
- Manipuladores e modelos de recursos específicos de linguagem
- Prompts especializados para tarefas relacionadas à linguagem
- Manipuladores de assinatura personalizados para dados em tempo real
Extensões Disponíveis
Atualmente, as seguintes extensões estão disponíveis:
- Haskell: Fornece prompts especializados para desenvolvimento Haskell, incluindo orientação para exploração de buracos tipados
Usando Extensões
As extensões são carregadas automaticamente quando você especifica um ID de idioma ao iniciar o servidor:
npx tritlo/lsp-mcp haskell /path/to/haskell-language-server-wrapper lsp
Namespacing de Extensões
Todos os recursos fornecidos por extensões são namespaced com o ID do idioma. Por exemplo, o prompt de buraco tipado da extensão Haskell está disponível como haskell.typed-hole-use.
Criando Novas Extensões
Para criar uma nova extensão:
-
Crie um novo arquivo TypeScript em
src/extensions/nomeado após sua linguagem (por exemplo,typescript.ts) -
Implemente a interface Extension com qualquer uma dessas funções opcionais:
getToolHandlers(): Fornecer implementações de ferramentas personalizadasgetToolDefinitions(): Definir ferramentas personalizadas na API MCPgetResourceHandlers(): Implementar manipuladores de recursos personalizadosgetSubscriptionHandlers(): Implementar manipuladores de assinatura personalizadosgetUnsubscriptionHandlers(): Implementar manipuladores de cancelamento de assinatura personalizadosgetResourceTemplates(): Definir modelos de recursos personalizadosgetPromptDefinitions(): Definir prompts personalizados para tarefas de linguagemgetPromptHandlers(): Implementar manipuladores de prompts personalizados
-
Exporte suas funções de implementação
O sistema de extensões carregará automaticamente sua extensão quando o ID de idioma correspondente for especificado.
Agradecimentos
- Equipe HLS pela implementação do Language Server Protocol
- Anthropic pela especificação do Model Context Protocol