MCP server for Kalshi prediction market data — get markets, positions, and place orders from any MCP-compatible agent
Kalshi MCP has clear, well-structured tool definitions with proper naming (verb_noun pattern) and reasonable descriptions (avg 150 chars). All 4 tools have input schemas with types and descriptions. However, output schemas are not documented, LLMs cannot predict response structure for downstream chaining. The place_order tool lacks explicit error guidance for common failures (insufficient balance, invalid price range). Parameter descriptions are adequate but could be more prescriptive about constraints (e.g., price_cents range 1 - 99 is stated but not validated). No tool annotations (readOnlyHint/destructiveHint) despite clear read vs. write semantics.
Get full details for a single Kalshi market: current prices, bid/ask spreads, volume, open interest, and close time.
List active Kalshi prediction markets. Returns prices, volume, and close times. Defaults to the most liquid series (KXFED, KXBTC, KXINX, etc.) when no series is specified.
Get the authenticated user's open Kalshi positions. Requires KALSHI_API_KEY and KALSHI_API_SECRET environment variables.
Place a limit buy order on Kalshi. Use dry_run: true to validate the order without executing it. Requires KALSHI_API_KEY and KALSHI_API_SECRET.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination) for downstream tool chaining or data extraction.
place_order lacks error recovery guidance. No description of what happens on insufficient balance, invalid price, or API rejection, LLM cannot self-correct.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). place_order is destructive but unmarked; get_* tools are read-only but unmarked. Agents cannot infer safety properties.
get_markets limit parameter (1 - 200) not validated in code; no error message if LLM passes 500. Validation should return 'limit must be 1 - 200' not a silent truncation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
place_order description does not explain what dry_run returns or how to interpret success. LLM cannot distinguish between a validated order and an executed one.