Go 语言的官方语言服务器 gopls v0.20.0 版本已经发布,带来了一系列功能增强和改进。其中最引人注目的,无疑是实验性的引入的 模型上下文协议服务器(Model Context Protocol Server, MCP Server) 。这也说明 gopls 正式进入与 AI 深度融合的时代,相信其会为 Go 开发者带来了前所未有的智能编程体验。
什么是模型上下文协议(MCP)?
在介绍 gopls 的新功能之前,我们先来了解一下 MCP(Model Context Protocol)是什么。
传统的语言服务器协议(LSP)主要解决编辑器与语言服务器之间的交互,比如实现代码补全、跳转定义等功能。这些机制非常适合人类开发者在 IDE 中的日常操作,但对于 AI 助手而言,它们提供的信息仍显不足。AI 助手需要更深入、更结构化的代码上下文,才能提供高质量的辅助功能。
这正是 MCP 登场的背景。MCP 是一个开放标准,旨在帮助开发者在数据源和 AI 工具之间建立安全、双向的连接。在这个架构中,开发者既可以将数据通过 MCP 服务器暴露出来,也可以开发作为 MCP 客户端的 AI 应用来访问这些服务器。
具体到 gopls,MCP 的引入意味着它不再仅仅是为人类编辑器服务的语言服务器,而是可以作为 AI 助手的“代码理解引擎”。通过 MCP,gopls 可以把类型信息、引用关系、依赖图谱等深层次语义结构暴露给大型语言模型,从而使 AI 助手具备更强的代码分析和生成能力。
gopls v0.20.0:实验性的 MCP 服务器
Gopls 现在内置了一个实验性的 Model Context Protocol(MCP)服务器,使其能够以 MCP 工具的形式向 AI 助手开放其部分功能。
运行 MCP 服务器
该服务器有两种运行模式:“附加模式(attached)”和“分离模式(detached)”。
- 在附加模式下,MCP 服务器在一个活跃的 gopls LSP 会话中运行,因此它可以与当前的 LSP 会话共享内存,并能够访问当前未保存的缓冲区状态。
- 在分离模式下,gopls 与一个无头(headless)的 LSP 会话交互,因此只能看到磁盘上已保存的文件。
附加模式(Attached mode)
要使用“附加模式”,在运行 gopls 时添加 -mcp.listen 参数。例如:
gopls -mcp.listen :8080这将启动一个 MCP 服务器,并监听本地的 8080 端口。
分离模式(Detached mode)
要使用“分离模式”,运行 mcp 子命令。例如:
gopls mcp这将在一个独立的无头 LSP 会话中启动 MCP 服务器,只能访问磁盘上已保存的文件。
模型使用说明(Instructions to the model)
gopls 的 MCP 服务器内置了使用说明,描述了如何使用其提供的工具与 Go 代码进行交互的工作流程。这些说明会在 MCP 服务器初始化时自动发布,但也可以手动加载这些说明,以在 AI 辅助会话中作为额外上下文,从而强化其作用。
可以使用 -instructions 参数将这些说明打印出来,例如:
gopls mcp -instructions > /path/to/contextFile.md这会将使用说明输出到指定路径的文件中,方便在 AI 模型会话中加载使用。
安全提示
官方特别强调,由于该功能尚处于实验阶段,允许 LLM 在工作区执行操作可能会引入额外的安全风险。因此,在尝鲜时,请务必保持警惕,并确保了解其潜在影响。
gopls MCP 服务器是对 gopls 通过语言服务器协议(LSP)通常暴露的功能的封装。因此,gopls 的工具可以执行 gopls 在普通使用中完成的任何操作,包括:
- 从文件系统读取文件,并在工具结果中返回其内容(例如提供上下文时);
- 执行
go命令加载包信息,这可能涉及访问 https://proxy.golang.org 下载 Go 模块,以及写入 Go 缓存; - 写入 gopls 的缓存或持久化配置文件;
- 如果开启了Go 远程数据收集,则会上传每周的遥测数据。
gopls MCP 服务器不会执行任何 gopls 在普通 IDE 会话中未执行的操作。和大多数 LSP 服务器一样,gopls 通常不会直接修改你的源代码树,但可能会指示客户端应用编辑操作。它也不会随意进行网络请求,只会针对特定服务(如 Go 模块镜像或 Go 漏洞数据库)进行有限范围的请求,这些请求难以被恶意代理利用进行数据泄露。
尽管如此,当将 gopls MCP 服务器作为 AI 支持系统的一部分使用时,上述能力仍需额外考虑和审慎对待。
v0.20.0 的其他亮点
除了 MCP 这一重大更新,此版本还包含其他值得关注的改进:
- 新的 Web 工具“拆分包 (Split Package)”: 一个非常实用的可视化工具,可以帮助我们分析和设计如何将一个庞大而复杂的包拆分成多个无循环依赖的独立组件。
ignoredError内联提示:gopls现在会以更友好的方式提示可能被意外忽略的error返回值,帮助编写更健壮的代码。unusedfunc分析器增强: 该分析器现在不仅能检测未使用的函数,还能报告包内未被引用的、未导出的类型、变量和常量。
总结
gopls 与 MCP 的结合,为 Go 语言的开发工具生态系统打开了全新的想象空间。这仅仅是一个开始。随着协议的成熟和工具链的完善,我们可以期待一个更加智能和无缝的 Go 开发环境。未来的 AI 编码助手将不再仅仅是代码补全工具,而是能够真正理解项目上下文、辅助架构设计、并与开发者进行深度协作的得力伙伴。