probe402-check について
probe402-checkは、probe402の日付付き公開記録を使い、エージェントがx402またはMPPの決済ルートを評価できるようにします。MCPチェック、CLIによるアーカイブ検証、決済署名前に設定可能なポリシーを適用するx402 fetchフックを備えています。
主な機能
- 01ルートの読み取り結果と支払い条件を確認
- 02保留中の条件を記録データと比較
- 03x402の署名前にポリシーを適用
- 04封印済みの日次アーカイブヘッドを検証
- 05CLIとMCPツールのインターフェース
活用シーン
- 01エージェントの支払い前にルートを確認
- 02条件やアドレスの不一致を警告またはブロック
- 03公開アーカイブヘッドをローカルで検証
MCP 対応
stdioのMCPサーバーは `check_before_paying` を提供し、URLに対応するprobe402の公開記録を読み取ります。任意の保留中の支払い条件との比較も可能で、報告された事実への対応はエージェントのポリシーが決めます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| url | string | はい | 支払い予定のリソースURL、ホストURL、またはprobe402エンドポイントID(ep_...) |
| held_quote | object | いいえ | 記録された見積もりとの比較に使用する、手元の支払いリクエスト |
| held_quote.asset | string | いいえ | 手元の402に記載されたアセットアドレス |
| held_quote.pay_to | string | いいえ | 手元の402に記載された支払い先アドレス |
| held_quote.scheme | string | いいえ | 手元の402に記載された方式(例:exact) |
| held_quote.network | string | いいえ | 手元の402に記載されたネットワーク(CAIP-2、例:eip155:8453) |
| held_quote.amount_atomic | string | いいえ | 手元の402に記載されたアトミック単位の金額 |
詳細
probe402-check
エージェントが x402 エンドポイントへの支払いを行う前に、probe402 の公開記録を確認し、ご自身のターミナルから公開済みアーカイブのヘッドを再検証します。
小さなツールが3つ、リポジトリが1つ、Apache-2.0:
wrapFetchWithCheck— x402 クライアント用フックです。x402 クライアントが支払いに使う fetch をラップすると、すべての 402 が、設定したポリシーに従って、支払いへの署名が行われる前に probe402 の記録と照合されます。署名者には一切触れず、支払い内容も変更しません。check_before_paying— MCP サーバーと CLI です。エージェントが支払いを行おうとしている URL を渡すと、probe402.com でそのルートの無料評価を読み取り、次の情報を回答します。最新の記録時点で何を提示していたか、提示内容、probe402 自身がそのルートに支払ったかどうかと結果の評価、ルート独自の更新間隔に照らした記録の経過時間、引用するアドレスです。支払いリクエストも渡すと、手元のリクエストと記録されたリクエストを比較します。判断はエージェントのポリシーに委ねられます。verify-head— probe402 の公開ヘッドテーブルから封印済みの1日分のヘッドと、probe402.com からその日のマニフェストを取得してヘッドを再計算し、両方のダイジェストとともにLINKSまたはDOES NOT LINKを出力します。
このツールが読み取るのは、probe402.com の公開情報と1つの公開 git リポジトリだけです。それ以外は読み取りません。キーもアカウントも支払いも必要ありません。
60秒で使う
Claude Desktop — claude_desktop_config.json に次を追加して再起動します:
{
"mcpServers": {
"probe402-check": {
"command": "npx",
"args": ["-y", "probe402-check", "--mcp"]
}
}
}
Claude Code — 次の1行を実行します:
claude mcp add probe402-check -- npx -y probe402-check --mcp
OpenAI Agents SDK — examples/openai-agents-tool.ts をプロジェクトにコピーします(40行で、@openai/agents の tool() を使ってツールを構築します。インストールはご自身で行ってください):
import { Agent } from "@openai/agents";
import { checkTool } from "./openai-agents-tool.ts";
const agent = new Agent({
name: "buyer",
instructions: "Before paying any x402 endpoint, call check_before_paying and reason from its verdict.",
tools: [checkTool],
});
次に、URL を指定してルートを確認するよう依頼します:支払う前に https://datastand.dev/api/data/dev-signals を確認してください。
上記の npx 形式はパッケージが npm に公開された後に使えます。それまでは、クローンして(インストールを参照)、コマンドの指定先を node /absolute/path/to/probe402-check/dist/cli/mcp.js にしてください。
支払い時:x402 クライアント用フック
MCP ツールが回答するのは、エージェントが確認を依頼するのを覚えている場合です。エージェントは忘れることがあります。このフックは確認を依頼する必要がありません。x402 クライアントが支払いに使う fetch の下に組み込まれるため、すべての 402 が支払いへの署名が行われる前に確認されます。
import は1つ、変更は3行です:
import { wrapFetchWithPayment } from "@x402/fetch";
import { wrapFetchWithCheck } from "probe402-check";
const fetchWithPay = wrapFetchWithPayment(wrapFetchWithCheck(fetch), client);
402 が届く場所に配置する必要があるため、支払い用ラッパーの 下層 に組み込みます。x402-fetch(v1 パッケージ)も同様に組み合わせられます。これで、エージェントが行うあらゆるリクエストが、費用の発生する時点で確認されます:
const response = await fetchWithPay("https://datastand.dev/api/data/dev-signals");
402 を受け取ったときのフックの動作:チャレンジを読み取り(複製を使うため、クライアントも引き続き自身で読み取れます)、その正確な URL について probe402 に問い合わせ(無料評価へのリクエストを1回)、402 が提示する各支払い方法を probe402 が記録した提示内容と比較し、ポリシーを適用します。その後、402 を変更せずにクライアントへ渡して署名させるか、PaymentBlocked をスローしてクライアントに 402 を見せません。
署名者、キー、ウォレットには一切触れません。ヘッダーを追加・削除せず、支払いも変更しません。すでに支払いヘッダーが含まれているリクエストは、クライアント自身による再試行なので、そのまま通過させます。これにより、1回の支払いにつき確認は1回で済みます。
ポリシーはあなた次第です
ツールが事実を報告します。その事実をどう評価するかはあなた次第です。そのため、各チェックでは名前付きのシグナルが生成され、ポリシーによって各名前が allow、warn、block のいずれかに割り当てられます。最も厳しい判定が優先されます。デフォルトは次のとおりです。
| シグナル | デフォルト | 意味 |
|---|---|---|
never-observed-delivering | block | probe402 がこのルートに支払い、資金が移動したものの、支払いに対する応答が一度も返ってきていません |
payment-address-differs | block | この 402 の支払い方法には、probe402 が記録した支払いアドレスが指定されていません |
quote-differs | warn | 現在の 402 が、金額、資産、ネットワーク、またはスキームについて、記録済みの見積もりと異なります |
reading-past-cadence | warn | 最新の測定値が、このルートの測定頻度を超えて古くなっています |
newest-paid-attempt-refused | warn | probe402 の最新の支払い試行は、決済前に拒否されました。支払いは発生していません |
settlement-not-corroborated | warn | probe402 が保持するすべての支払い試行について、資金が移動したかどうかを判断できません |
paid-word-not-known | warn | probe402 は、このバージョンで分類できない語句を使って支払いを評価しました |
never-paid | warn | probe402 はこのルートに支払ったことがないため、支払い後の配信に関する測定値を保持していません |
not-quoting | warn | 最新の測定値は支払いの見積もりではありませんでした |
no-reading | warn | probe402 はこのルートを保持していますが、対象期間内の測定値がありません |
not-on-record | warn | probe402 はこのアドレスの記録を保持していません |
host-not-route | warn | このアドレスはホストを示しているため、ここではルートを評価できません |
record-unavailable | warn | probe402 に問い合わせることができませんでした |
ブロックする行は 2 つで、どちらも実際に送金された資金に関するものです。probe402 が支払い、応答が一度も返ってこなかったケースと、記録されたものとは異なる支払いアドレスです。それ以外はすべて報告のみです。
probe402 自身の不在によって生成される行、つまり never-paid、not-on-record、record-unavailable は、意図的に警告にとどまり、ブロックしません。probe402 が確認していないというのは probe402 についての事実であり、それが誰かの支払いを止める理由になってはなりません。
1 行で任意の設定を変更できます。
const fetchWithPay = wrapFetchWithPayment(
wrapFetchWithCheck(fetch, {
policy: { "reading-past-cadence": "block", "never-observed-delivering": "warn" },
onDecision: (decision) => log.info(decision.line),
}),
client,
);
onDecision は、判定が実行される前に、すべての判定について呼び出されます。判定結果、各シグナルとそれぞれの日付、その根拠となる事実、probe402 の回答全体、引用するアドレスが渡されます。独自の warn を渡さない限り、warn の行は標準エラー出力に送られます。
ブロックを捕捉する
import { PaymentBlocked } from "probe402-check";
try {
await fetchWithPay(url);
} catch (error) {
if (error instanceof PaymentBlocked) {
console.error(error.decision.because);
console.error(`the record is at ${error.decision.cite}`);
for (const fact of error.decision.facts) console.error(`${fact.as_of ?? "no date"} ${fact.fact}`);
}
}
probe402 が測定するもの
probe402 は、マシン間の商取引を測定した記録です。一定の間隔で、x402 または MPP エンドポイントが文書化しているリクエストを送信し、返された内容を保存して、公開されているルールに従って各測定値を評価します。正しい形式の支払い見積もりが返されたか、何が要求されたか、支払いなしでエンドポイントが応答したか、エンドポイントがクライアントとしての probe402 を拒否したか、または利用可能な応答が何も返ってこなかったかを確認します。これとは別に、名前付きのツールが公開済みのルート一覧に対して支払いを行い、支払い後のリクエストで何が返ってくるかを評価します。記録の各完了日は、ハッシュが公開されたマニフェストに封印されます。また、各日のマニフェストには前日が記載されるため、誰でも再検証できるチェーンが形成されます。調査方法、実施しないこと、測定値への異議申し立て方法については、probe402.com/method をご覧ください。
このツールが返すすべての内容は、probe402 の視点から得られた、日付付きの測定値です。測定値は、probe402 が確認したときにルートがどう動作したかを示します。エンドポイントそのものについて述べるものでは決してありません。
このチェックでわかること、エージェントに伝えられることと伝えられないこと
チェックごとに、無料グレードへのリクエストを1回行います。ルートについて、以下を返します。
| フィールド | 内容 |
|---|---|
reading | 最新の観測結果:評価された結果(Quoted、Answered, no quote、Blocked or challenged、Unreachable、Not probed)、観測日時、その経過時間、および経過時間がそのルートの確認間隔を過ぎているかどうか |
quote | その観測時点で記録された支払い要求:スキーム、ネットワーク、最小単位での金額、アセットアドレス、支払いアドレス、タイムアウト |
window | 評価対象期間(無料グレードでは7日間):保持された観測、probe402 が未確認だった回について記録した不在回数、支払い要求が変更された回数、結果別の観測数 |
paid_delivery | そのルートが probe402 の有料パネルの対象かどうか、最後に有料リクエストを行った日時、各試行の日付と評価結果、およびその記録の参照元 |
held_quote | 402 を渡した場合に保持している支払い要求:記録された支払い要求と一致するフィールドと異なるフィールド |
cite | 評価アドレス。すべての観測結果とその手法が含まれます |
verdict | エージェントが自身の推論に使える、平易な言葉による1行の説明 |
わかること:probe402 が最後に確認した時点でそのルートが支払い要求を提示していたかどうか、またその確認がどれくらい前か、そのルートが求めていた支払いの内容、そしてそれが現在提示されている内容と一致するかどうか、probe402 自身の有料リクエストが決済されて応答を得られたかどうかとその日時、対象期間内に支払い要求が変更された回数、そして probe402 が確認していない場合は、probe402 自身の未確認として記録されていることです。
わからないこと:現時点でエンドポイントに接続できるかどうか(観測結果には経過時間が記載されています)、あなたの支払いに応答があるかどうか(有料配信の観測結果には日時が記載されており、probe402 の経験を示しています)、probe402 のリストにないルートに関する情報(not-on-record が返され、その旨が示されます)、およびルートがネットワーク上で行った動作を超える運営者に関する情報です。
ルートではなくホストを指定する URL の場合、そのホストの各ルートについて、それぞれの評価アドレスと有料状態を返しますが、どのルートも評価しません。
インストール
Node 24 以降が必要です。
git clone https://github.com/probe402/probe402-check.git
cd probe402-check
npm install # builds dist/
npm test
CLI
# by the URL you are about to pay
node dist/cli/check.js https://datastand.dev/api/data/dev-signals
# by probe402 endpoint id, comparing the 402 you hold, full JSON
node dist/cli/check.js ep_67bec7d9e13ef185 --pay-to 0x470a1b647d668d3820add26d70c8371557ff4c6b --amount 20000 --network eip155:8453 --json
# a host: its routes, each with a grade address
node dist/cli/check.js https://api.myceliasignal.com
# the readings a verdict stood on, each with its date and the address that holds it
node dist/cli/check.js ep_4d864a69497e351a --explain
npm link(またはグローバルインストール)の後は、同じコマンドを probe402-check、probe402-check-mcp、probe402-verify-head として実行できます。
MCP(Claude Desktop、Claude Code、任意の MCP クライアント)
このサーバーは stdio 経由で MCP を使用し、url と任意の held_quote(pay_to、amount_atomic、network、asset、scheme)を受け取る check_before_paying ツールを1つ登録します。
{
"mcpServers": {
"probe402-check": {
"command": "npx",
"args": ["-y", "probe402-check", "--mcp"]
}
}
}
npm ではなくクローンから実行する場合、コマンドは node、引数は
/absolute/path/to/probe402-check/dist/cli/mcp.js です。examples/claude-mcp-config.json にその形式が記載されています。
このパッケージは MCP レジストリに io.github.probe402/probe402-check
として登録されています(このリポジトリ内の server.json)。
同じ設定ブロックは examples/claude-mcp-config.json にもあります。Claude Code の場合:claude mcp add probe402-check -- node /absolute/path/to/probe402-check/dist/cli/mcp.js。
OpenAI Agents SDK
この SDK に依存せずに、同じチェックを関数ツールとして利用できます:
examples/openai-agents-tool.ts は、@openai/agents の tool() と zod で構築した checkTool をエクスポートします。これらはご自身のプロジェクトにインストールしてください。
import { Agent, run } from "@openai/agents";
import { checkTool } from "./openai-agents-tool.ts";
const agent = new Agent({
name: "buyer",
instructions: "Before paying any x402 endpoint, call check_before_paying and reason from its verdict.",
tools: [checkTool],
});
await run(agent, "Pay https://datastand.dev/api/data/dev-signals if the record supports it.");
ライブラリとして
import { checkBeforePaying } from "probe402-check";
const result = await checkBeforePaying({
url: "https://datastand.dev/api/data/dev-signals",
held_quote: { pay_to: "0x470a1b647d668d3820add26d70c8371557ff4c6b", amount_atomic: "20000" },
});
console.log(result.verdict);
// datastand.dev GET /api/data/dev-signals was quoting 20000 atomic units of 0x8335…2913 on eip155:8453
// to 0x470a…4c6b as of 2026-09-17T02:32:23.121Z (9.4 hours ago, inside its daily cadence). The quote did
// not change across 7 reading(s) in 7 days. probe402 paid this route on 2026-09-16T17:24:16.130Z and
// graded the result "Settled and answered". The payment request you hold matches the recorded quote on
// pay_to, amount_atomic. Cite https://probe402.com/grade/ep_67bec7d9e13ef185.
result.kind は route、host、not-on-record のいずれかです。フィールドの型は dist/index.d.ts に定義されています。
デモ
エージェントが3件の402に遭遇し、1件は支払い、1件は警告を出し、1件は拒否する
examples/agent-pays.ts は、フックが想定どおりに機能する例です。probe402のリストにある実際の3つのルートが402を返すと、フックはそれぞれについてprobe402に問い合わせます。デフォルトのポリシーでは、支払いを通し、警告を出して通し、最後の1件を止めます。所要時間は約15秒です。
node examples/agent-pays.ts
読み取り結果は実際のものです。ただし、支払いは実際のものではありません。このファイルにもパッケージにも、ウォレット、キー、署名者はありません。x402クライアントは、公開されているものと同じ構成で組み立てた10行の代用品です。実際のクライアントが署名する箇所では、署名したことを示す行を書き出します。そのため、この実行で示されるのは順序です。
3つのルートのうち、probe402が支払い、最新の支払いが決済済みで回答ありと評価されたルートは通過します。支払いを伴う試行がすべて決済前に拒否されたルートは、警告を出して通過します。probe402が2回支払ったものの、どちらもBase上で裏付けがあり、いずれも回答がなかったルートは、署名者に渡る前に止められます。
エージェントが支払いの前に確認する
examples/agent-decides.ts は、probe402のリストにある3つのルートに支払う直前のエージェントです。問い合わせて、probe402の回答を表示し、ファイルの先頭に記述されたポリシーに基づいてPAY、HOLD、REFUSEを判断します。保留中の402が、記録された見積もりとは異なる支払い先アドレスまたは金額を示している場合は拒否します。読み取り結果が更新間隔を過ぎている、見積もりではない、またはprobe402がそのルートに一度も支払ったことがない場合は保留します。ルートが更新間隔内に見積もりを提示しており、保留中のリクエストがその内容と一致し、probe402自身による最新の支払い試行が決済済みと評価されている場合は支払います。
node examples/agent-decides.ts
3つのルートのうち、2つはprobe402の支払い済みパネルにあり、PAYと表示されます。3つ目はリストにはありますがパネルにはなく、HOLDと表示されます。このポリシーはデモのものであり、probe402のものではありません。読み取り結果はツールが提供しますが、判断のルールを記述するのはあなたです。
ヘッドの再確認
node dist/cli/verify-head.js 2026-08-21
node dist/cli/verify-head.js 2026-08-21 --next # also checks that 2026-08-22's manifest names it
2026-08-21
head on the public copy (25 rows through 2026-09-14): f0bca18bc38e9a7d202bedc12def262cd4a17ec61136ee07f911afc775bafc65
sha256 of https://probe402.com/chain/2026-08-21 (109954 bytes, trailing newline stripped): f0bca18bc38e9a7d202bedc12def262cd4a17ec61136ee07f911afc775bafc65
next day 2026-08-22 links back to 2026-08-21 f0bca18b…: NAMES IT
LINKS
適用されるルールは次のとおりです。probe402.comが/chain/<date>で提供するマニフェストは、正規化されたJSONの後に改行バイトがちょうど1つ続きます。ヘッドは、その改行を除いたバイト列のSHA-256です。ヘッドテーブルの公開コピーは
github.com/probe402/probe402-chain-headsにあり、封印された日ごとに1行ずつ追記され、書き換えられることはありません。LINKSの場合の終了コードは0、DOES NOT LINKの場合は1、確認できなかった場合(その日の行がまだない、またはマニフェストが提供されていない)は2です。
読み取るもの。それ以外は何も読み取りません
コードが組み立てるアドレスは4つだけで、すべてのリクエストは1つの関数を経由します。その関数は、リストにないものを拒否します。このリポジトリ内のテストでは、追加のパスを使って拒否処理を実行し、ほかの場所でアドレスが組み立てられていないかソースを検索します。
https://probe402.com/grade/<endpoint_id>— ルートの無料評価https://probe402.com/grade?url=<url>— URLで指定したルートまたはホストの無料評価https://probe402.com/chain/<date>— 封印された日のマニフェストhttps://raw.githubusercontent.com/probe402/probe402-chain-heads/main/ARCHIVE-CHAIN.md— 公開ヘッドテーブル
リクエストにはユーザーエージェントprobe402-check/<version> (+https://github.com/probe402/probe402-check)が含まれます。これにより、probe402はこのツールの呼び出しをほかの呼び出し元と分けて集計できます。無料評価には1分あたりのリクエスト数制限があり、このツールは確認ごとに1件のリクエストを行います。
このリポジトリには、probe402独自の記録、リスト、収集機能、配信コード、有料の計測機能は一切含まれず、いかなる種類の認証情報もありません。返されるものはすべて、すでに公開アドレスで回答済みの情報です。
表現
probe402は公開する内容において、最上位であるという主張と、記録からは認められない結論という2種類の表現を拒否します。このリポジトリのテストでは、このREADME、ソースとサンプル内のすべての文字列、記録された回答から生成されるすべての判定に対して、同じパターンを照合します。変更によってテストに引っかかった場合は、パターンを緩めず、表現を修正してください。
ライセンス
Apache-2.0です。LICENSEを参照してください。名称「probe402」はコードのライセンス対象ではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。