arcus-agent-gateway
This server provides AI agents with read-only, keyless access to market and on-chain data for 194 tokenized US equities on Robinhood Chain (Arcus) through 13 MCP tools.
List, filter, and search the token universe (
token_list,search).Get live quotes for one or many symbols, with raw and multiplier-adjusted prices (
quote,quotes).Pull full token dossiers, corporate actions, and pending-split warnings (
token_detail,corporate_actions).Check market-wide status, halted tokens, and sector averages (
market_status,sector_view).Inspect on-chain supply, holders, and wallet holdings (
onchain_info,holder_snapshot,wallet_holdings).Follow recent ERC-20 transfers with optional min-value filters (
transfer_history).Read recorded price history from the optional local recorder (
price_history).Everything is keyless, rate-limited, and strictly read-only—no auth, no writes.
Provides read-only access to market data for tokenized US equities on Robinhood Chain (Arcus), including quotes, corporate actions, trading capabilities, multipliers, sector maps, holder snapshots, and transfer history via Robinhood's public REST API.
arcus-agent-gateway
An MCP (Model Context Protocol) server that gives AI agents read-only, keyless
access to market data for the 194 tokenized US equities on Robinhood Chain
(Arcus) — quotes, corporate actions, trading capabilities, multipliers and a
13-sector map. No API keys, no auth, no writes: every tool is a GET against the
public api.robinhood.com/rhj REST surface, cached and rate-limited so an
enthusiastic agent can't hammer the upstream.
Use cases
"Who actually holds AAPL?" — top holders with on-chain share %, contract vs EOA, concentration risk (holder_snapshot scenario)
Watch any wallet — full portfolio across all 194 tokenized equities, valued at cached quotes (
wallet_holdings)Catch whale moves — live ERC-20 Transfer feed with a
min_valuefilter for large-print alerts (transfer_history)Split-safe prices — raw vs multiplier-adjusted quotes side by side, pending-split warnings with effective time (
quote,token_detail)Morning scan — market-wide health, halted tokens and 13-sector averages in two cheap calls (
market_status,sector_view(warm=True))
Full walkthroughs with real outputs: examples/use-cases.md.
Related MCP server: robinhood-chain-mcp
Quickstart
Run over stdio (the default, for local agents):
uvx arcus-agent-gatewayStandard config for Claude Desktop / Cursor (claude_desktop_config.json / .cursor/mcp.json):
{
"mcpServers": {
"arcus": {
"command": "uvx",
"args": ["arcus-agent-gateway"]
}
}
}[mcp_servers.arcus]
command = "uvx"
args = ["arcus-agent-gateway"]# 1) start the gateway (keep it running)
uvx arcus-agent-gateway --http --port 8902 &
# 2) register it (merges into ~/.zcode/cli/config.json; workspace .zcode/config.json works too)
python3 - <<'PY'
import json, os
p = os.path.expanduser("~/.zcode/cli/config.json")
os.makedirs(os.path.dirname(p), exist_ok=True)
cfg = json.load(open(p)) if os.path.exists(p) else {}
cfg.setdefault("mcp", {}).setdefault("servers", {})["arcus"] = {
"type": "http", "url": "http://127.0.0.1:8902/mcp"}
json.dump(cfg, open(p, "w"), indent=2)
print("arcus MCP server registered:", p)
PY
# 3) copy the agent skill (tool guide + watchlist cron recipe)
git clone -q --depth 1 https://github.com/alekskram/arcus-agent-gateway /tmp/aag
cp -r /tmp/aag/.agents/skills/arcus-gateway ~/.zcode/skills/ && rm -rf /tmp/aag
echo "ZCode setup done — restart your session and call any arcus tool"Hosted form — streamable HTTP on port 8902:
uvx arcus-agent-gateway --http # 127.0.0.1:8902
curl http://127.0.0.1:8902/health # -> {"ok": true, "service": "arcus-agent-gateway"}Tools
All 13 tools are read-only (annotated readOnlyHint: true). Names and
parameters are exactly as registered by arcus_mcp/server.py.
# | Tool | Signature | What it does |
1 |
|
| Tokenized equities, one row per token (symbol, name, status, multiplier, tradable); |
2 |
|
| Live quote joined with asset metadata: raw + multiplier-adjusted bid/ask/spread, |
3 |
|
| Batch of |
4 |
|
| Full dossier: contract/chain/ISIN metadata, embedded quote, last 5 corporate actions, multiplier block with history note, |
5 |
|
| Market-wide health from assets only (never fetches 194 prices): totals, untradable count, cached-halted list, extended-hours estimate. |
6 |
|
| Splits/dividends across all tokens or for one symbol; tolerant to the API's field-name variants. |
7 |
|
| Local fuzzy search over the token list; |
8 |
|
| 13-sector static map with sizes and multiplier-adjusted sector averages. Default ( |
9 |
|
| On-chain footprint joined from three independent sources (each fails to a |
10 |
|
| OHLCV history from the optional recorder's local parquet store (see below). Honest degradation: missing pyarrow or data → actionable |
11 |
|
| Top holders of a token's contract from the Blockscout explorer (one page, max 50 rows, 600 s cache). Rows: |
12 |
|
| Which of the 194 tokenized equities a wallet holds (explorer |
13 |
|
| Recent ERC-20 |
— | watchlist | — | Not a tool. Price tracking is done by your agent's scheduler (cron) calling |
Multiplier logic (read this before using prices)
Robinhood Chain tokens carry a multiplier — the corporate-action
adjustment factor for the token contract (1.0 = untouched). Splits change it;
for example NVDA's 2026-11 split queues pendingMultiplier: "4.0".
The REST API returns RAW prices.
bid/askfrom/prices/{symbol}are in token-contract units and are not multiplier-adjusted.Adjusted values are computed by this server, never taken from upstream:
price_adjusted = round(price_raw × currentMultiplier, 6).Raw and adjusted always travel together. Every quote carries
bid_raw/ask_raw/spread_rawandbid_adjusted/ask_adjusted/mid_adjustednext to themultiplierblock — never one without the other.On-chain quantities (token balances, mint/burn volumes) are natively in adjusted (multiplied) units; REST prices are not. If you compare the two, go through the
*_adjustedfields.
Worked example (live fixture, 2026-09-03):
AAPL currentMultiplier = 1.000566080061092436
bid_raw = 327.77 → bid_adjusted = round(327.77 × 1.000566…, 6) = 327.955544
ask_raw = 327.78 → ask_adjusted = 327.965550
mid mid_adjusted = 327.960547Pending split warning. When pendingMultiplier is queued (non-empty) and
differs from the current one, token_detail() adds a warning like
pending split: 1→4.0 on 2026-11-06T00:00:00Z, and quote()'s multiplier
block exposes pending + effective_time. After the split lands, raw prices
jump by the ratio while *_adjusted fields stay comparable — another reason to
always read adjusted values next to the multiplier.
API limits & caching
Upstream allows 60 req/s without a key; this client self-limits to ≤ 50 req/s (a 20 ms politeness interval between requests, thread-safe).
Transient failures (
429/502/503/504, network errors) are retried up to 3 times with2s × (attempt+1)backoff.Response caches (per process):
/assets5 min,/prices/{symbol}15 s,/corporate-actions1 h.market_status()andsector_view()are computed from caches and assets only — they never fan out 194 price requests.
On-chain sources & limits
The v0.2 on-chain tools read two keyless public sources next to the REST
API. Both are free, rate-limited and partially restricted — every tool above
degrades honestly (per-field omission + warnings[] / error dicts), never
with a silent empty answer.
Public JSON-RPC (default
robinhood-rpc.publicnode.com, override withARCUS_RPC_URL):eth_call(e.g.totalSupply()) works normally.eth_getLogsonly answers inside a floating ~45–60-block window behind the latest block — wider or older ranges get HTTP 403 "Archive requests require a personal token" (the backend is Alchemy). The window drifts minute to minute, sotransfer_history()walks back in windows that start 48 blocks wide and shrink 48→32→16→8 on each 403, capped at ~14 getLogs requests.eth_getLogslog objects carryblockTimestampdirectly — no per-block lookups are needed.Fallback RPC (
robinhood.drpc.org,ARCUS_RPC_FALLBACK_URL): has noeth_getLogsand noeth_call(JSON-RPC "method not available"); it is used only foreth_chainId/eth_blockNumber.Blockscout v2 explorer (
robinhoodchain.blockscout.com/api/v2,ARCUS_EXPLORER_URL): requires a browser User-Agent on every request — plain HTTP clients get a Cloudflare 403 "Just a moment…" HTML challenge. Token pages (holders_count,circulating_market_cap,total_supply), one holders page (max 50 rows, no pagination loops) and addresstoken-balancescome from here, cached 600 s.token-balancesanswers in ~0.5 s on plain wallets but hangs 40 s+ on huge contract addresses — the client fails honestly after 15 s with kindexplorer-timeout.On-chain activity ≠ trades. The chain records
Transfer, mint and redeem events between addresses; it knows nothing about order-book trades or prices. Usequote()/quotes()for prices andtransfer_history()for token movement.
Raw prices disclaimer
Prices are served exactly as they arrive from Robinhood (RAW) — they are
not multiplier-adjusted, and the *_adjusted fields are our computation,
not upstream data. All data is for information only, not for trading
decisions, and should be verified against the official source before you act
on it. No warranty of completeness, accuracy or timeliness.
Optional price history recorder
The Robinhood Chain REST API has no price history endpoint — only current quotes. For the 194 tokenized equities this recorder is the only history source. It is opt-in and disabled by default; nothing is recorded unless you explicitly enable it.
How it works. One tick every 5 minutes (default): fetch a quote for every
ACTIVE tradable token through the same rate-limited client (50 req/s cap;
average load ≈ 0.65 req/s), append one row per symbol to
data/history/snapshots_YYYYMM.parquet (monthly rotation), and maintain a
daily OHLCV rollup data/history/daily.parquet (open/high/low/close on
mid_adjusted, volume = max of the day's cumulative daily_volume). The
rollup runs at the first tick after midnight UTC for the previous day and is
idempotent (re-running a day overwrites it, never duplicates).
Enable it:
pip install "arcus-agent-gateway[recorder]" # adds pyarrow (optional extra)
# systemd (recommended): units ship DISABLED - enabling is your decision
sudo cp deploy/arcus-recorder.* /etc/systemd/system/
sudo systemctl enable --now arcus-recorder.timer # OnCalendar=*:0/5, Persistent
# or run one tick / a debug loop manually:
python -m arcus_mcp.recorder --once
python -m arcus_mcp.recorder --limit 5 # debug: first 5 symbols only
ARCUS_INTERVAL_SEC=60 python -m arcus_mcp.recorder # custom interval loop
# (from a git checkout, `python scripts/recorder.py ...` still works -
# it is a thin shim that delegates to arcus_mcp.recorder)Data weight & rotation. Full universe (194 symbols) at a 5-minute tick ≈
2–3 MB/day of snapshots plus ≈ 10 KB/day for the daily rollup. Snapshots
rotate monthly (snapshots_YYYYMM.parquet); delete old months when you no
longer need raw granularity — daily.parquet is the compact long-term store.
Data lands in ~/.local/state/arcus-agent-gateway/history/ (override with
ARCUS_GATEWAY_DATA).
Reading it back: the price_history tool serves daily bars and raw
snapshots from the same directory. Without pyarrow or data it returns an
actionable error pointing here — install the [recorder] extra, never a
silent empty answer.
Security & privacy
Keyless and read-only. No API keys, no auth, no writes. Every tool is annotated
readOnlyHint: true/destructiveHint: falseon the MCP wire.Rate-limited by design. Client caps at 50 req/s against the public REST surface, public RPC requests go through the same limiter, Blockscout calls carry a standard browser User-Agent and their own timeouts.
No telemetry, no logging of your prompts. The server caches public market data in memory (and parquet files only if you enable the optional recorder); nothing leaves your machine except the API reads themselves.
License
MIT — see LICENSE. Not affiliated with Robinhood Markets, Inc.
Available Tools
13 toolscorporate_actionsCorporate ActionsARead-only
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable behavioral details: tolerance to API field-name variants, the exact row structure (symbol, type, status, process_date, details, raw), and the note that rates are floats when present. It also clarifies 'raw' is untouched original data. This goes beyond simple schema repetition, though it doesn't address rate limits or potential data-volume behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact but information-dense: purpose, filter behavior, row schema, type caveat, tolerance, and an example fit into three sentences. Front-loaded with the main action and scope, then builds detail efficiently. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description needn't restate return values—it complements it by clarifying row semantics, tolerance, and the optional filter. With only 2 optional params and strong annotations, an agent has everything needed to select and invoke this tool correctly against sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the weight. It explains the two params via the example (symbol and limit) and the scope statement: symbol filters to one token, omitting it means all tokens. This sufficiently compensates for the bare schema, even though it doesn't formally document every property.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieves corporate actions (splits, dividends) across all tokens or one symbol. Highlights row fields and example usage, and differs from siblings like quotes/price_history by focusing on corporate action events. The scoping and output row composition make it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly clarifies the tool works across all tokens or filtered by one symbol, and the example demonstrates both the optional filter and limit. It does not explicitly contrast against siblings (e.g., price_history for price data), but the domain-specific scope and row description make the appropriate context clear. Minor gap: no explicit 'use this when' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
holder_snapshotHolder SnapshotARead-only
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/destructive annotations, the description discloses caching behavior (600s), pagination cap (50 rows), total_supply source and fallback, source tagging, and error behavior ('never a silent empty list'). This is rich, non-redundant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value: scope, data shape, supply calculation, fallback behavior, error semantics, and an example. It is front-loaded with the main purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with annotations and an output schema, the description covers the essential behavioral details: row contents, aggregation source, failure mode, caching, and row limits. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions (0% coverage), so the description carries the burden. It provides a concrete example with symbol and limit, and the 'max 50 rows' note clarifies the limit's effect. It stops short of explicitly defining each parameter's format and constraints, but an agent can infer correct usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource ('top holders of a token's contract') and adds concrete scope details such as one page, max 50 rows, and explorer sourcing. It is not a tautology and the meaning is immediately clear, but it does not explicitly distinguish itself from sibling tools like wallet_holdings or token_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose statement and example ('holder_snapshot(symbol="AAPL", limit=10)') imply use when a token-holder snapshot is needed. However, there is no explicit guidance about when not to use it or which sibling tool should be preferred in related scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_statusMarket StatusARead-only
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()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior, and the description adds important behavioral nuances: it relies only on assets(), avoids fetching hundreds of prices, and treats halted as opportunistic rather than exhaustive. It honestly discloses the limitation of the halted field and points to the appropriate fallback.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause adds value: it explains the data source, scope, key fields, limitations, and a corrective alternative. There is no filler or repetition of schema/annotation information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with an output schema present, this description is complete. It covers what the tool computes, what it intentionally excludes, how halted detection works, and how to get more accurate halt data when needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema fully describes this, so the description does not need to explain parameters. The inclusion of an example call, "market_status()", reinforces the no-argument invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports "Market-wide health" and specifies the exact data source and computed fields. It differentiates itself from sibling pricing tools by explicitly saying it "never fetches 194 prices," making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use this tool: for market-wide aggregates from assets() rather than per-symbol pricing. It also names an alternative action—"call quotes() on suspect symbols for a real halt scan"—so an agent knows exactly when to route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onchain_infoOnchain InfoARead-only
On-chain footprint of a token, joined from three independent sources (each fails to a warning, never silently):
REST metadata: contract, chain_id, network, decimals, isin
RPC (publicnode eth_call): total_supply = totalSupply()/1e18
explorer (Blockscout): holders_count, circulating_market_cap
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")
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only annotation by disclosing the three-source join, per-source failure behavior ('each fails to a warning, never silently'), the supply_crosscheck threshold (>1% divergence lands in warnings[] while still returning both values), and the per-field source tag. This is rich, specific behavioral context with no contradiction of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a front-loaded summary, a compact bulleted list of sources, a tightly worded explanation of the crosscheck, and a final example. Every sentence adds information and the formatting makes the complex behavior easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema, the description covers the input example, all data sources, failure behavior, crosscheck logic, and output tagging. Nothing critical is missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single `symbol` parameter. It provides an example call and implies a token identifier, but it does not specify accepted formats, case sensitivity, whether contract addresses are allowed, or what token universe is supported. The example helps but leaves meaningful ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific resource ('on-chain footprint of a token') and enumerates the exact data fields from three sources, making the tool's purpose clear. It is clearly distinct from siblings like price_history or quote, though it never explicitly names a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the on-chain data content and by the invocation example onchain_info(symbol='AAPL'), but the description never explicitly says when to use this tool instead of alternatives like token_detail or holder_snapshot. No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_historyPrice HistoryARead-only
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes | ||
| timeframe | No | daily |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive, but the description goes well beyond them: it discloses file-backed behavior, newest-first ordering, multiplier adjustment, absence behavior returning count 0, and honest degradation with specific error messages for missing pyarrow or missing recorder data. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence adds essential operational detail: source type, timeframe behavior, row ordering, symbol semantics, error cases, limit constraints, and an example. It is front-loaded with the most important distinction ('not a live API call') and structured so the agent can quickly route to the right behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description does not need to explain return shapes. It covers the data source, optionality, failure modes, parameter constraints, and a concrete usage example. An agent has everything needed to invoke the tool correctly and interpret unusual outcomes like count 0.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameters. It explains timeframe values ('daily' vs 'raw'), the meaning and caps for limit (daily capped at 200, raw at 500), and the symbol semantics including that it is not checked against token_list and absent symbols return count 0. All three parameters are meaningfully documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool returns historical prices from a local recorder, not a live API call, and distinguishes the daily OHLCV and raw snapshot modes. It is unambiguous about the resource and scope, and the 'not a live API call' note separates it from quote/quotes siblings without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent this is not a live API call, indicating the tool is for historical data rather than current market data. It also explains the data source is optional and may not exist, and gives error behavior. However, it does not name a sibling tool like quote as the alternative for live prices, so the when-to-use guidance is clear but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quoteQuoteARead-only
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")
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/destructive annotations, the description discloses important behaviors: unknown symbols raise an MCP isError, tokens without a current quote return metadata with bid/ask None, and multiplier pending is None when nothing is queued. It also warns that adjusted fields must be read next to multiplier, which is valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core result, and every sentence adds useful information. The long first sentence lists many fields that may already be present in the output schema, but it also adds interpretive guidance like 'always read them next to multiplier,' so the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main operational concerns: what data is returned, what happens for unknown symbols, and what happens when no quote exists. It would be even more complete with an explicit pointer to the quotes sibling for multi-token requests, but nothing critical is missing for invoking this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by providing an example (quote(symbol="AAPL")), clarifying that the symbol must come from the valid set exposed by token_list(), and explaining the failure mode for unknown symbols. It doesn't specify case-sensitivity or formatting, but for a single string parameter this is sufficient guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise operation — "One token's live quote joined with its asset metadata" — and enumerates the exact fields returned. The singular framing clearly distinguishes this from sibling tools like quotes (plural), token_list, and token_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use this tool: for a single token's live quote. It also provides concrete guidance on the valid symbol set by telling the agent to call token_list() when an unknown symbol error occurs. It does not explicitly contrast with quotes or other siblings, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quotesQuotesARead-only
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"])
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds rich behavioral detail beyond annotations: 8 in-flight calls, unknown symbols routed to errors list instead of failing the batch, and output order matching input order. No contradictions with readOnlyHint, openWorldHint, or destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and well-structured: batch limit, parallelism, error semantics, ordering guarantee, and an example are packed into a compact, readable block. No filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and annotations cover read-only/open-world behavior, the description supplies the missing operational details: concurrency model, failure handling for unknown symbols, and ordering guarantee. Nothing critical for correct invocation is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates well via the example and behavioral constraints: the symbols array order is preserved, unknown symbols are accepted and reported in errors, and the array is capped at 20. It does not formally define symbol format, but the example implies standard ticker symbols.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly identifies a batch quote retrieval tool: 'Batch of quote() rows' with explicit limits and parallel fetch behavior. It distinguishes itself from the singular sibling 'quote' by being the batch variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The batch/parallel framing and example make it clear this is for retrieving multiple quotes at once, and the 20-per-call limit with 'more raises' gives a concrete usage boundary. It does not explicitly say 'use quote for a single symbol' or list alternative conditions, so it stops just short of full explicitness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchARead-only
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 limit (default
10, cap 50) with score.
'apple' -> AAPL. Results carry symbol, name, status, sector, score.
Example: search(query="apple", limit=3)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses detailed behavior: ranking order, case-insensitivity, default and maximum limit, no HTTP beyond cached assets, and the fields returned. This gives the agent a clear model of what will happen when the tool is invoked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries value: scope/ranking, limit/result fields, and a concrete example. It is front-loaded with the core purpose and avoids filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two parameters and an output schema, and the description covers the query semantics, limit behavior, ranking, and result contents. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the 0% schema description coverage, the description fully explains both parameters: query is matched against symbol/name with an example, and limit has a default of 10 and a cap of 50. It adds meaningful behavior that the bare input schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Local fuzzy search over the token list'. It also distinguishes itself from the sibling tools by emphasizing it is local and requires no HTTP beyond cached assets, which differentiates it from tools like quote or price_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly communicates that this tool is for fuzzy searching tokens by symbol or name, with ranking rules and an example. It does not explicitly name sibling alternatives or state when not to use it, but the local-search context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sector_viewSector ViewARead-only
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")
| Name | Required | Description | Default |
|---|---|---|---|
| warm | No | ||
| sector | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint, destructiveHint=false), the description discloses important runtime behavior: warm=False makes no upstream requests, warm=True fans out quotes() with parallel batches, requests_made counts cache misses, and unknown sector names raise with the valid list. This adds meaningful transparency about side effects and performance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, with each sentence adding value: the one-line summary, the warm=False behavior, the warm=True behavior, the sector filtering/error case, and a concrete example. It is front-loaded with the core purpose and does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description doesn't need to explain return shapes. It covers the parameter semantics, edge cases, caching/rate-limit behavior, and error handling. Nothing essential is missing for the agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates. It explains the exact meaning and consequences of warm, the behavior of sector including the 'Name' string format, the unknown-name error, and the example sector value 'Crypto/Digital Assets'. All two parameters are semantically covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, actionable statement: 'Sector map (13 sectors, static validated classification) with per-sector size and live averages.' This clearly identifies the resource and the kind of data returned, and distinguishes it from sibling tools like token_list or quote by describing a sector-level aggregate view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly distinguishes warm=False and warm=True, telling the agent when to use the cheap snapshot versus the live data path, and explains the rate-limit-safe batching behavior. It also covers the sector filter and error behavior for unknown names, giving clear decision rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
token_detailToken DetailARead-only
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")
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is known. The description adds valuable behavioral detail beyond that: unknown symbols raise an MCP isError, the multiplier block surfaces pending splits with a concrete format, and the corporate actions list is specifically limited to the latest 5. These give the agent expectations for edge cases and output shape without repeating annotation data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every component earns its place: the initial phrase states scope, the list defines contents, the error note handles failure mode, and the example anchors parameter use. It is front-loaded with 'Full dossier' and there is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers all necessary selection and invocation context: the full list of returned information, the pending-split string format, unknown-symbol error behavior, and an example call. Nothing critical is missing for an agent to decide when to call this and how to pass the parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero description coverage for the single 'symbol' parameter, so the description must compensate. It does so by providing a concrete example (symbol="AAPL") and by repeatedly referring to tokens, making the parameter's meaning clear. It stops short of fully specifying symbol format/case-sensitivity, but for a token platform this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description begins with 'Full dossier for one token' and then enumerates the exact contents (metadata, quote view, corporate actions, multiplier block, trading capabilities, warnings), making the tool's purpose unmistakable. It also distinguishes itself from siblings like quote, corporate_actions, and token_list by being a comprehensive single-token aggregation rather than a narrow endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is the go-to tool when a complete overview of a single token is needed, including corporate actions and multiplier warnings. It does not explicitly name alternatives or when-not-to-use conditions, but the rich context ('Full dossier', 'last 5 corporate actions', 'warning') implies when token_detail should be preferred over more specialized siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
token_listToken ListARead-only
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ACTIVE |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/destructive annotations, the description reveals concrete behavior: default status hides inactive tokens, 'ALL' disables filtering, results are alphabetical and capped at limit, and the response shape is {count, total_matching, tokens}. It also clarifies the meaning of tradable and multiplier, going well beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every phrase earns its place: scope, fields, filtering behavior, ordering, limit cap, response shape, and downstream use are all included. The example is compact and useful, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for an agent to invoke the tool correctly: it covers filtering, defaults, output structure, ordering, and how the results should be used downstream. With an output schema and read-only annotations present, there are no significant missing details that would prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well for the status parameter by defining ACTIVE, other status short names, and ALL. The limit parameter is only implied by 'capped at limit' and the example, leaving its default and maximum to the schema/default value without explicit semantic explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this lists tokenized equities on Robinhood Chain, one row per token, and enumerates the fields returned. It also differentiates itself by explicitly positioning it as the entry point for valid symbols to feed into quote/token_detail, so it is easy to distinguish from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Start here for valid symbols' and directs the agent to feed results into quote/token_detail, giving clear when-to-use guidance. It explains status filtering and defaults, though it could have more explicitly named alternatives like search for name-based lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_historyTransfer HistoryARead-only
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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes | ||
| min_value | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description goes far beyond them: it discloses the window-shrinking walk-back (48->32->16->8 on archive-403s), the request cap, 60-second caching, newest-first ordering, and the meaning of each stopping condition in the note field. No contradiction with annotations; the openWorldHint is consistent with the description's reference to a public/free RPC.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every clause earns its place: mechanism, row format, filtering semantics, caching, note semantics, and an example call. It is dense and monolithic as a single paragraph rather than scannable, which taxes the reader, but there is zero dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists to cover return value shapes, and the description fills in everything else: the adaptive walk-back mechanism, free-RPC limitations, caching, parameter filtering order, and edge-case stopping conditions. An agent can invoke it correctly, interpret results, and explain failures to the user — complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it does with the concrete example (symbol="AAPL", limit=10, min_value=1.0) and the crucial detail that min_value filters in token units AFTER normalization. The meaning of symbol is only implied by context and limit's behavior (row count) is inferred rather than stated, leaving small gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause, 'Recent ERC-20 Transfer events for a token's contract', gives a specific verb and resource that immediately separates it from all 12 siblings (quote, price_history, holder_snapshot, etc.), none of which cover transfer events. It further specifies row contents and ordering, leaving no doubt about what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear operational context: a ~800-block adaptive walk-back, the free RPC's floating ~45-60-block window, the ~14 getLogs cap, and what the note field signals when history is unavailable ('window-closed' routes the agent to the explorer for older history). It stops short of naming a specific sibling as the alternative, but the tool's unique scope makes that omission low-cost.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wallet_holdingsWallet HoldingsARead-only
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")
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the read-only annotations: quote values are computed only from the price cache with no quote fan-out, missing/stale quotes are surfaced via a note, results are cached for 120 seconds, and the universe join is case-insensitive. This is excellent transparency for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value: purpose, data source, schema fields, units, caveats about quote staleness, cache behavior, and an example. It is front-loaded with the main operation and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with an output schema, this description covers all essential operational context: return rows, units, computation constraints, stale-data handling, caching, and a concrete example. Nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines one string parameter with no description, so the description must compensate. It does so by clarifying the wallet-address context and providing a realistic example address, though it leaves explicit format/validation details implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool returns: tokenized equity holdings for a wallet, scoped to the assets() universe and sourced from explorer token balances. It gives enough detail (rows, units, join behavior) to distinguish it from sibling tools like holder_snapshot or transfer_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear use case—querying a wallet's tokenized equity positions—and includes a concrete call example. It does not explicitly state when not to use it or name alternatives, but the context is strong enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
13 tool updates
v0.2.0- First observed
corporate_actions - First observed
holder_snapshot - First observed
market_status - First observed
onchain_info - First observed
price_history - First observed
quote - First observed
quotes - First observed
search - First observed
sector_view - First observed
token_detail - First observed
token_list - First observed
transfer_history - First observed
wallet_holdings
TDQS
Most tools target distinct resources (list vs quote vs detail vs on-chain vs wallet), and the singular/plural quote/quotes pair is intuitive. token_list and search both return token sets, and token_detail embeds the quote view, so there is minor overlap, but descriptions make the intended use clear.
Names are uniformly lowercase snake_case and mostly follow a resource_noun pattern (token_list, market_status, sector_view, holder_snapshot). quote/quotes and search break the pattern slightly, but the style is predictable and readable.
Thirteen tools is well within the ideal range for a data gateway covering market quotes, token metadata, on-chain analytics, wallet holdings, and history. Each tool addresses a distinct data need without redundancy or bloat.
The surface covers the full read path: discover tokens, get quotes/detail, market status, corporate actions, sectors, on-chain supply/holders, wallet holdings, transfer history, and price history. Minor gaps exist (e.g. no bulk quote for the whole universe in one call), but agents can work around them with quotes/sector_view.
Maintenance
Related MCP Connectors
Trade across 22+ exchanges and brokers from any MCP-capable AI agent, no install required.
The financial MCP for AI agents - 90+ financial tables, SEC filings, signals, alt-data.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Pay-per-call DeFi and macro intel for AI agents. x402 USDC tools via streamable HTTP /api/mcp.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides structured financial market data (stocks, ETFs, mutual funds, fundamentals, market indicators) to AI systems via MCP, enabling natural language access to financial datasets with both hosted and local deployment options.3120ISC
- AlicenseAqualityBmaintenanceEnables 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.412MIT
- AlicenseAqualityCmaintenanceEnables AI agents to read Robinhood Chain stock-token positions, quote swaps, and execute swaps through the Model Context Protocol, bridging on-chain assets that Robinhood's own off-chain MCP cannot reach.4MIT

hoodr MCP Serverofficial
AlicenseNot gradedqualityAmaintenanceEnables AI agents to trade tokenized stocks (e.g., NVDA, TSLA) on Robinhood Chain via MCP, with non-custodial keys and spending caps.8MIT
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