{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T19:31:48.964Z","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi","markdownUrl":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi.md","server":{"slug":"pipeworx-io-kalshi","name":"Kalshi","registryName":"io.github.pipeworx-io/kalshi","description":"Kalshi MCP — US-regulated prediction-market data (no auth on public reads).","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"pipeworx-mcp-kalshi","type":"npm","identifier":"@pipeworx/mcp-kalshi","withdrawn":false,"url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi","version":"0.3.1","transport":"stdio","scoredAt":"2026-11-05T06:22:21.374Z"},"score":{"total":82,"tier":"high trust","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":82},{"date":"2026-11-04","total":81},{"date":"2026-11-03","total":81},{"date":"2026-11-02","total":65},{"date":"2026-11-01","total":80},{"date":"2026-10-31","total":80},{"date":"2026-10-30","total":79},{"date":"2026-10-29","total":79}]},"categories":[{"name":"Supply Chain Security","score":100,"verdict":"pass","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","No install/post-install scripts declared.","No production dependencies, so there is no dependency health to assess."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.none","args":{}},{"code":"dephealth.no_dependencies","args":{"deps":"0","unhealthy":"0"}}]},{"name":"Provenance & Transparency","score":97,"verdict":"fail","reasons":["Source repository is publicly reachable at the declared URL.","Cryptographically verified build provenance (signed, bound to pipeworx-io/mcp-kalshi).","Clear OSI-approved license (MIT).","Actively maintained (last published 2 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.verified","args":{"repo":"pipeworx-io/mcp-kalshi"}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"2"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":62,"verdict":"fail","reasons":["AI-judged instruction clarity (excellent).","Context-footprint check failed: tool/resource definitions use about 6033 tokens (~317/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"excellent"}},{"code":"schema.footprint_heavy","args":{"avg":"317","items":"19","tools":"19","tokens":"6033","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":23,"verdict":"partial","reasons":["Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"7"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","We read all 19 captured tool definition(s), and no name or description among them implies an irreversible operation.","An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_none","args":{"tools":"19"}},{"code":"toolsafety.manipulation_clean","args":{"units":"20","judged":"20"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"kalshi-mcp","type":"remote","identifier":"https://gateway.pipeworx.io/kalshi/mcp","withdrawn":false,"score":78,"current":false,"url":"https://verifymcp.io/servers/pipeworx-io-kalshi/kalshi-mcp","markdownUrl":"https://verifymcp.io/servers/pipeworx-io-kalshi/kalshi-mcp.md"},{"slug":"pipeworx-mcp-kalshi","type":"npm","identifier":"@pipeworx/mcp-kalshi","withdrawn":false,"score":82,"current":true,"url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi","markdownUrl":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi.md"}],"facts":[{"label":"Registry","value":"npm"},{"label":"Package","value":"@pipeworx/mcp-kalshi"},{"label":"Version","value":"0.3.1"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"kalshi_markets","title":null,"description":"List or search Kalshi prediction markets, open or already settled. Pass `keyword` to find markets by subject — \"inflation\", \"Iran\", \"Vance\" — served by Kalshi's own full-corpus search, with each result tagged match: market|event|related so you can tell a literal keyword hit from a relevance-ranked neighbor. A keyword search honours `status`, so status \"settled\" is how you find a RESOLVED market by subject (its `result` is the outcome) — Kalshi indexes settled markets separately and the open index does not contain them. Other filters: status (open|closed|settled|unopened), event_ticker (group by event), series_ticker (group by series like KXFED for Fed rate). EVERY path returns the same fields — ticker, event_ticker, series_ticker, title, subtitle, status, yes_ask/yes_bid/no_ask/last_price (cents 1–99), implied_yes_prob, volume, volume_24h, open_interest, liquidity, close_time, category, result — so you can screen by category AND liquidity in one call. Two fields are conditional and say so here rather than surprising you: `result` is the settled outcome (\"yes\"/\"no\") and is null while a market is still trading, and `category` comes from the market's Kalshi series (Kalshi's market records carry none), so it is null for the rare market whose series lookup fails — listed in fields_omitted when that happens. A keyword search adds two fields a listing has no notion of: event_title and match. Anything we cannot populate is named in `fields_omitted` rather than returned as a bare null. Use this to discover markets; use kalshi_market for the rules text.","inputs":[{"name":"cursor","type":"string","required":false,"description":"Pagination cursor from previous response"},{"name":"event_ticker","type":"string","required":false,"description":"Filter to one event (e.g. \"KXFED-26OCT\")"},{"name":"keyword","type":"string","required":false,"description":"Subject to search for, e.g. \"inflation\", \"Iran\", \"Vance\". Runs Kalshi's own search over the full market corpus, in the slice named by `status` — pass status \"settled\" to find markets that have alread…"},{"name":"limit","type":"number","required":false,"description":"1-1000 (default 100)"},{"name":"series_ticker","type":"string","required":false,"description":"Filter to one series (e.g. \"KXFED\" for Fed funds rate)"},{"name":"status","type":"string","required":false,"description":"open | closed | settled (default open)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":567},{"name":"kalshi_market","title":null,"description":"AUTHORITATIVE detail for one Kalshi market by ticker (e.g. \"KXFED-26OCT-T3.50\"), live OR long-settled — Kalshi drops older markets from its live endpoints (they 404 there), and this falls through to Kalshi's historical archive and says which answered in `source`. Returns the rules text (so you know exactly what the market settles on — critical before quoting odds), yes_ask + no_ask prices in cents, last_price, volume, open_interest, expiration date, settlement criteria. Use after kalshi_events / kalshi_event to drill into a specific market, or when you already have a Kalshi ticker. For depth-of-book use kalshi_orderbook.","inputs":[{"name":"ticker","type":"string","required":true,"description":"Kalshi market ticker, e.g. \"KXFED-26OCT-T3.50\""}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":185},{"name":"kalshi_events","title":null,"description":"List/browse Kalshi events (event = a question with one-or-more child markets, e.g. \"Fed funds rate after Oct 2026 meeting?\" with 11 markets, one per rate bucket). Filter by status (open / settled), series_ticker (KXFED, KXBTC, KXCPI, etc.), or category (Politics, Economics, Financials, Crypto, Climate and Weather, Sports, ...). Kalshi's own endpoint ignores a category filter, so we apply it over a bounded page scan and report events_scanned / scan_complete with the result — a category browse is filtered, not exhaustive. Use this as a discovery tool — to find what events Kalshi has open for a given topic family. For a specific event's child markets see kalshi_event; for one specific market see kalshi_market.","inputs":[{"name":"category","type":"string","required":false,"description":"Kalshi category, exact words: Politics | Elections | Economics | Financials | Crypto | Companies | Commodities | Climate and Weather | Science and Technology | Sports | Entertainment | World | Health…"},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor"},{"name":"limit","type":"number","required":false,"description":"1-200 (default 100)"},{"name":"series_ticker","type":"string","required":false,"description":"e.g. \"KXFED\""},{"name":"status","type":"string","required":false,"description":"open | closed | settled (default open)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":329},{"name":"kalshi_event","title":null,"description":"AUTHORITATIVE odds from Kalshi — the only CFTC-regulated US prediction-market exchange (US persons CAN legally trade here, unlike Polymarket). Returns one event with ALL its child markets nested: event title + each market's ticker, subtitle, price, volume. Use when you need the full partition for an outright bet (\"Fed funds in June 2026: each rate level is one market\"). Pass include_orderbook=true to fetch live top-of-book for each market (slower but populates yes_ask_cents/yes_bid_cents/no_ask_cents + implied_yes_prob — required for most macro events since the nested response leaves prices null on the public unauth API). Every price ships TWO ways: `*_cents` rounded to the nearest cent (Kalshi's display convention) and `*_dollars` at full fixed-point precision — a genuine sub-cent quote like 0.335 shows as 34 in `yes_ask_cents` and exactly 0.335 in `yes_ask_dollars`; use the dollars field for anything sizing a trade on a thin spread. `implied_yes_prob` is computed from the dollars value, not the rounded cents, so it carries the same precision. `yes_bid_size`/`no_bid_size` report top-of-book contract size for the two real resting sides when include_orderbook populated them from the orderbook ladder — there is no separate size for yes_ask/no_ask because those are derived prices (1 − the opposite side's best bid), not an independent order. For cross-venue spreads vs Polymarket, see polymarket_kalshi_spread.","inputs":[{"name":"event_ticker","type":"string","required":true,"description":"Kalshi event ticker, e.g. \"KXFED-26OCT\""},{"name":"include_orderbook","type":"boolean","required":false,"description":"Default false. When true, fetches per-market orderbook in parallel and patches in best bid/ask + recomputed implied_yes_prob. Adds ~1s for events with ~10 markets. Required when the nested response r…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":437},{"name":"kalshi_series","title":null,"description":"List Kalshi series (a series groups related events over time — e.g. \"KXFED\" series has one event per FOMC meeting). Useful to find the canonical handle for recurring questions.","inputs":[{"name":"category","type":"string","required":false,"description":"Politics | Economics | Climate | Sports | Science | World"},{"name":"limit","type":"number","required":false,"description":"1-1000 (default 200)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":84},{"name":"kalshi_orderbook","title":null,"description":"Current YES/NO orderbook (bids + asks with size, in cents) for a market ticker. Use to see live liquidity depth before judging whether an edge is tradable. Returns sorted price/quantity levels.","inputs":[{"name":"depth","type":"number","required":false,"description":"Levels to return per side (default 5, max 100)"},{"name":"ticker","type":"string","required":true,"description":"Kalshi market ticker"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":85},{"name":"kalshi_trades","title":null,"description":"Executed trades for a market ticker, live OR long-settled. Returns most-recent N trades with yes/no price in BOTH units (yes_price_cents and yes_price_dollars at full precision), contract size, taker side and timestamp. Useful for sanity-checking what the market actually paid vs the resting orderbook, and for reconstructing how a resolved market traded. Kalshi answers 200-with-an-empty-list on its live trades endpoint for markets it has archived, so this falls through to Kalshi's historical trade archive and reports which one answered in `source`.","inputs":[{"name":"limit","type":"number","required":false,"description":"1-1000 (default 50)"},{"name":"ticker","type":"string","required":true,"description":"Kalshi market ticker"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"kalshi_price_history","title":null,"description":"Historical price/probability time-series (candlesticks) for a Kalshi market — how the YES odds moved over time, for ANY window, including one that ended long ago. Pass a market ticker (e.g. \"KXFEDDECISION-28JAN-H26\") plus either an explicit start_ts/end_ts window (\"what did this market think in March?\") or lookback_days as sugar for a window ending now. Returns OHLC candles: YES price (open/high/low/close/mean as probability 0-1), best bid/ask, volume, and open interest per interval. Kalshi serves at most 5,000 candles per request; a window larger than that comes back as page 1 with `next_cursor` and `complete: false` — pass the cursor straight back for the next slice, oldest-first — so a long window is never silently shortened. Kalshi also MOVES older markets out of its live endpoints, where they 404; this routes to Kalshi's historical archive automatically and reports which one answered in `source`, so backtesting a resolved 2024 market works the same way as charting a live one. The Kalshi analogue of polymarket_price_history.","inputs":[{"name":"cursor","type":"string","required":false,"description":"Pass back `next_cursor` from a previous response to fetch the next slice of a window too large for one request (>5,000 candles). The cursor carries the ticker, interval and remaining window, so no ot…"},{"name":"end_ts","type":"string","required":false,"description":"Window END — same formats as start_ts. Defaults to now when omitted."},{"name":"interval","type":"string","required":false,"description":"\"1h\" (hourly) | \"1d\" (daily, default) | \"1m\" (per-minute). Coarser intervals cover longer history per request."},{"name":"lookback_days","type":"number","required":false,"description":"Sugar for a window length in days (1-365, default 30). Anchors to start_ts if you gave one, to end_ts if you gave that, and to now if you gave neither. Ignored when both start_ts and end_ts are set."},{"name":"start_ts","type":"string","required":false,"description":"Window START — ISO date (\"2026-03-01\"), ISO datetime (\"2026-03-01T00:00:00Z\"), or unix seconds. Use with end_ts to ask about a window that does NOT end today."},{"name":"ticker","type":"string","required":false,"description":"Kalshi market ticker (e.g. \"KXFEDDECISION-28JAN-H26\"). The series is derived from the ticker automatically. Required unless you are passing `cursor`."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":539},{"name":"kalshi_exchange_status","title":null,"description":"Exchange-level status: is the trading floor open, are deposits/withdrawals enabled, any scheduled maintenance. Cheap check before a batch script.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":38},{"name":"kalshi_top_markets","title":null,"description":"Ranking / leaderboard of Kalshi's most-traded markets right now — use this for \"what is the highest volume prediction market on Kalshi\", \"most traded Kalshi market\", or any top-N-by-activity question. Kalshi's /markets endpoint has NO server-side sort and its raw listing is 99%+ algorithmically-generated multivariate combo markets with zero volume, so paging through it would surface junk. This instead discovers real, currently-active markets via Kalshi's own search/relevance index, then re-ranks the leaders using each market's authoritative live volume/price detail. Returns title, ticker, event_ticker, volume, volume_24h, open_interest, liquidity, yes/no price (cents), close_time, as_of, and source, sorted highest-first. Not an exhaustive scan of every one of Kalshi's ~14,000 series — see `method` and `candidates_considered` in the response for the disclosed scan size.","inputs":[{"name":"by","type":"string","required":false,"description":"volume (default, all-time contracts traded) | volume_24h | open_interest | liquidity"},{"name":"limit","type":"number","required":false,"description":"1-50 (default 10)"},{"name":"status","type":"string","required":false,"description":"\"open\" (default — only markets not yet past close_time) | \"any\" (include markets whose close_time has passed, still excludes settled/resulted ones)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":289},{"name":"kalshi_macro","title":null,"description":"Friendly-name shortcut for the most-asked Kalshi macro series: \"Fed\" (FOMC rate buckets), \"BTC\" (Bitcoin price ranges), \"ETH\" (Ethereum), \"CPI\" (monthly inflation), \"GDP\" (quarterly growth), \"SP500\" (S&P 500 EOY close), \"Recession\" (NBER recession calls). Returns the soonest-expiring open event for that series with all child markets + implied probabilities, so agents can ask about macro odds without knowing Kalshi's ticker scheme.","inputs":[{"name":"topic","type":"string","required":true,"description":"Fed | BTC | ETH | CPI | GDP | SP500 | Recession"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":141},{"name":"kalshi_orderbooks","title":null,"description":"Depth-of-book for UP TO 100 Kalshi markets in ONE call — Kalshi's own batch orderbook endpoint (`GET /markets/orderbooks`), not a fan-out we do for you. Use this instead of calling kalshi_orderbook once per ticker when you are pricing a whole event partition (an 11-bucket Fed event, a 20-strike temperature ladder) or screening several markets for liquidity: one request, one rate-limit slot. Returns per ticker: the full yes_bids / no_bids ladders (price in BOTH units — price_dollars at Kalshi's fixed-point precision and price_cents rounded — with quantity), plus best_yes_bid / best_no_bid and the derived yes_ask / no_ask (1 − the opposite side's best bid, which is what an ask IS in a binary market; Kalshi returns bids only). Kalshi returns an orderbook entry only for tickers it recognises AND that have a book, so any ticker you asked for that came back with nothing is named in `tickers_without_book` rather than silently dropped — an empty ladder is a real answer (nobody is quoting), not an error.","inputs":[{"name":"depth","type":"number","required":false,"description":"Levels to keep per side, best-first (default 5, max 100). Kalshi returns the whole ladder; this trims the response. `levels_available` reports the untrimmed depth per side so you can tell a thin book…"},{"name":"tickers","type":"array","required":true,"description":"Market tickers, 1-100 (Kalshi's own per-request cap, e.g. [\"KXHIGHNY-26SEP16-B75.5\",\"KXHIGHNY-26SEP16-B77.5\"]). A comma-separated string is accepted too. More than 100 is an explicit error, not a sil…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":389},{"name":"kalshi_candlesticks","title":null,"description":"Price history (OHLC candles) for UP TO 100 Kalshi markets over ONE shared window, in ONE call — Kalshi's batch candlestick endpoint (`GET /markets/candlesticks`). This is the comparison tool: every bucket of a Fed or CPI event on one timeline, or the same question across several strikes, without the N separate calls kalshi_price_history would cost. Per candle: YES open/high/low/close/mean as a probability 0-1, best bid/ask close, volume and open interest. Kalshi caps the response at 10,000 candles ACROSS all markets combined — when the cap binds the response says `truncated_by_upstream: true` and tells you which tickers came back short, because a silently halved series is indistinguishable from a quiet market. For ONE ticker with paging, a longer window, or a market old enough that Kalshi has archived it, use kalshi_price_history: this batch endpoint has no archive fallback and no cursor.","inputs":[{"name":"end_ts","type":"string","required":false,"description":"Window END — same formats. Defaults to now."},{"name":"interval","type":"string","required":false,"description":"\"1h\" (hourly, default) | \"1d\" (daily) | \"1m\" (per-minute). Kalshi accepts only these three; the 10,000-candle cap is shared across every ticker you ask for, so a per-minute window over 100 markets wi…"},{"name":"lookback_days","type":"number","required":false,"description":"Sugar for a window ending now (1-365, default 1). Ignored when both start_ts and end_ts are given."},{"name":"start_ts","type":"string","required":false,"description":"Window START — ISO date (\"2026-09-01\"), ISO datetime, or unix seconds."},{"name":"tickers","type":"array","required":true,"description":"Market tickers, 1-100 (e.g. [\"KXHIGHNY-26SEP16-B75.5\",\"KXHIGHNY-26SEP16-B77.5\"]). A comma-separated string is accepted too."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":421},{"name":"kalshi_event_live_data","title":null,"description":"The REAL-WORLD measurement an event settles against, next to the odds — Kalshi's event live-data feed (`GET /live_data/events/{event_ticker}`). This is the thing you cannot get by calling any other Kalshi endpoint: for a crypto event it is the underlying BTC/ETH price track from the settlement index (candlesticks + tick timeseries); for an economic event it is the actual published series the market resolves on (e.g. CPI CUUR0000SA0 from BLS, monthly, with its latest value and the target period); for other events it is whatever observation Kalshi charts behind the contract. The response's `type` names the schema of `details` (seen live: \"crypto\", \"timeseries\"), and the fields that matter are lifted to the top level where they exist: latest_value, unit, measure, frequency, provider, series_id, target_period, last_refreshed. COVERAGE IS PARTIAL AND WE SAY SO: most events have no live data and answer 404 — this returns found:false with the ticker rather than an error. Weather is NOT here: temperature observations are city-keyed, not event-keyed (KXHIGHNY-26SEP16 404s) — use kalshi_weather_index. The raw payload can exceed 400 KB for an active crypto event, so series are trimmed to `max_points` newest-first and `points_total` reports what existed.","inputs":[{"name":"event_ticker","type":"string","required":true,"description":"Kalshi event ticker, e.g. \"KXBTCD-26SEP1617\" (crypto) or \"KXUSCPIYEAR-37FEB01\" (economic series)."},{"name":"max_points","type":"number","required":false,"description":"Newest points to keep per series (default 200, max 2000). `points_total` always reports the untrimmed length."},{"name":"range","type":"string","required":false,"description":"Chart-range hint passed straight to Kalshi, e.g. \"15min\", \"1h\", \"1d\". Honoured only by types that support it; the response reports Kalshi's own `default_range` and any `selectable_periods` it adverti…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":448},{"name":"kalshi_game_stats","title":null,"description":"Live scoreboard and play-by-play for a sports game Kalshi has markets on, keyed by MILESTONE id (not event ticker) — Kalshi's `GET /live_data/milestone/{id}` plus `/game_stats`. Returns the current state (score, period/inning, status, last play, winner once final) and the play list, newest-first, each with its description, clock and score at the time. Get the milestone id from kalshi_milestones (its `related_event_tickers` is the bridge back to tradeable markets). COVERAGE, stated plainly: Kalshi documents play-by-play for Pro/College Football, Pro/College Basketball, WNBA, Soccer, Pro Hockey and Pro Baseball, and it comes from Sportradar — a milestone outside that set, or one Sportradar does not cover, returns HTTP 200 with an EMPTY play list, which this reports as plays_available:false rather than passing off an empty array as a game with no plays (verified live 2026-09-16: a college football game returned `{\"pbp\":{}}`).","inputs":[{"name":"limit","type":"number","required":false,"description":"Plays to return, newest first (default 25, max 500). `plays_total` reports how many existed."},{"name":"milestone_id","type":"string","required":true,"description":"Kalshi milestone UUID, e.g. \"ce57e3ef-6b6a-4680-a849-5965021aaac2\". Find one with kalshi_milestones(category:\"Sports\")."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":317},{"name":"kalshi_milestones","title":null,"description":"Kalshi's own index of the real-world OCCURRENCES its markets hang off — games, elections, hearings, launches — from `GET /milestones`. Each milestone carries a title, type (e.g. baseball_game, football_game, tennis_tournament_singles, election), category, start and end dates, source ids, and — the reason to use this — `primary_event_tickers` and `related_event_tickers`, which are Kalshi's OWN statement of which markets belong to the occurrence. That is the alternative to matching event titles by string, which is how you accidentally group two different games. Filter by category (\"Sports\", \"Elections\", ...), type, competition, related_event_ticker (reverse lookup: which milestone is this event part of?) or minimum_start_date; page with cursor. A milestone id is also the key for kalshi_game_stats.","inputs":[{"name":"category","type":"string","required":false,"description":"Kalshi category, exact words, e.g. \"Sports\" | \"Elections\" | \"Economics\" | \"Politics\"."},{"name":"competition","type":"string","required":false,"description":"Competition filter, e.g. \"NFL\", \"NBA\" (Kalshi's own spelling; many milestones carry none)."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor from a previous response."},{"name":"limit","type":"number","required":false,"description":"1-200 (default 50). Kalshi requires this parameter; we always send it."},{"name":"minimum_start_date","type":"string","required":false,"description":"RFC3339 timestamp; only milestones starting at or after it. Kalshi's default page is dominated by historical milestones, so pass this to see current ones."},{"name":"related_event_ticker","type":"string","required":false,"description":"Reverse lookup — return milestones linked to this event ticker."},{"name":"type","type":"string","required":false,"description":"Milestone type, e.g. \"baseball_game\", \"football_game\", \"basketball_game\", \"tennis_tournament_singles\", \"soccer_tournament_multi_leg\"."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":394},{"name":"kalshi_structured_targets","title":null,"description":"The ENTITIES Kalshi's markets are about, as Kalshi models them — players, teams, actors, films and similar — from `GET /structured_targets`. Each row has a stable id, a type — granular by sport, e.g. \"actor\", \"football_player\", \"soccer_team\", \"film\", \"company\", \"politician\", with NO bare \"player\" or \"team\" and no error for an unknown one (it returns an empty list, and the response names the known types when that happens), a name, source ids, and a type-specific `details` block (a player carries league, position, jersey, team_id; an actor carries films and social handles). Use it to resolve a name to the id Kalshi itself uses, so a market about a person can be tied to that person rather than to a string that happens to match. Filter by type, competition, or explicit ids; page with cursor (up to 2,000 per page). This is a reference index, not market data — nothing here carries a price.","inputs":[{"name":"competition","type":"string","required":false,"description":"Competition filter, e.g. \"NFL\", \"NCAAMB\". Same silent-empty behaviour as `type` for an unrecognised value."},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor from a previous response."},{"name":"ids","type":"array","required":false,"description":"Explicit structured-target ids to fetch. A comma-separated string is accepted too."},{"name":"page_size","type":"number","required":false,"description":"1-2000 (default 100)."},{"name":"type","type":"string","required":false,"description":"Entity type. Kalshi's types are GRANULAR BY SPORT and there is no bare \"player\", \"team\" or \"athlete\" — an unknown value returns 200 with an EMPTY list rather than an error. Seen live 2026-09-16: acto…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":462},{"name":"kalshi_weather_index","title":null,"description":"Kalshi's OWN city temperature index — the minute-resolution series that its hourly temperature markets settle against, from `GET /live_data/weather/{city}`. This is not a weather forecast and not a single station: it is the number Kalshi computes from a weighted multi-station panel, in Fahrenheit to 0.01, which is the only series a temperature contract actually resolves on. Each point carries `contributors` (how many stations reported) and `status`; a minute where the quorum failed is reported rather than interpolated. CITY IS AN INDEX ID, NOT A PLACE NAME, and Kalshi supports exactly thirteen (verified live 2026-09-16 from Kalshi's own rejection message): miami, dfw, houston, phl-delaware-valley, puget-sound, sf-bay, greater-boston, southeast-michigan, kansas-city, minneapolis-st-paul, nyc, chicago, la-coastal. An unknown city is a clean error listing those. The series is city-keyed and independent of any event, so it exists even when no market is open. For the station weights and offsets behind the number, and every recalibration, use kalshi_weather_index_calibrations.","inputs":[{"name":"city","type":"string","required":true,"description":"Index city id — one of: miami, dfw, houston, phl-delaware-valley, puget-sound, sf-bay, greater-boston, southeast-michigan, kansas-city, minneapolis-st-paul, nyc, chicago, la-coastal."},{"name":"detailed","type":"boolean","required":false,"description":"Include Kalshi's per-station audit readings on every point (much larger response)."},{"name":"from","type":"number","required":false,"description":"Window start, unix MILLISECONDS (Kalshi's unit here, not seconds). Overrides last_sec when given with `to`."},{"name":"last_sec","type":"number","required":false,"description":"Window length ending now, in seconds (default 3600). The series is per-minute, so a window under ~120s can legitimately return zero points — that is a real empty window, not a failure, and `points` s…"},{"name":"max_points","type":"number","required":false,"description":"Newest points to keep (default 500, max 5000). `points_total` reports the untrimmed count."},{"name":"to","type":"number","required":false,"description":"Window end, unix MILLISECONDS, inclusive. Defaults to now."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":493},{"name":"kalshi_weather_index_calibrations","title":null,"description":"How a Kalshi city temperature index is COMPUTED, and every time that changed — `GET /live_data/weather/{city}/calibrations`. Returns the launch configuration plus each weekly offset calibration and methodology update in ascending effective order: per-station weights, per-station offsets in Celsius, the city reference, the config version string, the calibration window and Kalshi's stated reason for the change. This is the audit trail behind kalshi_weather_index: it is what lets you reproduce an index value from raw station data, and what tells you whether a settlement dispute falls before or after a methodology change. Same thirteen city ids as kalshi_weather_index.","inputs":[{"name":"city","type":"string","required":true,"description":"Index city id — miami, dfw, houston, phl-delaware-valley, puget-sound, sf-bay, greater-boston, southeast-michigan, kansas-city, minneapolis-st-paul, nyc, chicago, la-coastal."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":208}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T06:22:21.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"verified","label":"Verified","reason":"verified","reasonLabel":"Verified","discovery":"attestation_endpoint","discoveryLabel":"Registry attestation endpoint","sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":0,"partial":false,"deprecated":null,"stale":null,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-29","recent":[{"id":"chg_01a1aa5f-6714-7a03-9503-a0e0edd41259","kind":"score.total_changed","summary":"Trust score (81 → 82)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a1aa5f-6714-7a03-9503-a0e0edd41259"},{"id":"chg_01a1a010-f83d-7e6d-8d26-180be1755022","kind":"score.total_changed","summary":"Trust score (65 → 81)","materiality":"functional","direction":"improvement","scoreDelta":16,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a1a010-f83d-7e6d-8d26-180be1755022"},{"id":"chg_01a1a010-f82f-781e-ae7a-c24e3060913e","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a1a010-f82f-781e-ae7a-c24e3060913e"},{"id":"chg_01a19e36-825f-72cb-9b88-9699ea7d3e83","kind":"score.total_changed","summary":"Trust score (80 → 65)","materiality":"functional","direction":"regression","scoreDelta":-15,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a19e36-825f-72cb-9b88-9699ea7d3e83"},{"id":"chg_01a19e36-825e-7c4b-b554-b9f8e854d51e","kind":"package.version_changed","summary":"Package version (0.3.0 → 0.3.1)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a19e36-825e-7c4b-b554-b9f8e854d51e"},{"id":"chg_01a19e36-825d-79e3-8cdd-ee2a85ef0f23","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a19e36-825d-79e3-8cdd-ee2a85ef0f23"},{"id":"chg_01a19098-8b95-7e09-b1ca-267a8247ef6f","kind":"score.total_changed","summary":"Trust score (79 → 80)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a19098-8b95-7e09-b1ca-267a8247ef6f"},{"id":"chg_01a18673-adfc-74c7-b062-486a66517504","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a18673-adfc-74c7-b062-486a66517504"},{"id":"chg_01a18619-8faf-7e22-a62c-618d32dabfaa","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi#chg-chg_01a18619-8faf-7e22-a62c-618d32dabfaa"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi/changelog.json"},"links":{"html":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi","markdown":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi.md","changelogJson":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi/changelog.json","changelogRss":"https://verifymcp.io/servers/pipeworx-io-kalshi/pipeworx-mcp-kalshi.xml","external":[{"label":"npm package","href":"https://www.npmjs.com/package/@pipeworx/mcp-kalshi"},{"label":"Socket report","href":"https://socket.dev/npm/package/@pipeworx/mcp-kalshi"},{"label":"Repository","href":"https://github.com/pipeworx-io/mcp-kalshi"},{"label":"Website","href":"https://pipeworx.io/packs/kalshi"}]}}