1. 简介
在此 Codelab 中,您将学习如何构建和部署 Model Context Protocol (MCP) 服务器,以扩展 Gemini CLI 的功能。您将构建 godoctor,这是一个基于 Go 的服务器,可为 Go 开发提供自定义工具,从而将 Gemini CLI 从通用编码助理转变为专业的 Go 开发专家。
此 Codelab 采用“提示驱动”方法。您将担任技术主管,为 AI 助理(即 Gemini CLI 本身)提供提示。您的目标是学习如何将项目要求转化为有效的提示,并让 AI 处理实现细节。
此项目的核心是 Model Context Protocol (MCP)。MCP 是一种开源协议,可标准化 Gemini 等大语言模型 (LLM) 与外部工具和服务之间的通信方式。它充当桥梁,使 AI 能够访问真实世界的信息并执行超出其内置知识范围的操作。通过构建 MCP 服务器,您可以创建 Gemini CLI 可以发现和使用的自定义插件,从而有效地教它新技能。
学习内容
- 如何安装和配置 Gemini CLI
- 如何制定有效的提示来指导软件开发中的 AI 助理
- 如何向 AI 助理提供上下文和指南
- 如何创建和配置 MCP 服务器以增强 Gemini CLI 的功能
- 如何将 Go 应用容器化并部署到 Google Cloud Run
所需条件
本研讨会完全可以在 Google Cloud Shell 中运行,该 Shell 预安装了所有必需的依赖项(gcloud CLI、Go、Docker、Gemini CLI)。
或者,如果您希望在自己的机器上操作,则需要以下各项:
- Node.js 20 或更高版本
- 启用了结算功能的 Google Cloud 项目
- 已安装并初始化 Google Cloud SDK (gcloud CLI)
- 系统上安装了 Go 1.24 或更高版本
- 您的系统上安装了 Docker
关键技术
您可以在此处详细了解我们将使用的技术:
- Gemini CLI:我们将扩展的 AI 赋能的命令行界面
- Model Context Protocol (MCP):一种开源协议,可让 Gemini CLI 与我们的自定义工具进行通信
- 适用于 MCP 的 Go SDK:我们将使用此 Go 库来实现 MCP 服务器
成功完成 Codelab 的提示
使用 AI 助理是一种全新的软件开发方式。以下是一些提示,可帮助您顺利成功地完成此流程:
- 不要害怕按 ESC 键。AI 有时会建议您采取您不认同的操作或使用您不认同的代码。使用 ESC 键取消其建议的操作,并提供新的提示来引导其朝着正确的方向前进。您是飞行员。
- 鼓励使用工具。如果 AI 似乎迷失了方向或在编造信息,请鼓励它使用可用的工具。“你能用 Google 搜索来验证一下吗?”或“在进行更改之前,请使用 read_file 工具了解当前代码”等提示非常有效。
- 抵制手动更改。尝试让 AI 完成所有工作。这是您正在练习的核心技能。不过,如果您必须手动更改,请在更改后告知 AI。系统会显示类似“我已手动更新 README.md 文件。请再次阅读,以更新您的知识”将确保 AI 与您的项目保持同步。
- 您试过关机然后重新开机吗?在极少数情况下,如果 AI 试图违背您的指令强行采用特定路径,可能是因为上下文降级(有时也称为“上下文腐烂”)。在这种情况下,您可以使用 Gemini CLI 命令“/compress”来减少上下文噪声;在极端情况下,您可以使用“/clear”命令来清除整个对话记录。
2. 环境设置
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID
标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。
3. Gemini CLI 使用入门
在本部分中,您将了解 Gemini CLI,包括如何安装和配置该工具以适应您的环境。
什么是 Gemini CLI?
Gemini CLI 是一款 AI 赋能的命令行界面,可帮助您完成各种开发任务。它可以理解项目的上下文,回答问题,生成代码,并使用外部工具来扩展其功能。
安装
使用 npm 全局安装 Gemini CLI。
npm install -g @google/gemini-cli
您可以运行以下命令来确认 CLI 是否已安装:
gemini --version
配置
Gemini CLI 的行为由配置文件和环境变量控制。有两个关键文件:
GEMINI.md
:此文件为 AI 提供自然语言指南和上下文。CLI 会读取此文件,以了解项目的编码标准和惯例。.gemini/settings.json
:此文件用于控制 CLI 的配置,包括如何连接到外部工具。我们将使用此文件来配置 CLI,以使用我们在此实验中构建的 MCP 服务器。
我们将先设置环境,然后继续创建 GEMINI.md
文件。settings.json
文件将在后续步骤中进行配置。
- 创建并初始化项目目录:
mkdir godoctor
cd godoctor
go mod init godoctor
- 使用 Google Cloud 应用默认凭据进行身份验证:
我们需要登录有权访问您将在此 Codelab 中使用的 GCP 项目的账号:
- 确保您已安装并初始化 Google Cloud SDK。
- 运行以下命令以设置应用默认凭据:
gcloud auth application-default login
4. 开发指南
为确保 AI 助理生成高质量、地道的 Go 代码,必须为其提供明确的指导。此操作在 GEMINI.md 文件中完成。
目标:创建一个 GEMINI.md 文件,作为此项目期间 AI 助理的一组规则。
任务:在 godoctor 目录的根目录下创建一个名为 GEMINI.md 的文件,并将以下内容粘贴到其中。
# Go Development Guidelines
All code contributed to this project must adhere to the following principles.
### 1. Formatting
All Go code **must** be formatted with `gofmt` before being submitted.
### 2. Naming Conventions
- **Packages:** Use short, concise, all-lowercase names.
- **Variables, Functions, and Methods:** Use `camelCase` for unexported identifiers and `PascalCase` for exported identifiers.
- **Interfaces:** Name interfaces for what they do (e.g., `io.Reader`), not with a prefix like `I`.
### 3. Error Handling
- Errors are values. Do not discard them.
- Handle errors explicitly using the `if err != nil` pattern.
- Provide context to errors using `fmt.Errorf("context: %w", err)`.
### 4. Simplicity and Clarity
- "Clear is better than clever." Write code that is easy to understand.
- Avoid unnecessary complexity and abstractions.
- Prefer returning concrete types, not interfaces.
### 5. Documentation
- All exported identifiers (`PascalCase`) **must** have a doc comment.
- Comments should explain the *why*, not the *what*.
# Agent Guidelines
- **Reading URLs:** ALWAYS read URLs provided by the user. They are not optional.
现在,您的开发环境已完全设置完毕。
5. 初始 build:godoc 服务器
您的首要目标是创建 godoctor
服务器的初始版本。此版本应是一个最小的、可用于生产环境的应用,其中提供了一个名为 godoc
的工具,用于查找 Go 文档。
目标:创建一个可供生产环境使用的 MCP 服务器,该服务器可公开 go doc 命令,从而允许 LLM 查询 Go 文档。
在 shell 中运行 Gemini CLI 命令:
gemini
首次运行该 CLI 时,系统会要求您选择身份验证模式和主题。对于身份验证模式,请选择“使用 Google 账号登录”,以便使用个人 Google 账号登录,从而享受 Gemini CLI 的慷慨的免费层级。您应该会看到一个用于选择身份验证模式的选项,如下所示:
如果您需要更改所选内容,可以输入 /auth
并按 Enter 键再次打开此菜单。
接下来,系统会提示您选择主题:
与 /auth
类似,您也可以稍后使用 /theme
命令更改主题。
选择身份验证方法和首选主题后,系统会显示命令提示符。您可以在此处输入命令,例如:
Write a hello world application in Go.
该 CLI 会结合自身的推理能力(通过 Gemini Flash 或 Gemini Pro 等 Gemini 模型)和工具来执行任务。当需要与文件系统或外部服务(例如 API、数据库等)互动时,它会使用工具。开箱即用的工具(即“内部工具”)示例包括 read_file、write_file、web_fetch 和 google_search。我们构建的 MCP 服务器也将成为可供 CLI 使用的工具。
首次运行工具时,系统会征求您的许可。您可以授予一次性权限、在会话期间授予全面批准,也可以拒绝其请求。如果是文件编辑操作,您还会看到使用外部编辑器编辑文件的选项,以防您需要进行一些调整。例如,以下是上述提示的输出,用于创建 Hello World 程序:
除了提示之外,您还可以使用斜杠命令。如果您输入“/”,CLI 会自动显示自动补全选项。您可以继续输入完整命令,也可以从选项中选择一个命令。上文提到的 /auth
和 /theme
命令就是此类命令。
熟悉界面后,您就可以开始本部分的主要任务,即让 CLI 为我们编写 MCP 服务器。
创建 Hello World MCP 服务器
确保模型能够更稳定地完成任务的最佳方法之一是将复杂任务分解为多个增量步骤。虽然模型可能能够自行完成复杂的任务,但如果没有正确的设置,它需要很长时间才能找到正确的实现方式。
为了采用更一致的方法,我们将首先指示它构建一个“Hello World”MCP 服务器,然后再实现我们想要的功能(读取 Go 文档)。
以下是一个提示示例:
Your task is to create a Model Context Protocol (MCP) server to expose a "hello world" tool. For the MCP implementation, you should use the official Go SDK for MCP and use the stdio transport.
Read these references to gather information about the technology and project structure before writing any code:
- https://github.com/modelcontextprotocol/go-sdk/blob/main/README.md
- https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle
- https://go.dev/doc/modules/layout
To test the server, use shell commands like these:
(
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}';
echo '{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}';
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}';
) | ./bin/godoctor
请注意,上述提示由三个主要部分组成:
- 问题规范,包括我们想要构建的内容和限制条件(例如,使用官方 SDK 而不是任何其他 SDK)
- 模型的参考文档,可帮助模型消除请求中的歧义
- 一种测试程序,可作为任务的验收标准
有了这三个组成部分,模型就能以更一致的方式实现所需的结果。
Go doc 工具实现
实现正常运行后,我们就可以开始实现真正的“go doc”工具了:
Add a new tool to our MCP server called "godoc" that invokes the "go doc" shell command. The tool will take a mandatory "package" argument and an optional "symbol" argument.
Read the reference for the go doc command to understand its API: https://pkg.go.dev/golang.org/x/tools/cmd/godoc
Test it by executing the call with:
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name": "godoc", "arguments": {"package": "fmt"} } }'
| ./bin/godoctor
Test it using both a standard library package and an external package like "github.com/modelcontextprotocol/go-sdk/mcp", both with and without symbols.
您可以随意尝试此提示,也可以尝试自行想出提示。
实用的命令行界面
确定了合适的实现后,您可以指示模型使用 MCP 客户端创建 godoctor CLI。这将有助于简化功能测试,避免像目前这样手动构建 JSON-RPC 调用。
提示示例:
Now create a godoctor-cli component that will call the MCP server using command transport. This CLI will expose all tools using subcommands and allow us to test the MCP server implementation without needing to build the JSON-RPC calls manually.
Use the reference implementation at https://github.com/modelcontextprotocol/go-sdk/blob/main/README.md to build the client.
Test it by calling from the command line:
- the hello_world tool
- the godoc tool with a local package
- the godoc tool with a local package and symbol
- the godoc tool with an external package
- the godoc tool with an external package and symbol
现在,您已经有了一组可正常运行的客户端和服务器,在下一部分中,您将使用刚刚创建的 MCP 服务器配置 Gemini CLI,以便在下一个编码任务中开始利用其优势。
实用资源
鉴于 MCP 仍是一个新颖的概念,且 MCP 的 Go SDK 是一个新库,在此步骤中,Gemini 可能需要很长时间才能自行发现正确的实现。为了帮助模型找到正确的解决方案,您可能需要向其提供以下参考信息:
- 您可以向模型提供以下提示,以便它更一致地发现 SDK API:“use the go doc shell command to discover the api for the go-sdk library”(使用 go doc shell 命令发现 go-sdk 库的 API)
- 如果模型尝试使用
read_file
工具检查 SDK 的源代码,则会失败,因为 Gemini CLI 无法读取当前范围之外的文件。您可以通过run_shell_command
工具指示其改用cat
和ls
命令。 - 如果模型在调试应用时遇到问题,请指示它添加更详细的日志记录并改进错误消息中的上下文信息。
- 如果所有其他方法都失败了,请提供参考实现:https://github.com/danicat/godoctor
6. 将 godoctor 配置为 Gemini CLI 的 MCP 服务器
在 AI 助理生成客户端和服务器的代码后,您可以指示它运行一些手动测试。例如:
retrieve the documentation for the package net/http
请务必也使用外部依赖项(不在标准库中)对其进行测试:
retrieve the documentation for the go-sdk package
对结果感到满意后,指示它编写一个 README.md 文件,其中包含有关如何使用和开发此项目的说明。
Now write a detailed README.md file explaining both from a user and a developer perspective how to use and to build this project.
现在,我们将配置服务器,以便 Gemini CLI 在下一阶段的开发过程中可以使用该服务器。
- 让 CLI 更新 GEMINI.md,以使用
godoc
作为读取文档的首选方法:
update the GEMINI.md file to use the godoc tool to retrieve documentation about Go packages or symbols. Always prefer to use godoc over WebFetch and GoogleSearch, and only use those when godoc doesn't give a clear answer.
- 现在,我们需要重启 Gemini CLI 以对其进行配置。首先,我们来保存聊天会话,以便您在重新启动后从上次停止的位置继续。
/chat save workshop001
- 按两次 Ctrl+D 退出 CLI。
- 编译服务器二进制文件:创建一个
bin
目录,并将 godoctor 服务器编译到该目录中。
mkdir -p bin
go build -o ./bin/godoctor ./cmd/godoctor # adjust paths as needed
- 为本地工具配置 Gemini CLI:在项目根目录中创建
.gemini/settings.json
文件,并添加mcpServers
部分,以告知 Gemini CLI 如何运行已编译的服务器。
mkdir -p .gemini
touch .gemini/settings.json
- 现在,使用
vim
或nano
等命令行编辑器将以下内容添加到新文件中:
{
"mcpServers": {
"godoctor": {
"command": "./bin/godoctor"
}
}
}
- 现在,启动 Gemini CLI 并恢复聊天会话:
/chat resume workshop001
- 您应该能够通过按 Ctrl+T 看到该工具已加载:
- 通过向 Gemini CLI 发出“获取 net/http 的文档”之类的提示,让其使用您的工具,从而测试集成情况
您应该会看到与以下类似的内容:
如果该工具正常运行,您应该会看到通过工具调用检索到的文档:
恭喜,您已制作了一个 MCP 工具!但这还不是最终版本,我们还可以让它更有用。
7. 添加 AI 赋能的代码审核器
我们来添加一个更复杂的 AI 赋能功能:使用 Gemini API 的代码审核器。
目标:向现有项目添加一个名为 code_review 的新工具。此工具将使用 Gemini API 分析 Go 代码并提供反馈。
提示示例:
I want to add a new tool to my project called code_review. This tool should use the Gemini API to analyze Go code and provide a list of improvements in json format according to the best practices accepted by the Go community. The tool should take the Go code content and an optional hint as input. The hint will be used to provide additional guidance for the AI reviewer, like "focus on security" or "help me simplify this code". Please update the server to include this new tool and modify the CLI client to add a review command to use it.
Use this SDK to call Gemini: https://github.com/googleapis/go-genai
实用提示
一旦模型开始处理该问题,您可能会自动看到它请求调用 godoc
工具来浏览 genai
软件包的文档。如果它没有这样做,您可以随时使用 Esc 键中断该进程,并提醒它现在可以使用 godoc
工具。
测试代码审核器
- 我们需要重启 Gemini CLI 来构建和重新加载 MCP 服务器。使用
/chat save workshop002
保存聊天会话,然后按两次 Ctrl+D 退出 CLI。 - 由于我们需要调用 Gemini 模型来为我们撰写评价,因此
code_review
工具需要 API 密钥。您可以使用 Google AI Studio 生成 API 密钥。 - 使用在上一步中生成的 API 密钥配置环境变量
GEMINI_API_KEY
:
export GEMINI_API_KEY="YOUR_API_KEY"
- 重新编译服务器:添加新工具后,您必须重新编译服务器二进制文件以纳入更改。
go build -o ./bin/godoctor ./cmd/godoctor
- 再次启动 Gemini CLI。恢复与
/chat resume workshop002
的聊天会话。 - 重要提示。确保您已使用个人 Gmail 账号进行身份验证,以便 Gemini CLI 本身不会使用您的结算账号。您可以使用
/auth
命令完成此操作:
- 按 Ctrl+T 确认该工具已启用。您应该会看到与以下类似的内容:
- 现在,我们来测试一下
code-review
工具,方法是查看该工具的其中一个源文件:
“使用 godoctor 工具查看 cmd/godoctor/main.go 文件。”
You should see something like this:
代码审核工具正常运行后,您现在可以建议模型应用其发现的一些改进,从而实现完整的“自我改进”工作流程!
您现在已确认 code-review
工具可以正常运行。在下一部分中,您将学习如何将其部署到云端。
如需清除 GEMINI_API_KEY,请执行以下操作:
- 使用
/chat save workshop003
保存当前会话并退出 CLI - 将 API 密钥备份到安全的地方:
export | grep GEMINI_API_KEY > env.bkp
- 取消设置
GEMINI_API_KEY
:
export GEMINI_API_KEY=
- 重启 CLI 并加载包含
/chat resume workshop003
的会话 - 让模型应用代码审核改进。
8. 为云准备服务器
我们目前开发的 MCP 服务器仅在本地计算机中运行,如果您是为自己开发工具,这没问题,但在企业环境中,我们通常需要部署工具,供数百甚至数千名开发者更广泛地使用。
为了扩缩 MCP 服务器,我们需要将其从仅支持标准 I/O 的服务器转换为支持 HTTP 的服务器,并将其部署到可供不同开发者访问的位置。为了实现此目标,我们将使用 MCP 规范中定义的可流式传输的 HTTP 作为传输模式,并使用 Cloud Run 作为部署目标。
目标:重构 godoctor 服务器以使用可流式传输的 HTTP 传输。
提示示例:
The godoctor server is currently using the stdio transport. I want to deploy it to Cloud Run, so I need to refactor it to use the streamable HTTP transport instead. Please modify the server to comply with the streamable HTTP specification.
实用资源
- 如果模型难以实现可流式传输的 HTTP 传输,您可以向其提供以下参考资料:https://github.com/modelcontextprotocol/go-sdk/blob/main/design/design.md
- 该模型可能会尝试使用 HTTP+SSE,但该功能已弃用。如果您发现它正沿着此路径前进,请将其引导回可流式传输的 HTTP。
使用 HTTP 测试服务器
让模型更新 godoctor 客户端,使其也使用可流式传输的 HTTP,以便您可以测试它是否仍在正常运行。
Now update the client to use streamable HTTP and run a test by retrieving documentation from one package
可选:如果您想将 Gemini CLI 配置为通过 HTTP 使用服务器,请执行以下操作:
- 保存会话并退出 CLI
- 修改
.gemini/settings.json
文件,并将配置更改为指向本地运行的服务器。
"mcpServers": {
"godoctor": {
"httpUrl": "http://localhost:8080"
}
}
- 在本地运行重构后的服务器:
go run ./cmd/godoctor/main.go
- 在新终端中(因为上述操作会阻塞),启动 Gemini CLI 并为其提供提示以测试连接,例如:“使用 godoctor 工具获取 fmt.Println 的文档。”
- 测试完成后,按 Ctrl+C 停止服务器。
9. 使用 Docker 将应用容器化
现在,我们的服务器正在使用正确的传输协议,我们可以将其容器化以进行部署。
目标:创建一个 Dockerfile,将 godoctor 服务器打包到可移植的、可用于生产的容器映像中。
提示示例:
Please create a multi-stage Dockerfile that compiles the Go binary and copies it into a minimal golang image like golang:1.24-alpine.
测试 Docker 映像
创建 Dockerfile
后,构建并运行映像,以确保其正常运行。您可以指示 Gemini 为您执行此操作:
build the image and test the connectivity to the server using the godoctor client
可选:如果您想手动进行测试,请执行以下操作:
- 构建容器。
docker build -t godoctor:latest .
- 在本地运行容器:
docker run -p 8080:8080 -e PORT=8080 godoctor:latest
- 测试正在运行的容器:在另一个终端中,启动 Gemini CLI 并让其提取文档。
- 测试完成后,按 Ctrl+C 停止服务器。
10. 部署到 Cloud Run
现在,我们可以将容器部署到云端了。
目标:将容器化的 godoctor 服务器部署到 Google Cloud Run。
提示指南:让 AI 助理提供用于部署容器的 gcloud 命令。
提示示例:
Now please deploy this image to Cloud Run and return me an URL I can use to call the MCP tool. Deploy it to us-central1 and use the project currently configured in the environment.
部署完成后,我们将配置 Gemini CLI 以使用您刚刚部署的工具。
让 Gemini 更新您的 .gemini/settings.json
文件,以更改 MCP 工具配置,使其指向您部署的服务。
now update the .gemini/settings.json file to use this URL for the godoctor server
最终的 mcpServers
部分应如下所示(请记得将占位符替换为您的实际 Cloud Run 应用网址):
"mcpServers": {
"godoctor": {
"httpUrl": "https://<your-cloud-run-id>.us-central1.run.app"
}
}
测试 Cloud Run 部署
现在,您可以进行最终的端到端测试了。
最后一次重启 Gemini CLI(使用 /chat save
和 /chat resume
保留上下文)。现在,CLI 应该能够调用远程 MCP 服务器。尝试询问任何软件包的文档。
请注意,为了使用代码审核工具,服务需要 GEMINI_API_KEY
。您可以让 Gemini CLI 使用正确的环境重新部署该应用:
update the cloud run environment to add a GEMINI_API_KEY and use the value in @env.bkp. Then update the .gemini/settings.json file with the correct service URL
重启 CLI 并通过提示对其进行测试:
Use the godoctor tool to review the cmd/godoctor/main.go file
Gemini CLI 现在将连接到已部署的 Cloud Run 服务并执行代码审核。
提示示例:
I'm done with my tests on the CloudRun server, please delete this deployment for me and revert my .gemini/settings.json to use the local version.
11. 恭喜!
您已成功引导 AI 助理构建、容器化和部署了一款复杂的 AI 赋能工具。更重要的是,您练习了现代软件开发的一项基本技能:将需求转化为有效的提示。您已成功使用自定义工具扩展了 Gemini CLI,使其成为更强大、更专业的 Go 开发助理。