Skip to main content
Glama
robinhood-chain-mcp

robinhood-chain-mcp

robinhood-chain-mcp

CI Live chain canary license

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

4663

https://rpc.mainnet.chain.robinhood.com/

robinhoodchain.blockscout.com

Testnet

46630

https://rpc.testnet.chain.robinhood.com/

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 node

Related 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:

  1. Call two selectors that cannot exist (0xdeadbeef, 0xbaadf00d) to learn the chain's unknown-function error empirically, rather than assuming it.

  2. Call each real selector with deliberately invalid arguments.

  3. Reverting with the unknown-function error → absent. Reverting with anything else → present, and validating its inputs.

For USDG:

Call

Revert

Verdict

transferWithAuthorization

0x0f05f5bf AuthorizationExpired()

present

receiveWithAuthorization

0x5454b17d CallerMustBePayee()

present

cancelAuthorization

0x8baa579f InvalidSignature()

present

permit

0x1a15a3cc PermitExpired()

present (EIP-2612)

controls

0x800ab12c FacetNotFound()

—

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 match

usdg_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_freshness classifies the feed as equity and judges accordingly.

  • sequencerUptimeFeed is 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 by price_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 tests

CI split

Two workflows, deliberately separated:

  • ci.yml gates 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.yml runs daily on a schedule. These assert real on-chain state, so a failure means the chain moved, not the code — a USDG upgrade changing DOMAIN_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 tools
address_infoC

Explorer summary for an address: balance, contract status, verification, transaction count.

NameRequiredDescriptionDefault
addressYes
address_internal_transactionsB

Internal transactions (contract-initiated value transfers) for an address.

NameRequiredDescriptionDefault
limitNo
addressYes
address_nftsC

NFTs held by an address, via the explorer index. Mainnet only.

NameRequiredDescriptionDefault
limitNo
addressYes
address_token_transfersC

Token transfers involving an address, from the explorer index.

NameRequiredDescriptionDefault
limitNo
addressYes
address_transactionsB

Recent transactions for an address, via the explorer index. Mainnet only.

NameRequiredDescriptionDefault
limitNo
addressYes
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.

NameRequiredDescriptionDefault

No parameters

arb_chain_idA

Chain ID reported by the ArbSys precompile, cross-checked against eth_chainId.

NameRequiredDescriptionDefault

No parameters

arb_gas_accountingA

Speed limit, gas pool size, and max transaction gas from ArbGasInfo.

NameRequiredDescriptionDefault

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.

NameRequiredDescriptionDefault

No parameters

arb_l1_base_feeA

Current L1 base fee estimate used for data-availability pricing.

NameRequiredDescriptionDefault

No parameters

arb_l1_pricingB

L1 pricing internals: surplus, per-batch gas charge, and the amortized cost cap.

NameRequiredDescriptionDefault

No parameters

arb_min_gas_priceB

Minimum gas price (floor) enforced by the chain.

NameRequiredDescriptionDefault

No parameters

arbos_versionA

ArbOS version running on this chain.

NameRequiredDescriptionDefault

No parameters

authorization_digestA

Compute the EIP-712 digest a wallet will be asked to sign for a given authorization, without signing it.

NameRequiredDescriptionDefault
toYes
fromYes
nonceYes
tokenNoUSDG
valueYes
validAfterYes
validBeforeYes
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.

NameRequiredDescriptionDefault

No parameters

block_transactionsC

All transactions in a given block, from the explorer index.

NameRequiredDescriptionDefault
blockNoBlock height, hash, or 'latest'latest
limitNo
build_cancel_authorizationB

Build the EIP-712 payload to cancel an unused EIP-3009 authorization before it can be redeemed.

NameRequiredDescriptionDefault
nonceYes
tokenNoUSDG
authorizerYes
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.

NameRequiredDescriptionDefault
amountWeiYes
destinationYesL1 recipient address
build_permitB

Build an EIP-2612 permit payload (gasless approval). Requires the token's current nonce, which is read on-chain.

NameRequiredDescriptionDefault
ownerYes
tokenNoUSDG
amountYes
spenderYes
validForSecondsNo
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.

