Programmatic CLI for the Robinhood Trading MCP server. It targets the MCP endpoint used by Robinhood's "trading with your agent" feature — see the official Robinhood support article for what agents can do (long equities and options orders, watchlists, market data, scanner, account and P&L tools).
It wraps every MCP tool behind a schema-driven interface so each one stays reachable as the server evolves, adds curated subcommands for the common operations, and never reads another application's credential store.
Pre-built single-file binaries for Linux/macOS/Windows are attached to each GitHub release. No Python required.
macOS (Apple Silicon):
curl -fsSL -o rh https://github.com/cbangera2/robinhood-mcp-cli/releases/latest/download/rh-macos-arm64
chmod +x rh && ./rh --versionLinux x64:
curl -fsSL -o rh https://github.com/cbangera2/robinhood-mcp-cli/releases/latest/download/rh-linux-x64
chmod +x rh && ./rh --versionWindows (PowerShell):
irm https://github.com/cbangera2/robinhood-mcp-cli/releases/latest/download/rh-windows-x64.exe -OutFile rh.exe
.\rh.exe --versionVerify a download against the release's SHA256SUMS.txt:
curl -fsSL -O https://github.com/cbangera2/robinhood-mcp-cli/releases/latest/download/SHA256SUMS.txt
sha256sum -c --ignore-missing SHA256SUMS.txt # macOS: shasum -a 256 -cOr install from source:
python -m pip install .
# or for development
python -m pip install -e ".[dev]"Requires Python 3.11+ (source install only).
The standalone binaries are unsigned, so macOS Gatekeeper / Windows SmartScreen may warn the first time you run them. The source build has no such caveat.
Push a tag named vX.Y.Z; the release workflow builds binaries for Linux x64,
macOS arm64, and Windows x64, then creates a GitHub release with generated
notes:
git tag v0.2.0
git push origin v0.2.0Run the release workflow locally with pytest -q and
pyinstaller --onefile --name rh --clean rh_entry.py first.
# Interactive OAuth: opens the browser, then paste the callback URL
rh setup
# Agent-driven setups: the script polls a callback file and writes the
# authorization URL to <file>.url, so a separate process can drive the browser.
rh setup --callback-file /tmp/rh_cb.txtThe token is stored in state/robinhood_token.json (default) with restrictive
permissions. Or use a static bearer token without writing secrets to shell
history:
ROBINHOOD_MCP_BEARER_TOKEN=... rh checkGlobal flags, or a JSON config file (--config). Start from the checked-in
example and fill in your own account number:
cp config.example.json config.json # config.json is gitignored
$EDITOR config.json # set account_number from `rh accounts`The config schema:
{
"endpoint": "https://agent.robinhood.com/mcp/trading",
"token_file": "state/robinhood_token.json",
"account_number": "000000000"
}account_number is only taken from this config/flag. Tools that require it
(review/place/cancel, positions, portfolio, options) are refused when it is
absent. Pick the account flagged agentic_allowed=true (see rh setup /
rh accounts).
rh tools # every tool the server exposes
rh check # quote, portfolio, positions for IAG
rh quote IAG AEM # quotes (comma-separated also OK)
rh account # portfolio/equity summary
rh accounts # brokerage accounts + agentic flags
rh positions # equity positions
rh orders # recent orders
rh orders --symbol IAG --state filled
rh tradability IAG # tradability flags
rh fundamentals IAG # valuation + trading stats
rh historicals IAG --start-time 2026-01-01T00:00:00Z --interval day
rh price-book IAG
rh watchlists # list watchlists
rh watchlist-items <list_id>
rh earnings IAG # trailing quarters
rh earnings-calendar --days 7
rh pnl --span month # realized P&L
rh scans # saved scans
rh run-scan <scan_id>
rh tax-lots IAG
rh indicators IAG --type rsi --interval day --start-time 2026-01-01T00:00:00Z
rh financials IAG --period quarterly --limit 8
rh indexes --symbols SPX,NDX
rh index-quotes --ids <index_id>
rh realized-pnl --span month --asset-classes equity,option
rh scanner-specs # available scanner filtersOption read commands are read-only. option-review prints the server's order
checks without placing anything.
rh option-level # options eligibility / upgrade link
rh option-chains --underlying SPY
rh option-instruments --chain-symbol SPY --expiration-dates 2026-09-18 --type call
rh option-quotes --ids <instrument_id>
rh option-historicals --ids <instrument_id> --start-time 2026-01-01T00:00:00Z
rh option-positions --nonzero
rh option-orders --placed-agent user
rh option-watchlist
rh option-review --leg <option_id>,buy,open --quantity 1 --type limit --price 200A single leg is written option_id,side,position_effect[,ratio_quantity]; multi-leg
orders pass a JSON array to --legs (e.g. --legs '[{"option_id":"...","side":"buy","position_effect":"open"}]').
option-place and option-cancel prompt for confirmation unless --yes is
given. Options require an account_number (agentic-allowed).
rh option-review --leg <option_id>,buy,open --quantity 1 --type limit --price 200
rh option-place --leg <option_id>,buy,open --quantity 1 --type limit --price 200 --yes
rh option-cancel <order_id> --yesrh watchlist-popular
rh watchlist-create --name "gold miners" --emoji ⛏️
rh watchlist-update <list_id> --name "renamed"
rh watchlist-add <list_id> --symbols IAG,AEM
rh watchlist-remove <list_id> --symbols IAG
rh watchlist-follow <list_id>
rh watchlist-unfollow <list_id>rh scan-create --preset default --filters '[{"filter_type":"FILTER_TYPE_PRICE","value":10}]' --title "my scan"
rh scan-filters <scan_id> --filters '[...]'
rh scan-config <scan_id> --sorting-column market_cap --sorting-direction descplace and cancel prompt for confirmation unless --yes is given. Orders
require an account_number (agentic-allowed).
rh review IAG --side buy --type market --quantity 1
rh place IAG --side buy --type market --quantity 1 --yes
rh place IAG --side buy --type limit --quantity 1 --limit-price 18.00 --yes
rh cancel <order_id> --yesAny MCP tool is reachable via call, with arguments as JSON or repeated
--arg key=value (values are coerced to the schema's declared types):
rh call get_equity_quotes --args '{"symbols": ["IAG"]}'
rh call get_earnings_calendar --arg start_date=2026-01-01 --arg days=14
rh call search --arg query=apple --arg limit=5- Read commands never touch your portfolio.
- Order-mutating commands (
place,option-place,cancel,option-cancel, watchlist/scanner writes) require explicit--yesconfirmation where applicable. account_numberis never auto-derived fromget_accounts; if it is missing the command is refused.- This tool is for programmatic research/operations. It is not investment advice.
pytest -q
ruff check rh_mcp_cli tests