Kalshi Prediction Markets について
Kalshi Prediction Marketsは、MCPクライアントからKalshiの予測市場にアクセスするためのMCPサーバーです。RSA-PSS認証、レート制限、二段階の注文フローを備え、本番環境と取引は明示的な有効化が必要です。
主な機能
- 0126個のツールと4個のリソース
- 02RESTとWebSocketに対応
- 03RSA-PSS認証とトークンバケット制限
- 04注文準備と確認の二段階フロー
- 05本番環境と取引の明示的な有効化
活用シーン
- 01デモ環境で予測市場データを確認
- 02取引量を基準に流動性の高い市場を検索
- 03安全チェック後に注文を確定
MCP 対応
ローカルstdioまたはセルフホスト型HTTPを通じて、KalshiのRESTおよびWebSocket市場ツールとリソースをMCPクライアントに公開します。リモートHTTPでは、同梱のOAuthプロキシを利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx kalshi-mcp-serverKALSHI_API_KEY_IDシークレットKalshi API key ID from https://kalshi.com/account/profileKALSHI_PRIVATE_KEY_PATHシークレットFilesystem path to the RSA private key PEM. Set this or KALSHI_PRIVATE_KEY_PEM.KALSHI_PRIVATE_KEY_PEMシークレットInline PEM contents, for hosted deploys without filesystem access.KALSHI_ENVdemo or prod. Defaults to demo for safety.KALSHI_ALLOW_PRODMust be 1 for the server to start with KALSHI_ENV=prod. Defaults to 0.KALSHI_TRADING_ENABLEDMust be 1 for order-placement tools to operate. Read-only by default (0).ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
kalshi-mcp-server
📦 PyPI · 🗂️ MCP Registry · 🐳 コンテナイメージ · 🚀 デプロイガイド
Kalshiの予測市場向けModel Context Protocolサーバーです。ネイティブのRSA-PSS認証、非同期トークンバケット方式のレート制限、安全上限付きの2段階(準備/確認)注文フロー、リモートMCPへのデプロイ向けのオプションのOAuthプロキシを備え、RESTとWebSocketを通じて26個のツールと4個のリソースを提供します。MITライセンスで、フォークを想定して設計されています。
あらゆるMCPクライアントで利用できます。stdio経由でローカルに(Claude Desktop、Claude Code、Cursor、Zed、Continue、Cline、Gooseなど)、またはセルフホスト可能なHTTPサーバーとしてリモートで利用できます(現在はclaude.aiのカスタムコネクターに対応し、将来的にはOAuth対応のあらゆるMCPクライアントに対応します)。
⚠️ このソフトウェアを使うと、LLMが取引を行えます。デプロイする前にDISCLAIMER.mdをお読みください。 予測市場での取引には、多額の損失が発生するリスクがあります。AIエージェントは間違いを犯します。しかも、自信満々に間違えることもあります。作者は損失について一切責任を負いません。失敗パターンを理解するまでは、デモ環境(
KALSHI_ENV=demo、KALSHI_TRADING_ENABLED=0)でテストしてください。
ステータス — アルファ版。 認証(REST + WS)、レート制限、安全制御、REST + ライブチャネル全体の26個のツール、4個のリソースを実装済みです。長時間接続する多重化WebSocketセッションと、ライブリソース
kalshi://markets/{ticker}/orderbookはv0.2で実装予定です。
クイックスタート(30秒)
Kalshiのデモ環境に対する読み取り専用の設定です。実際のお金は使わず、取引フラグも不要です。安全に試す方法です。
pipx install kalshi-mcp-server # or: pip install kalshi-mcp-server
任意のMCPクライアントで接続します(Claude Desktop/Claude Codeの形式です。他のクライアントについてはクライアント別の設定を参照してください)。
{
"mcpServers": {
"kalshi": {
"command": "kalshi-mcp",
"args": ["--env-file", "/Users/you/.kalshi/.env"]
}
}
}
最小限の~/.kalshi/.env(デモキーはdemo.kalshi.coで取得できます。一度だけ表示されます):
KALSHI_API_KEY_ID=<your-demo-key-id>
KALSHI_PRIVATE_KEY_PATH=/absolute/path/to/demo_private_key.pem
KALSHI_ENV=demo
クライアントを再起動して、Kalshiのツールを実行するように依頼してください。本番環境と取引の有効化は、明示的なオプトインが必要です。追加のフラグ(KALSHI_ALLOW_PROD=1、KALSHI_TRADING_ENABLED=1)を設定してください。設定と安全モデルを参照してください。
呼び出し例
取引可能な市場をエージェントに尋ねると、kalshi_find_liquid_marketsは、出来高順に並べ、コンボ市場を除外した候補リストを返します(簡略化した例):
{
"scanned": 300,
"markets": [
{
"ticker": "KXNBAGAME-25JUL12BOSLAL-BOS",
"title": "Will the Celtics beat the Lakers?",
"yes_bid_dollars": 0.58, "yes_ask_dollars": 0.60,
"volume_24h_fp": 41230, "open_interest_fp": 88400,
"status": "active", "close_time": "2026-07-12T23:30:00Z"
},
{
"ticker": "KXHIGHNY-26JUL12-B90.5",
"title": "Will NYC's high temp exceed 90.5°F today?",
"yes_bid_dollars": 0.31, "yes_ask_dollars": 0.34,
"volume_24h_fp": 12760, "open_interest_fp": 23110,
"status": "active", "close_time": "2026-07-13T04:00:00Z"
}
]
}
取引の発注は、意図的に2段階になっています。kalshi_prepare_orderがローカルの安全チェックを実行してconfirmation_idを返します。このトークンを指定してkalshi_confirm_orderを呼び出すまで、Kalshiには何も送信されません。LLMが1回の呼び出しだけで注文を出すことはできません。
このサーバーを選ぶ理由
既存の Kalshi MCP の多くは、いくつかの REST エンドポイントを薄くラップしたものです。このサーバーは、次の点を目指しています。
- Kalshi ネイティブです。 落とし穴(クエリ文字列を含まないパス、ミリ秒単位のタイムスタンプ、デモ用と本番用のキーの分離)に対応する、本物の RSA-PSS 署名機能を備えています。
- レート制限を考慮します。 クライアント側のトークンバケットが Kalshi の 2026 年の読み取り/書き込み予算モデルを反映するため、サーバーが API にリクエストを送りすぎて 429 エラーを発生させることはありません。
- デフォルトで安全です。 明示的なオプトインフラグなしでは本番環境に接続して起動しません。取引有効化フラグが別途設定されていない場合、書き込みも行いません。注文時の制御(サイズ上限、1 日あたりの上限、現金準備金)はすべてオペレーターが設定できます。
- ホスティング環境へのデプロイに適しています。 秘密鍵はファイルパスまたは PEM をインラインで含む環境変数として受け付けるため、ファイルシステムのマウントに対応していないプラットフォームでも動作します。
- フォークしやすい設計です。 MIT ライセンスで、個人データは含まれません。CI/CD が設定されているため、PR の貢献は
mainに反映されますが、本番デプロイが実行されることはありません。本番デプロイはタグ付きリリース(v*)でのみ実行されます。フォークのデプロイはこのリポジトリのデプロイから切り離され、フォークのコントリビューターが実行中の環境に影響を与えることもありません。
インストール
PyPI から(推奨)
kalshi-mcp-server として公開されています。
pipx は、kalshi-mcp エントリーポイントを独立した環境にインストールします。
pipx install kalshi-mcp-server # or: pip install kalshi-mcp-server
ソースから
git clone https://github.com/cejor6/kalshi-mcp-server.git
cd kalshi-mcp-server
uv sync
Docker
マルチアーキテクチャ(amd64 と arm64)のイメージが、タグ付きリリースごとに GHCR に公開され、:latest と :vX.Y.Z のタグが付けられます。
docker pull ghcr.io/cejor6/kalshi-mcp-server:latest
ホスティング環境へのデプロイについては、DEPLOY.md を参照してください。
設定
-
https://kalshi.com/account/profile(またはデモ環境の場合は https://demo.kalshi.co/account/profile)で Kalshi API キーを生成します。秘密鍵を保存してください。一度しか表示されません。
-
シークレットは 1 つの
.envファイルにまとめます。MCP クライアントで使用する場合は、リポジトリの外にある~/.kalshi/.envがおすすめです。ローカル開発では、リポジトリ内の.env(gitignore 対象)も使用できます。
cp .env.example ~/.kalshi/.env
# edit ~/.kalshi/.env
- 最低限、次の項目を設定します。
KALSHI_API_KEY_ID=<your-key-id>
KALSHI_PRIVATE_KEY_PATH=/absolute/path/to/your_kalshi_private_key.pem
KALSHI_ENV=demo
本番環境では、さらに次の項目も設定します。
KALSHI_ENV=prod
KALSHI_ALLOW_PROD=1
KALSHI_TRADING_ENABLED=1 # only if you want writes
環境変数の解決方法
起動時、サーバーは次の優先順位(上位ほど優先)で設定を解決します。
- プロセス環境にすでに設定されている値 — MCP クライアント設定の
env:ブロックで設定するか、シェルでエクスポートします。 .envファイル —--env-file PATHフラグを渡した場合はそこから読み込み、渡さない場合は、存在する場合に限り現在の作業ディレクトリにある./.envから読み込みます。手順 1 で環境にすでに設定されている変数は上書きされません。
そのため、シークレットは MCP 設定(env:)に直接記述するか、設定から参照するファイルに記述できます。両方に記述する必要はありません。
MCP クライアントで使用する(stdio)
MCP の stdio クライアントはすべて同じ形式を使用します。サーバーを起動するための command、任意の args、任意の env です。違いは、設定を記述するファイルや UI だけです。
3 種類のインストール方法があります。環境に合ったものを選んでください。
パターン A — pipx install(最も簡単、推奨)
kalshi-mcp を、グローバルから利用できる独立した環境にインストールします。
pipx は、最新の Python ツールです。
pipx install kalshi-mcp-server
MCP クライアントの設定は次のように簡潔になります。
{
"mcpServers": {
"kalshi": {
"command": "kalshi-mcp",
"args": ["--env-file", "/Users/you/.kalshi/.env"]
}
}
}
最新バージョンに更新する場合は、pipx upgrade kalshi-mcp-server を実行します。
パターン B — ローカルクローンに対して uv run を実行
リポジトリをクローン済みで、uv がインストールされている場合に最適です。--directory を指定して、MCP クライアントが uv を使うように設定します。
{
"mcpServers": {
"kalshi": {
"command": "uv",
"args": [
"run",
"--directory", "/absolute/path/to/kalshi-mcp-server",
"kalshi-mcp",
"--env-file", "/Users/you/.kalshi/.env"
]
}
}
}
uv run はプロジェクトの仮想環境を自動的に有効化します。git pull を実行して MCP クライアントを再起動すると更新できます。サーバー自体の開発や改変に便利です。
パターン C — 公開イメージに対して Docker を使用
Python がインストールされていないユーザーや、コンテナーによる分離を希望するユーザーに最適です。
{
"mcpServers": {
"kalshi": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/Users/you/.kalshi/demo.pem:/secrets/demo.pem:ro",
"-e", "KALSHI_API_KEY_ID=<your-key-id>",
"-e", "KALSHI_PRIVATE_KEY_PATH=/secrets/demo.pem",
"-e", "KALSHI_ENV=demo",
"ghcr.io/cejor6/kalshi-mcp-server:latest"
]
}
}
}
-v マウントは PEM ファイルを読み取り専用でコンテナーにバインドマウントし、KALSHI_PRIVATE_KEY_PATH はそのパスを指定します。シークレットは JSON 設定に保存されます。単一ユーザーのマシンであれば問題ありません。
この設定を配置する場所:
| クライアント | 設定場所 |
|---|---|
| Claude Desktop | claude_desktop_config.json(Settings → Developer) |
| Claude Code | プロジェクトの .mcp.json または ~/.claude/mcp.json |
| Cursor | Settings → MCP → Add new MCP Server(UI が同じ JSON を入力します) |
| Zed | ~/.config/zed/settings.json の context_servers 配下 |
| Continue | ~/.continue/config.json の experimental.modelContextProtocolServers 配下 |
| Cline | Cline の設定 → MCP Servers → Edit JSON |
| Goose | ~/.config/goose/config.yaml の extensions 配下 |
MCP の設定にシークレットを直接記述する場合(設定ファイルが自身のマシン上にあるローカル開発では許容されます):
{
"mcpServers": {
"kalshi": {
"command": "kalshi-mcp",
"env": {
"KALSHI_API_KEY_ID": "your-key-id",
"KALSHI_PRIVATE_KEY_PATH": "/path/to/your/private_key.pem",
"KALSHI_ENV": "demo"
}
}
}
}
プロジェクトディレクトリに
.envを置くだけではだめなのはなぜですか? MCP クライアントは、独自の作業ディレクトリ(通常、macOS/Linux ではホームディレクトリ、Windows ではクライアントのインストールディレクトリ)からサーバーをサブプロセスとして起動するため、このリポジトリに置いた.envは見つかりません。そのため、--env-fileで明示的に指定します。クライアントを使わずにプロジェクトディレクトリからサーバーを直接実行する場合は、フラグなしでも動作します。CLI はその場所で起動すると./.envを自動的に読み込みます。
リモート MCP サービスとして使用する
ローカルの stdio に対応していないクライアント(現在は、OAuth 保護された HTTP のみをサポートする claude.ai のカスタムコネクター設定フォームが主な対象です)では、アクセス可能な場所にサーバーをホストし、クライアントから接続します。OAuth プロキシはサーバーにバンドルされているため、設定するだけで利用できます。
このプロキシでは、どの GitHub アカウントでもサインインできるため、HTTP トランスポートには ID の許可リストも必要です。MCP_ALLOWED_GITHUB_IDS(数値 ID。名前を変更しても変わらないため推奨)および/または MCP_ALLOWED_GITHUB_LOGINS で指定し、MCP リクエスト(ツール呼び出し、kalshi://balance などのリソース読み取り、一覧取得)ごとに適用されます。OAuth の設定が不完全な場合、HTTP は起動を拒否します。また、認証なしの HTTP(MCP_ALLOW_INSECURE_HTTP=1)は、MCP_ALLOW_INSECURE_PUBLIC_BIND=1 も設定しない限り、DNS リバインディング保護を有効にしたループバックへのバインドに制限されます。
Render + GitHub OAuth + Upstash Redis を使用した一連の手順については、DEPLOY.md を参照してください。その他のイメージデプロイ対応ホスト(Fly.io、Cloud Run、ECS、Railway)でも同様に動作します。Render は設定例として取り上げているだけです。
ツール
| グループ | ツール |
|---|---|
| 取引所/アカウント | kalshi_get_exchange_status、kalshi_get_exchange_schedule、kalshi_get_api_limits、kalshi_get_environment、kalshi_set_safety_limits |
| 検索 | kalshi_get_markets、kalshi_find_liquid_markets、kalshi_get_market、kalshi_get_event、kalshi_get_events、kalshi_get_series、kalshi_get_series_list、kalshi_get_series_summary、kalshi_get_milestones、kalshi_get_trades |
| 市場データ | kalshi_get_orderbook、kalshi_get_orderbooks、kalshi_get_market_candlesticks、kalshi_get_event_candlesticks、kalshi_get_batch_candlesticks、kalshi_get_event_forecast_history、kalshi_get_market_trades |
| コンボ/パーレー | kalshi_get_combo_collections、kalshi_get_combo_collection、kalshi_get_combo_events、kalshi_get_combo_legs、kalshi_create_combo_market(書き込み — デフォルトでは無効です。以下を参照) |
| ポートフォリオ | kalshi_get_balance、kalshi_get_positions、kalshi_get_orders、kalshi_get_fills、kalshi_get_settlements |
| 注文(書き込み) | kalshi_prepare_order、kalshi_confirm_order、kalshi_cancel_order、kalshi_decrease_order、kalshi_get_order |
| ライブ(WebSocket) | kalshi_get_live_orderbook、kalshi_sample_trades |
| 外部データ(読み取り専用) | kalshi_fetch_external_data — ホスト許可リストに登録された、GET のみ、HTTPS のみの公開データフィード取得(Polymarket gamma/clob、NWS api.weather.gov、アンサンブルを含む Open-Meteo、Tennis Abstract、Deribit の公開データ)。認証情報は付加されず(trust_env=False)、リダイレクトは追跡されません。本文のサイズと実時間には上限が設けられ(上限が適用されるのはデコード後のバイト数です。Accept-Encoding: identity が送信されます)、呼び出しごとに生成されるランダムなノンスを付した UNTRUSTED-EXTERNAL-DATA 区切りで囲んで返されます(<<<UNTRUSTED-EXTERNAL-DATA id=<nonce> …>>> … <<<END-UNTRUSTED-EXTERNAL-DATA id=<nonce>>>)。ブロックは、id が一致する END マーカーでのみ終了します。本文内では(NFKC 正規化後、Unicode の書式制御文字を除去して照合)、英数字以外の文字だけを区切りとして untrusted/external/data が並ぶ場合、大文字小文字を問わず [delimiter-removed] に置換されます。また、3 個以上連続する < または > は [angle-brackets-removed] に置換されます。異なる文字体系間のホモグリフは対象外です。ノンスが主要な防御策です。自身の外部通信が制限されているクライアント(例:claude.ai のクラウドルーチン)でも、読み取り専用の調査に必要な公開フィードへアクセスできるように用意されています。許可リストは実行時に適用され、追加にはコード変更が必要です。この境界を設けた理由は AGENTS.md に記載されています。 |
| スコアリング(読み取り専用、オプション) | kalshi_score_markets — Jev(高速な型付き意思決定モデル)を使用して、見かけ上の優位性に基づき流動性の高い市場をランク付けします。多くの市場を低コストでスコアリングし、上位の少数のみを段階的に評価する取引ループ向けです。注文は行いません。MCP_ALLOW_JEV_SCORING=1 の場合のみ登録されます(デフォルトでは無効)。Jev はオプションです。TYPESAFE_API_KEY がない場合、または Jev でエラーが発生した場合、市場は決定論的な流動性/スプレッドのヒューリスティックで評価されます(jev_scored=false)。「Optional Jev scoring」を参照してください。 |
注文の発注には KALSHI_TRADING_ENABLED=1 が必要です。kalshi_prepare_order はローカルの安全性チェックを実行し、confirmation_id を返します。このトークンを指定して kalshi_confirm_order を呼び出すまで、Kalshi には何も送信されません。その際、現在有効な制限に照らしてチェックが再実行されます。キャンセルと数量減少は取引有効化フラグを回避します。いずれもエクスポージャーを減らす操作のみです。
LLM 向けの市場一覧表示: kalshi_get_markets / kalshi_get_market は
minimal=true を受け付けます。これを指定すると、各市場をトリアージに必要な
少数のホワイトリスト項目(ティッカー、価格、数量、出来高、ステータス、終了時刻)
に絞り込めます。スキャンには compact=true よりこちらを優先してください。
compact はブラックリスト方式であり、データの大部分が custom_strike /
mve_selected_legs / 長いサブタイトルに含まれる多変量(KXMVE…)コンボ市場では、
サイズがほとんど減りません。デフォルトのホワイトリストを上書きするには、
カスタムの fields="ticker,yes_bid_dollars,…" を渡します。ビューの優先順位は
fields > minimal > compact > 完全表示です。kalshi_get_event /
kalshi_get_events は、ネストされた市場に対して同じ minimal / fields を受け付けます
(イベントオブジェクト自体で使用できるのは compact ビューのみです)。
kalshi_get_event はデフォルトで compact=true です(以前はイベントとネストされた
市場を完全な状態で返していました)。詳細なブラックリスト項目(ルールのテキスト、
以前の価格、追加のタイムスタンプ)は削除され、ストライクと result は保持されます。
完全なオブジェクトには compact=false、ホワイトリストには minimal=true を渡します。
空の fields(""、" , ")は、リクエストを行う前にすべてのツールで拒否されます。
liquidity_dollars を条件にしないでください: Kalshi は現在、板が厚い市場であっても
すべての市場で 0.0000 を返します。流動性はオーダーブック(最良買値/売値と注文残数量)、
および volume_24h_fp / open_interest_fp から測定してください。これは compact と
minimal のビューでは除外されます。
取引可能な市場を見つける: デフォルトのオープン市場一覧は、板が空または片側のみの
多変量(KXMVE…)コンボ市場が大半を占めます。これらをサーバー側で除外するには、
kalshi_get_markets に mve_filter="exclude" を渡してください。または、
kalshi_find_liquid_markets を使用します。このツールはコンボ市場を除外し、24時間の
出来高順にランク付けして、最小限の投影による短い候補リストを返します。
(Kalshi にはサーバー側のソート機能がないため、ヘルパーのランキングは、結果の
scanned に報告される上限付きスキャン範囲を対象とします。)ランキングの前にオープン市場
一覧全体を調べるには、scan_all=true を渡します。これにより、候補リストは任意の一部範囲の
上位ではなく、取引所全体の真の上位 N 件になります。スキャンには内部のリクエスト数、
実行時間、市場数の上限があり、結果には complete と stopped_by が報告されるため、
部分的なスキャンを網羅的なものと誤認することはありません。
コンテキストを消費せずに広範囲をスキャンする: 市場ごとに 1 回の呼び出しが必要になる スキャン/異常検知の用途向けに、3 つのツールがあります。
kalshi_get_orderbooks(tickers=[…], depth=5)は、1 回のリクエストで最大 25 件の板を取得し、 ティッカーごとにエラーを分離します。不正なティッカーやイベントレベルのティッカーが 指定されても、バッチ全体が失敗するのではなく、そのティッカーのエントリーがerrorに なります。Kalshi のバッチエンドポイントにはdepthパラメーターがないため、この MCP が サーバー側で深さを適用します。Kalshi は価格の昇順でレベルを返し、両サイドとも買い注文なので、 最良のレベルを保持します。kalshi_get_series_summary()は市場一覧全体をシリーズごとに 1 行にまとめます (市場数、イベント数、24 時間の出来高、最小スプレッド、最も近い終了時刻)。コンテキストの 消費は少ないものの、読み取りが不要になるわけではありません。数千件の市場をページングせずに、 新しいイベント分類の上場を検出するための、日次の「新規供給センサス」です。series_tickerはティッカーのプレフィックスから 派生 する値であることに注意してください。 Kalshi は市場オブジェクトでこれを返しません。kalshi_get_batch_candlesticks(market_tickers=[…])は、1 回のリクエストで最大 100 市場分の OHLC バーを取得します。候補リスト全体のモメンタムを把握できます。予算の仕組みは単一市場向けの ツールとは異なります。Kalshi が返すローソク足は、すべてのティッカーを合計して最大 10,000 本 です。そのため、期間にかかるコストはティッカー数に応じて増加します。ローカルで検証され、 指定した期間で実際に取得できる市場数を示すメッセージが返されます。
コンボ/パーレー: 多変量の機能は専用モジュールにあります。
kalshi_get_combo_collections/kalshi_get_combo_collection— 提供されているパーレーの ファミリー と、それぞれに適用されるルール(レッグのsize_min/size_max、is_all_yes、対象となるイベントの範囲)。kalshi_get_combo_events— コレクションに対してすでに掲載されているコンボ、つまり 取引可能なパーレーの供給です。コンボ市場は Kalshi が返すオブジェクトの中で最大のため、 ネストされた市場についてはデフォルトでminimal=Trueを使用します。kalshi_get_combo_legs(ticker)はmve_selected_legsから、KXMVE…コンボを 元のレッグ(市場ティッカー、サイド、タイトル)に解決します。コンボのタイトル文字列を カンマで分割するよりも確実です。その方法ではレッグのティッカーが失われ、タイトルに カンマが含まれている場合は誤って分割されるためです。Kalshi がレッグの内訳を公開して いない場合、推測は行わず、構造化されたresolvable: falseを返します。返されるlegsはそのまま作成ツールに渡せるため、既存のコンボを復元して、1つのレッグだけを 変更できます。include_collection=trueを指定すると親コレクションが付加され、対象 イベントの範囲はassociated_event_countに置き換えられます。約800件の配列全体が 必要な場合はinclude_collection_event_tickers=trueを渡してください(以前のデフォルト です)。kalshi_create_combo_market— 書き込み。 選択したレッグの組み合わせからコンボ市場 ティッカーを作成します。注文は行わず、資金も使用しないため、KALSHI_TRADING_ENABLEDとは別のゲートを設けています。登録するにはMCP_ALLOW_COMBO_CREATION=1を設定してください(デフォルトは無効で、無効の場合、 このツールはモデルに公開されません)。Kalshi ではアカウントごとに週あたり 5000件まで作成できるため、サーバーはさらにMCP_MAX_COMBO_CREATIONS_PER_DAY(デフォルトは100。プロセス内で管理され、UTCの午前0時と再起動時にリセット)を適用し、 リトライループによる週間上限の消費を防ぎます。POST の前に、コレクション固有のsize_min/size_max/is_all_yesルールに照らしてレッグの組み合わせを事前検証します。 この検証がない場合、Kalshi は内容の不明確な400エラーを返します。コレクションを読み込め ない場合、このチェックは処理を続行します。
コンボの書き込み機能には環境変数が2つあります。.env に追加してください。
MCP_ALLOW_COMBO_CREATION=0 # 1 registers kalshi_create_combo_market
MCP_MAX_COMBO_CREATIONS_PER_DAY=100
イベントティッカーと市場ティッカー: 市場ティッカーには結果のサフィックス
(…PITHOU-HOU)が付きますが、イベントティッカー(…PITHOU)には付きません。
以前はイベントティッカーを kalshi_get_market/kalshi_get_orderbook/
kalshi_get_markets に渡すと、エラーが表示されずに失敗していました(404が返るか、
空の板/リストが「流動性なし」と解釈されていました)。これらのツールはこのケースを
検出し、正しい市場ティッカーを示す具体的なヒントを提示するようになりました。
Jev スコアリング(任意)
kalshi_score_markets はオプトインの読み取り専用ランキング支援ツールです。多くの市場を低コストでスコアリングし、上位の数件だけを高コストの推論モデルに引き上げたいトレーディングループ向けです。流動性の高い市場のスキャンを再利用し、市場ごとにコンパクトなプレーンテキストの状況説明(タイトル、提示された YES/NO 価格、スプレッド、出来高、終了までの時間、解決ルールの抜粋)を作成してから、Jev(TypeSafe の高速な型付き意思決定モデル)に、市場ごとの質問セット(エッジの score と side の選択)をまとめて1回で送ります。結果は confidence * edge の順にランキングされます。注文を出したり、資金を投入したりすることはありません。
2つの安全策があり、どちらも安全側にフォールバックします。
- 登録。 デフォルトでは無効です。ツールを登録するには
MCP_ALLOW_JEV_SCORING=1を設定します(MCP_ALLOW_COMBO_CREATIONと同じ仕組みです。無効の場合、ツールはモデルに公開されません)。デフォルトのクローンは純粋な Kalshi サーフェスのままです。 - Jev は任意であり、依存関係ではありません。 登録されていても、
TYPESAFE_API_KEYが設定されていない場合、ツールは決定論的な流動性/スプレッドのヒューリスティックでランキングし、jev_scored=falseを返します。Jev の呼び出しはすべてタイムアウト予算でラップされ、どのような失敗の場合もそのヒューリスティックにフォールバックします。対象には、402(クレジット不足)、429(レート制限)、その他の 2xx 以外の応答、ネットワークエラー、タイムアウト、不正な形式または回答の欠落、しきい値未満の信頼度が含まれます。ファンアウト全体にも合計の実時間予算が設定されているため、ホストの応答が遅い場合はブロックせずにヒューリスティックへ移行します。また、429 が発生すると短時間のグローバルなバックオフが作動し、レート制限中の上流サービスへの過剰なリクエストを防ぎます。ツールがクラッシュすることはありません。実際の失敗はスキャンごとに1回だけログに記録され、fallback_reasonsとして返されます。
新たなハード依存関係はありません: Jev の呼び出しには、このサーバーがすでに同梱している httpx を使った通常の REST を利用するため、typesafe-sdk は必要ありません。Jev に送信されるのは公開されている Kalshi の市場データのみです(アカウントデータ、残高、シークレットは含まれません)。API キーは設定された Jev ホストに https 経由でのみ送信されます。kalshi_fetch_external_data と同様、これは「Kalshi サーフェスのみ」という境界(AGENTS.md を参照)に対する意図的かつ文書化された例外です。このサーバーを利用する、外部への接続が制限されたクライアントは api.typesafe.ai に直接アクセスできないためです。
環境変数(すべて任意です。スコアリングを有効にする場合のみ .env に追加してください):
MCP_ALLOW_JEV_SCORING=0 # 1 registers kalshi_score_markets
TYPESAFE_API_KEY= # Jev key; unset => heuristic-only fallback
MCP_JEV_CONFIDENCE_THRESHOLD=0.6 # below this, a market falls back
MCP_JEV_MODEL=jev-latest
MCP_JEV_TIMEOUT_SECONDS=8 # per-request budget
MCP_JEV_RATE_COOLDOWN_SECONDS=60 # global back-off after a 429 (capped at 1h)
# MCP_JEV_BASE_URL=https://api.typesafe.ai/v1/systemone # override for self-host/tests
リソース
| URI | 説明 |
|---|---|
kalshi://environment | 現在の環境、有効な安全制限と各制限の環境変数による上限、レート制限の余裕(API 呼び出しなし) |
kalshi://balance | 現金残高と購入余力 |
kalshi://positions | 未決済のポジション |
kalshi://orders | 有効な注文(未約定/一部約定) |
WebSocket を利用したライブ注文板リソース(kalshi://markets/{ticker}/orderbook)は実装予定です。現時点では、kalshi_get_live_orderbook ツールを使用してください。このツールは一時的な WS 接続を開いて注文板をサンプリングし、現在のスナップショットと差分の到着率を返します。
安全モデル
このサーバーが意図的に保守的に設計されているのは、銀行のATMと同じ理由です。小さなミスが大きな損失につながってはならないからです。
KALSHI_ENV=prodを指定するには、KALSHI_ALLOW_PROD=1が必須です。両方が指定されていない場合、サーバーは起動を拒否します。- 注文を発注するには
KALSHI_TRADING_ENABLED=1が必要です。デフォルトは読み取り専用です。キャンセルと数量の減少はどちらの場合も利用できます。どちらもエクスポージャーを減らすだけなので、緊急キャンセルがブロックされることはありません。 - 注文ごとの上限(
MCP_MAX_ORDER_SIZE_USD、MCP_DAILY_LIMIT_USD、MCP_MAX_CONTRACTS_PER_ORDER、MCP_CASH_RESERVE_USD)は、リクエストが Kalshi に届く前に確認されます。prepare 時に事前チェックとして確認され、confirm 時にもその時点で有効な上限に照らして再確認されます。その際、注文を送信する前に注文のコストが日次上限の枠に確保されます。コストは最悪のケースを想定し、想定元本に Kalshi のテイカー手数料の保守的な見積もりを加えた額です。ゼロ以外の現金準備金は最新の残高を読み取って確認し、残高を読み取れない場合は注文が拒否されます。 - confirm がタイムアウトしたり、結果が不明確な状態で失敗した場合、注文が発注済みの可能性があります。そのコストは確保されたままになり、同じ
confirmation_idを再試行できます(同じclient_order_idを再送します)。代わりの注文を準備する前にkalshi_get_ordersを確認してください。 - 再デプロイせずに、実行時に上限を厳しくできます。 これらの環境変数はハードな上限値です。
kalshi_set_safety_limitsツールを使うと、稼働中のサーバーで任意の上限をさらに厳しくできます(例:迅速な制限)。デフォルトでは、現在の値より厳しくすることしかできません。3つの上限は引き下げのみ、現金準備金は引き上げのみ可能なので、実行時の呼び出し元が制限を元に戻すことはできません。上限を緩和するにはMCP_ALLOW_RUNTIME_LIMIT_LOOSENING=1が必要です。その場合でも、環境変数で設定された上限値を超えることはできません。上限値を引き上げるには、環境変数を変更して再デプロイする必要があります(永続化された上限の引き締めを元に戻す方法は AGENTS.md を参照してください)。有効な上限とその上限値はkalshi_get_environmentおよびkalshi://environmentに表示されます。実行時の変更を再起動後も保持するにはMCP_REDIS_URLを設定してください(設定しない場合、再起動時に環境変数の上限値へ戻ります)。
設計の詳細については AGENTS.md を参照してください。
デプロイ
任意の MCP クライアントを使って、ローカルで stdio サーバーとして利用するか、OAuth プロキシの背後でリモート HTTP MCP として実行できます。
リモートデプロイには、イメージデプロイを推奨します。Render、Fly.io、Cloud Run、ECS など、コンテナイメージを取得できる本番ホストが、リリースにタグを付けたとき(git tag v0.1.0)にビルドされ、プッシュされたイメージを取得します。これにより、デプロイを PR のマージから切り離せます。main への PR ではテストのみが実行され、新しいイメージがプッシュされることはありません。そのため、悪意のある、または不注意な PR がコンテナ内で稼働中のものに影響を与えることはありません。
この方式を採用する理由と Render を使った実例については、DEPLOY.md を参照してください。
貢献
PR を歓迎します。まず CONTRIBUTING.md をお読みください。認証の変更、シークレットの管理、テストの規約に関するルールがいくつかあります。
ライセンス
MIT ライセンスです。DISCLAIMER.md もご覧ください。MIT ライセンスでは保証が否認されています。DISCLAIMER.md には、このソフトウェアを使うことで受け入れることになる、取引および AI 固有のリスクが記載されています。
謝辞
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。