robinhood-chain-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@robinhood-chain-mcpget current gas price on Robinhood Chain"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
robinhood-chain-mcp
MCP server for Robinhood Chain — an Arbitrum Orbit L2 settling on Ethereum, fully EVM-compatible, gas paid in ETH.
105 tools: JSON-RPC reads, Arbitrum Orbit precompiles, explorer-indexed discovery, ERC-20/721/1155, Robinhood Stock Tokens, Uniswap v4, Chainlink price oracles, EIP-3009/EIP-2612 tooling, x402 payment helpers, offline encoding utilities, and unsigned transaction builders.
Read and build only. This server never holds keys, never signs, and never broadcasts. Transaction and authorization tools return unsigned payloads for external signing.
Networks
Network | Chain ID | RPC | Explorer |
Robinhood Chain |
|
| robinhoodchain.blockscout.com |
Testnet |
|
| explorer.testnet.chain.robinhood.com |
Both chain IDs were confirmed via eth_chainId against the live RPCs, not taken from docs. The testnet explorer is not in the documentation — it was found in the docs-site JS bundle and verified live. (An earlier guess at robinhoodchain-testnet.blockscout.com 404s, which is a good reminder that a guessed hostname returning 404 proves nothing about whether a service exists.)
ROBINHOOD_NETWORK=mainnet|testnet # default mainnet
ROBINHOOD_RPC_URL=https://... # override, e.g. a private nodeRelated MCP server: hood-mcp
Install
npm install -g @purplesquirrel/robinhood-chain-mcp{
"mcpServers": {
"robinhood-chain": {
"command": "robinhood-chain-mcp",
"env": { "ROBINHOOD_NETWORK": "mainnet" }
}
}
}The interesting part: detecting EIP-3009 on a Diamond
USDG is the chain's native stablecoin and matters more than a typical ERC-20, because Robinhood Chain has no canonical USDC — USDC bridged in from any of the 13 supported source chains arrives as USDG. So whether USDG supports EIP-3009 transferWithAuthorization decides whether gasless, third-party-submitted payments (x402's exact scheme, among others) are possible on this chain at all.
Answering that is harder than it looks. USDG is an EIP-2535 Diamond: its functions live in facet contracts the proxy delegates to, so scanning the proxy's bytecode for selectors reports nothing found — a confident false negative. There's a test in this repo that asserts exactly that failure mode, so the reasoning doesn't get lost.
probe_token_capabilities uses the reliable signal instead — the revert:
Call two selectors that cannot exist (
0xdeadbeef,0xbaadf00d) to learn the chain's unknown-function error empirically, rather than assuming it.Call each real selector with deliberately invalid arguments.
Reverting with the unknown-function error → absent. Reverting with anything else → present, and validating its inputs.
For USDG:
Call | Revert | Verdict |
|
| present |
|
| present |
|
| present |
|
| present (EIP-2612) |
controls |
| — |
The EIP-712 domain
USDG doesn't expose version(), so its domain was derived by matching the on-chain DOMAIN_SEPARATOR rather than guessed:
name="Global Dollar", version="1", chainId=4663,
verifyingContract=0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
→ 0x7a3d7400b27830f4f91c2c16a082486d67c1befecaec2f53b33f1f35d5b62036 ✓ exact matchusdg_info re-checks this against the live contract on every call. A Diamond upgrade that changed the domain would otherwise silently invalidate every signature built from it.
Tools
Chain (4) — chain_info, get_block, gas_price, estimate_gas
Arbitrum Orbit (12) — arb_block_number, block_number_context, arb_chain_id, arbos_version, arb_gas_prices, arb_l1_base_fee, arb_min_gas_price, arb_gas_accounting, arb_l1_pricing, estimate_l1_component, precompile_status, build_l2_to_l1_withdrawal
Account (5) — get_balance, get_nonce, is_contract, get_token_balance, list_token_holdings
Contract (3) — read_contract, raw_call, build_transaction
Transaction (4) — get_transaction, get_receipt, address_transactions, get_logs
ERC-20 (7) — token_metadata, token_allowance, multi_token_balance (Multicall3), build_token_transfer, build_token_approve, decode_transfer_log, token_transfer_history
NFT (7) — nft_owner, nft_token_uri, nft_balance, nft_collection_info, erc1155_balance, detect_token_standard, address_nfts
Token discovery (4) — list_tokens, token_info, known_assets, chain_stats
Explorer (11) — address_info, address_token_transfers, address_internal_transactions, contract_source, contract_abi, explorer_search, token_holders, token_transfers, latest_blocks, block_transactions, verified_contracts
EIP-3009 / EIP-2612 (12) — probe_token_capabilities, usdg_info, check_authorization, build_transfer_authorization, verify_authorization_signature, build_receive_authorization, build_cancel_authorization, build_permit, build_transfer_authorization_calldata, list_eip3009_assets, authorization_digest, verify_domain_separator
x402 (5) — x402_network_id, x402_build_payment_requirements, x402_build_payment_payload, x402_check_facilitator, x402_decode_payment_header
Robinhood Stock Tokens (8) — verify_stock_token, stock_token_info, stock_balance, check_corporate_action, check_address_blocked, stock_token_registry, list_stock_tokens, stock_token_terms
Uniswap v4 (6) — uniswap_contracts, uniswap_pool_id, uniswap_pool_state, uniswap_pool_liquidity, uniswap_fee_growth, uniswap_find_pool
Price oracles (6) — price_feed_registry, get_token_price, get_stock_price, read_price_feed, list_price_feeds, check_price_freshness
Offline utilities (11) — keccak_hash, function_selector, event_topic, checksum_address, encode_abi, decode_abi, decode_calldata, to_wei, from_wei, hex_convert, random_nonce
Orbit specifics worth knowing
block_number_context exists because of a real trap: eth_blockNumber and the block.number a contract observes are different numbers on this chain (~13.1M vs ~25.5M at time of writing). A contract reading block.number sees the L1 height, advancing at L1 pace. Deadlines computed from it move ~6x slower than you would expect from L2 block times.
precompile_status probes each Arbitrum precompile with a real call rather than trusting that a canonical address implies a working precompile. On this chain ArbSys and ArbGasInfo respond; ArbOwnerPublic and ArbWasm revert, so there is no Stylus support here. Tools for those are deliberately absent rather than shipped broken.
Stock Tokens: two traps
Corporate actions move the multiplier, not balances. Dividends and splits are applied through an on-chain uiMultiplier (ERC-8056) that changes the shares-per-token ratio while raw balances stay fixed. Reading balanceOf and presenting it as a share count is wrong after any corporate action — stock_balance returns both, and says which to display.
Ticker squatting is rampant, and there is no registry to check against. The explorer lists several contracts per ticker; Robinhood's docs warn that a matching ticker proves nothing but publish no canonical list. uiMultiplier() turns out to be a reliable discriminator — the genuine tokens implement it, the copies do not. verify_stock_token("TSLA") returns the real Tesla • Robinhood Token and separately lists the "TSLA CAT" impostors.
The AccessControlsRegistry (0xe10b6f6B...151b00) was found by calling a token's own ACCESS_CONTROLLED_REGISTRY(), not from docs. It gates transfers via isBlocked(address) and doubles as the EIP-1967 beacon behind every Stock Token proxy — so it does not enumerate them.
Price oracles: three systems, easily confused
PriceFeedRegistry (0x4C5CE5…f846f) maps a token address to a Chainlink feed — WETH resolves to ETH / USD. It does not cover Stock Tokens: getTokenPrice on one reverts PriceFeedNotFound().
Stock prices are standalone aggregators, discoverable only by their description() string, in two conventions — Robinhood AAPL / USD and RHTSLA / USD. Nothing on-chain links a Stock Token to its feed, so the mapping is by ticker, not address. Several proxies front the same underlying aggregator, so get_stock_price dedupes on aggregator().
PriceFeed (0x4EE2F9…) is a red herring: it has endpoint/eid/estimateFee, making it a LayerZero messaging-fee oracle, unrelated to asset prices.
Two safety findings, both surfaced by the tools:
Equity feeds go stale by design. AAPL was last updated Friday 19:47 UTC and read 1.6 days old on a Sunday. That is correct — markets were closed — but it breaks both naive approaches: a crypto-style staleness threshold rejects every stock price outside trading hours, while an integration that ignores age serves a Friday close as a live quote.
check_price_freshnessclassifies the feed as equity and judges accordingly.sequencerUptimeFeedis unset (0x0). The registry supports Chainlink's L2 sequencer-uptime gating but has none configured, so no read is protected against post-downtime staleness. Reported byprice_feed_registry.
Uniswap v4
Verified on-chain, not from tags: StateView's own poolManager() returns the recorded PoolManager, which is self-confirming. The Quoter that Blockscout tags has no code, so quoting tools are deliberately omitted rather than shipped broken.
uniswap_find_pool sweeps the standard fee tiers, since v4 pools are not enumerable. WETH/USDG is live on all four; the derived price checks out against the explorer's spot ETH price to within 0.4%.
chain_info reports chainIdMatchesConfig — if an ROBINHOOD_RPC_URL override points at a different chain, you find out immediately instead of operating against the wrong network.
Development
npm install
npm run build
npm run quality # typecheck + live testsCI split
Two workflows, deliberately separated:
ci.ymlgates every push — typecheck, build, dist shape, and an MCP handshake asserting the tool set is well-formed (count, unique names, description quality). Fully hermetic; no chain access.live.ymlruns daily on a schedule. These assert real on-chain state, so a failure means the chain moved, not the code — a USDG upgrade changingDOMAIN_SEPARATOR, the EIP-3009 probe going dark, a feed disappearing. Running them per-push would just produce red builds from RPC rate limits and weekend-stale equity feeds.
Tests run against live mainnet — no mocks. They assert that the chain IDs still match, that USDG's DOMAIN_SEPARATOR hasn't drifted, that the capability probe still finds EIP-3009, and that a bytecode scan still wouldn't. A separate suite drives the server over a real MCP stdio handshake.
The Blockscout client retries 5xx with backoff (public explorer, rate-limited under bursts) and never retries 4xx.
Status
v0.1.0. Not published. Read-and-build only; no keys, no signing, no broadcasting.
test/smoke-all.mjs calls every registered tool against live mainnet and fails the run on any unexpected error — a tool count means nothing if the tools do not work. Current: 102 pass, 3 expected-error (NFT calls against a non-NFT contract), 0 fail.
The RPC client retries 429/5xx with backoff and distinguishes TransportError from RpcError. That distinction is load-bearing: capability probes read reverts as evidence, so a swallowed rate-limit would be reported as "this selector is absent" or "this is not a stock token" — an outage turned into a false claim about a contract.
Available Tools
105 toolsaddress_infoC
Explorer summary for an address: balance, contract status, verification, transaction count.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
address_internal_transactionsB
Internal transactions (contract-initiated value transfers) for an address.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| address | Yes |
address_nftsC
NFTs held by an address, via the explorer index. Mainnet only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| address | Yes |
address_token_transfersC
Token transfers involving an address, from the explorer index.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| address | Yes |
address_transactionsB
Recent transactions for an address, via the explorer index. Mainnet only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| address | Yes |
arb_block_numberA
L2 block number from the ArbSys precompile. This is the value eth_blockNumber returns — distinct from the block.number a contract observes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arb_chain_idA
Chain ID reported by the ArbSys precompile, cross-checked against eth_chainId.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arb_gas_accountingA
Speed limit, gas pool size, and max transaction gas from ArbGasInfo.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arb_gas_pricesA
Full gas price breakdown from ArbGasInfo: per-L2-tx, per-L1-calldata-byte, per storage allocation, and the base fee components.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arb_l1_base_feeA
Current L1 base fee estimate used for data-availability pricing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arb_l1_pricingB
L1 pricing internals: surplus, per-batch gas charge, and the amortized cost cap.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arb_min_gas_priceB
Minimum gas price (floor) enforced by the chain.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
arbos_versionA
ArbOS version running on this chain.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
authorization_digestA
Compute the EIP-712 digest a wallet will be asked to sign for a given authorization, without signing it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| nonce | Yes | ||
| token | No | USDG | |
| value | Yes | ||
| validAfter | Yes | ||
| validBefore | Yes |
block_number_contextA
Explain the three different 'block numbers' on this chain: the L2 height from eth_blockNumber, the L1 height a contract sees via block.number, and ArbSys.arbBlockNumber(). Getting these confused is the most common Orbit integration bug.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
block_transactionsC
All transactions in a given block, from the explorer index.
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | Block height, hash, or 'latest' | latest |
| limit | No |
build_cancel_authorizationB
Build the EIP-712 payload to cancel an unused EIP-3009 authorization before it can be redeemed.
| Name | Required | Description | Default |
|---|---|---|---|
| nonce | Yes | ||
| token | No | USDG | |
| authorizer | Yes |
build_l2_to_l1_withdrawalA
Build an UNSIGNED ArbSys.withdrawEth call to start an L2->L1 ETH withdrawal. Returns calldata only; this server never signs. Note the multi-day challenge period before the L1 claim can be executed.
| Name | Required | Description | Default |
|---|---|---|---|
| amountWei | Yes | ||
| destination | Yes | L1 recipient address |
build_permitB
Build an EIP-2612 permit payload (gasless approval). Requires the token's current nonce, which is read on-chain.
| Name | Required | Description | Default |
|---|---|---|---|
| owner | Yes | ||
| token | No | USDG | |
| amount | Yes | ||
| spender | Yes | ||
| validForSeconds | No |
build_receive_authorizationA
Build the EIP-712 payload for receiveWithAuthorization. Unlike transferWithAuthorization, only the payee may submit it — which closes the front-running window where anyone can relay a valid authorization.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| nonce | No | ||
| token | No | USDG | |
| amount | Yes | ||
| validForSeconds | No |
build_token_approveB
Build UNSIGNED calldata for an ERC-20 approve. Set unlimited=true for the max-uint256 allowance.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | ||
| amount | No | 0 | |
| spender | Yes | ||
| unlimited | No |
build_token_transferA
Build UNSIGNED calldata for an ERC-20 transfer. Amount is parsed against the token's real decimals; over-precise amounts are refused rather than truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| token | Yes | ||
| amount | Yes |
build_transactionA
Build an UNSIGNED transaction for external signing. This server never holds keys and cannot broadcast.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| data | No | 0x | |
| from | Yes | ||
| value | No | Wei, decimal or hex | 0 |
build_transfer_authorizationB
Build the EIP-712 payload for a gasless EIP-3009 transfer, ready for external signing. Returns the typed-data struct — this server never signs.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| nonce | No | 32-byte hex; randomly generated if omitted | |
| token | No | USDG | |
| amount | Yes | Human amount, e.g. '1.5' — converted using token decimals | |
| validForSeconds | No |
build_transfer_authorization_calldataC
Assemble the final transferWithAuthorization CALLDATA from a signed authorization, ready for a relayer to submit.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| nonce | Yes | ||
| token | No | USDG | |
| value | Yes | Base units | |
| signature | Yes | 65-byte signature | |
| validAfter | Yes | ||
| validBefore | Yes |
chain_infoA
Get Robinhood Chain network identity and live head: chain ID, RPC, explorer, native currency, latest block, gas price.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
chain_statsA
Explorer-level chain statistics: block time, gas prices, total transactions, market data. Mainnet only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
check_address_blockedA
Check whether an address is blocked by the Stock Token AccessControlsRegistry. Blocked addresses cannot transfer, so a transfer that looks fine will revert.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
check_authorizationA
Check whether an EIP-3009 authorization nonce has already been used. EIP-3009 nonces are random bytes32, not sequential.
| Name | Required | Description | Default |
|---|---|---|---|
| nonce | Yes | 32-byte hex nonce | |
| token | No | USDG | |
| authorizer | Yes | The address that signed the authorization |
check_corporate_actionA
Check for a scheduled dividend or split on a Stock Token: the pending multiplier, when it takes effect, and how it will change holdings. Balances will not move — the multiplier does.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
check_price_freshnessA
Assess whether a feed's price is safe to use: age, round completeness, and the L2 sequencer-uptime caveat. Equity feeds are expected to be stale outside market hours.
| Name | Required | Description | Default |
|---|---|---|---|
| feed | Yes | ||
| maxAgeSeconds | No |
checksum_addressB
Validate an address and return its EIP-55 checksummed form.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
contract_abiA
Fetch just the ABI of a verified contract — feed it to read_contract to call methods without knowing signatures in advance.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
contract_sourceB
Verified source code and ABI for a contract, if the explorer has it.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
decode_abiC
ABI-decode a hex blob against a parameter signature.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| params | Yes |
decode_calldataA
Decode calldata against a known function signature, splitting selector from arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| signature | Yes |
decode_transfer_logC
Decode an ERC-20 Transfer event log into from/to/value.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| topics | Yes | Log topics; topic0 must be the Transfer hash |
detect_token_standardB
Detect whether a contract is ERC-20, ERC-721, or ERC-1155, using ERC-165 supportsInterface with an ERC-20 fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| contract | Yes |
encode_abiA
ABI-encode values against a parameter signature, e.g. params='address,uint256'.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Comma-separated solidity types | |
| values | Yes |
erc1155_balanceC
ERC-1155 balanceOf for an (account, id) pair.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| tokenId | Yes | ||
| contract | Yes |
estimate_gasB
Estimate gas for a call without sending it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target address | |
| data | No | Calldata hex | |
| from | No | ||
| value | No | Wei, decimal or hex |
estimate_l1_componentB
Estimate the L1 data-availability component of a transaction's cost via the NodeInterface precompile — the part a plain eth_estimateGas does not show.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| data | No | 0x | |
| from | No | ||
| value | No | 0x0 |
event_topicA
Compute the topic0 hash for an event signature, e.g. 'Transfer(address,address,uint256)'.
| Name | Required | Description | Default |
|---|---|---|---|
| signature | Yes |
explorer_searchB
Search the explorer for an address, token, transaction, or block.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
from_weiC
Convert base units to a decimal amount.
| Name | Required | Description | Default |
|---|---|---|---|
| decimals | No | ||
| baseUnits | Yes |
function_selectorA
Compute the 4-byte selector for a function signature, e.g. 'transfer(address,uint256)'.
| Name | Required | Description | Default |
|---|---|---|---|
| signature | Yes |
gas_priceA
Current gas price, with an EIP-1559 fee breakdown when the chain provides one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_balanceC
Native ETH balance for an address.
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | latest | |
| address | Yes |
get_blockB
Get a block by number ('latest', 'earliest', a decimal height, or a hex height).
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | Block number or tag | latest |
| includeTransactions | No |
get_logsC
Query event logs by address and/or topics.
| Name | Required | Description | Default |
|---|---|---|---|
| topics | No | ||
| address | No | ||
| toBlock | No | latest | |
| fromBlock | No | latest |
get_nonceC
Transaction count (nonce) for an address.
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | latest | |
| address | Yes |
get_receiptC
Get a transaction receipt, including status and logs.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | Yes |
get_stock_priceA
USD price for a Robinhood Stock Token by ticker. Stock feeds are standalone Chainlink aggregators discoverable only by their description string — both 'Robinhood AAPL / USD' and 'RHAAPL / USD' conventions exist, and this checks for either.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Equity ticker, e.g. AAPL, TSLA, SPY | |
| maxAgeSeconds | No | Flag the price stale beyond this age. Omit for no staleness verdict. |
get_token_balanceB
ERC-20 balance for an address. Accepts a known symbol (e.g. USDG) or a token address.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Symbol or contract address | |
| address | Yes |
get_token_priceA
USD price for a token via the PriceFeedRegistry, with the feed's age. Reverts with PriceFeedNotFound for unregistered tokens, including all Stock Tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Token contract address |
get_transactionC
Get a transaction by hash.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | Yes |
hex_convertC
Convert between hex, decimal, and UTF-8 string.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes |
is_contractC
Whether an address holds contract code, and how much.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
keccak_hashB
keccak256 of a UTF-8 string or hex bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| inputIsHex | No |
known_assetsA
Curated Robinhood Chain assets with verified metadata, including which support EIP-3009 / EIP-2612.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
latest_blocksC
Most recent blocks with transaction counts and gas usage.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
list_eip3009_assetsA
Assets on this chain known to support EIP-3009, and therefore usable for gasless, relayer-submitted payments.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
list_price_feedsA
Discover Chainlink price feeds on this chain by reading each candidate's description(). Deduplicates proxies that front the same underlying aggregator.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Explorer search term | EACAggregatorProxy |
list_stock_tokensA
Find genuine Robinhood Stock Tokens by scanning explorer-indexed tokens and keeping only those implementing uiMultiplier(). There is no on-chain enumeration, so this is a scan, not a registry read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max candidates to probe | |
| query | No | Ticker or name filter, e.g. 'AAPL' |
list_token_holdingsA
All token balances held by an address, via the explorer index. Mainnet only.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
list_tokensA
List ERC-20 tokens on Robinhood Chain, most-held first, via the explorer index. Mainnet only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max tokens to return (page size is 50) | |
| query | No | Filter by name or symbol |
multi_token_balanceA
Read one address's balance across several tokens in a single Multicall3 round-trip.
| Name | Required | Description | Default |
|---|---|---|---|
| tokens | Yes | Symbols or addresses | |
| address | Yes |
nft_balanceB
ERC-721 balanceOf — how many NFTs from a collection an address holds.
| Name | Required | Description | Default |
|---|---|---|---|
| owner | Yes | ||
| contract | Yes |
nft_collection_infoC
ERC-721 collection name, symbol, and total supply where exposed.
| Name | Required | Description | Default |
|---|---|---|---|
| contract | Yes |
nft_ownerC
ERC-721 ownerOf for a token ID.
| Name | Required | Description | Default |
|---|---|---|---|
| tokenId | Yes | ||
| contract | Yes |
nft_token_uriC
ERC-721 tokenURI, with inline data: URIs decoded when present.
| Name | Required | Description | Default |
|---|---|---|---|
| tokenId | Yes | ||
| contract | Yes |
precompile_statusA
Which Arbitrum precompiles are actually usable on this chain. Probes each with a real call rather than trusting that a canonical address implies a working precompile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
price_feed_registryA
Configuration of the PriceFeedRegistry: feed decimals, default staleness bound, and L2 sequencer-uptime protection status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
probe_token_capabilitiesA
Detect whether a token supports EIP-3009 (gasless transferWithAuthorization) and EIP-2612 (permit). Works correctly on EIP-2535 Diamonds, where scanning proxy bytecode reports false negatives.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Symbol (e.g. USDG) or contract address |
random_nonceA
Generate a random 32-byte nonce, suitable for an EIP-3009 authorization. EIP-3009 nonces are random, not sequential.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
raw_callA
Low-level eth_call with hand-built calldata. Returns raw returndata, and identifies the revert selector when the call reverts — useful for probing whether a function exists on a Diamond.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| data | Yes | Calldata hex, including the 4-byte selector | |
| from | No | ||
| block | No | latest |
read_contractA
Call a read-only contract function using a human-readable signature, e.g. 'function balanceOf(address) view returns (uint256)'.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments as strings | |
| block | No | latest | |
| address | Yes | Contract address | |
| signature | Yes | Full function signature, e.g. 'function symbol() view returns (string)' |
read_price_feedB
Read any Chainlink AggregatorV3 feed directly: description, decimals, latest round, and age.
| Name | Required | Description | Default |
|---|---|---|---|
| feed | Yes | Aggregator or proxy address |
stock_balanceA
Balance of a Stock Token, reported BOTH raw and multiplier-adjusted. After any corporate action these differ, and the adjusted figure is the one representing economic exposure — reading balanceOf alone is the standard integration bug.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | ||
| address | Yes |
stock_token_infoA
Full state of a Robinhood Stock Token: metadata, the corporate-action multiplier, raw vs multiplier-adjusted supply, and every pause flag.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Stock token contract address |
stock_token_registryB
The Stock Token AccessControlsRegistry: address, pause state, and its role. It also serves as the EIP-1967 beacon behind every Stock Token proxy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
stock_token_termsC
Legal terms URI published on-chain by a Stock Token. These are securities issued by Robinhood Assets (Jersey) Limited and are restricted in several jurisdictions.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
token_allowanceC
ERC-20 allowance an owner has granted a spender.
| Name | Required | Description | Default |
|---|---|---|---|
| owner | Yes | ||
| token | Yes | ||
| spender | Yes |
token_holdersC
Largest holders of a token, from the explorer index.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| token | Yes |
token_infoA
Detailed token info from the explorer: supply, holders, market data. Mainnet only.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Symbol or contract address |
token_metadataA
Read name, symbol, decimals and total supply directly from a token contract. Tolerates tokens that return bytes32 instead of string.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
token_transfer_historyC
ERC-20 transfer events involving an address, read from chain logs rather than the explorer, so it works on any network.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| address | Yes | ||
| toBlock | No | latest | |
| direction | No | both | |
| fromBlock | No | latest |
token_transfersC
Recent transfers of a specific token.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| token | Yes |
to_weiC
Convert a decimal amount to base units without floating-point rounding.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | ||
| decimals | No |
uniswap_contractsA
Uniswap v4 deployment addresses on Robinhood Chain, each checked for deployed code. Reports which periphery contracts are actually usable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
uniswap_fee_growthB
Global fee growth accumulators for a v4 pool — the basis for computing accrued LP fees.
| Name | Required | Description | Default |
|---|---|---|---|
| poolId | Yes |
uniswap_find_poolB
Search for an initialised v4 pool across the standard fee tiers for a token pair, since v4 pools are not enumerable on-chain.
| Name | Required | Description | Default |
|---|---|---|---|
| hooks | No | 0x0000000000000000000000000000000000000000 | |
| currency0 | Yes | ||
| currency1 | Yes |
uniswap_pool_idA
Compute the Uniswap v4 poolId from a PoolKey. Currencies are sorted automatically — an unsorted key yields a different, non-existent poolId, which is the usual reason a pool 'cannot be found'.
| Name | Required | Description | Default |
|---|---|---|---|
| fee | No | Fee in hundredths of a bip (3000 = 0.30%) | |
| hooks | No | 0x0000000000000000000000000000000000000000 | |
| currency0 | Yes | Token address, or 0x0 for native ETH | |
| currency1 | Yes | ||
| tickSpacing | No |
uniswap_pool_liquidityC
Current in-range liquidity for a v4 pool.
| Name | Required | Description | Default |
|---|---|---|---|
| poolId | Yes | 32-byte poolId |
uniswap_pool_stateA
Read a v4 pool's slot0 via StateView: current sqrt price, tick, protocol fee and LP fee. Accepts a poolId, or a PoolKey to derive one.
| Name | Required | Description | Default |
|---|---|---|---|
| fee | No | ||
| hooks | No | 0x0000000000000000000000000000000000000000 | |
| poolId | No | 32-byte poolId; omit to derive from a PoolKey | |
| currency0 | No | ||
| currency1 | No | ||
| decimals0 | No | ||
| decimals1 | No | ||
| tickSpacing | No |
usdg_infoA
USDG (Global Dollar) details: address, decimals, supply, and its verified EIP-712 domain.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
verified_contractsC
Contracts with verified source on this chain — a quick map of what is actually deployed and public.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
verify_authorization_signatureA
Verify an EIP-3009 signature offline: does it recover to the claimed signer, for this exact token and chain? Catches wrong-domain and cross-chain-replay signatures before they cost gas.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| nonce | Yes | ||
| token | No | USDG | |
| value | Yes | Base units | |
| signature | Yes | ||
| validAfter | Yes | ||
| validBefore | Yes |
verify_domain_separatorA
Recompute a token's EIP-712 DOMAIN_SEPARATOR from its stored domain and compare it against the live contract. A mismatch means the contract was upgraded and stored signatures would be rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | USDG |
verify_stock_tokenA
Determine whether a contract is a GENUINE Robinhood Stock Token or a ticker-squatting copy. The explorer lists multiple contracts per ticker and Robinhood publishes no registry to check against; this probes uiMultiplier(), which only the real tokens implement.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Contract address, or a ticker to search for |
x402_build_payment_payloadB
Assemble the x402 paymentPayload from a signed EIP-3009 authorization, ready to send in the X-PAYMENT header.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| nonce | Yes | ||
| value | Yes | Base units | |
| signature | Yes | ||
| validAfter | Yes | ||
| validBefore | Yes |
x402_build_payment_requirementsC
Build the paymentRequirements object a resource server returns in its HTTP 402 response.
| Name | Required | Description | Default |
|---|---|---|---|
| asset | No | USDG | |
| payTo | Yes | Address that receives payment | |
| amount | Yes | Human amount, e.g. '0.01' | |
| resource | No | URL of the paid resource | |
| description | No | ||
| maxTimeoutSeconds | No |
x402_check_facilitatorA
Query an x402 facilitator's /supported endpoint and report whether it can settle for this chain. Defaults to the hosted facilitator, which does not support Robinhood Chain.
| Name | Required | Description | Default |
|---|---|---|---|
| facilitatorUrl | No | https://x402.org/facilitator |
x402_decode_payment_headerA
Decode a base64 X-PAYMENT header into its payload, and sanity-check it against this chain.
| Name | Required | Description | Default |
|---|---|---|---|
| header | Yes |
x402_network_idA
The CAIP-2 network identifier for this chain, as x402 payloads must express it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
105 tool updates
v0.1.0- First observed
address_info - First observed
address_internal_transactions - First observed
address_nfts - First observed
address_token_transfers - First observed
address_transactions - First observed
arb_block_number - First observed
arb_chain_id - First observed
arb_gas_accounting - First observed
arb_gas_prices - First observed
arb_l1_base_fee - First observed
arb_l1_pricing - First observed
arb_min_gas_price - First observed
arbos_version - First observed
authorization_digest - First observed
block_number_context - First observed
block_transactions - First observed
build_cancel_authorization - First observed
build_l2_to_l1_withdrawal - First observed
build_permit - First observed
build_receive_authorization - First observed
build_token_approve - First observed
build_token_transfer - First observed
build_transaction - First observed
build_transfer_authorization - First observed
build_transfer_authorization_calldata - First observed
chain_info - First observed
chain_stats - First observed
check_address_blocked - First observed
check_authorization - First observed
check_corporate_action - First observed
check_price_freshness - First observed
checksum_address - First observed
contract_abi - First observed
contract_source - First observed
decode_abi - First observed
decode_calldata - First observed
decode_transfer_log - First observed
detect_token_standard - First observed
encode_abi - First observed
erc1155_balance - First observed
estimate_gas - First observed
estimate_l1_component - First observed
event_topic - First observed
explorer_search - First observed
from_wei - First observed
function_selector - First observed
gas_price - First observed
get_balance - First observed
get_block - First observed
get_logs - First observed
get_nonce - First observed
get_receipt - First observed
get_stock_price - First observed
get_token_balance - First observed
get_token_price - First observed
get_transaction - First observed
hex_convert - First observed
is_contract - First observed
keccak_hash - First observed
known_assets - First observed
latest_blocks - First observed
list_eip3009_assets - First observed
list_price_feeds - First observed
list_stock_tokens - First observed
list_token_holdings - First observed
list_tokens - First observed
multi_token_balance - First observed
nft_balance - First observed
nft_collection_info - First observed
nft_owner - First observed
nft_token_uri - First observed
precompile_status - First observed
price_feed_registry - First observed
probe_token_capabilities - First observed
random_nonce - First observed
raw_call - First observed
read_contract - First observed
read_price_feed - First observed
stock_balance - First observed
stock_token_info - First observed
stock_token_registry - First observed
stock_token_terms - First observed
to_wei - First observed
token_allowance - First observed
token_holders - First observed
token_info - First observed
token_metadata - First observed
token_transfer_history - First observed
token_transfers - First observed
uniswap_contracts - First observed
uniswap_fee_growth - First observed
uniswap_find_pool - First observed
uniswap_pool_id - First observed
uniswap_pool_liquidity - First observed
uniswap_pool_state - First observed
usdg_info - First observed
verified_contracts - First observed
verify_authorization_signature - First observed
verify_domain_separator - First observed
verify_stock_token - First observed
x402_build_payment_payload - First observed
x402_build_payment_requirements - First observed
x402_check_facilitator - First observed
x402_decode_payment_header - First observed
x402_network_id
TDQS
Scored across 105 tools
Many tools have similar purposes (e.g., multiple 'build' and 'check' tools for authorizations, multiple methods to fetch token balances and transfers), but descriptions provide enough distinction. Some overlap remains, especially among transaction and token history tools.
Uses a mix of verb_noun (get_, build_, decode_) and noun_noun (chain_info, gas_price) patterns, plus some deviations like to_wei and hex_convert. Within subgroups like arb_* naming is consistent, but overall it is moderately inconsistent.
105 tools far exceeds the 50+ threshold for 'extreme mismatch'. While the scope is broad, the sheer number makes the surface unwieldy and suggests many tools could be consolidated or scoped differently.
Covers almost every aspect of interacting with Robinhood Chain: basic chain queries, tokens, NFTs, Arbitrum specifics, EIP-3009/2612, x402, stock tokens, Uniswap v4, price feeds, and utilities. No obvious gaps for the stated domain.
Maintenance
Related MCP Connectors
Read Vitro markets on Robinhood Chain and prepare unsigned transactions. Unaudited, capped launch.
Read Robinhood Chain live: scan a token, trace its deployer, list new launches.
On-chain honeypot/rug scanner, market data, and launch tools for Robinhood Chain (EVM 4663).
Options on Robinhood Chain: live offers, prices, positions, staking; prepares trades you sign.
211
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables agents to query live Robinhood Chain data including tokens, wallets, Chainlink feeds, heat scores, and tracking error on tokenized equities, all read-only without API keys.411 npmMIT
- FlicenseAqualityBmaintenanceA zero-config data server for read-only queries on Robinhood Chain (stock tokens, memecoins, launches, chain stats) and an opt-in trading server with spend caps and confirm gates for executing swaps and transfers.959 npm8-
- AlicenseNot gradedqualityDmaintenanceEnables reading game state and preparing unsigned transactions for The Floor and StonkBrokers games on Robinhood Chain.1MIT

Stocklayer MCPofficial
AlicenseNot gradedqualityBmaintenanceEnables AI agents to discover tokenized Stock Tokens, read reference prices and wallet balances on Robinhood Chain, create quotes, simulate transactions, and build policy-checked trade plans that return an explainable verdict plus unsigned transactions for a wallet to sign.MIT