返回市场
语言服务提供商-MCP

语言服务提供商-MCP

作者:Tritlo87 星标更新:2025-07-22

项目介绍

LSP MCP 服务器

LSP(语言服务器协议)接口交互的MCP(模型上下文协议)服务器。 此服务器充当桥梁,允许LLMs查询LSP Hover和Completion提供者。

概述

MCP服务器的工作方式如下:

  1. 启动连接到LSP服务器的LSP客户端
  2. 提供发送请求到LSP服务器的MCP工具
  3. 返回LLMs可以理解和使用的格式结果

这使LLMs能够利用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 服务器

  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. 通过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": 10
  }
}

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: 要设置的日志级别。其中一个: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功能:

  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. 实现扩展接口,包含以下任一可选函数:

    • getToolHandlers(): 提供自定义工具实现
    • getToolDefinitions(): 在MCP API中定义自定义工具
    • getResourceHandlers(): 实现自定义资源处理器
    • getSubscriptionHandlers(): 实现自定义订阅处理器
    • getUnsubscriptionHandlers(): 实现自定义取消订阅处理器
    • getResourceTemplates(): 定义自定义资源模板
    • getPromptDefinitions(): 定义语言任务的自定义提示
    • getPromptHandlers(): 实现自定义提示处理器
  3. 导出您的实现函数

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

致谢

  • HLS团队为语言服务器协议的实现
  • Anthropic为模型上下文协议规范