LSP MCP Server

by Tritlo
Verified

local-only server

The server can only run on the client’s local machine because it depends on local resources.

Integrations

  • Provides specialized prompts for Haskell development, including typed-hole exploration guidance when working with the Haskell Language Server.

  • Supports integration with Node.js projects, allowing language models to access language server features for JavaScript and TypeScript codebases.

  • Enables interaction with TypeScript language servers to provide hover information, code completions, diagnostics, and code actions for TypeScript projects.

LSP MCP 服务器

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

概述

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

  1. 启动连接到 LSP 服务器的 LSP 客户端
  2. 公开向 LSP 服务器发送请求的 MCP 工具
  3. 以法学硕士 (LLM) 能够理解和使用的格式返回结果

这使得 LLM 能够利用 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 :重新启动 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 的模型上下文协议规范
ID: 075tkj8p1o