Skip to main content
Glama

Veil

CI License: Apache 2.0 Python 3.11+

AIエージェントは、資格情報の値を一切受け取ることなく、資格情報の配置を調整できます。一方、信頼された人間が制御するインターフェースは、その資格情報が送信を許可される場所を独立して承認します。

この一文が全体の約束です。Veil は MCP サーバーとセキュアな入力ブローカーを組み合わせたものです。エージェントが「Stripe の本番キーを Google Secret Manager に置いて」と指示し、人間はどのプロジェクトとシークレットが書き込まれるかを正確に確認し、Veil 自身のウィンドウに値を入力します。すると、値は直接目的地に送られます。モデルが保持することはありません。

SPEC.md から実装されています。


Veil が解決するもの

エージェントが秘密を知っていることによって引き起こされる、あらゆる種類の障害を排除します。Veil が介在することで、資格情報は以下を通過しません。

  • LLM のプロンプトや会話履歴

  • MCP ツールの引数やツール結果

  • エージェントのメモリや生成されたコード

  • シェルコマンドの引数やプロセスの argv

  • ログ、デバッグトレース、テレメトリ

  • URL

  • モデルから見えるコマンド出力

Veil が解決しないもの

Veil は AI エージェントを信頼できるものにしたり、「安全な AI」を提供するものではありません。エージェントが正しい送信先を選んだこと、ユーザーの意図を理解したこと、プロンプトインジェクションがないこと、送信先自体が安全であること、マシンが侵害されていないこと、後で正当に受け取ったソフトウェアによって資格情報が悪用されないことを保証するものではありません。

ここには二つの別々の問題があります。

質問

Veil の回答

エージェントが秘密を知るべきか?

いいえ。

エージェントが単独で秘密の送信先を決めるべきか?

人間の承認なしではダメ。

Veil はこの二つに答えます。残りを解決するとは主張しません。


信頼モデル

Trusted with the credential value:

  The human at the keyboard
  Veil's secure input UI          (loopback only, in your control)
  Veil's secure input broker      (this process)
  The selected destination adapter
  The destination provider        (e.g. Google Secret Manager)

NOT trusted with the credential value:

  The LLM
  The agent / MCP client
  The conversation
  The prompt and any repository content it read
  Generated code
  Logs, telemetry, crash reports

この図は、信頼されたコンポーネントが無敵であると主張するものではありません。資格情報が存在することを許可されている場所を示しています。Veil はセキュリティに敏感なソフトウェアです。Veil 自体が悪意を持っているか侵害されている場合、境界はなくなります。そのソース、依存関係、リリースは、他の資格情報を扱うツールと同様に精査されるべきです。


二つのフロー

秘密フロー — 人間の経路であり、モデルは観測できません。

Human ─▶ Veil secure UI (127.0.0.1) ─▶ Broker ─▶ Adapter ─▶ Destination

エージェントフロー — モデルが見るすべてのもの。

LLM ─▶ MCP client ─▶ Veil MCP server ─▶ non-sensitive result metadata

MCP ツールのスキーマには、資格情報を運ぶことができるプロパティはありません。これは構造上のものであり、プロンプトの指示ではありません。悪用可能な valuesecret_valuepasswordtokencontentraw_secret フィールドは存在せず、クローズドスキーマは未知のプロパティを拒否し、引数はパースされる前に資格情報の形をした値がスクリーニングされます。

エージェントが呼び出すもの

{
  "destination": "gcp-secret-manager",
  "name": "STRIPE_SECRET_KEY",
  "target": { "project": "my-production-project", "secret": "STRIPE_SECRET_KEY" },
  "write_mode": "new-version",
  "environment": "production",
  "description": "Stripe production API key"
}

Veil は request_id、リスク分類、正規化された送信先を返し、マシン上に独自の承認ウィンドウを開きます。エージェントは secret.status をポーリングします。

