Rubin Exchange

trade.rubinPublished by rubin.tradeOfficial publisherv1.0.2Updated Oct 24, 2026

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

VerifiedStreamable HTTPWeb executableFinanceData & Analytics

Overview

AI-generated overview

Remote MCP server for the Rubin self-custody DEX that lets an assistant read perpetual and spot market data, inspect account balances and positions, and place…

What you can do
  • Discover markets and read live data: market list and details, orderbook, OHLCV candles across timeframes, block height, news headlines and PnL leaderboards
  • Inspect the account: identity and token scope, collateral and wallet balances, equity, positions, open orders, fills, PnL history, margin risk and fee tier
  • Trade: place limit and market orders, open positions with optional stop-loss and take-profit, close one or all positions
  • Manage orders: cancel a single order, cancel all orders in a market, or batch-cancel short-term orders
  • Move funds within the account: deposit USDC from wallet to trading subaccount and top up the gas reserve
  • Check referral program status and own leaderboard rank
When to use it
Use it when an assistant should trade or monitor crypto perpetuals and spot on Rubin, for example checking positions and margin health, reading market data, or placing and managing orders from a chat client. It suits users who already hold a Rubin account and want agent-driven trading with a scoped token.
Requirements
A remote streamable-HTTP endpoint at mcp.mainnet.rubin.trade; no local package. A Rubin exchange account and a free MCP token minted on the exchange, sent as an Authorization bearer header. Network access to the endpoint.
Before you install
The token authorizes real trading on mainnet with real funds; the server reports that its scope cannot withdraw or transfer, but orders, position closes and USDC deposits between wallet and subaccount do move money and change state. Market orders and stop-loss/take-profit triggers execute at book prices with slippage caps, so losses are possible. Keep the token secret and revoke it if leaked.

Installation

In SourceWeft

  1. Open Rubin Exchange in the dashboard and add it to a workspace.
  2. Connect Authorization token credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/trade.rubin%2Fexchange/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "rubin-exchange": {
      "type": "http",
      "url": "https://mcp.mainnet.rubin.trade/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

Rubin MCP server (mainnet)

Trade crypto perpetual futures and spot on Rubin — a self-custody decentralized exchange — directly from AI agents and assistants via the Model Context Protocol (MCP).

Rubin runs a hosted, remote MCP server (streamable-HTTP). Connect any MCP client (Claude, Cursor, VS Code, etc.) and let agents place and manage orders and read live market and account data. You keep custody of your funds — trading is authorized by a scoped token you mint yourself.

Tools

  • Market data — list markets, order book, candles, market stats, block height
  • Account — balances, equity, positions, open orders, fills, PnL
  • Trading — place / cancel limit & market orders, stop-loss, take-profit, cancel-all, batch-cancel

Authentication

Send an Authorization: Bearer <token> header. Mint a free MCP token on the Rubin exchange:

https://rubin.trade → Trading Keys → MCP Token

Connect

Claude Code / CLI

bash
claude mcp add --transport http rubin https://mcp.mainnet.rubin.trade/mcp \  --header "Authorization: Bearer <YOUR_MCP_TOKEN>"

Generic mcp.json (Claude Desktop / Cursor / others)

json
{  "mcpServers": {    "rubin": {      "type": "streamable-http",      "url": "https://mcp.mainnet.rubin.trade/mcp",      "headers": { "Authorization": "Bearer <YOUR_MCP_TOKEN>" }    }  }}

VS Code (GitHub Copilot) — .vscode/mcp.json

json
{  "servers": {    "rubin": {      "type": "http",      "url": "https://mcp.mainnet.rubin.trade/mcp",      "headers": { "Authorization": "Bearer <YOUR_MCP_TOKEN>" }    }  }}

See code.rubin.trade/ai for ready-made snippets for every client.

Manifest

server.json — the MCP Registry manifest for this server.

Links

License

MIT

Source: README.md at commit d084c4b

Tools

33

whoami

Describe this session

Report what this session controls: the master account (its address in BOTH forms — cosmos rit1… and EVM 0x…, the same 20 bytes), the 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). Also states what this session can NOT do: create wallets, reveal keys/mnemonics, or switch accounts. Call this first, and use it to answer "what is my address?".

Takes no parameters.

get_block_height

Get latest block height

Return the latest chain block height. Useful for SHORT_TERM order goodTilBlock math.

Takes no parameters.

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.

Takes no parameters.

get_market

Get a perpetual market

Get details for one perpetual market (clobPairId, atomicResolution, quantumConversionExponent, tick/step sizes, oracle price, status).

Parametersmarketrequired

get_orderbook

Get orderbook

Get the live orderbook (bids/asks) for a market, optionally truncated to a depth.

Parametersdepthmarketrequired

get_candles

Get candles (OHLCV)

Get OHLCV candles for a market at a given resolution. Useful for trend/volatility analysis.

ParameterslimittoISOmarketrequiredfromISOresolutionrequired

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.

Parameterslimitmarketrequiredresolutions

get_balance

Get balances

