Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Kalshi

NPM · @PIPEWORX/MCP-KALSHI · 2 COMPONENTS

Kalshi MCP — US-regulated prediction-market data (no auth on public reads).

+3 this week 82 Trust /100

Last scanned (12 hours ago)

Scores higher than 72% of npm servers

Category Finance and Payments

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to pipeworx-io/mcp-kalshi). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 2 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability62
  • AI-judged instruction clarity (excellent).Pass
  • 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. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 19 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
What we tested

Checks we ran (16)

  • Malware scan
  • Known CVEs
  • Install scripts
  • Dependency health
  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 3 Nov 26 +16
    • Malware scan: unverified → pass ▲ security
  • 2 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 0.3.0 → 0.3.1 functional
  • 31 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

  • 29 Oct 26 79

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@pipeworx/mcp-kalshi@0.3.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo pipeworx-io/mcp-kalshi
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/pipeworx-io/mcp-kalshi/.github/workflows/publish.yml@refs/heads/main
Rekor log index 3649533683
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:68cafe76dd3406f1ab1acfc7686f35ea77823ee7f423fc4b399a9680b57682d64a290ab4ca8d30a56a0aa5a9b75ec5932a48412b397fa942c5c849061

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 19 exposed · ~5,980 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
kalshi_candlesticks ~421

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.

NameTypeReqDescription
end_tsstring–Window END — same formats. Defaults to now.
intervalstring–"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…
lookback_daysnumber–Sugar for a window ending now (1-365, default 1). Ignored when both start_ts and end_ts are given.
start_tsstring–Window START — ISO date ("2026-09-01"), ISO datetime, or unix seconds.
tickersarrayyesMarket tickers, 1-100 (e.g. ["KXHIGHNY-26SEP16-B75.5","KXHIGHNY-26SEP16-B77.5"]). A comma-separated string is accepted too.

No output schema declared.

No examples provided.

kalshi_event ~437

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.

NameTypeReqDescription
event_tickerstringyesKalshi event ticker, e.g. "KXFED-26OCT"
include_orderbookboolean–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…

No output schema declared.

No examples provided.

kalshi_event_live_data ~448

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.

NameTypeReqDescription
event_tickerstringyesKalshi event ticker, e.g. "KXBTCD-26SEP1617" (crypto) or "KXUSCPIYEAR-37FEB01" (economic series).
max_pointsnumber–Newest points to keep per series (default 200, max 2000). `points_total` always reports the untrimmed length.
rangestring–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…

No output schema declared.

No examples provided.

kalshi_events ~329

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.

NameTypeReqDescription
categorystring–Kalshi category, exact words: Politics | Elections | Economics | Financials | Crypto | Companies | Commodities | Climate and Weather | Science and Technology | Sports | Entertainment | World | Health…
cursorstring–Pagination cursor
limitnumber–1-200 (default 100)
series_tickerstring–e.g. "KXFED"
statusstring–open | closed | settled (default open)

No output schema declared.

No examples provided.

kalshi_exchange_status ~38

Exchange-level status: is the trading floor open, are deposits/withdrawals enabled, any scheduled maintenance. Cheap check before a batch script.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

kalshi_game_stats ~317

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":{}}`).

NameTypeReqDescription
limitnumber–Plays to return, newest first (default 25, max 500). `plays_total` reports how many existed.
milestone_idstringyesKalshi milestone UUID, e.g. "ce57e3ef-6b6a-4680-a849-5965021aaac2". Find one with kalshi_milestones(category:"Sports").

No output schema declared.

No examples provided.

kalshi_macro ~141

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.

NameTypeReqDescription
topicstringyesFed | BTC | ETH | CPI | GDP | SP500 | Recession

No output schema declared.

No examples provided.

kalshi_market ~185

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.

NameTypeReqDescription
tickerstringyesKalshi market ticker, e.g. "KXFED-26OCT-T3.50"

No output schema declared.

No examples provided.

kalshi_markets ~567

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.

NameTypeReqDescription
cursorstring–Pagination cursor from previous response
event_tickerstring–Filter to one event (e.g. "KXFED-26OCT")
keywordstring–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…
limitnumber–1-1000 (default 100)
series_tickerstring–Filter to one series (e.g. "KXFED" for Fed funds rate)
statusstring–open | closed | settled (default open)

No output schema declared.

No examples provided.

kalshi_milestones ~394

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.

