如何保护您的 MCP 服务器的 API 密钥(附可运行演示)
Source: Dev.to
每个 MCP 开发者都忽视的问题
你在构建一个 MCP 服务器。它需要 GitHub token,可能还需要 OpenAI key。它们该放在哪里?
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["server.js"],
"env": {
"GITHUB_TOKEN": "ghp_XXXXXXXXXXXX",
"OPENAI_API_KEY": "sk-XXXXXXXXXXXX"
}
}
}
}
明文。放在 JSON 文件里。磁盘上。甚至可能已经提交到 git。
这就是大多数 MCP 服务器今天处理机密的方式。 这是一颗定时炸弹。
更好的办法:加密金库 + 运行时解密
我做了一个演示 MCP 服务器,采用了不同的做法。它不再从环境变量读取机密,而是从 Janee——为 MCP 服务器设计的加密金库——中获取。
流程:
flowchart LR
A[Claude Desktop] --> B[MCP Protocol] --> C[Your Server] --> D[Janee Vault] --> E[API Call]
D -->|AES-256-GCM encrypted| C
磁盘上永远没有明文机密。
亲自尝试(5 分钟)
git clone https://github.com/lucamorettibuilds/janee-mcp-demo
cd janee-mcp-demo
npm install
# 设置加密金库
npx janee init # 创建加密金库
npx janee add github # 存储你的 GitHub token(加密)
npx janee add openai # 存储你的 OpenAI key(加密)
# 运行它
export JANEE_MASTER_PASSWORD="your-password"
npm start
服务器公开了三个 MCP 工具:
github_create_issue— 使用金库凭证创建 GitHub issueopenai_complete— 使用金库凭证调用 OpenAIlist_secrets— 显示金库中有哪些密钥(仅名称,从不显示值)
代码工作原理
核心是一个小型集成层(src/secrets.js):
import { execSync } from "child_process";
export async function getSecret(service, field) {
try {
const result = execSync(
`npx janee get ${service} ${field} 2>/dev/null`,
{ encoding: "utf-8", env: { ...process.env } }
).trim();
return result || null;
} catch {
return null;
}
}
然后在你的 MCP 工具处理函数中,取代 process.env.GITHUB_TOKEN:
const token = await getSecret("github", "token");
机密在运行时从金库解密,用于 API 调用,且不会在内存中保留超过必要的时间。
Claude Desktop 配置
{
"mcpServers": {
"janee-demo": {
"command": "node",
"args": ["/path/to/janee-mcp-demo/src/server.js"],
"env": {
"JANEE_MASTER_PASSWORD": "your-master-password"
}
}
}
}
一个密码保护你所有的 API 密钥。再也不需要零散的环境变量。
为什么不直接使用 .env 文件?
| 功能 | .env 文件 | Janee 金库 |
|---|---|---|
| 存储方式 | 明文 | AES‑256‑GCM 加密 |
| 访问控制 | 无 | 基于会话的 TTL |
| 轮换 | 手动查找‑替换 | janee add service(覆盖) |
| 审计 | 无 | 内置日志 |
| Git 安全性 | 需要 .gitignore 纪律 | 金库文件可安全提交 |
添加你自己的服务
演示中已经包含 GitHub 和 OpenAI,但你可以添加任何服务:
npx janee add stripe
npx janee add anthropic
npx janee add postgres
随后在工具处理函数中使用 getSecret("stripe", "api_key")。
获取代码
- 演示仓库:
- Janee(机密管理器):
- MCP 规范:
如果你正在构建 MCP 服务器,请给你的机密应有的尊重。⭐ 如果有用,请给 Janee 点星。