LSP MCP Server

LSP MCP Server

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

Category
访问服务器

README

LSP MCP 服务器

一个用于与 LSP (语言服务器协议) 接口交互的 MCP (模型上下文协议) 服务器。 此服务器充当桥梁,允许 LLM 查询 LSP Hover 和 Completion 提供程序。

概述

MCP 服务器的工作原理:

  1. 启动一个连接到 LSP 服务器的 LSP 客户端
  2. 公开向 LSP 服务器发送请求的 MCP 工具
  3. 以 LLM 可以理解和使用的格式返回结果

这使 LLM 能够利用 LSP 获得更准确的代码建议。

配置:

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "tritlo/lsp-mcp",
        "<language-id>",
        "<lsp-path>",
        "<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: 重新启动 LSP 服务器,而不重新启动 MCP 服务器
  • 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 文件进行分析
  • 获取函数和类型的悬停信息
  • 获取代码完成建议
  • 获取诊断错误消息
  • 获取错误的 code action

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

用法

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

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 及更高版本开始,您必须通过调用 start_lsp 工具显式启动 LSP 服务器,然后才能使用任何 LSP 功能。 这可确保使用正确的根目录进行正确初始化,这在使用 npx 等工具时尤其重要:

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

日志记录

该服务器包括一个综合日志记录系统,具有 8 个严重性级别:

  • debug: 用于调试目的的详细信息
  • info: 关于系统操作的常规信息消息
  • notice: 重要的操作事件
  • warning: 可能需要注意的潜在问题
  • error: 影响操作但不停止系统的错误情况
  • critical: 需要立即注意的紧急情况
  • alert: 系统处于不稳定状态
  • emergency: 系统不可用

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

  1. 带有颜色编码的控制台输出,以提高可读性
  2. 通过 MCP 通知发送到客户端(通过 notifications/message 方法)

查看调试日志

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

  1. 运行 Claude 时使用 claude --mcp-debug 标志来查看 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: 要设置的日志记录级别。 以下之一:debuginfonoticewarningerrorcriticalalertemergency

示例:

{
  "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:// 资源以获得更 RESTful 的方法。

两种方法都以相同的格式提供相同的数据,并强制执行相同的文件必须首先打开的要求。

故障排除

  • 如果服务器无法启动,请确保 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 的模型上下文协议规范

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选