oddsrail
This MCP server lets an AI assistant research, price, validate, and execute prediction-market trades on Polymarket and Kalshi, with dry-run paper trading and operator guardrails by default.
Search and inspect Polymarket/Kalshi markets, details, resolution criteria, closing-soon lists, and cross-venue matches/settlement audits.
Read live order books, price history, stream book updates, quote real execution cost, and check positions, balances, fills, and open orders.
Run signals and risk/sizing helpers: overshoot/fade signal, dispute risk, and capped fractional-Kelly position sizing.
Pre-check proposed orders deterministically for intent, side, price, size/minimum, liquidity, resolution source, and guardrails.
Place and cancel limit orders, place Kalshi orders, and use cancel-all as a kill switch; live trading is opt-in and keys stay local.
Paper trade Polymarket orders against the live book, inspect paper positions/P&L, and reset the paper ledger.
Manage positions gaslessly via relayer: split, merge, redeem, and list redeemable/mergeable positions.
Inspect builder attribution, attribution ledger, and server/dry-run/geoblock/reachability status.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oddsrail find Polymarket World Cup final markets and run overshoot on the favorite"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
oddsrail
An MCP server that lets your AI assistant trade on Polymarket (and Kalshi) without handing your keys to anyone.
Point your MCP client at it and your assistant can search markets, read order books, work out what an order would really cost, and place orders. Orders are signed on your own machine. Everything starts in dry-run: Polymarket orders fill against the live order book into a paper account (Kalshi dry-run orders just show what would be sent), so you can watch what your agent does before any money is involved.
We built it after tripping over the Polymarket API ourselves. Rejected orders
come back as normal responses with ok: false. Order books arrive sorted worst
price first. The "trades" endpoint returns everyone's trades, not just yours.
Marketable orders under $1 fail, and that minimum isn't documented. oddsrail
handles each one.
That's a real check on a live market. The agent meant to buy NO, built the
order on the YES side, and check_order blocked it. Polymarket would have
taken it as a normal order.
Before you start. These are tools, and nothing here is financial advice. You decide every order. Prediction markets are restricted in a lot of places, so check that you're allowed to trade where you live. oddsrail is an independent project, not affiliated with or endorsed by Polymarket or Kalshi.
If oddsrail is useful to you, a ⭐ on this repo helps other people find it.
Install
You need Python 3.11 or newer.
pip install oddsrailAdd it to your MCP client as a local (stdio) server: the command is oddsrail,
with no arguments. For clients that use JSON config:
{"mcpServers":{"oddsrail":{"command":"oddsrail","args":[]}}}Have your assistant run server_info first. It shows whether you're in
dry-run, which builder code orders will carry, and whether Polymarket is
reachable from your network. Then try something like "search markets about
the next Fed rate decision and run the overshoot signal on the favorite".
Client | How |
Any agent that reads skills |
|
Cursor | |
VS Code | |
Anything else that speaks MCP over stdio |
|
The plugin and the one-click links start the server with uvx, so they need
uv installed. Without uv, pip install oddsrail
gives you an oddsrail command you can point any client at.
To run from a clone without installing:
python3 -m venv .venv && .venv/bin/pip install -r requirements.txtThen use /abs/path/to/oddsrail/.venv/bin/python with arguments
["-m", "oddsrail.server"] in your client's config.
Setup guides, wallet notes and trading limits are in the documentation.
Related MCP server: telekash-mcp-server
What's in it
42 tools and four workflow prompts.
Polymarket data:
search_markets,get_market,get_orderbook,price_history,get_positions,resolution_criteria(what resolves YES, who decides, from which sources),closing_soon, andwatch_book, which streams live book updates for up to 60 seconds.Costs and signals:
quote_costwalks the order book for your size and returns the average fill price, slippage, notional and the market's fee schedule where Polymarket publishes one (fees aren't added into the cost).overshoot_signalflags sudden price jumps and shows how far earlier jumps in the same window came back.dispute_riskis a rough 0 to 100 heuristic, with its reasons, for how likely a market's resolution is to be contested.position_sizeis capped fractional Kelly sizing that refuses bets with negative edge.Checking an order:
check_order(more below).Trading:
place_order,cancel_order,open_orders,order_status,my_fills,my_positions,my_balance, andcancel_all_ordersas the emergency stop. Prices are probabilities between 0 and 1 and sizes are in shares, so an order's notional is price times size.Gasless position management:
split_position,merge_positionsandredeem_positionsgo through Polymarket's relayer;redeemable_positionslists what your wallet could redeem or merge right now.Paper trading:
paper_positions,paper_reset.Kalshi: search, market details, order book, recent trades, balance, positions, open orders, placing and cancelling (
kalshi_*, nine tools).Across venues:
find_markets,compare_venuesandsettlement_audit. A price gap between two venues is not free money; the settlement audit checks whether the two markets actually resolve the same way.Attribution and status:
builder_stats,attribution_ledger,server_info.
The prompts (find_fade_setup, check_cross_venue_edge, settle_resolved,
daily_review) each walk an agent through one job step by step.
find_fade_setup, for example, goes signal, book, cost, resolution rules,
size, check, then a dry-run order. The skills in
skills/ are generated from those prompts, and a test fails if they drift
apart.
Checking orders before they go out
check_order compares the order your agent built with a short paraphrase of
what was asked for and with the live market. It checks that the market exists
and is open, that the wording matches the market and the YES or NO side, that
the price makes sense against the book, that the size clears Polymarket's $1
minimum and your limits, that there's liquidity within your price, and that a
resolution source is named. You get ok, caution or block, with the
evidence for each check. There's no model involved; it's plain Python checks.
It only runs when your agent calls it. place_order doesn't call it for you,
so tell your agent to check every order first.
Staying safe
Dry-run is the default. Only
ODDSRAIL_DRY_RUN=0(orfalse, orno) turns on live trading. Any other value keeps you in dry-run.Paper orders persist. In dry-run, Polymarket orders fill against the live book into a local paper ledger (
~/.oddsrail/paper.json, starting at $1,000). Whatever doesn't fill rests and can fill later if the market crosses it. Paper fills ignore queue position, latency, market impact and fees, so treat paper results as a best case.Limits no tool can change. You set them as environment variables (see Configuration). The per-order cap and the allowed markets apply in dry-run too; the session cap and the open-order cap count live orders only. They're checked before anything is sent, and a refusal says exactly which rule stopped the order:
{"accepted": false, "blocked_by": "guardrail", "rule": "max_order_notional", "limit": 25.0, "requested": 99.5, "note": "refused by an operator-set guardrail ... Nothing was sent."}The session budget resets when the server restarts.
server_infoshows your limits and how much of the session budget is used.Clients can ask before trading. Every tool that places or cancels orders or moves funds is marked destructive in its MCP annotations, so clients that support it can ask you to approve each call.
Going live
Set POLYMARKET_PRIVATE_KEY (and POLYMARKET_WALLET_ADDRESS if your account
uses a proxy or deposit wallet), set ODDSRAIL_DRY_RUN=0 and restart. The key
stays on your machine; Polymarket gets signed orders and API credentials
derived from the key, never the key itself.
For gasless split, merge and redeem, create your own relayer key at
polymarket.com (Settings, Relayer API keys) and set
POLYMARKET_RELAYER_API_KEY and POLYMARKET_RELAYER_API_KEY_ADDRESS. Without
both, those tools send nothing; they never fall back to paying gas from your
wallet. Polymarket allows 100 relayer requests a day for unverified builders
and 10,000 for verified ones.
A 1 USDC split and merge through the relayer on 2026-09-02 is written up in
the live verification notes. redeem_positions hasn't
been exercised live yet, because the test account hasn't held a resolved
winning position.
Fees and builder codes
oddsrail is free, and it adds nothing to your trades. By default your orders
carry our builder code (0xa576c5ce…, registered at 0 bps for both makers and
takers), so Polymarket attributes the volume to the project without charging
you anything for it. Orders sent from this server earn the project a share of
Polymarket's weekly builder rewards, which Polymarket pays from its own
program. Separately, oddsrail.app's links to Polymarket and its Perps
authorizations carry our referral code, which pays the project a share of
Polymarket's own fee without changing yours. There's no paid tier.
You can use your own code instead. Get one at polymarket.com (Settings,
Builders), where you set your own fee rates (takers up to 100 bps and makers
up to 50 bps, on top of platform fees, paid to your builder wallet), and set
ODDSRAIL_BUILDER_CODE. The code goes into the order before it's signed, so
attribution is on-chain. server_info shows which code is in use and
builder_stats lets you check the attribution. The oddsrail builder profile
was verified in Polymarket's builder program on 2026-09-02.
The hosted version
If you'd rather not install anything, add https://mcp.oddsrail.app/mcp as a
remote MCP server in a client that supports OAuth, and sign in with your email
(you get a one-time link). Example prompts and troubleshooting are in the
hosted connector docs.
The connector is paper trading only. Each account gets a $1,000 paper
bankroll that fills against the live Polymarket book. Its tools use no wallet
keys and never send a real order, and Kalshi isn't available there. It has 22
of the 42 tools; oddsrail/hosted.py shows exactly which are removed and why:
Market data:
search_markets,find_markets,get_market,get_orderbook,price_history,watch_book,closing_soon,resolution_criteria,get_positionsCosts and signals:
overshoot_signal,dispute_risk,quote_cost,position_sizePaper trading:
check_order,place_order,cancel_order,paper_positions,paper_resetA public paper arena:
arena_register,arena_unregister,arena_statusStatus:
server_info
Your account holds your email address, the sign-in records for the client you connected, your paper ledger and, only if you set them up, an arena entry or a hosted paper agent. The details are in the privacy policy.
The website at oddsrail.app also runs hosted agents and a leaderboard. Real-money hosted agents are a small pilot for allowlisted wallets, use a session key for a Deposit Wallet, and don't go through these tools. Signing in to the website with a wallet lists it on the public leaderboard under a shortened address; the privacy policy explains how to be removed. The hosted service and the website are developed in a separate private repository. This repository is the MCP server.
Where it works
Two different things can stop an order, and they look different.
Polymarket's own restrictions apply to orders, not connections. Market data loads normally and then orders get rejected. A few places are blocked completely; many more are close-only, meaning you can close positions but not open new ones. That list includes the United States, the United Kingdom, France, Germany and Australia, among others. In sanctioned places you can't even close positions, and a few countries (Ireland, Japan, the Netherlands, and Malta for sports) are close-only on Polymarket's website but not through the API. The list changes without notice, so check Polymarket's list rather than relying on this README.
Network filters block the connection itself. Turkish ISPs block polymarket.com, for example, even though Polymarket doesn't restrict Turkey. You'll see DNS failures, TLS errors or an ISP page where data should be. oddsrail tells your agent which of the two it ran into.
oddsrail doesn't support Polymarket US (polymarket.us). That's a separate, CFTC-regulated exchange with its own API, keys and SDK.
server_info reports Polymarket's verdict for your IP address, but that's a
network probe, not a compliance check. Polymarket's terms ask you to confirm
you're not a US person, not in a restricted jurisdiction and not using a VPN
to get around restrictions. That's between you and Polymarket; if it matters
for you, get legal advice.
Privacy and network access
The local server has no telemetry or analytics and never contacts oddsrail.app or any other server we run. It only talks to the venues and blockchain hosts below, and only when a tool needs them. Each of them sees your IP address.
Host | When | What is sent |
| market search, details and listings ( | your search text and the market ids, slugs or token ids asked about |
| order books ( | token ids and builder codes; with a key, orders signed on this machine and requests authenticated with credentials derived from the key. The private key itself is never sent. |
| price history, positions, fills, portfolio value, builder leaderboard | token ids and the wallet address being looked up (the configured wallet for |
|
| the token id subscribed to |
|
| the request itself, so Polymarket can report this IP's jurisdiction verdict |
| with a trading key, wallet checks when the trading client starts; with your relayer key, gasless | your wallet address, signed transactions and your relayer API key |
a public Polygon RPC ( | on-chain reads the SDK makes for the gasless tools, such as balances and gas estimates | public wallet and contract addresses |
|
| search text and tickers; with your Kalshi key, requests signed on this machine |
server_info also sends one unauthenticated reachability check each to
gamma-api, clob, data-api and external-api.kalshi.com (plus the relayer when a
trading key is set). Installing with pip or uvx downloads packages from
PyPI through your package manager.
Your keys, the limit counters and the paper ledger stay on your machine. Your AI client sees every tool call and result, under its provider's own policy.
Configuration
Variable | Default | Meaning |
|
| Orders are simulated, never posted. Only |
| project default | Your bytes32 builder code, used instead of the project's 0 bps default. |
| unset | Your wallet key, needed only for real trading. It never leaves this machine. |
| unset | Proxy or deposit wallet address, if your account uses one. |
| unset | Your own relayer API key, for gasless |
| unset | The address the relayer key was issued for. Both halves are required. |
| unset | Limit: maximum USDC per order. Applies in dry-run too. |
| unset | Limit: maximum total USDC of live orders sent by this server process. |
| unset | Limit: maximum resting orders on the account (live; checked with the venue before placing). |
| unset | Limit: comma-separated market identifiers you allow. For Polymarket, use exact outcome token ids. Anything else is refused. |
|
| Paper-trade dry-run Polymarket orders against the live book. |
|
| Where the paper ledger lives. |
|
| Starting paper cash in USDC. |
| unset | Your Kalshi API key id, needed for Kalshi account and trading tools. |
| unset | Path to your Kalshi private key (PKCS#8 PEM). |
| unset |
|
If watch_book fails with CERTIFICATE_VERIFY_FAILED while everything else
works, your Python has no CA bundle (common with the python.org installer on
macOS). Run Install Certificates.command from the Python folder in
Applications, or set SSL_CERT_FILE to the path printed by
python -m certifi.
Polymarket Protocol V2
Polymarket is rolling out a new Protocol V2. It's separate from the CLOB V2
order format this server already uses for builder attribution, so don't read
one as support for the other. The 0.20.0 release candidate on main updates
the SDK and market discovery for V2, but live V2 orders and split, merge and
redeem on V2 markets are refused before signing until they've been tested with
real funds. The stable desktop bundle still pins oddsrail==0.19.0. Details
are in the readiness notes.
Other options
If you're comparing tools: pmxt covers many more venues, offers a hosted mode and has a much bigger community. Simmer has a virtual-money sandbox, stop-loss and take-profit, and a strategy marketplace. Polymarket's own agent-skills document the API, including deposits and bridging, which oddsrail doesn't cover. oddsrail is narrower: self-hosted, your keys, your builder code, and a check that catches wrong-side or mispriced orders. (Compared in September 2026; these projects move quickly.)
Tests
The test suite runs offline in CI on Python 3.11, 3.12 and 3.13 and covers spending limits, concurrent submissions, order reconciliation, book walking, sizing, dry-run behavior and attribution. See the testing guide for the locked environment and commands. The latest release check placed no funded orders, and the live relayer test above was done with version 0.10.1.
Security
Please report vulnerabilities privately, not in a public issue. See SECURITY.md.
License
MIT. The MCP server in this repository is open source; the hosted service and the website are not.
Available Tools
42 toolsattribution_ledgerARead-onlyIdempotentInspect
Attribution ledger for the builder code in use: every trade carrying it, aggregated per Sunday-start week and per wallet, with the maintainer's own wallets split out into an honest 'external' line. Built from Polymarket's own public builder feed, so any figure it reports can be checked at data-api.polymarket.com/v1/builders/leaderboard.
Inputs: no named parameters.
builder_statsARead-onlyIdempotentInspect
Builder attribution stats: the public builder leaderboard, and (if ODDSRAIL_BUILDER_CODE is set) matched trades attributed to this operator's code.
Inputs: time_period.
cancel_all_ordersADestructiveInspect
KILL SWITCH — cancel every resting Polymarket order on the operator account at once. Use when exposure must go to zero fast. Respects dry-run.
Inputs: no named parameters.
cancel_orderBDestructiveInspect
Cancel an open order by id (respects dry-run).
Inputs: order_id (required).
check_orderARead-onlyIdempotentInspect
CHECK BEFORE YOU PLACE: deterministic verification of a proposed order against the operator's intent, the live market and the guardrails. Pass the operator's own words as intent. Returns ok / caution / block with the evidence per check (market exists and is open, intent matches the market and the YES/NO side, price is sane vs the book, size and $1 minimum, guardrails, liquidity, resolution source) plus a one-line read-back. No model judges anything; nothing is sent.
Inputs: side (required), size (required), price (required), venue (required), +3 more.
closing_soonARead-onlyIdempotentInspect
Markets closing within N hours on either venue, by volume — where trading activity concentrates.
Inputs: hours, limit, venues.
compare_venuesARead-onlyIdempotentInspect
Find markets that may be the SAME event on both Polymarket and Kalshi. NOT an arbitrage scanner: matches are candidates from title similarity plus a close-date check, and a price difference between two candidates is not profit. Identical wording does not mean identical resolution criteria — read both, and run quote_cost on each leg, before acting.
Inputs: query (required), limit, min_similarity, max_close_days_apart.
dispute_riskARead-onlyIdempotentInspect
PREMIUM SIGNAL — dispute-risk triage. Scores 0-100 how likely a market's resolution gets contested (UMA dispute risk) with transparent reasons. Takes the market slug, the Gamma id, or a CLOB token id (the market_id a search returns).
Inputs: id_or_slug (required).
find_marketsARead-onlyIdempotentInspect
Search BOTH Polymarket and Kalshi at once and return one normalised shape per market: venue, market_id (the id that venue's place_order takes), title, yes/no price as probabilities in (0,1), best bid/ask, spread, 24h volume, close time. Use this instead of the per-venue search tools when you do not already know the venue.
Inputs: query (required), limit, venues.
get_marketARead-onlyIdempotentInspect
Get one market's details. Accepts the market slug, the Gamma market id, or either of its CLOB token ids (the market_id that find_markets and search_markets return), so a token id from a search can be passed straight in.
Inputs: id_or_slug (required).
get_orderbookBRead-onlyIdempotentInspect
Get the live orderbook (bids/asks) for a CLOB token id.
Inputs: token_id (required).
get_positionsCRead-onlyIdempotentInspect
Current positions for a wallet address.
Inputs: address (required), limit.
kalshi_balanceARead-onlyIdempotentInspect
Kalshi account balance (needs the operator's API key).
Inputs: no named parameters.
kalshi_cancel_orderADestructiveInspect
Cancel a Kalshi order by id (respects dry-run).
Inputs: order_id (required).
kalshi_get_marketBRead-onlyIdempotentInspect
Get one Kalshi market by ticker.
Inputs: ticker (required).
kalshi_get_orderbookARead-onlyIdempotentInspect
Kalshi orderbook for a ticker, normalised to a YES-book bid/ask view (Kalshi publishes bid ladders only; asks are derived as 1 - NO bid). Raw ladders included.
Inputs: ticker (required), depth.
kalshi_get_tradesBRead-onlyIdempotentInspect
Recent public trades for a Kalshi ticker.
Inputs: ticker (required), limit.
kalshi_open_ordersDRead-onlyIdempotentInspect
Kalshi resting orders (needs the operator's API key).
Inputs: limit.
kalshi_place_orderBDestructiveInspect
Place a Kalshi limit order. State it naturally: outcome yes|no, action buy|sell, price = probability of THAT outcome in (0,1). Translated to Kalshi's YES-book bid/ask internally. DRY-RUN by default.
Inputs: count (required), price (required), action (required), ticker (required), +2 more.
kalshi_positionsDRead-onlyIdempotentInspect
Kalshi positions (needs the operator's API key).
Inputs: limit.
kalshi_search_marketsARead-onlyIdempotentInspect
Search Kalshi markets. Kalshi has no text-search endpoint, so this pages open markets and filters on title/ticker; auto-generated MVE combo shards are excluded. Prices are dollar strings, not cents.
Inputs: limit, query, min_volume.
merge_positionsADestructiveInspect
Merge matching YES+NO shares back into USDC, GASLESS via the relayer. amount is in shares, or 'max' for the largest balanced amount held. Needs the operator's relayer key. DRY-RUN by default.
Inputs: condition_id (required), amount.
my_balanceARead-onlyIdempotentInspect
Authenticated Polymarket cash and allowance snapshot for an existing configured wallet. Cash is separate from positions value; available-to-trade remains unknown until outstanding orders and unsettled fills are reconciled. Requires local account credentials. In simulation use paper_positions.
Inputs: no named parameters.
my_fillsBRead-onlyIdempotentInspect
Recent executions (fills) for the operator wallet — confirms what actually traded, with tx hashes.
Inputs: limit.
my_positionsARead-onlyIdempotentInspect
The operator's current Polymarket positions (uses the configured wallet; no address needed).
Inputs: limit.
open_ordersARead-onlyIdempotentInspect
List the operator wallet's open orders.
Inputs: no named parameters.
order_statusARead-onlyIdempotentInspect
Status of one Polymarket order: resting, partially filled, filled, or gone. The lifecycle answer an agent needs after place_order.
Inputs: order_id (required).
overshoot_signalBRead-onlyIdempotentInspect
PREMIUM SIGNAL — overshoot/fade detector. Analyzes a token's recent price series for fresh panic jumps and reports whether a fade setup is active plus this market's historical reversion tendency.
Inputs: token_id (required), hours, threshold, lookback_s.
paper_positionsARead-onlyIdempotentInspect
Paper-trading portfolio for dry-run: cash, positions at current marks, realized and unrealized P&L, resting paper orders (filled here if the market has crossed them). Dry-run Polymarket orders are papered against the live book automatically. Simulated: no queue, no impact, no fees, so results are an upper bound.
Inputs: no named parameters.
paper_resetADestructiveInspect
Reset the paper-trading ledger to its starting bankroll (ODDSRAIL_PAPER_BANKROLL, default 1000 USDC). Deletes simulated fills and positions; touches nothing real.
Inputs: no named parameters.
place_orderADestructiveInspect
Place a limit order. DRY-RUN by default: returns the order it would post. Real trading needs ODDSRAIL_DRY_RUN=0 and POLYMARKET_PRIVATE_KEY. The operator's builder code is signed into the order. price is the implied probability in (0,1); size is in SHARES (notional = price * size), and the exchange enforces a $1 minimum notional on marketable orders. post_only=True rejects rather than crosses the book.
Inputs: side (required), size (required), price (required), token_id (required), +1 more.
position_sizeARead-onlyIdempotentInspect
Fractional-Kelly position size for a binary contract, given your bankroll, the market price, and YOUR fair value estimate. Caps at a fraction of full Kelly and refuses negative-edge bets. Returns its assumptions — subtract quote_cost before trusting the number.
Inputs: price (required), fair_value (required), bankroll_usd (required), max_fraction_of_kelly.
price_historyBRead-onlyIdempotentInspect
Recent price history for a CLOB token id: hours back, at fidelity_minutes resolution.
Inputs: token_id (required), hours, fidelity_minutes.
quote_costARead-onlyIdempotentInspect
What a given size would ACTUALLY cost, by walking the order book rather than reading the top level. Returns average fill price, slippage vs best, notional, and the levels consumed — plus the venue's fee schedule where it publishes one. Call this before sizing any trade, and on both legs before acting on a cross-venue gap.
Inputs: side (required), size (required), venue (required), market_id (required).
redeemable_positionsARead-onlyIdempotentInspect
What the operator can turn back into USDC now: redeemable (resolved, winning) positions and mergeable (hold both YES and NO) positions, with the ids the gasless tools take. Uses the configured wallet.
Inputs: limit.
redeem_positionsADestructiveInspect
Redeem the winning shares of a RESOLVED market for USDC, GASLESS via the relayer. Pass exactly one of condition_id or market_id. Needs the operator's relayer key. DRY-RUN by default.
Inputs: market_id, condition_id.
resolution_criteriaARead-onlyIdempotentInspect
READ BEFORE TRUSTING A PRICE: the full resolution contract for a market — what exactly resolves YES, who resolves it, from which sources. venue is 'polymarket' (pass the slug, the Gamma id, or the market_id a search returned, which is a CLOB token id) or 'kalshi' (pass the ticker).
Inputs: venue (required), market_id (required).
search_marketsARead-onlyIdempotentInspect
Search Polymarket markets by text (Gamma public-search under the hood); empty query lists open markets. Returns token ids, prices, metrics, resolution info.
Inputs: limit, query.
server_infoARead-onlyIdempotentInspect
Server status: dry-run state, attribution config, enabled capabilities, venue reachability from this machine, and Polymarket's geoblock verdict for this machine's IP (advisory — not a compliance check). Call this before the first order of a session.
Inputs: no named parameters.
settlement_auditARead-onlyIdempotentInspect
Settlement-divergence audit for a cross-venue pair, on LIVE data (no pre-curated pair list). Compares close times, resolution sources, UMA dispute status and market structure, and returns ok / caution / block with reasons. polymarket_id takes the slug, the Gamma id or the market_id a search returned (a CLOB token id); kalshi_ticker takes the ticker. Run this before treating any cross-venue price difference as an edge.
Inputs: kalshi_ticker (required), polymarket_id (required), notional_usd.
split_positionADestructiveInspect
Split USDC collateral into a full YES+NO share set for one market, GASLESS via Polymarket's relayer. amount_usdc is collateral in USDC (e.g. 25). Needs POLYMARKET_RELAYER_API_KEY and POLYMARKET_RELAYER_API_KEY_ADDRESS (polymarket.com -> Settings -> Relayer API keys). DRY-RUN by default. Never falls back to a gas-paying broadcast.
Inputs: amount_usdc (required), condition_id (required).
watch_bookARead-onlyIdempotentInspect
Stream one Polymarket token's realtime market events (book snapshot, price changes, trades) for up to seconds (1-60) or max_events, then return them. Use after get_orderbook when you need to see the book MOVE before acting; a quiet market may deliver only the initial snapshot.
Inputs: token_id (required), seconds, max_events.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 42 tools
The venue prefixes (kalshi_ vs no prefix) and action nouns keep most tools distinct. Only mild overlaps exist—notably find_markets vs search_markets vs kalshi_search_markets, and my_positions vs get_positions—but the descriptions clarify when to use each. No tools are truly indistinguishable.
Names are consistently lowercase snake_case and mostly follow a predictable venue_action_noun pattern, e.g. kalshi_place_order, get_orderbook, cancel_all_orders. A few noun-style names like server_info, builder_stats, and position_size break the verb-first feel, but there is no chaotic style mixing.
42 tools is well beyond the 25+ threshold for 'too many' and feels heavy even for a two-venue trading platform. Many tools could be consolidated or grouped, such as search variants, position variants, and several signal/analysis utilities. The breadth is real, but the count creates selection overhead.
The toolkit is broad: market discovery, order placement/cancellation, balances/positions, paper trading, redemption, resolution checks, builder attribution, and cross-venue settlement audits are all covered. Minor gaps include Kalshi-specific order status/fill history and a dedicated Polymarket trade history tool, so agents may need to work around those edges.
Maintenance
Related MCP Connectors
Calibrated world model for AI agents. 40 tools: world state, markets, trading. Kalshi + Polymarket.
Your agent needs the crowd's number — live odds on elections, policy, macro prints and sport, from the venues where people put money behind the opinion. **What you can ask for** • "What are the current odds on this event?" • "List the open markets on this topic across both venues." • "Show recent trades and how the price moved." • "What is the implied probability now versus a week ago?" **How to use it** Point any MCP client at https://mcp.aisa.one/prediction-market-data/mcp and sign in with OAuth — there is no key to create or paste. 5 tools: Kalshi markets and trades, Polymarket markets, events and activity. **Why this rather than the source** Both venues in one shape, so the same question can be priced twice. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Read the odds here, then ask the same agent for the market data or the news behind them — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/finance/mcp for equities, crypto and prediction markets in one place.
Polymarket & Kalshi live prediction market odds aggregator and cross-venue arbitrage scanner MCP.
Polymarket in your AI: market rules, real fill costs, who is trading, top traders. Read-only.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceReal-time prediction market intelligence for AI agents. Query Polymarket and Kalshi markets, wallet profiles, smart money leaderboards, social pulse signals, price candlesticks, and orderbook data — 13 agents, one MCP connection. Powered by 1.1TB+ of historical data.MIT
- AlicenseAqualityDmaintenancePrediction market probability oracle for AI agents. 26 tools across 500+ live markets from Kalshi and Polymarket. Cross-source arbitrage detection, structured TPF signals, Kelly Criterion sizing, agent performance tracking, and webhook alerts.986 npm1MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server and Python toolkit that provides AI agents with real-time tools for Polymarket prediction markets, including liquidity scanning, arbitrage detection, and slippage estimation. It also offers advanced wallet intelligence, portfolio risk calculation, and probabilistic reasoning to enhance market analysis and strategy.42 PyPI1MIT
- AlicenseAqualityCmaintenanceEnables AI agents to discover and analyze prediction markets, execute trades, and manage positions on Polymarket via the Model Context Protocol.7106 npm20MIT