LSP(语言服务器协议)接口交互的MCP(模型上下文协议)服务器。 此服务器充当桥梁,允许LLMs查询LSP Hover和Completion提供者。
MCP服务器的工作方式如下:
这使LLMs能够利用LSP进行更准确的代码建议。
{
"mcpServers": {
"lsp-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"tritlo/lsp-mcp",
"<language-id>",
"<path-to-lsp>",
"<lsp-args>"
]
}
}
}
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: 运行时更改服务器的日志记录详细程度lsp-diagnostics:// 资源用于通过订阅实时更新访问诊断消息lsp-hover:// 资源用于检索特定文件位置的悬停信息lsp-completions:// 资源用于获取特定位置的代码完成建议对于演示服务器:
克隆此仓库:
git clone https://github.com/your-username/lsp-mcp.git
cd lsp-mcp
安装依赖项:
npm install
构建 MCP 服务器:
npm run build
项目包括针对TypeScript LSP支持的集成测试。这些测试验证LSP-MCP服务器是否正确处理了LSP操作,如悬停信息、完成建议、诊断和代码操作。
要运行TypeScript LSP测试:
npm test
或者具体地:
npm run test: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
从版本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: 系统无法使用默认情况下,日志发送到:
notifications/message方法向客户端发送MCP通知为了详细调试,您可以:
运行Claude时使用claude --mcp-debug标志查看Claude与服务器之间的所有MCP流量:
claude --mcp-debug
使用set_log_level工具在运行时更改日志级别:
{
"tool": "set_log_level",
"arguments": {
"level": "debug"
}
}
默认日志级别是info,显示适度的操作细节,同时过滤掉冗长的调试消息。
服务器提供了以下MCP工具:
获取文件中特定位置的悬停信息。
参数:
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
}
}
获取文件中特定位置的完成建议。
参数:
file_path: 文件路径language_id: 文件编写的编程语言(例如,“haskell”)line: 行号column: 列位置示例:
{
"tool": "get_completions",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell",
"line": 3,
"column": 10
}
}
获取文件中特定范围的代码操作。
参数:
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
}
}
使用指定的根目录启动LSP服务器。在使用其他任何LSP相关工具之前必须调用此工具。
参数:
root_dir: LSP服务器的根目录(推荐使用绝对路径)示例:
{
"tool": "start_lsp",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
不重启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"
}
}
在LSP服务器中打开一个文件以进行分析。在访问诊断或对文件执行其他操作之前必须调用此工具。
参数:
file_path: 要打开的文件路径language_id: 文件编写的编程语言(例如,“haskell”)示例:
{
"tool": "open_document",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell"
}
}
当您完成与文件的工作时,在LSP服务器中关闭文件。这有助于管理资源和清理。
参数:
file_path: 要关闭的文件路径示例:
{
"tool": "close_document",
"arguments": {
"file_path": "/path/to/your/file"
}
}
获取一个或所有已打开文件的诊断消息(错误、警告)。
参数:
file_path: (可选)要获取诊断消息的文件路径。如果没有提供,则返回所有已打开文件的诊断消息。特定文件的示例:
{
"tool": "get_diagnostics",
"arguments": {
"file_path": "/path/to/your/file"
}
}
所有已打开文件的示例:
{
"tool": "get_diagnostics",
"arguments": {}
}
设置服务器的日志级别以控制日志消息的详细程度。
参数:
level: 要设置的日志级别。其中一个:debug, info, notice, warning, error, critical, alert, emergency。示例:
{
"tool": "set_log_level",
"arguments": {
"level": "debug"
}
}
除了工具外,服务器还提供了访问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功能:
get_diagnostics、get_info_on_location和get_completions工具以简单直接的方式获取信息。lsp-diagnostics://、lsp-hover://和lsp-completions://资源以更RESTful的方法。两种方法都提供相同的数据格式,并且都要求首先打开文件。
MIT 许可证
LSP-MCP服务器支持增强不同编程语言能力的语言特定扩展。扩展可以提供:
目前,以下扩展可用:
当您在启动服务器时指定了语言ID时,扩展会自动加载:
npx tritlo/lsp-mcp haskell /path/to/haskell-language-server-wrapper lsp
所有由扩展提供的功能都使用语言ID进行命名空间划分。例如,Haskell扩展的类型孔提示可用作haskell.typed-hole-use。
要创建新扩展:
在src/extensions/中创建一个新的TypeScript文件,命名为您的语言(例如,typescript.ts)
实现扩展接口,包含以下任一可选函数:
getToolHandlers(): 提供自定义工具实现getToolDefinitions(): 在MCP API中定义自定义工具getResourceHandlers(): 实现自定义资源处理器getSubscriptionHandlers(): 实现自定义订阅处理器getUnsubscriptionHandlers(): 实现自定义取消订阅处理器getResourceTemplates(): 定义自定义资源模板getPromptDefinitions(): 定义语言任务的自定义提示getPromptHandlers(): 实现自定义提示处理器导出您的实现函数
当匹配的语言ID被指定时,扩展系统将自动加载您的扩展。