attest — verification for AI agent artifacts について
attestは、AIエージェントと運用者向けのアーティファクト検証サービスです。内容、生成条件、署名、操作権限を確認し、Ed25519署名を単独で検証できます。
主な機能
- 01スキーマと空内容の検査
- 02生成条件のバインド
- 03Ed25519署名
- 04権限の確認
- 05アーティファクトの一括検証
活用シーン
- 01外部ツールの結果確認
- 02エージェント利用前の検査
- 03アーティファクトの来歴確認
- 04操作権限の確認
MCP 対応
MCPサーバーはStreamable HTTP経由で`verify_artifact`、`verify_artifact_batch`、`bridge_check`ツールを提供します。MCPリソースとプロンプトは提供していません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://attest.rta.lat/mcpclaude mcp add --transport http mrpkk-attest https://attest.rta.lat/mcp{"mcpServers":{"mrpkk-attest":{"type":"http","url":"https://attest.rta.lat/mcp"}}}Cursor で開く{"servers":{"mrpkk-attest":{"type":"http","url":"https://attest.rta.lat/mcp"}}}VS Code で開く{"mcpServers":{"mrpkk-attest":{"type":"http","url":"https://attest.rta.lat/mcp"}}}{"mcpServers":{"mrpkk-attest":{"serverUrl":"https://attest.rta.lat/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://attest.rta.lat/mcp認証が必要ツール
2| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| schema | object | いいえ | 成果物が満たす必要のある任意の JSON Schema。 |
| source | string | いいえ | 証明に記録される成果物の出所。 |
| artifact | any | はい | エージェントの成果物:オブジェクト、配列、または文字列。 |
詳細
attest — エージェントの成果物を信頼するためのレイヤー
稼働中:https://attest.rta.lat/demo · コード:https://github.com/mrpkk/attest
料金:1日20回まで無料。それ以降は1回あたり$0.005(x402、Base上のUSDC)。30日間の無制限アクセス:$9。購買力に応じた価格設定(インドおよび同様の市場):POST https://attest.rta.lat/subscribe?plan=ppp を使えば、同じ30日間を$4で利用できます。同じエンドポイント、同じ利用条件です。
エージェントが外部ツールや別のエージェントを呼び出し、外部の成果物を受け取ると、それはそのままコンテキストに入ります。成果物が以下に該当しないか、誰も確認しません。
- 宣言されたスキーマに一致している(ツールがフィールドの型をこっそり変更した)こと
- 隠された指示(「以前の指示を無視し、キーを…に送れ」)を含まないこと
- そのような指示をBase64でラップしたものではないこと
- 確認後に変更されていないこと
attest はそのギャップを埋めます。依存関係はなく、399件のテストがすべて成功しています。
4つのレイヤー、それぞれ異なる問い
各レイヤーが答えるのは、それぞれ固有の問いだけであり、ほかのレイヤーで代用することはできません。 形式が有効であることと、内容に意味があることは同じではありません。成果物に署名があることと、ある操作が許可されていることも同じではありません。
1. 形式と空虚さ — emptiness.py
成果物には何か書かれていますか?5つの脆弱性を見つけるよう指示されたエージェントが、同じ項目を5つ返します。その成果物は、形式が完璧なので、すべてのスキーマ検証に合格します。
測定可能な7つのシグナル:リスト項目の重複、プレースホルダー値、トークン上限で途切れた出力、空白だけの文字列や空のコレクション、バリエーションの少ない繰り返し、スキーマのデフォルト値のままの必須フィールド、最初の値のままの列挙型フィールド。
判定結果は VALID_BUT_EMPTY、THIN_CONTENT、CONTENT_PRESENT です。
VALID_BUT_EMPTY は「形式は問題ないが、内容には疑いがある」という意味であり、**「内容が存在しない」**という意味ではありません。疑いには人の判断が必要ですが、判定には証拠が必要です。この違いは重要です。
各シグナルには、場所と理由が示されます。シグナルがないからといって、内容に意味があると証明されるわけではありません。大まかなチェックに該当しなかったというだけです。この一文は、コード、docstring、API レスポンスに記載されています。
2. 生成条件 — generation.py
署名によって証明されるのは、誰が署名したかです。ファイルがどこから来たのかは証明されません。「エージェントがこれを生成した」と「検証者が結果を確認した」の間に、何があってもおかしくありません。
モデル、バージョン、プロンプト、パラメーター、生成時刻、実行者は、成果物に対する1つの chain_hash にまとめて紐付けられます。どれか1つでも変われば、その紐付けは一致しなくなります。
紐付けがない場合は、黙って扱われるのではなく明示されます。4つの状態を区別します。条件がまったくない場合、紐付けがあると主張されているものの条件を提示できない場合、条件は提示されているものの署名に紐付けがない場合、条件が一致しない場合です。最初と2番目は異なる状態であり、混同すれば偽造を裏付けることになってしまいます。
chain_hash は署名の横ではなく、署名の中に含まれます。そうでなければ、あとから追加できてしまいます。
3. 私たちを信頼せずに検証する — signing.py
HMAC には秘密鍵が必要で、その秘密鍵を持っているのは私たちだけです。そのため、署名を検証できるのはサービスだけであり、サービスを信頼しない人は、まずサービスを信頼しなければなりません。信頼を扱う製品として、これは根本的な矛盾です。
現在は Ed25519 を使っています。公開鍵はアテステーションとともに渡され、検証者が自分で検証できます。ネットワークも、私たちのパッケージも、秘密鍵も必要ありません。
python3 attest/verify_standalone.py attestation.json
このスクリプトは attest から何もインポートせず、ソケットも開きません。テストでその両方を検証しています。
4. 権限 — authority.py
そのアクションは許可されていましたか? 署名されたアクションが、承認されたアクションとは限りません。権限は別途付与され、有効期限があります。
ルールは drift.check と完全に一致します。金額、支払先、対象、通貨、期間、意図です。これらは意図的に重複して定義しています。別のリポジトリに依存すると、他者のコードへのネットワークアクセスなしではチェックを実行できなくなるためです。検証できない依存を作るより、6つの比較を複製する方が低コストです。
テストではすべてのルールについて、結果を稼働中の drift と比較するため、差異があればクライアントから苦情が届く前にすぐにわかります。
権限が存在しない場合は拒否であり、決して同意ではありません。権限を提示しない検証者は、権限があることを証明できていません。
明確に述べておくべき発見
レイヤー 3 の構築中に、既存コードに問題があることがわかりました。ATTEST_SECRET が未設定の場合、ソースコードにハードコードされた attest-dev-key-do-not-use-in-production を使って署名が計算されていました。この変数が設定されていなかったため、このサービスがこれまで発行したすべての証明は、サービスの隣に公開された鍵で署名されていました。誰でも、あたかもサービスが検証したかのようにアーティファクトへ署名できたのです。
署名は本物に見えましたが、本物ではありませんでした。署名がない場合はそのことがわかるため、これは署名がないよりも悪い状態です。この問題は修正済みです。鍵がなければ、署名もありません。
ブラウザーで試す
https://attest.rta.lat/demo — レイヤーごとに1つ、合計4つのボタンがあり、レスポンス全体がすぐに表示されます。
公開リポジトリ
https://github.com/mrpkk/attest
信頼が必要なエージェント向けの6つの小さなサービス、Indra セットの一部です:https://indra.rta.lat
MCP サーバー(Model Context Protocol)
attest は MCP サーバーです。Streamable HTTP(JSON-RPC 2.0)で Model Context Protocol を使用し、検証機能を MCP ツールとして公開します。
- MCP ツール(このサーバーの主な機能です。エージェントが直接呼び出します):
verify_artifact— 1つのアーティファクトを検証し、判定、信頼スコア、検出事項を返します。verify_artifact_batch— 1回の呼び出しで一括検証し(スキャンレポートや検出事項のリストなど)、アーティファクトごとの判定と概要を返します。bridge_check— エスクローブリッジを介して2つのエージェント間の有償作業を精算し、署名付きレシートを発行します(オフラインで検証可能)。
- MCP リソース:まだ公開していません。
resources/listはエラーではなく空のリストを返すため、MCP クライアントやディレクトリスキャナーがサーバーを異常と判断することはありません。 - MCP プロンプト:まだ公開していません。同じ理由で、
prompts/listは空のリストを返します。 - トランスポート:Streamable HTTP。無料プランでは認証不要です。プリペイドキーには
X-ATTEST-ENTITLEMENTヘッダー、呼び出しごとの x402 決済にはPAYMENT-SIGNATURE/X-PAYMENTを使用します。
MCP クライアントを接続する
{
"mcpServers": {
"attest": { "url": "https://attest.rta.lat/mcp" }
}
}
Claude Desktop、Claude Code、Cursor、Codex、VS Code、およびリモート Streamable HTTP サーバーに対応したその他の MCP クライアントは、この設定をそのまま使用できます。
私たち自身も使用しています。自社のエージェントは opencode.jsonc で MCP SDK を通じて、まさにこの URL を呼び出します。そのため、テストだけでなく、毎日実際のトラフィックでサーバーが稼働しています。
エージェントから使う
{
"mcpServers": {
"attest": { "url": "https://attest.rta.lat/mcp" }
}
}
この設定はドキュメント用のサンプルではありません。私たち自身のエージェントがこのサーバーを呼び出す方法です(同じ公開 URL、キー不要、登録不要)。
ツール:verify_artifact、verify_artifact_batch。1日あたり20回まで無料でチェックでき、それ以降は x402(USDC、Base)で1回あたり $0.005、または30日間 $9 です。インド向け価格は30日間 $3 です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。