Akashi Notari について
Akashi Notariは、ファイルハッシュの記録と存在証明の照会を行うMCPサーバーです。x402による有料リクエストでSHA-256ハッシュをBaseに記録し、証明を無料で検索できます。
主な機能
- 01有料のSHA-256ハッシュ記録
- 02ハッシュまたは取引による無料照会
- 03オンチェーン証明と証明書リンク
- 04x402決済の処理
活用シーン
- 01ファイルが特定時点で存在したことの証明
- 02ハッシュの記録状況の確認
- 03取引からの証明取得
MCP 対応
Streamable HTTPのMCPエンドポイントは、無料照会用の`find_proof`と有料記録用の`anchor_hash`を提供します。決済情報はx402メタデータで受け渡されます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://anchor.akashi-notari.com/mcpclaude mcp add --transport http self-reality-akashi-notari https://anchor.akashi-notari.com/mcp{"mcpServers":{"self-reality-akashi-notari":{"type":"http","url":"https://anchor.akashi-notari.com/mcp"}}}Cursor で開く{"servers":{"self-reality-akashi-notari":{"type":"http","url":"https://anchor.akashi-notari.com/mcp"}}}VS Code で開く{"mcpServers":{"self-reality-akashi-notari":{"type":"http","url":"https://anchor.akashi-notari.com/mcp"}}}{"mcpServers":{"self-reality-akashi-notari":{"serverUrl":"https://anchor.akashi-notari.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
2| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tx | string | いいえ | トランザクションハッシュ。hash の代わりに使用します |
| hash | string | いいえ | ファイルの SHA-256 ハッシュ(16 進数 64 文字) |
詳細
Anchor Worker
x402 経由でエージェントにアンカーを販売する Cloudflare Worker です。エージェントは、SHA-256 ファイルハッシュと署名済みの USDC 支払いを 1 つの HTTP リクエストで送信します。Worker は VerifierRegistryUSDC に 1 回のトランザクションを送信し、USDC を受け取って証明を書き込みます。ファシリテーターは関与しません。
API エンドポイント
POST /anchor→ 有料。ハッシュをオンチェーンに書き込み、トランザクションハッシュと証明書へのリンクを返しますGET /proof?hash=<sha256 hex>→ 無料。このハッシュがアンカーされているか、および最初の証明を返しますGET /proof?tx=<transaction hash>→ 無料。このトランザクションによって書き込まれた証明を返しますPOST /mcp→find_proofとanchor_hashツールを備えた MCP サーバー(Streamable HTTP)GET /openapi.json→ OpenAPI の説明。x402scan などのディレクトリは/anchorを登録する前にこれを読み取りますGET /.well-known/x402→/anchorを掲載した x402 ディスカバリードキュメントGET /.well-known/agent-registration.json→ ERC-8004 エージェント登録ファイルGET /llms.txt→ 言語モデル向けのサービス説明GET /→ サービスの説明と現在の価格GET /health→{ ok: true }
POST /anchor
本文:{ "hash": "<sha256, 64 hex chars>", "filename": "<optional>" }。0x プレフィックスと大文字を受け付けます。ハッシュは、ウェブアプリが書き込む形式と同じく、0x なしの小文字で保存されます。ファイル名はウェブアプリのルールに従い、小文字の a-z 0-9 - _ . のみを使用し、最大 128 文字です。
PAYMENT-SIGNATURE ヘッダーがない場合、Worker は PAYMENT-REQUIRED ヘッダー内の条件(x402 v2、base64 JSON)と同じ JSON を本文に含めて 402 を返します。
{
"x402Version": 2,
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"amount": "10000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"payTo": "<VerifierRegistryUSDC>",
"maxTimeoutSeconds": 120,
"extra": { "assetTransferMethod": "eip3009", "name": "USD Coin", "version": "2" }
}
]
}
金額はコントラクトの price() から読み取るため、見積もりとコントラクトの金額は常に一致します。有効な支払いがある場合、レスポンスは 200 となり、PAYMENT-RESPONSE ヘッダーが含まれます。
{
"ok": true,
"status": "confirmed",
"hash": "be44340d151cbfa7a5dc59b579dd6632fb0891b573f8fdc927264309a3b168f0",
"filename": "report.pdf",
"submitter": "<payer address>",
"timestamp": 1790919801,
"timestampIso": "2026-10-02T05:43:21.000Z",
"paid": "10000",
"currency": "USDC",
"chain": "base",
"txHash": "0x...",
"explorerUrl": "https://basescan.org/tx/0x...",
"certificateUrl": "https://akashi-notari.com/certificate/?chain=base&hash=0x..."
}
どの x402 クライアントでも動作します。
import { wrapFetchWithPaymentFromConfig } from '@x402/fetch';
import { ExactEvmScheme } from '@x402/evm';
const pay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: 'eip155:8453', client: new ExactEvmScheme(account) }],
});
const res = await pay('https://<worker>/anchor', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ hash, filename: 'report.pdf' }),
});
GET /proof
VerifierRegistryUSDC は各ハッシュの最初のアンカーを保存するため、ハッシュによる検索は、コントラクトの読み取り(firstAnchor)と、指定された 1 つのブロックに対するログクエリで完了します。チェーン全体の検索も、エクスプローラーキーも必要ありません。
{
"hash": "be44340d…",
"anchored": true,
"proofs": [ { "hash": "…", "filename": "report.pdf", "submitter": "0x…", "timestamp": 1790919801, "txHash": "0x…", "contract": "0x…" } ],
"searched": ["<VerifierRegistryUSDC>", "<VerifierRegistry>"]
}
proofsには、VerifierRegistryUSDC上のそのハッシュの最初のアンカーが格納されます。同じハッシュの後続のアンカーはイベントとして存在し、?tx=で開けます- ウェブアプリが書き込む ETH の
VerifierRegistryは何も保存しないため、その証明にはエクスプローラー API が必要です。その検索に失敗すると、コントラクトはsearchedからunsearchedに移行しますが、回答の残りの部分は有効です。unsearchedの項目を含むanchored: falseは、「検索可能な場所では見つからなかった」という意味です
MCP
POST /mcp はセッションなしの Streamable HTTP で MCP を提供します。各リクエストは単独で完結し、GET は 405 を返します。
find_proof{ hash }または{ tx }:無料で、GET /proofと同じ回答を返しますanchor_hash{ hash, filename? }:有料で、x402 MCP トランスポートに従います。支払いがない場合、結果はstructuredContentに x402 のPaymentRequiredオブジェクトを含むツールエラーになります。クライアントは署名して、支払い情報をparams._meta["x402/payment"]に指定して再度呼び出します。その後、結果には証明が含まれ、決済情報は_meta["x402/payment-response"]に含まれます
このフォルダーの server.json は、MCP レジストリ向けにサーバーを説明しています。
ステータスコード
400ハッシュ、ファイル名、または支払いヘッダーが不正です。支払いを処理する前に検証されるため、課金されません402支払いがない、または支払いを決済できません。本文のerrorはinsufficient_fundsなどの x402 エラーコードです409payment_already_used:この認証情報はすでにアンカーの購入に使われています。/proofで検索してください503Worker にコントラクトアドレスまたはリレイヤーキーがありません
メモ
- トランザクションは、USDC を送金して証明を発行するか、リバートして何も送金しないかのどちらかです
- トランザクションがマイニングされると、レスポンスは完全な証明とともに
status: "confirmed"になります。30 秒以内に RPC エンドポイントから報告されない場合も、レスポンスは200のままで、status: "submitted"、txHash、lookupURL が返されます。ブロードキャストされた支払いが失敗として報告されることはありません - オンチェーンの
submitterは支払者であり、リレイヤーではありません - トークン上ですでにオーソリゼーションが実行されている場合(ファシリテーターによる実行、またはリレイヤーより先に実行した第三者による実行)、ワーカーはトークンのログでコントラクトへの送金を確認し、
anchorPaidで記録します。過去 1,800 ブロックを検索します - キャンセルされたオーソリゼーションでは何も購入できません
- 公式の x402 クライアントは、ユーザーが上限を引き上げない限り、1 ドルを超える支払いを拒否します。エージェントが設定なしで支払えるよう、価格は 1 ドル以下にしてください
- 同時リクエストは 1 つのリレイヤーキーを共有します。nonce が競合した場合は 3 回再試行されます。トラフィックが多い場合はキューが必要です
- パブリック RPC ノードとキー不要の Blockscout API は、Cloudflare の共有アドレスからのリクエストを拒否するか、レート制限します。本番環境では
RPC_URLにキー付きエンドポイントを設定し、シークレットとして保存してください。LOGS_API_KEYが必要なのは、/proof?hash=に ETH コントラクトの証明を含める場合のみです - トークン上で実行済みのオーソリゼーションを復旧する処理では、トークンログの過去 1,800 ブロックを検索しますが、無料の Alchemy キーでは 10 ブロックまでしか検索できません。この処理を機能させるには、
RPC_URLに 2 つ目のエンドポイントを指定するか、有料キーを使用してください - IP ごとのリクエスト数は
RATE_LIMIT_PER_MIN件に制限されます(デフォルトは 60 件)
環境変数
RELAYER_PRIVATE_KEY:シークレットです。トランザクションを送信するウォレットです。ガス代分の ETH と、コントラクト上のsetRelayer(address, true)が必要ですREGISTRY_ADDRESS:デプロイ済みのVerifierRegistryUSDCCHAIN_ID:8453(Base、デフォルト)または84532(Base Sepolia)。以下のすべての項目には、この 2 つのチェーン用の組み込みデフォルト値がありますRPC_URL:1 つ以上の RPC エンドポイントをカンマ区切りで指定します。順番に試行されます。Base のデフォルトはパブリックノードのリストです。本番環境のトラフィックには、キー付きエンドポイント(Alchemy、Infura)をシークレットとして設定してくださいRPC_ORIGIN:プロバイダーキーで許可オリジンリストが制限されている場合に、RPC 呼び出しのOriginヘッダーとして送信されますTOKEN_ADDRESS、TOKEN_NAME、TOKEN_VERSION、EXPLORER_URL:任意のオーバーライドです。TOKEN_NAMEとTOKEN_VERSIONはトークンの EIP-712 ドメインですLEGACY_REGISTRY_ADDRESS:ETH のVerifierRegistry。検索結果に含まれますLOGS_API_URL、LOGS_API_KEY、LOGS_FROM_BLOCK:/proof?hash=用に ETH コントラクトを検索する、Blockscout 互換のログ API と、その任意の API キーです。RPC ノードを使用するには、LOGS_API_URLを空に設定してくださいAGENT_REGISTRATIONS:エージェント登録ファイルのregistrationsフィールド用の JSON 配列です。例:[{"agentId":22,"agentRegistry":"eip155:8453:0x…"}]。エージェントが ERC-8004 ID レジストリに登録されたら設定してくださいPUBLIC_URL:ワーカーの公開オリジンです。ワーカーが告知するresource.urlに使用されますCERTIFICATE_URL、CERTIFICATE_CHAIN:証明書リンクの参照先ですRATE_LIMIT_PER_MIN:デフォルトは 60 件です
ローカル開発
cd workers/anchor
pnpm install
cp dev.vars.template .dev.vars
pnpm dev
テスト
エンドツーエンドスクリプトは、ローカルチェーンにモックの USDC と両方のレジストリをデプロイし、ワーカーを手動で、公式の x402 クライアント経由で、また MCP 経由で実行します。
# terminal 1
cd contracts/registry && npx hardhat compile && npx hardhat node
# terminal 2
cd workers/anchor && pnpm test:e2e
デプロイ
# 1. Deploy the contract and allow the relayer (try baseSepolia first)
cd contracts/registry
RELAYER_ADDRESS=0x... pnpm hardhat run scripts/deploy-usdc.js --network base
# 2. Put the address from constants-usdc.json into wrangler.toml as REGISTRY_ADDRESS
# 3. Set the relayer key and deploy
cd ../../workers/anchor
npx wrangler secret put RELAYER_PRIVATE_KEY
npx wrangler deploy
# 4. Send the relayer a little ETH on Base for gas
# 5. Rebuild and deploy the web app, so the certificate page reads the new contract
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。