Skip to main content

What it exposes

The MCP server gives AI agents access to the Joyride options exchange through 18 tools, 3 resources, and 3 prompts — covering market data, trading, account management, and wallet creation. An AI agent can look up options chains, get quotes, place and cancel orders, check balances, and read positions — all through natural language. You talk to the agent; the agent calls the tools. Current mode: Paper trading only. No real money at risk. The MCP server is stdio-only and login-only. It reuses the session created by joyride login; account creation happens in the web app at joyride.exchange.

Quick start

For the full guided flow, start with Agent Quickstart.

Prerequisites

  • Node.js >= 20.0.0
  • The Joyride CLInpm install -g joyride-cli (this installs both the CLI and MCP server)
  • A Joyride wallet — created via joyride wallet create or joyride setup
  • An active session — run joyride login (stores a JWT at ~/.joyride/session.json)
The MCP server reads the stored JWT from ~/.joyride/session.json on startup. No keypair path or passphrase is needed in the MCP config. If the session is expired or missing, the server exits with: “Not authenticated. Run joyride login first.”

Setup by client

Claude Code

The fastest way:
This runs claude mcp add under the hood and configures everything automatically. To verify, run /mcp inside Claude Code. You should see:
Manual setup (if you prefer editing config directly): Create .mcp.json in your project root:
Then restart Claude Code.

Cursor

The fastest way:
This writes the correct entry to ~/.cursor/mcp.json automatically, preserving any existing MCP servers you have configured. Manual setup: Add to ~/.cursor/mcp.json (create the file if it doesn’t exist):

Codex

This runs codex mcp add under the hood.

VS Code Copilot

No auto-install yet. Add to .vscode/mcp.json in your project:

Generic / custom agents

Launch the MCP server directly over stdio:
It speaks JSON-RPC over stdin/stdout per the MCP specification. Authentication is handled via the stored JWT at ~/.joyride/session.json.

Reconfiguring and uninstalling

Update an existing configuration

If you need to reconfigure (e.g., after changing connection URLs):
The --force flag removes the existing config and writes a fresh one.

Remove MCP from a client

Uninstall is safe to run even if joyride is not currently configured — it’s a no-op. For Cursor, uninstall removes only the joyride entry from ~/.cursor/mcp.json and preserves all other MCP servers.

Uninstall the CLI entirely

This removes both the CLI and the bundled MCP server.

Client support

The MCP server runs over stdio only. There is no hosted HTTP MCP endpoint — the :3002 hosted server and the /api/v1/mcp route were removed at the core cutover. Install it locally with joyride mcp install (or run the bundled joyride-mcp binary / joyride mcp serve). Hosted, multi-user MCP will return later as a platform feature with real per-user auth.

Auto-approve permissions

By default, Claude Code asks permission before calling each MCP tool. To skip prompts for Joyride tools, add them to .claude/settings.json:
Tip for live trading: Remove place_order, cancel_order, and cancel_all_orders from the allow list so those still require manual confirmation.

Tool reference

All tools accept and return human-friendly units. Machine-readable prices and sizes are decimal strings so values remain exact:
  • Prices in USD (e.g., "5.00000000")
  • Sizes in contracts (e.g., "1.00000000", "0.50000000")
  • Sides as "buy" / "sell"

Market data (7 tools)

list_instruments

List available options contracts with optional filters. Example prompt: “List all SOL call options” Transport: HTTP (public API)

get_quote

Get real-time bid/ask/mid quote for a specific instrument. Returns: { instrument, bid, ask, mid, last, bookSeq, synced }. Price fields are exact decimal strings in USD, or null for empty sides. Transport: WebSocket (MD)

get_orderbook

Get full order book depth for a specific instrument. Returns: { instrument, bookSeq, bids: [{price, size}], asks: [{price, size}] }. Price and size fields are exact decimal strings. Transport: WebSocket (MD)

get_options_chain

Get all options for an asset organized by strike (calls and puts side by side). Returns: { asset, expiry, strikes: [{ strike, call?, put? }] }; each leg includes its instrument metadata and a synthesized quote when available. Fixed-point values are decimal strings. Transport: WebSocket + HTTP

get_ticker

Get ticker snapshot for a specific instrument. Returns: { instrument, bestBid, bestBidSize, bestAsk, bestAskSize, mid, last, spread, synced } — exact decimal strings for non-null fixed-point values. There is no mark, IV, or 24h stats surface in alpha. Transport: WebSocket (MD)

get_all_tickers

Get all reduced tickers in one call. Returns: Array of the same reduced ticker shape as get_ticker. A symbol whose book cannot sync is returned with null values and synced: false. Transport: WebSocket (MD)

get_market_config

Get market protocol configuration. Returns: { version, priceDecimals, quantityDecimals } Transport: HTTP

Trading (5 tools)

All trading tools require wallet authentication.

place_order

Place a limit or market order. Returns: an outcome with status: "acknowledged", "open", or "filled". Acknowledged orders include the core order report; timeout reconciliation includes the matching open order or fill. An unresolved write returns an ACK_TIMEOUT_UNKNOWN MCP error and is never silently resent. Example prompts:
  • “Sell 1 contract of SOL_USDC-3MAR26-75-C at $5”
  • “Buy 2 contracts of SOL_USDC-3MAR26-75-P at market”
