mcpField
L
LSP MCP

LSP MCP

本地服务
github.com/jonrad开发工具19282 周前更新

关于 LSP MCP

LSP MCP 是一个 MCP 服务,将语言服务器协议(LSP)的能力提供给 LLM 和 AI Agent,使其能够获取代码库中的语言感知上下文。该项目目前处于 POC 阶段。

主要功能

  1. 01通过 LSP 提供语言感知的代码上下文
  2. 02同时支持多种编程语言的 LSP
  3. 03根据 LSP JSON Schema 动态生成方法
  4. 04按需启动语言服务

适用场景

  1. 01让 AI 助手分析 TypeScript 代码的变量作用域
  2. 02为 Claude Desktop 提供 TypeScript 语言服务器能力

MCP 相关

该项目是一个 MCP 服务,向 MCP 客户端暴露语言服务器的功能,使 AI 可以基于 LSP 获取代码的语义信息。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"lsp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/jonrad/lsp-mcp:0.3.1"
]
}
}
}
启动命令docker run -i --rm docker.io/jonrad/lsp-mcp:0.3.1

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocidocker.io/jonrad/lsp-mcp:0.3.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

LSP MCP

一个模型上下文协议(MCP)服务,可为大模型/AI Agent 提供语言服务器协议(LSP)服务的能力。这使 AI 能够从代码库中获取理解语言的上下文。

示例

输入:

Use lsp to give me insights into the following typescript code:

let foo = "bar";
function x() {
  let foo = 123;
  console.log(foo);
}
x();
console.log(foo);

输出:

I'll use LSP (Language Server Protocol) to analyze your TypeScript code. Let me break down what's happening:
Here's what the code does and the insights from LSP analysis:

1. Variable Shadowing:

There are two variables named foo:

A global foo (string type) initialized with the value "bar"
A local foo (number type) inside the function x() initialized with the value 123

2. Execution Flow:

First, the global foo is declared and assigned the value "bar"
When function x() is called, the local foo variable is declared and assigned 123
The console.log(foo) inside the function outputs 123 (the local variable)
After the function finishes, console.log(foo) outputs "bar" (the global variable)

3. Scope Isolation:

The LSP confirms that TypeScript correctly identifies the different types:

The global foo is a string type
The local foo inside the function is a number type

Changes to the local foo don't affect the global foo

This is a classic example of variable shadowing in JavaScript/TypeScript, where a local variable with the same name as a global variable takes precedence within its scope.

警告

目前处于概念验证(POC)阶段。

功能

  • 同时支持多个 LSP(支持多种编程语言),参见示例配置
  • 根据 LSP JSON Schema 动态生成受支持的 LSP 方法,参见 json schema

快速开始

Claude Desktop
使用 Docker(推荐)

按以下内容修改 claude_desktop_config.json(如 MCP 文档所述):

{
  "mcpServers": {
    "lsp": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "docker.io/jonrad/lsp-mcp:0.3.1"]
    }
  }
}

你可能需要通过传入 docker -v /local_dir:/remote_dir 与容器共享一些文件。然后,你就可以向 Claude 询问 /remote_dir/<filename> 中的文件。

使用 npx

注意:Claude Desktop 似乎对 npx 的支持不太稳定。有时它会提示 MCP 失败,但工具仍然可以使用。我之后会再看看这个问题 😊

{
  "mcpServers": {
    "lsp": {
      "command": "npx",
      "args": ["-y", "--silent", "git+https://github.com/jonrad/lsp-mcp", "--lsp", "npx -y --silent -p '[email protected]' -p '[email protected]' typescript-language-server --stdio"]
    }
  }
}

这将为 Claude 提供 typescript 语言服务器的 LSP 能力。你可以切换 --lsp 参数来更改语言服务器(然后重启 Claude)。

目前尚不支持同时使用多个 LSP。

Cursor

按照 Cursor 提供的说明进行操作。设置时,选择 Type = command,并将 Command 设置为上面提到的用于 claude 的 docker run ...(例如 docker run -i --rm -v <LOCAL_DIR>:<REMOTE_DIR> jonrad/lsp-mcp:<version>)

MCP CLI 客户端

按照 Claude 的说明操作,但配置文件位于 ~/.llm/config.json

基础知识(简介)

什么是 MCP?
什么是 LSP?

开发

yarn
yarn mcp-cli # Interactive MCP tool to help with development
yarn dev --help # Get the CLI help
依赖项
决策
  • 使用 Python——我想借助一个客户端库,让启动过程更简单。很多 LSP 都是用 Node 创建的,但成熟的客户端库似乎依赖于 VS Code。我觉得 multilspy 看起来不错,所以我们先用 Python。正好我已经创建过一个 Python MCP,至少在这方面我会更有经验
  • 使用 uv 进行包管理等工作——最近我越来越常看到大家使用它,这也正好是个学习的机会。以后切换包管理器会很麻烦,但并非不可行。等实现 CI/CD 后,我可能得重新考虑这个决定。也许我还可以用它替代对 taskfile 的依赖?待定
  • 尽可能使用异步——现在可是 2025 年
  • 最终还是改用 Node。用 Python 做 POC 的效果比我预期的要好。不过,multilspy 不支持完整的 LSP 规范,而 VS Code 的库会更容易使用,因为 Node 可以说是 LSP 服务端/客户端事实上的标准语言。
  • 使用低级别的 MCP SDK。我认为我需要更多控制权,而且坦白说,相比高级别的 FastMCP,它并没有那么复杂。
  • 使用 zod 验证配置。它已经是 MCP SDK 的依赖项了,所以没必要想得太复杂。
  • 我决定即使是未知语言也始终使用 LSP(例如,LLM 针对 Python 提供了 textDocument/documentSymbol 请求,但没有注册 Python LSP)。之后我可能会重新考虑这个决定。
  • 我决定只在收到请求时才启动 LSP。之后可能会将其设为可配置,但目前这样可以避免过度占用资源。
路线图

这只是我希望最终能完成的事项列表,没有时间安排或优先顺序。

  • 想办法同步 LSP 客户端(本项目)与 LSP 服务端之间的能力
  • 自动生成 LSP JSON Schema,或找到其发布位置
  • 将 JSON Schema 设为命令行参数,这样我们就不必更新代码来支持新的 Schema
  • 连接到已运行的 LSP 服务端(通过多路复用 LSP 服务端?)
  • 切换到 (Taskfile)[https://taskfile.dev/]
  • 建立正式的发布流程

参考资料

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。