---
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:

```bash
uv venv && uv pip install -e .
```

For MCP server (Claude integration):

```bash
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)

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

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

```python
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`):

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

1. Use `search_markets` with a keyword to find relevant markets.
2. Pick a market from the results and note its `id` and `metadata.clobTokenIds`.
3. Use `get_orderbook` with a token ID to see current bids and asks.
4. Use `get_best_bid_ask` for a quick spread check.

### Place a Trade

1. Find the market using `search_markets` or `fetch_markets_by_slug`.
2. Check `fetch_balance` to confirm available funds.
3. Get the orderbook with `get_orderbook` to see current prices.
4. Use `create_order` with the market ID, outcome ("Yes" or "No"), side ("buy" or "sell"), price (0-1), and size.
5. Monitor with `fetch_order` or `fetch_open_orders`.

### Run a Market-Making Strategy

1. Find a market with `search_markets` or `find_tradeable_market`.
2. Start with `create_strategy_session(strategy_type="market_making", exchange, market_id)`.
3. Monitor with `get_strategy_status` and `get_strategy_metrics`.
4. Control with `pause_strategy`, `resume_strategy`, or `stop_strategy`.

### Check Portfolio

1. `fetch_balance` to see cash.
2. `fetch_positions` to see all open positions with unrealized PnL.
3. `calculate_nav` for 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

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