NameTypeReqDescription
categorystring–Kalshi category, exact words, e.g. "Sports" | "Elections" | "Economics" | "Politics".
competitionstring–Competition filter, e.g. "NFL", "NBA" (Kalshi's own spelling; many milestones carry none).
cursorstring–Pagination cursor from a previous response.
limitnumber–1-200 (default 50). Kalshi requires this parameter; we always send it.
minimum_start_datestring–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.
related_event_tickerstring–Reverse lookup — return milestones linked to this event ticker.
typestring–Milestone type, e.g. "baseball_game", "football_game", "basketball_game", "tennis_tournament_singles", "soccer_tournament_multi_leg".

No output schema declared.

No examples provided.

kalshi_orderbook ~85

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.

NameTypeReqDescription
depthnumber–Levels to return per side (default 5, max 100)
tickerstringyesKalshi market ticker

No output schema declared.

No examples provided.

kalshi_orderbooks ~389

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.

NameTypeReqDescription
depthnumber–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…
tickersarrayyesMarket 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…

No output schema declared.

No examples provided.

kalshi_price_history ~539

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.

NameTypeReqDescription
cursorstring–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…
end_tsstring–Window END — same formats as start_ts. Defaults to now when omitted.
intervalstring–"1h" (hourly) | "1d" (daily, default) | "1m" (per-minute). Coarser intervals cover longer history per request.
lookback_daysnumber–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.
start_tsstring–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.
tickerstring–Kalshi market ticker (e.g. "KXFEDDECISION-28JAN-H26"). The series is derived from the ticker automatically. Required unless you are passing `cursor`.

No output schema declared.

No examples provided.

kalshi_series ~84

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.

NameTypeReqDescription
categorystring–Politics | Economics | Climate | Sports | Science | World
limitnumber–1-1000 (default 200)

No output schema declared.

No examples provided.

kalshi_structured_targets ~462

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.

NameTypeReqDescription
competitionstring–Competition filter, e.g. "NFL", "NCAAMB". Same silent-empty behaviour as `type` for an unrecognised value.
cursorstring–Pagination cursor from a previous response.
idsarray–Explicit structured-target ids to fetch. A comma-separated string is accepted too.
page_sizenumber–1-2000 (default 100).
typestring–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…

No output schema declared.

No examples provided.

kalshi_top_markets ~289

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.

NameTypeReqDescription
bystring–volume (default, all-time contracts traded) | volume_24h | open_interest | liquidity
limitnumber–1-50 (default 10)
statusstring–"open" (default — only markets not yet past close_time) | "any" (include markets whose close_time has passed, still excludes settled/resulted ones)

No output schema declared.

No examples provided.

kalshi_trades ~154

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`.

NameTypeReqDescription
limitnumber–1-1000 (default 50)
tickerstringyesKalshi market ticker

No output schema declared.

No examples provided.

kalshi_weather_index ~493

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.

NameTypeReqDescription
citystringyesIndex 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.
detailedboolean–Include Kalshi's per-station audit readings on every point (much larger response).
fromnumber–Window start, unix MILLISECONDS (Kalshi's unit here, not seconds). Overrides last_sec when given with `to`.
last_secnumber–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…
max_pointsnumber–Newest points to keep (default 500, max 5000). `points_total` reports the untrimmed count.
tonumber–Window end, unix MILLISECONDS, inclusive. Defaults to now.

No output schema declared.

No examples provided.

kalshi_weather_index_calibrations ~208

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.

NameTypeReqDescription
citystringyesIndex 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.

No output schema declared.

No examples provided.

Install

How do I install the Kalshi MCP server?

Kalshi runs locally as an npm package, launched with npx -y @pipeworx/mcp-kalshi. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @pipeworx/mcp-kalshi

# add to Claude Code
claude mcp add pipeworx-io-kalshi -- npx -y @pipeworx/mcp-kalshi
Common questions

What is the Kalshi MCP server?

Kalshi is an MCP server listed in the public MCP registry as io.github.pipeworx-io/kalshi. Kalshi MCP, US-regulated prediction-market data (no auth on public reads). This page covers its npm package (@pipeworx/mcp-kalshi).

Is the Kalshi MCP server safe to use?

Kalshi scores 82 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Kalshi MCP server expose?

Kalshi exposes 19 tools: kalshi_markets, kalshi_market, kalshi_events, kalshi_event, kalshi_series, and 14 more. Their descriptions and schemas cost roughly 5,980 tokens of context every time the server is loaded.

Is the Kalshi MCP server still maintained?

Kalshi is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Kalshi MCP server under?

Kalshi declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the Kalshi MCP server?

VerifyMCP ran 16 checks on Kalshi, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.