L

LSP桥接器

@Tritlo/lsp-mcp
0 Stars 135 次浏览 Tritlo 更新于 2026-08-23

通过语言服务器协议接口连接大型语言模型,使LLM能够访问LSP的悬停信息、补全、诊断和代码操作,从而改进代码建议。

该服务暂未提供标准配置,请参考 README 手动接入

服务介绍

LSP MCP 服务器

一个用于与 LSP(语言服务器协议)接口交互的 MCP(模型上下文协议)服务器。该服务器充当桥梁,允许大型语言模型查询 LSP 的悬停和补全提供者。

概述

MCP 服务器的工作原理如下:

  1. 启动连接到 LSP 服务器的 LSP 客户端
  2. 提供发送请求到 LSP 服务器的 MCP 工具
  3. 以大型语言模型可以理解和使用的格式返回结果

这使得大型语言模型能够利用 LSP 来获得更准确的代码建议。

配置:

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

特性

MCP 工具

  • get_info_on_location: 获取文件中特定位置的悬停信息
  • get_completions: 获取文件中特定位置的补全建议
  • get_code_actions: 获取文件中特定范围的代码操作
  • open_document: 在 LSP 服务器中打开文件进行分析
  • close_document: 在 LSP 服务器中关闭文件
  • get_diagnostics: 获取打开文件的诊断消息(错误、警告)
  • start_lsp: 使用指定的根目录启动 LSP 服务器
  • restart_lsp_server: 不重启 MCP 服务器的情况下重启 LSP 服务器
  • set_log_level: 在运行时更改服务器的日志详细级别

MCP 资源

  • lsp-diagnostics:// 资源,用于通过订阅实时更新访问诊断消息
  • lsp-hover:// 资源,用于在文件特定位置检索悬停信息
  • lsp-completions:// 资源,用于在特定位置获取代码补全建议

其他特性

  • 具有多种严重性级别的全面日志系统
  • 带有颜色的控制台输出,以便更好地阅读
  • 运行时可配置的日志级别
  • 详细的错误处理和报告
  • 简单的命令行界面

前提条件

  • Node.js (v16 或更高版本)
  • npm

对于演示服务器:

  • GHC (8.10 或更高版本)
  • Cabal (3.0 或更高版本)

安装

构建 MCP 服务器

  1. 克隆此仓库:

    git clone https://github.com/your-username/lsp-mcp.git
    cd lsp-mcp
    
  2. 安装依赖项:

    npm install
    
  3. 构建 MCP 服务器:

    npm run build
    

测试

项目包括针对 TypeScript LSP 支持的集成测试。这些测试验证 LSP-MCP 服务器是否正确处理了 LSP 操作,如悬停信息、补全、诊断和代码操作。

运行测试

要运行 TypeScript LSP 测试:

npm test

或具体地:

npm run test:typescript

测试覆盖率

测试验证以下功能:

  • 使用模拟项目初始化 TypeScript LSP
  • 打开 TypeScript 文件进行分析
  • 获取函数和类型的悬停信息
  • 获取代码补全建议
  • 获取诊断错误消息
  • 获取错误的代码操作

测试项目位于 test/ts-project/ 中,并包含有意设置错误的 TypeScript 文件,以测试诊断反馈。

使用方法

运行 MCP 服务器时,提供 LSP 可执行文件的路径以及要传递给 LSP 服务器的任何参数:

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

例如:

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

重要:启动 LSP 服务器

从版本 0.2.0 开始,您必须在使用任何 LSP 功能之前通过调用 start_lsp 工具显式地启动 LSP 服务器。这确保了使用正确的根目录进行适当的初始化,尤其是在使用像 npx 这样的工具时尤为重要:

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

日志记录

服务器包括一个全面的日志系统,具有8个严重级别:

  • debug:用于调试目的的详细信息
  • info:关于系统操作的一般信息消息
  • notice:重要的操作事件
  • warning:可能需要注意的潜在问题
  • error:影响操作但不会停止系统的错误条件
  • critical:需要立即关注的关键条件
  • alert:系统处于不稳定状态
  • emergency:系统无法使用

默认情况下,日志会被发送到:

  1. 控制台输出,并带有颜色编码以便于阅读
  2. 通过 notifications/message 方法发送给客户端的 MCP 通知

查看调试日志

对于详细的调试,您可以:

  1. 使用 claude --mcp-debug 标志运行 Claude 以查看 Claude 和服务器之间所有的 MCP 流量:

    claude --mcp-debug
    
  2. 使用 set_log_level 工具在运行时更改日志级别:

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

默认的日志级别是 info,它显示中等的操作细节同时过滤掉冗长的调试消息。

API

服务器提供了以下 MCP 工具:

get_info_on_location

获取文件特定位置的悬停信息。

参数:

  • file_path:文件路径
  • language_id:文件所用的编程语言(如 "haskell")
  • line:行号
  • column:列位置

示例:

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

get_completions

获取文件特定位置的补全建议。

参数:

  • file_path:文件路径
  • language_id:文件所用的编程语言(如 "haskell")
  • line:行号
  • column:列位置

示例:

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

get_code_actions

获取文件特定范围内的代码操作。

参数:

  • file_path:文件路径
  • language_id:文件所用的编程语言(如 "haskell")
  • start_line:起始行号
  • start_column:起始列位置
  • end_line:结束行号
  • end_column:结束列位置

示例:

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

使用指定的根目录启动 LSP 服务器。在使用任何其他与 LSP 相关的工具之前,必须先调用此命令。

