LSP MCP 服务器
用于与 LSP(语言服务器协议)接口交互的 MCP(模型上下文协议)服务器。该服务器充当桥梁,允许 LLM 查询 LSP 悬停和完成提供程序。
概述
MCP 服务器的工作原理如下:
启动连接到 LSP 服务器的 LSP 客户端
公开向 LSP 服务器发送请求的 MCP 工具
以法学硕士 (LLM) 能够理解和使用的格式返回结果
这使得 LLM 能够利用 LSP 获得更准确的代码建议。
Related MCP server: Model Context Provider (MCP) Server
配置:
特征
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 服务器
克隆此存储库:
git clone https://github.com/your-username/lsp-mcp.git cd lsp-mcp安装依赖项:
npm install构建 MCP 服务器:
npm run build
测试
该项目包含针对 TypeScript LSP 支持的集成测试。这些测试验证 LSP-MCP 服务器是否能够正确处理 LSP 操作,例如悬停信息、补全、诊断和代码操作。
运行测试
要运行 TypeScript LSP 测试:
或者具体来说:
测试覆盖率
测试验证了以下功能:
使用模拟项目初始化 TypeScript LSP
打开 TypeScript 文件进行分析
获取函数和类型的悬停信息
获取代码完成建议
获取诊断错误消息
获取错误的代码操作
测试项目位于test/ts-project/中,包含带有故意错误的 TypeScript 文件以测试诊断反馈。
用法
通过提供 LSP 可执行文件的路径以及传递给 LSP 服务器的任何参数来运行 MCP 服务器:
例如:
重要:启动 LSP 服务器
从 0.2.0 及更高版本开始,在使用任何 LSP 功能之前,必须通过调用start_lsp工具显式启动 LSP 服务器。这可以确保使用正确的根目录进行正确的初始化,这在使用 npx 等工具时尤为重要:
日志记录
该服务器包括一个具有 8 个严重级别的综合日志系统:
debug:用于调试的详细信息info:有关系统操作的一般信息消息notice:重大运营事件warning:可能需要注意的潜在问题error:影响操作但不停止系统的错误情况critical:需要立即关注的危急情况alert:系统处于不稳定状态emergency:系统无法使用
默认情况下,日志将发送至:
控制台输出采用颜色编码以提高可读性
MCP 通知客户端(通过
notifications/message方法)
查看调试日志
对于详细调试,您可以:
运行 Claude 时使用
claude --mcp-debug标志来查看 Claude 和服务器之间的所有 MCP 流量:claude --mcp-debug使用
set_log_level工具在运行时更改日志级别:{ "tool": "set_log_level", "arguments": { "level": "debug" } }
默认日志级别为info ,它显示中等操作细节,同时过滤掉详细的调试消息。
API
该服务器提供以下 MCP 工具:
获取位置信息
获取文件中特定位置的悬停信息。
参数:
file_path:文件路径language_id:文件所用的编程语言(例如“haskell”)line:行号column:列位置
例子:
获取完成信息
获取文件中特定位置的完成建议。
参数:
file_path:文件路径language_id:文件所用的编程语言(例如“haskell”)line:行号column:列位置
例子:
获取代码操作
获取文件中特定范围的代码操作。
参数:
file_path:文件路径language_id:文件所用的编程语言(例如“haskell”)start_line:起始行号start_column:起始列位置end_line:结束行号end_column:结束列位置
例子:
启动_lsp
启动指定根目录的 LSP 服务器。在使用任何其他 LSP 相关工具之前,必须先调用此函数。
参数:
root_dir:LSP 服务器的根目录(建议使用绝对路径)
例子:
重启lsp_server
重启 LSP 服务器进程,无需重启 MCP 服务器。这对于恢复 LSP 服务器问题或应用 LSP 服务器配置更改非常有用。
参数:
root_dir:(可选)LSP 服务器的根目录。如果指定,服务器重启后将以此目录进行初始化。
没有 root_dir 的示例(使用之前设置的根目录):
root_dir 的示例:
打开文档
打开 LSP 服务器中的文件进行分析。在访问诊断信息或对文件执行其他操作之前,必须调用此函数。
参数:
file_path:要打开的文件路径language_id:文件所用的编程语言(例如“haskell”)
例子:
关闭文档
使用完毕后,关闭 LSP 服务器中的文件。这有助于管理资源和清理。
参数:
file_path:要关闭的文件路径
例子:
获取诊断
获取一个或所有打开文件的诊断消息(错误、警告)。
参数:
file_path:(可选)需要获取诊断信息的文件路径。若未提供,则返回所有打开文件的诊断信息。
特定文件的示例:
所有打开文件的示例:
设置日志级别
设置服务器的日志记录级别来控制日志消息的详细程度。
参数:
level:要设置的日志级别。以下之一:debug、info、notice、warning、error、critical、alert、emergency。
例子:
MCP 资源
除了工具之外,服务器还提供访问 LSP 功能的资源,包括诊断、悬停信息和代码完成:
诊断资源
服务器通过lsp-diagnostics://资源方案公开诊断信息。您可以订阅这些资源,以便在诊断信息发生变化时获得实时更新。
资源 URI:
lsp-diagnostics://- 对所有打开的文件进行诊断lsp-diagnostics:///path/to/file- 针对特定文件的诊断
重要提示:必须先使用open_document工具打开文件,然后才能访问诊断信息。
悬停信息资源
服务器通过lsp-hover://资源方案公开悬停信息。这允许您获取文件中特定位置的代码元素信息。
资源URI格式:
参数:
line:行号(从 1 开始)column:列位置(从 1 开始)language_id:编程语言(例如“haskell”)
例子:
代码完成资源
服务器通过lsp-completions://资源方案提供代码补全建议。这允许您获取文件中特定位置的补全候选。
资源URI格式:
参数:
line:行号(从 1 开始)column:列位置(从 1 开始)language_id:编程语言(例如“haskell”)
例子:
列出可用资源
要发现可用资源,请使用 MCP resources/list端点。响应将包含当前打开文件的所有可用资源,包括:
所有打开文件的诊断资源
所有打开文件的悬停信息模板
所有打开文件的代码完成模板
订阅资源更新
诊断资源支持订阅,以便在诊断信息发生变化时(例如,文件被修改并出现新的错误或警告时)接收实时更新。使用 MCP resources/subscribe端点订阅诊断资源。
注意:悬停和完成资源不支持订阅,因为它们代表时间点查询。
使用资源与工具
您可以选择两种方法来访问 LSP 功能:
基于工具的方法:使用
get_diagnostics、get_info_on_location和get_completions工具以简单、直接的方式获取信息。基于资源的方法:使用
lsp-diagnostics://、lsp-hover://和lsp-completions://资源实现更加 RESTful 的方法。
两种方法都以相同的格式提供相同的数据,并强制执行必须先打开文件的相同要求。
故障排除
如果服务器启动失败,请确保 LSP 可执行文件的路径正确
检查日志文件(如果已配置)以获取详细的错误消息
执照
MIT 许可证
扩展
LSP-MCP 服务器支持特定语言的扩展,以增强其对不同编程语言的功能。扩展可以提供:
定制 LSP 特定的工具和功能
特定于语言的资源处理程序和模板
针对语言相关任务的专门提示
实时数据的自定义订阅处理程序
可用扩展
目前,有以下扩展可用:
Haskell :为 Haskell 开发提供专门的提示,包括类型洞探索指导
使用扩展
当您启动服务器时指定语言 ID 时,扩展会自动加载:
扩展命名空间
所有扩展提供的功能都使用语言 ID 命名空间。例如,Haskell 扩展的 typed-hole 提示符的命名空间为haskell.typed-hole-use 。
创建新的扩展
要创建新的扩展:
在
src/extensions/中创建一个以你的语言命名的新 TypeScript 文件(例如typescript.ts)使用以下任意可选函数实现扩展接口:
getToolHandlers():提供自定义工具实现getToolDefinitions():在 MCP API 中定义自定义工具getResourceHandlers():实现自定义资源处理程序getSubscriptionHandlers():实现自定义订阅处理程序getUnsubscriptionHandlers():实现自定义取消订阅处理程序getResourceTemplates():定义自定义资源模板getPromptDefinitions():定义语言任务的自定义提示getPromptHandlers():实现自定义提示处理程序
导出您的实现函数
当指定匹配的语言ID时,扩展系统将自动加载您的扩展。
致谢
HLS 团队负责语言服务器协议的实现
Anthropic 的模型上下文协议规范