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 byjoyride login; account creation happens in the web app at joyride.exchange.
Quick start
Prerequisites
- Node.js >= 20.0.0
- The Joyride CLI —
npm install -g joyride-cli(this installs both the CLI and MCP server) - A Joyride wallet — created via
joyride wallet createorjoyride setup - An active session — run
joyride login(stores a JWT at~/.joyride/session.json)
~/.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:claude mcp add under the hood and configures everything automatically.
To verify, run /mcp inside Claude Code. You should see:
.mcp.json in your project root:
Cursor
The fastest way:~/.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
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:~/.joyride/session.json.
Reconfiguring and uninstalling
Update an existing configuration
If you need to reconfigure (e.g., after changing connection URLs):--force flag removes the existing config and writes a fresh one.
Remove MCP from a client
joyride entry from ~/.cursor/mcp.json and preserves all other MCP servers.
Uninstall the CLI entirely
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:
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”
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):- Environment variables (set in your MCP client config or shell)
- Config file (
~/.joyride/config.toml) - Defaults
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:- No valid session — run
joyride loginfirst - 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 thatJOYRIDE_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. Uselist_instruments to find instruments with activity.
Debug mode
mcp-debug.log for auth status, connection warnings, and errors.