参数:

  • root_dir:LSP 服务器的根目录(推荐使用绝对路径)

示例:

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

restart_lsp_server

重启 LSP 服务器进程而不重启 MCP 服务器。这在从 LSP 服务器问题中恢复或应用 LSP 服务器配置更改时非常有用。

参数:

  • root_dir: (可选) LSP 服务器的根目录。如果提供,服务器将在重启后使用此目录进行初始化。

不带 root_dir 的示例(使用先前设置的根目录):

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

带 root_dir 的示例:

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

open_document

在 LSP 服务器中打开文件以进行分析。在访问诊断信息或对文件执行其他操作之前必须调用此命令。

参数:

  • file_path: 要打开的文件路径
  • language_id: 文件所用的编程语言(例如 "haskell")

示例:

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

close_document

完成对文件的操作后,在 LSP 服务器中关闭该文件。这有助于管理资源和清理。

参数:

  • file_path: 要关闭的文件路径

示例:

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

get_diagnostics

获取一个或所有打开文件的诊断消息(错误、警告)。

参数:

  • file_path: (可选) 要获取诊断信息的文件路径。如果不提供,则返回所有打开文件的诊断信息。

针对特定文件的示例:

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

针对所有打开文件的示例:

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

set_log_level

设置服务器的日志级别,以控制日志消息的详细程度。

参数:

  • level: 要设置的日志级别。其中之一:debug, info, notice, warning, error, critical, alert, emergency

示例:

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

MCP 资源

除了工具外,服务器还提供了访问 LSP 功能的资源,包括诊断信息、悬停信息和代码补全:

诊断资源

服务器通过 lsp-diagnostics:// 资源方案暴露诊断信息。这些资源可以订阅,以便在诊断信息发生变化时获得实时更新。

资源 URI:

  • lsp-diagnostics:// - 所有打开文件的诊断信息
  • lsp-diagnostics:///path/to/file - 特定文件的诊断信息

重要提示:在访问诊断信息之前,必须使用 open_document 工具打开文件。

悬停信息资源

服务器通过 lsp-hover:// 资源方案暴露悬停信息。这允许您获取文件中特定位置的代码元素信息。

资源 URI 格式:

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

参数:

  • line: 行号(基于 1)
  • column: 列位置(基于 1)
  • language_id: 编程语言(例如 "haskell")

示例:

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

代码补全资源

服务器通过 lsp-completions:// 资源方案暴露代码补全建议。这允许您获取文件中特定位置的补全候选。

资源 URI 格式:

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

参数:

  • line: 行号(基于 1)
  • column: 列位置(基于 1)
  • language_id: 编程语言(例如 "haskell")

示例:

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

列出可用资源

要发现可用资源,请使用 MCP resources/list 端点。响应将包括当前打开文件的所有可用资源,包括:

  • 所有打开文件的诊断资源
  • 所有打开文件的悬停信息模板
  • 所有打开文件的代码补全模板

订阅资源更新

诊断资源支持订阅,以便在诊断更改时(例如,当文件被修改并且出现新的错误或警告时)接收实时更新。使用 MCP resources/subscribe 端点订阅诊断资源。

注意:悬停和补全资源不支持订阅,因为它们代表的是即时查询。

使用资源与工具

您可以选择两种方法来访问 LSP 功能:

  1. 基于工具的方法:使用 get_diagnosticsget_info_on_locationget_completions 工具以简单直接的方式获取信息。
  2. 基于资源的方法:使用 lsp-diagnostics://lsp-hover://lsp-completions:// 资源以更符合 REST 风格的方式来访问。

这两种方法都提供相同格式的数据,并且都需要先打开文件。

故障排除

  • 如果服务器启动失败,请确保 LSP 可执行文件的路径正确
  • 检查日志文件(如果已配置)以获取详细的错误消息

许可证

MIT 许可证

扩展

LSP-MCP 服务器支持特定于语言的扩展,这些扩展增强了其对不同编程语言的支持能力。扩展可以提供:

  • 自定义的 LSP 特定工具和功能
  • 特定于语言的资源处理程序和模板
  • 专用于语言相关任务的提示
  • 用于实时数据的自定义订阅处理程序

可用扩展

目前,以下扩展可用:

  • Haskell:为 Haskell 开发提供专门的提示,包括类型洞探索指导

使用扩展

当您在启动服务器时指定语言 ID 时,扩展将自动加载:

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

扩展命名空间

所有由扩展提供的功能都以其语言 ID 作为命名空间。例如,Haskell 扩展的类型洞提示可通过 haskell.typed-hole-use 获取。

创建新扩展

要创建一个新的扩展:

  1. src/extensions/ 目录下创建一个新的 TypeScript 文件,并以你的语言命名(例如,typescript.ts

  2. 实现 Extension 接口,可以选择实现以下任意函数:

    • getToolHandlers(): 提供自定义工具实现
    • getToolDefinitions(): 在 MCP API 中定义自定义工具
    • getResourceHandlers(): 实现自定义资源处理器
    • getSubscriptionHandlers(): 实现自定义订阅处理器
    • getUnsubscriptionHandlers(): 实现自定义取消订阅处理器
    • getResourceTemplates(): 定义自定义资源模板
    • getPromptDefinitions(): 为语言任务定义自定义提示
    • getPromptHandlers(): 实现自定义提示处理器
  3. 导出你的实现函数

当指定了匹配的语言 ID 时,扩展系统会自动加载你的扩展。

致谢

  • HLS 团队提供了语言服务器协议的实现
  • Anthropic 提供了模型上下文协议的规范

相关 MCP 服务