エージェントは承認リンクを取得しません。 そのリンクは機能です。それを保持しているものは人間のフローの半分を完了でき、シェルや HTTP ツールを持つエージェントはまさに脅威モデルです。Veil は代わりにリンクをブラウザに渡し、自身のコンソールに出力します。リモートやヘッドレスセッションなど、セットアップでエージェントがリンクを中継する必要がある場合は、VEIL_DISCLOSE_AUTHORIZATION_URL=true を設定してください。ただし、これにより侵害されたエージェントが自身のリクエストを承認できるようになることを理解してください。

ツール

目的

secret.store

資格情報リクエストを作成します。非機密メタデータとリクエストIDを返します。

secret.status

リクエストをポーリングします。資格情報の内容を返すことはありません。

secret.cancel

保留中のリクエストをキャンセルします。入力された値は破棄されます。

secret.revise

承認を無効にし、新しい承認を開始します。その場で編集されることはありません。

secret.destinations

送信先と、それぞれが期待するターゲットフィールドを一覧表示します。

人間が見るもの

ステージA では、資格情報名、送信先プロバイダー、プロジェクト/アカウント、リソース、操作、リスクが値が入力される前に表示されます。高リスク操作(本番環境の上書き、平文ストレージ、アプリケーションデータベース、資格情報の置き換え)では、ステージB で、入力後かつ書き込み前に2回目の確認が必要です。値が再度表示されることはありません。

人間が読むページと、実行部が実行する操作は同じ不変オブジェクトです。別々の「表示用送信先」はありません。送信先、プロジェクト、シークレット名、操作、書き込みモード、アダプターのいずれかを変更すると、承認は無効になり、新しい承認が必要になります。


サポートされているアダプター

アダプター

クラス

備考

gcp-secret-manager

secret-store

推奨。veil-mcp[gcp] が必要。createnew-versionreplace(以前のバージョンを無効化)。

env-file

local-plaintext

パス制限、シンボリックリンク拒否、アトミックな 0600 書き込み。Git 追跡ファイルはデフォルトでブロック。

firestore

remote-application-storage

veil-mcp[firestore] が必要。常に警告し、常にステージB を要求。

arbitrary-network 送信先(汎用 HTTP POST、Webhook)は実装されておらず、アダプターレジストリは登録を拒否します。


セキュリティの前提と制限

セキュリティツールが過大宣伝するのは、ないより悪いので、平易に述べます。

  • ブローカープロセスは秘密を見ます。 それが目的です。何かが見なければ、ストレージは不可能です。保証は、最小限の信頼されたトランスポートと送信先コンポーネントだけがそれを行うということです。

  • CPython はメモリを確実に消去できません。 SecretBuffer は自身が所有する可変バッファを消去しますが、パーセントデコード、str/bytes 変換、プロバイダー SDK は、インタプリタが GC まで保持する可能性のある不変コピーを作成します。Veil はこれを最小限に抑え、この保証を捏造しません。

  • UI はループバック HTTP です。 マシン上であなたのユーザーとして実行されているプロセスはそれに到達でき、そのようなプロセスはそれを模倣することもできます。各 Veil プロセスは、そのページに表示されるランダムな識別フレーズを出力します(なりすまし防止の補助、暗号化制御ではありません)。エージェントからリンクを隠すことはハードルを上げますが、Veil のコンソール出力を読んだり、ブラウザの argv をリストしたり、ループバックポートをスキャンできるプロセスを止めることはできません。

  • Veil は送信先を監査しません。 Firestore ドキュメントに資格情報を承認する場合、Veil はそこに書き込み、それが悪いアイデアであると伝えます。止めることはしません。

  • 事前チェックはベストエフォートです。 事前チェック時に到達不能なプロバイダーは、推測されるのではなく利用不可として報告されます。

  • クラッシュセマンティクス。 プロバイダー書き込みとレスポンスの間のクラッシュにより、ローカルに成功記録がないまま資格情報が書き込まれる可能性があります。Veil はそのリクエストを失敗として報告します。送信先が信頼できる情報源です。


ローカル開発

