使用 Gemini CLI 的 MCP 服务器
本文档提供了配置和使用 Gemini CLI 的模型上下文协议 (Model Context Protocol, MCP) 服务器的指南。
什么是 MCP 服务器?
MCP 服务器是一种通过模型上下文协议向 Gemini CLI 暴露工具和资源的应用程序,使其能够与外部系统和数据源交互。MCP 服务器充当 Gemini 模型与您的本地环境或其他服务(如 API)之间的桥梁。
MCP 服务器使 Gemini CLI 能够:
- 发现工具:通过标准化模式定义列出可用工具、其描述和参数
- 执行工具:使用定义的参数调用特定工具并接收结构化响应
- 访问资源:从特定资源读取数据(尽管 Gemini CLI 主要专注于工具执行)
通过 MCP 服务器,您可以扩展 Gemini CLI 的功能,执行超出其内置特性的操作,例如与数据库、API、自定义脚本或专用工作流交互。
核心集成架构
Gemini CLI 通过内置在核心包 (packages/core/src/tools/
) 中的复杂发现和执行系统与 MCP 服务器集成:
发现层 (mcp-client.ts
)
发现过程由 discoverMcpTools()
协调,该函数:
- 遍历配置的服务器:从您的
settings.json
文件的mcpServers
配置中获取 - 建立连接:使用适当的传输机制(Stdio、SSE 或 Streamable HTTP)
- 获取工具定义:使用 MCP 协议从每个服务器获取
- 清理和验证:工具模式以确保与 Gemini API 的兼容性
- 注册工具:在全局工具注册表中进行注册,并解决冲突
执行层 (mcp-tool.ts
)
每个被发现的 MCP 工具都会被封装在 DiscoveredMCPTool
实例中,该实例具有以下功能:
- 处理确认逻辑:基于服务器信任设置和用户偏好
- 管理工具执行:通过调用 MCP 服务器并传递正确参数
- 处理响应:为 LLM 上下文和用户显示准备响应数据
- 维护连接状态:处理超时情况
传输机制
Gemini CLI 支持三种 MCP 传输类型:
- 标准输入输出传输(Stdio Transport):生成子进程并通过 stdin/stdout 进行通信
- 服务器推送事件传输(SSE Transport):连接到 Server-Sent Events 端点
- 可流式 HTTP 传输(Streamable HTTP Transport):使用 HTTP 流进行通信
如何设置您的 MCP 服务器
Gemini CLI 使用 settings.json
文件中的 mcpServers
配置来定位和连接 MCP 服务器。该配置支持具有不同传输机制的多个服务器。
在 settings.json 中配置 MCP 服务器
您可以在全局级别的 ~/.gemini/settings.json
文件中配置 MCP 服务器,或者在项目根目录中创建/打开 .gemini/settings.json
文件。在文件中添加 mcpServers
配置块。
配置结构
向您的 settings.json
文件添加 mcpServers
对象:
{ ...文件包含其他配置对象
"mcpServers": {
"serverName": {
"command": "path/to/server",
"args": ["--arg1", "value1"],
"env": {
"API_KEY": "$MY_API_TOKEN"
},
"cwd": "./server-directory",
"timeout": 30000,
"trust": false
}
}
}
配置属性
每个服务器配置支持以下属性:
必需项(以下任选其一)
command
(字符串):用于 Stdio 传输的可执行文件路径url
(字符串):SSE 端点 URL(例如"http://localhost:8080/sse"
)httpUrl
(字符串):HTTP 流端点 URL
可选参数
args
(string[]): Stdio 传输方式的命令行参数env
(object): 服务器进程的环境变量。值可以使用$VAR_NAME
或${VAR_NAME}
语法引用环境变量cwd
(string): Stdio 传输方式的工作目录timeout
(number): 请求超时时间(毫秒,默认:600,000ms = 10 分钟)trust
(boolean): 当为true
时,跳过此服务器的所有工具调用确认(默认:false
)
配置示例
Python MCP 服务器 (Stdio)
{
"mcpServers": {
"pythonTools": {
"command": "python",
"args": ["-m", "my_mcp_server", "--port", "8080"],
"cwd": "./mcp-servers/python",
"env": {
"DATABASE_URL": "$DB_CONNECTION_STRING",
"API_KEY": "${EXTERNAL_API_KEY}"
},
"timeout": 15000
}
}
}
Node.js MCP 服务器 (Stdio)
{
"mcpServers": {
"nodeServer": {
"command": "node",
"args": ["dist/server.js", "--verbose"],
"cwd": "./mcp-servers/node",
"trust": true
}
}
}
基于 Docker 的 MCP 服务器
{
"mcpServers": {
"dockerizedServer": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"API_KEY",
"-v",
"${PWD}:/workspace",
"my-mcp-server:latest"
],
"env": {
"API_KEY": "$EXTERNAL_SERVICE_TOKEN"
}
}
}
}
基于 HTTP 的 MCP 服务器
发现流程深度解析
当 Gemini CLI 启动时,它会通过以下详细流程执行 MCP 服务器发现:
1. 服务器迭代与连接
对于 mcpServers
中配置的每个服务器:
- 开始状态跟踪:服务器状态设置为
CONNECTING
- 传输协议选择:基于配置属性:
httpUrl
→ 使用StreamableHTTPClientTransport
url
→ 使用SSEClientTransport
command
→ 使用StdioClientTransport
- 建立连接:MCP客户端尝试在配置的超时时间内建立连接
- 错误处理:连接失败会被记录,服务器状态设置为
DISCONNECTED
2. 工具发现
成功连接后:
- 工具列表获取:客户端调用MCP服务器的工具列表端点
- 模式验证:验证每个工具的函数声明
- 名称规范化:清理工具名称以满足Gemini API要求:
- 无效字符(非字母数字、下划线、点、连字符)替换为下划线
- 超过63个字符的名称会被截断并在中间添加替换符(
___
)
3. 冲突解决
当多个服务器暴露同名工具时:
- 先注册者优先:第一个注册工具名称的服务器获得无前缀名称
- 自动添加前缀:后续服务器获得带前缀的名称:
serverName__toolName
- 注册表跟踪:工具注册表维护服务器名称与其工具之间的映射关系
4. 模式处理
工具参数模式经过规范化处理以确保与Gemini API兼容:
- 移除
$schema
属性 - 去除
additionalProperties
- 移除 带有
default
的anyOf
的默认值(确保Vertex AI兼容性) - 对嵌套模式进行 递归处理
5. 连接管理
发现阶段完成后:
- 持久连接:成功注册工具的服务器会保持其连接状态
- 清理机制:未提供可用工具的服务器连接将被关闭
- 状态更新:最终服务器状态会被设置为
CONNECTED
(已连接)或DISCONNECTED
(已断开)
工具执行流程
当 Gemini 模型决定使用 MCP 工具时,将按以下流程执行:
1. 工具调用
模型生成包含以下内容的 FunctionCall
:
- 工具名称:注册的名称(可能带有前缀)
- 参数:符合工具参数模式的 JSON 对象
2. 确认流程
每个 DiscoveredMCPTool
都实现了复杂的确认逻辑:
基于信任的跳过机制
动态允许列表
系统维护以下内部允许列表:
- 服务器级别:
serverName
→ 来自该服务器的所有工具均受信任 - 工具级别:
serverName.toolName
→ 该特定工具受信任
用户选择处理
当需要确认时,用户可选择:
- 仅执行一次:本次执行但不保存设置
- 始终允许此工具:添加到工具级允许列表
- 始终允许此服务器:添加到服务器级允许列表
- 取消:中止执行
3. 执行阶段
获得确认(或信任跳过)后:
- 参数准备:根据工具模式验证参数有效性
- MCP调用:底层
CallableTool
通过以下方式调用服务器:
- 响应处理:将结果格式化为适合 LLM 上下文和用户显示的格式
4. 响应处理
执行结果包含:
llmContent
: 语言模型上下文使用的原始响应部分returnDisplay
: 供用户显示的格式化输出(通常为 Markdown 代码块中的 JSON)
如何与您的 MCP 服务器交互
使用 /mcp
命令
/mcp
命令提供关于 MCP 服务器设置的完整信息:
该命令显示:
- 服务器列表: 所有已配置的 MCP 服务器
- 连接状态:
CONNECTED
(已连接)、CONNECTING
(连接中)或DISCONNECTED
(已断开) - 服务器详情: 配置摘要(不含敏感数据)
- 可用工具: 来自各服务器的工具列表及描述
- 发现状态: 整体发现过程状态
/mcp
命令输出示例
MCP 服务器状态:
📡 pythonTools (已连接)
命令:python -m my_mcp_server --port 8080
工作目录:./mcp-servers/python
超时:15000毫秒
工具:calculate_sum, file_analyzer, data_processor
🔌 nodeServer (已断开)
命令:node dist/server.js --verbose
错误:连接被拒绝
🐳 dockerizedServer (已连接)
命令:docker run -i --rm -e API_KEY my-mcp-server:latest
工具:docker__deploy, docker__status
发现状态:已完成
工具使用
发现工具后,MCP 工具对 Gemini 模型来说就像内置工具一样可用。模型会自动:
- 根据请求选择合适工具
- 显示确认对话框(除非服务器被信任)
- 使用正确参数执行工具
- 以用户友好格式显示结果
状态监控与故障排除
连接状态
MCP 集成跟踪以下几种状态:
服务器状态 (MCPServerStatus
)
DISCONNECTED
: 服务器未连接或存在错误CONNECTING
: 正在尝试连接CONNECTED
: 服务器已连接并准备就绪
发现状态 (MCPDiscoveryState
)
NOT_STARTED
: 发现流程尚未开始IN_PROGRESS
: 正在发现服务器COMPLETED
: 发现流程已完成(无论是否出现错误)
常见问题与解决方案
服务器无法连接
症状: 服务器显示 DISCONNECTED
状态
故障排除:
- 检查配置: 确认
command
、args
和cwd
配置正确 - 手动测试: 直接运行服务器命令确保其正常工作
- 检查依赖: 确保所有必需的包已安装
- 查看日志: 检查 CLI 输出中的错误信息
- 验证权限: 确保 CLI 有执行服务器命令的权限
未发现任何工具
症状: 服务器已连接但无可用工具
故障排除:
- 验证工具注册: 确保您的服务器确实注册了工具
- 检查 MCP 协议: 确认您的服务器正确实现了 MCP 工具列表功能
- 查看服务器日志: 检查 stderr 输出中的服务器端错误
- 测试工具列表: 手动测试服务器的工具发现端点
工具无法执行
症状: 工具被发现但在执行时失败
故障排除:
- 参数验证: 确保您的工具接受预期参数
- 模式兼容性: 验证您的输入模式是有效的 JSON Schema
- 错误处理: 检查工具是否抛出未处理的异常
- 超时问题: 考虑增加
timeout
设置
沙盒兼容性
症状: 启用沙盒时 MCP 服务器失败
解决方案:
- 基于 Docker 的服务器: 使用包含所有依赖项的 Docker 容器
- 路径可访问性: 确保服务器可执行文件在沙盒中可用
- 网络访问: 配置沙盒允许必要的网络连接
- 环境变量: 验证所需的环境变量已正确传递
调试技巧
- 启用调试模式: 使用
--debug_mode
参数运行 CLI 以获取详细输出 - 检查标准错误: MCP 服务器的 stderr 会被捕获并记录(INFO 级别的消息会被过滤)
- 隔离测试: 在集成前先独立测试您的 MCP 服务器
- 渐进式设置: 先从简单的工具开始,再逐步添加复杂功能
- 频繁使用
/mcp
: 在开发过程中监控服务器状态
重要注意事项
安全考量
- 信任设置:
trust
选项会绕过所有确认对话框。请谨慎使用,仅用于您完全控制的服务器 - 访问令牌: 配置包含 API 密钥或令牌的环境变量时需注意安全性
- 沙盒兼容性: 使用沙盒环境时,确保 MCP 服务器在沙盒内可用
- 私有数据: 使用范围过广的个人访问令牌可能导致仓库间的信息泄露
性能与资源管理
- 连接持久化: CLI 会与成功注册工具的服务器保持持久连接
- 自动清理: 对未提供任何工具的服务器连接会自动关闭
- 超时管理: 根据服务器响应特性配置适当的超时时间
- 资源监控: MCP 服务器作为独立进程运行,会消耗系统资源
模式兼容性
- 属性剥离: 系统会自动移除某些模式属性(
$schema
、additionalProperties
)以确保与 Gemini API 兼容 - 名称净化: 工具名称会自动净化以满足 API 要求
- 冲突解决: 服务器间的工具名称冲突会通过自动添加前缀来解决
这种全面的集成使 MCP 服务器成为扩展 Gemini CLI 功能的强大方式,同时保持了安全性、可靠性和易用性。