$ keygrant
你的 API key 不该出现在 agent 的上下文里。
keygrant 是给 AI 编程 agent 用的密钥管理工具。模型只看到名字,进程拿到值,每条命令都由你批准。
上下文里的东西都可能泄露
agent 每天都在读不可信的内容:网页、issue、README、工具返回的结果。只要其中藏着一句注入指令,模型就可能把上下文里的任何内容吐出去:写进 URL、工具调用或生成的代码。上下文还会被记进日志、存进可观测性平台、随会话记录被分享出去。只要 key 在上下文里,agent 的每一个输出通道都是外泄通道。
解决办法不是“小心一点”,而是从架构上改:
model context: $STRIPE_KEY (只有名字)
child process: sk-live-************ (执行时注入)
output channel: [STRIPE_KEY:REDACTED] (base64/hex/url 也会脱敏)
工作原理
操作系统原生存储
Windows 用 DPAPI,macOS 用钥匙串,Linux 用 Secret Service。不写进 dotfile,也不贴进对话。
通过 MCP 注入
exec_with_secrets 只把值注入到执行命令的那个子进程里,并在模型看到输出之前完成脱敏。
每条命令都由你批准
系统原生对话框显示完整命令。一次授权只覆盖这一条命令、这一个 agent 会话、15 分钟,只存在内存里。超时即拒绝。
刻意不提供存储工具
agent 也不能写入密钥:值一旦出现在工具调用里,就进了上下文。值只能从带外渠道录入。
安装
uv tool install keygrant # 或:pipx install keygrant(需要 Python ≥ 3.10)
keygrant init # 在项目里写好 .mcp.json 和 CLAUDE.md
echo "sk-..." | keygrant set STRIPE_KEY --desc "stripe, test mode" 然后重启 Claude Code。完整步骤见快速开始。
可选:跨设备同步,用手机审批
在你的多台电脑之间做端到端加密同步(服务器只存它解不开的密文),以及人不在电脑前时用的手机审批器(裁决在你的手机上签名,中转服务器无法伪造)。两者都处于预览版。了解原理 →
它防不住什么
- 批准过的命令仍然可能外泄。 对话框会显示完整命令,认真看它就是这道防线。按密钥绑定出站白名单已在路线图上。
- 脱敏是第二道防线,不是保证。 真正的保证是值从一开始就不进上下文。
- 本机恶意软件不在防护范围内。 keygrant 管的是 agent 能碰到什么,它不是杀毒软件。
路线图
- 常驻托盘程序:审批历史、一键吊销
- 按密钥绑定出站白名单:每个 key 只能发往它自己的 API
- 手机审批器的推送通知