Skip to main content
This example shows a complete workflow using the Horizon MCP server through Claude Code: discovering markets, analyzing opportunities with Kelly criterion, placing trades, setting protective orders, and monitoring positions - all through natural language.

Setup

# Install
pip install horizon-sdk[mcp]   # or: uv pip install horizon-sdk[mcp]

# Register with Claude Code
export HORIZON_API_KEY="your-key"
claude mcp add --transport stdio horizon -- python -m horizon.mcp

The Workflow

1. Morning scan - discover markets

You: Find me active bitcoin markets on Polymarket with recent activity
Claude calls discover_markets(exchange="polymarket", query="bitcoin", limit=10) and returns:
Found 6 active BTC markets on Polymarket:

1. will-btc-hit-100k - "Will BTC hit $100k by March 2026?"
2. will-btc-hit-120k - "Will BTC hit $120k by March 2026?"
3. btc-above-90k-feb - "Will BTC close above $90k in February?"
4. btc-dominance-60 - "Will BTC dominance exceed 60%?"
5. btc-etf-outflows - "Will BTC ETFs see net outflows this week?"
6. btc-halving-price - "BTC price on next halving anniversary"

2. Analyze opportunity - Kelly sizing

You: I think there's a 72% chance BTC hits 100k by March.
     The market is at 58 cents. My bankroll is $5,000.
     How much should I buy?
Claude calls kelly_sizing(prob=0.72, price=0.58, bankroll=5000.0, fraction=0.25, max_size=200.0):
Kelly analysis for your BTC $100k thesis:

Edge: +14 cents (your 72% vs market's 58%)
Quarter Kelly optimal: 200 contracts (capped at max_size)

Breakdown:
 - Full Kelly fraction: 33.3% of bankroll
 - Quarter Kelly: 8.3% → $416 risked
 - At $0.58/contract: ~717 contracts uncapped
 - Capped at 200 contracts → $116 risk

The edge is strong. Quarter Kelly at 200 contracts is conservative
and well within risk limits.

Want me to place the order?

3. Place the trade

You: Yes, buy 200 contracts at 0.58
Claude calls submit_order(market_id="will-btc-hit-100k", side="buy", price=0.58, size=200.0):
Order submitted:
  Order ID: p1
  Market: will-btc-hit-100k
  Side: buy
  Price: 0.58
  Size: 200 contracts

4. Add protection

You: Set a stop-loss at 0.40 and take-profit at 0.80 for that position
Claude calls order_management(action="add_stop_loss", ...) and order_management(action="add_take_profit", ...):
Protection set:

Stop-loss:
  Trigger: 0.40 (sell 200 YES contracts)
  Max loss if triggered: ~$36

Take-profit:
  Trigger: 0.80 (sell 200 YES contracts)
  Profit if triggered: ~$44

Your position is now bracketed. The stop-loss and take-profit
will fire automatically when the market price hits those levels.

5. Check the portfolio

You: Show me everything - positions, orders, pending stops
Claude calls engine_status(), list_positions(), list_open_orders(), and order_management(action="list_contingent"):
Engine Status:
  Running: yes | Kill switch: off | Uptime: 12 min
  Daily PnL: -$0.20

Positions (1):
  will-btc-hit-100k: 200 YES @ 0.58
    Unrealized: -$0.20 | Exchange: paper

Open Orders (0):
  All filled.

Contingent Orders (2):
  1. Stop-loss: sell 200 YES @ 0.40 (pending)
  2. Take-profit: sell 200 YES @ 0.80 (pending)

6. Second market - scan Kalshi

You: Are there similar BTC markets on Kalshi? Look for KXBTC
Claude calls discover_markets(exchange="kalshi", query="KXBTC", limit=5):
Found 3 BTC markets on Kalshi:

1. KXBTC-26MAR31 - "BTC above $100k on March 31"
2. KXBTC-26FEB28 - "BTC above $95k on Feb 28"
3. KXBTC-26APR30 - "BTC above $110k on April 30"

KXBTC-26MAR31 looks like a direct analog to your Polymarket
position. If there's a price gap, that could be an arb.

7. End of day - close out

You: Cancel all my open orders and show me final PnL
Claude calls cancel_all_orders() then engine_status():
Canceled 0 orders (none were open).

Final status:
  Realized PnL: $0.00
  Unrealized PnL: +$4.00
  Daily PnL: +$4.00

Your will-btc-hit-100k position is up $4 on 200 contracts.
Stop-loss and take-profit are still armed.

Full Session as a Script

For reproducibility, here’s what the tool calls looked like:
"""Equivalent Python code for the MCP session above."""

from horizon import tools

# 1. Discover
markets = tools.discover("polymarket", "bitcoin", limit=10)

# 2. Kelly sizing
sizing = tools.kelly_sizing(prob=0.72, price=0.58, bankroll=5000.0)
print(f"Optimal size: {sizing['optimal_size']} contracts")

# 3. Trade
order = tools.submit_order("will-btc-hit-100k", "buy", 0.58, 50.0)
print(f"Order ID: {order['order_id']}")

# 4. Protect
tools.add_stop_loss("will-btc-hit-100k", "yes", "sell", 50.0, 0.40)
tools.add_take_profit("will-btc-hit-100k", "yes", "sell", 50.0, 0.80)

# 5. Check
status = tools.engine_status()
positions = tools.list_positions()
contingent = tools.list_contingent_orders()

# 6. Discover Kalshi
kalshi_markets = tools.discover("kalshi", "KXBTC", limit=5)

# 7. Close out
tools.cancel_all_orders()
final = tools.engine_status()
print(f"Daily PnL: ${final['daily_pnl']:.2f}")

Next Steps

MCP Server Reference

Full tool and resource documentation.

Claude Code Setup

Detailed setup instructions.

Kelly Sizing

Deep dive into Kelly criterion functions.

Hedge Fund Workflow

Full production deployment example.