Transport: WebSocket

cancel_order

Cancel a specific order. Transport: WebSocket

cancel_all_orders

Cancel all open orders, optionally for a specific instrument. Returns: { requested, cancelled, failed, complete, results }. Matching orders are drained in server-filtered concurrent batches, and complete: true is returned only after an empty read. Any per-order failure or complete: false is returned as an MCP error, because the panic button cannot claim success while orders may remain. Transport: HTTP (query API, Bearer) + WebSocket

get_open_orders

List the active/open orders currently visible in query-api. Query-api has no cursor. Returns: { orders: [{ orderId, symbol, side, price, quantity, filledQuantity, status, createdAt }], complete }. Until query-api exposes pagination metadata, a non-empty response conservatively reports complete: false. Transport: HTTP (query API, Bearer)

get_order_status

Check the status of a specific order with query-api’s exact, account-scoped order_id filter. Terminal-state order history is not available in alpha, so an order id that is not currently open returns a deterministic notice (it may have filled, been cancelled, or expired) rather than a bare “not found”. Transport: HTTP (query API, Bearer)

Account (4 tools)

All account tools require wallet authentication.

get_balance

Get current available collateral. Core does not expose a reserved/locked breakdown. Returns: { accountId, available, updatedAt }; available is an exact decimal string. An unfunded account returns { available: null, note }. Transport: HTTP (query API, Bearer)

get_account

Get full account summary (balance and positions). Returns: { accountId, walletPubkey, feeTier, available, positions: [{symbol, quantity, avgPrice, updatedAt}] } Transport: HTTP (query API, Bearer)

get_positions

Get all open positions. Returns: Array of { symbol, quantity, avgPrice, updatedAt } — raw positions only. Mark, PnL, current value, and breakeven enrichment is not available in alpha. Transport: HTTP (query API, Bearer)

get_trade_history

Get recent trade fills/executions. Transport: HTTP (query API, Bearer)

Wallet (1 tool)

create_wallet

Create a new Solana wallet for trading. The wallet is encrypted and stored locally. Returns the wallet address. Transport: local

Spot (1 tool)

get_index_price

Get the underlying spot/index price for an asset, from the oracle feed. Returns: { asset, price, timestamp } Transport: WebSocket (oracle)
Removed at core cutover. get_greeks, get_price_history, get_positions_with_metrics, get_order_history, and get_profiles are no longer part of the tool set — the core exchange exposes no public Greeks, candle, position-metrics, terminal-order-history, or social surface. An absent tool is better agent UX than one that always errors.

Resources

MCP resources provide read-only data snapshots that clients can request. Resources return JSON. They’re useful for MCP clients that support resource browsing.

Prompts

MCP prompts are pre-built multi-step workflows that guide the AI agent through structured analysis.

analyze-position

Analyze a specific options position from raw position data, a synthesized quote, and spot. (Greeks, mark, and IV are not available in alpha, so the analysis is reduced accordingly.)

screen-opportunities

Screen observable 0DTE candidates using quotes, liquidity, spot distance, breakeven, and max loss. The prompt does not claim to identify a single best trade without IV, greeks, or probability inputs.

build-strategy

Construct an options strategy based on market outlook (analysis only — each leg must be executed as a separate place_order call).

Instrument ID format

All instrument IDs follow this pattern:
Use list_instruments to discover valid IDs. Instruments are 0DTE (same-day expiry) and refresh daily.

Configuration

The MCP server loads configuration in this order (highest priority first):
  1. Environment variables (set in your MCP client config or shell)
  2. Config file (~/.joyride/config.toml)
  3. Defaults
A missing config file uses defaults. A malformed config file fails startup instead of silently falling back to a different endpoint or wallet.

Environment variables

Authentication is handled via the stored JWT at ~/.joyride/session.json (created by joyride login). No credential-related env vars are needed in the MCP config.

Config file

The MCP server shares ~/.joyride/config.toml (config schema v2) with the CLI. Run joyride setup to create it interactively — the wizard takes a single origin and derives every service URL from it:

Example workflows

Discover and quote

Place and manage orders

Guided analysis (using prompts)

Troubleshooting

MCP server doesn’t appear in /mcp

Run joyride mcp install --client claude to configure automatically. If you set it up manually, the config must be in .mcp.json at the project root. Restart Claude Code after creating or editing it.

Server shows failed

Check the server logs:
Common causes:
  • No valid session — run joyride login first
  • Node.js version too old — requires >= 20.0.0

Not authenticated. Run joyride login first.

The MCP server could not find a valid JWT at ~/.joyride/session.json. Run joyride login in your terminal to authenticate, then restart your MCP client.

NOT_AUTHENTICATED or session expired errors

Your JWT has expired. Run joyride login again to get a fresh session, then restart your MCP client.

Connection warning

If you see a connection error on startup, the core stack is unreachable. The server starts in degraded mode — tools requiring the WebSocket will return errors, but HTTP query tools still work. Check that JOYRIDE_HTTP_URL is set to a reachable origin (default https://joyride.exchange).

Permission prompts on every tool call

See auto-approve permissions to pre-approve all Joyride tools.

Quotes show all nulls

The order book is empty. Use list_instruments to find instruments with activity.

Debug mode

Check mcp-debug.log for auth status, connection warnings, and errors.