API Key 和环境变量怎么保存
许多 MCP Server Required API Key 或 Token 才能工作。本文介绍如何安全存储这些凭据,避免意外泄露到公开仓库或日志中。
核心原则
- 不要硬编码:API Key 不应出现在代码文件或公开的配置文件中
- 不要提交:包含真实 Key 的文件不应被 git 跟踪
- 最小权限:为每个用途创建独立的 Key,只授予必要权限
- 定期轮换:定期更换 Key,尤其是怀疑泄露时立即更换
方法一:直接写在 MCP 配置的 env 字段
最简单的方式,适合个人使用且配置文件不会被提交到公开仓库的Category:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxx"
}
}
}
}
注意:确保该配置文件已加入 .gitignore,不会被提交到版本控制。
方法二:使用 .env 文件 + 环境变量引用
将 Key 存放在单独的 .env 文件中,配置文件引用环境变量名:
第一步:创建 .env 文件:
# .env 文件(不要提交到 git)
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
OPENAI_API_KEY=sk-xxxxxxxxxxxx
第二步:将 .env 加入 .gitignore:
# .gitignore
.env
.env.local
.env.*.local
第三步:在启动Clients前加载环境变量(macOS/Linux):
# 在 ~/.zshrc 或 ~/.bashrc 中添加
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
Claude Desktop 会继承系统环境变量,因此 env 字段中可以引用已设置的变量。
方法三:使用系统密钥管理工具
对安全性要求更高的场景,可以使用操作系统的密钥管理:
macOS Keychain
# 存储
security add-generic-password -a "mcp" -s "github-token" -w "ghp_xxxxxxxxxxxx"
# 读取(可在脚本中使用)
security find-generic-password -a "mcp" -s "github-token" -w
Windows Credential Manager
通过"控制面板 > 凭据管理器"添加通用凭据,或使用 PowerShell:
# Required安装 CredentialManager 模块
Install-Module -Name CredentialManager
New-StoredCredential -Target "mcp-github" -UserName "token" -Password "ghp_xxxxxxxxxxxx"
各平台配置文件位置与保护
| Clients | 配置文件位置 | 保护建议 |
|---|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json | 系统目录,默认不在 git 中 |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json | 系统目录,默认不在 git 中 |
| Cursor (项目级) | .cursor/mcp.json | 加入 .gitignore |
| Cursor (全局) | ~/.cursor/mcp.json | 系统目录,默认不在 git 中 |
泄露后的应急处理
- 立即轮换:在对应平台(GitHub、OpenAI 等)立即撤销旧 Key 并生成新 Key
- 检查使用记录:View Key 的调用日志,确认是否有异常使用
- 清理 git 历史:如果 Key 被提交到 git,仅删除文件不够,Required清理历史记录
- 更新配置:用新 Key 更新所有使用该凭据的配置
重要:即使仓库是私有的,一旦 Key 进入 git 历史就应视为已泄露。GitHub 等平台会扫描公开仓库中的 Key 并自动通知。
Important Notes
- 不同服务的 Key 格式不同:GitHub 以
ghp_开头,OpenAI 以sk-开头。 - 创建 Key 时选择最小权限范围。例如 GitHub Token 只勾选
repo:read而非全部权限。 - 设置 Key 的过期时间,避免永久有效的 Key 被遗忘后泄露。
- 团队协作时,每人使用自己的 Key,不要共享同一个。
FAQ
- Claude Desktop 的配置文件Required加入 .gitignore 吗?
- Claude Desktop 的配置文件在系统应用数据目录中(不在项目目录),通常不会被 git 跟踪。但如果你把配置文件Copy到了项目中做备份,那个副本Required加入 .gitignore。
- env 字段中的值会出现在日志中吗?
- 正常情况下不会。但某些 Server 的调试日志可能打印环境变量,建议不要在生产环境开启 Server 的 debug 模式。
- 可以多个 Server 共用同一个 API Key 吗?
- 技术上可以,但不建议。为每个 Server 创建独立的 Key,这样某个 Key 泄露时只Required轮换一个,不影响其他 Server。