返回市场
语言服务器协议-MCP

语言服务器协议-MCP

作者:jonrad154 星标更新:2025-04-01

项目介绍

LSP MCP

一个提供语言服务器协议(LSP)功能的模型上下文协议(MCP)服务器,使大型语言模型(LLMs)/AI代理能够从代码库中获取语言感知的上下文。

示例

输入:

使用LSP给我以下TypeScript代码的见解:

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

输出:

我将使用LSP(语言服务器协议)来分析您的TypeScript代码。让我分解一下发生了什么:
这是代码的作用以及LSP分析提供的见解:

1. 变量遮蔽:

有两个名为foo的变量:

全局foo(字符串类型),初始化值为"bar"
函数x()内的局部foo(数字类型),初始化值为123

2. 执行流程:

首先,声明并赋值全局foo为"bar"
当调用函数x()时,声明并赋值局部foo为123
函数内部的console.log(foo)输出123(局部变量)
函数执行完毕后,console.log(foo)输出"bar"(全局变量)

3. 作用域隔离:

LSP确认TypeScript正确识别了不同的类型:

全局foo是字符串类型
函数内的局部foo是数字类型

对局部foo的修改不会影响全局foo

这是一个典型的JavaScript/TypeScript变量遮蔽的例子,在其作用域内,同名的局部变量优先于全局变量。

警告

此功能处于概念验证阶段。

特性

  • 同时支持多种LSP(多种编程语言支持),参见示例配置
  • 动态生成支持的LSP方法来自LSP JSON Schema,参见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 'typescript@5.7.3' -p 'typescript-language-server@4.3.3' typescript-language-server --stdio"]
    }
  }
}

这将为Claude提供TypeScript语言服务器的LSP功能。您可以通过切换--lsp参数(然后重新启动Claude)来修改语言服务器。

同时支持多种LSP尚未实现。

Cursor

遵循Cursor提供的说明。对于设置,选择Type = commandCommand = docker run ...如上所述用于Claude(例如docker run -i --rm -v <LOCAL_DIR>:<REMOTE_DIR> jonrad/lsp-mcp:<version>

MCP CLI客户端

遵循Claude的说明,但配置文件位于~/.llm/config.json

ABCs(介绍)

什么是MCP?

什么是LSP?

开发

yarn
yarn mcp-cli # 交互式MCP工具,帮助开发
yarn dev --help # 获取CLI帮助

依赖项

决策

  • 使用python - 我想利用一个客户端库,使这个简单启动。许多LSP是在node中创建的,但成熟的客户端库似乎依赖于vscode。我喜欢multilspy的样子,所以我们从python开始。我已经创建了一个python MCP,所以至少在这方面我有优势。
  • uv用于包管理和类似的事情 - 最近我看到这个被更频繁地使用,这是一个学习它的借口。将来切换包管理器是令人讨厌的,但可行的。一旦实施CI/CD,我可能需要重新考虑这个决定。也许我可以使用这个而不是对taskfile的依赖?待定
  • 尽可能异步 - 现在是2025年
  • 最终还是切换到node。Python的概念验证比我预期的要成功。但是,multilspy不支持整个LSP规范,而vscode的库与node一起使用更容易,因为node可以说是LSP服务器/客户端的事实上的标准语言。
  • 使用低级MCP SDK。我认为我需要更多的控制权,而且事实上,与更高层次的FastMCP相比,它并不复杂。
  • 使用zod进行配置验证。它已经是MCP SDK的依赖项,所以没有必要过度思考。
  • 我已经设定即使对于未知语言也要始终使用LSP(例如LLM提供了针对python的textDocument/documentSymbol请求,但没有注册python LSP)。我可能会重新考虑这个决定。
  • 决定仅在被询问时才启动LSP。以后可能会使其可配置,但现在这可以防止资源的过度使用。

路线图

这只是我最终想要做的事情的列表。这些没有时间表或顺序。

  • 弄清楚如何同步LSP客户端(这里)和LSP服务器之间的能力
  • 自动生成LSP JSON Schema或找到发布的地方
  • 将json schema作为cli参数,这样我们就不必更新代码以支持新的json schema
  • 连接到已运行的LSP服务器(通过多路复用LSP服务器?)
  • 切换到Taskfile
  • 创建正式的发布过程

参考资料