mcpField
A
Akashi Notari

Akashi Notari

リモート
akashi-notari.comセキュリティ12 週間前に更新
リポジトリ公式サイト

Akashi Notari について

Akashi Notariは、ファイルハッシュの記録と存在証明の照会を行うMCPサーバーです。x402による有料リクエストでSHA-256ハッシュをBaseに記録し、証明を無料で検索できます。

主な機能

  1. 01有料のSHA-256ハッシュ記録
  2. 02ハッシュまたは取引による無料照会
  3. 03オンチェーン証明と証明書リンク
  4. 04x402決済の処理

活用シーン

  1. 01ファイルが特定時点で存在したことの証明
  2. 02ハッシュの記録状況の確認
  3. 03取引からの証明取得

MCP 対応

Streamable HTTPのMCPエンドポイントは、無料照会用の`find_proof`と有料記録用の`anchor_hash`を提供します。決済情報はx402メタデータで受け渡されます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://anchor.akashi-notari.com/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

2
パラメーター型必須説明
txstringいいえトランザクションハッシュ。hash の代わりに使用します
hashstringいいえファイルの 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 エラーコードです
  • 409 payment_already_used:この認証情報はすでにアンカーの購入に使われています。/proof で検索してください
  • 503 Worker にコントラクトアドレスまたはリレイヤーキーがありません

メモ

  • トランザクションは、USDC を送金して証明を発行するか、リバートして何も送金しないかのどちらかです
  • トランザクションがマイニングされると、レスポンスは完全な証明とともに status: "confirmed" になります。30 秒以内に RPC エンドポイントから報告されない場合も、レスポンスは 200 のままで、status: "submitted"、txHash、lookup URL が返されます。ブロードキャストされた支払いが失敗として報告されることはありません
  • オンチェーンの 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:デプロイ済みの VerifierRegistryUSDC
  • CHAIN_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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。