LSP桥接器
通过语言服务器协议接口连接大型语言模型,使LLM能够访问LSP的悬停信息、补全、诊断和代码操作,从而改进代码建议。
服务介绍
LSP MCP 服务器
一个用于与 LSP(语言服务器协议)接口交互的 MCP(模型上下文协议)服务器。该服务器充当桥梁,允许大型语言模型查询 LSP 的悬停和补全提供者。
概述
MCP 服务器的工作原理如下:
- 启动连接到 LSP 服务器的 LSP 客户端
- 提供发送请求到 LSP 服务器的 MCP 工具
- 以大型语言模型可以理解和使用的格式返回结果
这使得大型语言模型能够利用 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 服务器
-
克隆此仓库:
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 测试:
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:系统无法使用
默认情况下,日志会被发送到:
- 控制台输出,并带有颜色编码以便于阅读
- 通过
notifications/message方法发送给客户端的 MCP 通知
查看调试日志
对于详细的调试,您可以:
-
使用
claude --mcp-debug标志运行 Claude 以查看 Claude 和服务器之间所有的 MCP 流量:claude --mcp-debug -
使用
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 功能:
- 基于工具的方法:使用
get_diagnostics、get_info_on_location和get_completions工具以简单直接的方式获取信息。 - 基于资源的方法:使用
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 获取。
创建新扩展
要创建一个新的扩展:
-
在
src/extensions/目录下创建一个新的 TypeScript 文件,并以你的语言命名(例如,typescript.ts) -
实现 Extension 接口,可以选择实现以下任意函数:
getToolHandlers(): 提供自定义工具实现getToolDefinitions(): 在 MCP API 中定义自定义工具getResourceHandlers(): 实现自定义资源处理器getSubscriptionHandlers(): 实现自定义订阅处理器getUnsubscriptionHandlers(): 实现自定义取消订阅处理器getResourceTemplates(): 定义自定义资源模板getPromptDefinitions(): 为语言任务定义自定义提示getPromptHandlers(): 实现自定义提示处理器
-
导出你的实现函数
当指定了匹配的语言 ID 时,扩展系统会自动加载你的扩展。
致谢
- HLS 团队提供了语言服务器协议的实现
- Anthropic 提供了模型上下文协议的规范