argentina-price-index について
アルゼンチンの食品・飲料価格指数を有料リクエストで提供する流れを示す、Cloudflare Worker のサンドボックスです。指数には合成の仮データを使い、支払いも共有シークレットによる HMAC で模擬するため、実価格や実際の決済を表しません。
主な機能
- 01最新指数の概要を無料で提供
- 02有料エンドポイントで日次系列を返却
- 03402 による支払いチャレンジと再試行を模擬
- 04MCP over HTTP で2つのツールを公開
- 05合成データで指数計算を実演
活用シーン
- 01エージェントによる有料データ取得をテスト
- 02402 チャレンジ、支払い、再試行を実演
- 03ローカルで MCP ツール呼び出しを検証
- 04エッジ Worker のリクエスト単位課金を検討
MCP 対応
Worker は `/mcp` で簡易的な MCP over HTTP インターフェースを提供し、無料の概要ツールと有料の指数系列ツールを公開します。支払いは模擬 HMAC チャレンジで処理します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.oscar-lopez.com/mcpclaude mcp add --transport http oscarlopez-gif-argentina-price-index https://api.oscar-lopez.com/mcp{"mcpServers":{"oscarlopez-gif-argentina-price-index":{"type":"http","url":"https://api.oscar-lopez.com/mcp"}}}Cursor で開く{"servers":{"oscarlopez-gif-argentina-price-index":{"type":"http","url":"https://api.oscar-lopez.com/mcp"}}}VS Code で開く{"mcpServers":{"oscarlopez-gif-argentina-price-index":{"type":"http","url":"https://api.oscar-lopez.com/mcp"}}}{"mcpServers":{"oscarlopez-gif-argentina-price-index":{"serverUrl":"https://api.oscar-lopez.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
3| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| method | enum | いいえ | jevons | carli | trimmed |
| category | string | いいえ |
詳細
Paid Door — アルゼンチンの食品・飲料価格指数(Cloudflare サンドボックス)
動画の中心的な仕組みを最小限の構成で動作させるテストです。1 回のエージェントリクエストが、エッジでの有料トランザクションになります。 Cloudflare Worker は D1 からリアルタイムで計算した価格指数を提供し、x402 形式の 402 → pay → retry → data ループで保護します。決済は(共有シークレットによる HMAC で)モック化されているため、ウォレットを設定せずに一連の流れを実行できます。実際の x402 への切り替えも、変更箇所を限定して行えます。
データは合成データです。
seed/observations.sqlはデモを実際のスクレイパーが用意される前に実行できるよう生成されたプレースホルダーデータです。数値を実際のアルゼンチンの価格として扱わないでください。
内容
paid-door-index/
├─ wrangler.jsonc # Worker + D1 binding + sandbox vars
├─ schema.sql # price_observations + methodology (+ future index_series cache)
├─ seed/
│ ├─ generate.mjs # deterministic synthetic data generator (60 SKUs x 30 days)
│ └─ observations.sql # generated seed (1,800 rows)
├─ src/index.ts # Worker: routes + live index math + mock x402 gate
├─ agent/test-agent.mjs # the paying "buyer": request → 402 → pay → retry → data
└─ README.md
エンドポイント
| エンドポイント | ティア | 戻り値 |
|---|---|---|
GET /v1/headline?country=AR&category=food_beverages | 無料 | 最新の指数値と月間変化率(ティーザー) |
GET /v1/index?country=AR&category=food_beverages | 有料($0.02) | 日次の全系列 |
GET /v1/latest?country=AR&category=food_beverages | 有料($0.02) | 最新の測定値と算出方法 |
POST /mcp | — | MCP JSON-RPC:initialize、tools/list、tools/call |
MCP インターフェース(エージェントが実際に呼び出すもの)
Worker は /mcp で HTTP 経由の MCP にも対応し、2 つのツールを公開します。
get_ar_food_headline(無料)— 最新値と 30 日間の変化率get_ar_food_price_index(有料、$0.02 の mock-x402)— 日次の全系列。最初は_paymentなしで呼び出してチャレンジを受け取り、その後arguments._payment = {nonce, resource, amount, signature}を指定して再試行します
エージェントの全フローをテストします(npm run dev の実行中に):
npm run agent:mcp # initialize → tools/list → free call → paid call (challenge → pay → data)
本番環境に関する注意: ここの
/mcpは Streamable HTTP トランスポートの最小限の JSON リクエスト/レスポンス部分集合です(SSE/セッション/認証には対応していません)。実際にデプロイする場合は、公式 MCP SDK または Cloudflare のagentsMcpAgentを使用し、モック HMAC を実際の x402 ファシリテーターに置き換えてください。
指数の計算方法(methodology_version = v0-simple-avg):在庫のある SKU について index = 100 × mean(price_t / price_base) とします。base は期間内の初日です。スキーマには、カテゴリ内では幾何平均、カテゴリ間ではラスパイレス指数を使う拡張方法も織り込まれています。
ローカルで実行する
前提条件:Node 18 以降と Cloudflare アカウント(npx wrangler login)。
cd paid-door-index
npm install
# 1. Create the D1 database, then paste the printed database_id into wrangler.jsonc
npm run db:create
# 2. Load schema + seed into LOCAL D1
npm run schema:local
npm run seed:gen # (optional) regenerate observations.sql
npm run seed:local
# 3. Start the Worker
npm run dev # serves http://127.0.0.1:8787
# 4. In a second terminal, run the paying agent
npm run agent
想定されるエージェントの出力:無料のヘッドラインに続いて、価格チャレンジ付きの 402 が返り、その後、全系列と PAYMENT-RESPONSE 決済ヘッダー付きの 200 が返ります。1 回のリクエストがトランザクションになります。
アカウントにデプロイする
npm run schema:remote
npm run seed:remote
npm run deploy
# then point the agent at the deployed URL:
BASE=https://paid-door-index.<your-subdomain>.workers.dev npm run agent
npx wrangler tail でライブログを確認します。
サンドボックスから実環境へ(後日)
- 実データ:
seed/generate.mjsを、アルゼンチンのオンライン食料品店 1~2 店舗を毎日スクレイピングしてprice_observationsに保存する、スケジュール実行の Worker に置き換えます。 - 実際の決済:
src/index.tsの HMAC モック(verifyPayment/challenge)を、Cloudflare の Agents x402 ドキュメントに従って実際の x402 ファシリテーター(POST /verify、POST /settle)に置き換えます。 - シークレットを移動する: 平文の変数の代わりに
npx wrangler secret put MOCK_PAYMENT_SECRETを実行します。 - MCP として公開する: このアシスタントを含むあらゆる AI エージェントが
get_indexを直接呼び出せるようにします。 - 実体化する: クエリ量が増えたら、夜間キャッシュとして
index_seriesを実体化します。
注意事項/留意点
- モック決済で証明できるのは共有シークレットを知っていることだけです。オンチェーンでの暗号学的な決済ではありません。 リクエスト/レスポンスの形式を試す目的でのみ使用します。
- サンドボックスではリプレイ攻撃を防止しません(有効な署名は何度でも再利用できます)。実際の x402 決済ではこの問題に対処します。
- 合成データの月間変化率には、意図的にノイズが加えられています。単一のエンドポイントから読み取るインフレ率が大きく変動すること自体が、教材として役立つポイントです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。