$ keygrant

你的 API key 不该出现在 agent 的上下文里。

keygrant 是给 AI 编程 agent 用的密钥管理工具。模型只看到名字,进程拿到值,每条命令都由你批准。

开始使用 → GitHub 设计理念:威胁模型
演示: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。完整步骤见快速开始。

可选:跨设备同步,用手机审批

在你的多台电脑之间做端到端加密同步(服务器只存它解不开的密文),以及人不在电脑前时用的手机审批器(裁决在你的手机上签名,中转服务器无法伪造)。两者都处于预览版。了解原理 →

它防不住什么

路线图