oddsrail
Enables MCP-compatible AI agents to research and trade prediction markets on Polymarket and Kalshi, including market search, orderbooks, price history, positions, order routing, and on-chain builder-code attribution, plus overshoot and dispute-risk signals.
README
oddsrail
<!-- mcp-name: io.github.hmesutozsoy/oddsrail -->
The rail AI agents use to trade prediction markets.
An MCP server that gives any agent (Claude Code, Claude Desktop, or anything MCP-compatible) prediction-market access across Polymarket and Kalshi: market search, orderbooks, price history, positions, and order routing — with on-chain builder-code attribution on Polymarket — plus two premium signal tools (in-play overshoot/fade detection, resolution dispute-risk).
Business model: routed order flow earns builder fees; signal tools are the paid data layer (x402 pay-per-call planned).
Why this and not Parsec
The closest competitor (parsecapi.com) is a closed-source hosted service: it stores your exchange keys (or holds a managed wallet that signs for you), and its Builder Program keeps 55–85% of the fees builders collect. oddsrail is the opposite on every axis: self-hosted, non-custodial (keys never leave your machine), open source, and you keep 100% of your Polymarket builder fees because attribution uses Polymarket's native mechanism, not a middleman escrow. Parsec also ships zero signal/analytics tools and nothing on resolution risk — that's our paid layer.
Quickstart
Python 3.11+ required.
pip install oddsrail
claude mcp add --transport stdio oddsrail -- oddsrail
Or from a clone, without installing:
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
claude mcp add --transport stdio oddsrail -- /abs/path/to/oddsrail/.venv/bin/python -m oddsrail.server
Then ask the agent: "search markets about the World Cup final and run the overshoot signal on the favorite".
How attribution works (CLOB V2, verified Aug 2026)
- Get your builder code (a bytes32) at polymarket.com → Settings → Builders. Set your fee rates there: taker up to 100 bps, maker up to 50 bps — additive on top of platform fees, settled to your builder wallet.
export ODDSRAIL_BUILDER_CODE=0x...where the server runs.- Every order any agent routes through
place_orderhas the code placed in the V2 order struct'sbuilderfield before signing — attribution is on-chain, visible in everyOrderFilledevent on CTF Exchange V2. - Verify with the
builder_statstool (public builder-trades endpoint + leaderboard).
Environment variables
| Variable | Default | Meaning |
|---|---|---|
ODDSRAIL_DRY_RUN |
1 |
1 = orders are simulated and returned, never posted. Set 0 to trade. |
ODDSRAIL_BUILDER_CODE |
unset | Your bytes32 builder code — attribution + fees. |
POLYMARKET_PRIVATE_KEY |
unset | Operator wallet key; required only for real trading. Never leaves this machine. |
POLYMARKET_WALLET_ADDRESS |
unset | Proxy/deposit wallet address, if the account uses one. |
Status — live-verified 2026-08-23
All 10 callable tools were driven end-to-end through a real MCP client
session against live Polymarket, from the Finland VPS (/opt/oddsrail).
Verified working: search, market lookup, orderbook (9/65 levels), price
history (361 pts), overshoot signal, dispute-risk, builder leaderboard,
dry-run order, open orders, server info.
Field mappings were corrected against the real API during that run — the
docs-guessed shapes were wrong in three places (outcomes is a dict keyed
yes/no, search() nests markets inside events, and book/volume/
resolution data live in prices/metrics/state/resolution
sub-objects).
⚠️ Network note
Polymarket API domains are blocked on Turkish networks (BTK) — local
testing fails TLS with a block page. Run the server where Polymarket is
reachable (the Finland VPS at /opt/oddsrail, a VPN, or any unblocked
network). The signal logic and MCP layer are fully testable offline.
Kalshi (venue #2)
Kalshi is bring-your-own-key and single-tenant by design: the operator supplies their own API key, trades their own account, and this server caches nothing. That is deliberate — Kalshi's Developer Agreement limits API use to a member's own trading (§3), bars facilitating other members' trading (§3.2) and sublicensing the API (§3.7), and restricts storing/sharing API data (§3.1). A hosted multi-tenant Kalshi service would not be compliant; a self-hosted one is.
Attribution does not exist here. Kalshi Builder Codes are a Solana/DFlow/Jupiter integration — there is no builder or affiliate field anywhere on the REST API, so Kalshi order flow cannot be attributed or monetised the way Polymarket's can. Kalshi is in oddsrail for coverage and signal reach, not for routing revenue.
Two shapes on this API are easy to get wrong, so oddsrail normalises both:
- Prices are dollar strings, not cents (
"0.5600"), sizes are fixed-point strings ("10.00"); the legacy integer-cent fields were removed in March 2026. All arithmetic usesDecimal. - The orderbook is bids-only on both sides.
yes_dollarsandno_dollarsare both bid ladders, ascending — so the best bid is the last element, and a NO bid at $0.99 is a YES ask at $0.01.kalshi_get_orderbookreturns a conventional best-first bid/ask view of the YES book plus the raw ladders.
Order placement speaks natural terms — outcome (yes/no), action
(buy/sell), price = probability of that outcome — and translates to Kalshi's
YES-book bid/ask internally (buy NO @ 0.25 becomes ask @ 0.75). That
translation is unit-tested, since it is the obvious place to ship an
inverted-position bug.
Credentials: KALSHI_KEY_ID plus KALSHI_PRIVATE_KEY_PATH (PKCS#8 PEM) or
KALSHI_PRIVATE_KEY. Set KALSHI_DEMO=1 to hit the demo environment. Read
tools need no key at all.
Tools (21)
search_markets,get_market,get_orderbook,price_history,get_positions— read-only, no keysovershoot_signal— premium: fresh panic-jump detection + this market's historical reversion tendency (ported from the polymarket-wc analyzer)dispute_risk— premium: transparent 0–100 heuristic for contested (UMA-dispute-prone) resolutionsplace_order,cancel_order,open_orders— trading, dry-run by defaultbuilder_stats— attribution verification + public builder leaderboardserver_info— config status, per-venue
Kalshi: kalshi_search_markets, kalshi_get_market, kalshi_get_orderbook,
kalshi_get_trades, kalshi_balance, kalshi_positions,
kalshi_open_orders, kalshi_place_order, kalshi_cancel_order.
Stack notes
- Official unified SDK
polymarket-client(0.6.x):AsyncPublicClientfor data,AsyncSecureClient.place_limit_order(..., builder_code=...)for attributed orders. The legacypy-clob-clientis archived and cannot attach builder codes — do not use it. - MCP SDK 2.0:
MCPServerfrommcp.server.mcpserver(the oldmcp.server.fastmcp.FastMCPimport is gone in 2.x). - Kalshi is on plain
httpx+cryptography, not the official SDK:kalshi-python-syncrequires Python >=3.13 and re-releases weekly in lockstep with the spec version. Auth is RSA-PSS(SHA256, salt=digest length) overstr(unix_ms) + METHOD + path, where the path includes/trade-api/v2and excludes the query string. Base URL is nowexternal-api.kalshi.com. - x402 (planned): the official
x402PyPI package (v2.20+) can wrap MCP tools directly (x402.mcp, payment rides in tool-call_meta), but its MCP helpers currently target mcp 1.x — integrating means pinningmcp>=1.28,<2or waiting for the 2.x-compatible release. Mainnet settlement needs a facilitator (Coinbase CDP: 1,000 free settlements/mo, then $0.001). Keep free tiers of both signals so registries can index the server.
What the builder economy looks like (live, 2026-08-23)
Pulled from the public leaderboard via builder_stats:
| weekly | all-time | |
|---|---|---|
| #1 (betmoar) | $2.31M | $2.10B |
| median of top 25 | $127K | $88.2M |
| entry to top 25 | $42K | $36.8M |
The instructive rows are the small-user ones: MagicMarkets routes $354K/week with 1 active user, Gate $1.11M/week with 2, PolymarketScan $277K with 3. Those are bot operators routing their own flow — oddsrail's exact target customer — and they show a single serious agent trader is worth real volume. Wallets (MetaMask, 37K users) dominate on user count, not on volume per user.
Roadmap
Live smoke test from an unblocked network— done 2026-08-23, all tools pass- Register builder code (polymarket.com → Settings → Builders), set fees to
0 bps at launch, export
ODDSRAIL_BUILDER_CODE; first attributed order on a tiny size Kalshi as venue #2— done 2026-08-23, 9 tools, verified live- x402 paid wrapping for the two signals once the mcp-2.x conflict clears
- Registry listings: official MCP registry (
mcp-publisher, PyPImcp-name:marker), Smithery (needs public streamable-HTTP + a free tool for their scanner), Glama (glama.json)
Listing / distribution
- GitHub: https://github.com/hmesutozsoy/oddsrail (public, MIT)
- Glama: auto-crawls GitHub;
glama.jsonin the repo root claims maintainership. - Official MCP registry:
server.jsonis ready. Publishing needs the package on PyPI first (the registry verifies ownership via anmcp-name: io.github.hmesutozsoy/oddsrailmarker in the PyPI README), thenmcp-publisher login github && mcp-publisher publish. - Smithery: requires a public HTTPS streamable-HTTP endpoint — available once oddsrail is hosted rather than run locally over stdio.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.