Agent Evidence API について
Agent Evidence API は、AI エージェント向けに出典付きのWeb証拠、主張の検証、米国 National Weather Service の気象情報を HTTP と MCP で提供します。証拠には出典 URL、取得時刻、コンテンツハッシュが付き、取得できた場合のみ x402 で課金されます。
主な機能
- 01指定ページから関連証拠を抽出
- 02支持・反証などの検証結果を提示
- 03出典、取得時刻、コンテンツハッシュを付与
- 04米国の気象警報と予報を取得
- 05実際の結果を無料でプレビュー
活用シーン
- 01主張を検証しWeb上の出典を追跡
- 02調査用に指定ページから証拠を収集
- 03米国の州ごとの気象警報を確認
- 04指定座標の天気予報を取得
MCP 対応
MCP 経由で証拠取得、気象警報、予報のツールを公開し、無料のツール検出とサンプルも提供します。x402 による呼び出し単位の決済で、情報源を取得できない場合は課金されません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://agent-evidence.thx93.dev/mcpclaude mcp add --transport http thx93-agent-evidence-api https://agent-evidence.thx93.dev/mcp{"mcpServers":{"thx93-agent-evidence-api":{"type":"http","url":"https://agent-evidence.thx93.dev/mcp"}}}Cursor で開く{"servers":{"thx93-agent-evidence-api":{"type":"http","url":"https://agent-evidence.thx93.dev/mcp"}}}VS Code で開く{"mcpServers":{"thx93-agent-evidence-api":{"type":"http","url":"https://agent-evidence.thx93.dev/mcp"}}}{"mcpServers":{"thx93-agent-evidence-api":{"serverUrl":"https://agent-evidence.thx93.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Agent Evidence API
出典に基づく引用付きのウェブ上の根拠と主張の検証に加え、米国国立気象局による米国の気象情報を、HTTP と MCP の両方で AI エージェントに提供します。x402 を通じて Base 上で USDC による従量課金を行い、1 回あたり $0.01 です。何も取得されなかった場合は、一切料金がかかりません。どちらのサービスも API キーやアカウントは不要です。
| 内容 | 接続先 |
|---|---|
| HTTP 根拠エンドポイント | POST https://agent-evidence.thx93.dev/v1/evidence |
| HTTP 気象警報 | POST https://agent-evidence.thx93.dev/v1/weather/alerts — {"state":"TX"} |
| HTTP 天気予報 | POST https://agent-evidence.thx93.dev/v1/weather/forecast — {"latitude":37.7749,"longitude":-122.4194} |
MCP サービス(research_evidence) | POST https://agent-evidence.thx93.dev/mcp |
| stdio 経由の MCP サービス(デスクトップクライアント) | npx -y @thx93/agent-evidence-mcp — お客様自身のウォレットから x402 で支払います |
MCP サービス(get-alerts、get-forecast) | POST https://agent-evidence.thx93.dev/weather/mcp |
| 実際の出力の無料サンプル | GET https://agent-evidence.thx93.dev/demo — 実際に有料で呼び出した際の未編集の応答です。ウォレットは不要です |
| インストール不要の購入者向け CLI | curl -fsSL https://agent-evidence.thx93.dev/buy.mjs -o buy.mjs |
| x402 機能マニフェスト(5 つの有料リソースすべて) | https://agent-evidence.thx93.dev/.well-known/x402 |
すべての MCP ルートでディスカバリー(tools/list、initialize、ping、および health ツール)は無料です。そのため、エージェントは何かを購入する前にスキーマを確認し、応答性を調べられます。
オプション:セマンティックランキング
デフォルトのランキングは決定論的な語彙マッチングで、実測上の限界があります。*「東京の人口は?」*と尋ねると、「人口」と「東京」に言及する文章(1603年の歴史、戦時中の人口減少、自治体の税金など)が返され、質問への答えとなる文は見落とされます。その文では「東京」ではなく「市域」を使っているためです。語彙的なヒューリスティックを2つ試しましたが、どちらも取りやめました。キーワードの工夫だけではこの隔たりを埋められません。
オプションのLayaサイドカーを使うと解決できます。Layaはオープンウェイト(Apache-2.0)の型付き判定モデルで、noulを使って文章をスコアリングし、この文章が質問に直接答えている確率を算出します。ベンダーは不要で、APIキーも不要、呼び出しごとの料金もなく、コンテンツがホストの外に出ることもありません。
python services/laya/server.py # ~2 GB resident, ~35 s cold load
REASONING_PROVIDER=laya REASONING_URL=http://127.0.0.1:8077 ...
上記のケースで、単一ソースを使って測定した結果:
| ソース数 | none | laya | 上位3件に答えが含まれるか? |
|---|---|---|---|
| 1 | 約1.4秒 | 約11.4秒 | ❌ → ✅ |
| 5 | 約1.6秒 | 約1.8秒(フォールバック) | ❌ → ❌ |
**モデルが使われるのは、予算内で候補プール全体を処理できる場合に限られます。**候補1件あたり約800ミリ秒かかります(単一呼び出しの測定値は約420ミリ秒ですが、サイドカーは直列処理するため、実際の同時実行時は約700ミリ秒です)。予算はソースごとに分割されるため、ソースが1~2件なら幅12の候補プールを処理できますが、それより大きなリクエストでは処理できません。より狭い候補プールは効果がないことが測定で分かっています。答えがすでに除外された文章の並び替えしかできないためです。そのため、約20秒をかけるのではなく、そうしたリクエストは語彙ランキングにフォールバックして高速に処理されます。REASONING_POOL_SIZEを小さくすると、大きなリクエストでもモデルが使われるようになりますが、その分再現率は下がります。
予算は目標値ではなく、厳格な上限です。各呼び出しの前に予算を確保するため、複数のソースが合計で予算を超えることはありません。(以前のバージョンでは、確認後に待機していたため、5つのソースがどれも予算を減らす前にチェックを通過し、予算が8秒でもリクエストに50秒かかることがありました。)
トレードオフは精度ではなくレイテンシです。候補1件あたり約420ミリ秒かかるため、候補12件のプールではソースごとに推論に約5秒かかります。そのため、デフォルトではオフになっています。有効にしても変わるのは証拠の順序だけです。すべての抜粋、ソース、URL、ハッシュは同一です。また、サイドカーが見つからない、応答が遅い、予期しない値を返す場合、サービスは何も通知せずに語彙ランキングの結果を維持します。モデルの生の確率が公開されることはありません(SPEC §21)。
候補プールが重要であることに注意してください。最初のバージョンでは、語彙ランキングがすでに選んだ候補5件だけを順位付けしていました。答えは8~20位にランクされていたため、上位に繰り上げることができませんでした。これを機能させるのが、より広い候補プールです。
バックエンドをDockerで実行していますか?サイドカーにコンテナからアクセスできる必要があります。--add-host=host.docker.internal:host-gatewayを指定し、REASONING_URLをhttp://host.docker.internal:8077に設定するか、両方を同じDockerネットワークに配置してください。
サービスが結果を返した場合にのみ課金されます
x402ミドルウェアが支払いを確定するのは、ハンドラーが400未満のステータスを返した場合だけです。そのため、サービスでは失敗するあらゆるケースで4xxまたは5xxを返すようにしています。
- 取得できたソースがない場合(すべて404、すべてSSRFでブロック、すべて未対応のコンテンツタイプなど)、リクエストは
NO_SOURCES_RETRIEVED(502)で失敗し、課金は発生しません。以前のバージョンではここで200 inconclusiveを返していたため、結果が空でも購入者に0.03ドルが課金される可能性がありました。 - 一部でも成功すれば、支払いは確定されます。5つのソースのうち1つを取得できた場合、実際の証拠が提供されており、ソースごとの警告で残りの状況が説明されます。
- MCPトランスポートでは、失敗したツール呼び出しはHTTP 200の中で
isError: trueとして報告されます。これはMCPとして正しい動作ですが、支払いミドルウェアからは認識できません。Workerは支払いが発生しないようにこれを502へ書き換えます。JSON-RPCの本文は変更せずにそのまま渡されます。
稼働中のデプロイで検証済みです。すべてのソースが失敗するリクエストは502 NO_SOURCES_RETRIEVEDを返し、有効なソースが1つと利用できないソースが1つあるリクエストは200を返します。
支払いなしで試す
有料の各エンドポイントには、実際の未編集の結果を返す無料プレビューがあります。モックではありません。
curl -s -X POST https://agent-evidence.thx93.dev/v1/evidence/preview \
-H 'content-type: application/json' \
-d '{"question":"What is a centrifugal pump used for?",
"url":"https://en.wikipedia.org/wiki/Centrifugal_pump"}'
curl -s 'https://agent-evidence.thx93.dev/v1/weather/alerts/preview?state=TX'
curl -s 'https://agent-evidence.thx93.dev/v1/weather/forecast/preview?latitude=37.7749&longitude=-122.4194'
エビデンスプレビューは、ソースURL、取得時刻、コンテンツハッシュとともに1つのソースと最大3つの抜粋を返しますが、評価は含まれません。有料の呼び出しでは最大5つのソースを取得し、supported/contradicted/mixed/inconclusive の判定が追加されます。
呼び出し元アドレスごとに1日25回までプレビューできます。アカウントもウォレットも不要です。有料エンドポイントは意図的に分けています。すべての x402 カタログとバリデーターが確認するため、これらのエンドポイントは 402 を返し続ける必要があります。その場でプレビューを提供すると、サービスをカタログに掲載できなくなります。
FAQ
Agent Evidence API とは何ですか?
AI エージェント向けの HTTP および MCP サービスです。公開ウェブページに基づく、出典を明示したエビデンスと、米国国立気象局の天気情報を返します。質問と最大5つのURLを送信すると、質問に関連する文章が、ソースURL、取得時刻、コンテンツハッシュとともに返され、supported、contradicted、mixed、inconclusive のいずれかで評価されます。
API キーやアカウントは必要ですか? いいえ。登録は不要です。x402 を通じて Base 上で USDC を呼び出しごとに支払うため、ウォレットを持つエージェントは使用した分だけを支払えます。
料金はいくらですか? 1回の呼び出しにつき 0.01 USDC です。何も取得されなければ料金は発生しません。ソースを取得できない場合や、エビデンスが返されない場合は、決済がキャンセルされます。
支払いの前に出力を確認できますか?
はい。GET /demo(HTML)と GET /demo.json では、実際の有料呼び出しから得られた、未編集の完全なエビデンスパッケージを1つ提供しています。MCP の sample ツールでも、同じものを無料で取得できます。
検索エンジンやスクレイパーとはどう違いますか? どちらでもありません。URL は利用者が指定します。このサービスがソースを探すことはありません。このサービスが提供するのは出所の明確さです。すべての抜粋が実際の取得結果と結び付けられ、タイムスタンプとコンテンツハッシュも付いているため、主張をページに実際に記載されていた内容までたどれます。
制限事項はありますか?
照合は決定論的かつ語彙ベースで、意味ベースではありません。質問に複数の内容が含まれていて、照合する文章を提供したソースが1つだけの場合、このサービスは推測せずに inconclusive と回答します。天気情報は米国のみです。データの提供元が米国国立気象局だからです。
エージェントから呼び出すにはどうすればよいですか?
HTTP(POST /v1/evidence)または MCP(POST /mcp)を使用します。購入者向け CLI はインストール不要です。
curl -fsSL https://agent-evidence.thx93.dev/buy.mjs -o buy.mjs、または
npx @thx93/x402-evidence を実行してください。
市場分析
市場分析(docs/market-analysis.md) — 実際の利用データ(サービスごとの30日間の呼び出し数とユニークな支払者数)を公開している唯一のカタログのデータに基づき、x402 エコノミーで実際に何に対価が支払われているかを分析しています。厳しい内容です。このサービスが属するカテゴリの利用量は検索の1%で、5つの価格帯の中で最も低い価格帯です。
エンジニアリングレポート
エンジニアリングレポート(docs/ENGINEERING-REPORT.md) — SPEC.md §44 で求められているレポートです。構築したもの、アーキテクチャ、デプロイとテストのコマンド、x402 と MCP の状況、レジストリへの登録準備状況、残っている手動設定、既知の制限事項を記載しています。何が実証済みで、何がそうでないかを明記しています。決済を一度も実行していないこと、§42 の受け入れ基準を1つ満たしていないことも含まれます。このプロジェクトが本番環境で利用できるとは主張していません。
あなたにしか実行できない作業
チェックリスト(docs/CHECKLIST.md) — 最初の支払い、カタログへの掲載確認、投稿、そして意図的にあなたに委ねた判断など、人が対応する必要のある残りの手順をすべて記載しています。それ以外はすべて完了しています。
初回販売の手順
docs/FIRST-SALE.md をご覧ください。空のウォレットから、決済の完了とカタログへの掲載までの全手順を1ページにまとめています。
収益の確認方法
有料ルートでバックエンドが処理するリクエストはすべて、バックエンド独自の x402 決済ゲートをすでに通過しています(Worker はプロキシするだけです)。ログはデータ ボリュームに追記されるため、Docker のログとは異なり、コンテナの再作成や再デプロイ後も 保持されます。
1 行は、このプロセスで決済証明が検証されたことを意味します。決済が
完了した証拠ではありません。 x402 の順序は verify → handler → settle なので、
バックエンドはファシリテーターによる決済完了より前に行を書き込みます。その後に
決済完了が失敗しても、ここには記録されます。このためフィールド名は
payment_provided です。以前は誤って settled と呼ばれていました。
docker exec aee-live cat /app/data/usage.jsonl # the raw record
# Buyer traffic: requests that carried an x402 payment proof, so operator and
# test calls are excluded. This is NOT a revenue figure - see below.
docker exec aee-live sh -c "grep -c '"payment_provided":true' /app/data/usage.jsonl"
金額については、オンチェーンの記録を確認してください。購入者のクライアントには決済 トランザクションが表示されます。権威ある台帳は受取人アドレスです。
https://basescan.org/address/0x9c0e2B44180439294Fa30Ae2B2a94f8655455FD0
各行には、タイムスタンプ、リクエスト ID、質問のソルト付きハッシュ (質問文は含まれません)、取得したソース数、返されたエビデンス項目数、 評価、サーバー側の処理時間が記録されます。
{"ts":"2026-09-21T07:53:04.341Z","request_id":"req_2fcc…","question_hash":"725f50fca9fbe049",
"question_chars":32,"sources_requested":1,"sources_retrieved":1,"evidence_items":5,
"assessment":"supported","processing_ms":6,"outcome":"ok"}
オンチェーンの情報については、決済レスポンスに決済トランザクションのハッシュが含まれ、
受取人は 0x9c0e2B44180439294Fa30Ae2B2a94f8655455FD0 です。basescanで確認してください。
ライブデプロイ
| エンドポイント | https://agent-evidence.thx93.dev |
| MCP | https://agent-evidence.thx93.dev/mcp |
| ヘルス | /health · 詳細:/health?deep=1 |
| レジストリ | io.github.Thx93/agent-evidence-api — 公開済み、ステータスは active |
| 決済 | x402、exact、Base メインネット上で 0.03 USDC(eip155:8453) |
| 購入方法 | インストール不要:curl -fsSL .../buy.mjs -o buy.mjs && node buy.mjs "question" https://source.example |
npm アカウントもインストールも不要で購入できます。購入者 CLI は、サービス自身が提供する 単一の自己完結型ファイルです。
curl -fsSL https://agent-evidence.thx93.dev/buy.mjs -o buy.mjs
X402_PRIVATE_KEY=0x... node buy.mjs "Is Rotamech a manufacturer of centrifugal pumps?" https://example.com
まずペイウォールを確認するだけでも構いません。これは 402 を返し、料金は発生しません。
curl -X POST https://agent-evidence.thx93.dev/v1/evidence \
-H 'content-type: application/json' \
-d '{"question":"Is Rotamech a manufacturer of centrifugal pumps?","urls":["https://example.com"]}'
AI エージェント向けエビデンス基盤です。 質問、または検証したい主張と公開ウェブページを
指定すると、ソース URL、取得時刻、短いエビデンス抜粋、メタデータ、明示的な
supported / contradicted / mixed / inconclusive の評価を含む、構造化された引用付き
エビデンスを返します。
HTTP と MCP の両方でエージェントから利用でき、リクエストごとに x402 + Base 上の USDC で支払います。アカウント、パスワード、API キーはありません。決済が認証を兼ねます。
- 製品仕様:
SPEC.md— 要件に関する唯一の権威ある情報です。 - エンジニアリングルール:
AGENTS.md— プロジェクト唯一のルールブックです。 - アーキテクチャ:
docs/architecture.md
これはエビデンスを提供するものであり、真実を示すものではありません。 評価は決定論的な 字句マッチングによって生成され、サービスは推測せずに
inconclusiveと返します。supportedステータスを証明として扱わないでください。
実装状況 — まずはこちらをお読みください。 すべてのパッケージと両方のアプリは 実装済みで、ワークスペース全体で
pnpm typecheckが成功します。pnpm testでは、 パッケージをまたぐエンドツーエンドのフローテストを含む 6 つのスイートで約 147 件の ケースを実行します。未完了の項目:オンチェーン x402 決済はまだ実証されておらず、自動 x402 決済テストも ありません。
ROBOTS_POLICYは設定されていますが機能しておらず、apps/worker/wrangler.jsoncにコミットされたテスト用ウォレットアドレス 2 件を、 デプロイ前に置き換える必要があります。実装状況を参照してください。
1. このサービスの機能
エージェントは次のものを送信します。
- 質問または主張、および
- 情報源として使用する1つ以上の公開URL。
その後、サービスは次の処理を行います。
- URL を検証し、安全でないものをすべて拒否します(SSRF 対策)。
- タイムアウト、リダイレクト、レスポンスサイズに上限を設けてページを取得します。
- コンテンツタイプを検出し、HTML を解析します。
- メタデータ(タイトル、説明、正規 URL、Open Graph、JSON-LD、 言語、公開日と更新日、見出し、単語数)を抽出します。
- 本文を正規化し、SHA-256 コンテンツハッシュを生成します。
- 質問に合致する短い証拠の抜粋と、文書内での位置を抽出します。
- 情報源を比較し、評価を導き出します。
- 完全な来歴情報を含む構造化レスポンスを返します。
これはウェブスクレイパー、SEO ツール、汎用クローラー、プロキシ、ブラウザー自動化サービス、検索エンジンではありません。証拠を支えるインフラです。つまり、エージェントが根拠を示す必要があるときに呼び出すものです。
返される内容
{
"request_id": "req_3f9c1a7b2e4d4a6f8b0c1d2e",
"version": "1",
"question": "Is Rotamech Industries a manufacturer of centrifugal pumps?",
"assessment": {
"status": "supported",
"basis": "1 source(s) contained passages matching the question (example.invalid) with no contradicting passages found."
},
"sources": [
{
"requested_url": "https://example.invalid/products",
"final_url": "https://example.invalid/products",
"status": 200,
"content_type": "text/html; charset=utf-8",
"title": "Rotamech Industries — Products",
"canonical_url": "https://example.invalid/products",
"description": "Rotamech Industries manufactures centrifugal pumps for industrial use.",
"publisher": "Rotamech Industries",
"language": "en",
"published_at": "2024-03-01T09:00:00.000Z",
"modified_at": null,
"retrieved_at": "2026-09-20T21:16:07.412Z",
"word_count": 63,
"content_hash_sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
"evidence": [
{
"excerpt": "Rotamech Industries is a manufacturer of centrifugal pumps.",
"context": "h2:Products > p[1]",
"relevance": "direct"
}
],
"structured_data": { "json_ld": [], "open_graph": {} },
"warnings": [],
"from_cache": false,
"redirect_chain": []
}
],
"limitations": [
"Assessment is derived from deterministic lexical matching, not semantic reasoning. A configured reasoning provider may refine it, but never replaces source evidence."
],
"processing_ms": 412
}
各フィールドの説明は docs/api.md にあります。
2. エージェントがこのサービスを使う理由
情報源を引用するエージェントは、断定するだけのエージェントより役に立つからです。
- 根拠付け。 もっともらしい文章を生成する代わりに、エージェントは実際の URL、取得時刻、コンテンツハッシュ、主張の根拠となる一節を提示できます。
- 検証。 エージェントは要約を信頼するのではなく、特定のページに実際に何が書かれているかを確認できます。
- 比較。 複数の情報源を比較し、意見の不一致を平均化して消し去るのではなく、
mixedとして報告します。 - 設計による誠実さ。 十分に一致するものがない場合、回答は
inconclusiveになります。このサービスは事実を捏造せず、情報源に書かれていないことを記載されているかのように装わず、信頼度スコアも出力しません。 - 事前登録不要。 サインアップも、キーも、プランも必要ありません。ツールを見つけて呼び出し、リクエストごとに支払い、証拠を受け取れます。
3. 利用例
あるエージェントが次の質問を受けました。「Rotamech Industries は実際に遠心ポンプのメーカーなのか、それとも単なる再販業者なのか?」
エージェント自身が持つモデルの知識は古く、検証もできないため、候補となる URL を収集してから、このサービスを呼び出します。
{
"question": "Is Rotamech Industries a manufacturer of centrifugal pumps?",
"urls": [
"https://example.invalid/products",
"https://example.invalid/about",
"https://example.invalid/registry-record"
],
"max_sources": 5,
"language": "auto",
"mode": "evidence"
}
企業のサイトは主張を裏付けていますが、登記簿のページは否定しています。サービスは次の内容を返します。
{
"assessment": {
"status": "mixed",
"basis": "Sources disagreed: 2 leaning to support (example.invalid) and 1 leaning against (example.invalid)."
}
}
それぞれの立場を示す短い引用付き抜粋に加え、取得時刻とコンテンツハッシュも返します。
エージェントは、これまでにはなかったものを手にしました。双方を挙げ、それぞれの根拠を示した、説明責任を果たせる回答に、正直な制約も添えたものです。どちらか一方を選んで自信ありげに答えるのではなく、人間に「企業はこう主張していますが、登記記録はそれに異議を唱えています。両方の情報源はこちらです」と伝えられます。
4. MCP の利用
トランスポート:ストリーミング可能な HTTP。エンドポイント:API と同じホスト上の /mcp。
${MCP_PUBLIC_URL} e.g. https://${PUBLIC_API_DOMAIN}/mcp
ツール
| ツール | 支払い | 用途 |
|---|---|---|
research_evidence | 有料(x402) | 公開情報源を取得し、引用付きの構造化された証拠を返します。 |
health | 無料 | ステータスを確認します。 |
クライアント設定例
{
"mcpServers": {
"agent-evidence-api": {
"type": "http",
"url": "${MCP_PUBLIC_URL}",
"headers": {
"Accept": "application/json, text/event-stream"
}
}
}
}
認証用に headers に設定するものはありません。キーは不要です。
initialize と tools/list は無料です
これは自律型エージェントにとって重要であり、意図的な仕様です。
| JSON-RPC メソッド | 有料? |
|---|---|
initialize | 無料 |
tools/list | 無料 |
tools/call → health | 無料 |
tools/call → research_evidence | 有料 |
| その他すべて | 無料 |
エージェントは、ツールの料金を支払うかどうか決める前に、ツールを検出できなければなりません。有料ツールの実際の呼び出しのみ、支払いが必要です。有料の呼び出しが1つでも含まれている場合、JSON-RPC バッチには料金が発生します。
ツール呼び出しの例
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "research_evidence",
"arguments": {
"question": "Is Rotamech Industries a manufacturer of centrifugal pumps?",
"urls": ["https://example.invalid/products"],
"max_sources": 5,
"language": "auto",
"mode": "evidence"
}
}
}
ツール入力スキーマ(HTTP リクエストボディと同一です):
| フィールド | 型 | 必須 | 備考 |
|---|---|---|---|
question | string | はい | 1~2000 文字です。 |
urls | string[] | いいえ | スキーマでは最大 25 件、実行時のデフォルトは 5 件です。 |
max_sources | integer | いいえ | 正の整数、≤ 25 です。 |
language | string | いいえ | "auto" または BCP-47 タグです。 |
mode | "evidence" | いいえ | v0.1.0 で使用できる唯一の値です。 |
MCP クライアントに対する支払い要求レスポンスの形式など、詳細については
docs/mcp.md を参照してください。
5. HTTP の使用方法
GET /health free liveness
GET / free capabilities
POST /v1/evidence paid the evidence resource
GET /health
curl -s https://${PUBLIC_API_DOMAIN}/health
{ "status": "ok", "service": "agent-evidence-api", "version": "0.1.6" }
GET /
支払い前のサービス検出に役立つ、無料の機能説明です。
curl -s https://${PUBLIC_API_DOMAIN}/
{
"service": "agent-evidence-api",
"version": "0.1.6",
"description": "Evidence infrastructure for AI agents. Returns structured, cited, freshly-retrieved evidence from public web pages so an agent can verify claims and ground answers in sources.",
"endpoints": {
"health": "GET /health (free)",
"evidence": "POST /v1/evidence (paid, x402)",
"mcp": "POST /mcp (MCP streamable HTTP; initialize and tools/list are free)"
},
"mcp": { "transport": "streamable-http", "tools": { "research_evidence": "paid", "health": "free" } },
"payment": {
"protocol": "x402",
"scheme": "exact",
"network": "eip155:84532",
"asset": "USDC",
"price_usd": "0.03",
"recipient": "0x…",
"facilitator": "https://x402.org/facilitator"
}
}
POST /v1/evidence
POST /v1/evidence HTTP/1.1
Host: ${PUBLIC_API_DOMAIN}
Content-Type: application/json
payment-signature: <x402 payment proof>
{
"question": "Is Rotamech Industries a manufacturer of centrifugal pumps?",
"urls": ["https://example.invalid/products", "https://example.invalid/about"],
"max_sources": 5,
"language": "auto",
"mode": "evidence"
}
§1 に示す EvidenceResponse ドキュメントを返します。
有効な支払いがない場合は、PAYMENT_REQUIRED エラーエンベロープと x402 の支払い要件を含む HTTP 402 が返されます。
{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Payment is required to access this resource.",
"request_id": "req_5c4b3a291807f6e5d4c3b2a1"
}
}
エラー
すべての失敗で同じエンベロープが使用されます。コードは安定しているため、error.code に基づいて処理してください。
{
"error": {
"code": "INVALID_URL",
"message": "The supplied URL is invalid or unsupported.",
"request_id": "req_3f9c1a7b2e4d4a6f8b0c1d2e"
}
}
| コード | HTTP |
|---|---|
INVALID_REQUEST | 400 |
INVALID_URL | 400 |
BLOCKED_URL | 400 |
SSRF_ATTEMPT | 400 |
PAYMENT_REQUIRED / PAYMENT_INVALID / PAYMENT_EXPIRED | 402 |
UNAUTHORIZED | 401 |
UNSUPPORTED_CONTENT | 415 |
RATE_LIMIT | 429 |
EXTRACTION_FAILURE / INTERNAL_ERROR | 500 |
TIMEOUT | 504 |
REDIRECT_LIMIT / RESPONSE_TOO_LARGE / UPSTREAM_HTTP_FAILURE / BACKEND_UNREACHABLE | 502 |
NOT_CONFIGURED | 503 |
意味を含む完全な一覧は、docs/api.md §5 を参照してください。
取得できないソースがあってもリクエスト全体は失敗しません
5 件の URL のうち 1 件にアクセスできなくても、残りの 4 件は取得できます。取得に失敗したソースは status: null、空の evidence、理由を示す警告とともに表示されます。
{
"requested_url": "https://example.invalid/gone",
"status": null,
"evidence": [],
"warnings": [
{ "code": "UPSTREAM_HTTP_FAILURE", "message": "The source returned an error status." }
]
}
さらに limitations に次の内容が追加されます:"2 件のソースのうち 1 件を取得できませんでした。ソースごとの警告を確認してください。"
6. x402 の支払いフロー
Agent
│ 1. POST /v1/evidence (or tools/call research_evidence)
▼
Worker ──▶ 402 Payment Required + payment requirements
│
Agent
│ 2. pays USDC on Base / Base Sepolia to the recipient address
│ 3. retries the same request with payment-signature: <proof>
▼
Worker ──▶ 4. verifies via the x402 facilitator
│ invalid → 402 PAYMENT_INVALID
│ expired → 402 PAYMENT_EXPIRED
▼
Backend ──▶ 5. runs the evidence pipeline
▼
Worker ──▶ 6. 200 + EvidenceResponse
- API キーもユーザーアカウントも不要です。 これは設計上の仕様です(SPEC §11、§38)。エージェントが登録やキーの申請、サブスクリプションを求められることはありません。
- 受取人に必要なのは公開アドレスだけです。 サービスが署名を行わず、支払い側のクライアントが署名するため、USDC の受け取りに秘密鍵は不要です。
- 秘密鍵は絶対にコミットしないでください。
wrangler.jsoncにも.envにも、その他の場所にも保存しないでください。X402_TEST_PRIVATE_KEYはローカルテスト専用の使い捨て Base Sepolia キーです。メインネットの資金を保有させてはならず、絶対にコミットしないでください。 - 開発時のバイパスには二重のガードがあります。 ローカルでは
DEV_BYPASS_PAYMENT=trueによって支払いのゲートをスキップできますが、ネットワークが Base メインネットでない場合に限ります。eip155:8453では、本番設定にフラグが混入した場合でも支払いをバイパスすることはできません。
詳細については、docs/x402.md を参照してください。
7. Base と Base Sepolia
| 環境 | ネットワーク | CAIP-2 識別子 |
|---|---|---|
| テスト | Base Sepolia | eip155:84532 |
| 本番 | Base | eip155:8453 |
どちらの場合も、決済トークンは USDC です。
テストネットと本番の設定は別々の Worker 環境に分けられており、混在させてはなりません。packages/core/src/config.ts の安全なデフォルトは Base Sepolia です。そのため、未設定のデプロイ先は誤ってメインネットになるのではなく、テストネットになります。
apps/worker/wrangler.jsonc には 3 つの環境が用意されています。
| 環境 | 有効化方法 | ネットワーク | 支払い |
|---|---|---|---|
| production | wrangler deploy | eip155:8453(Base) | 必須 |
| dev | wrangler dev --env dev | eip155:84532(Sepolia) | バイパス |
| test | wrangler dev --env test | eip155:84532(Sepolia) | 必須 |
8. 料金設定
料金は環境変数で設定し、コードに直接記述することはありません。
| 変数 | デフォルト値 | 意味 |
|---|---|---|
X402_PRICE_USD | 0.01 | リクエストごとの料金(USD)。 |
X402_NETWORK | eip155:84532 | 決済ネットワーク。 |
X402_RECIPIENT | (empty) | 受け取り用の公開アドレス。 |
X402_FACILITATOR_URL | https://x402.org/facilitator | 検証に使用するファシリテーター。 |
MVP のデフォルト料金は、エビデンスリクエストあたり約 $0.03 です。これは 開始時の価格であり、固定された商用価格ではありません。
料金文字列は使用前に正規化されます。先頭の $ は省略可能で、値は小数点以下 2 桁で
表示されます。解析できない値を指定しても、Worker は停止せず、警告もなく
$0.03 にフォールバックします。値を変更した後は必ず確認してください。
9. ローカル開発
Node.js ≥ 22.6(キャッシュでは組み込みの node:sqlite モジュールを使用するため、
コンパイルが必要なネイティブ依存関係はありません)と pnpm が必要です。
pnpm install
cp .env.example .env # placeholders only; fill in locally, never commit
openssl rand -hex 32 # → BACKEND_AUTH_SECRET
pnpm typecheck
pnpm test
| スクリプト | 目的 |
|---|---|
pnpm typecheck | すべてのワークスペースをソースから型チェックします。 |
pnpm test | すべての *.test.ts ファイルを実行します。 |
pnpm test:security | SSRF/URL 検証スイートを実行します。 |
pnpm test:e2e | エンドツーエンドの受け入れフローを実行します。 |
pnpm fixtures | 決定論的なローカルフィクスチャサーバーを起動します。 |
pnpm dev:backend | バックエンドを :8080 で起動します。 |
pnpm dev:worker | Worker を :8787 で起動します。 |
pnpm validate | typecheck && test を実行します。 |
フィクスチャサーバー(tests/fixtures/server.ts)はオフラインで動作し、決定論的です。
実際のウェブサイトには依存しません。コンテンツページ、リダイレクトチェーン、
プライベートアドレスへのリダイレクトやメタデータへのリダイレクトを使ったトラップ、
応答し続けないルート、8 MiB のストリーミングルート、404/500 応答を提供するため、
実際のソケットを使って SSRF 対策と制限を検証できます。
pnpm fixtures
# [fixtures] listening on http://127.0.0.1:<port>
どちらの開発コマンドも動作しますが、注意点が 1 つあります。
pnpm dev:backendは Fastify バックエンドを:8080で起動し、pnpm dev:workerは Worker を起動します。Worker の 接続先をバックエンドに設定して/v1/evidenceを呼び出すには、x402 の処理を 完了させるか、メインネット以外のネットワークでDEV_BYPASS_PAYMENT=trueを設定する 必要もあります。実装状況を参照してください。
10. デプロイ
Cloudflare Worker (public edge) → protected origin → Docker container → Fastify backend → SQLite
-
VPS 上のバックエンド。
docker/からビルドした Node.js + Fastify サービスをdocker composeで実行します。restart: unless-stoppedを設定し、SQLite キャッシュ用に/app/dataに永続ボリュームをマウントします。 -
Cloudflare Worker。
bash scripts/deploy-live.shで本番環境にデプロイします。ビルドが正常に終了し、バージョン ID が実際に変更され、稼働中のサービスが外部から検証できる場合にのみ成功を報告します。(wrangler deployだけではパイプの扱いに問題があります。wrangler deploy | tailはビルドに失敗しても終了コードが 0 になるため、これまでに 2 回、壊れたデプロイが見過ごされました。) (Base メインネット)。 -
共有シークレット。
BACKEND_AUTH_SECRETはコミットされることがないよう、意図的にwrangler.jsoncには記載していません。wrangler secret put BACKEND_AUTH_SECRETバックエンド側の
BACKEND_AUTH_SECRETと一致させる必要があります。openssl rand -hex 32で生成してください。 -
オリジンの保護 — 推奨する方法は Cloudflare Tunnel です。これにより、バックエンドにパブリックリスナーもパブリック DNS レコードも不要になります。代替策として、Cloudflare の送信元 IP 範囲にアクセスを制限したファイアウォールの内側に、認証付きのオリジンを配置する方法があります。どちらの場合も、ネットワーク制限とリクエスト認証は独立したレイヤーであるため、すべての内部リクエストで共有シークレットを検証します。
プレースホルダー — PUBLIC_API_DOMAIN、BACKEND_ORIGIN_URL、MCP_PUBLIC_URL — を使用し、実際のドメインを作らないでください。
詳細な手順、環境変数の表、ヘルスチェック、手動の認証情報チェックリストについては、docs/deployment.md を参照してください。
原則としてデプロイ可能ですが、まだデプロイもエンドツーエンドの動作確認も行っていません。 Docker 関連の成果物、バックエンド、Worker はすべて存在します。このリポジトリからはまだ何もデプロイされておらず、最初に修正が必要な設定上の不備が 2 つあります(実装状況を参照)。
docs/deployment.mdを参照してください。
11. セキュリティ
フェッチャーは、すべての URL を信頼できない入力として扱います。必要な防御策(SPEC §18)はすべて、@aee/fetcher パッケージで適用されています。
- スキームの許可リスト —
httpとhttpsのみを許可し、file://など、それ以外はすべて拒否します。 - アドレスの拒否 — localhost とその別名、ループバック、RFC1918 のプライベート IPv4、リンクローカル、マルチキャスト、未指定、IPv6 ループバック、IPv6 リンクローカル、プライベート IPv6 範囲、クラウドのメタデータエンドポイント(
169.254.169.254など)を拒否します。 - エンコードによる回避の防止 — 10 進数、8 進数、16 進数、短縮形式、IPv4 マップ IPv6 表現は、文字列として照合するのではなく、解析後に範囲チェックします。
- DNS — 明示的に名前解決し、解決されたすべてのアドレスを検証したうえで、DNS リバインディングの隙を塞ぐため、接続時にも再検証します。
- リダイレクト — 最初の URL だけでなく、すべての遷移先を検証し、
MAX_REDIRECTSを適用します。 - ポート — 許可リストにあるもののみを許可します。
- 制限 — 接続タイムアウト、リクエスト全体のタイムアウト、ストリーミング中に適用するレスポンスの最大バイト数、展開爆弾への防御、同時実行数の制限を適用します。
- URL をシェルで実行することは一切ありません。 フェッチ処理で
child_processは使用しません。 - ログ — シークレットキーを秘匿する構造化 JSON を使用します。決済情報やオリジンのシークレット、秘密鍵、ウォレットのシークレットは決してログに記録しません。
これとは別に、オリジン保護により、呼び出し元が Worker を迂回してバックエンドを直接呼び出し、支払いを回避できないようにしています。Cloudflare Tunnel(推奨)またはファイアウォールで保護されたオリジンを使用し、すべての内部リクエストでサーバー間認証を行います。BACKEND_AUTH_SECRET にデフォルト値がないのは、設定ミスのあるバックエンドが認証なしで動作するのではなく、確実に接続を拒否するためです。
また、SPEC §19 にあるアクセスルールも適用されます。アクセス制御の回避、ボット保護の無効化、ログインの自動化、ペイウォールの回避、CAPTCHA の解答は禁止です。識別可能な User-Agent を使用し、ROBOTS_POLICY で robots.txt の扱いを設定できます。対象となるのは、一般にアクセス可能なリソースのみです。アクセスが許可されている URL のみを送信してください。
これらの制御は
packages/fetcherに実装され、tests/security/で単体テストされています。ローカルでのテストはパスしています(セキュリティケース 92 件)。独立した監査は実施されていません。ROBOTS_POLICYは適用されます。制御ごとの状況、適用箇所、未対応項目の正直な一覧については、docs/security.mdを参照してください。
12. 制限事項
出力を信頼する前に知っておくべきことなので、率直に記載します。
| 制限事項 | 詳細 |
|---|---|
| 決定論的な語彙マッチングのみ | 評価は、用語のマッチングと固定の否定表現リストに基づいています。意味理解は行いません。語彙が共通しない言い換えられた矛盾は検出されませんが、多くの用語が共通する否定文は検出されます。 |
| プロバイダーが設定されていない限り、意味的な推論は行いません | SPEC §37 の ReasoningProvider 拡張ポイントは設計上存在しますが、実装されていません。実装された場合でも、情報を分解、ランク付け、比較、統合することはできますが、根拠のない文章でソースの証拠を置き換えてはなりません。 |
| v0.1.0 ではエージェントが指定する URL のみ | URL は自分で指定する必要があります。検索プロバイダーはないため、サービスがソースを見つけることはできません。実際には urls が必須です。 |
| 抜粋は意図的に短く設定されています | デフォルトの MAX_EXCERPT_CHARS は 600(スキーマ上限は 4000)です。これは引用付きの証拠を提供するサービスであり、コンテンツを大量に出力するサービスではないため、文書全体を再掲しません。 |
inconclusive はよくある正しい結果です | 質問と取得したテキストに重要な用語の共通点がない場合、誠実な回答は inconclusive です。これはサービスの正常な動作であり、失敗ではありません。 |
| 3 文字未満のトークンは無視されます | 質問の用語から除外されるため、非常に短い質問や頭字語だけの質問はマッチングの精度が低くなることがあります。 |
| ステミングは簡易的です | 末尾の ing/ed/es/s を 1 つだけ削除します。ステミングライブラリは使用せず、不規則形にも対応しません。 |
| ストップワードは固定の英語リストです | 英語以外の質問で失われる情報はわずかです(リストは英語専用で、それ以外ではほとんど影響しません)が、英語以外の質問に対するランキングの品質は調整されていません。 |
| PDF、画像、JavaScript でレンダリングされた証拠には対応しません | DocumentProvider と BrowserProvider は将来の拡張ポイントであり、実装されていません。静的 HTML のみ対応します。 |
| ソースの変更検出や信頼度スコアリングは行いません | SourceTrustProvider は実装されていません。このサービスはページに書かれている内容を報告しますが、公開元をどの程度信頼すべきかは評価しません。 |
| キャッシュヒットは非表示にせず、明示します | from_cache: true と SERVED_FROM_CACHE 警告を返し、retrieved_at には常に実際の取得時刻を設定します。CACHE_TTL_SECONDS(デフォルトは 24 時間)以内の証拠が返される場合があります。 |
| ソースが 1 つ失敗してもリクエスト全体は失敗しません | 失敗はソースごとに warnings で報告され、失敗件数は limitations に追加されます。これらの配列を確認してください。 |
| レート制限はバックエンドプロセスごとに適用されます | CF-Connecting-IP をキーとするトークンバケットが、上限付きバケットマップを使って RATE_LIMIT(429)を適用します。プロセス内で制限するため、バックエンドのレプリカが複数ある場合、それぞれが独自の予算を保持します。エッジレベルで制限するには Durable Objects が必要です。 |
| HTML 以外のコンテンツは処理されません | 未対応のコンテンツタイプの場合、エラーではなく、本文が null で UNSUPPORTED_CONTENT_TYPE 警告を含むソースが返されます。処理対象は HTML、プレーンテキスト、XML、JSON です。 |
| Robots の照合はプレフィックス/ワイルドカード方式であり、RFC 9309 に完全準拠するものではありません | ROBOTS_POLICY=ignore|warn|enforce が適用され、オリジンごとのキャッシュには上限があります。曖昧なルールは 許可 として扱い、黙って拒否するのではなく警告します。すべてのリクエストで、明確に識別できる User-Agent を送信します。 |
| オンチェーン決済の実証は行われていません | x402 ゲートは実装されていますが、デプロイに対する Base Sepolia またはメインネットでの、資金を使った決済は実行されていません。 |
| 独立したセキュリティレビューは行われていません | SSRF 対策は実装され、ソース内で単体テストされていますが、敵対的な観点からの監査は受けていません。 |
そして、現時点では
実装済みで型チェックも通過しています: 6 つすべてのパッケージ(schemas、core、fetcher、extraction、cache、mcp)、2 つのアプリ(backend、worker)、Docker アーティファクト、および server.json。ワークスペース全体で pnpm typecheck が通過し、6 つのテストスイートで約 147 件のケースをカバーしています。その中には、フィクスチャサーバーに対して実際のバックエンドを HTTP 経由で動作させるエンドツーエンドのフローテストも含まれます。
未対応項目:
| 課題 | 詳細 |
|---|---|
| テスト用ウォレットアドレスがリテラル値 | apps/worker/wrangler.jsonc の env.dev と env.test の両方に、同じリテラル値の受取人アドレスがあります。デプロイ前にプレースホルダーに置き換えてください。 |
| robots のマッチングが簡略化されています | ROBOTS_POLICY は適用されていますが、マッチングは RFC 9309 に完全準拠したものではなく、プレフィックス/ワイルドカード方式であり、曖昧な場合は許可されます。 |
| オンチェーン決済の検証なし | x402 ゲートは実装され、レビュー済みですが、Base Sepolia またはメインネットでの資金を使った決済は実行されていません。 |
| 自動化された x402 決済テストなし | SPEC §26 では 402 テストと有効なテストネット決済のテストが求められています。どちらもありません。 |
| レート制限がプロセス内 | エッジでグローバルに適用されるのではなく、バックエンドのレプリカごとに適用されます。 |
server.json のリモート URL がプレースホルダー | 名前空間(io.github.Thx93/)は確認済みですが、remotes[].url は置き換える必要があり、repository.url はまだ存在しないリポジトリを参照しています。 |
| 独立したセキュリティレビューなし | SSRF 対策は実装され、ソースコード上でユニットテスト済みですが、敵対的な観点から監査した人はいません。 |
ローカルで検証済み: pnpm typecheck は終了コード 0 で終了し、pnpm test は 199 件のテストが成功したと報告し、scripts/smoke.sh と scripts/worker-smoke.sh はどちらも実際のソケットに対して成功します。成功したと決めつけずに再実行し、実際の出力を報告してください。これらの結果は単一のマシンで得られたものです。
13. レジストリへの公開
SPEC §28 では、プロジェクトに求められているのは自動公開ではなく、レジストリ公開の準備が整っていることです。つまり、以下が必要です。
- 現行の公式スキーマを使用した
server.jsonメタデータファイル - そのファイルの検証
- 正確な公開手順の文書化
- 名前空間の所有権と認証に関するチェックリスト
- 認証情報と権限が明示的に確認できる場合に限り、公式の
mcp-publisherワークフローを使った手動公開
server.json はすでにあり、このサーバーがリモートのストリーミング可能な HTTP サーバーであることを宣言しています(インストール可能な npm パッケージがないため、packages エントリはありません)。公開可能にするには、次の 2 点が残っています。
remotes[].urlはまだhttps://mcp.example.invalid/mcpです。実際のMCP_PUBLIC_URLに置き換えてください。nameとrepository.urlは GitHub の名前空間を示しています。名前空間の所有権は検証され、偽造されたハンドルは拒否されるため、本当にご自身のものであることを確認してください。
まだ何も公開されていません。正確な公開手順、検証手順、名前空間のチェックリストは
docs/registry-publication.md にあります。
MCP Registry、GitHub リポジトリ、該当する場合の npm メタデータ、機械可読メタデータ、ドキュメント、エージェント向けのツール説明を含む、発見可能性を高める戦略については docs/discovery.md を参照してください。また、使用する価値のある正確な説明表現(ウェブ上の証拠、ソースの検証、主張の検証、証拠の抽出、ソースに基づく調査、ソースの比較、引用付きの証拠、最新のウェブ上の証拠)を列挙し、説明は正確でなければならず、キーワードを詰め込んではならないことも明記しています。
サービスが実際に動作するまでは公開しないでください。 呼び出せないツールを掲載するレジストリエントリは、エントリがないよりも悪いものです。具体的な阻害要因が 2 つ残っています。プレースホルダーの remotes[].url を稼働中のエンドポイントに置き換えること、そして name/repository.url の名前空間が本当にご自身のものであることを確認することです。
プロジェクト構成
agent-evidence-api/
├── AGENTS.md # sole project rules file
├── SPEC.md # product specification (authority on requirements)
├── README.md
├── server.json # MCP Registry metadata (remote streamable-HTTP server)
├── .env.example # environment template, placeholders only
├── pnpm-workspace.yaml
├── package.json
├── docs/
│ ├── architecture.md # architecture, pipeline, layering rule
│ ├── api.md # HTTP endpoints, exact schemas, error codes, limits
│ ├── mcp.md # MCP transport, tools, free vs paid, client config
│ ├── x402.md # payment flow and configuration
│ ├── security.md # SSRF controls, origin protection, secrets
│ ├── deployment.md # local, Docker, Worker, origin protection
│ ├── discovery.md # agent discoverability strategy
│ └── registry-publication.md # exact MCP Registry publish steps
├── apps/
│ ├── backend/ # Fastify service — the VPS workload
│ │ └── src/ # app.ts, auth.ts, server.ts
│ └── worker/ # Cloudflare Worker — the public edge
│ ├── src/index.ts
│ ├── wrangler.jsonc
│ └── .dev.vars.example
├── packages/
│ ├── schemas/ # zod schemas + types (the shared wire contract)
│ ├── core/ # EvidenceService, config, logger, assessment
│ ├── fetcher/ # SSRF-hardened HTTP fetching (ip.ts, fetch.ts)
│ ├── extraction/ # HTML parsing, metadata, main content, lexical ranking
│ ├── cache/ # SQLite-backed bounded cache (node:sqlite)
│ └── mcp/ # MCP server + tool definitions (streamable HTTP)
├── tests/
│ ├── fixtures/ # deterministic local fixture server
│ ├── security/ # ssrf.test.ts, limits.test.ts
│ └── e2e/ # evidence-flow.test.ts (cross-package)
├── scripts/
│ ├── run-tests.mjs # test runner (node --test + tsx)
│ └── smoke.sh # live socket smoke test against the built backend
├── .dockerignore
└── docker/
├── Dockerfile
├── docker-compose.yml
├── env.production.example # Base mainnet
└── env.development.example # Base Sepolia
HTTP アダプターと MCP アダプターは、どちらも同じ EvidenceService を呼び出します。両者の間にビジネスロジックの重複はありません(SPEC §39)。
HTTP adapter ─────┐
├──> EvidenceService ──> Fetch / Extract / Cache
MCP adapter ──────┘
x402 は Worker の決済境界に配置され、コアエンジンの内部には入りません。
実装状況
ドキュメントの執筆中に取得したスナップショットです。
実装済み
packages/schemas— 完全なワイヤー契約(リクエスト、レスポンス、ソース、エビデンス項目、警告、エラー、制限)とビルド済み出力。packages/fetcher— SSRF 対策を強化した取得機能:スキームの許可リスト、IPv4/IPv6 範囲の分類(10 進数/8 進数/16 進数/127.1形式および IPv4 マップ IPv6 を含む)、ホスト名ルール、ポートの許可リスト、すべての DNS レコードにわたる解決済み IP の検証、リダイレクトごとの検証、DNS リバインディングに対する接続時の再検証、接続タイムアウトと合計タイムアウト、ストリーミングのバイト数上限、手動での展開。packages/extraction— HTML 解析、メタデータ、本文抽出、正規化、コンテンツのハッシュ化、決定論的な語彙ランキング、否定表現の手がかり。packages/cache— キーの正規化、CacheProvider、上限付き SQLite アダプター。packages/core— 設定、機密情報を秘匿する構造化ロガー、ソース横断の評価、EvidenceService、型付きServiceError。packages/mcp— リモート MCP アダプター:ステートレスモードのストリーミング可能な HTTP(sessionIdGenerator: undefined、enableJsonResponse: true)、HTTP リクエストごとに新しいServerとトランスポートのペアを作成、tools/list、HTTP レイヤーと同じEvidenceServiceに処理を委譲するtools/call。ツールの入力スキーマはz.toJSONSchemaを使って zod から生成されます。apps/backend— Fastify サービス:シークレットがない場合はフェイルクローズで起動、/health以外のすべてで共有シークレットを定時間検証、GET /health、POST /internal/v1/evidence、および/mcpの POST/GET/DELETE。apps/worker— エッジ全体:x402 によるゲーティング、無料の/healthと/、POST /v1/evidenceの転送、MCP のボディ検査と転送、ガード付き開発用バイパス、標準エラーエンベロープ。docker/— マルチステージのDockerfile、docker-compose.yml、mainnet/testnet 用の個別環境テンプレート、およびルートの.dockerignore。server.json、apps/worker/.dev.vars.example、scripts/smoke.sh。
この環境で検証済み
pnpm typecheck— ワークスペース全体で 成功(tsc --noEmit、終了コード 0)。- 6 つのテストスイートがあり、合計約 147 ケースです:
tests/security/ssrf.test.ts(30)、tests/security/limits.test.ts(16)、tests/e2e/evidence-flow.test.ts(18)、packages/mcp/src/mcp.test.ts(15)、packages/extraction/src/extraction.test.ts(46)、packages/cache/src/cache.test.ts(22)。
ローカルで検証済み、独立した再現なし
pnpm typecheck→ 終了コード 0、pnpm test→ 199 件成功、scripts/smoke.shとscripts/worker-smoke.sh→ すべてのチェックに合格しました。第三者によるこれらの結果の再現はありません。- オンチェーンの x402 決済は実証されていません(402 ゲートは検証済みです)。決済処理の検証には、資金のあるテストネットウォレットが必要です。
未解決の不具合
| 不具合 | 詳細 |
|---|---|
| リテラルのテストウォレットアドレス | apps/worker/wrangler.jsonc には env.dev と env.test の両方に同じリテラルの受取アドレスが含まれています。SPEC §33 と AGENTS.md §6 では、ウォレット設定のコミットが禁止されています。 |
| Robots の照合は簡略化されています | ROBOTS_POLICY は EvidenceService で適用されます。照合方式はプレフィックス/ワイルドカードであり、RFC 9309 に完全準拠していません。 |
| —(修正済み) | UNSUPPORTED_CONTENT(415)がソースごとに出力されるようになりました。 |
| オンチェーン決済のテストなし | 402 ゲートと無料/有料の MCP の分岐は scripts/worker-smoke.sh でカバーされています。レート制限は単体テストと統合テストで検証されています。実際の USDC 決済には資金のある Base Sepolia ウォレットが必要ですが、これは外部認証情報です。 |
server.json はまだ公開できません | 名前空間は確認済みですが、remotes[].url はプレースホルダーで、参照先のリポジトリは存在しません。 |
| ポートの許可リストに 8080/8443 が含まれています | ツールには便利ですが、内部インターフェースでよく使われるポートでもあります。不要であれば範囲を狭めてください。 |
ドキュメント
| ドキュメント | 内容 |
|---|---|
docs/architecture.md | コンポーネントマップ、リクエストパイプライン、エッジ/バックエンドの分離、認証境界、レイヤリングルール、パッケージの所有範囲、拡張ポイント。 |
docs/api.md | GET /health、GET /、POST /v1/evidence、正確なリクエストおよびレスポンスのスキーマ、評価ステータス、実例、すべてのエラーコード、リソース制限とその環境変数。 |
docs/mcp.md | Streamable HTTP トランスポート、/mcp、2 つのツール、正確な入力スキーマ、無料版と有料版の検出、クライアント設定、呼び出し例、支払いが必要な場合のレスポンス。 |
docs/x402.md | 402 → 支払い → 再試行 → 検証 → 実行の流れ、設定変数、CAIP-2 ネットワーク ID、USDC 決済、テスト環境と本番環境の分離、開発用バイパス、秘密鍵のルール。 |
docs/security.md | SPEC §18 で求められる SSRF 対策、オリジン保護、共有シークレット方式、シークレットの取り扱い、robots/アクセスの動作、各対策の適用箇所。 |
docs/deployment.md | ローカル開発、VPS 上の Docker、Cloudflare Worker、wrangler secret put BACKEND_AUTH_SECRET、ヘルスチェック、再起動ポリシー、SQLite ボリューム、オリジン保護のオプション。 |
docs/discovery.md | レジストリ、リポジトリ、npm、機械可読メタデータ、ドキュメント、エージェント向けのツール説明。 |
docs/registry-publication.md | MCP Registry の正確な公開手順、検証、名前空間の所有権チェックリスト。 |
コントリビューションのルール
AGENTS.md が、このプロジェクトで唯一のルールブックです。必須の制約、セキュリティルール、コーディング規約、テスト基準、完了の定義を定めています。CLAUDE.md、.cursorrules、GEMINI.md、または競合する指示ファイルは作成しないでください。
製品要件は SPEC.md に記載されています。この README と仕様が異なる場合は、仕様を優先してください。また、ソースコードと仕様に矛盾がある場合は、黙って解決せずに報告してください。
ライセンス
MIT。package.json を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。