使用说明
mcp-gopls–用于Go的mcp服务器(gopls)
一个模型上下文协议(MCP)服务器,允许AI助手使用Go的LSP(gopls)用于导航、诊断、测试、覆盖等。
太长,读不下去了 如果你在Go中使用Claude/Cursor/Compilot,
mcp-gopls赋予AI完整的LSP权力: 转到定义、引用、悬停、完成,go test、覆盖范围,go mod tidy,govulncheck等等。
概述
此MCP服务器帮助AI助手:
- 使用LSP分析Go工作区
- 导航到定义、参照和工作空间符号
- 在不离开MCP的情况下格式化、重命名和检查代码操作
- Run Go测试,覆盖率,
go mod tidy,govulncheck,以及具有结构化结果的模块图命令 - 阅读工作空间资源(概述+go.mod)并使用精心策划的提示
状态: 积极开发——用于实际项目。
用Go 1.25.x和gopls@latest.
建筑
该项目使用 mark3labs/mcp go 库来实现模型上下文协议。MCP集成实现了AI助手和Go工具之间的无缝通信。
服务器与通信 gopls,Go的官方语言服务器,通过语言服务器协议(LSP)。
特性
- 可配置运行时间:
--workspace,--gopls-path,--log-level,--rpc-timeout,以及--shutdown-timeout标志+环境变量(MCP_GOPLS_*) - 结构化日志记录:带有slog和可选文件输出的文本/JSON日志记录
- 扩展LSP表面:导航、诊断、格式化、重命名、代码操作、悬停、完成、工作区符号
- 测试和工具助手:覆盖率分析,
go test,go mod tidy,govulncheck,go mod graph - MCP附加:资源(
resource://workspace/overview,resource://workspace/go.mod)和提示(summarize_diagnostics,refactor_plan) - 进度流:长时间运行的命令发出
notifications/progress事件,以便客户端可以显示状态更新
功能比较: mcp-gopls vs内置 gopls 主控程序
截至 gopls v0.20.0,内置的MCP服务器公开了以下工具:
go_context, go_diagnostics, go_file_context, go_file_diagnostics,
go_file_metadata, go_package_api, go_references, go_rename_symbol,
go_search, go_symbol_references, go_workspace, go_vulncheck.
| 特性/能力 | mcp-gopls (本项目) |
内置 gopls MCP |
|---|---|---|
| 转到定义 | 是(go_to_definition 工具) |
没有专用的MCP工具(不在工具列表中) |
| 查找参考文献 | 是(find_references) |
是(go_references, go_symbol_references) |
| 诊断(文件/工作区) | 是(check_diagnostics) |
是(go_diagnostics, go_file_diagnostics) |
| 悬停信息 | 是(get_hover_info) |
无专用MCP工具(不在工具列表中) |
| 完成 | 是(get_completion) |
无专用MCP工具(不在工具列表中) |
| 格式化 | 是(format_document) |
无专用MCP工具(不在工具列表中) |
| 重命名符号 | 是(rename_symbol) |
是(go_rename_symbol) |
| 代码操作 | 是(list_code_actions) |
无专用MCP工具(不在工具列表中) |
| 工作区符号搜索 | 是(search_workspace_symbols) |
是(go_search) |
| 软件包/工作区API/上下文工具 | 没有专门的MCP工具 | 是(go_package_api, go_file_context, go_file_metadata, go_workspace, go_context) |
快跑 go test |
是的(run_go_test) |
没有用于运行测试的MCP工具 |
| 覆盖率分析 | 是(analyze_coverage) |
没有覆盖MCP工具 |
go mod tidy |
是的(run_go_mod_tidy) |
没有MCP工具 go mod tidy |
govulncheck |
是的(run_govulncheck) |
是(go_vulncheck) |
模块图(go mod graph) |
是(module_graph) |
模块图没有MCP工具 |
| 额外MCP资源 | 是(resource://workspace/overview, resource://workspace/go.mod) |
未记录为MCP资源 |
| 自定义MCP提示 | 是(summarize_diagnostics, refactor_plan) |
未作为MCP提示显示(仅型号说明) |
| 服务器附带的模型说明 | 没有特殊机制(记录在README/docs中) | 是: gopls mcp -instructions 打印使用工作流 |
如果你想从MCP获得完整的LSP式编辑+工具(定义、悬停、完成、格式化、重命名、代码操作、去测试、覆盖率、去模块整理、模块图),MCP-gopls会更加丰富。
如果您主要想要没有额外二进制文件的只读/内省工具(诊断、符号搜索、引用、包API、工作空间/文件上下文、vulcheck),那么内置的gopols MCP就足够了。
注: 内置
goplsMCP服务器仍处于试验阶段,其工具集可能会随着时间的推移而变化。截至goplsv0.20.x。
项目结构
.
├── cmd
│ └── mcp-gopls # Application entry point
├── pkg
│ ├── lsp # LSP client to communicate with gopls
│ │ ├── client # LSP client implementation
│ │ └── protocol # LSP protocol types and features
│ ├── server # MCP server
│ └── tools # MCP tools exposing LSP features
安装
go install github.com/hloiseau/mcp-gopls/v2/cmd/mcp-gopls@latest
快速开始
- 安装 服务器:
go install github.com/hloiseau/mcp-gopls/v2/cmd/mcp-gopls@latest
- 验证 它在你的
$PATH:
mcp-gopls --help
- 配置 您的AI客户端(请参阅下面的Cursor、Claude Desktop或GitHub Copilot示例)。
Docker/MCP网关
如果你喜欢跑步 mcp-gopls 在容器中(用于Docker MCP网关或其他容器化设置),使用官方映像。
Docker运行
docker run --rm -i \
-v /absolute/path/to/your/go/project:/workspace \
ghcr.io/hloiseau/mcp-gopls:latest \
--workspace /workspace
docker-mcp.yaml
复制 docs/docker-mcp.yaml,更新绑定挂载路径,然后从该目录运行:
docker mcp gateway run
工具目录元数据
如果您的MCP目录工具需要 toolsUrl,使用 docs/tools.json 作为静态工具列表。
详细的客户端设置
注: 所有客户端都指向同一个命令:
mcp-gopls --workspace /absolute/path/to/your/go/project
每个客户端的配置格式略有不同,但二进制文件和参数保持不变。
1.从游标连接
- 打开 设置→ MCP服务器→ 编辑JSON.
- 添加或更新
mcp-gopls条目:
{
"mcpServers": {
"mcp-gopls": {
"command": "mcp-gopls",
"args": ["--workspace", "/absolute/path/to/your/go/project"],
"env": {
"MCP_GOPLS_LOG_LEVEL": "info"
}
}
}
}
- 跑 开发者:重新加载窗口 因此Cursor会重新连接。
- 打开 工具 在Cursor Chat中打开抽屉并启用
mcp-gopls.
2.调用工具
| 工具/提示 | 游标聊天中的示例请求 |
|---|---|
go_to_definition |
“使用 go_to_definition 上 pkg/server/server.go:42.” |
find_references |
“向工具索取参考资料 ServeStdio.” |
check_diagnostics |
“请求诊断 cmd/mcp-gopls/main.go.” |
get_hover_info |
“呼叫 get_hover_info 上 pkg/tools/workspace.go:88.” |
get_completion |
“触发完成时间 pkg/server/server.go:55.” |
format_document |
“运行格式化程序 pkg/tools/refactor.go.” |
rename_symbol |
“重命名 clientFactory 到 newClientFactory 通过工具。” |
list_code_actions |
“列出的代码操作 pkg/server/server.go:80-90.” |
search_workspace_symbols |
“搜索工作区符号 NewWorkspaceConfig.” |
analyze_coverage |
“跑 analyze_coverage 为了 ./pkg/... 具有每个功能的统计数据。” |
run_go_test |
“执行 run_go_test 上 ./cmd/....” |
run_go_mod_tidy |
“调用 run_go_mod_tidy 同步go.mod。” |
run_govulncheck |
“跑 run_govulncheck 并流式传输调查结果。” |
module_graph |
“呼叫 module_graph 检查依赖关系。” |
summarize_diagnostics |
“使用 summarize_diagnostics 提示最新诊断。” |
refactor_plan |
“饲料 refactor_plan 诊断JSON以计划修复。” |
客户端设置示例
克劳德桌面(macOS、Windows、Linux)
- 安装
mcp-gopls并确保它在你的$PATH. - 创建或编辑
claude_desktop_config.json.- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - 窗户:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
- 添加服务器条目:
{
"mcpServers": {
"mcp-gopls": {
"command": "mcp-gopls",
"args": ["--workspace", "/absolute/path/to/your/go/project"],
"env": {
"MCP_GOPLS_LOG_LEVEL": "info"
}
}
}
}
重新启动Claude Desktop,打开聊天,并要求它连接到 mcp-gopls 工具(一旦检测到服务器,Claude将显示“工具”选项卡)。典型的提示包括“列出诊断 cmd/api/server.go“或”重命名 userService 到 accountService.”
光标IDE
光标打开 设置→ MCP服务器→ 编辑JSON (这封信是写给 ~/.cursor/config.json 或项目本地覆盖)。添加:
{
"mcpServers": {
"mcp-gopls": {
"command": "mcp-gopls",
"args": ["--workspace", "/absolute/path/to/your/go/project"]
}
}
}
重新加载光标(或运行 Developer: Reload Window 命令),服务器将出现在“工具”抽屉内。现在,您可以向Cursor Chat询问“运行”等问题 go test ./pkg/server 带有覆盖范围“或”显示悬停信息 pkg/tools/tests.go:42.”
GitHub副本(代理模式)
GitHub Copilot的代理模式可以跨VS Code、JetBrains IDE、Eclipse和Xcode与本地MCP服务器进行通信(文档).布线 mcp-gopls 在VS代码中:
- 更新GitHub Copilot(需要VS代码1.99+),选择加入 代理模式.
- 创建
.vscode/mcp.json在您的工作区中(或编辑Copilot“编辑配置”对话框中显示的全局文件)。 - 添加:
{
"servers": {
"mcp-gopls": {
"type": "stdio",
"command": "mcp-gopls",
"args": ["--workspace", "/absolute/path/to/your/go/project"],
"env": {
"MCP_GOPLS_LOG_LEVEL": "warn"
}
}
}
}
- 重新加载代理模式(关闭/打开),以便Copilot发现新工具;聊天“工具”选择器现在将显示每个MCP操作(
run_go_test,run_govulncheck等等)。JetBrains和其他IDE通过其Copilot设置面板共享相同的JSON模式。
MCP检查员/CLI测试
对于快速烟雾测试或演示,您可以使用 mark3labs/mcp检验员:
npx -y @mark3labs/mcp-inspector \
--command mcp-gopls \
--args "--workspace" "/absolute/path/to/your/go/project"
检查器允许您手动调用每个工具/资源/提示符,这对于在将其连接到AI助手之前调试服务器配置非常方便。
MCP工具
| 工具 | 说明 |
|---|---|
go_to_definition |
导航到符号的定义 |
find_references |
列出符号的所有引用 |
check_diagnostics |
获取文件的缓存诊断 |
get_hover_info |
返回符号的悬停标记 |
get_completion |
在某个位置返回完成标签 |
format_document |
返回整个文档的格式编辑 |
rename_symbol |
返回重命名的工作区编辑 |
list_code_actions |
列出一个范围的可用代码操作 |
search_workspace_symbols |
搜索工作区范围内的符号 |
analyze_coverage |
快跑 go test 覆盖范围+可选的每个功能报告 |
run_go_test |
执行 go test 对于包装/图案 |
run_go_mod_tidy |
执行 go mod tidy |
run_govulncheck |
执行 govulncheck ./... |
module_graph |
返回 go mod graph 输出 |
进度通知
长期运行的工具发出结构化 notifications/progress 事件,以便IDE可以显示丰富的状态指示器:
- 流媒体进度 (
run_go_test,analyze_coverage,run_govulncheck,run_go_mod_tidy)转发增量日志行和百分比更新。游标将这些显示为实时日志。 - 仅开始/完成事件 (
go_to_definition,find_references,rename_symbol等)触发一个快速的“开始”事件,这样UI就可以显示一个微调器,然后显示一个带有最终结果的完成有效负载。 - 每个进度令牌现在都被命名空间(例如。,
run_go_test/<rand>)以避免多个工具同时运行时出现“未知令牌”错误。
在集成新工具时,只有当底层LSP/golang命令产生有意义的临时输出时,才选择进入流模式;否则,请坚持轻量级的启动/完全流程,以尽量减少噪音。
提示指令
这两个提示都可以通过“提示”目录从任何支持MCP的客户端访问。
summarize_diagnostics
- 何时使用: 之后
check_diagnostics或run_go_test将原始诊断转化为可操作的步骤。 - 论据: 没有。服务器会自动读取工具层缓存的最后一个诊断有效负载。
- 典型工作流程:
check_diagnostics→ 将返回的数组复制到提示输入字段中(当您选择“使用上一个结果”时,Cursor的UI会自动粘贴它)。
refactor_plan
- 何时使用: 您已经有一个诊断JSON数组,并希望有一个简洁的更改清单。
- 论据: 需要a
diagnostics包含原始Go诊断的对象(与返回的有效载荷相同check_diagnostics). - 示例调用负载:
{
"diagnostics": [
{
"uri": "file:///path/to/pkg/tools/workspace.go",
"range": {"start": {"line": 12, "character": 5}, "end": {"line": 12, "character": 25}},
"severity": 1,
"message": "unused variable testHelper"
}
]
}
提示符以一组编号的重构步骤和建议的验证命令作为响应(go test, analyze_coverage等等)。
配置
服务器通过命令行标志和环境变量支持各种配置选项:
命令行标志
| 标志 | 默认值 | 描述 |
|---|---|---|
--workspace |
. |
Go项目根目录的绝对路径 |
--gopls-path |
gopls |
gopls二进制文件的路径 |
--log-level |
info |
日志级别(debug, info, warn, error) |
--rpc-timeout |
30s |
LSP调用的RPC超时 |
--shutdown-timeout |
5s |
正常关机超时 |
环境变量
所有标志都可以通过环境变量进行设置 MCP_GOPLS_ 前缀:
| 环境变量 | 等效标志 | 描述 |
|---|---|---|
MCP_GOPLS_WORKSPACE |
--workspace |
Go项目根目录的绝对路径 |
MCP_GOPLS_GOPLS_PATH |
--gopls-path |
gopls二进制文件的路径 |
MCP_GOPLS_LOG_LEVEL |
--log-level |
日志级别(debug, info, warn, error) |
MCP_GOPLS_RPC_TIMEOUT |
--rpc-timeout |
LSP调用的RPC超时(例如。, 30s, 1m) |
MCP_GOPLS_SHUTDOWN_TIMEOUT |
--shutdown-timeout |
正常关机超时 |
命令行标志优先于环境变量。
故障排除
- “列超出行尾” –gopls无法映射提供的位置。确认文件已保存,位置使用从零开始的行/列;跑
go fmt确保制表符与空格符合gopls的期望。 - “没有可用的悬停信息” –该符号可能属于已生成的文件或配置工作区外的模块。确保
--workspace标志指向模块根go list ./...成功。 - “工作区未初始化” –服务器未完成初始同步。等待
workspace initialized日志行或重新启动mcp-gopls删除过时内容后.gopls缓存。 run_govulncheck缺少二进制文件 –工具现在回落到go run golang.org/x/vuln/cmd/govulncheck@latest,但机器仍需要出站网络访问。如果回退被阻止,请手动安装二进制文件。
用法示例
使用支持MCP的AI助手的服务器:
# Ask the AI to get information about the code
Can you find the definition of the `ServeStdio` function in this project?
# Ask for diagnostics
Are there any errors in my main.go file?
# Ask for information about a symbol
What does the Context.WithTimeout function do in Go?
发展
git clone https://github.com/hloiseau/mcp-gopls.git
cd mcp-gopls
go mod tidy
go test ./...
go build ./cmd/mcp-gopls
表驱动测试在 pkg/tools CI通过以下方式运行 .github/workflows/ci.yml.
文档
docs/usage.md–快速入门和工具目录演练- 工作区资源公开
resource://workspace/overview和resource://workspace/go.mod - 提示(
summarize_diagnostics,refactor_plan)帮助助手产生一致的输出
贡献
欢迎PR和问题!
- 检查 问题 或者如果你遇到错误或想要一个功能,可以提交一个新的。
- 跑
go test ./...在打开PR之前。 - 对于更大的更改(新工具、协议更改),请先打开一个设计问题,以便我们讨论方法。
所有贡献都应保持测试覆盖率,并遵守Go最佳实践。请参阅 发展 设置说明部分。
先决条件
- 去1.25+(用
go1.25.4) gopls已安装(go install golang.org/x/tools/gopls@latest)- 可选:
govulncheck(go install golang.org/x/vuln/cmd/govulncheck@latest) - 服务器强制
GOTOOLCHAIN=local因为它的嵌套gopls过程。如果需要不同的工具链,请设置GOTOOLCHAIN在发射前的环境中mcp-gopls.
与Olama整合
此MCP服务器可以与支持MCP协议的任何工具一起使用。对于Ollama集成:
- 确保Ollama正在跑步
- MCP服务器独立运行,并通过stdin/stdout进行通信
- 将您的客户端配置为将MCP服务器用作工具提供者
许可证
Apache许可证2.0
