00 / SIGNING BENCH · ed25519

Sign a real trade.
No account required.

Every request an agent sends to Robinhood is signed with an Ed25519 key over one exact string. Assemble that string below and produce a genuine signature — the math runs in your browser, on Robinhood's own published example key. Nothing is sent anywhere.

api key
rh-api-6148effc…56be6
timestamp
1698708981
path
/api/v1/crypto/trading/orders/
method
POST
body
{ … order json … }
message = api_key + timestamp + path + method + body
message
signature
verify
awaiting
01 / THE DOCUMENTATION IS WRONG

Robinhood publishes a signature
you can't reproduce.

Their docs hand you a worked example and invite you to check your client against it. That published signature does not match the JSON body a real client sends. Toggle the body below. Your browser re-verifies Robinhood's own signature against each one.

The published vector was generated by signing a Python dictionary's repr() — single quotes, spaces after colons, a different key order than their own table shows — not the JSON that travels the wire. Every working client signs the JSON and is "wrong" against the docs. robinhood-mcp signs the JSON, and pins this exact discrepancy in its test suite.

02 / THE SERVER

An MCP server that
actually trades.

Point Claude, Cursor, or any MCP client at it. A read-only server for quotes, holdings and history — and a separate, opt-in trading server that places real market, limit, stop-loss and stop-limit orders behind hard spend caps and a confirm gate.

# read-only: quotes, holdings, history npx -y robinhood-mcp # place orders (opt-in, spend-capped) ROBINHOOD_CRYPTO_ENABLE_TRADING=1 \ npx -y robinhood-mcp-trading # generate the ed25519 keypair npx -y robinhood-keygen
market · v1 + v2
Accounts, holdings, trading pairs, best bid/ask, estimated price, order history. v2 fee tiers supported, with the required account_number resolved for you.
orders
One typed tool per order type, so an invalid combination cannot be built. Market, limit, stop-loss, stop-limit — sized by asset quantity or quote amount.
portfolio
FIFO cost basis, realized P&L, tax lots, allocation and risk-based sizing — derived from fills, because Robinhood reports what you hold, never what you paid.
dev
Connection diagnostics, a signature explainer, keypair verify, and client codegen for Python, TypeScript and curl — every sample proven by a test that runs it.
03 / EXECUTION LIBRARY · durable jobs

13 order types Robinhood
doesn't have.

Robinhood offers four primitives. Everything below is synthesized on top of them as a durable job that outlives the tool call, survives a restart, and reconciles against the exchange after a crash so a slice is never double-filled.

04 / THERE IS NO SANDBOX

Every order is real money.

Robinhood ships no paper environment. So the guards are enforced in code, not in a prompt — a thrown error, not a polite instruction.

opt-in
The trading server refuses to start without ENABLE_TRADING=1.
per-order cap
Every order priced before submit; rejected over the ceiling. Fails closed if it can't be priced.
confirm gate
Guarded mode previews the exact request first. Autonomous mode is a deliberate switch.
no blind retry
Writes never retry. Recovery reconciles by client_order_id instead.
05 / GET IT

Two commands
from your first trade.

Generate a keypair, register the public half at Robinhood, set two environment variables. The private key is a 32-byte Ed25519 seed and never leaves your machine.

npx -y robinhood-keygen # → register the public key at # robinhood.com/account/crypto export ROBINHOOD_CRYPTO_API_KEY=rh-api-… export ROBINHOOD_CRYPTO_PRIVATE_KEY=… npx -y robinhood-mcp