Skip to main content
Glama

LSP MCP 服务器

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

概述

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

  1. 启动连接到 LSP 服务器的 LSP 客户端

  2. 公开向 LSP 服务器发送请求的 MCP 工具

  3. 以法学硕士 (LLM) 能够理解和使用的格式返回结果

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

Related MCP server: Model Context Provider (MCP) Server

配置:

{ "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 :重新启动 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 文件进行分析

  • 获取函数和类型的悬停信息

  • 获取代码完成建议

  • 获取诊断错误消息

  • 获取错误的代码操作

测试项目位于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 及更高版本开始,在使用任何 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. 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 工具:

获取位置信息

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

参数:

  • 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 } }

获取完成信息

获取文件中特定位置的完成建议。

参数:

  • file_path :文件路径

  • language_id :文件所用的编程语言(例如“haskell”)

  • line :行号

  • column :列位置

例子:

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

获取代码操作

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

参数:

  • 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 } }

启动_lsp

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

参数:

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

例子:

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

重启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" } }

打开文档

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

参数:

  • file_path :要打开的文件路径

  • language_id :文件所用的编程语言(例如“haskell”)

例子:

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

关闭文档

使用完毕后,关闭 LSP 服务器中的文件。这有助于管理资源和清理。

参数:

  • file_path :要关闭的文件路径

例子:

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

获取诊断

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

参数:

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

特定文件的示例:

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

所有打开文件的示例:

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

设置日志级别

设置服务器的日志记录级别来控制日志消息的详细程度。

参数:

  • 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 扩展的 typed-hole 提示符的命名空间为haskell.typed-hole-use

创建新的扩展

要创建新的扩展:

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

  2. 使用以下任意可选函数实现扩展接口:

    • getToolHandlers() :提供自定义工具实现

    • getToolDefinitions() :在 MCP API 中定义自定义工具

    • getResourceHandlers() :实现自定义资源处理程序

    • getSubscriptionHandlers() :实现自定义订阅处理程序

    • getUnsubscriptionHandlers() :实现自定义取消订阅处理程序

    • getResourceTemplates() :定义自定义资源模板

    • getPromptDefinitions() :定义语言任务的自定义提示

    • getPromptHandlers() :实现自定义提示处理程序

  3. 导出您的实现函数

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

致谢

  • HLS 团队负责语言服务器协议的实现

  • Anthropic 的模型上下文协议规范

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Tritlo/lsp-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server