# Rubin Exchange MCP server

Rubin: self-custody DEX for crypto perpetuals & spot - trade, read positions, orders, balances.

## Links
- Registry page: https://www.getdrio.com/mcp/trade-rubin-exchange
- Repository: https://github.com/rubin-trade/rubin-mainnet-mcp
- Website: https://code.rubin.trade/ai

## Install
- Endpoint: https://mcp.mainnet.rubin.trade/mcp
- Auth: Auth required by registry metadata

## Setup notes
- Remote header: Authorization (required; secret)
- The upstream registry signals required auth or secrets.
- Remote endpoint: https://mcp.mainnet.rubin.trade/mcp
- Header: Authorization

## Tools
- whoami (Describe this session) - Report what this session controls: the master account/subaccount, whether it can trade or is read-only, and the exact on-chain authorization scope (which messages, which subaccount, and that it CANNOT withdraw/transfer). Call this first. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_block_height (Get latest block height) - Return the latest chain block height. Useful for SHORT_TERM order goodTilBlock math. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- list_markets (List perpetual markets) - List all perpetual markets with ticker, status and oracle price. Use this first to discover valid market tickers (e.g. BTC-USD) before placing orders. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_market (Get a perpetual market) - Get details for one perpetual market (clobPairId, atomicResolution, quantumConversionExponent, tick/step sizes, oracle price, status). Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_orderbook (Get orderbook) - Get the live orderbook (bids/asks) for a market, optionally truncated to a depth. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_candles (Get candles (OHLCV)) - Get OHLCV candles for a market at a given resolution. Useful for trend/volatility analysis. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_candles_multi (Get multi-timeframe candles) - Get recent OHLCV candles for a market across MULTIPLE resolutions in one call — by default ALL indexer resolutions (1MIN, 5MINS, 15MINS, 30MINS, 1HOUR, 4HOURS, 1DAY) — so the agent can read the trend across timeframes at once. Returns { candles: { <resolution>: [...] } }, newest first. Lower `limit` (e.g. 20) or pass a `resolutions` subset to keep the payload small. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_balance (Get balances) - Get the subaccount collateral (USDC asset position) and the on-chain wallet bank balances (gas). Collateral is what backs trading. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_equity (Get account summary) - Get the subaccount summary: equity, freeCollateral, marginEnabled, open perpetual positions and asset positions. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_positions (Get perpetual positions) - Get perpetual POSITIONS with size, side, entryPrice, unrealizedPnl, realizedPnl and netFunding. Defaults to OPEN positions. NOTE: a position is what you HOLD after an order fills — it is NOT an open order. When the user asks loosely "what is open?", check BOTH this and get_open_orders (or call get_portfolio for both at once). Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_open_orders (Get open orders) - Get currently active ORDERS for the subaccount, optionally filtered by market and side. Includes OPEN resting orders and UNTRIGGERED conditional orders (TP/SL accepted on-chain but not yet triggered). Returns { orders: [...] }. This does NOT include filled positions — a filled market/limit order leaves NO open order, it becomes a POSITION (see get_positions). When there are 0 orders but open positions exist, the result carries a `note` pointing you there. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_portfolio (Get full portfolio) - One-call snapshot of everything the account has "open": equity & freeCollateral, every open POSITION (with notional, unrealized PnL and estimated liquidation price), every active ORDER (resting + untriggered TP/SL), and account margin risk. Use this to answer "what do I have open?" or "how am I doing?" without worrying whether the user means orders or positions — it returns both. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_position_risk (Get position risk) - Margin health for the subaccount: equity, freeCollateral, total maintenance/initial margin, maintenanceMarginBufferUsd (the EXACT liquidation guard — liquidatable when < 0), marginUsageRatio (1.0 = at liquidation), account leverage, and per-position estimated liquidation price + distance to it. Use before adding risk or to decide whether to protect/close a position. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_fills (Get fills (trade history)) - Get executed fills for the subaccount, including price, size, fee and maker/taker liquidity. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_pnl (Get historical PnL) - Get historical PnL ticks for the subaccount (equity, totalPnl, netTransfers over time). Use createdOnOrAfter to bound the range. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- place_limit_order (Place a limit order) - Place a limit order. Default timeInForce=GTT (long-term, durable, broadcast-commit so errors return synchronously). Use SHORT_TERM only for latency-sensitive orders (expire within ~20 blocks, broadcast async). NOTE: stateful (GTT) orders are rate-limited to 2/block and 20 per 100 blocks — pace placements. Returns `confirmation` with the REAL outcome verified via the indexer (filled / partially_filled / resting / unfilled / pending) — broadcast `code: 0` only means the tx was accepted, NOT that it filled. Report from `confirmation.outcome`; if it is `pending`, the indexer is lagging — re-check shortly. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- place_market_order (Place a market order) - Place an IOC market order. It executes as an IOC limit at a worst-acceptable price mirrored around the oracle by side — BUY caps ABOVE the oracle, SELL below — at slippageBps distance (default 500 = 5%). Fills happen at book prices; the cap only limits how deep the sweep goes. reduceOnly closes an existing position. Returns `confirmation` with the REAL outcome verified via the indexer (filled / partially_filled / unfilled / pending): broadcast `code: 0` only means the tx was accepted — an IOC order cancels UNFILLED when the book is entirely beyond the slippage cap (thin/spread market). Always report from `confirmation.outcome`, not `code`; if `unfilled` or `partially_filled`, retry with a larger slippageBps to sweep deeper; if `pending`, the indexer is lagging — wait a few seconds and re-check before concluding. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- cancel_order (Cancel an order) - Cancel a single order by clientId. For SHORT_TERM pass goodTilBlock; for LONG_TERM/CONDITIONAL pass goodTilTimeSeconds (the original good-til value, available from get_open_orders). Returns `confirmation` with the verified result (canceled / still_open / filled / pending): `code: 0` only means the cancel was broadcast. If `still_open`, the goodTil value likely did not match the original — retry. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- cancel_all_orders (Cancel all orders in a market) - Cancel every OPEN order for the subaccount in a market (handles SHORT_TERM and LONG_TERM automatically). Returns `confirmation.remainingOpen` — orders still OPEN after the cancel (0 = all gone); if > 0, retry. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- batch_cancel (Batch cancel short-term orders) - Cancel multiple SHORT_TERM orders in one tx. SHORT_TERM only (chain limitation) — for stateful/mixed use cancel_all_orders. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- place_stop_loss (Stop loss) - Place a reduce-only Stop loss (conditional market order) that triggers at triggerPrice. Side must be the CLOSING side of the position: SELL closes a LONG, BUY closes a SHORT. Once triggered it executes as an IOC limit bounded at triggerPrice ± slippageBps in the direction of execution (BUY above the trigger, SELL below; default 500 bps) so the close can cross the book. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- place_take_profit (Take profit) - Place a reduce-only Take profit (conditional market order) that triggers at triggerPrice. Side must be the CLOSING side of the position: SELL closes a LONG, BUY closes a SHORT. Once triggered it executes as an IOC limit bounded at triggerPrice ± slippageBps in the direction of execution (BUY above the trigger, SELL below; default 500 bps) so the close can cross the book. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- close_position (Close a position) - Close all or part of an open perpetual position with a reduce-only MARKET order. Reads the current position, flips the side automatically (LONG→SELL, SHORT→BUY) and sizes the close. percent defaults to 100 (full close); a partial close is floored to the market step size. The close is bounded at oracle ± slippageBps mirrored by side (closing a SHORT buys up to oracle×(1+slip), closing a LONG sells down to oracle×(1−slip); default 500 bps = 5%). Returns the verified `confirmation` outcome — if it is `unfilled` or `partially_filled`, the book was thinner than the cap: re-run with a larger slippageBps to sweep deeper. Errors NOT_FOUND if there is no open position in the market. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- close_all_positions (Close all positions) - Flatten EVERY open perpetual position with reduce-only MARKET orders (one per market). Respects the operator market allowlist (disallowed markets are skipped and reported). Each close is bounded at oracle ± slippageBps mirrored by side (default 500 bps = 5%). Returns a per-market result array — for any market reporting unfilled/partially_filled, re-run with a larger slippageBps. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- open_position (Open a position (market entry + optional bracket)) - Enter a NEW position with a MARKET order, sized by base `size` OR quote `notionalUsd` (exactly one required; notionalUsd converts at the oracle price and is floored to the step size). Optionally attach a reduce-only stopLossPrice and/or takeProfitPrice as conditional orders in the SAME call (the bracket, placed with the opposite/closing side and a 500 bps execution bound past the trigger). slippageBps caps the entry fill vs oracle (default 500). Returns the entry `confirmation` plus any bracket order ids. Bracket legs are placed only if the entry broadcast succeeds; each is reduce-only so it can only close, never flip. Endpoint: https://mcp.mainnet.rubin.trade/mcp
- get_news (Get latest news) - Fetch the latest headlines from the ritbit news feed (curated crypto / markets / business channels, newest first). Filter by `category` (crypto|markets|business) or explicit `channels`, and/or a free-text `query` (a ticker or keyword, matched in the post text and hashtags, e.g. BTC). Each item returns { source, url, publishedAt, tags (hashtags — where tickers appear), text }. There is NO importance field: judge impact yourself from the content (hacks, regulation, large moves, ⚠️ warnings). Use this to factor sentiment/catalysts into an assessment, or to answer "what's the latest?". Headlines are ru/en. Endpoint: https://mcp.mainnet.rubin.trade/mcp

## Resources
Not captured

## Prompts
- check_portfolio - Check my portfolio Summarize balance, open positions, open orders and margin risk in plain language.
- scan_markets - Scan markets for a trade Read the tape across markets and propose one or two concrete trade ideas. Arguments: focus
- protect_positions - Protect my open positions Find positions without a stop-loss / take-profit and propose a protective bracket.
- enter_trade - Enter a trade Guided market entry with an optional protective bracket. Arguments: market, direction, sizeUsd
- flatten_all - Close everything Flatten all open positions at market after a confirmation.
- assess_situation - Assess the situation Combine market trend, news catalysts and my positions into one read. Arguments: focus
- latest_news - Latest crypto news A quick digest of the latest crypto headlines that matter. Arguments: query

## Metadata
- Owner: trade.rubin
- Version: 1.0.2
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jun 22, 2026
- Source: https://registry.modelcontextprotocol.io