NameRequiredDescriptionDefault
toYes
fromYes
nonceNo
tokenNoUSDG
amountYes
validForSecondsNo
build_token_approveB

Build UNSIGNED calldata for an ERC-20 approve. Set unlimited=true for the max-uint256 allowance.

NameRequiredDescriptionDefault
tokenYes
amountNo0
spenderYes
unlimitedNo
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.

NameRequiredDescriptionDefault
toYes
tokenYes
amountYes
build_transactionA

Build an UNSIGNED transaction for external signing. This server never holds keys and cannot broadcast.

NameRequiredDescriptionDefault
toYes
dataNo0x
fromYes
valueNoWei, decimal or hex0
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.

NameRequiredDescriptionDefault
toYes
fromYes
nonceNo32-byte hex; randomly generated if omitted
tokenNoUSDG
amountYesHuman amount, e.g. '1.5' — converted using token decimals
validForSecondsNo
build_transfer_authorization_calldataC

Assemble the final transferWithAuthorization CALLDATA from a signed authorization, ready for a relayer to submit.

NameRequiredDescriptionDefault
toYes
fromYes
nonceYes
tokenNoUSDG
valueYesBase units
signatureYes65-byte signature
validAfterYes
validBeforeYes
chain_infoA

Get Robinhood Chain network identity and live head: chain ID, RPC, explorer, native currency, latest block, gas price.

NameRequiredDescriptionDefault

No parameters

chain_statsA

Explorer-level chain statistics: block time, gas prices, total transactions, market data. Mainnet only.

NameRequiredDescriptionDefault

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.

NameRequiredDescriptionDefault
addressYes
check_authorizationA

Check whether an EIP-3009 authorization nonce has already been used. EIP-3009 nonces are random bytes32, not sequential.

NameRequiredDescriptionDefault
nonceYes32-byte hex nonce
tokenNoUSDG
authorizerYesThe 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.

NameRequiredDescriptionDefault
tokenYes
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.

NameRequiredDescriptionDefault
feedYes
maxAgeSecondsNo
checksum_addressB

Validate an address and return its EIP-55 checksummed form.

NameRequiredDescriptionDefault
addressYes
contract_abiA

Fetch just the ABI of a verified contract — feed it to read_contract to call methods without knowing signatures in advance.

NameRequiredDescriptionDefault
addressYes
contract_sourceB

Verified source code and ABI for a contract, if the explorer has it.

NameRequiredDescriptionDefault
addressYes
decode_abiC

ABI-decode a hex blob against a parameter signature.

NameRequiredDescriptionDefault
dataYes
paramsYes
decode_calldataA

Decode calldata against a known function signature, splitting selector from arguments.

NameRequiredDescriptionDefault
dataYes
signatureYes
decode_transfer_logC

Decode an ERC-20 Transfer event log into from/to/value.

NameRequiredDescriptionDefault
dataYes
topicsYesLog 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.

NameRequiredDescriptionDefault
contractYes
encode_abiA

ABI-encode values against a parameter signature, e.g. params='address,uint256'.

NameRequiredDescriptionDefault
paramsYesComma-separated solidity types
valuesYes
erc1155_balanceC

ERC-1155 balanceOf for an (account, id) pair.

NameRequiredDescriptionDefault
accountYes
tokenIdYes
contractYes
estimate_gasB

Estimate gas for a call without sending it.

NameRequiredDescriptionDefault
toYesTarget address
dataNoCalldata hex
fromNo
valueNoWei, 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.

NameRequiredDescriptionDefault
toYes
dataNo0x
fromNo
valueNo0x0
event_topicA

Compute the topic0 hash for an event signature, e.g. 'Transfer(address,address,uint256)'.

NameRequiredDescriptionDefault
signatureYes
from_weiC

Convert base units to a decimal amount.

NameRequiredDescriptionDefault
decimalsNo
baseUnitsYes
function_selectorA

Compute the 4-byte selector for a function signature, e.g. 'transfer(address,uint256)'.

NameRequiredDescriptionDefault
signatureYes
gas_priceA

Current gas price, with an EIP-1559 fee breakdown when the chain provides one.

