mcpField
E
enclave

enclave

本地服务
github.com/AVGVSTVS96安全01 天前更新

关于 enclave

enclave 让 Agent 通过一次性链接安全收集密码、API 密钥等秘密,并存入本地加密保险库。它适合需要使用凭据但不应让凭据出现在聊天或工具结果中的 Agent 工作流。

主要功能

  1. 01浏览器端加密的一次性收集链接
  2. 02加密保存秘密与 2FA 代码
  3. 03运行命令时注入并隐藏秘密
  4. 04支持 passkey 登录签名
  5. 05导入 Proton Pass 保险库

适用场景

  1. 01让 Agent 请求账户密码而不经过聊天
  2. 02在命令中使用 API 密钥并隐藏输出
  3. 03通过保存的 passkey 登录网站

MCP 相关

提供 stdio MCP 服务,供客户端创建秘密请求、等待答复、运行带秘密的命令、列出条目及发起 passkey 登录。工具不会返回秘密值。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"avgvstvs96-enclave": {
"command": "npx",
"args": [
"-y",
"enclave-link"
],
"env": {
"ENCLAVE_FROM": "<ENCLAVE_FROM>",
"ENCLAVE_HOME": "<ENCLAVE_HOME>",
"ENCLAVE_RELAY": "<ENCLAVE_RELAY>"
}
}
}
}
启动命令npx -y enclave-link
需要配置的环境变量
ENCLAVE_FROMWho's asking, shown on the page
ENCLAVE_HOMEWhere the vault lives (default ~/.enclave)
ENCLAVE_RELAYA self-hosted relay's Convex URL

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmenclave-link0.2.13

工具

5

收录的工具列表 · 更新于 1 周前

参数类型必填说明
namestring是此机密信息的用途。用户会将其作为标题看到,例如 "Netflix" 或 "OpenAI API key"。
fieldsarray否要询问的内容,例如 ["email", "password"]。默认为 ["password"]。名为 "totp" 的字段用于请求 2FA 设置密钥。

详细介绍

enclave

你的 AI Agent 需要你的 Netflix 密码。它不会在聊天中向你索要,而是会发送一个链接。你输入密码(或由密码管理器自动填入),然后点击 发送。密码在离开浏览器前就已加密锁定,因此只有你的 Agent 能打开它。Agent 会将密码保存在自己的保险库中,与双重身份验证代码和通行密钥放在一起,并在之后使用,而无需查看密码。

ledger 主题下的 enclave 页面:hex 正在索要 Netflix 凭据,页面包含电子邮件和密码字段、发送给 hex 按钮,以及显示谁持有该秘密的记录 field 主题下的同一页面,背景为纯蓝色

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 DesktopSettings → Developer → Edit Config
Windsurf~/.codeium/windsurf/mcp_config.json
ClineMCP 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.tsSDK 的 ask、wait、get、run 等功能
src/mcp.tsMCP 服务
src/passkey.ts对通行密钥登录进行签名
extension/Chrome 扩展,用于将通行密钥请求发送给 enclave sign;extension/install 会使用 Node 移除其中的 TypeScript
src/proton.ts读取 Proton Pass 保管库,包括通行密钥
skills/enclave/Agent Skill

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。