IBKR MCP Server
An MCP server that gives AI agents 38 tools to query and trade through Interactive Brokers, built on ib_async and FastMCP.
[!WARNING] This project is designed and tested only with IBKR PAPER accounts. Six tools can place, modify or cancel real orders (
place_order,place_bracket_order,place_combo_order,modify_order,cancel_order,cancel_all_open_orders). Use at your own risk. Nothing here is financial advice, and the authors accept no liability for any losses.
Features
Orders (10)
place_order,place_bracket_order,place_combo_order— submit stock, option, bracket and combo ordersmodify_order,cancel_order,cancel_all_open_orders— change or cancel ordersprecheck_order— risk-only dry check (hours, notional, price distance, buying power, concentration)get_live_orders,get_order_status,get_executions— order and fill tracking
Account and data (16)
get_positions,get_account_summary,get_portfolio_snapshot,get_pnl_per_position,get_daily_pnl_history,classify_positions_by_strategyget_market_data,get_historical_bars,get_52w_context,get_option_chainget_fundamentals,get_earnings_date,get_dividend_calendar(via yfinance)get_exchange_hours,resolve_symbol,screen_universe
Options analytics (9)
get_market_data_with_greeks,bs_price,implied_volatility,greeks_from_priceprob_itm,expected_moveevaluate_multi_leg,pmcc_evaluator,roll_analyzer
Diagnostics (3)
healthcheck,get_recent_errors,get_server_info
Safety by design
- Live-price gate on
place_order: the order is blocked if no live price is available, or if a limit price deviates from the mid/last/close reference by more thanIBKR_ORDER_PRICE_TOLERANCE_PCT(default2.0%). precheck_orderrisk limits (configurable, evaluated when the tool is called):IBKR_MAX_ORDER_NOTIONAL— max order notional, default5000.0(blocker)IBKR_MAX_PRICE_DISTANCE_PCT— max limit-price distance from reference, default0.10(blocker)IBKR_MAX_CONCENTRATION_PCT— max post-trade position share of net liquidation, default0.20(warning)- It also blocks when the exchange is closed or the order exceeds buying power.
- Paper port by default: the server connects to
127.0.0.1:4002.
[!NOTE] The
IBKR_MAX_*limits are enforced byprecheck_order, not inside the order-placing tools. The agent (or your prompt/policy) must callprecheck_orderbefore placing orders.
Quick start
Requirements: Python 3.11+, and IB Gateway or TWS running in paper mode with the API enabled (default Gateway paper port 4002).
git clone https://github.com/ettore-pedemonti/ibkr-mcp-server.git
cd ibkr-mcp-server
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python server.py # speaks MCP over stdio
Example MCP client configuration (e.g. Claude Desktop):
{
"mcpServers": {
"ibkr": {
"command": "/path/to/ibkr-mcp-server/.venv/bin/python",
"args": ["/path/to/ibkr-mcp-server/server.py"],
"env": {
"IB_HOST": "127.0.0.1",
"IB_PORT": "4002",
"IB_CLIENT_ID": "10"
}
}
}
}
Configuration
All settings are environment variables.
| Variable | Default | Description |
|---|---|---|
IB_HOST |
127.0.0.1 |
IB Gateway / TWS host |
IB_PORT |
4002 |
API port (4002 = Gateway paper) |
IB_CLIENT_ID |
10 |
Client ID used by the server |
IBKR_MAX_ORDER_NOTIONAL |
5000.0 |
Max order notional in precheck_order |
IBKR_MAX_PRICE_DISTANCE_PCT |
0.10 |
Max limit-price distance from reference (fraction) in precheck_order |
IBKR_MAX_CONCENTRATION_PCT |
0.20 |
Concentration warning threshold (fraction of net liquidation) |
IBKR_ORDER_PRICE_TOLERANCE_PCT |
2.0 |
Max limit-price deviation (in %) enforced by the place_order price gate |
IBKR_MARKET_DATA_TYPE |
3 |
IB market data type (1 live, 2 frozen, 3 delayed, 4 delayed-frozen) |
Testing
test_all_tools.py is a read-only regression script: it calls the read-only tools and skips the order-mutating ones. It requires a running IB Gateway/TWS in paper mode.
TEST_IB_CLIENT_ID=99 python test_all_tools.py
TEST_IB_CLIENT_ID (default 99) sets the client ID used by the script, so it does not clash with a running server.
Roadmap
- Enforce the
IBKR_MAX_*risk limits inside the order-placing tools, not only inprecheck_order - Unit tests with a mocked
ib_async - GitHub Actions CI
rufflinting and type hints