horizon-pulse について
Horizon Pulse は、暗号資産市場、オンチェーンリスク、ウェブ処理の従量課金 API を Agent に提供し、ライブ JSON を返します。x402 で USDC 決済を処理し、ローカルとホスト型の MCP 接続に対応します。
主な機能
- 01価格、指標、資金調達率の取得
- 02DeFi 利回りとポートフォリオリスクの確認
- 03オンチェーン取引、残高、ガス情報の取得
- 04ウェブ本文の取得、プロキシ、項目抽出
- 05x402 による USDC の都度払い
活用シーン
- 01Agent 向けの暗号資産市場・利回りデータ取得
- 02EVM アドレスの資産配分とリスク確認
- 03必要に応じたウェブページの取得と解析
- 04MCP クライアントからの有料データ API 呼び出し
MCP 対応
ローカルの stdio MCP サーバーはライブの各ルートをツールとして公開し、設定した購入者ウォレットで x402 チャレンジを支払えます。ホスト型 MCP は streamable HTTP を使用し、MCP 経由の支払いは Base USDC のみです。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://horizonpulse.dev/mcpclaude mcp add --transport http horizon-pulse-horizon-pulse https://horizonpulse.dev/mcp{"mcpServers":{"horizon-pulse-horizon-pulse":{"type":"http","url":"https://horizonpulse.dev/mcp"}}}Cursor で開く{"servers":{"horizon-pulse-horizon-pulse":{"type":"http","url":"https://horizonpulse.dev/mcp"}}}VS Code で開く{"mcpServers":{"horizon-pulse-horizon-pulse":{"type":"http","url":"https://horizonpulse.dev/mcp"}}}{"mcpServers":{"horizon-pulse-horizon-pulse":{"serverUrl":"https://horizonpulse.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
28このツールにパラメーターはありません。
詳細
Horizon Pulse
呼び出しごとの暗号資産市場のパルス、シグナル、資金調達率、利回りランキング、ポートフォリオリスク、ガスに加え、公開 URL の取得 → クリーンなテキスト、汎用的な http プロキシ、さらに 抽出 → AI エージェント向けの構造化フィールドを提供します。x402 プロトコルを使って、Base mainnet と Solana mainnet(USDC、exact、どちらも同じ価格)で収益化しています。
このリポジトリは、デプロイ(例:Vercel)して次の場所にプッシュできる、Next.js App Router サービスです。
https://github.com/horizon-pulse/horizon-pulse.git
公開ホスト
| 役割 | URL |
|---|---|
| 正規 | https://horizonpulse.dev |
| バックアップ(Vercel) | https://horizon-pulse-seven.vercel.app |
エージェント向けドキュメント、OpenAPI、クライアントでは、horizonpulse.dev を優先してください。*.vercel.app の URL も引き続き利用可能なフォールバックです。
概要
- エージェントは、現在利用可能な有料 HTTP エンドポイントを呼び出します(暗号資産ルートは凍結済み。
/api/fetch+/api/http+/api/extract+/api/x402-check+/api/bazaar-check+/api/market/search+/api/market/quote+/api/screenshot+/api/search+/api/pdfは暗号資産以外の用途で稼働中です — 詳細は以下をご覧ください)。 - 支払いのないリクエストには、x402 v2 の要件を含む HTTP 402 が返されます。正規の通信形式は
PAYMENT-REQUIREDヘッダーで、ネットワークごとにacceptsエントリーが1つあります。Base(CAIP-2eip155:8453、Base USDC、以下の Treasury)と Solana(CAIP-2solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp、USDC mint、以下の Solana 用 payTo)です。docs/solana-rail.mdをご覧ください。 - x402 v2 の
PAYMENT-SIGNATUREヘッダーを付けて再試行します。ファシリテーター(Base では Coinbase CDP、Solana では PayAI)が検証と決済を行い、その後ルートからライブデータが返されます。 - 価格や偽の APY をでっち上げることはありません。スポット価格には Coinbase Exchange(CoinGecko をフォールバックとして使用)、シグナルには CoinGecko OHLC(Coinbase のローソク足データをフォールバックとして使用)、無期限先物の資金調達率には OKX(Binance/Bybit は Vercel 上で地域制限されることがよくあります)、利回りプールには DefiLlama、ポートフォリオには公開 RPC の
balanceOf(実際の残高のみ)、ガスにはeth_feeHistory/eth_gasPrice(実際の手数料のみ)を使用します。/api/fetchは、指定された公開 URL から取得したテキストを可能な限り整形して返します(SSRF 対策済み、サイズと時間に上限あり)。/api/httpは汎用の生プロキシです(ヘッダーをフィルタリングし、本文は text|base64、SSRF 対策済み)。ボリューム価格は $0.01 です。/api/extractは、URL または HTML からページの構造化フィールドを可能な限り返します(SSRF 対策済み、サイズと時間に上限あり)。価格は $0.015 です。 - 指標を捏造しません。404 になるルートを掲載しません。キャッシュされた残高を引用しません —
/statusはpayToの USDCbalanceOfをリアルタイムで読み取ります。現状を正直にお伝えすると、現在のpayToは暫定的な Coinbase カストディ管理のアドレスであり、Safe/マルチシグではありません。
カタログの状況(初回決済後)
| 項目 | 値 |
|---|---|
| 稼働中の有料ルート | 30:下の表をご覧ください(複数ネットワーク対応のルートが29個、Base のみ対応の検証済みブリーフが1個) |
| 初回決済 | /api/pulse $0.005 — tx 0xedbd1a51… |
| 暗号資産ポリシー | 凍結済み — 暗号資産ルート6個。価格変更なし |
| Fetch | 暗号資産以外の用途で稼働中:クリーンテキスト($0.02) |
| Http | 暗号資産以外の用途で稼働中:汎用プロキシ(ボリューム価格 $0.01) |
| Extract | 暗号資産以外の用途で稼働中:構造化 HTML($0.015) |
近日公開/プレースホルダー/404 のルートは、/、/status、この README には掲載していません。
エージェント向け手順(x402 v2)
- 支払いなしで有料ルートに
GETを送信すると、HTTP 402 が返されます。 PAYMENT-REQUIRED(v2)を読み取り、acceptsエントリーを1つ選びます。network(Base の場合はeip155:8453、Solana の場合はsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)、そのネットワーク上の USDC、正確な最小単位のamount、そのネットワークのpayToを確認します。- 署名し、
PAYMENT-SIGNATURE(v2 の主要方式)を付けて同じGETを再試行します(決済方法として旧式のX-PAYMENTに依存しないでください)。 - 成功すると、ファシリテーターが支払いに使用したネットワーク上で決済し、レスポンス本文にそのルートのライブ JSON が返されます。
任意:有料ルートへの OPTIONS は、料金を請求せずにディスカバリー情報と同じ PAYMENT-REQUIRED チャレンジを返します。
エージェント連携
- スキルファイル:
/skill.md。エージェントが最初から最後まで従えるプレーンな Markdown です(public/openapi.jsonからlib/agent-skill.tsによって生成されます)。 - ガイド:
/agents:決済フロー、スキル、MCP のセットアップについて説明します。 - ローカル MCP サーバー:
mcp/。stdio を使用し、稼働中のすべてのルートをツールとして提供します。設定した購入者ウォレットから x402 チャレンジの支払いを行い、呼び出し単位およびセッション単位の上限を設定できます(キーがない場合は見積もりのみ)。npm では公開されていません。このリポジトリからインストールしてください。 - ホスト型 MCP:
POST https://horizonpulse.dev/mcp(ストリーミング可能な HTTP)。x402 の支払いを自ら行える MCP クライアント向けです。MCP 経由の支払いは Base 上の USDC のみです。有料 HTTP ルートでは Base、Solana、Polygon、XRPL を受け付けます。
トレジャリー(payTo)
| フィールド | 値 |
|---|---|
| payTo | 0x5b32c973596078a967562ca652761404f19be0e9 |
| Basename | horizonpulsebase.base.eth(上記の payTo に解決されます。ラベルにすぎず、402 には 16 進数のアドレスが含まれます) |
| カストディ | 暫定的な Coinbase カストディ型の Base アドレス(所有者が管理)。Safe やマルチシグではありません。 |
| アップグレードパス | 準備が整ったら、後でノンカストディアルの Safe/マルチシグに移行できます。カタログと価格は変わりません。 |
| USDC(Base) | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
| ネットワーク | base(CAIP-2 eip155:8453) |
| ファシリテーター | https://api.cdp.coinbase.com/platform/v2/x402 |
| Solana payTo | BjY98A6dS3GGLZdz2zHy8wK7XAwnQgNhCc66mfmBTRPz(運営者が管理。lib/solana-config.ts に固定されており、支払いはこの USDC トークンアカウントに入金されます) |
| USDC(Solana) | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| Solana ネットワーク | CAIP-2 solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp(exact のみ) |
| Solana ファシリテーター | PayAI https://facilitator.payai.network |
廃止されたアドレス 0xe16A1b12404cB2EbC6e783beCA6E2A9253c3dC7E は使用しないでください。
PAY_TO は env で上書きできますが、デフォルトは上記のアドレスです。エージェントは、現在の payTo を実際の決済先として扱ってください。ルートの価格は変えずに、後からカストディの形態が変わる場合があります。
エンドポイント
有料(30ルート:マルチネットワーク対応が29件+1ドルの検証済みブリーフが1件、Base のみ。/.well-known/x402 と同じリスト):
| ルート | 価格 | 認証 |
|---|---|---|
GET /api/pulse | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/signals | $0.005 USDC(5000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/yield | $0.02 USDC(20000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/portfolio | $0.04 USDC(40000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/gas | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/funding | $0.003 USDC(3000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/fetch | $0.02 USDC(20000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET / POST /api/http | $0.01 USDC(10000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET / POST /api/extract | $0.015 USDC(15000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/x402-check | $0.01 USDC(10000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/x402-check/deep | $0.03 USDC(30000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/bazaar-check | $0.01 USDC(10000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/market/search | $0.005 USDC(5000 最小単位)、未テストの価格 | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/market/quote | $0.005 USDC(5000 最小単位)、未テストの価格 | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/tx-status | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/tokenized-stock | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/watch | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/balance | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/tx-guard | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET / POST /api/grocery/normalize | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET / POST /api/grocery/ingredient | $0.005 USDC(5000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/chain/head | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/token/meta | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/name/resolve | $0.002 USDC(2000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET / POST /api/batch | $0.01 USDC(10000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/discourse/split | $0.03 USDC(30000 最小単位)、未テストの価格 | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/screenshot | $0.02 USDC(20000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/search | $0.03 USDC(30000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/pdf | $0.02 USDC(20000 最小単位) | x402 v2(Base、Solana、Polygon、XRPL) |
GET /api/research/report/brief?q=… | $1 USDC(1000000 最小単位):契約で定義されているとおり、少なくとも2つの主張が2つのソースで確認できた場合(独立したノード2つ、または別個の仕様書2つ)。確認できない場合、料金は発生しません(契約、利用規約) | x402 v2(Base の USDC のみ) |
無料(有料 API ではありません):
| ルート | 認証 |
|---|---|
GET /status | 公開 HTML — payTo の USDC balanceOf をライブで表示(取得に失敗した場合は RPC エラーをそのまま表示) |
GET / | ランディングページ — 有料カタログのライブ情報とエージェント向け利用方法 |
GET /api/pulse
BTC/ETH/SOL のリアルタイム現物価格(Coinbase Exchange、取得できない場合は CoinGecko にフォールバック)と、資産ごとのモメンタムに加え、全体のモメンタム/センチメント/方向性(up/down/flat。24 時間の平均変動を中立的に表したもの。signal から名称を変更。CHANGELOG.md を参照)。
runtime = 'nodejs'- 検出方法:Bazaar 拡張機能、および支払い要件の
outputSchema.input.discoverable: true
GET /api/signals
CoinGecko の OHLC 終値から算出した RSI(14)、MACD(12,26,9)、ボリンジャーバンドと、OKX のファンディングレート。methodology フィールドを含みます。
runtime = 'nodejs'- エージェントが検出可能
GET /api/yield
DefiLlama の公開 Yields API(https://yields.llama.fi/pools)から取得した、ランキング形式の DeFi イールドプールです。
- 厳格なフィルター:TVL ≥ $10M。有限でない APY と DefiLlama の
outlierプールを除外 - 優先条件:ステーブルコインおよび/または単一資産(
exposure === "single")のプールを優先 - 透明性の高いランキング:
preferenceTierの降順(2 = ステーブルコイン+単一資産、1 = いずれか)、次に APY の降順、次に TVL の降順 - すべてのレスポンスに
methodologyオブジェクトを含みます(エラーレスポンスも同様) - 価格:$0.02 USDC(
20000atomic) runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET → 402 +
PAYMENT-REQUIRED(v2、eip155:8453) ·payTo0x5b32c973596078a967562ca652761404f19be0e9
GET /api/portfolio
1 つの EVM アドレス(?address=0x…、必須)のオンチェーンポートフォリオスナップショットです。
- ネットワーク:Base + Ethereum メインネット(公開 RPC。必要に応じて
BASE_RPC_URL/ETH_RPC_URLを使用し、フェイルオーバー可能) - トークン:ネイティブ ETH、両チェーンの USDC、WETH、DAI、Ethereum の WBTC、Base の cbBTC(正確な代替資産 — Base には BitGo WBTC がありません)
- USD 評価額は Coinbase の公開為替レートを使用(その他の資産、または Coinbase から取得できない場合は CoinGecko)。実際の残高のみを表示 — RPC に障害が発生した場合、そのネットワークは
networks[]/warningsで失敗として示されます - ルールベースの集中度スコア(0–100)とルールに基づく所見(最大資産の比率と 35%/50% の比較、ステーブルコインの比率と 15%/85% の比較、最大チェーンの比率と 85% の比較、ネイティブ ETH のガス残高不足。指示ではなく、所見として
suggestions配列に返されます)。透明性の高い計算式はmethodologyに記載 - 価格:$0.04 USDC(
40000atomic) runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET → 402 +
PAYMENT-REQUIRED(v2、eip155:8453) ·payTo0x5b32c973596078a967562ca652761404f19be0e9
GET /api/gas
公開 RPC から取得した、Base と Ethereum のリアルタイムのガススナップショットです。
eth_feeHistoryを優先(直近 20 ブロック、報酬パーセンタイル 10/50/90):baseFeeGwei、priorityFeeGwei(p50)、suggestedMaxFeeGwei(= 2×baseFee + priority)- feeHistory を利用できない場合は
eth_gasPriceにフォールバック - 透明性の高い
timingHint:feeHistory の対象期間内における最新の確定済み baseFee のパーセンタイル順位に基づき、安価/通常/高額を表示(<33/33–67/>67)。methodologyに記載 — 予測ではありません - 21k ガスの送金コストの簡易見積もり(
simpleTransfer.costUsd)用に、オプションで ETH の USD 価格を取得(Coinbase Exchange、取得できない場合は CoinGecko) - 価格:$0.01 USDC(
10000atomic) runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET → 402 +
PAYMENT-REQUIRED(v2、eip155:8453) ·payTo0x5b32c973596078a967562ca652761404f19be0e9
GET /api/funding
OKX から取得した、BTC/ETH/SOL のリアルタイムの無期限先物ファンディングレート(/api/signals と同じデータソース。Vercel に適しています — Binance/Bybit ではありません)。
lib/okx.ts(fetchAllFunding)を再利用- すべてのレスポンス(エラーを含む)に、透明性の高い
methodologyを記載 - ファンディングの符号と大きさのみから算出した、オプションの過熱度のヒント(ルール:静穏/軽度/高め/極端。方向:ロング/ショート/中立)— 予測ではありません
- 正確性:実際の OKX データのみ
- 価格:$0.01 USDC(
10000atomic)— エージェント向けの低価格なポーリング用プロダクト runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET → 402 +
PAYMENT-REQUIRED(v2、eip155:8453) ·payTo0x5b32c973596078a967562ca652761404f19be0e9
GET /api/fetch
公開 http(s) URL(必須の ?url=https://…)を取得し、可能な範囲で整形したテキスト/Markdownを返します。
- SSRF 対策:localhost、プライベート IP、リンクローカル IP、メタデータ IP をブロックし、リダイレクトの各ホップで再確認します
- 上限:約 200KB の生の本文、8s のタイムアウト、最大 3 回のリダイレクト
- 優先する Content-Type:
text/html、text/plain、application/json、text/markdown - 整形は可能な範囲で行います(script/style/chrome を削除し、空白を詰めます)。完全な可読性エンジンではありません
- 料金:$0.02 USDC(
20000atomic) runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET → 402 +
PAYMENT-REQUIRED(v2、eip155:8453)·payTo0x5b32c973596078a967562ca652761404f19be0e9
GET / POST /api/http
汎用のエージェント向け HTTP プロキシ — 任意のメソッド/ヘッダー/本文を指定して公開 http(s) URL を呼び出し、上流の status、フィルタリング済みの headers、body(text または base64)に加え、contentType と elapsedMs を取得します。
- 料金の選択肢: ボリューム向けに $0.01 USDC(
10000atomic)。/api/fetchは専用のクリーンテキスト取得用として $0.02 のままです。生のプロキシトラフィックには/api/httpを優先してください。 - 入力:
url(必須)、method(デフォルトはGET。GET|POST|HEAD|PUT|PATCH|DELETE)、許可リストに含まれる任意のheaders(Cookie/ホップバイホップヘッダーは不可)、POST/PUT/PATCH 用の任意のbody(サイズ上限あり) - GET クエリ:
?url=&method=&headers=<json>。上流の本文を含むすべてを制御するには、POST JSON 本文を使用します - SSRF 対策(
/api/fetchと共通のガード):プライベート/リンクローカル/メタデータをブロックし、http/https のみ許可し、リダイレクト時に再確認します - 上限:約 384KB のレスポンス本文、64KB のリクエスト本文、12s のタイムアウト、最大 3 回のリダイレクト
- 正確な応答:上流の 4xx/5xx は、ホップが成功した場合に
statusで返します。プロキシの失敗には適切なエラーコードを使用します runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET/POST → 402 +
PAYMENT-REQUIRED(v2、eip155:8453)·payTo0x5b32c973596078a967562ca652761404f19be0e9 - Bazaar の検出では GET を案内します。POST も同じ料金で利用できます
GET / POST /api/extract
URL または HTML から、エージェント向けのページ構造化フィールド(タイトル、説明、canonical、言語、リンク、画像、見出し、json-ld、テキストサンプル)を取得します。
- 料金の選択肢: $0.015 USDC(
15000atomic)—/api/http($0.01)と/api/fetch($0.02)の中間です。同じ payTo と Base USDC スタックを使用します。 - 入力:
url(htmlが指定されていれば任意)および/またはhtml(サイズ上限あり)。fetch/httpと同じ SSRF 対策のassertSafePublicUrlを使ってurlを取得する方法を推奨します。 - GET クエリ:
?url=&fields=<url-encoded json>。HTML ペイロードには POST JSON{ url?, html?, fields? }を使用します - 任意の
fields:名前付き CSS セレクターを最大 20 個指定できます。例:{"title":"h1","links":{"selector":"a.story","attr":"href","all":true,"limit":5}}。attrはtext(デフォルト)、html、または任意の属性です(href/src は絶対 URL に解決されます)。一致しないフィールドはnullとfieldErrors[name](no_match、bad_selector、attr_missing、time_budget、document_too_deep、eval_failed)を返します。一致するフィールドがない場合は、422no_fields_matched。課金されません。セレクターの実行時間は最大 2s、:has()はセレクターごとに最大 1 回、256 階層を超える入れ子のページではフィールドを拒否します。決定論的なセレクターを使用し、AI は使いません。 - 軽量な正規表現による解析(cheerio は使用しません)。空のフィールドは省略されます。完全なブラウザー DOM ではありません。
- 上限:約 200KB の HTML、8s のタイムアウト、最大 3 回のリダイレクト(
/api/fetchと同じ範囲) - Cookie jar はありません。プライベート/localhost/リンクローカル/メタデータはブロックされます。
runtime = 'nodejs'、dynamic = 'force-dynamic'- 未払いの GET/POST → 402 +
PAYMENT-REQUIRED(v2、eip155:8453)·payTo0x5b32c973596078a967562ca652761404f19be0e9 - Bazaar の検出では GET を案内します。POST も同じ料金で利用できます
GET /status
Base 上の payTo アドレスの現在の USDC 残高(公開 RPC/BASE_RPC_URL の balanceOf 経由)に加え、現在の有料カタログとエージェント向けの使い方を表示する公開ページです。
- RPC が失敗した場合、ページには正直なエラーが表示され、キャッシュ済みの残高にはフォールバックしません。カストディに関する注記:暫定的に Coinbase がカストディする
payTo(Safe/マルチシグではありません)を使用しています。将来的にアップグレードする予定です。 - 最初の決済は
/api/pulseの $0.005(0xedbd1a51…)と記録されています。6 つの暗号資産ルートは凍結され、/api/fetch+/api/http+/api/extractは意図的に稼働中です。
ローカル開発
Node.js 20 以降が必要です(20.19 でテスト済み)。
cd horizon-pulse
cp .env.example .env.local
# fill CDP_API_KEY_ID + CDP_API_KEY_SECRET for verify/settle
npm install
npm run dev
npm run build && npm start
環境変数(Vercel/本番環境)
.env.example からコピーします。
| 変数 | 必須 | 備考 |
|---|---|---|
X402_NETWORK | 推奨 | base |
PAY_TO | 任意 | デフォルトは 0x5b32c973596078a967562ca652761404f19be0e9 |
CDP_API_KEY_ID | 決済に必要 | Coinbase Developer Platform |
CDP_API_KEY_SECRET | 決済に必要 | PKCS8 PEM(安全に保管し、絶対にコミットしないでください) |
BASE_RPC_URL | 任意 | /status + /api/portfolio + /api/gas で使用するデフォルトの Base RPC を上書きします |
ETH_RPC_URL | 任意 | /api/portfolio + /api/gas で使用するデフォルトの Ethereum RPC を上書きします |
CDP キーがない場合:
- 未払いの GET と OPTIONS は引き続き、v2
PAYMENT-REQUIRED(payTo、eip155:8453、USDC 額)を含む正しい 402/ディスカバリーを返します。ディスカバリーに CDP は不要です。 PAYMENT-SIGNATURE(またはレガシーのX-PAYMENT)を含むリクエストは、決済処理に必要なCDP_API_KEY_ID+CDP_API_KEY_SECRETが Vercel に設定されるまで 503 を返します。- CDP が未設定でも、稼働中の GET が 500 になるとは考えないでください。これは以前のバグで、支払いと CDP 認証情報がそろった場合のみ
withX402を実行することで修正済みです。
技術スタック
- Next.js 16(App Router)+ TypeScript
@x402/next+@x402/core+@x402/evm+@x402/extensions- CDP のファシリテーター認証ヘッダーに
@coinbase/x402を使用 - Base 上のトレジャリーの USDC
balanceOf、ポートフォリオ残高、Base + Ethereum 上のガスfeeHistoryにviemを使用
デプロイに関する注意
- GitHub リポジトリ/リモート
https://github.com/horizon-pulse/horizon-pulse.gitを作成します。 - Vercel の環境変数(上記)を設定します。PEM シークレットを設定する UI が 1 行入力の場合は、
\nエスケープを含む 1 行の形式を推奨します。 mainからデプロイします。関数が Node.js ランタイムを使用していることを確認してください(ルートにはすでにexport const runtime = 'nodejs'が設定されています)。- スモークテストを実行します:
curl -i https://horizonpulse.dev/api/pulse(または/api/yield、/api/portfolio、/api/gas、/api/funding、/api/fetch?url=https://example.com、/api/http?url=https://example.com、/api/extract?url=https://example.com)は、新しいpayToを示す支払い要件とともに 402 を返すはずです。 /statusに0x5b32…e0e9のトレジャリー残高が表示されることを確認します。
Push(このワークスペースから)
このひな形は代わりに push を行いません(認証情報がないためです)。GitHub 認証済みのマシンから実行してください。
cd /workspace/horizon-pulse
git init
git add .
git commit -m "feat: Horizon Pulse x402 API with new Base treasury"
git branch -M main
git remote add origin https://github.com/horizon-pulse/horizon-pulse.git
git push -u origin main
リモートにすでに履歴がある場合:
git remote add origin https://github.com/horizon-pulse/horizon-pulse.git
git fetch origin
git pull origin main --rebase # or merge, as appropriate
git push -u origin main
参照用エージェント(examples/)
スクリプトに記載された稼働中の有料ルートについて、未払いの 402 ディスカバリーを実行します。また、SMOKE_PRIVATE_KEY が設定されている場合は、任意で単一ルートの有料テストも実行します。
cd horizon-pulse
node examples/reference-agent.mjs
# optional paid:
SMOKE_PRIVATE_KEY=0x... SMOKE_ROUTE=/api/pulse node examples/reference-agent.mjs
examples/README.md を参照してください。このパッケージの @x402/core + @x402/evm を使用します。シークレットは絶対にコミットしないでください。
有料スモークテスト(/api/pulse)
本番環境(または SMOKE_BASE_URL)に対するエンドツーエンドの確認です。未払いの 402 → ローカルキーで EIP-3009/x402 に署名 → 有料の 200 + payTo 宛てのオンチェーン USDC を確認します。
cd horizon-pulse
npm install # if needed; uses existing @x402/* + viem
SMOKE_PRIVATE_KEY=0x... node scripts/smoke-pulse.mjs
# or: npm run smoke:pulse
任意:
SMOKE_BASE_URL=https://horizonpulse.dev
# backup: https://horizon-pulse-seven.vercel.app
BASE_RPC_URL=https://mainnet.base.org
チャット、コミット、スクリーンショットに秘密鍵を絶対に貼り付けないでください。 ローカルのシェル(例:Mac mini)でのみエクスポートしてください。SMOKE_PRIVATE_KEY が設定されていない場合、スクリプトは使い方を表示して終了します(安全なドライラン)。
ライセンス
horizon-pulse org の指定に従い、非公開です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。