NameRequiredDescriptionDefault

No parameters

get_balanceC

Native ETH balance for an address.

NameRequiredDescriptionDefault
blockNolatest
addressYes
get_blockB

Get a block by number ('latest', 'earliest', a decimal height, or a hex height).

NameRequiredDescriptionDefault
blockNoBlock number or taglatest
includeTransactionsNo
get_logsC

Query event logs by address and/or topics.

NameRequiredDescriptionDefault
topicsNo
addressNo
toBlockNolatest
fromBlockNolatest
get_nonceC

Transaction count (nonce) for an address.

NameRequiredDescriptionDefault
blockNolatest
addressYes
get_receiptC

Get a transaction receipt, including status and logs.

NameRequiredDescriptionDefault
hashYes
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.

NameRequiredDescriptionDefault
tickerYesEquity ticker, e.g. AAPL, TSLA, SPY
maxAgeSecondsNoFlag 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.

NameRequiredDescriptionDefault
tokenYesSymbol or contract address
addressYes
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.

NameRequiredDescriptionDefault
tokenYesToken contract address
get_transactionC

Get a transaction by hash.

NameRequiredDescriptionDefault
hashYes
hex_convertC

Convert between hex, decimal, and UTF-8 string.

NameRequiredDescriptionDefault
valueYes
is_contractC

Whether an address holds contract code, and how much.

NameRequiredDescriptionDefault
addressYes
keccak_hashB

keccak256 of a UTF-8 string or hex bytes.

NameRequiredDescriptionDefault
inputYes
inputIsHexNo
known_assetsA

Curated Robinhood Chain assets with verified metadata, including which support EIP-3009 / EIP-2612.

NameRequiredDescriptionDefault

No parameters

latest_blocksC

Most recent blocks with transaction counts and gas usage.

NameRequiredDescriptionDefault
limitNo
list_eip3009_assetsA

Assets on this chain known to support EIP-3009, and therefore usable for gasless, relayer-submitted payments.

NameRequiredDescriptionDefault

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.

NameRequiredDescriptionDefault
limitNo
queryNoExplorer search termEACAggregatorProxy
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.

NameRequiredDescriptionDefault
limitNoMax candidates to probe
queryNoTicker or name filter, e.g. 'AAPL'
list_token_holdingsA

All token balances held by an address, via the explorer index. Mainnet only.

NameRequiredDescriptionDefault
addressYes
list_tokensA

List ERC-20 tokens on Robinhood Chain, most-held first, via the explorer index. Mainnet only.

NameRequiredDescriptionDefault
limitNoMax tokens to return (page size is 50)
queryNoFilter by name or symbol
multi_token_balanceA

Read one address's balance across several tokens in a single Multicall3 round-trip.

NameRequiredDescriptionDefault
tokensYesSymbols or addresses
addressYes
nft_balanceB

ERC-721 balanceOf — how many NFTs from a collection an address holds.

NameRequiredDescriptionDefault
ownerYes
contractYes
nft_collection_infoC

ERC-721 collection name, symbol, and total supply where exposed.

NameRequiredDescriptionDefault
contractYes
nft_ownerC

ERC-721 ownerOf for a token ID.

NameRequiredDescriptionDefault
tokenIdYes
contractYes
nft_token_uriC

ERC-721 tokenURI, with inline data: URIs decoded when present.

NameRequiredDescriptionDefault
tokenIdYes
contractYes
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.

NameRequiredDescriptionDefault

No parameters

price_feed_registryA

Configuration of the PriceFeedRegistry: feed decimals, default staleness bound, and L2 sequencer-uptime protection status.

NameRequiredDescriptionDefault

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.

