enclave について
enclaveは、一度だけ使えるリンクでパスワードやAPIキーなどをAgentが収集し、ローカルの暗号化された保管庫に保存します。認証情報をチャットやツールの結果に出さずに扱うAgentのワークフロー向けです。
主な機能
- 01ブラウザーで暗号化する一度限りの収集リンク
- 02秘密情報と2FAコードの暗号化保存
- 03コマンド実行時の秘密情報注入と出力のマスク
- 04パスキーによるログインと署名
- 05Proton Passの保管庫をインポート
活用シーン
- 01チャットに認証情報を出さずにAgentへ渡す
- 02APIキーを出力に表示せずコマンドで使用
- 03保存したパスキーでウェブサイトにログイン
MCP 対応
stdioのMCPサーバーとして、秘密情報のリクエスト作成、回答待機、秘密情報を使うコマンド実行、項目一覧、パスキーログインを提供します。ツールから秘密情報の値は返しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
5掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| name | string | はい | 秘密情報の用途です。ユーザーにはタイトルとして表示されます。例:"Netflix" や "OpenAI API key" |
| fields | array | いいえ | 尋ねる項目です。例:["email", "password"]。デフォルトは ["password"] です。"totp" という名前のフィールドは、2FA セットアップキーを尋ねます。 |
詳細
AI エージェントが Netflix のパスワードを必要としています。チャットで尋ねる代わりに、リンクを送ってきます。パスワードを入力するか、パスワードマネージャーに入力してもらい、Send をタップします。送信される前にブラウザー内で暗号化されるため、開けるのはエージェントだけです。エージェントは 2FA コードやパスキーとともに、自分専用のボルトに保管し、後でパスワードを見ることなく使用します。
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
ホスト型リレーですぐに使えます。アカウントも、設定が必要なキーも、利用者がインストールするものもありません。
エージェントをセットアップする
シェルを使うエージェント(Claude Code、Codex、Cursor、Gemini CLI、OpenCode、その他30 種類)では、スキルとして利用できます。
npx skills add AVGVSTVS96/enclave
npx で enclave を実行するため、ほかにインストールするものはありません。
MCP を使うエージェントでは、同じ機能をツールとして利用できます。以下のサーバーを追加し、エージェントの指示にこの行を追加してください。ツールだけでは、モデルがチャットで尋ねるのを防げないためです。
パスワード、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 を利用できません。クラウド上で実行され、ボルトはエージェントが実行されるコンピューター上にあるためです。上記のデスクトップ版とコーディングエージェント版は利用できます。
独自のコードでは 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
- リレーは何も読み取れません。 リレーが必要とする鍵は、エージェントのコンピューターから外に出ません。公開鍵はリンクの
#以降に含まれますが、ブラウザーはこれをサーバーに送信しないため、リレーは何が要求されたのかさえ把握できません。 - リンクは一度だけ使え、有効期限があります。 最初の回答が採用され、エージェントが取得した時点、または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] に置き換えられます。シェルが $KEY を先に展開しないよう、コマンドを引用符で囲んでください。
ログインフォームにパスワードを入力するには、入力を行うツールにそのままパイプで渡します:enclave get Netflix password | <typer>。totp という名前のフィールドには2FAのセットアップキーを保存します。enclave get GitHub totp を実行すると、現在の6桁のコードを取得できます。
パスキー
passkey という名前のフィールドにはパスキーを保存します。エージェントは鍵を一度も見ることなく、Chromeでそのパスキーを使ってサインインします:
enclave passkey GitHub # then click the site's passkey sign-in
enclave passkey を実行すると、最大5分間、1回のサインインに限りパスキーが有効になります。サイトがパスキーを要求すると、enclaveのChrome拡張機能がリクエストを enclave sign に渡し、ボールト内で署名を行ってパスキーを無効にします。秘密鍵がボールトの外に出ることはありません。enclave get と enclave run はパスキーフィールドを拒否します。
パスキーは 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のアイテムごとに1件ずつ、そのタイトルを名前として取り込みます。すべてのデータは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> | エージェントが作成したばかりのトークンなど、パイプで渡された値をチャットに通さずに保存します。 |
enclave passkey <name> [field] | 拡張機能を通じて、保存されたパスキーをそのサイトでの次回のサインインに備えて有効にします。 |
enclave sign | 有効なパスキーを使ってパスキーリクエスト(標準入力のJSON)に署名します。拡張機能が実行します。 |
enclave import proton [vault…] | pass-cliを通じてProton Passからコピーします。すべてのボールト、または指定したボールトが対象です。 |
enclave list [search] | 保存された名前とフィールドを表示します。値は表示されません。検索対象は名前とウェブサイトです。 |
enclave rm <name> | 保存されたアイテムを削除します。 |
enclave mcp | 以下のツールをMCP経由(stdio)で提供します。 |
ENCLAVE_FROM はページに表示される名前(「hexが要求しています…」)を設定し、ENCLAVE_HOME はボールトの保存場所(~/.enclave)を設定します。また、ENCLAVE_RELAY は独自のリレーを指定します。
MCP ツール
| ツール | 機能 |
|---|---|
request_secret | リンクを作成します。クライアントがURL elicitationに対応している場合は、その場でリンクを開くようユーザーに提案します。対応していない場合は、エージェントにリンクを渡し、ユーザーに送信できるようにします。 |
wait_for_secret | ユーザーが「送信」をタップすると、保存されたフィールド名を返します。 |
run_with_secrets | 環境変数にシークレットを設定してコマンドを実行し、出力からシークレットを隠します。 |
sign_in_with_passkey | 保存済みのパスキーを、そのサイトでの次回のサインインに使えるようにした後、エージェントがサインインをクリックできる状態にして戻ります。 |
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 に保存されます。別の場所に保存するには、独自のデータベースのように get、put、remove、names を備えた任意のオブジェクトを store として渡します。一度だけ使う回答をディスクに書き込まずに扱うには、メモリに保持します。
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()],
},
})
セキュリティ
暗号化には、ブラウザー標準の Web Crypto をライブラリなしで利用する HPKE(RFC 9180)を採用しています。X25519、HKDF-SHA256、AES-128-GCM を使用し、RFC のテストベクトルに対して検証済みです。回答はパディングされるため、リレーにはパスワードの長ささえ分かりません。
ボルトは各項目を暗号化して ~/.enclave/items に保存し、~/.enclave/key.json にあるボルト自身の鍵で封印するとともに、項目名に紐付けます。項目ファイルはどこにバックアップしても安全です。項目を解錠するのは鍵ですので、SSH キーと同様に扱ってください。
enclave では保護できないもの:
- リレーの運用者がページを送信します。 リンクを開くたびに、パスワードをロックするコードを含むページがリレーからブラウザーにダウンロードされます。リレーに保存された内容を読み取ることはできませんが、誰かがリレーの Convex アカウントを乗っ取った場合、入力内容をロックする前にコピーするようページを変更できてしまいます。ページのスクリプトは
page/page.tsの128行とsrc/hpke.tsの暗号化処理で構成され、厳格な Content Security Policy を適用した単一のファイルとして配信されます。そのため、実行内容を正確に確認できます。どのリレーも信頼したくない場合は、独自にホストしてください。 - リンクを持っている人なら誰でも、最初に回答できます。 内容を読み取ることはできませんが、偽の回答を送信することは可能です。その場合、リンクを開くとページに「このリンクはもう使えません」と表示されます。
- フィッシング。 リンクには、誰かが依頼しているように記載できます。助けを求めたエージェントにのみシークレットを送信してください。
- シークレットを見ようとするエージェントは、シークレットを見ることができます。 enclave はシークレットがチャットやツールの結果に含まれるのを防ぎ、
runは出力に正確な値が表示されないようにします。しかし、同じコンピューター上でシェルを使えるエージェントは、自分のボルトを読むことができます。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 を設定し、エージェントの接続先を指定してください。
テーマ
ページには 2 つのテーマがあり、どちらもシステムのライトモードまたはダークモードに従います。
- ledger(デフォルト):落ち着いた白を基調としています。読み取り可能な箇所をハイライト表示し、小さな台帳で、秘密を保持しているのがあなた、リレー、エージェントの誰なのかを示します。
- field:画面全体が 1 色になります。送信すると、送信先を示す軌跡が表示され、使用済みのリンクはグレーになります。
デプロイ時に、テーマを 1 つ選び、必要に応じて色を 1 つ指定します。
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/ | リレー:リクエスト、レート制限、2 つの HTTP ルートを 177 行で実装 |
page/ | ユーザーが見るページと 2 つのテーマ。scripts/page.ts によって 1 つの HTML ファイルに組み込まれます |
src/hpke.ts | ページとエージェントで共有する暗号化機能 |
src/vault.ts | ask、wait、get、run など、SDK の機能 |
src/mcp.ts | MCP サーバー |
src/passkey.ts | パスキーサインインへの署名 |
extension/ | パスキーリクエストを enclave sign に送信する Chrome 拡張機能。TypeScript は extension/install が Node で削除します |
src/proton.ts | Proton Pass のボールトを読み取る機能。パスキーも含みます |
skills/enclave/ | エージェントスキル |
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。