Get the subaccount collateral (USDC asset position) and the on-chain wallet bank balances. Collateral is what backs trading; the WALLET balance is where money sent to the account lands and is NOT collateral until deposited. `funding` summarizes it: depositableUsdc (wallet minus the $0.95 gas reserve) and a suggestedAction — deposit_to_subaccount when the wallet holds spare USDC, top_up_gas when gas is low.

Takes no parameters.

get_equity

Get account summary

Get the subaccount summary: equity, freeCollateral, marginEnabled, open perpetual positions and asset positions.

Takes no parameters.

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).

Parametersstatus

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.

Parameterssidelimitmarket

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.

Takes no parameters.

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.

Takes no parameters.

get_fills

Get fills (trade history)

Get executed fills for the subaccount, including price, size, fee and maker/taker liquidity.

Parameterspagelimitmarket

get_pnl

Get historical PnL

Get historical PnL ticks for the subaccount (equity, totalPnl, netTransfers over time). Use createdOnOrAfter to bound the range.

ParameterspagelimitcreatedOnOrAfter

get_funding_status

Wallet vs trading-account funds

Where the account's USDC sits: in the WALLET (bank balance — money sent to the account lands here and is NOT collateral) vs in the trading SUBACCOUNT (equity / free collateral). Returns depositableUsdc (wallet minus the $0.95 gas reserve), whether gas is low, and a suggestedAction (deposit_to_subaccount / top_up_gas / null). Call this when the user says they sent funds, when collateral reads 0, or before any funding decision.

Takes no parameters.

deposit_to_subaccount

Move wallet USDC into the trading account

Deposit USDC from the account's WALLET into its trading SUBACCOUNT so it becomes collateral. Without amountUsd it moves everything above the $0.95 gas reserve (what the web app does); with amountUsd it moves exactly that much, as long as $0.95 stays in the wallet. Funds never leave the account — this is an internal transfer the trading key is allowed to make. Use it when the user has sent money to the account and the subaccount collateral is 0 or too low to trade.

ParametersamountUsd

top_up_gas

Restore the wallet gas reserve

Move a little USDC from the trading subaccount back to the WALLET when the wallet is at or below $0.55 — just enough to restore the $0.95 gas reserve that deposit/withdraw transactions need. Only the gas reserve, only to the account's own wallet; it cannot send funds anywhere else. Use after a transaction fails for lack of gas.

Takes no parameters.

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.

ParameterssiderequiredsizerequiredpricerequiredmarketrequiredconfirmclientIdpostOnlyreduceOnlytimeInForcegoodTilBlockOffsetgoodTilTimeSeconds

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.

ParameterssiderequiredsizerequiredmarketrequiredconfirmclientIdreduceOnlyslippageBps

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.

ParametersmarketrequiredconfirmclientIdrequiredorderFlagsrequiredgoodTilBlockgoodTilTimeSeconds

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.

Parametersmarketrequiredconfirm

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.

ParametersmarketrequiredclientIdsrequired

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.

ParameterssiderequiredsizerequiredmarketrequiredclientIdslippageBpstriggerPricerequired

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.

ParameterssiderequiredsizerequiredmarketrequiredclientIdslippageBpstriggerPricerequired

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.

ParametersmarketrequiredconfirmpercentslippageBps

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.

ParametersconfirmslippageBps

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.

ParameterssiderequiredsizemarketrequiredconfirmnotionalUsdslippageBpsstopLossPricetakeProfitPrice

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.

ParameterslimitquerycategorychannelssinceHours

get_leaderboard

PnL leaderboard

The trader PnL leaderboard for a time span (ONE_DAY, SEVEN_DAYS, THIRTY_DAYS, ONE_YEAR, ALL_TIME): rank, username, address, PnL (USD), ROI (%) and current equity per trader, paginated. Also returns `me` — this account's own row on that board, if it is ranked. Use `search` to find a trader by username or address. For this account's rank across ALL time spans at once, use get_my_rank.

ParameterspagelimitsearchsortBytimeSpansortDirection

get_my_rank

My leaderboard rank

Where THIS account ranks on the PnL leaderboard: rank, board size ("21 of 66"), PnL, ROI and equity — for one time span, or for every time span (ONE_DAY … ALL_TIME) when none is given. A null entry means the account is not ranked on that board (no qualifying activity in the window).

ParameterstimeSpan

get_fee_tier

My fee tier

This account's current trading fee tier and conditions: maker/taker fee (% of notional; a negative maker fee is a rebate), the 30-day maker/taker volume it is judged on, any staking discount, the next tier and how much more 30d volume it takes, plus the full fee-tier table. Referred users start at the program's minimum fee tier (see get_referral_program).

Takes no parameters.

get_referral_program

My referral (affiliate) program

This account's referral / affiliate program status: referral code and link, whether the link is unlocked (lifetime volume threshold, or already an affiliate), current affiliate tier and taker-fee share, referred volume (30d / all-time), earnings and referred-user stats, who referred this account, the full affiliate tier table and the program parameters (referee starting fee tier, 30d caps).

Takes no parameters.

Version history

1
  1. v1.0.2LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts