语言服务器协议MCP服务

一个将语言服务器协议(LSP)功能与Claude集成的MCP服务器,提供跨编程语言的智能代码分析、导航和开发辅助功能。

  • by axivo
  • TypeScript
  • 本地部署
  • 27 星标
  • 更新于
在 GitHub 查看 axivo/mcp-lsp

使用说明

语言服务器协议MCP服务器

一个全面的MCP(模型上下文协议)服务器,将语言服务器协议(LSP)功能与Claude连接起来,实现跨多种编程语言的智能代码分析、导航和开发协助。

特性

核心能力

  • 多语言支持:Go、Helm、Kotlin、Python、Terraform、TypeScript和 更多
  • 智能代码分析:符号定义、引用、实现和类型层次结构
  • 高级导航:调用层次结构、文档符号和工作区范围内的符号搜索
  • 代码智能:悬停信息、补全、签名帮助和嵌入提示
  • 格式化和重构:文档格式、范围格式和代码操作建议
  • 项目管理:具有全面文件索引的多项目工作区支持

安全与性能

  • 进程隔离:每个语言服务器都在具有适当生命周期管理的隔离进程中运行
  • 速率限制:可配置的请求限制(默认值:100个请求/分钟)
  • 资源管理:并发文件读取限制和优雅的关机处理
  • 错误恢复:具有自动服务器重启功能的强大错误处理

语言服务器设置

先决条件

MCP服务器基础是建立在经过实战测试的基础上的 vscode-jsonrpc 和 vscode-languageserver-protocol 库,提供与所有VSCode的兼容性 语言服务器.安装示例 Kotlin 语言服务器:

brew install JetBrains/utils/kotlin-lsp

配置文件

创建一个MCP服务器配置文件,定义您的语言服务器和项目。

[!注意] A. lsp.json 提供了一个包含流行开发语言和多个项目的配置示例作为入门指南。

语言服务器配置具有以下格式:

{
  "servers": {
    "language-id": {                                # Required unique language identifier
      "command": "language-server-binary",          # Required language server binary
      "args": [                                     # Optional language server arguments
        "--stdio"
      ],
      "configuration": {},                          # Optional language server configuration
      "env": {},                                    # Optional environment variables
      "extensions": [                               # Required language server extensions
        ".extension"
      ],
      "init": [],                                   # Optional language server initialization commands
      "projects": [                                 # Required language server list of projects
        {
          "name": "project-name",                   # Required unique project name
          "description": "A description",           # Optional description
          "url": "https://github.com/org/project",  # Optional project URL
          "path": "/Users/username/github/project"  # Required project local path
          "patterns": {                             # Optional exclude or include patterns
            "exclude": [
              "**/directory",
              "**/file.extension"
            ],
            "include": [
              "**/directory",
              "**/file.extension"
            ],
          }
        }
      ],
      "settings": {                                 # Optional language server settings
        "maxConcurrentFileReads": 10,
        "messageRequest": true,
        "preloadFiles": true,
        "rateLimitMaxRequests": 100,
        "rateLimitWindowMs": 60000,
        "registrationRequest": true,
        "shutdownGracePeriodMs": 100,
        "timeoutMs": 600000,
        "workspace": true
      }
    }
  }
}

可选语言服务器配置

语言服务器通常需要特定的配置才能最佳运行。配置要求记录在每台服务器的 官方存储库.

例如, pyright-langserver 需要以下设置:

"configuration": {
  "settings": {
    "python": {
      "analysis": {
        "autoSearchPaths": true,
        "diagnosticMode": "workspace"
      }
    }
  }
}

可选语言服务器设置

这些设置控制LSP协议行为和服务器兼容性:

  • maxConcurrentFileReads -打开项目文件时并发读取的最大文件数,控制项目初始化期间的内存使用和性能(默认值: 10)
  • messageRequest -控制语言服务器是否可以发送 window/showMessage 请求显示用户对话框,禁用无头操作或自动化环境(默认: true)
  • preloadFiles -控制是在项目初始化期间还是之后加载项目文件(默认值: true)
  • rateLimitMaxRequests -每个速率限制窗口允许的最大请求数,防止语言服务器因太多并发请求而不堪重负(默认值: 100)
  • rateLimitWindowMs -速率限制的时间窗口(以毫秒为单位),请求在此滑动窗口内计数(默认值: 60000 -1分钟)
  • registrationRequest -控制语言服务器是否可以发送 client/registerCapability 请求动态注册功能,对于忽略客户端功能声明的服务器禁用(默认: true)
  • shutdownGracePeriodMs -在发送关闭请求后强制终止进程之前等待的时间(毫秒),允许语言服务器完成清理操作(默认值: 100)
  • timeoutMs -等待语言服务器初始化的最长时间(毫秒),防止挂在无响应的服务器上(默认值: 600000 -10分钟)
  • workspace -控制语言服务器初始化是否发送 workspace/symbol 测试工作区功能的请求,对于不支持工作区操作或导致初始化失败的服务器禁用(默认值: true)

可选语言服务器项目文件模式

文件模式使用 fast-glob 语法。默认情况下 . 点前缀, __ 双下划线前缀, bin, build, cache, coverage, dist, docs, excludes, log, node_modules, obj, out, target, temp, tests, tmp, vendor 和 venv 目录被排除在外。使用 include 或 exclude 用于管理特定目录或文件的模式(例如。, **/dist, **/dist/**/*.d.ts, **/*.test.js).

MCP服务器配置

添加到您的 mcp.json MCP服务器配置:

{
  "mcpServers": {
    "language-server": {
      "command": "npx",
      "args": [
        "-y",
        "@axivo/mcp-lsp"
      ],
      "env": {
        "LSP_FILE_PATH": "/Users/username/github/mcp-lsp/.claude/lsp.json"
      }
    }
  }
}

环境变量

  • LSP_FILE_PATH -LSP服务器配置JSON文件的绝对路径

多语言服务器使用情况

同时运行多个语言服务器以分析不同的项目:

✅ ansible (k3s-cluster) + typescript (k3s-cluster-actions)
✅ go (helm) + kotlin (ktor) + python (fastapi)

语言服务器只能运行 一次一个项目:

❌ typescript (mcp-lsp) + typescript (typescript-sdk)

要切换项目,请使用所需的项目名称重新启动语言服务器。

入门指南

请Claude解释LSP工具的工作原理:

  • 使用以下命令启动TypeScript语言服务器 typescript-sdk 项目并检查服务器功能。
  • 请解释LSP工具如何帮助您理解和审查源代码。

要开始执行代码审查,请让Claude:

  • 使用以下命令启动TypeScript语言服务器 typescript-sdk 项目并检查服务器功能。
  • 阅读 /Users/username/github/mcp-lsp/.claude/templates/code-review.md 模板预先代码审查。
  • 使用LSP工具对项目源代码进行详细审查,并告诉我您的发现。

[!注意] 语言服务器的启动时间因语言和项目大小而异,对于包含数千个文件的项目,通常为几秒钟。一些语言服务器,如 Kotlin 初始化大型项目可能需要几分钟的时间。增加 timeoutMs 如果达到默认超时,则相应地设置值。

克劳德的评论

A. 公开会议 使用 开发者 profile演示了LSP工具的功能,并解释了与传统的基于文本的搜索方法相比,语义分析如何为编译器提供准确的理解。

工作流模板

查看可用 模板 Claude可用于系统开发工作流。

MCP工具

服务器管理工具

  1. start_server

    • 通过项目选择启动语言服务器
    • 输入: language_id, project (可选)
    • 返回:带有进程信息的服务器启动确认
  2. stop_server

    • 停止正常运行语言服务器
    • 输入: language_id
    • 返回:带有清理详细信息的关机确认
  3. restart_server

    • 使用可选项目选择重新启动语言服务器
    • 输入: language_id, project
    • 返回:使用新流程信息重新启动确认
  4. get_server_status

    • 检查语言服务器的运行状态
    • 输入: language_id (可选)
    • 返回:详细状态,包括正常运行时间、项目关联和运行状况
  5. get_server_capabilities

    • 获取语言服务器功能和工具映射
    • 输入: language_id
    • 返回:包含可用MCP工具映射的全面功能列表
  6. get_server_projects

    • 列出语言服务器的可用项目
    • 输入: language_id
    • 返回:包含路径和描述的已配置项目数组

项目和工作区工具

  1. get_project_files

    • 列出项目工作区中所有带分页的文件
    • 输入: language_id, project, limit (可选), offset (可选)
    • 返回:带路径的项目文件分页列表
  2. get_project_symbols

    • 使用分页在整个项目工作区中搜索符号
    • 输入: language_id, project, query, limit (可选), offset (可选), timeout (可选)
    • 返回:分页工作区符号搜索结果

代码分析工具

  1. get_hover

    • 在光标位置显示类型信息和文档
    • 输入: file_path, line, character
    • 返回:类型信息、文档和上下文详细信息
  2. get_symbol_definitions

    • 导航到最初定义符号的位置
    • 输入: file_path, line, character
    • 返回:包含文件路径和位置的定义位置数组
  3. get_symbol_references

    • 查找使用或引用符号的所有位置
    • 输入: file_path, line, character, include_declaration (可选)
    • 返回:整个工作区的参考位置数组
  4. get_implementations

    • 查找实现接口或抽象方法的所有位置
    • 输入: file_path, line, character
    • 返回:具体实现位置数组
  5. get_type_definitions

    • 导航到定义符号类型的位置
    • 输入: file_path, line, character
    • 返回:类型定义位置数组

导航工具

  1. get_call_hierarchy

    • 构建显示呼叫者和被呼叫者关系的呼叫层次结构
    • 输入: file_path, line, character
    • 返回:调用层次结构准备数据
  2. get_incoming_calls

    • 显示调用此符号的所有函数
    • 输入: item (来自get_call_hierchy)
    • 返回值:传入呼叫关系数组
  3. get_outgoing_calls

    • 显示此符号调用的所有函数
    • 输入: item (来自get_call_hierchy)
    • 返回值:呼出关系数组
  4. get_type_hierarchy

    • 构建显示继承关系的类型层次结构
    • 输入: file_path, line, character
    • 返回:类型层次结构准备数据
  5. get_supertypes

    • 查找此类型继承的所有父类型
    • 输入: item (来自get_type_hierchy)
    • 返回:父类型项的数组
  6. get_subtypes

    • 查找从该类型继承的所有子类型
    • 输入: item (来自get_type_hierchy)
    • 返回:派生类型项的数组

代码智能工具

  1. get_completions

    • 在光标位置获取补全和自动建议
    • 输入: file_path, line, character
    • 返回:包含文档的完成建议数组
  2. get_resolves

    • 解决完成项的其他详细信息
    • 输入: file_path, item (从get_completions开始)
    • 返回:扩展完成信息和文档
  3. get_signature

    • 在光标位置显示函数参数和签名帮助
    • 输入: file_path, line, character
    • 返回:函数签名信息和参数详细信息
  4. get_inlay_hints

    • 在代码范围中显示内联类型注释和参数提示
    • 输入: file_path, start_line, start_character, end_line, end_character
    • 返回:内联类型提示和注释数组
  5. get_inlay_hint

    • 解决镶嵌提示项的其他详细信息
    • 输入: file_path, item (来自get_lay_hints)
    • 返回:扩展嵌体提示信息

文档工具

  1. get_symbols

    • 按页码列出文档中的所有符号
    • 输入: file_path, limit (可选), offset (可选)
    • 返回:带有函数、类、变量的分页文档大纲
  2. get_highlights

    • 突出显示光标位置出现的所有符号
    • 输入: file_path, line, character
    • 返回:符号高亮显示范围数组
  3. get_folding_ranges

    • 识别代码编辑器折叠的可折叠代码段
    • 输入: file_path
    • 返回:可折叠代码范围数组
  4. get_colors

    • 从文档中提取颜色定义和参考
    • 输入: file_path
    • 返回值:颜色值及其位置的数组
  5. get_diagnostics

    • 从文档中获取错误、警告和诊断
    • 输入: file_path
    • 返回:包含严重性、消息和位置的诊断数组
  6. get_links

    • 从文档中提取可点击的链接和引用
    • 输入: file_path
    • 返回:文档链接和引用数组
  7. get_link_resolves

    • 解析文档链接项的目标URL
    • 输入: file_path, item (来自get_links)
    • 返回:已解析的链接目标信息
  8. get_semantic_tokens

    • 提取详细的语法标记以进行高级突出显示和分析
    • 输入: file_path
    • 返回:具有类型和修饰符的语义标记数据

格式化和编辑工具

  1. get_format

    • 使用语言服务器规则格式化整个文档
    • 输入: file_path
    • 返回:已应用样式规则的格式化文档文本
  2. get_range_format

    • 使用语言服务器规则设置特定代码范围的格式
    • 输入: file_path, start_line, start_character, end_line, end_character
    • 返回:应用样式规则的格式化范围
  3. get_code_actions

    • 在光标位置获取自动代码修复和重构建议
    • 输入: file_path, line, character
    • 返回:可用代码操作和快速修复的数组
  4. get_code_resolves

    • 解决代码操作项的其他详细信息
    • 输入: file_path, item (来自get_code_actions)
    • 返回:完成工作区编辑的代码操作
  5. get_selection_range

    • 将选择范围扩展到逻辑代码边界
    • 输入: file_path, line, character
    • 返回:扩展的选择范围数组
  6. get_linked_editing_range

    • 查找应同时编辑的相关范围
    • 输入: file_path, line, character
    • 返回:同步更新的链接编辑范围
  7. get_symbol_renames

    • 预览所有将用符号重命名的位置
    • 输入: file_path, line, character, new_name
    • 返回:用于符号重命名的工作区编辑预览