cryptoport-port について
cryptoport-portは、暗号資産系YouTubeチャンネルの公開コメントを日次ボードにまとめるMCPサーバーです。市場の見解を調べる人向けに、銘柄への言及や立場の履歴、材料を提供します。データはリアルタイムではなく、投資助言でもありません。
主な機能
- 01最新の日次ボードの取得
- 02公開コメントの検索
- 03銘柄情報と立場の履歴確認
- 04日付付き材料の検索
- 05日付指定でのボード取得
活用シーン
- 01銘柄に関するチャンネルの見解を整理
- 02コメントから市場テーマを検索
- 03立場の変化と日付付き材料を追跡
MCP 対応
streamable HTTPとstdioで、ボードを照会する6つのツールをMCPクライアントに提供します。ライブエンドポイントのツールは無料で、APIキーは不要です。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://cryptoport-mcp.cryptoport-port.workers.dev/mcpclaude mcp add --transport http com-thecryptoport-cryptoport-port https://cryptoport-mcp.cryptoport-port.workers.dev/mcp{"mcpServers":{"com-thecryptoport-cryptoport-port":{"type":"http","url":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}Cursor で開く{"servers":{"com-thecryptoport-cryptoport-port":{"type":"http","url":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}VS Code で開く{"mcpServers":{"com-thecryptoport-cryptoport-port":{"type":"http","url":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}{"mcpServers":{"com-thecryptoport-cryptoport-port":{"serverUrl":"https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
6このツールにパラメーターはありません。
詳細
The Crypto Port — MCP サーバー
暗号資産関連のYouTubeチャンネルが語った内容を、コインの見解、スタンス、日付付きの カタリストを含む日次ボードとして、MCP経由で提供します。無料で、APIキーは不要です。
- ライブエンドポイント(ストリーマブルHTTP):
https://cryptoport-mcp.cryptoport-port.workers.dev/mcp - レジストリ名:
com.thecryptoport/cryptoport-port(公式MCPレジストリ、registry.modelcontextprotocol.io) - ウェブサイト(人間向けボード): https://thecryptoport.com
クライアントに追加する
Claude Code:
claude mcp add --transport http cryptoport https://cryptoport-mcp.cryptoport-port.workers.dev/mcp
ストリーマブルHTTPリモートに対応するMCPクライアント:
{
"mcpServers": {
"cryptoport": {
"type": "streamable-http",
"url": "https://cryptoport-mcp.cryptoport-port.workers.dev/mcp"
}
}
}
上記のライブエンドポイントでは、6つのツールすべてが無料です — latest_board、search、coin、
stance_history、catalysts、board_snapshot。このデプロイにはpayToが設定されていないため、決済
ミドルウェアはマウントされておらず、課金されることはありません。このことは、独自の/healthzと/.well-known/mcp.json
にも記載されています。さらに下の表にある価格は、有料のx402ポート(Base Sepolia
テストネット)に適用され、payToを設定したデプロイにのみ該当します。
提供される情報はすべて、名前の挙がったチャンネルによる公開発言についての論評です。すべてのペイロードに
stale/stale_days/built_from_brief_dateが含まれるので、確認してください。金融アドバイスではなく、
リアルタイム情報でもありません。
ビルドの背景 — rung-3のマシン向けポート
thecryptoport.comの日次ボードを提供するMCPサーバーと、x402で決済可能なHTTPエンドポイントです。
ネットワーク:Base Sepolia(eip155:84532)— すべてテストネットです。メインネットの承認は存在せず、
その前提もありません。このサーバーが通信するどのネットワークでも、実際のお金が課金されることはありません。
このビルドに関するマスターの正式な裁定は**C+(2026-08-24)**です。テストネット上でのみ有料ポートの仕組みを
今すぐ構築し、有料プランそのものは引き続き見送り、メインネットへの切り替えは60日目の裁定とします。以下の価格は
決済ハンドシェイクを実際に機能させるためのものであり、誰かに請求するためのものではありません。
ランタイムの所有者:Dex。Wardは決済、スクリーニング、ライセンスのロジックを作成し、Dexはプロセスを起動して 稼働を維持します。詳しくは以下の「Dexへの引き継ぎ」を参照してください。
概要
| ツール | 価格(テストネットUSDC) | HTTP対応エンドポイント |
|---|---|---|
latest_board | 無料 | GET /api/v1/board |
search(q, limit) | 無料 | GET /api/v1/search?q= |
coin(ticker) | 0.005 | GET /api/v1/coin/:ticker |
stance_history(ticker) | 0.01 | GET /api/v1/stance_history/:ticker |
catalysts(window) | 0.01 | GET /api/v1/catalysts?window= |
board_snapshot(date) | 0.02 — 本日は課金されません | GET /api/v1/board_snapshot/:date |
無料のメタ情報:GET /healthz、GET /x402/routes(価格表)、GET /.well-known/mcp.json。
MCP:POST /mcp(ストリーマブルHTTP)およびnpm run mcp-stdio(stdio)。
MCPツールは、同一プロセス内のHTTP対応エンドポイントに対する薄いプロキシです。 価格設定、スクリーニング、 拒否、公開フィールドのゲートに共通のコードパスを使うため、2つのインターフェースで結果が食い違うことはありません。
有料プランで実際に提供するもの — 価格を設定する前にお読みください
llms.txtには、サイト独自の言葉で次のように記載されています。「同じ行を提供する隠れた有料プランはありません。」
これはこのビルドに対する制約であり、現在も遵守されています。有料ペイロードにはすべて、同じ事実を含む無料の
静的ファイルがupstreamとして明記されています。価格が付くのは形式であり、独占性ではありません —
arc文字列ではなく日付付きの解析済み系列、ファイル全体ではなく期間を指定したカタリスト検索です。将来、有料ツールが
無料プランにはない事実を返すことになれば、まずこのllms.txtの記述を変更する必要があります。→ Larryに共有済みで、
ここでは決定していません。
実行する
npm install
npm run sdn-refresh # refresh the OFAC list (vendored copy already present)
node scripts/keygen.js # writes .env.sepolia (mode 600); prints only the address
X402_PAY_TO=0x… npm start # http://localhost:8402
npm test # 91 tests
npm run demo # free call -> 402 -> (pay) -> data + receipt
データはrung-0エミッターから取得します。CRYPTOPORT_DATA_DIRが設定されていればその値を使い、設定されていなければ
<repo>/../../Documents/Claude/myPKA/infra/cryptoport-site/distを使います。ただし、distにfeed.jsonがない場合は
stagingにフォールバックします。起動時に一度だけメモリへ読み込まれます。リクエスト処理中にファイルシステムへ
アクセスしないため、src/worker.js(Cloudflare Workers)は書き換えではなく、デプロイ先の選択肢になります。
Claude CodeのMCP設定(stdio)
{ "mcpServers": { "thecryptoport": {
"command": "node",
"args": ["/home/ops/projects/cryptoport-port/src/mcp-stdio.js"],
"env": { "X402_PAY_TO": "0x…" }
} } }
代わりにストリーマブルHTTPを使う場合は、クライアントの接続先をhttp://localhost:8402/mcpにします。
採用した仕組みと、採用しなかった仕組み
採用: 有料ルートの前段に x402 v2 ミドルウェアを置き、無料の公開テストネット・ファシリテーター と Base Sepolia 上の USDC を使用します。スマートコントラクトは一切なく、バイトコードも使用しません。 価格、受取アドレス、検証機能だけで仕組みは完結し、コントラクトを減らすことはセキュリティ上の利点です。
| 採用しなかったもの | 理由 |
|---|---|
| 独自のアクセス/サブスクリプションコントラクト | x402 がネイティブにリクエストごとに行う処理に対して、監査対象を増やすだけです。 |
| セルフホストのファシリテーター | 発想は適切ですが、規模に合いません。不要な分散化を得る代わりに、稼働を維持するサービスが増えます。 |
| API キー + Stripe | アカウント、PII、運営者の介在を再び持ち込むため、匿名エージェントには適しません。 |
| あらゆるトークン、サブスクリプション NFT、分割所有型金融商品 | 利点がまったくない一方で、CLARITY 前の証券規制リスクにさらされます。断じて採用しません。 |
@x402/paywall(@x402/hono のピア依存関係) | ブラウザ向けのペイウォール UI を使うエージェントは存在しないのに、WalletConnect を含む716 個のパッケージをインストールします。検証済みですが、@x402/hono はこれなしで動作します。 |
ヘッダー名は @x402/core の v2 コードパスから読み取っています(2026-09-05 に修正 — 8/24 の
ビルドでは v1 のペアを使用していました)。リクエストは PAYMENT-SIGNATURE(v1 の X-PAYMENT も引き続き受け付け、スクリーニングも引き続き実施)、
レシートは PAYMENT-RESPONSE(X-PAYMENT-RESPONSE はフォールバックとしてのみ読み取り)、利用条件は 402 応答の PAYMENT-REQUIRED(base64 JSON)に含めます。エージェントが価格を知るためにヘッダーを base64 デコードする必要がないよう、利用条件は JSON 本文にも重複して記載し、MCP の呼び出し元には x402 でそのまま渡します。
test/x402.test.js では、これらの名前を SDK 自身の関数と照合して検証します。パッケージの世代は重要です。スコープ付き @x402/* v2
パッケージは package.json で固定され、npm 上で v1 の x402-hono/x402-next と共存します。
ライセンスへの署名は行わず、ここではライセンスハッシュも参照しません。 この段階で販売するのは、公開された声明を集めたデータへのアクセスです。幾何学的データもライセンス対象の成果物もなく、設計に EIP-712 の型付きデータライセンスも含まれていません。各ペイロードの license 文字列は、段階 0 独自の帰属表示であり、変更せずにそのまま渡します。
ゲート(何かを提供する前に、3 つすべてを実行)
- 助言的入力の拒否 —
src/inputs.js。 portfolio/holdings/position/allocation/balance/risk profile/cost basis/PnL/leverage/stop-loss/ 「should I buy」のような名前の引数は、HTTP と MCP のどちらでも、支払いを検討する前に、明確な理由を示して 400 で拒否します。値そのものを調べることはありません。データを読むのではなく、その形式を拒否します。各ツールの説明にもその旨を記載しています。 - 支払者に対する OFAC SDN 制裁対象者スクリーニング —
src/sdn.js。 デコードしたX-PAYMENTペイロード内のあらゆる場所にある0x…アドレスを、OFAC 公開の SDN デジタル通貨アドレス一覧(991 件のアドレス、うち EVM は 124 件、公開日 08/24/2026)と照合するローカルチェックを行います。一覧はscripts/sdn-refresh.jsが OFAC 自身のエンドポイントから読み取り専用で取得し、data/sdn-addresses.jsonに同梱しています。一覧に含まれる支払者には 403 を返し、決済も提供も行いません。これは KYC ではなく KYT でもありません。支払いアドレスをスクリーニングするものであり、資金の追跡はしません。KYC もアカウントも PII も不要です。0.005 ドルのデータ呼び出しのために本人確認情報を収集することは、軽減できるリスクよりも大きなリスクを生みます。 - B-2 公開フィールドのゲート —
src/allowlist.js。quality、counterweight、rank、presenceは、どのような表記であってもプロセス外に出ることはありません。また、未宣言のキーがあればエラーになります。非公開フィールドの一覧を管理する唯一の情報源はinfra/cryptoport-site/allowlist.pyです。2 つの一覧にずれがあればtest/allowlist-parity.test.jsが失敗します。上流の行は読み込み時に射影されるため、出力元のフィールドが増えても、公開対象が気付かないうちに広がることはありません。 そのゲートで記録された1つの決定(2026-09-07)。黙って破棄することも、依然として決定だからです。projectRung0()は、宣言されていない上流のキーを提供せずに破棄します。これはデフォルトでは正しい動作ですが、すべてのコインファイルからcatalyst_refsまでひそかに破棄していました。これらは、このコインに単に 名前が記載されている クレームへの D19 ポインターです(claim_id+due+ SUBJECT ティッカーのcanon。説明文ではありません)。そのため、1つのクレームのテキストは一度だけ保存され、提供されます。これらを破棄すると、coinツールが自ら掲げている説明文が事実と異なってしまいます。「同じ情報は/coins/<TICKER>.jsonの静的 JSON としても無料で提供される」と約束しているのに、そのファイルよりも少ない情報しか提供せず、MCP の利用側には元データとは異なるコインのデータ構造が見えていました。決定:破棄せず、宣言する。 DB の外に新たに出る情報はありません。参照内の各キーはすでに公開済みであり、参照先の説明文も無料のcatalystsツールですでに全体が提供されています。test/tools.test.jsの2つのテスト(「catalyst_refs survives the rung-0 projection」と「the coin tool serves the origin's catalyst_refs, not a narrower shape」)で固定しています。コードが Worker に反映されるのは、その Worker をデプロイしたときだけです。Worker は2つあり(無料のcryptoport-mcpと有料の `cryptoport-x402)、それぞれ専用のコマンドでデプロイします。毎日の KV プッシュで更新されるのはボードであり、コードではありません。両方の現在の状態は、末尾の需要カウンターのセクションにある「Deploy status」を参照してください。
コミット 06e299f のメッセージの訂正: ディスクリプターの誤った days 引数を使ったエージェントの呼び出しが拒否されたと書かれていますが、実際には拒否されていません。どちらのトランスポートでも、呼び出しが宣言済みスキーマに照らして検証されることはないため、days は黙って無視されていました。2026-09-07 の実稼働環境で検証済みです。{"days":7} は isError:false を返し、過去の期日超過が10件ある40件すべての触媒と window_days:null を返します。一方、{"window":7} が返すのは2件です。呼び出し側から見てエラーではなく、黙って誤った結果になるのです。履歴の書き換えなしにコミットメッセージを編集することはできないため、ここに記録します。
ゲートが失敗しうることの証明(ゲートを設ける目的です):
test/sdn.test.js は、実際に OFAC リストに記載されているアドレスを HTTP 経由のエンドツーエンドテストで拒否し、そのアドレスをリストから除いた後、同じ呼び出しが拒否されないことを確認します。これにより、403 が別の場所からではなくゲートによって発生していることを実証できます。test/b2-leak.test.js は、保留対象の各列を上流の JSON に注入し、すべてのツールが例外を発生させるか、その列を除去すること、また HTTP サーフェスが漏えいした値を本文に含めず 500 を返すことを確認します。
ウォレットのサーフェス
payToとして受け取り専用アドレスを1つ使用します。署名も、承認の保持も、コントラクトの呼び出しもしません。サーバーにそのキーは不要であり、環境に*PRIVATE_KEY/*RECOVERY_KEY/MNEMONIC/SEED_PHRASE変数が1つでも存在すると、起動を拒否します(test/network-guard.test.js)。~/projects/cad-on-chain/scripts/keygen.jsのパターンに従ったテストネット用の使い捨て EOAです。ただし1点だけ異なります。キーは.env.sepoliaに直接書き込み(モード 600)、表示しません。 標準出力はターミナル、トランスクリプト、セッションログに残ります。「リポジトリ、メモ、ログに秘密鍵を残さない」という方針にテストネットの例外はありません。- メインネットへ移行することはありません。 メインネットの
payToは CDP 管理の Server Wallet であるか、存在しないかのどちらかです。 - チェーン ID 84532 は厳格にガードされ、すべてのメインネット ID は名前で拒否リストに登録されています。
- 設計上、非カストディアルです。購入者の資金も、購入者のキーも、購入者のファイルも、返金もありません(決済は配信前に行われます)。そして、ファイルを保管することは決してありません。
メインネットのゲート一覧(Lane C 仕様 §C7 からの原文引用 — すべて満たす必要があり、推測による判断は不可)
- Master による、デプロイごとの明示的なメインネット承認。成果物に原文どおり引用すること。
- 有料ティアの裁定が再審議され、承認されていること。
- §C5 (a)–(d) に関する Pax/Master の回答。特に投資顧問に関する質問。
payToが CDP 管理のアカウントであること。ディスク上のどこにもキー素材が存在しないこと。使い捨て EOA パターンを廃止していること。- SDN の拒否対象者ゲートで、リスト掲載アドレスを拒否することを実証していること。
- B-2 リークテストが CI で成功し、保留していた列を導入すると失敗することを実証していること。
- Facilitator を
x402.org(テストネット専用)から CDP に切り替え、認証情報をリポジトリの外に保持していること。 - 所有権/レシートに関する問題が、Master のものではないドメインで解決済みであること。
- 新しいバイトコードがないこと。変更があった場合は、Slither と Foundry のファズテスト/不変条件テストを CI で実施し、さらに名前を明記した外部監査をメインネット前に実施すること。
本日時点での一覧に対する状況:5 と 6 は完了し、実証済みです。1、2、3、4、7、8 は未着手です。 9 は満たされています。このビルドではバイトコードを出荷しないため、Slither/Foundry の実行も外部監査も不要です。今後変更があった場合は、項目 9 が全面的に適用されます。
Dex への引き継ぎ(実行時要件であり、実行時の判断ではありません)
- 稼働時間。 永続的なオペレーターのクリックなしで、再起動後も無人で稼働し続ける必要があります。このボックスでは、systemd ユニットが必要です。ライブ設定への反映は Master の承認待ちです。 Ward は作成していません。
- シークレット。 プロセスに必要な変数は
X402_PAY_TOの 1 つだけです。キーは不要です。 リポジトリの外に保持してください。.env.sepolia/.env.buyerはパーミッション 600 で git に無視され、サーバーが読み込むこともありません。 - コールドスタート。 起動時にボード全体を一度読み込みます(JSON ファイル約 60 個、数十 ms)。Workers では、同じ形式のデータを
src/worker.js経由で KV から取得します(env.BOARDのキー:feed、coins、catalysts、sdn)。07:50 の cron で反映します。Workers(無料版と有料版)はどちらも davitlabs の Cloudflare アカウント上で稼働中です。末尾の 2 つのセクションを参照してください。 - 有料の呼び出しごとに
https://x402.org/facilitatorへ HTTPS でアウトバウンド接続します(サブリクエスト 1~2 件)。このボックスのデータセンターのイーグレスに関する問題は、YouTube に対するインバウンドのレピュテーションであり、アウトバウンド HTTPS ではありません。 - データ。
CRYPTOPORT_DATA_DIRを、07:50 のジョブが出力する場所に設定してください。ポートが再読み込みするのは起動時のみです。出力後に再起動するか、再読み込み機能を追加してください。 - SDN の更新も同じ cron で行います:
npm run sdn-refresh(OFAC から読み取り専用で取得、約 30 秒)。 - レート制限は無料ティアにおけるエッジ側の課題です → Dex。 有料ティアには自己制限機能があります。
- アンカリングは引き続き第 1 段階です → Dex。ポートはアンカーを受け取り、そのまま変更せずに渡します。パスポートの記録を再アンカー、再ハッシュ、フォークすることはありません。注: 現在の
distビルドではanchor.root = nullですが、stagingには実際の Merkle ルートがあります。デプロイ済みビルドにはアンカーがありません。サーバーは起動時に警告を出し、空のアンカーをそのまま提供します。これは Dex が修正することであり、Ward の担当ではありません。 - レジストリへの登録 — 完了。 HTTP ドメイン証明(ルートの
server.json、scripts/registry-publish.sh)を使用して、registry.modelcontextprotocol.io にcom.thecryptoport/cryptoport-portとして掲載済みです。
コスト
想定額は約 $0 です。 無料のテストネット Facilitator、無料のレジストリ掲載、テストネット USDC、既存のホスティングを利用し、コントラクトもベンダーもありません。継続的に発生する可能性がある唯一の費用は、メインネットで月 1,000 件を超えた後に CDP に支払う決済あたり $0.001 ですが、このボードで現実的に想定される利用量ならゼロです。収益の見込みも約 $0 です。エコシステムの中央値では、有料呼び出しが月に 1,000 件 でも約 $28 です。この価格設定では $5~10 です。このレーンはスタックのデモであり、決済レールを利用する選択肢です。
既知の制限事項と確度フラグ
- Bazaar の検出はテストネットで動作しません — 2026-08-24 確認済み。 無料の
x402.orgファシリテーターの/supportedが['builder-code','eip2612GasSponsoring','erc20ApprovalGasSponsoring']を提示しており、bazaarはありません。また、GET /facilitator/discovery/resourcesは 404 を返します。402 には有効なbazaar宣言(registry/bazaar-mcp.json。また、test/x402.test.jsでアサーションされています)が含まれていますが、インデックスに登録するものがありません。実際に Bazaar に掲載するには CDP ファシリテーターが必要で、その利用にはアカウントが必要です。これは Lane C 仕様 §C3 の「初日から Bazaar」という記述に反しており、メインネット移行のゲート項目です。 デモは 402 で停止します— 2026-08-27 にローカルで、2026-09-05 にホスト型 Worker で解決済み(Base Sepolia で 0.01 USDC の決済を 3 回実施。HTTP と MCP の両方の経路。以下の有料 Worker のセクションを参照)。購入者は今後の実行に備えて 0.255 テスト USDC を保有しています。- MCP レジストリマニフェストはルートの
server.jsonです。稼働中のレジストリスキーマに対する検証に合格し、scripts/registry-publish.shが公開するファイルです。(以前の未使用ドラフトregistry/server.jsonは 2026-08-30 に削除されました。) board_snapshotはスタブであり、スタブである間は意図的に課金されません。アンカー付きの過去のボード系列がまだ存在しないためです。- 決済メタデータはレスポンス本文ではなく
PAYMENT-RESPONSEヘッダーに届きます。SDK がハンドラーによる本文の書き込み後に決済を行うためです。MCP レイヤーではこれをsettlementとしてペイロードに統合し、HTTP の呼び出し元はヘッダーを読み取ります。回避策ではなく、この仕様として文書化されています。 stance_historyは公開されているarc文字列から導出されます。 rung 0 がarcの公開を停止した場合、このツールは解析するものがありません。- Ward はクライアント向けの文言を一切記述しません。すべてのペイロードに含まれる
disclaimerの文は、アンカーが証明することと証明しないことについてのエンジニアリング上の定型文です — Rhea/Pax が文言を承認する必要があります。
Pax / Master への未解決の質問(指摘済み、未決定)
Lane C 仕様 §C5 から変更ありません。(a)名前付きチャンネルの通話を要約したフィードへの課金によって、帰属表示/二次的著作物の扱いが変わるか。(b)有料の暗号資産通話フィードは、無料のボードには当てはまらない投資顧問としての扱いを受けるか。(c)データの対価として USDC を受け取ることが資金移動に該当するか。(d)7 つのチャンネル名を有料製品に掲載してよいか。いずれも未回答であり、このビルドでは誰にも課金しません。
ファイル
src/config.js env + the chain-id guard + the no-keys-in-env rule
src/allowlist.js B-2 gate (mirrors infra/cryptoport-site/allowlist.py)
src/data.js snapshot, freshness, arc parsing, search — pure, Workers-safe
src/inputs.js advisory-input refusal
src/sdn.js OFAC SDN screening
src/tools.js the one tool table: prices, schemas, descriptions, handlers
(its advertised half is mirrored in the origin's mcp-tools.json —
test/descriptor-parity.test.js fails if the two ever drift)
src/x402-routes.js route config, 402 body, Bazaar declarations, price table
src/app.js Hono app: gates, paywall, HTTP twins, free meta
src/mcp.js MCP server + streamable-HTTP mount (proxies the HTTP twins)
src/mcp-stdio.js stdio transport entry
src/node-server.js Node entry: disk -> memory at boot
src/worker.js Cloudflare Workers entry (KV-backed; no account created)
src/stats.js demand counter: counts per tool/transport/day in KV (/stats + /healthz.demand only if STATS_PUBLIC=1)
src/evm-keys.js keygen/address, same pattern as cad-on-chain
scripts/ keygen, sdn-refresh, balance, demo, gen-manifests, kv-push,
stats-read (the operator's read-only view of the private counts)
registry/ server.json (MCP registry), bazaar-mcp.json
data/ sdn-addresses.json (vendored OFAC export)
test/ 91 tests
Cloudflare Workers 上の無料 MCP サーバー(2026-08-27 デプロイ)
稼働中: https://cryptoport-mcp.cryptoport-port.workers.dev/mcp — HTTP 経由の MCP、
6 つのツール、無料、キーもアカウントも不要です。
Master は 2026-08-27、無料 MCP サーバーを有料 x402 ポートのホスティングより先に公開すると裁定しました。戦略メモにある「人間の予算への無料の入り口」であり、30 日目のチェックポイントに必要な訪問者数を生み出す唯一のものです。また、サイトが /.well-known/mcp.json で公開している記述子には、サーバーが存在しないツールが記載されていました。
ポリシーではなく、設計上無料です。 wrangler.jsonc では X402_PAY_TO を設定しないため、createApp が x402 ミドルウェアをマウントすることはなく、すべてのレスポンスで isCharging() は price_usdc: "0" と paid: false を返し、ツールの説明にも費用は記載されません。したがって、Master の裁定 4a — 60 日目のチェックポイントまで有料プランを見送る — は、誰かが覚えているかどうかに頼るのではなく、変数が存在しないことで確実に実施されます。
⛔ この Worker に X402_PAY_TO を追加しないでください。 有料ポートは別のデプロイであり、そのホスティングは延期されています。ここで決済を有効にすると、設定ファイルを編集するだけで、見送りが決まったプランを覆すことになります。
データの流れ。 scripts/kv-push.mjs はビルド済みの dist/ を読み込み、feed、coins、catalysts、sdn を BOARD KV 名前空間に書き込みます。Worker は KV を読み取ります。ファイルシステムには触れず、Bluehost にコールバックすることもありません。そのため、Bluehost の mod_security に拒否されるマシンクライアント(python-requests はそこで 406 を受け取ります)も、ここからボードにアクセスできます。
ゾーンも DNS も不要です。 アカウント独自の *.workers.dev サブドメインで応答します。thecryptoport.com やその他のポートフォリオドメインには、レコードを作成も変更もしていません。そのため、これらのゾーンに適用される「メールには絶対に触れない」という指示に抵触しません。
毎日の更新 — Master の承認を受け、2026-08-27 に導入済み
KV には最後にプッシュされた内容が保持されるため、プッシュ処理は既存の 07:50 のチェーンの最後に追加されています。ビルド、許可リストのゲート、デプロイがすべて成功した場合にのみ実行されます。
この行を変更する前に、必ず cron の環境でドライランしてください。 wrangler のシバンは #!/usr/bin/env node ですが、cron の最小限の PATH には node がありません。最初の試行は終了コード 127 で失敗しました。これは 2025-08-15 に channel_intel パイプラインを停止させたのと同じ落とし穴です。kv-push.mjs は、独自の process.execPath ディレクトリを PATH に追加するようになりました。この問題を検出するチェックは次のとおりです。
env -i HOME=/home/ops PATH=/usr/bin:/bin SHELL=/bin/sh \
/home/ops/.nvm/versions/node/v24.15.0/bin/node scripts/kv-push.mjs
運用担当者向けのメモ(ホスト、デプロイチェーン)は、このリポジトリの外にあります。
いつでも手動で実行できます:node scripts/kv-push.mjs。
Cloudflare Workers 上の有料 x402 ポート — TESTNET(2026-09-05 デプロイ)
稼働中: https://cryptoport-x402.cryptoport-port.workers.dev — 無料 Worker と同じコードを、X402_PAY_TO を設定した wrangler.x402.jsonc からデプロイしています。そのため、料金設定された 4 つのツールは、Base Sepolia(eip155:84532、テスト用 USDC)向けの x402 v2 条件を含む 402 を返し、無料の x402.org ファシリテーター経由で決済します。latest_board と search は引き続き無料です。board_snapshot はスタブのため料金設定されていません。MCP の POST /mcp(同じ Worker)では、料金設定されたツールに COSTS n USDC on Base Sepolia と表示されます。実際のお金は請求されません。裁定 4a は有効です。記録済みのデモ、オンチェーンの領収書、Bazaar のステージングを含む記録:
myPKA/Deliverables/2026-08-24-thecryptoport-strategy/12-ward-x402-port-hosted-testnet-2026-09-05.md。
npx wrangler deploy --config wrangler.x402.jsonc # deploy the PAID worker
npx wrangler deploy # deploys the FREE worker (wrangler.jsonc) — separate
PORT_URL=https://cryptoport-x402.cryptoport-port.workers.dev npm run demo # free -> 402 -> pay -> receipt, then the MCP leg
なぜ env ブロックではなく、2 つ目の Worker なのか: wrangler.jsonc では、X402_PAY_TO が存在しないことによって、有料ティアを拒否するようにしています。このファイル内に有料環境を設けると、拒否されるティアが設定 1 行で有効になってしまいます。設定ファイルは 2 つ、Worker も 2 つで、共有スイッチはありません。X402_PAY_TO は単なる var です。すべての 402 に含まれるため、シークレットではありません。どちらの Worker にも wrangler secret はありません。
ライブホストで分かった、テストスイートでは判明しなかった 3 つのこと(すべて修正済み、テスト済み):
- ファシリテーターとのハンドシェイクは自分で実行し、完了を待ちます。
@x402/honoは構築時にhttpServer.initialize()を開始し、最初の有料リクエスト時にのみ完了を待ちます。Workers はレスポンス送信時に進行中の I/O をキャンセルするため、最初のリクエストが無料だった isolate では、すべての有料リクエストが永久にハングしていました(wrangler tail:outcome: canceled、CPU 約 0 ms、処理時間 25 秒)。現在のsrc/worker.jsではsyncFacilitatorOnStart:falseを渡し、build()内でapp.__x402.initialize()の完了を待ち、成功した場合のみ isolate をキャッシュします。 - ホストされている SDN リストが空でした。
kv-push.mjsは一度も存在しなかったdata/sdn.jsonを読み込み、{"addresses":[]}をプッシュしていました。現在は、正しいファイルを使い、100 件未満のアドレスのプッシュを拒否し、worker.jsにバンドルされたフォールバックリストを用意しています。また、app.jsに フェイルクローズ ガード(payTo が設定されていて、スクリーナーが空ならビルドを拒否)を設け、読み込まれたゲートを確認できる/healthz.sdnを追加しています。 - v2 のヘッダー名。 クライアントは
PAYMENT-SIGNATUREを送信しますが、ゲートはX-PAYMENTしか読み込んでいませんでした。そのため、実際の購入者はスクリーニングされず、payerが欠落し、PAYMENT-RESPONSEの領収書は null として読み込まれていました。現在はすべてのゲートがミドルウェアと同じヘッダーを読み込みます。test/paid-path.test.jsは一時的なインメモリキーで実際の v2 ペイロードに署名し、スタブのファシリテーター経由で決済します。
見た目上の問題で、文書化済み: isolate のビルドごとに、x402: Route "…" has an invalid bazaar extension: … Code generation from strings disallowed というログが出ます。Workers では禁止されている Ajv の new Function を使って、Bazaar 拡張機能がスキーマを検証するためです。宣言時だけの問題であり、402 には引き続き bazaar ブロック全体が含まれ、決済への影響はありません。
Bazaar とレジストリ — ステージング済み、未提出。 x402.org には Bazaar がありません(再確認済み:/supported に bazaar はなく、検出エンドポイントは 404)。CDP のファシリテーターは未認証の場合 401 を返すため、リスティングには CDP アカウントと Worker のシークレットとしての API キーが必要です。これは Master's gate に従います。有効化する際は、X402_FACILITATOR_URL=https://api.cdp.coinbase.com/platform/v2/x402 を設定し、wrangler secret put CDP_API_KEY_ID / CDP_API_KEY_SECRET を実行します。また、app.js で new HTTPFacilitatorClient({ url: cfg.facilitatorUrl, createAuthHeaders }) を使い、CDP の JWT ヘッダービルダーを設定します。すると、有料呼び出し 1 回で拡張機能がエコーされ、4 つのルートが GET …/x402/discovery/resources?payTo=0xcceb… に表示されます。registry/server.x402-staged.json は、この Worker を 2 つ目のリモートとして追加する 0.2.0 のレジストリ更新です。公開済みの 0.1.1 は変更されません。
需要カウンター — 2026-09-23 作成、未デプロイ — デフォルトでは非公開で集計します
理由。 このビルドまで、どちらの Worker でもツールごとの tools/call は測定されておらず、記録上の x402 決済はすべて、こちらの購入者ウォレットが支払ったものでした。「エージェントが見つけてくれる」という、この移植版に関する主張はすべて、存在しない数値に基づいていました。src/stats.js がその数値を示します。記録するのは件数だけです。
保存するデータはこれだけです。 既存の BOARD 名前空間に、(Worker、UTC の日付、アイソレート)ごとに KV の値を 1 つ保存します。新しいバインディングはなく、wrangler の設定変更もありません。
stats:<cryptoport-mcp|cryptoport-x402>:<YYYY-MM-DD>:<shard>
{ v, date, deployment,
tools: { <tool>: { mcp|http: { calls, errors, http_402, settled, known_bot } } },
tools_list: { mcp: { calls, known_bot } },
excluded: n }
stats:<deployment>:since the first UTC day this build counted anything
IP アドレス、支払者のアドレス、ユーザーエージェント、引数は保存せず、日付より細かい情報も記録しません。 呼び出し元の情報はエッジで一度だけ読み取られ(classifyOrigin)、2 つの真偽値に変換されます。運営者自身の egress かどうか、そしてユーザーエージェントの種類がクローラー/モニターに見えるかどうか(known_bot。大まかな正規表現を使用し、node、curl、python-httpx、claude-code などのエージェントランタイムは意図的に一致しません)です。IP アドレスと UA はそれ以上処理されません。record() は列挙されたフィールドだけから保存用ドキュメントを作るため、追加のフィールドが入り込む余地はありません。test/stats.test.js では、センチネルの IP/UA/支払者/クエリ値を使ってこれを証明します。さらに負の対照テストとして、データ漏えいのあるストアを指定すると同じチェックが失敗することも確認します。
集計対象。 calls =ツールに到達したすべての呼び出し(MCP の tools/call またはその HTTP 対応版。1 回だけカウントします。MCP 層のプロセス内呼び出しにはマークが付くため、http として重複カウントされることはありません)。http_402 =支払い条件を提示した件数。errors =拒否または失敗した件数(400 の勧告的な拒否、403 の SDN、404、500)。settled =支払いが完了し、決済された件数。served(算出値)=それ以外。tools_list は MCP による探索をカウントします。ツール以外のパスはカウントしません。
運営者は集計対象外にしますが、ソースには記載しません。 このリポジトリは公開されているため、IP アドレスをコミットすることはありません。src/stats.js にも、(コミット対象でもある)wrangler.jsonc/wrangler.x402.jsonc にも記載しません。DEFAULT_EXCLUDED_IPS は設計上、空の配列です。除外リストはデプロイ時に STATS_EXCLUDE_IPS 環境変数からのみ読み込みます(カンマ区切りで、完全一致の IP アドレスまたは IPv4 CIDR を指定します。例:203.0.113.7 または 203.0.113.0/24)。この変数を設定しない場合、どのアドレスも除外されず、すべての呼び出しがカウントされます。除外された呼び出しは excluded にのみ加算され、ツールのバケットには加算されません。
Master は Worker ごとにこの変数を設定します。シークレットとして設定する方法が推奨です(wrangler.jsonc、このリポジトリ、wrangler deployments list のいずれにも表示されません)。
npx wrangler secret put STATS_EXCLUDE_IPS # free Worker (cryptoport-mcp)
npx wrangler secret put STATS_EXCLUDE_IPS --config wrangler.x402.jsonc # paid Worker (cryptoport-x402)
または、デプロイ時に通常の --var として指定することもできます(デプロイのメタデータには表示されますが、ファイルにコミットされることはありません)。npx wrangler deploy --var STATS_EXCLUDE_IPS:203.0.113.7(--config wrangler.x402.jsonc を指定する場合も同様です)。
ボックスの egress はデータセンターの ASN 間で移動します。現在のアドレスとその履歴は、myPKA 内の infra/cryptoport-site/own-egress-ips.txt にあります(リモートには置かず、このリポジトリにも置きません)。egress が変わったら、このファイルを確認し、変数を再設定してください。
KV の上限 — このアカウントは Workers の FREE プランです。 KV では、アカウント全体で 1 日あたり書き込み 1,000 回、リスト操作 1,000 回までです。この上限は 07:50 の kv-push(書き込み 4 回)および CAD on Chain Worker と共有されます。呼び出しごとに書き込むと、約 1,000 件の呼び出しでボードの更新を圧迫します。そのため、各アイソレートは 1 日にキーを 1 つだけ所有し(単一ライター方式。読み取り・変更・書き込みを行わないため、KV の約 60 秒のリージョン間遅延があっても加算が失われません)、waitUntil を使って累積合計をフラッシュします。イベント発生から最初は約 10 秒後、その後は 10 秒ごとまで、書き込みが 50 回を超えた後は最大 15 分ごと、アイソレートごとに 1 日 150 回で上限に達します。書き込みに失敗すると、その UTC 日の残りの間はカウントを一時停止します。公開読み取り(/stats、/healthz。STATS_PUBLIC=1 の場合のみ)は、アイソレートごとの集計値を 1 つ共有し、15 分間キャッシュします。リスト操作の上限も別途適用されます。非公開の Worker は、読み取りで KV のリスト操作を一切消費しません。したがって、得られるのは正確な件数ではなく下限値であり、すべてのペイロードにその旨が記載されます。1 日に数千件の呼び出しが継続するなら、Durable Object または Workers Paid に移行するサインです。判断は Master に委ねますが、望ましい問題です。
件数はデフォルトで非公開です(Masterの裁定 S3.1 = B、2026-09-23)。 どちらのWorkerも上記の説明どおりKVにカウントしますが、STATS_PUBLICが未設定の場合、GET /statsはマウントされません。そのため、ほかの不明なパスと同じ404 {"error":"not_found",…}を返し、エンドポイントの存在を外部に知らせません。また、/healthzにはdemandブロックが含まれません(enabled:falseすら含まれません)。カウントはこの切り替えとは独立しており、STATS_ENABLEDだけでオン/オフが切り替わります。
確認方法(オペレーターがボックスから読み取り専用で実行):
cd ~/projects/cryptoport-port && node scripts/stats-read.mjs # both Workers, last 14 UTC days
cd ~/projects/cryptoport-port && node scripts/stats-read.mjs --days 30 --only x402 --json
wrangler.jsoncとwrangler.x402.jsoncに記載されたBOARD名前空間(現在はどちらも同じものにバインドされています)から、stats:*キーを一覧表示して取得します。このリポジトリ独自のwranglerを使い、ボックスで既に実行済みのwrangler loginを利用して、常に--remoteを指定します。これはscripts/kv-push.mjsと同じ認証経路です。公開された場合に/statsが返す集計値(ツールごと、トランスポートごと、日ごと)を出力します。集計にはsrc/stats.js内の同じmergeShard + summarizeを使い、--jsonを指定すると正確なペイロードを出力します。書き込みは一切行いません。wranglerを呼び出せるのはkv key list/kv key getと--remoteの組み合わせだけで、それ以外はプロセスの開始前に拒否されます(test/stats-read.test.js)。1回の実行につき、名前空間ごとにKVリスト取得が1回、シャードごとに読み取りが1回発生します。解析できないシャードがあると、それを破棄するのではなく、ビューにpartialを付けます。
公開するには、デプロイ時にMasterがWorkerごとに切り替えます:
npx wrangler deploy --var STATS_PUBLIC:1(--config wrangler.x402.jsoncを指定した場合も同様)。公開するのは値が正確に1の場合だけです。--varの設定は次に通常のデプロイを行うまで有効で、そのデプロイ後は再び非公開になります。有効にすると、現在の公開動作では次のように返します:
curl -s https://cryptoport-mcp.cryptoport-port.workers.dev/stats?days=14(1~31、デフォルトは14)および/healthz → .demand(直近7日間)。公開ペイロードは、ほかのすべての応答と同様にB-2のゲートによって制御されます。
counting_sinceより前の日は計測されていないため、ゼロではなく省略されます。配列は{name, …}形式のみで、ツールをキーとするマップは使いません。そのため、B-2のキー走査ゲートが確認するのは宣言済みのキーだけです。不正な形式または無関係なKV値は何も加算されません(テスト済み)。
コード変更なしでキルスイッチを使う: npx wrangler deploy --var STATS_ENABLED:0(有料版の設定でも同様)。Nodeサーバー(npm start)にはKVがなく、カウントも行いません。STATS_PUBLIC=1の場合、その/statsはその旨を返します。
Cloudflare側の数値(2026-09-23確認、読み取り専用)。 ボックスのwrangler OAuth許可には分析スコープがありません(wrangler whoamiに分析またはオブザーバビリティの読み取り権限が表示されません)。また、wranglerには分析データの読み取りコマンドもありません。そのため、Cloudflare GraphQL Analytics APIからリクエスト数を取得するには、Account Analytics: Read権限を持つスコープ付きAPIトークンが必要です。これはMasterのゲート対象のため、試していません。このAPIではWorkerごとのステータス別リクエスト数を取得できますが、MCPツール名は取得できません(POST本文に含まれるため)。このカウンターが存在するのはそのためです。
デプロイ状況(2026-09-23)— カウンターを導入するには両方のWorkerのデプロイが必要です
| Worker | 稼働中のビルド | 必要な作業 |
|---|---|---|
cryptoport-mcp(無料) | 2026-09-08 03:00 UTC | npx wrangler deploy — カウンターの導入 |
cryptoport-x402(有料、テストネット) | 2026-09-07 03:14 UTC | bash ~/x402.sh go — 9/07の修正とカウンターの導入 |
まず、変更したソースをコミットしてください。scripts/deploy-x402.shは、src/、wrangler*.jsonc、またはpackage*.jsonに未コミットの変更があると処理を拒否します。どちらの/stats URLもデプロイの前後で404を返すため(デフォルトでは非公開)、curlではビルドを判別できません。代わりにnode scripts/stats-read.mjsで確認してください。カウンターのビルドを実行するWorkerに外部からの最初の呼び出しが届くまでは、counting_since=neverが表示されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。