uv venv
uv pip install -e ".[dev]"

# run the server the way an MCP client would
uv run veil serve

# with optional providers
uv pip install -e ".[dev,gcp,firestore]"

設定は Veil 自身の環境から読み取られます。ツールの引数からは決して読み取られません。

変数

デフォルト

意味

VEIL_REQUEST_TTL_SECONDS

300

リクエストの有効期限。

VEIL_ADAPTER_TIMEOUT_SECONDS

30

1回の送信先書き込みの上限時間。

VEIL_STAGE_B_FOR_MEDIUM

true

中リスク操作に確認を要求する。

VEIL_UI_HOST / VEIL_UI_PORT

127.0.0.1 / エフェメラル

セキュアなUIバインドアドレス。

VEIL_OPEN_BROWSER

true

承認ウィンドウを自動的に開く。

VEIL_DISCLOSE_AUTHORIZATION_URL

false

承認リンクをエージェントに返す。

VEIL_ENV_ALLOWED_ROOTS

カレントディレクトリ

.env アダプターが書き込み可能なルート。

VEIL_ALLOW_GIT_TRACKED_ENV

false

Git追跡された env ファイルへの書き込みを許可する。

VEIL_ENABLED_ADAPTERS

すべて

カンマ区切りの許可リスト。

MCP クライアント設定

{
  "mcpServers": {
    "veil": { "command": "uv", "args": ["run", "veil", "serve"] }
  }
}

テスト

uv run pytest                  # everything
uv run pytest tests/security   # the adversarial suite only
uv run ruff check .
uv run mypy

セキュリティスイートは製品要件であり、単なる付加機能ではありません。これには、すべての観測可能なチャネルにわたるカナリア漏洩検出、悪意のあるエージェントテスト、プロンプトインジェクションフィクスチャ、TOCTOU およびリプレイテスト、100ウェイ同時実行ストレス、レースコンディション、クラッシュパス、プロバイダー障害シミュレーション、UI チェック、ファジングが含まれます。以下のいずれかが発生した場合、リリースはブロックされます。カナリアが漏洩する、承認バイパスが成功する、承認後の変更が成功する、完了したリクエストがリプレイ可能である、秘密がリクエスト境界を越える、生のプロバイダーエラーが MCP に到達する、高リスク操作が確認をスキップする。

不変条件とテストの対応については、docs/SECURITY_MODEL.md を参照してください。

プロジェクトステータス

バージョン 0.1.0。 SPEC.md に従って構築されており、これはリポジトリに残り、意図された動作の信頼できる説明として機能します。すべての主要なモジュールとテストは、実装するセクションを引用しているため、レビューアはコードを要件の要約ではなく要件自体と照合して確認できます。

MVP は完了し、敵対的なスイートを含む完全なスイートがパスしています。誰かが実際に依存する前に残っていること:独立したレビュー、確認UIの人間工学的テスト(SPEC.md §35)、署名付きリリースアーティファクト(§43)。

貢献

ここではセキュリティが製品です。そのため、変更の基準は官僚的ではなく具体的です。

  • 資格情報の処理、承認、または MCP サーフェスに影響する変更には、それが影響する不変条件を破ろうとするテストが必要であり、単に動作を示すだけではありません。

  • テストスイートを通すためにセキュリティテストを弱めてはいけません。テストがアーキテクチャ上の欠陥を明らかにした場合、アーキテクチャが変更されます。

  • コアへの新しいランタイム依存関係はデフォルトで反対されます。ブローカーは資格情報の信頼基盤です。プロバイダー SDK はオプションの追加機能の背後に属します。

  • プルリクエストを開く前に、ruff check .ruff format --check .mypypytest を実行してください。

脆弱性を発見しましたか?公開 Issue を開くのではなく、GitHub のセキュリティアドバイザリを通じて非公開で報告してください。

ライセンス

Apache License 2.0 © 2026 Eduardo Rosostolato。

-
license - not tested
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rosostolato/veil-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server