I just tried Robinhood's alleged "Agentic Trading". I am not impressed.
A half-baked API suite masquerading as artificial intelligence.
The headlines did not match reality
Spoiler: I couldn't even connect it in production.
“Robinhood launches agentic trading.”
Fortune · May 27, 2026 · verbatim
Read the original on Fortune
What picture do you draw in your head?
I'm thinking something like an AI trading marketplace: autonomous bots running their own strategies, live, against real money.
One bot might follow the infamous Nancy Pelosi, whose disclosed returns rival those of some of the best quant firms on the planet.
÷ annual salary
Another bot might trade like a cracked quant at Jane Street: studying nothing but the regime shifts between AI names and oil stocks, drawing more statistical conclusions than a data science student in year seven of his PhD.
Instead, we got a half-baked API launch masquerading as artificial intelligence. If the headline had read "Robinhood launched an API you can point Claude Code to," that would be FAR more accurate. I guess they needed some way to say the words "AI" in their next earnings report.
I tried the Robinhood MCP server. I connected it to a real AI trading agent. It does not work.
Here is why I am NOT impressed.
Full disclosure
I actually love this company
I did not set out to write this article.
I love Robinhood.
I've been long HOOD for over two years, since it was $20 a share. Whenever a neckbeard starts sputtering about GameStop, I'm the first to come to Robinhood's defense.
I have been a Robinhood stan since day one. If I were being shady, this is the part where I tell you the launch is the best thing since sliced bread and drop a referral link.
I am not. I am stating facts.
My HOOD position. Held 768 days. Not selling.
The article I wanted to write was a victory lap: connect the MCP, point it at Diamond-Hands Nance, and sit back with an infinite money glitch while I sang Kumbaya on a traditional African bongo. That was the plan.
Then I wired it into Claude Code and my own trading platform, and the launch came up short of what I expect from a $100 billion company. I am one guy in a two-bedroom apartment, and my MCP server exposes more than twice the tools Robinhood's does, including genetic optimization, walk-forward analysis, and scheduled trading agents.
I shipped AI trading bots! Robinhood shipped an API!
| Capability | Robinhood MCP | NexusTrade MCP |
|---|---|---|
| Place equity orders | ✓ | ✓ |
| Single-leg options | ✓ | ✓ |
| Multi-leg options (spreads) | ✗ | ✓ |
| Cryptocurrency | ✗ | ✓ |
| Stock screening | ✗ | ✓ |
| Deep research | ✗ | ✓ |
| Backtesting | ✗ | ✓ |
| Automated quantitative analysis | ✗ | ✓ |
| Genetic optimization | ✗ | ✓ |
| Walk-forward analysis | ✗ | ✓ |
| Custom strategies from technicals, fundamentals, economic & unstructured data | ✗ | ✓ |
| Scheduled trading agents | ✗ | ✓ |
| Total MCP tools | 44 | 113 |
Tool counts pulled live from each MCP server, July 2026.
What it actually is
Great in a chat window. Painful in an app.
At the bare minimum, the request shapes are straightforward. In fact, MCP demands it.
Using Robinhood's new MCP, you can do the bare minimum you would expect
from a trading platform: place_equity_order,
get_portfolio, get_equity_quotes, single-leg
option orders, watchlists, scans. In Claude Code, it genuinely works.
For a retail user poking at their account from a chat window, that is a cool product.
For a trader trying to launch trading bots, it is painfully and obviously short.
Let's get to the basics. Robinhood clearly did not build this for SaaS apps to integrate with. They wanted a quick headline boost. How do I know? The launch itself gives it away.
They ship great articles on "How to connect Claude Code to Robinhood" and "Connecting Cursor to Robinhood agents." What they do not ship is the one thing we all learned about in Intro to CS.
Documentation.
There is no documented request or response format. I scoured the web for
it. The docs tell you how to connect and what each tool does. They never
tell you what a tool returns. There is no reference for the output of
get_equity_positions, of get_portfolio, or of a
placed order.
You can not build an app around this without wasting a bit of real money.
Then it got worse
I could not even test it
The market was closed. When you wire a brokerage into a trading stack, the first thing you do is fill a test order and watch it settle. I could not. Nothing fills when the market is closed.
So I fell back to my default live test: a $1 order of Bitcoin. Crypto trades 24/7. It is how I smoke-test order flow on a night or a weekend.
It failed.
No crypto on the agentic MCP. I hold Bitcoin in my regular Robinhood account, but the agentic stack will not touch it.
I have had algorithmic crypto trading for two years. I would have bet money you could at least buy fucking BTC through an API. You cannot.
And there is no paper trading. Every serious brokerage API I have ever used ships a paper environment. Alpaca. Interactive Brokers. Public. NexusTrade. You wire the agent, place nonsense orders, blow up a fake account, then flip a switch to live.
Robinhood's agentic MCP does not do that. You fund a real account. You place real orders. You lose real money. That is the integration test.
Their safety feature? Tell the API not to make mistakes.
That is the last thing a real quant trader would do. A real quant builds a sandbox, a kill switch, position limits, and a dry run that cannot touch capital. They do not prompt an LLM with "please be careful" and call it risk management.
The reference Robinhood did not ship
So, as a public service, here are the response shapes. Every one below
was captured live on 2026-07-08 against a funded account. If you found
this by googling "Robinhood agentic MCP response format," you are
welcome. Every response is wrapped
{ "data": {...}, "guide": "..." }; unwrap
data first.
Expand the full response reference
Orders
{ "data": { "order": { // SINGULAR "order", not an array
"id": "...", "symbol": "", // symbol is EMPTY on the place response
"side": "buy", "type": "market",
"state": "queued",
"quantity": "0.290000",
"average_price": null, // null here; populated on the get_* read
"last_transaction_at": null,
"placed_agent": "agentic",
"ref_id": "..."
} } }
{ "data": { "orders": [ {
"id": "...", "instrument_id": "...", "symbol": "SOFI",
"side": "buy", "type": "market", "state": "filled",
"quantity": "0.290000", "cumulative_quantity": "0.290000",
"price": null, "average_price": "17.370000", // per-share
"fees": "0.00", "dollar_based_amount": "5.04",
"time_in_force": "gfd", "market_hours": "regular_hours",
"trigger": "immediate", "placed_agent": "agentic",
"created_at": "...", "last_transaction_at": "...", // populated on EQUITY fills
"executions": [ { "id":"...", "price":"17.370000",
"quantity":"0.290000", "timestamp":"...", "fees":"0.00" } ]
} ] } }
{ "data": { "orders": [ {
"id": "...", "chain_id": "...", "chain_symbol": "SOFI",
"state": "filled", "type": "limit",
"direction": "debit", // "credit" on a sell-to-close
"quantity": "1", "processed_quantity": "1",
"pending_quantity": "0", "canceled_quantity": "0",
"price": "0.48", "premium": "48.00",
"processed_premium": "48", // TOTAL dollars = 0.48/share x 100
"trade_value_multiplier": "100.0000",
"opening_strategy": "long_call", // closing_strategy on a close; the other is null
"placed_agent": "agentic",
"created_at": "...", "updated_at": "...", // fill time lives in updated_at ...
"last_transaction_at": null, // ... NOT here (null even when filled)
"legs": [ {
"id":"...", "option_id":"...", "side":"buy", "position_effect":"open",
"ratio_quantity": 1, "expiration_date":"2026-08-21",
"strike_price":"22.0000", "option_type":"call",
"executions": [ { "id":"...", "price":"0.48", // per-share
"quantity":"1", "timestamp":"...", "settlement_date":"..." } ]
} ]
} ] } }
{ "data": { "accepted": true } }
Positions
{ "data": { "results": [ {
"symbol": "SOFI",
"quantity": "0.290000", "intraday_quantity": "0.290000",
"average_buy_price": "17.380000", // cost field is average_buy_price
"shares_available_for_sells": "0.290000", // size a sell off THIS, not quantity
"shares_held_for_sells": "0.000000",
"shares_held_for_options_events": "0.000000",
"type": "long" // no live price field; call get_equity_quotes
} ] } }
{ "data": { "results": [ {
"option_id": "...", // the ONLY reference to the contract
"chain_id": "...", "chain_symbol": "SOFI",
"type": "long", // DIRECTION (long/short), NOT call/put
"quantity": "1.0000",
"average_price": "48.0000", // PER-CONTRACT total (0.48/share x 100)
"expiration_date": "2026-08-21",
"trade_value_multiplier": "100.0000",
"opened_at": "..."
// NO strike_price. NO call/put. NO OCC symbol.
} ] } }
The gotcha that causes reconciliation drift
An option position row carries no strike and no call/put, only an
option_id. You must resolve it with
get_option_instruments(ids=option_id). Robinhood also
returns two rows per contract (a long and a
short); only the held side has a non-zero
quantity, so skip the zero rows.
{ "data": { "instruments": [ {
"id": "...", // matches the position's option_id
"chain_id": "...", "chain_symbol": "SOFI",
"underlying_type": "equity",
"expiration_date": "2026-08-21",
"strike_price": "22.0000", // here is the strike ...
"type": "call", // ... and the call/put
"state": "active", "tradability": "tradable"
} ] } }
Account & market-data shapes (get_accounts, get_portfolio, quotes, chains)
{ "data": { "accounts": [ {
"account_number": "...",
"agentic_allowed": true, // only agentic_allowed accounts can trade
"option_level": "option_level_2"
} ] } }
{ "data": {
"total_value": "3494.90",
"cash": "...",
"buying_power": { "buying_power": "3446.92" }
} }
{ "data": { "results": [ { "quote": {
"symbol": "SOFI", "last_trade_price": "17.39",
"bid_price": "17.38", "ask_price": "17.40"
} } ] } }
{ "data": { "results": [ { "quote": {
"instrument_id": "...", "bid_price": "0.42", "ask_price": "0.45",
"mark_price": "0.435", "greeks": { "delta": "...", "theta": "..." }
} } ] } }
{ "data": { "chains": [ {
"id": "...", "symbol": "SOFI",
"expiration_dates": [ "2026-08-21", "..." ],
"trade_value_multiplier": "100.0000"
} ] } }
Rejections
{ "non_field_errors": [
"We're required to have you answer some questions about your
investing goals before we can allow you to continue using Robinhood."
] } // thrown before the account's SECOND trade
Options-not-approved is caught earlier:
option_level below 2 blocks every option call.
Options
A debit spread is too much to ask
Fine. Test with options instead. But I am not about to smoke-test a bot by dumping $10,000 into naked calls. I would want the lowest-risk structure there is: a debit spread.
A debit spread is not supported through the MCP. Two legs. Defined, capped risk. The first options structure anyone learns… at least after leaving WallStreetBets, and you cannot place it here.
That is ridiculous when even Public supports multi-leg, and has for months.
Whatever. I went to bed and waited for the market to open. Once 9:30am rang and the market plummeted, I made my first trade. A naked call, of course. Thanks, Robinhood.
Thankfully, I only lost about $5. But that's because I was smart.
About $5 to test what should be the de-facto standard of any trading API is absurd, but at least the order went through without errors.
Down $5.10 on the day. That is the documentation fee.
The tally
They keep asking questions they already know the answers to
So I cannot trade options the way I actually trade them. I cannot buy Bitcoin. And there is seemingly only one agentic account per user.
Want to deploy two independent strategies? You can't. They will always co-mingle in the same account. Robinhood is praying you have one great idea. That is not realistic.
And the platform keeps trying to block the trades I can make. Robinhood has asked me to complete my investor profile at least three times now. Once when I created an account 5+ years ago. And twice since connecting the MCP.
Why?
Like, I don't understand why I need to complete the same form more than once. Robinhood knows my trading. They know I buy debit spreads and long calls and that I'm up over $65,000 in the past 3 years. It couldn't have taken more than a single sprint for them to derive this information.
My Robinhood account. Up $65,576.55 all-time. Debit spreads and long calls sitting right there.
But I digress.
The close
It works on localhost. It does not work in production.
I was ready to look ahead beyond the flaws. I funded an account. I implemented the integration. I wanted to ship this and create a follow-up saying “so here's how I fixed it!”
I couldn't.
I built a full Robinhood integration for NexusTrade… equities,
single-leg options, account-requirement surfacing, the whole stack. On
localhost, OAuth completes, tokens refresh, orders fill. I
was excited to ship it, but on nexustrade.io the same flow
did not work.
Same client ID. Same PKCE flow. Same redirect URI registered through
Robinhood's dynamic client registration endpoint. Same authorize URL
(robinhood.com/oauth, which Robinhood then redirects to their
/mcp/trading consent screen). You click Allow. You land on
robinhood.com/oauth/error.
Click Allow. Get an error. No code. No callback. No connection.
I debugged this for over two hours, and then had AI reveal the truth.
Apparently this is the answer. OAuth treats loopback redirects
(http://localhost:…) as a special case for
native/desktop apps.
Localhost succeeds even when it is not the only URI on the registration.
Hosted HTTPS callbacks (like
https://nexustrade.io/live-trading/robinhood) are not.
I un-shipped the feature this article originally pointed at. I cannot even integrate my agent into Robinhood because I literally cannot. The integration code is done and sitting behind a flag.
That is the punchline. The MCP looks like a real API. Response shapes check out. Redirect URIs register fine. Then authorization fails. In reality, what they launched is worse than an API. It is an API you can only use on localhost because some engineers were either too lazy to finish the 10 LOC integration, or their acceptance criteria did not include it. I do not know which is worse.
Even my solo-dev project does not have such a ridiculous limitation.
NexusTrade ships its own MCP with OAuth 2.1 and dynamic client
registration. Production HTTPS redirects work. Localhost works for dev.
For live-trading broker connections, Alpaca, Public, Tradier, and
TradeStation all OAuth back to nexustrade.io. Robinhood is
the outlier. Its agentic MCP OAuth only completes on localhost. That is
table stakes. Robinhood launched something dressed up for an earnings call
that only works if you are already running a terminal on your laptop.
FWIW, I'm still glad Robinhood is moving toward programmatic trading. They are my favorite brokerage. But this is not agentic trading for the web. It is agentic trading for the terminal, and only if Robinhood feels like honoring the redirect that day.
Agents should DO things, not just act as a standard CRUD API you are forced to run on localhost.
Sign up for NexusTrade and create your own AI trading bot. Describe a strategy in plain English, backtest it, and deploy it. Actual agents. Not a CRUD API dressed up for an earnings call.
Create your AI trading bot →
No comments yet.