mcpField
K
Kalshi Prediction Markets

Kalshi Prediction Markets

本地服务
github.com/cejor6金融数据33 天前更新

关于 Kalshi Prediction Markets

Kalshi Prediction Markets 是面向 Kalshi 预测市场的 MCP 服务,为需要通过 MCP 客户端查看市场或执行交易操作的用户提供工具。它包含 RSA-PSS 认证、速率限制和两步订单确认,并将生产环境与交易设为显式启用。

主要功能

  1. 01提供 26 个工具和 4 个资源
  2. 02支持 REST 与 WebSocket
  3. 03RSA-PSS 认证及令牌桶限速
  4. 04订单准备与确认分为两步
  5. 05生产环境和交易需显式启用

适用场景

  1. 01在 demo 环境查看预测市场数据
  2. 02按成交量筛选流动性较高的市场
  3. 03在安全检查后确认订单

MCP 相关

该服务通过本地 stdio 或自托管 HTTP 提供 MCP 接口,向客户端公开 Kalshi 的 REST 与 WebSocket 市场工具及资源。远程 HTTP 部署可使用内置 OAuth 代理。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cejor6-kalshi": {
"command": "uvx",
"args": [
"kalshi-mcp-server"
],
"env": {
"KALSHI_API_KEY_ID": "<KALSHI_API_KEY_ID>",
"KALSHI_PRIVATE_KEY_PATH": "<KALSHI_PRIVATE_KEY_PATH>",
"KALSHI_PRIVATE_KEY_PEM": "<KALSHI_PRIVATE_KEY_PEM>",
"KALSHI_ENV": "<KALSHI_ENV>",
"KALSHI_ALLOW_PROD": "<KALSHI_ALLOW_PROD>",
"KALSHI_TRADING_ENABLED": "<KALSHI_TRADING_ENABLED>"
}
}
}
}
启动命令uvx kalshi-mcp-server
需要配置的环境变量
KALSHI_API_KEY_ID密钥Kalshi API key ID from https://kalshi.com/account/profile
KALSHI_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypikalshi-mcp-server0.1.8
ocighcr.io/cejor6/kalshi-mcp-server:0.1.8

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

kalshi-mcp-server

PyPI CI License: MIT Python 3.11+ Code style: ruff

📦 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。

配置

  1. 在 https://kalshi.com/account/profile 生成 Kalshi API 密钥(或在演示环境对应的 https://demo.kalshi.co/account/profile 生成)。保存私钥——它只会显示一次。

  2. 将密钥放入一个 .env 文件中。对于 MCP 客户端使用场景,推荐将其放在 ~/.kalshi/.env(仓库之外)。本地开发时,也可以使用仓库自身的 .env(已加入 gitignore)。

cp .env.example ~/.kalshi/.env
# edit ~/.kalshi/.env
  1. 至少设置:
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
环境变量的解析方式

启动时,服务会按以下顺序解析配置(优先级从高到低):

  1. 进程环境中已有的值——在 MCP 客户端配置的 env: 区块中设置,或在 shell 中导出。
  2. .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 Desktopclaude_desktop_config.json(Settings → Developer)
Claude Code项目 .mcp.json 或 ~/.claude/mcp.json
CursorSettings → MCP → Add new MCP Server(界面会填入相同的 JSON)
Zed~/.config/zed/settings.json 中的 context_servers 下
Continue~/.continue/config.json 中的 experimental.modelContextProtocolServers 下
ClineCline 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 特有风险。

致谢

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。