随着Model Context Protocol (MCP) 的普及,越来越多的开发者开始使用Gemini CLI来调试和连接各种MCP服务器。无论是连接简单的工具集,还是对接Google Cloud上有着严格权限管控的企业级服务,选择合适的验证方式对于保障安全性和可用性都不可或缺。
Gemini CLI 安装
如果还没有安装Gemini CLI,可以通过以下方式快速安装。
Node 版本管理
Gemini CLI 依赖于 Node.js 环境。
ServBay 能一键安装最新的Node.js环境,并且支持从Node 12到Node 24的全版本覆盖。并且 ServBay 允许不同版本的Node.js同时并存,无需反复切换或配置环境变量,这为运行和调试Gemini CLI提供了坚实的基础。

bash
npm install -g @google/gemini-cli
接下来来看看如何在CLI环境中定义安全。
CLI环境下的安全定义
在本地运行CLI时,安全不仅仅指传输加密(HTTPS),更关乎凭证管理 和令牌生命周期。
-
低安全性:将长效、静态的API Key明文保存在配置文件中。一旦文件泄露或误提交到代码仓库,凭证就会永久暴露。
-
高安全性:使用应用默认凭证(ADC)或服务账号模拟。这些凭证通常存储在本地,但生命周期短,且由Google Cloud CLI (gcloud) 自动刷新。即使机器失陷,攻击者的窗口期也非常有限。
以下是四种主要的验证配置策略。
1. 静态HTTP标头 (API Keys & Bearer Tokens)
这是最直接的方法,适用于那些依赖长效API Key或个人访问令牌(PAT)的第三方服务。
虽然可以通过编辑配置文件来添加,但在添加服务器时直接通过命令行参数指定最为快捷。Gemini CLI提供了gemini mcp add命令,配合--header参数即可实现。
命令行示例:
假设要添加一个天气服务,并使用Bearer Token进行保护:
bash
gemini mcp add weather-service https://api.weather-data.com/mcp \
--transport http \
--header "Authorization: Bearer secret-token-123"
该命令会自动更新settings.json文件。需要注意显式定义transport类型,因为默认的标准输入输出(stdio)模式会忽略HTTP标头。
配置文件示例 (settings.json):
为了避免将Token明文写入文件,Gemini CLI支持在配置文件中引用环境变量。在CLI初始化时,${ENV_VAR}会被替换为实际值。
json
{
"mcpServers": {
"data-tool": {
"httpUrl": "https://api.myservice.com/mcp",
"headers": {
"Authorization": "Bearer ${APP_API_TOKEN}",
"X-Org-Id": "org-888"
}
}
}
}
-
优点:配置简单,易于手动生成。
-
缺点:长效Token存在泄露风险。
2. Google凭证 (google_credentials)
对于处于Google Cloud生态系统中的开发者,这是首选方案。它自动利用本地环境的凭证------通常是应用默认凭证(ADC)或当前激活的gcloud会话。
Gemini CLI会拦截请求并注入属于当前用户的Google ID Token。这非常适合调用部署在Cloud Run或Cloud Functions上的私有MCP服务。
配置示例 (settings.json):
只需指定authProviderType字段:
json
{
"mcpServers": {
"cloud-logger": {
"httpUrl": "https://logger-service-abc.a.run.app/sse",
"authProviderType": "google_credentials"
}
}
}
-
优点:使用短效、可轮换的Token,安全性高。
-
缺点:依赖gcloud登录状态。
3. 服务账号模拟 (service_account_impersonation)
google_credentials使用的是个人身份,而服务账号模拟允许Gemini CLI使用一个独立的、仅供机器使用的身份。
在本地开发中,这种方式主要用于生产环境模拟 (测试Bot在受限权限下的行为)或身份隔离(目标MCP服务器拒绝人类用户,仅接受特定的服务账号)。
工作流程:
-
用户请求扮演服务账号。
-
Google IAM验证用户是否拥有"Token Creator"角色。
-
Gemini CLI获取代表该服务账号的Token,并用其访问目标服务。
配置示例 (settings.json):
json
{
"mcpServers": {
"finance-bot": {
"httpUrl": "https://secure-finance.a.run.app/sse",
"authProviderType": "service_account_impersonation",
"targetServiceAccount": "bot-sa@my-gcp-project.iam.gserviceaccount.com",
"targetAudience": "https://secure-finance.a.run.app"
}
}
}
注意:如果是Cloud Run服务, targetAudience通常就是服务的URL。
前置权限设置:
必须授予当前用户账号模拟服务账号的权限。
json
# 定义变量
export PROJ_ID="my-gcp-project"
export SA_EMAIL="bot-sa@${PROJ_ID}.iam.gserviceaccount.com"
export MY_EMAIL="developer@company.com"
# 授予 Token Creator 角色
gcloud iam service-accounts add-iam-policy-binding "${SA_EMAIL}" \
--member="user:${MY_EMAIL}" \
--role="roles/iam.serviceAccountTokenCreator" \
--project="${PROJ_ID}"
IAM权限变更是最终一致性的,可能需要等待一两分钟才会生效。
-
优点:遵循最小权限原则,权限管控严格。
-
缺点:IAM配置相对繁琐。
4. 内置OAuth 2.0支持
针对GitHub、Linear或Slack等需要标准用户登录流程的复杂第三方服务,Gemini CLI内置了OAuth处理程序。
Shell命令方式:
在开始工作前,可以通过Shell命令完成认证。
json
# 查看需认证服务列表
gemini mcp auth
# 启动GitLab服务的登录流程(弹出浏览器)
gemini mcp auth gitlab-server
交互式命令方式:
如果在Gemini CLI的交互会话中遇到权限错误,无需退出工具,直接在对话框中输入指令即可:
json
>>> User: 请列出我的待办事项。
>>> Gemini: 我需要Linear的访问权限。
>>> /mcp auth linear-server
-
优点:标准的OAuth流程,Token自动刷新,用户体验好。
-
缺点:需要定期进行浏览器交互登录。
总结
选择哪种验证方式,取决于凭证的存储位置和使用场景:
-
静态标头:适用于提供通用API Key的第三方服务。建议配合环境变量使用,避免明文存储。
-
Google凭证:适用于Google Cloud内部工具开发,快速且安全。
-
服务账号模拟:适用于权限测试或需要严格身份隔离的场景。
-
内置OAuth:适用于需要代表用户在第三方生态(如GitHub PR)中操作的场景。