关于 enclave
enclave 让 Agent 通过一次性链接安全收集密码、API 密钥等秘密,并存入本地加密保险库。它适合需要使用凭据但不应让凭据出现在聊天或工具结果中的 Agent 工作流。
主要功能
- 01浏览器端加密的一次性收集链接
- 02加密保存秘密与 2FA 代码
- 03运行命令时注入并隐藏秘密
- 04支持 passkey 登录签名
- 05导入 Proton Pass 保险库
适用场景
- 01让 Agent 请求账户密码而不经过聊天
- 02在命令中使用 API 密钥并隐藏输出
- 03通过保存的 passkey 登录网站
MCP 相关
提供 stdio MCP 服务,供客户端创建秘密请求、等待答复、运行带秘密的命令、列出条目及发起 passkey 登录。工具不会返回秘密值。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 此机密信息的用途。用户会将其作为标题看到,例如 "Netflix" 或 "OpenAI API key"。 |
| fields | array | 否 | 要询问的内容,例如 ["email", "password"]。默认为 ["password"]。名为 "totp" 的字段用于请求 2FA 设置密钥。 |
详细介绍
你的 AI Agent 需要你的 Netflix 密码。它不会在聊天中向你索要,而是会发送一个链接。你输入密码(或由密码管理器自动填入),然后点击 发送。密码在离开浏览器前就已加密锁定,因此只有你的 Agent 能打开它。Agent 会将密码保存在自己的保险库中,与双重身份验证代码和通行密钥放在一起,并在之后使用,而无需查看密码。
hex I need your Netflix login to finish this: https://moonlit-lynx-37.convex.site/k3Jd8vQ2…
you open it, type, tap Send
hex saved Netflix: email, password
它开箱即用,可配合托管中继使用。无需账户,无需设置密钥,也无需用户安装任何东西。
设置你的 Agent
带有 shell 的 Agent(Claude Code、Codex、Cursor、Gemini CLI、OpenCode 和另外 30 个)可通过技能使用:
npx skills add AVGVSTVS96/enclave
它会通过 npx 运行 enclave,因此无需安装其他内容。
使用 MCP 的 Agent 可通过工具使用相同功能。添加下面的服务,并在 Agent 的指令中添加这一行,因为仅有工具并不能阻止模型在聊天中索要信息:
需要密码、API 密钥或其他秘密信息时,请使用 enclave 工具索取,不要在聊天中索取。
Claude Code
/plugin marketplace add AVGVSTVS96/enclave
/plugin install enclave@enclave
也可以作为 MCP 工具使用:
claude mcp add enclave -- npx -y enclave-link mcp
Codex
codex mcp add enclave -- npx -y enclave-link mcp
Codex 默认会在 60 秒后停止工具,而 wait_for_secret 最长可等待 25 分钟,因此请在 ~/.codex/config.toml 的 [mcp_servers.enclave] 下添加:
tool_timeout_sec = 1800
Cursor、Claude Desktop、Windsurf、Cline、Roo Code、Kiro、Junie、Factory
它们都使用相同的 JSON:
{
"mcpServers": {
"enclave": { "command": "npx", "args": ["-y", "enclave-link", "mcp"] }
}
}
| 应用 | 配置位置 |
|---|---|
| Cursor | ~/.cursor/mcp.json,或项目中的 .cursor/mcp.json |
| Claude Desktop | Settings → Developer → Edit Config |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Cline | MCP Servers → Configure MCP Servers |
| Roo Code | .roo/mcp.json |
| Kiro | ~/.kiro/settings/mcp.json |
| JetBrains Junie | ~/.junie/mcp/mcp.json |
| Factory | ~/.factory/mcp.json |
VS Code 和 GitHub Copilot
.vscode/mcp.json:
{
"servers": {
"enclave": { "type": "stdio", "command": "npx", "args": ["-y", "enclave-link", "mcp"] }
}
}
Gemini CLI
gemini extensions install https://github.com/AVGVSTVS96/enclave
Grok Build
grok mcp add enclave -- npx -y enclave-link mcp
OpenCode
opencode.json:
{
"mcp": {
"enclave": { "type": "local", "command": ["npx", "-y", "enclave-link", "mcp"] }
}
}
Zed
在 Zed 的 settings.json 中:
{
"context_servers": {
"enclave": { "command": "npx", "args": ["-y", "enclave-link", "mcp"], "env": {} }
}
}
OpenClaw、Hermes 和其他聊天助手
通过 Telegram、Discord 或 WhatsApp 与你对话的助手应使用技能(npx skills add AVGVSTVS96/enclave),这样链接才能发送到聊天中。如需使用 MCP:
openclaw mcp add enclave --command npx --arg -y --arg enclave-link --arg mcp
Hermes 的 ~/.hermes/config.yaml 配置:
mcp_servers:
enclave:
command: npx
args: ["-y", "enclave-link", "mcp"]
timeout: 1800
Goose
运行 goose configure,选择 Add Extension → Command-line Extension,输入 npx -y enclave-link mcp,并将超时时间设为 1800 秒。
ChatGPT、Claude.ai 以及 Gemini 和 Grok 应用目前无法使用 enclave:它们在云端运行,而保险库位于 Agent 运行的计算机上。上文提到的桌面版和编码 Agent 版本可以使用。
你自己的代码可以使用 TypeScript SDK;请参阅 SDK。
工作原理
agent relay (Convex) person's browser
───── ────────────── ────────────────
makes a one-time key pair
enclave ask ─── open ──────────▶ stores an empty request
◀── link ───────────
sends https://…/<id>#key=… ──────────────────────────────────▶ opens the link
reads the key after #
(browsers never send it)
encrypts the answer
stores encrypted bytes ◀───────── POST, once
enclave wait ◀── live update ───
decrypts, saves to its vault
deletes the request ────────▶ gone
- 中继无法读取任何内容。 它需要的密钥从未离开 Agent 的电脑。公钥位于链接中
#后面的部分,浏览器不会将这部分发送给服务端,因此中继甚至不知道请求的内容。 - 链接只能使用一次,并且会过期。 以第一个答案为准;Agent 获取答案后,请求会立即删除,或者在 24 小时后删除。
- 无需轮询。
enclave wait会保持一个实时的 Convex 订阅,并在答案到达时立即唤醒。
在看不到机密的情况下使用它
enclave run KEY="OpenAI API key/key" sh -c 'curl -s https://api.openai.com/v1/models -H "Authorization: Bearer $KEY"'
run 的用法类似 env,但值来自保险库;这些值出现在命令输出中的任何位置时,都会替换为 [hidden KEY]。请将命令括起来,避免你自己的 shell 先展开 $KEY。
要在登录表单中输入密码,请将密码直接通过管道传给负责输入的工具:enclave get Netflix password | <typer>。名为 totp 的字段存储 2FA 设置密钥,enclave get GitHub totp 会返回当前的 6 位验证码。
通行密钥
名为 passkey 的字段存储通行密钥,Agent 可以使用它在 Chrome 中登录,而无需看到密钥:
enclave passkey GitHub # then click the site's passkey sign-in
enclave passkey 会为一次登录启用通行密钥,有效期最长为 5 分钟。网站请求通行密钥时,enclave 的 Chrome 扩展会将请求交给 enclave sign,由它在保险库内完成签名,然后停用该通行密钥。私钥永远不会离开保险库:enclave get 和 enclave run 不允许访问 passkey 字段。
通行密钥可以同时在 Proton Pass 和 enclave 中使用。
每台机器只需安装一次扩展。请在 Linux 上使用 Google Chrome,并从克隆的本仓库中安装与保险库运行版本相同的版本。每个版本都带有 v<version> 标签。扩展通过 Chrome 政策强制安装,因此会在每个配置文件中加载:
git clone https://github.com/AVGVSTVS96/enclave && cd enclave
git checkout "v$(enclave --version)"
extension/install # signs with that release on this machine, through npx
或者使用位于另一台机器上的保险库:
git checkout "v$(ssh my-server enclave --version)"
extension/install ssh my-server enclave sign
导入 Proton Pass 保险库
enclave import proton # every vault
enclave import proton Work # or just the ones you name
通过 pass-cli 导入 Proton Pass 中的登录信息、2FA、通行密钥、笔记、卡片、SSH 密钥和自定义字段。每个 Proton 项目对应一个条目,并以其标题命名。所有内容都会保留在 Proton 中。再次运行即可导入变更:名称保持不变,重命名会同步,已从 Proton 删除的项目也会从 enclave 中删除,而你自行保存的内容会保留。你覆盖 Proton 值后保存的值会一直保留,直到 Proton 中的相应字段发生变化。
2FA 会作为 totp 字段导入,因此 enclave get <name> totp 会返回当前验证码;通行密钥则作为 passkey 字段导入。
CLI
npm install -g enclave-link # or run any of these with npx -y enclave-link
| 命令 | 功能 |
|---|---|
enclave ask <name> [field…] | 输出一个请求 <name> 的链接。字段默认为 password。 |
enclave wait <name> | 等待答案并保存。如果链接先过期,则以状态码 1 退出。 |
enclave run VAR=<name>/<field>… <command…> | 在环境变量中提供机密并运行命令,同时在输出中隐藏机密。 |
enclave get <name> <field> | 输出已保存的值,可用于管道或 $(…)。 |
enclave save <name> <field> | 保存通过管道传入的值,例如 Agent 刚创建的令牌,无需让它经过聊天。 |
enclave passkey <name> [field] | 通过扩展启用已保存的通行密钥,用于在对应网站上的下一次登录。 |
enclave sign | 使用已启用的通行密钥为通行密钥请求签名(从 stdin 读取 JSON)。由扩展运行。 |
enclave import proton [vault…] | 通过 pass-cli 导入 Proton Pass:导入所有保险库,或仅导入指定保险库。 |
enclave list [search] | 列出已保存的名称及其字段,绝不显示值。搜索会匹配名称和网站。 |
enclave rm <name> | 删除已保存的项目。 |
enclave mcp | 通过 MCP(stdio)提供下方的工具。 |
ENCLAVE_FROM 设置页面上显示的名称(“hex is asking for…”),ENCLAVE_HOME 设置保险库的位置(~/.enclave),ENCLAVE_RELAY 指向你自己的中继。
MCP 工具
| 工具 | 功能 |
|---|---|
request_secret | 创建链接。如果客户端支持 URL elicitation,就会提示用户立即打开链接;否则会把链接交给 Agent 发送。 |
wait_for_secret | 用户点击「发送」后立即返回,并附上已保存的字段名称。 |
run_with_secrets | 在命令的环境中提供机密并运行命令,同时隐藏输出中的机密。 |
sign_in_with_passkey | 为下次在相应网站登录启用已保存的通行密钥,然后返回,让 Agent 点击登录。 |
list_secrets | 列出名称和字段,绝不显示值;也可以只列出名称或网站匹配的条目。 |
没有任何工具会返回机密的值。
SDK
import { vault } from "enclave-link"
const { url, wait } = await vault.ask("Netflix", ["email", "password"])
// send url to the person
await wait()
await vault.run(["sh", "-c", 'curl -u "$EMAIL:$PASSWORD" https://example.com'], {
EMAIL: "Netflix/email",
PASSWORD: "Netflix/password",
})
vault 会读取 ENCLAVE_FROM、ENCLAVE_HOME 和 ENCLAVE_RELAY。如需其他配置,可通过 openVault({ from, home, relay, store }) 创建自己的实例。它也提供与 CLI 相同的 get、list 和 remove。
答案默认保存在 ~/.enclave。要将它们保存在其他位置,请传入 store:任何包含 get、put、remove 和 names 的对象都可以,例如你自己的数据库。对于只使用一次且绝不写入磁盘的答案,可以将其保存在内存中:
const answers = new Map()
const oneTime = openVault({
store: {
get: async (name) => answers.get(name),
put: async (name, item) => void answers.set(name, item),
remove: async (name) => void answers.delete(name),
names: async () => [...answers.keys()],
},
})
安全性
加密采用 HPKE(RFC 9180),使用 X25519、HKDF-SHA256 和 AES-128-GCM,基于浏览器自带的 Web Crypto 实现,不依赖任何库,并已通过 RFC 测试向量验证。答案会进行填充,因此中继服务甚至无法判断密码的长度。
Vault 会将每个条目加密后保存在 ~/.enclave/items 中,并使用 Vault 自己的密钥(位于 ~/.enclave/key.json)加密封装,同时绑定条目的名称。条目文件可以安全地备份到任何位置。密钥用于解锁这些文件,因此请像对待 SSH 密钥一样保管它。
enclave 无法防范的情况:
- 运行中继服务的人会向你发送页面。 每次打开链接时,浏览器都会从中继服务下载页面,包括用于锁定密码的代码。中继服务存储的内容无法被读取,但如果有人接管了中继服务的 Convex 账户,就可以修改页面,在锁定密码前复制你输入的内容。页面脚本位于
page/page.ts,共 128 行,加上src/hpke.ts中的加密代码,作为单个文件提供,并受到严格的内容安全策略保护,因此你可以准确查看它运行的内容。如果你不想信任任何人的中继服务,可以自行托管。 - 任何拥有链接的人都可以先提交答案。 他们仍然无法读取任何内容,但可以发送伪造的答案。如果发生这种情况,打开链接时页面会显示「此链接已无法使用」。
- 网络钓鱼。 链接可能声称是任何人发起的请求。只向你主动寻求帮助的 Agent 发送机密。
- 想查看机密的 Agent 可以做到。 enclave 会将机密排除在聊天和工具结果之外,
run也会隐藏输出中的确切值。但在同一台计算机上拥有 shell 的 Agent 仍然可以读取自己的 Vault。enclave 可以防止机密意外泄露,但无法阻止有意泄露机密的模型。
自行托管
中继服务是一个 Convex 应用,因此只需运行几条命令,即可在 Convex 云端或开源 Convex 后端上自行托管:
git clone https://github.com/AVGVSTVS96/enclave && cd enclave
bun install
bun run dev --once # sign in to Convex and create your project
bun run deploy
然后通过 ENCLAVE_RELAY=https://<your-deployment>.convex.cloud 将 Agent 指向该服务。
主题
页面提供两种主题,都会跟随系统的浅色或深色模式:
- ledger(默认):简洁明亮。荧光标记突出可读内容,小小的账本显示秘密由谁保管:你、中继,还是你的 Agent。
- field:整个屏幕呈现为一种颜色。发送后,轨迹会显示内容的去向;已使用的链接会变灰。
部署时选择一种主题,还可以选择一种颜色:
ENCLAVE_THEME=field ENCLAVE_COLOR=#ff4a2e bun run deploy
ENCLAVE_COLOR 是 ledger 主题的高亮颜色,或 field 主题的背景颜色;叠加其上的文本会在白色和墨色之间切换,以确保清晰可读。要创建自己的主题,请复制 page/themes/ledger.css,并将 ENCLAVE_THEME 指向你的文件。主题是在页面固定标记之上应用的纯 CSS;它引用的任何字体或图片都会一并构建到页面中,页面不会从其他位置加载任何内容。
开发
bun install # the CLI, the site and the brand share one workspace and lockfile
bun run dev # builds the page and runs a Convex dev deployment
bun run check # lint, format, typecheck and tests
bun run fix # oxlint's fixes, then oxfmt
bun run build # bundles the CLI, SDK and types into dist/
npm version 0.3.0 # a release: sets every version, commits and makes the signed tag v0.3.0
| 路径 | 内容 |
|---|---|
convex/ | 中继:请求、速率限制和两个 HTTP 路由,共 177 行 |
page/ | 用户看到的页面及其两种主题,由 scripts/page.ts 构建为一个 HTML 文件 |
src/hpke.ts | 加密功能,由页面和 Agent 共用 |
src/vault.ts | SDK 的 ask、wait、get、run 等功能 |
src/mcp.ts | MCP 服务 |
src/passkey.ts | 对通行密钥登录进行签名 |
extension/ | Chrome 扩展,用于将通行密钥请求发送给 enclave sign;extension/install 会使用 Node 移除其中的 TypeScript |
src/proton.ts | 读取 Proton Pass 保管库,包括通行密钥 |
skills/enclave/ | Agent Skill |
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。