
Arcus Agent Gateway
io.github.alekskram由 GitHub 账号 alekskram 发布v0.2.4更新于 Oct 24, 2026
Read-only MCP gateway to 194 tokenized US equities on Robinhood Chain: quotes, holders, whale moves.
概览
只读 MCP 网关,接入 Robinhood Chain 上 194 只代币化美股,让助手获取报价、持有人数据和巨鲸转账活动。
- 可以做什么
- 通过 stdio 提供 13 个只读工具。token_list 和 search 用于查找有效代码;quote 与 quotes 返回实时价格,包含原始与乘数调整后的买卖价和价差,以及停牌和乘数信息;token_detail 补充合约、ISIN 和公司行动元数据。链上工具包括 holder_snapshot(前几大持有人及其占比)、wallet_holdings(某地址持有 194 只股票中的哪些)和 transfer_history(近期 ERC-20 转账,可按最小金额过滤)。market_status、sector_view、corporate_actions 和 price_history 提供市场健康度、板块均值、拆股分红以及可选的本地 OHLCV 历史。
- 适用场景
- 当助手需要 Robinhood Chain 代币化股票的市场数据时使用:查询某代码的持有人、持股集中度、某钱包的持仓,或大额转账流向。它适合只读研究与监控,而非交易,因为不提供下单或写入操作。当仅有实时报价不够时,可选记录器可用于构建本地价格历史。
- 运行要求
- 以 PyPI 包形式在本地通过 stdio 运行(uvx arcus-agent-gateway);清单未声明任何 API 密钥、账号或认证。需要访问 Robinhood Chain 公共 REST API、公共 JSON-RPC 端点以及 Blockscout 浏览器。可选扩展:browser 扩展用于 Cloudflare 模拟,recorder 扩展(pyarrow)用于价格历史。可选环境变量包括 ARCUS_RPC_URL、ARCUS_RPC_FALLBACK_URL、ARCUS_EXPLORER_URL、ARCUS_GATEWAY_DATA 和 ARCUS_INTERVAL_SEC。
安装
在 SourceWeft 中
- 打开 控制台中的 Arcus Agent Gateway,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
arcus-agent-gateway
[CI] [PyPI] [PyPI downloads] [MCP Catalog] [License: MIT] [Python 3.11+]
Robinhood Chain (Arcus) carries 194 tokenized US equities on-chain, and its public API answers questions most people don't think to ask: who actually holds AAPL, what a wallet's stock portfolio looks like, which way the whales moved NVDA today. This MCP server hands all of that to an AI agent. Read-only, keyless, no writes; every tool is a GET against api.robinhood.com/rhj plus two public on-chain sources, cached and rate-limited so an enthusiastic agent can't hammer the upstream.
Use cases
Ask it who holds AAPL and you get the top holder addresses with their share of total supply, flagged contract or wallet. One holder contract turns out to sit on 35% of NVDA; that is the kind of concentration risk a quote page will never show you.
wallet_holdings reads any address across all 194 equities and values the positions it has fresh quotes for. transfer_history walks recent ERC-20 Transfers with a min_value filter, which is how you catch the large prints instead of the dust.
Prices are the trap here, so they ship split-safe: raw and multiplier-adjusted values travel together on every quote, and a pending split (NVDA queues a 4.0 multiplier for 2026-11) comes with a warning and the effective time. A morning scan of market health, halted tokens and 13-sector averages costs two cheap calls.
Full walkthroughs with real outputs: examples/use-cases.md.
Quickstart
Claude Code:
Run over stdio (the default, for local agents):
Standard config for Claude Desktop / Cursor (claude_desktop_config.json / .cursor/mcp.json):
Codex (~/.codex/config.toml)
ZCode: register the server and copy the agent skill
Hosted form, streamable HTTP on port 8902:
Tools
All 13 tools are read-only (annotated readOnlyHint: true). Names and
parameters are exactly as registered by arcus_mcp/server.py.
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):
Pending 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.
Why a gateway and not the raw API?
api.robinhood.com/rhj + the public RPC are open, and every agent hitting them directly rediscovers the same traps:
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, so 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, and since Sep 2026 also passes Cloudflare's TLS-fingerprint bot management, so a plain client gets 403 even with browser headers. The gateway retries every Cloudflare 403 once with curl_cffi Chrome impersonation when the optional extra is installed:pip install "arcus-agent-gateway[browser]". Without it, the two explorer-backed tools (holder_snapshot,wallet_holdings) return an honestcloudflareerror with this exact hint; everything else keeps working. 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, and 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:
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.
Part of the suite
Four sibling read-only MCP gateways, one style: keyless, cached, honest degradation.
All four are on glama.ai and PyPI; any of them installs with uvx <name>.
License
MIT, see LICENSE. Not affiliated with Robinhood Markets, Inc.
来源:README.md,提交 986aaae
工具
0版本历史
2- v0.2.4最新Sep 23, 2026
- v0.2.2Sep 22, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分