KalshiとPolymarketのデータをRESTとMCPで同じワークフローに載せる
Kalshi と Polymarket を扱うアプリでは、会場ごとの識別子、アウトカム表現、清算条件を個別に確認する場面がすぐに増えます。dino.markets は、関連する市場を照合したデータを REST API と MCP で提供しています。このチュートリアルでは、REST でスナップショットを取得し、MCP クライアントから同じデータ面を探索するところまでを動かします。
本稿は dino.markets を運営する Nusantara Ventures LLC の依頼で作成した技術記事です。価格やスプレッドは観測データとして扱い、取引判断には各会場の手数料、清算条件、利用可能性を含めて自分で確認してください。
必要なのは、dino.markets の API キー、curl、任意で MCP を利用できる開発環境です。まずは API キーを作成し、日本語ドキュメント の認証手順を確認します。
まずは REST API で市場スナップショットを取る
次の例は MLB の関連市場を signal=arb で絞り込みます。結果が空であっても異常ではありません。照合済みで、その時点の条件に合う市場だけが返ります。
export DINO_API_KEY="sk_live_..."
curl -sS "https://api.dino.markets/v2/markets?signal=arb&sport=baseball" \
-H "Authorization: Bearer ${DINO_API_KEY}" | jq '{
count,
markets: [
.markets[] | {
id,
title,
sport,
league,
signal,
spread_pts,
potential_arb_pct,
outcomes
}
]
}'
レスポンスの id は詳細確認に使います。signal=arb は、Dino のマッチャーが清算条件の同等性を確認し、阻害する清算リスクを検出していない組み合わせです。それでも会場のルールや手数料が変わる可能性はあります。potential_arb_pct は会場手数料前の ask-to-ask の概算値なので、実現可能な収益率として扱わないでください。
REST のスナップショットは全プランでおよそ 2 分遅延します。監視画面、分析ジョブ、コンテンツの下調べには扱いやすい一方、注文を出すための面ではありません。
アプリコードから呼ぶ場合も、同じエンドポイントです。
const response = await fetch(
"https://api.dino.markets/v2/markets?signal=arb&sport=baseball",
{ headers: { Authorization: `Bearer ${process.env.DINO_API_KEY}` } },
);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { count, markets } = await response.json();
console.log({ count, markets });
個別の市場を扱う前には、返された id で GET /v2/pairs/{market_id} を呼び、アウトカムと settlement.risks を確認します。signal=spread のデータを使う場合は、特にこの確認をワークフローに含めるとよいです。
同じデータ面を MCP から使う
MCP を使うと、対応クライアントやエージェントの会話から市場探索と詳細確認を行えます。Streamable HTTP の接続先は、末尾のスラッシュを含む https://api.dino.markets/v2/mcp/ です。
mcp-remote を呼び出すクライアントでは、設定に次を追加します。
{
"mcpServers": {
"dino-markets": {
"command": "npx",
"args": [
"mcp-remote",
"https://api.dino.markets/v2/mcp/",
"--header",
"Authorization:Bearer ${DINO_API_KEY}"
],
"env": { "DINO_API_KEY": "sk_live_..." }
}
}
}
設定を保存して MCP クライアントを再起動したら、まずは次のようなデータ確認タスクを頼めます。
find_marketsで MLB を検索し、見つかった ID を使ってget_marketを呼んでください。各市場のアウトカムとsettlement.risksを要約し、価格を取引判断として解釈しないでください。
公開 MCP には find_markets、find_arbitrage、list_markets、list_leagues、get_market、get_spreads、report_bad_arb、watch_markets の 8 ツールがあります。アクティブな全プランで利用できます。WebSocket の購読範囲はプランで異なり、Free は sample と status、有料プランでは markets:* を利用できます。
実装で持っておきたい境界
照合は「関連する市場を同じデータフローで確認する」ためのものです。各市場の最終的な清算ルールは会場側で定義されます。アプリでは API の返却値を保存するだけで終わらせず、id ごとの詳細、取得時刻、清算リスクを一緒に表示できるようにしておくと、後から調査しやすくなります。
dino.markets はスポーツ、天気、暗号資産、経済に関する関連市場を文書化しています。この例では、公開 API の sport=baseball フィルタを使って、再現しやすい入口に絞りました。
エンドポイント、認証、REST のフィルタは 日本語ドキュメント にあります。MCP クライアント別の接続方法は 日本語 MCP ドキュメント を参照してください。MCP サーバーの公開リポジトリは dino-markets-mcp です。
ブログの他の記事
「同じ」予測市場でオッズが異なる理由
似た見出しでも比較可能な契約とは限らない。問い、結果の区分、決済ルール、時点、流動性がオッズの意味を変える。
ワールドカップのノックアウト戦、裁定機会の発生ペースは変わらず深さだけが失われた
ラウンド16から準々決勝にかけて、KalshiとPolymarket間の3レッグ裁定は同じペースで発生し続けましたが、エッジの深さは半分になり、解消するスピードは2倍になりました。
ワールドカップのノックアウト戦でも「Tie」が的中することがある
KalshiとPolymarketはいずれも、ノックアウト戦のマネーライン市場を90分プラス・アディショナルタイムで決済します。延長戦やPK戦で一方のチームが勝ち上がる一方で、ドロー契約が的中することがあります。