NameRequiredDescriptionDefault
tokenYesSymbol (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.

NameRequiredDescriptionDefault

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.

NameRequiredDescriptionDefault
toYes
dataYesCalldata hex, including the 4-byte selector
fromNo
blockNolatest
read_contractA

Call a read-only contract function using a human-readable signature, e.g. 'function balanceOf(address) view returns (uint256)'.

NameRequiredDescriptionDefault
argsNoArguments as strings
blockNolatest
addressYesContract address
signatureYesFull function signature, e.g. 'function symbol() view returns (string)'
read_price_feedB

Read any Chainlink AggregatorV3 feed directly: description, decimals, latest round, and age.

NameRequiredDescriptionDefault
feedYesAggregator 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.

NameRequiredDescriptionDefault
tokenYes
addressYes
stock_token_infoA

Full state of a Robinhood Stock Token: metadata, the corporate-action multiplier, raw vs multiplier-adjusted supply, and every pause flag.

NameRequiredDescriptionDefault
tokenYesStock 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.

NameRequiredDescriptionDefault

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.

NameRequiredDescriptionDefault
tokenYes
token_allowanceC

ERC-20 allowance an owner has granted a spender.

NameRequiredDescriptionDefault
ownerYes
tokenYes
spenderYes
token_holdersC

Largest holders of a token, from the explorer index.

NameRequiredDescriptionDefault
limitNo
tokenYes
token_infoA

Detailed token info from the explorer: supply, holders, market data. Mainnet only.

NameRequiredDescriptionDefault
tokenYesSymbol 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.

NameRequiredDescriptionDefault
tokenYes
token_transfer_historyC

ERC-20 transfer events involving an address, read from chain logs rather than the explorer, so it works on any network.

NameRequiredDescriptionDefault
tokenNo
addressYes
toBlockNolatest
directionNoboth
fromBlockNolatest
token_transfersC

Recent transfers of a specific token.

NameRequiredDescriptionDefault
limitNo
tokenYes
to_weiC

Convert a decimal amount to base units without floating-point rounding.

NameRequiredDescriptionDefault
amountYes
decimalsNo
uniswap_contractsA

Uniswap v4 deployment addresses on Robinhood Chain, each checked for deployed code. Reports which periphery contracts are actually usable.

NameRequiredDescriptionDefault

No parameters

uniswap_fee_growthB

Global fee growth accumulators for a v4 pool — the basis for computing accrued LP fees.

NameRequiredDescriptionDefault
poolIdYes
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.

NameRequiredDescriptionDefault
hooksNo0x0000000000000000000000000000000000000000
currency0Yes
currency1Yes
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'.

NameRequiredDescriptionDefault
feeNoFee in hundredths of a bip (3000 = 0.30%)
hooksNo0x0000000000000000000000000000000000000000
currency0YesToken address, or 0x0 for native ETH
currency1Yes
tickSpacingNo
uniswap_pool_liquidityC

Current in-range liquidity for a v4 pool.

NameRequiredDescriptionDefault
poolIdYes32-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.

NameRequiredDescriptionDefault
feeNo
hooksNo0x0000000000000000000000000000000000000000
poolIdNo32-byte poolId; omit to derive from a PoolKey
currency0No
currency1No
decimals0No
decimals1No
tickSpacingNo
usdg_infoA

USDG (Global Dollar) details: address, decimals, supply, and its verified EIP-712 domain.

NameRequiredDescriptionDefault

No parameters

verified_contractsC

Contracts with verified source on this chain — a quick map of what is actually deployed and public.

NameRequiredDescriptionDefault
limitNo
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.

NameRequiredDescriptionDefault
toYes
fromYes
nonceYes
tokenNoUSDG
valueYesBase units
signatureYes
validAfterYes
validBeforeYes
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.

NameRequiredDescriptionDefault
tokenNoUSDG
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.

NameRequiredDescriptionDefault
tokenYesContract 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.

NameRequiredDescriptionDefault
toYes
fromYes
nonceYes
valueYesBase units
signatureYes
validAfterYes
validBeforeYes
x402_build_payment_requirementsC

Build the paymentRequirements object a resource server returns in its HTTP 402 response.

NameRequiredDescriptionDefault
assetNoUSDG
payToYesAddress that receives payment
amountYesHuman amount, e.g. '0.01'
resourceNoURL of the paid resource
descriptionNo
maxTimeoutSecondsNo
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.

NameRequiredDescriptionDefault
facilitatorUrlNohttps://x402.org/facilitator
x402_decode_payment_headerA

Decode a base64 X-PAYMENT header into its payload, and sanity-check it against this chain.

NameRequiredDescriptionDefault
headerYes
x402_network_idA

The CAIP-2 network identifier for this chain, as x402 payloads must express it.

NameRequiredDescriptionDefault

No parameters

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 105 tool updatesv0.1.0
    • First observedaddress_info
    • First observedaddress_internal_transactions
    • First observedaddress_nfts
    • First observedaddress_token_transfers
    • First observedaddress_transactions
    • First observedarb_block_number
    • First observedarb_chain_id
    • First observedarb_gas_accounting
    • First observedarb_gas_prices
    • First observedarb_l1_base_fee
    • First observedarb_l1_pricing
    • First observedarb_min_gas_price
    • First observedarbos_version
    • First observedauthorization_digest
    • First observedblock_number_context
    • First observedblock_transactions
    • First observedbuild_cancel_authorization
    • First observedbuild_l2_to_l1_withdrawal
    • First observedbuild_permit
    • First observedbuild_receive_authorization
    • First observedbuild_token_approve
    • First observedbuild_token_transfer
    • First observedbuild_transaction
    • First observedbuild_transfer_authorization
    • First observedbuild_transfer_authorization_calldata
    • First observedchain_info
    • First observedchain_stats
    • First observedcheck_address_blocked
    • First observedcheck_authorization
    • First observedcheck_corporate_action
    • First observedcheck_price_freshness
    • First observedchecksum_address
    • First observedcontract_abi
    • First observedcontract_source
    • First observeddecode_abi
    • First observeddecode_calldata
    • First observeddecode_transfer_log
    • First observeddetect_token_standard
    • First observedencode_abi
    • First observederc1155_balance
    • First observedestimate_gas
    • First observedestimate_l1_component
    • First observedevent_topic
    • First observedexplorer_search
    • First observedfrom_wei
    • First observedfunction_selector
    • First observedgas_price
    • First observedget_balance
    • First observedget_block
    • First observedget_logs
    • First observedget_nonce
    • First observedget_receipt
    • First observedget_stock_price
    • First observedget_token_balance
    • First observedget_token_price
    • First observedget_transaction
    • First observedhex_convert
    • First observedis_contract
    • First observedkeccak_hash
    • First observedknown_assets
    • First observedlatest_blocks
    • First observedlist_eip3009_assets
    • First observedlist_price_feeds
    • First observedlist_stock_tokens
    • First observedlist_token_holdings
    • First observedlist_tokens
    • First observedmulti_token_balance
    • First observednft_balance
    • First observednft_collection_info
    • First observednft_owner
    • First observednft_token_uri
    • First observedprecompile_status
    • First observedprice_feed_registry
    • First observedprobe_token_capabilities
    • First observedrandom_nonce
    • First observedraw_call
    • First observedread_contract
    • First observedread_price_feed
    • First observedstock_balance
    • First observedstock_token_info
    • First observedstock_token_registry
    • First observedstock_token_terms
    • First observedto_wei
    • First observedtoken_allowance
    • First observedtoken_holders
    • First observedtoken_info
    • First observedtoken_metadata
    • First observedtoken_transfer_history
    • First observedtoken_transfers
    • First observeduniswap_contracts
    • First observeduniswap_fee_growth
    • First observeduniswap_find_pool
    • First observeduniswap_pool_id
    • First observeduniswap_pool_liquidity
    • First observeduniswap_pool_state
    • First observedusdg_info
    • First observedverified_contracts
    • First observedverify_authorization_signature
    • First observedverify_domain_separator
    • First observedverify_stock_token
    • First observedx402_build_payment_payload
    • First observedx402_build_payment_requirements
    • First observedx402_check_facilitator
    • First observedx402_decode_payment_header
    • First observedx402_network_id

TDQS

C2.9/5.0

Scored across 105 tools

Disambiguation3/5

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.

Naming Consistency3/5

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.

Tool Count1/5

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.

Completeness5/5

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

ActivityStale
ResponsivenessLimited data

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    4
    11 npm
    MIT
  • F
    license
    A
    quality
    B
    maintenance
    A 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.
    9
    59 npm
    8
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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