mcpField
E
enclave

enclave

ローカル
github.com/AVGVSTVS96セキュリティ02 日前に更新

enclave について

enclaveは、一度だけ使えるリンクでパスワードやAPIキーなどをAgentが収集し、ローカルの暗号化された保管庫に保存します。認証情報をチャットやツールの結果に出さずに扱うAgentのワークフロー向けです。

主な機能

  1. 01ブラウザーで暗号化する一度限りの収集リンク
  2. 02秘密情報と2FAコードの暗号化保存
  3. 03コマンド実行時の秘密情報注入と出力のマスク
  4. 04パスキーによるログインと署名
  5. 05Proton Passの保管庫をインポート

活用シーン

  1. 01チャットに認証情報を出さずにAgentへ渡す
  2. 02APIキーを出力に表示せずコマンドで使用
  3. 03保存したパスキーでウェブサイトにログイン

MCP 対応

stdioのMCPサーバーとして、秘密情報のリクエスト作成、回答待機、秘密情報を使うコマンド実行、項目一覧、パスキーログインを提供します。ツールから秘密情報の値は返しません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの 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 エージェントが Netflix のパスワードを必要としています。チャットで尋ねる代わりに、リンクを送ってきます。パスワードを入力するか、パスワードマネージャーに入力してもらい、Send をタップします。送信される前にブラウザー内で暗号化されるため、開けるのはエージェントだけです。エージェントは 2FA コードやパスキーとともに、自分専用のボルトに保管し、後でパスワードを見ることなく使用します。

ledger テーマの enclave ページ:hex が Netflix の情報を求めており、メールアドレスとパスワードの入力欄、Send to 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

ホスト型リレーですぐに使えます。アカウントも、設定が必要なキーも、利用者がインストールするものもありません。

エージェントをセットアップする

シェルを使うエージェント(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 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 を利用できません。クラウド上で実行され、ボルトはエージェントが実行されるコンピューター上にあるためです。上記のデスクトップ版とコーディングエージェント版は利用できます。

独自のコードでは 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.tsask、wait、get、run など、SDK の機能
src/mcp.tsMCP サーバー
src/passkey.tsパスキーサインインへの署名
extension/パスキーリクエストを enclave sign に送信する Chrome 拡張機能。TypeScript は extension/install が Node で削除します
src/proton.tsProton Pass のボールトを読み取る機能。パスキーも含みます
skills/enclave/エージェントスキル

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。