robinhood-mcp — Claude Code skill: Robinhood account reports
Pulls your Robinhood Agentic Trading account through the Robinhood MCP: portfolio, buying power, positions, order history. Places an order only when you spell it out.
npx skills add aeonfun/aeon --skill robinhood-mcp -a claude-codeWhat robinhood-mcp does
The skill talks to the server at agent.robinhood.com/mcp/trading and reads what a report needs: portfolio value, buying power, positions with symbol, quantity, cost basis, current value and unrealized P/L, plus open orders. The orders[:N] branch returns the most recent N orders — 10 unless you say otherwise — with status, side, symbol, quantity and fill price.
Read-only is the default posture. An order goes out only when the variable starts with trade:, as in trade: buy $50 of AAPL. Your instruction has to name the side, the symbol and the size. Miss one of the three, or phrase it loosely, and the skill refuses and tells you what it could not pin down. Selling past the position, or buying past buying power, gets refused the same way. Placement is the last action of a run, so a failed order shows up in that same run.
Auth runs over OAuth from the dashboard MCP panel. Tokens live as MCP_ROBINHOOD_TRADING_TOKEN and MCP_ROBINHOOD_TRADING_OAUTH, refreshed by scripts/mcp-oauth-refresh.sh. When no mcp__robinhood-trading__* tool is callable, the server is not connected; a 401 means the refresh failed, and rotating refresh tokens need GH_SECRETS_PAT. There is no static key, so curl against the API gets you nowhere. Trades hit a separate Agentic account with real money and do not reverse.
What it helps with
- check portfolio value and the day's change
- list positions with cost basis and unrealized P/L
- confirm buying power before a purchase
- review the last 10 orders with status and fill price
- place a single dollar-notional buy from a clear instruction
Example prompts for the agent
- Give me a Robinhood account report: portfolio, buying power, positions
- Show my last 20 orders with their statuses
- trade: buy $50 of AAPL
How to install robinhood-mcp
1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill robinhood-mcp -a claude-code2Manually: put the files in place
~/.claude/skills/robinhood-mcp/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/robinhood-mcp/
1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill robinhood-mcp -a codex2Manually: put the files in place
.agents/skills/robinhood-mcp/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill robinhood-mcp -a cursor2Manually: put the files in place
.cursor/skills/robinhood-mcp/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install aeonfun/aeon robinhood-mcp2Manually: put the files in place
.github/skills/robinhood-mcp/SKILL.md1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill robinhood-mcp -a gemini-cli2Platform CLI
gemini skills install https://github.com/aeonfun/aeon --path skills/robinhood-mcpManually: put the files in place
.devin/skills/robinhood-mcp/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill robinhood-mcp -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about robinhood-mcp
How do I install robinhood-mcp in Claude Code?
Run npx skills add aeonfun/aeon --skill robinhood-mcp -a claude-code; the skill lands in ~/.claude/skills/robinhood-mcp/SKILL.md. Then connect the Robinhood Trading server from the dashboard MCP panel.
What does robinhood-mcp do?
It reads your Robinhood Agentic Trading account: portfolio value, buying power, positions, open orders and order history. It can place one order when the instruction starts with trade:.
Why are no mcp__robinhood-trading__* tools available?
The server is not connected, or its secrets are missing. Connect Robinhood Trading in the dashboard MCP panel. If the tools exist but return 401, the OAuth refresh failed and GH_SECRETS_PAT is required.
Source text
SKILL.md · MIT
---
name: robinhood-mcp
description: Read your Robinhood Agentic brokerage account via the Robinhood Trading MCP - portfolio, buying power, positions, and order history - and place a single operator-instructed trade. OAuth Connect via the dashboard MCP panel.
metadata:
capabilities:
- external_api
- writes_external_host
- sends_notifications
title: Robinhood MCP
mode: read-only
category: crypto
tags:
- markets
- trading
- mcp
var: ""
mcp:
- robinhood-trading
---
> **${var}** — empty = portfolio report (read-only). `orders[:N]` = last N orders (default 10). `trade:<instruction>` = place **one** order, e.g. `trade: buy $50 of AAPL` — the only branch that writes. Anything else = treat as a question about the account and answer it read-only.
Access the operator's **Robinhood Agentic Trading** account through the Robinhood MCP server (`agent.robinhood.com/mcp/trading`). Trades execute in a dedicated Agentic brokerage account the operator authorized — real money, irreversible. The default posture is read-only reporting; an order is placed only when `${var}` explicitly instructs it.
## Detection & auth
The server is wired by the dashboard MCP panel's one-click **Connect** (OAuth; tokens stored as `MCP_ROBINHOOD_TRADING_TOKEN` + `MCP_ROBINHOOD_TRADING_OAUTH`, refreshed each run by `scripts/mcp-oauth-refresh.sh`). Its tools surface as `mcp__robinhood-trading__*` — discover them from the server; the tool descriptions are the source of truth, don't assume a fixed list.
- **No `mcp__robinhood-trading__*` tool callable** → the server isn't connected (or its secrets are missing, in which case the workflow logged a `::warning::` and skipped MCP). Log `RH_MCP_NOT_CONNECTED`, notify once pointing the operator at the dashboard → MCP → Connect Robinhood Trading, and exit. Don't try to reach the API with curl — there is no static key.
- **Tools exist but return 401/invalid-token** → the OAuth refresh failed (rotating refresh tokens need `GH_SECRETS_PAT` — see `docs/mcp-oauth.md`). Log `RH_MCP_AUTH_STALE`, notify the operator to re-connect the server once in the dashboard, and exit. Don't retry the same call more than twice.
## Steps
### 1. Read the account
Whatever the branch, start with the reads — portfolio value, buying power, positions (symbol, quantity, cost basis, current value, unrealized P/L), and open orders. For `orders[:N]`, pull order history and take the most recent N (default 10) with status, side, symbol, quantity/notional, and fill price.
### 2. Trade branch (only when `${var}` starts with `trade:`)
Operator-initiated only — never trade on a scheduled/default run, and never invent an order.
1. Parse the instruction. It must pin down **side** (buy/sell), **symbol**, and **size** (share quantity or dollar notional). If any of the three is missing or ambiguous ("buy some tech", "sell half-ish"), do **not** guess: log `RH_MCP_ORDER_REFUSED`, notify with what was missing, and exit.
2. Sanity-check against the reads: selling more than the position holds, or buying beyond buying power → refuse the same way.
3. Place the order as the **final action** of the run (fail-closed: everything else — reads, log prep — happens first, so a placement failure surfaces in this run). Use the order tool the server exposes; prefer its simplest market/notional form unless the instruction specifies a limit price.
4. Capture the server's response verbatim (order id, status). If the tool call fails, log `RH_MCP_ORDER_ERROR` with the error body — never claim an order was placed without an order id back.
### 3. Notify
This skill is on-demand — deliver the result via `./notify -f <file>` (ordinary Markdown), **exactly one `./notify` call per run** (each call overwrites the `.pending-<skill>.md` file the chain artifact is captured from — a second ping would clobber the report):
- **Report branches:** portfolio value + day change, buying power, a positions table, open orders, and one line of what stands out (concentration, a position moving hard). Keep it tight — signal, not a data dump.
- **Trade branch:** the exact order placed (side, symbol, size, order id, status) — or, on refusal, exactly what was ambiguous and how to restate it. Severity `success` for a placed order, `warn` for a refusal.
### 4. Result record
This skill is `read-only`, so the workflow's read-only guard writes its `### robinhood-mcp` log entry from your captured output; a self-written entry would be a duplicate. Don't append to `memory/logs/` yourself - put this record in your **final output**; the workflow persists it to `memory/logs/` and `output/.chains/robinhood-mcp.md` on your behalf after the run:
```
### robinhood-mcp
- Branch: portfolio | orders | trade
- Result: RH_MCP_OK | RH_MCP_ORDER_PLACED id=… | RH_MCP_ORDER_REFUSED reason=… | RH_MCP_NOT_CONNECTED | RH_MCP_AUTH_STALE | RH_MCP_ERROR
- Snapshot: value=$… bp=$… positions=N
```
## Constraints
- **No unprompted trading, no advice.** Report what the account holds; place only the order `${var}` spells out. Never recommend a trade in the notify.
- One order per run — a `trade:` instruction that describes multiple orders is refused, not partially executed.
- Every figure in the notify traces to a tool response; never estimate fills or balances.
- The operator is responsible for every order this agent places — when in doubt, refuse and say why.
© aeonfun · MIT · aeonfun/aeon