arcus-agent-gateway
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ARCUS_RPC_URL | No | Override the public JSON-RPC endpoint URL. Defaults to robinhood-rpc.publicnode.com | robinhood-rpc.publicnode.com |
| ARCUS_EXPLORER_URL | No | Override the Blockscout v2 explorer API base URL. Defaults to robinhoodchain.blockscout.com/api/v2 | robinhoodchain.blockscout.com/api/v2 |
| ARCUS_GATEWAY_DATA | No | Override the data directory used by the optional price history recorder. Defaults to ~/.local/state/arcus-agent-gateway/history/ | ~/.local/state/arcus-agent-gateway/history/ |
| ARCUS_INTERVAL_SEC | No | Override the recording interval in seconds for the optional price history recorder. Defaults to 300 (5 minutes). | 300 |
| ARCUS_RPC_FALLBACK_URL | No | Override the fallback RPC endpoint URL (used only for eth_chainId/eth_blockNumber). Defaults to robinhood.drpc.org | robinhood.drpc.org |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| token_listA | Tokenized equities on Robinhood Chain, one row per token: symbol, name, status, multiplier (float) and tradable (market whole AND fractional tradable). status filters on the ASSET_STATUS_* prefix - pass 'ACTIVE' (default, hides inactive) or another status short name; 'ALL' disables filtering. Alphabetical, capped at limit. Returns {"count", "total_matching", "tokens"}. Start here for valid symbols; feed them into quote/token_detail. Example: token_list(status="ACTIVE", limit=50) |
| quoteA | One token's live quote joined with its asset metadata: bid/ask/spread raw, multiplier-adjusted (bid_adjusted, ask_adjusted, mid_adjusted - always read them next to multiplier), daily_volume, is_halted, trading_capabilities {fractional, all_day, extended_hours}, multiplier {current, pending (None while nothing is queued), effective_time} and generated_at. Unknown symbol raises an error (MCP isError) - call token_list() for the valid set. A token with no current quote returns metadata with bid/ask None and a note. Example: quote(symbol="AAPL") |
| quotesA | Batch of quote() rows, up to 20 per call (more raises), fetched in PARALLEL (v0.1.1): 8 quote() calls in flight at once, so 10 cold symbols complete in roughly one RTT instead of ten. Unknown symbols do not fail the batch - they land in errors: [{symbol, reason}] while the rest return normally, and the output order matches the input order. Example: quotes(symbols=["AAPL", "MSFT", "NVDA"]) |
| token_detailA | Full dossier for one token: metadata (contract, chain 4663, decimals, isin, logo), its quote() view, the last 5 corporate actions, the multiplier block with history_note, trading capabilities (normalized + raw market/extended/overnight statuses) and warnings - a pending multiplier change surfaces as 'pending split: 1->X on DATE'. Unknown symbol raises an error (MCP isError). Example: token_detail(symbol="AAPL") |
| market_statusA | Market-wide health from assets() only - never fetches 194 prices. total_tokens, active (ASSET_STATUS_ACTIVE), untradable (fractional untradable among active), halted (only tokens whose quote is ALREADY in the price cache - opportunistic; call quotes() on suspect symbols for a real halt scan), extended_hours_open and market_hours_status. Example: market_status() |
| corporate_actionsA | Corporate actions (splits, dividends) across all tokens, or filtered to one symbol. Each row: symbol, type, status, process_date, details {old_rate, new_rate} (floats when the source carries rate fields) and raw (the original record, untouched). Tolerant to the API's field-name variants. Example: corporate_actions(symbol="AAPL", limit=5) |
| searchA | Local fuzzy search over the token list - no HTTP beyond the cached
assets(). Ranking: exact symbol > symbol prefix > name-word prefix >
substring in name/symbol (case-insensitive); top |
| sector_viewA | Sector map (13 sectors, static validated classification) with per-sector size and live averages. warm=False (default): cheap snapshot - averages appear only for quotes ALREADY cached ('warmed': false; no requests made). warm=True: fan out quotes() first (parallel batches of 20, upstream rate-limit safe), then report - averages are live. With sector= 'Name' only that sector is fetched and returned; an unknown name raises with the valid list. requests_made counts the price-cache misses at the start of the warm pass (each miss = one upstream request; fresh cache hits and cached-again symbols cost nothing). Example: sector_view(warm=True, sector="Crypto/Digital Assets") |
| onchain_infoA | On-chain footprint of a token, joined from three independent sources (each fails to a warning, never silently):
supply_crosscheck compares the REST-implied capitalization (total_supply * multiplier * quote mid) with the explorer's circulating_market_cap; a >1% divergence lands in warnings[] (both values still returned). Every derived field carries a per-field "source" tag ("rpc" | "explorer" | "rest"). Example: onchain_info(symbol="AAPL") |
| holder_snapshotA | Top holders of a token's contract from the explorer (one page, max 50 rows, cached 600s inside the explorer client). Each row: address, value (float token units, raw/1e18), share_pct (= value / total_supply * 100) and is_contract. total_supply comes from the RPC totalSupply() call, falling back to the explorer's own token row when the RPC is unavailable (source-tagged either way). Explorer/RPC failures return an error dict with kind + hint, never a silent empty list. Example: holder_snapshot(symbol="AAPL", limit=10) |
| wallet_holdingsA | Which tokenized equities (out of the assets() universe) a wallet holds, from the explorer's address token-balances. The universe join is case-insensitive on the contract address; rows: symbol, name, value (float token units, raw/1e18). est_position_usd and portfolio_usd_total are computed ONLY from quotes already in the price cache (no quote fan-out); when quotes are missing or stale a note says so instead of faking numbers. Results cached 120s. Example: wallet_holdings( address="0x8366a39CC670B4001A1121B8F6A443A643e40951") |
| transfer_historyA | Recent ERC-20 Transfer events for a token's contract, from the public RPC's adaptive walk-back over the last ~800 blocks (windows start 48 blocks wide and shrink 48->32->16->8 on archive-403s, ~14 getLogs requests max - the free RPC only serves a floating ~45-60-block window). Rows (newest first): ts (ISO-8601 from the log's own blockTimestamp), from, to, value (float token units), tx_hash, block. min_value filters in token units AFTER normalization. Results cached 60s. The note is honest about why the walk stopped: 'window-closed' points at the explorer transfer list for older history, 'budget' says the request cap was hit. Example: transfer_history(symbol="AAPL", limit=10, min_value=1.0) |
| price_historyA | Historical prices recorded by the OPTIONAL local recorder (arcus_mcp/recorder.py since 0.2.1) - not a live API call. timeframe='daily': OHLCV bars from history/daily.parquet (open/high/low/close are multiplier-adjusted); timeframe='raw': every recorded snapshot (bid/ask raw, mid_adjusted, multiplier, is_halted) from history/snapshots_*.parquet. Rows are newest-first. The symbol is NOT checked against token_list (the recorder writes the whole universe; assets drift) - a symbol simply absent from the file returns count 0. Degrades honestly instead of raising when the optional pieces are missing: pyarrow absent -> error suggesting 'pip install arcus-agent-gateway[recorder]'; recorder never run / no data yet -> error pointing at README § Optional price history recorder. limit must be positive (daily capped at 200, raw at 500). Example: price_history(symbol='AAPL', timeframe='daily', limit=30) |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alekskram/arcus-agent-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server