Gopls 内置了一个实验性的 Model Context Protocol (MCP) 服务器,允许它将自身的部分功能以 MCP 工具的形式暴露给 AI 助手使用。
一、如何运行 MCP 服务
Gopls 的 MCP 服务提供两种运行模式:附加模式 (Attached) 和 独立模式 (Detached)。

附加模式 (Attached Mode)
MCP Server 会接入你当前的 gopls 会话,并共享内存数据。在此模式下,MCP 能够看到你当前正在编辑、还没来得及保存的内容。如果你在 IDE 中编辑 Go 代码,并希望 AI 能够实时理解当前修改,可以选择此模式。
启动命令:使用 -mcp.listen 参数启动 gopls MCP
gopls serve -mcp.listen=localhost:8092
此命令将启动一个基于 HTTP 的 MCP 服务器,采用 SSE 传输协议。服务默认可在 http://localhost:8092/sessions/1 访问(如果 gopls 实例上只有一个会话的话)。
独立模式 (Detached Mode)
gopls 单独在后台运行,MCP Server 与 gopls 会话的当前内存数据没有接触。它只能读取已经保存到硬盘上的文件,看不到你修改后还没保存的部分。如果你希望 AI 对项目进行整体分析,或者处理已经提交的代码,推荐选择此模式。
启动命令:使用 -mcp 参数启动 gopls MCP
gopls mcp
此命令将运行一个独立的 gopls 实例,通过标准输入 (stdin) 和标准输出 (stdout) 提供 MCP 服务。
二、gopls 输出喂给模型的指令描述
gopls MCP Server 内置了一套用于 AI 模型调用的使用说明,描述了如何利用它提供的各种工具来操作 Go 代码。MCP 服务在初始化时会自动发布并通知,但如果你想自己了解,或者在手动 AI 中额外提供上下文加载,可以通过下面的命令导出其指令描述。
gopls mcp -instructions > /path/to/contextFile.md

三、gopls MCP Server 安全注意事项
gopls MCP Server 本质上是对 gopls 常规功能(通过 LSP 暴露)的一个封装。因此,gopls 的工具原本能够做什么,通过 MCP Server 调用也可以执行它正常情况下能做的任何操作,包括:
- 从文件系统中读取文件,并把文件内容返回到工具结果中(比如在提供上下文的时候);
- 执行
go 命令来加载包信息,这可能会导致调用 https://proxy.golang.org 下载 Go 模块,并且会写入 Go 的缓存;
- 写入 gopls 的缓存或持久化配置文件;
- 如果你已经开启了 Go 的遥测功能,会上传每周的遥测数据。
gopls MCP Server 不会执行任何在普通 IDE 会话中 gopls 原本不会执行的操作。和大多数 LSP Server 一样,gopls 通常不会直接修改你的源代码目录,但它会指示客户端进行编辑操作;同时它也不会随意发起网络请求,但它会向特定服务发起范围很窄的请求,比如 Go 模块镜像或 Go 漏洞数据库。因此,当通过 MCP Server 进行调用时,这些方面同样需要多加留意。
Gopls 的 MCP 支持是一个强大的实验性功能,它通过标准化的协议让 AI 助手能够深度理解和操作 Go 代码。主要价值在于:
- 两种模式:我们可以根据需要选择是否让 AI 感知未保存的编辑。
- 安全可控:其操作范围与标准 gopls LSP 服务器一致,不会带来额外的安全风险。
- 专为 AI 优化:提供专门的指令上下文,帮助 AI 助手更有效地使用 Go 开发工具。
想了解更多 Go 开发工具与 AI 集成的实践?欢迎访问 云栈社区。
https://go.dev/gopls/features/mcp
|