首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
首页
学习
活动
专区
圈层
工具
MCP广场
MCP广场 >详情页
lsp-mcp2025-06-130分享
github
通过语言服务器协议接口连接大型语言模型,使LLM能够访问LSP的悬停信息、补全、诊断和代码操作,从而改进代码建议。
By Tritlo
2025-06-130
github
详情内容

LSP MCP 服务器

一个用于与语言服务器协议(LSP)接口交互的模型上下文协议(MCP)服务器。
该服务器充当桥梁,使大型语言模型(LLMs)能够查询LSP的悬停提示和代码补全提供程序。

概述

MCP服务器的工作原理:

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

这使得LLMs能够利用LSP提供更准确的代码建议。

配置:

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "tritlo/lsp-mcp",
        "<语言ID>",
        "<LSP路径>",
        "<LSP参数>"
      ]
    }
  }
}

功能

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服务器

  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 <语言> /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. 通过notifications/message方法向客户端发送MCP通知

查看调试日志

要进行详细调试,您可以:

  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

在不重启MCP服务器的情况下重启LSP服务器进程。这对于从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,感谢他们提供了模型上下文协议规范
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档