LSP网桥MCP服务器
将Claude Code连接到语言服务器协议(LSP)服务器,以进行实时编译诊断、错误、警告等。
🎯 特性
- 自动诊断:PostToolUse钩子在编辑后自动触发编译
- 实时诊断:查看发生的编译错误和警告
- 悬停信息:立即获取类型签名、文档和scaladoc
- 转到定义:直接跳转到定义符号的位置(方法、类、特征)
- 多语言支持:适用于任何LSP服务器(金属、锈迹分析仪、打字语言服务器等)
- MCP资源:诊断作为可读资源公开
- MCP工具:查询诊断、触发器编译、悬停信息、转到定义
- 本地诊断文件:写信给 `
/.lsp-bridge/diagnostics.json` 便于阅读
🚀 快速开始
有关包括Claude.md配置在内的详细Claude代码设置,请参阅 CLAUDE_SETUP.md
先决条件
对于Scala项目,您需要 金属 已安装并位于PATH中:
# Install via Coursier (recommended)
coursier install metals
# Verify it's on your PATH
metals --version如果 metals --version 如果不起作用,请将Coursier的bin目录添加到PATH中:
# Add to your ~/.bashrc, ~/.zshrc, or ~/.profile
export PATH="$PATH:$HOME/Library/Application Support/Coursier/bin" # macOS
export PATH="$PATH:$HOME/.local/share/coursier/bin" # Linux1.安装
选项A:全局安装(推荐)
全局安装,使其始终可用:
cd lsp-bridge-mcp
pip install -e .选项B:虚拟环境安装
如果您更喜欢使用虚拟环境:
cd lsp-bridge-mcp
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -e .注意:如果使用venv,您需要在MCP配置中指定venv Python的完整路径(请参阅下面的步骤3)。
2.创建配置
创建 config.json 在您的项目或主目录中:
{
"servers": [
{
"name": "metals",
"workspace_root": "/path/to/your-scala-project",
"command": ["metals"]
}
]
}3.配置克劳德代码
添加到 ~/.claude.json:
如果全局安装(选项A):
{
"mcpServers": {
"lsp-bridge": {
"command": "python",
"args": ["-m", "lsp_bridge"]
}
}
}如果安装在venv中(选项B):
{
"mcpServers": {
"lsp-bridge": {
"command": "/absolute/path/to/lsp-bridge-mcp/venv/bin/python",
"args": ["-m", "lsp_bridge"]
}
}
}替换 /absolute/path/to/lsp-bridge-mcp 使用您的实际安装路径。
或者对于特定项目,创建 .mcp.json 在您的项目目录中:
{
"mcpServers": {
"lsp-bridge": {
"command": "python",
"args": [
"-m",
"lsp_bridge",
"${projectDir}/lsp-bridge-config.json"
]
}
}
}⚠️ 重要提示:首次在新会议中使用
MCP工具在请求之间注册,而不是在请求期间注册。在新的克劳德会议上:
- 第一
list_workspaces呼叫可能会失败,并显示“没有可用的此类工具” - 向Claude发送任何消息(例如,“继续”)
- 立即重试-它会起作用的
看 CLAUDE_SETUP.md 有关配置Claude以自动处理此问题的说明。
4.在克劳德代码中使用
配置后,Claude可以:
查看资源
Claude can see resources like:
- lsp://metals/diagnostics/all
- lsp://metals/diagnostics/src/main/scala/YourFile.scala使用工具
- get_diagnostics(workspace: "metals")
- get_diagnostics(workspace: "metals", file_path: "src/main/scala/File.scala")
- trigger_compilation(workspace: "metals")
- get_status(workspace: "metals")
- list_workspaces()使用提示
Claude can use the "analyze_diagnostics" prompt to get AI-powered analysis of compilation errors📖 使用示例
示例1:检查所有诊断
在克劳德代码中:
Read the resource lsp://metals/diagnostics/allClaude将看到所有编译错误和警告。
示例2:分析特定文件
Use get_diagnostics tool with workspace="metals" and file_path="src/main/scala/MyFile.scala"示例3:触发器编译
Use trigger_compilation tool with workspace="metals"Claude将触发完整编译并报告结果。
示例4:自动分析
Use the analyze_diagnostics prompt for workspace="metals"Claude将分析所有错误,提出修复建议,并对其进行优先级排序。
📚 文档
- CLAUDE_SETUP.md -完成Claude Code的设置,包括Claude.md工作流
- 设置.md -一般安装和配置
- QUICKSTART.md -快速入门指南
- 工作流.md -示例工作流
- 许可.md -权限配置
- HOOKS_SETUP.md -用于自动同步的后期编辑挂钩
🔧 配置
金属(Scala)
{
"servers": [
{
"name": "metals",
"workspace_root": "/path/to/scala/project",
"command": ["metals"]
}
]
}锈蚀分析仪(rust)
{
"servers": [
{
"name": "rust",
"workspace_root": "/path/to/rust/project",
"command": ["rust-analyzer"]
}
]
}typescript语言服务器(typescript)
{
"servers": [
{
"name": "typescript",
"workspace_root": "/path/to/ts/project",
"command": ["typescript-language-server", "--stdio"]
}
]
}多个工作区
{
"servers": [
{
"name": "backend",
"workspace_root": "/path/to/backend",
"command": ["metals"]
},
{
"name": "frontend",
"workspace_root": "/path/to/frontend",
"command": ["typescript-language-server", "--stdio"]
}
]
}🛠️ 可用工具
get_hover
获取特定位置符号的类型信息、文档和签名。
参数:
workspace(必填):工作区名称(例如“金属”)file_path(必填):文件的绝对路径line(必填):行号(1-索引,如编辑器所示)character(必填):字符/列位置(0索引)
退货: 符号的类型签名、文档和scaladoc
例子:
get_hover(workspace="metals", file_path="/path/to/Main.scala", line=10, character=15)使用案例:
- 在不读取源文件的情况下查找方法签名
- 获取案例类字段定义
- 查看库函数的scaladoc/文档
- 检查类型推断结果
get_definition
跳到符号的定义。返回定义符号的文件路径和行号。
参数:
workspace(必填):工作区名称(例如“金属”)file_path(必需):包含符号引用的文件的绝对路径line(必填):行号(1-索引,如编辑器所示)character(必填):字符/列位置(0索引)
退货: 定义的文件路径和行号
例子:
get_definition(workspace="metals", file_path="/path/to/Main.scala", line=18, character=15)使用案例:
- 导航到方法实现
- 查找类别/特征定义
- 跳转到声明变量的位置
- 探索库源代码(Metals从JAR中提取源代码)
get_diagnostics
获取编译错误和警告。
参数:
workspace(必填):工作区名称(例如“金属”)file_path(可选):用于获取诊断的特定文件
退货: 带有错误、警告及其位置的JSON
trigger_compilation
在LSP服务器中触发编译(如果支持)。
参数:
workspace(必填):工作区名称
退货: 编译结果
get_status
获取LSP服务器的当前状态。
参数:
workspace(可选):要检查的特定工作区
退货: 状态,包括错误/警告计数
list_workspaces
列出所有连接的LSP服务器工作区。
退货: 工作空间名称数组
📊 诊断格式
诊断结果以以下格式返回:
{
"summary": {
"total_files": 5,
"total_diagnostics": 12,
"errors": 3,
"warnings": 9,
"info": 0
},
"by_file": {
"/path/to/File.scala": [
{
"severity": "ERROR",
"line": 42,
"character": 10,
"message": "type mismatch",
"source": "metals",
"code": "type-mismatch"
}
]
}
}🪝 PostTool使用钩子设置
要在每次Scala文件编辑后启用自动诊断,请将此挂钩添加到 ~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/notify-metals.sh"
}
]
}
]
}
}在以下位置创建挂钩脚本 ~/.claude/hooks/notify-metals.sh:
#!/bin/bash
# Read JSON from stdin and notify lsp-bridge for Scala files
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
if [[ -n "$FILE_PATH" && "$FILE_PATH" == *.scala ]]; then
sleep 0.3
echo "$FILE_PATH" > /tmp/lsp-bridge-notify.txt
fi使其可执行: chmod +x ~/.claude/hooks/notify-metals.sh
设置后,每次编辑Scala文件后,诊断程序都会自动更新。请阅读以下内容:
cat
/.lsp-bridge/diagnostics.json | jq .🐛 调试
日志被写入 /tmp/lsp-bridge-mcp.log:
tail -f /tmp/lsp-bridge-mcp.log🔍 运作原理
自动诊断流程
- 克劳德编辑
.scala文件 - PostTool使用挂钩 将文件路径写入
/tmp/lsp-bridge-notify.txt - MCP服务器监视器 检测到更改,发送
didChange金属 - 金属编译 并发布诊断结果
- 已编写诊断 到 `
/.lsp-bridge/diagnostics.json`
- 克劳德读 诊断文件(无需权限提示)
核心架构
- LSP客户端:通过stdio连接到语言服务器
- 消息处理:订阅
textDocument/publishDiagnostics通知 - 状态管理:维护所有文件的当前诊断
- MCP暴露:将诊断作为MCP资源和工具公开
- 文件监视器:监视器
/tmp/lsp-bridge-notify.txt用于钩子通知 - 本地输出:将诊断写入项目本地
.lsp-bridge/目录
🎨 建筑
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Claude Code │ ◄─MCP──►│ LSP Bridge │ ◄─LSP──►│ Metals │
│ │ │ MCP Server │ │ Server │
└─────────────┘ └──────────────┘ └─────────────┘
│ │ │
│ PostToolUse │ File Watcher │
│ Hook │ (/tmp/notify.txt) │
▼ ▼ │
┌─────────────┐ ┌──────────────┐ │
│ Edit .scala │────────►│ didChange │───────────────┘
│ file │ │ notification │
└─────────────┘ └──────────────┘
│
▼
┌────────────────────────┐
│ .lsp-bridge/ │
│ diagnostics.json │◄── Claude reads
└────────────────────────┘🎬 演示工程
这 scalademo/ 该目录包含一个用于尝试lsp-bridge mcp的示例Scala项目。看 scalademo/README.md 用于显示功能的演示提示。
📝 许可证
麻省理工学院
🤝 贡献
欢迎投稿!这是一个社区项目。
🚀 路线图
- \[x\] 通过PostToolUse钩子进行自动诊断
- \[x\] 本地诊断文件(.lsp bridge/diagnostics.json)
- \[x\] 悬停信息(类型签名、文档、scaladoc)
- \[x\] 转到定义
- \[\]代码操作支持
- \[\]查找参考文献
- \[\]重命名支持
- \[\]保存时自动格式化
- \[\]增量文档同步
- \[\]支持多根工作区
- \[\]LSP服务器自动发现
- \[\]热重载配置
