一个用于与语言服务器协议(LSP)接口交互的模型上下文协议(MCP)服务器。
该服务器充当桥梁,使大型语言模型(LLMs)能够查询LSP的悬停提示和代码补全提供程序。
MCP服务器的工作原理:
这使得LLMs能够利用LSP提供更准确的代码建议。
{
"mcpServers": {
"lsp-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"tritlo/lsp-mcp",
"<语言ID>",
"<LSP路径>",
"<LSP参数>"
]
}
}
}

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 <语言> /path/to/lsp [lsp-args...]
例如:
npx tritlo/lsp-mcp haskell /usr/bin/haskell-language-server-wrapper lsp
从0.2.0版本开始,您必须显式调用start_lsp
工具来启动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": 5
}
}

获取文件中特定位置的代码补全建议。
参数:
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
)
实现Extension接口,包含以下任意可选函数:
getToolHandlers()
:提供自定义工具实现getToolDefinitions()
:在MCP API中定义自定义工具getResourceHandlers()
:实现自定义资源处理程序getSubscriptionHandlers()
:实现自定义订阅处理程序getUnsubscriptionHandlers()
:实现自定义取消订阅处理程序getResourceTemplates()
:定义自定义资源模板getPromptDefinitions()
:定义语言任务的自定义提示getPromptHandlers()
:实现自定义提示处理程序导出您的实现函数
当指定匹配的语言ID时,扩展系统会自动加载您的扩展。