关于 Kalshi Prediction Markets
Kalshi Prediction Markets 是面向 Kalshi 预测市场的 MCP 服务,为需要通过 MCP 客户端查看市场或执行交易操作的用户提供工具。它包含 RSA-PSS 认证、速率限制和两步订单确认,并将生产环境与交易设为显式启用。
主要功能
- 01提供 26 个工具和 4 个资源
- 02支持 REST 与 WebSocket
- 03RSA-PSS 认证及令牌桶限速
- 04订单准备与确认分为两步
- 05生产环境和交易需显式启用
适用场景
- 01在 demo 环境查看预测市场数据
- 02按成交量筛选流动性较高的市场
- 03在安全检查后确认订单
MCP 相关
该服务通过本地 stdio 或自托管 HTTP 提供 MCP 接口,向客户端公开 Kalshi 的 REST 与 WebSocket 市场工具及资源。远程 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 身份验证、异步令牌桶速率限制、带安全上限的两步准备/确认下单流程,可选的内置 OAuth 代理,适用于远程 MCP 部署;提供 26 个工具和 4 个资源,覆盖 REST 和 WebSocket。采用 MIT 许可证,专为分叉而设计。
兼容任何 MCP 客户端——可通过 stdio 在本地运行(Claude Desktop、Claude Code、Cursor、Zed、Continue、Cline、Goose 等),也可作为可自托管的 HTTP 服务远程运行(目前支持 claude.ai 自定义连接器,未来将支持任何具备 OAuth 能力的 MCP 客户端)。
⚠️ 此软件允许大模型下单交易。部署前请阅读 DISCLAIMER.md。 交易预测市场存在重大亏损风险。AI Agent 会犯错——有时还会信心十足。作者对任何损失概不负责。在了解故障模式之前,请在模拟环境中测试(
KALSHI_ENV=demo、KALSHI_TRADING_ENABLED=0)。
状态——Alpha。 身份验证(REST + WS)、速率限制、安全控制、覆盖 REST 和实时频道的 26 个工具,以及 4 个资源均已就绪。计划在 v0.2 中提供长连接多路复用 WebSocket 会话和
kalshi://markets/{ticker}/orderbook实时资源。
快速开始(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)——请参阅配置和安全模型。
调用示例
让 Agent 查找可交易市场,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"
}
]
}
下单需要经过两个明确步骤——kalshi_prepare_order 执行本地安全检查,并返回一个 confirmation_id;只有使用该令牌调用 kalshi_confirm_order 后,订单才会发送至 Kalshi。大模型无法通过一次调用下单。
为什么选择此服务
大多数现有的 Kalshi MCP 都只是对少数 REST 端点的简单封装。此服务旨在做到:
- 原生适配 Kalshi。 使用真正的 RSA-PSS 签名器,处理各种易错细节(不含查询字符串的路径、毫秒时间戳、演示环境和生产环境使用不同密钥)。
- 感知速率限制。 客户端令牌桶与 Kalshi 2026 年的读写额度模型一致,因此服务不会向 API 发送过多请求,导致触发 429 错误。
- 默认安全。 未明确启用相应标志时,拒绝连接生产环境;未单独启用交易标志时,拒绝写入。订单控制(数量上限、每日上限、现金储备)均可由操作员配置。
- 适合托管部署。 私钥既可通过文件路径提供,也可通过包含内联 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
每次带标签的发布都会向 GHCR 发布多架构(amd64 + arm64)镜像,标签为 :latest 和 :vX.Y.Z:
docker pull ghcr.io/cejor6/kalshi-mcp-server:latest
托管部署请参阅 DEPLOY.md。
配置
-
在 https://kalshi.com/account/profile 生成 Kalshi API 密钥(或在演示环境对应的 https://demo.kalshi.co/account/profile 生成)。保存私钥——它只会显示一次。
-
将密钥放入一个
.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:区块中设置,或在 shell 中导出。 .env文件——如果传入该标志,则从--env-file PATH加载;否则,如果当前工作目录中存在./.env,则从该文件加载。不会覆盖步骤 1 中已存在于环境中的变量。
因此,你可以将密钥直接写入 MCP 配置(env:),也可以放入配置所指向的文件(--env-file)。无需两者都设置。
与 MCP 客户端搭配使用(stdio)
所有 MCP stdio 客户端都使用相同的配置结构:用于启动服务的 command、可选的 args 和可选的 env。差异仅在于填写配置的文件或 UI 不同。
有三种可行的安装方式——选择最适合你环境的一种。
方式 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(界面会填入相同的 JSON) |
| Zed | ~/.config/zed/settings.json 中的 context_servers 下 |
| Continue | ~/.continue/config.json 中的 experimental.modelContextProtocolServers 下 |
| Cline | Cline settings → 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 的客户端——目前主要是claude.ai 的自定义连接器表单,它只支持受 OAuth 保护的 HTTP——请将服务托管在可访问的位置,并让客户端连接到该服务。OAuth 代理已随服务打包;你只需对其进行配置。
该代理允许任何 GitHub 账户登录,因此 HTTP 传输还需要身份允许列表——MCP_ALLOWED_GITHUB_IDS(数字 ID,优先使用:账户重命名后仍然有效)和/或 MCP_ALLOWED_GITHUB_LOGINS——并且会对每个 MCP 请求(工具调用、资源读取,例如 kalshi://balance,以及列表查询)进行强制校验。如果 OAuth 配置不完整,HTTP 将拒绝启动;未验证身份的 HTTP(MCP_ALLOW_INSECURE_HTTP=1)仅允许绑定到环回地址,并启用 DNS 重绑定保护,除非你同时设置 MCP_ALLOW_INSECURE_PUBLIC_BIND=1。
请参阅 DEPLOY.md,了解使用 Render + GitHub OAuth + Upstash Redis 的端到端部署流程。其他容器镜像部署平台(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),返回内容会用带有每次调用随机 nonce 的 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]。不涵盖跨文字系统的同形异义字符;nonce 是主要防护措施。此工具旨在让自身出站访问受限的客户端(例如 claude.ai 云端例程)能够访问只读研究所需的公开数据源;运行时会强制执行允许列表,添加地址需要修改代码,相关边界设计理由见 AGENTS.md。 |
| 评分(只读,可选) | kalshi_score_markets — 使用 Jev(一种快速的类型化决策模型)根据表观优势为流动性高的市场排名,适用于低成本评估大量市场、仅对排名靠前的少数市场进行升级处理的交易循环。不下单。仅当 MCP_ALLOW_JEV_SCORING=1 时注册(默认关闭)。Jev 是可选的:如果未设置 TYPESAFE_API_KEY,或 Jev 出现任何故障,市场会回退到确定性的流动性 / 价差启发式方法(jev_scored=false)。请参阅下文的“可选 Jev 评分”。 |
下单需要设置 KALSHI_TRADING_ENABLED=1。kalshi_prepare_order 会运行
本地安全检查并返回一个 confirmation_id;在你使用该令牌调用
kalshi_confirm_order 之前,不会向 Kalshi 发送任何内容;调用时会根据
当时生效的限额重新运行检查。取消和减少订单不会受交易启用标志限制——它们只会降低风险敞口。
为大模型列出市场: kalshi_get_markets / kalshi_get_market
接受 minimal=true,可将每个市场精简为一小组白名单字段(ticker、价格、数量、成交量、状态、收盘时间)。扫描时优先使用此选项,而不是 compact=true:compact 使用黑名单,对多变量(KXMVE…)组合市场的精简效果很有限,因为这些市场的大量内容位于
custom_strike / mve_selected_legs / 长副标题中。传入自定义的
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…)组合市场构成,这些市场的订单簿为空或只有单边报价。传入 mve_filter="exclude" 可让 kalshi_get_markets 在服务端将其剔除;也可以使用 kalshi_find_liquid_markets——它会排除组合市场,按 24 小时成交量排序,并返回简短的最小字段投影候选列表。(Kalshi 不支持服务端排序,因此该工具仅对有界扫描窗口内的市场进行排序,结果中的 scanned 会报告扫描数量。)传入 scan_all=true 可在排序前扫描完整的开放市场列表——这样候选列表就是全交易所范围内真正的前 N 名,而不是任意切片中的前 N 名。扫描受内部请求数/耗时/市场数量上限约束,结果会报告 complete 和 stopped_by,避免将部分扫描误认为穷尽扫描。
广泛扫描而不耗尽上下文: 以下三个工具专为扫描/异常检测工作负载设计,否则这类任务需要每个市场调用一次。
kalshi_get_orderbooks(tickers=[…], depth=5)可在一次请求中获取最多 25 个订单簿,并隔离各 ticker 的错误——无效或事件级 ticker 会作为该 ticker 对应的error条目返回,而不会导致整个批次失败。Kalshi 的批量端点没有depth参数,因此该 MCP 会在服务端应用深度限制;它保留最佳档位(Kalshi 按价格升序返回档位,且两侧数据均为买单)。kalshi_get_series_summary()会将整个市场列表汇总为每个系列一行(市场数量、事件数量、24 小时成交量、最窄价差、最早收盘时间)。上下文开销低,但读取开销并非为零——它是每日的“新增供给普查”,无需翻阅数千个市场,就能发现新上线的事件类别。请注意,series_ticker是根据 ticker 前缀推导出来的:Kalshi 不会在市场对象中返回此字段。kalshi_get_batch_candlesticks(market_tickers=[…])可在一次请求中获取最多 100 个市场的 OHLC K 线——为整个候选列表提供动量观察视角。它的预算方式不同于单市场工具:Kalshi 对所有 ticker 的蜡烛总数最多返回 10,000 根,因此窗口成本会随 ticker 数量增加。该工具会在本地验证,并通过消息说明请求的窗口实际可支持多少个市场。
组合/串关。 多变量功能位于独立模块中:
kalshi_get_combo_collections/kalshi_get_combo_collection— 可用的 parlay 系列及其各自施加的规则(size_min/size_max腿数、is_all_yes、符合条件的事件范围)。kalshi_get_combo_events— 已在某个系列中列出的组合,即 当前可用的 parlay 供应。默认将minimal=True用于嵌套市场,因为 组合市场是 Kalshi 返回的最大对象。kalshi_get_combo_legs(ticker)会从mve_selected_legs中解析KXMVE…组合对应的底层腿(市场代码、方向、标题)——这比用逗号拆分组合标题字符串 好得多,因为后者会丢掉腿的代码,并错误拆分包含逗号的标题。如果 Kalshi 未发布腿的明细,它会返回结构化的resolvable: false,而不是猜测。它返回的legs可以直接传回创建工具, 因此你可以往返处理现有组合并调整其中一条腿。设为include_collection=true时, 会附上父级系列,并将其符合条件的事件范围替换为associated_event_count(传入include_collection_event_tickers=true可获取 完整的约 800 项数组——这是旧的默认行为)。kalshi_create_combo_market— 写入工具。 为选定的腿集合创建组合市场 代码。它不会下单或动用资金,因此有独立的启用门槛,不受KALSHI_TRADING_ENABLED控制:设置MCP_ALLOW_COMBO_CREATION=1才会 注册该工具(默认关闭;关闭时不会向模型公布此工具)。Kalshi 允许每个账户每 周创建 5000 次,因此服务还会强制执行MCP_MAX_COMBO_CREATIONS_PER_DAY(默认为 100,仅在进程内生效,在 UTC 午夜和重启时重置),以防重试循环耗尽每周配额。 POST 请求前,它会根据系列自身的size_min/size_max/is_all_yes规则预检腿集合;否则 Kalshi 会以含糊的 400 错误拒绝请求。如果无法读取系列, 该检查会默认放行。
组合写入功能还需要两个环境变量——将它们添加到 .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 选择)。结果按 confidence * edge 排名。它不会下单,也不会投入资金。
有两道门槛,且两者都会安全失败:
- 注册。 默认关闭。设置
MCP_ALLOW_JEV_SCORING=1才会注册此工具(采用与MCP_ALLOW_COMBO_CREATION相同的模式——关闭时,不会向模型公布此工具)。默认克隆版本仍是纯 Kalshi 接口。 - Jev 可选——绝非依赖项。 即使已注册,若未设置
TYPESAFE_API_KEY,此工具也会使用确定性的流动性/价差启发式进行排名,并返回jev_scored=false。每次 Jev 调用都有超时预算,遇到任何故障都会回退到该启发式方法——402(额度用尽)、429(触发速率限制)、其他非 2xx 响应、网络错误、超时、答案格式错误或缺失,或置信度低于阈值。整个并发调用也受总墙钟时间预算限制,因此主机响应缓慢时会降级为启发式方法,而不会造成阻塞;429 响应还会触发短暂的全局退避,避免持续请求已触发速率限制的上游。此工具绝不会崩溃;真实故障会在每次扫描中记录一次,并作为fallback_reasons返回。
没有新增硬依赖: Jev 调用通过此服务已有的 httpx 使用普通 REST 接口——无需 typesafe-sdk。发送给 Jev 的只有公开的 Kalshi 市场数据(不含账户数据、余额或密钥),API 密钥也只会通过 https 发送到配置的 Jev 主机。与 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 之前检查——准备阶段会快速失败;确认阶段会根据当时生效的限额再次检查,并在发送订单前将订单成本计入每日限额。成本按最坏情况计算:名义金额加上对 Kalshi 吃单手续费的保守估算。非零现金储备会根据最新读取的余额进行检查;如果无法读取余额,则拒绝下单。 - 如果确认请求超时或出现结果不明确的失败,订单可能已经提交:其成本仍会计入限额,同一个
confirmation_id可以重试(会重新发送相同的client_order_id)。准备替代订单前,请检查kalshi_get_orders。 - 运行时收紧限额,无需重新部署。 这些环境变量是硬性上限。
kalshi_set_safety_limits工具可以在服务运行期间收紧任意限额(例如快速降低限额)。默认情况下,它只能相对于当前值收紧——三个上限只能调低,现金储备只能调高——因此运行时调用方无法撤销已执行的收紧。放宽限额需要设置MCP_ALLOW_RUNTIME_LIMIT_LOOSENING=1,即便如此,也绝不能超过环境变量设定的上限。提高上限仍需更改环境变量并重新部署(如何撤销已持久化的收紧,请参见 AGENTS.md)。当前生效的限额及其上限可在kalshi_get_environment和kalshi://environment中查看。设置MCP_REDIS_URL可让运行时更改在重启后继续生效(否则重启后会重置为环境变量设定的上限)。
完整设计请参见 AGENTS.md。
部署
可在本地将其用作 stdio 服务,搭配任意 MCP 客户端;也可以将其作为远程 HTTP MCP 服务,部署在 OAuth 代理之后。
对于远程部署,推荐采用镜像部署:生产主机(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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。