name: dr-manhattan description: Trade prediction markets (Polymarket, Kalshi, Opinion, Limitless, Predict.fun) using a unified CCXT-style API. Use when the user wants to browse, search, or trade prediction markets, check balances and positions, manage orders, run market-making strategies, or compare prices across exchanges. license: Apache-2.0 compatibility: Requires Python >= 3.11 and uv. Requires network access for exchange APIs. Optionally requires exchange credentials (private keys, API keys) for trading. metadata: author: guzus version: "1.0"
Dr. Manhattan - Prediction Market Trading
Dr. Manhattan is a unified API for prediction markets, similar to how CCXT works for cryptocurrency exchanges. It supports Polymarket, Kalshi, Opinion, Limitless, and Predict.fun through a single interface.
Setup
Install dependencies with uv:
uv venv && uv pip install -e .
For MCP server (Claude integration):
uv sync --extra mcp
Supported Exchanges
| Exchange | Chain/Type | Auth |
|---|---|---|
| Polymarket | Polygon | Private key + funder address |
| Kalshi | Regulated CEX | API key + RSA private key |
| Opinion | BNB Chain | API key + private key + multi-sig address |
| Limitless | Base | Private key |
| Predict.fun | BNB Chain | API key + private key (EOA or smart wallet) |
Usage as a Python Library
Read-Only (No Credentials)
import dr_manhattan
polymarket = dr_manhattan.Polymarket({'timeout': 30})
markets = polymarket.fetch_markets()
for market in markets:
print(f"{market.question}: {market.prices}")
With Authentication
import dr_manhattan
polymarket = dr_manhattan.Polymarket({
'private_key': '0x...',
'funder': '0x...',
})
order = polymarket.create_order(
market_id="market_123",
outcome="Yes",
side=dr_manhattan.OrderSide.BUY,
price=0.65,
size=100,
params={'token_id': 'token_id'}
)
Exchange Factory
from dr_manhattan import create_exchange, list_exchanges
print(list_exchanges()) # ['polymarket', 'opinion', 'limitless', 'predictfun', 'kalshi']
exchange = create_exchange('polymarket', {'timeout': 30})
Usage via MCP Server
Dr. Manhattan exposes all trading capabilities as MCP tools. Configure in Claude Code (~/.claude/settings.json or .mcp.json):
{
"mcpServers": {
"dr-manhattan": {
"command": "/path/to/dr-manhattan/.venv/bin/python",
"args": ["-m", "dr_manhattan.mcp.server"],
"cwd": "/path/to/dr-manhattan"
}
}
}
MCP Tools Reference
Exchange Tools:
list_exchanges- List all available prediction market exchanges.get_exchange_info(exchange)- Get metadata and capabilities for an exchange.validate_credentials(exchange)- Check if credentials are valid without trading.
Market Discovery:
search_markets(exchange, query)- Search markets by keyword. This is the fastest way to find markets about a topic.fetch_markets(exchange, limit?, offset?)- Fetch all markets with pagination.fetch_market(exchange, market_id)- Fetch a specific market by ID.fetch_markets_by_slug(exchange, slug)- Fetch markets by slug or URL (Polymarket, Limitless).find_tradeable_market(exchange, binary?, limit?, min_liquidity?)- Find a suitable market for trading.find_crypto_hourly_market(exchange, token_symbol?)- Find crypto hourly price markets (Polymarket).fetch_token_ids(exchange, market_id)- Get token IDs for a market.parse_market_identifier(identifier)- Extract slug from a Polymarket URL.get_tag_by_slug(slug)- Get Polymarket tag information.
Orderbook:
get_orderbook(exchange, token_id)- Get full orderbook (bids and asks).get_best_bid_ask(exchange, token_id)- Get best bid and ask prices.
Trading:
create_order(exchange, market_id, outcome, side, price, size)- Place a buy or sell order. Price is 0-1 (probability). Side is "buy" or "sell".cancel_order(exchange, order_id, market_id?)- Cancel a specific order.cancel_all_orders(exchange, market_id?)- Cancel all open orders.fetch_order(exchange, order_id, market_id?)- Get order details and fill status.fetch_open_orders(exchange, market_id?)- List all open orders.
Account:
fetch_balance(exchange)- Get account balance (USDC).fetch_positions(exchange, market_id?)- Get current positions with PnL.fetch_positions_for_market(exchange, market_id)- Get positions for a specific market.calculate_nav(exchange, market_id?)- Calculate net asset value (cash + positions).
Strategy Management:
create_strategy_session(strategy_type, exchange, market_id, ...)- Start a market-making strategy in the background.get_strategy_status(session_id)- Get real-time strategy status (NAV, positions, delta).get_strategy_metrics(session_id)- Get performance metrics (uptime, fills).pause_strategy(session_id)- Pause a running strategy.resume_strategy(session_id)- Resume a paused strategy.stop_strategy(session_id, cleanup?)- Stop a strategy and optionally cancel orders.list_strategy_sessions- List all active strategy sessions.
Common Workflows
Find and Analyze a Market
- Use
search_marketswith a keyword to find relevant markets. - Pick a market from the results and note its
idandmetadata.clobTokenIds. - Use
get_orderbookwith a token ID to see current bids and asks. - Use
get_best_bid_askfor a quick spread check.
Place a Trade
- Find the market using
search_marketsorfetch_markets_by_slug. - Check
fetch_balanceto confirm available funds. - Get the orderbook with
get_orderbookto see current prices. - Use
create_orderwith the market ID, outcome ("Yes" or "No"), side ("buy" or "sell"), price (0-1), and size. - Monitor with
fetch_orderorfetch_open_orders.
Run a Market-Making Strategy
- Find a market with
search_marketsorfind_tradeable_market. - Start with
create_strategy_session(strategy_type="market_making", exchange, market_id). - Monitor with
get_strategy_statusandget_strategy_metrics. - Control with
pause_strategy,resume_strategy, orstop_strategy.
Check Portfolio
fetch_balanceto see cash.fetch_positionsto see all open positions with unrealized PnL.calculate_navfor total portfolio value (cash + positions).
Key Concepts
- Prices are probabilities ranging from 0 to 1 (exclusive). A price of 0.65 means the market implies a 65% chance.
- Outcomes are typically "Yes" and "No" for binary markets. Their prices sum to approximately 1.
- Token IDs are exchange-specific identifiers for each outcome of a market. Needed for orderbook queries.
- Slugs are human-readable URL identifiers (e.g., "trump-2024") used by Polymarket and Limitless.
- Order types supported: GTC (Good-Til-Cancel), FOK (Fill-Or-Kill), IOC (Immediate-Or-Cancel).
Running Examples
uv run python examples/list_all_markets.py polymarket
uv run python examples/spread_strategy.py --exchange polymarket --slug fed-decision
uv run python examples/spike_strategy.py -e opinion -m 813 --spike-threshold 0.02
Data Models
Market fields: id, question, outcomes, prices, volume, liquidity, close_time, tick_size, description, metadata (contains slug, clobTokenIds).
Order fields: id, market_id, outcome, side (BUY/SELL), price, size, filled, status (PENDING/OPEN/FILLED/CANCELLED), time_in_force.
Position fields: market_id, outcome, size, average_price, current_price. Properties: cost_basis, current_value, unrealized_pnl.
Orderbook fields: bids (price, size descending), asks (price, size ascending). Properties: best_bid, best_ask, mid_price, spread.