关于 Arcus Agent Gateway
Arcus Agent Gateway 是只读网关,提供 Robinhood Chain 上 194 种代币化美国股票的数据。它面向 Agent 提供报价、链上持仓者、钱包持仓和转账信息,并在价格中处理代币乘数。
主要功能
- 01获取单只及批量报价
- 02查看持仓者和钱包持仓
- 03读取近期代币转账事件
- 04查看市场状态和行业数据
- 05处理代币乘数及待执行拆股
适用场景
- 01检查代币持仓者集中度
- 02查看地址持有的代币化股票
- 03按金额筛选近期大额转账
- 04在拆股前后对比原始及调整后价格
MCP 相关
MCP 服务提供 13 个只读工具,用于查询代币化股票、报价、市场数据、持仓者、钱包及链上活动。它无需密钥即可读取公共数据源,并提供缓存和限速处理。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
13收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | |
| status | string | 否 |
详细介绍
arcus-agent-gateway
Robinhood Chain(Arcus)在链上承载着 194 种代币化的美国股票,其公共 API 能回答大多数人不会想到的问题:究竟是谁持有 AAPL,某个钱包的股票投资组合是什么样的,以及今天巨鲸们买卖 NVDA 的动向。这个 MCP 服务将所有这些信息交给 AI Agent。它只读、无需密钥、不执行写入操作;每个工具都会向 api.robinhood.com/rhj 以及两个公共链上数据源发起 GET 请求,并通过缓存和速率限制,避免过于活跃的 Agent 不断轰击上游服务。
使用场景
询问谁持有 AAPL,即可获取主要持有者地址及其占总供应量的比例,并标明是合约还是钱包。其中一个持有者合约竟持有 35% 的 NVDA;这种集中度风险,行情页面永远不会显示。
wallet_holdings 会读取任意地址在全部 194 种股票中的持仓,并为有最新报价的持仓计算价值。transfer_history 会遍历近期的 ERC-20 转账,并支持使用 min_value 筛选;这样就能捕捉大额交易,而非零星小额交易。
这里的陷阱在于价格,因此我们提供了拆股安全的数据:每条报价都会同时包含原始值和经过乘数调整的值;对于待生效的拆股(NVDA 已排定于 2026-11 使用 4.0 倍乘数),还会附带警告和生效时间。扫描市场健康状况、停牌代币和 13 个行业的平均值,只需进行两次低成本调用。
包含真实输出的完整演示:examples/use-cases.md。
快速开始
Claude Code:
claude mcp add arcus -- uvx arcus-agent-gateway
通过 stdio 运行(本地 Agent 的默认方式):
uvx arcus-agent-gateway
Claude Desktop / Cursor 的标准配置(claude_desktop_config.json / .cursor/mcp.json):
{
"mcpServers": {
"arcus": {
"command": "uvx",
"args": ["arcus-agent-gateway"]
}
}
}
Codex(~/.codex/config.toml)
[mcp_servers.arcus]
command = "uvx"
args = ["arcus-agent-gateway"]
ZCode:注册服务并复制 Agent 技能
# 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"
托管形式:在端口 8902 上使用可流式传输的 HTTP:
uvx arcus-agent-gateway --http # 127.0.0.1:8902
curl http://127.0.0.1:8902/health # -> {"ok": true, "service": "arcus-agent-gateway"}
工具
全部 13 个工具均为只读(标注为 readOnlyHint: true)。名称和参数
与 arcus_mcp/server.py 中注册的内容完全一致。
| # | 工具 | 签名 | 功能说明 |
|---|---|---|---|
| 1 | token_list | token_list(status="ACTIVE", limit=100) | 代币化股票,每个代币一行(symbol、name、status、multiplier、tradable);status 用于筛选 ASSET_STATUS_* 前缀,'ALL' 表示不筛选。可从这里开始查找有效 symbol。 |
| 2 | quote | quote(symbol) | 实时行情与资产元数据合并:原始及按 multiplier 调整后的买价/卖价/价差、is_halted、交易能力和 multiplier 区块。未知 symbol 会报错并提示使用 token_list()。 |
| 3 | quotes | quotes(symbols) | 批量返回 quote() 行,每次最多 20 个(超出会报错)。未知 symbol 会列入 errors,不会导致整批失败。请求并行执行(信号量为 8);查询 10 个未缓存的 symbol 只需 0.6–1 秒,而非约 3 秒。 |
| 4 | token_detail | token_detail(symbol) | 完整档案:合约/链/ISIN 元数据、内嵌行情、最近 5 条公司行动、附带历史说明的 multiplier 区块,以及 warnings(待处理拆股)。 |
| 5 | market_status | market_status() | 仅根据资产数据提供全市场状况(绝不获取 194 个价格):总数、不可交易数量、缓存的停牌列表、盘前盘后交易时段估算。 |
| 6 | corporate_actions | corporate_actions(symbol=None, limit=10) | 查询所有代币或单个 symbol 的拆股/股息;兼容 API 中不同的字段名称。 |
| 7 | search | search(query, limit=10) | 在代币列表中进行本地模糊搜索;apple → AAPL;返回排名靠前的 limit 个结果(上限 50),附带评分和行业。 |
| 8 | sector_view | sector_view(warm=False, sector=None) | 包含 13 个行业的静态映射,提供规模和按 multiplier 调整后的行业均值。默认值(warm=False):仅使用缓存,不发送请求,warmed: false。warm=True, sector="...":仅针对该行业并行获取最新行情,并报告 requests_made。 |
| 9 | onchain_info | onchain_info(symbol) | 汇总三个独立来源的链上信息(任一来源失败时都会添加 warnings[] 条目,不会静默忽略):合约地址、链 ID(4663,Robinhood Chain)、网络、精度、ISIN(REST)+ 通过 totalSupply() eth_call 获取的 total_supply(来源 rpc)+ holders_count、circulating_market_cap(来源 explorer)。supply_crosscheck 会比较 REST 推算的市值(total_supply × multiplier × mid)与 explorer 的市值;差异超过 1% 时会发出警告。每个派生值都带有字段级 source 标签。 |
| 10 | price_history | price_history(symbol, timeframe="daily", limit=90) | 从可选记录器的本地 parquet 存储中获取 OHLCV 历史数据(见下文)。如实处理降级情况:缺少 pyarrow 或数据时返回可执行的 error 字典,绝不静默返回空列表。 |
| 11 | holder_snapshot | holder_snapshot(symbol, limit=20) | 从 Blockscout explorer 获取代币合约的主要持有者(一页,最多 50 行,缓存 600 秒)。行字段:address、value(浮点型代币单位)、share_pct = value / total_supply × 100、is_contract。total_supply 来自 RPC,失败时回退到 explorer(附带来源标签);完全没有供应量数据时,返回 share_pct: null + 警告。出错时返回包含 kind + hint 的 error 字典。 |
| 12 | wallet_holdings | wallet_holdings(address) | 查询钱包持有的 194 种代币化股票(explorer token-balances ∩ assets() 范围)。行字段:symbol、name、value(浮点型代币单位)。est_position_usd / portfolio_usd_total 仅使用价格缓存中已有的行情计算(不并行获取行情);缺少或过期的行情会导致估算值为 null,并附带说明。缓存 120 秒。 |
| 13 | transfer_history | transfer_history(symbol, limit=25, min_value=None) | 通过公共 RPC 的自适应回溯获取近期 ERC-20 Transfer 事件(窗口从 48 个区块开始,遇到归档 403 错误时按 48→32→16→8 缩小,getLogs 请求不超过 14 次 ——(见 链上数据来源与限制))。行按时间从新到旧排列:ts(ISO 格式,取自日志自身的 blockTimestamp)、from、to、value(浮点型)、tx_hash、block。min_value 按代币单位筛选;窗口耗尽且日志数为 0 时,会明确提示查看 explorer。缓存 60 秒。 |
| — | 观察列表 | — | 不是工具。价格跟踪由 Agent 的调度器(cron)定期调用 quotes() 完成 ——(见 .agents/skills/arcus-gateway/SKILL.md)。 |
倍数逻辑(使用价格前请先阅读)
Robinhood Chain 代币带有一个倍数,即代币合约的公司行动调整系数(1.0 = 未调整)。拆分会改变它;例如,NVDA 的 2026-11 拆分会排入 pendingMultiplier: "4.0"。
- REST API 返回原始价格。
/prices/{symbol}中的bid/ask以代币合约单位计价,未按倍数调整。 - 调整后的值由此服务计算,绝不取自上游:
price_adjusted = round(price_raw × currentMultiplier, 6)。 - 原始值和调整后值始终同时提供。 每个报价都包含
bid_raw/ask_raw/spread_raw以及bid_adjusted/ask_adjusted/mid_adjusted,与multiplier块并列,绝不会只提供其中一组。 - 链上数量(代币余额、铸造/销毁量)原生以调整后(已乘倍数)的单位计量;REST 价格则不是。如果要比较两者,请使用
*_adjusted字段。
示例(实时测试样例,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.960547
待处理拆分警告。 当 pendingMultiplier 已排入队列(非空)且与当前值不同时,token_detail() 会添加类似 pending split: 1→4.0 on 2026-11-06T00:00:00Z 的警告,而 quote() 的倍数块会公开 pending + effective_time。拆分生效后,原始价格会按比例跳变,而 *_adjusted 字段仍具有可比性;这也是始终要在倍数旁查看调整后值的另一个原因。
为什么需要网关,而不是直接使用原始 API?
api.robinhood.com/rhj + 公共 RPC 均开放,但每个直接访问它们的 Agent 都会重新遇到相同的陷阱:
| 原始数据源提供 | 你需要自行构建 |
|---|---|
原始、未经倍数调整的价格(bid/ask 以合约单位计价) | 倍数计算逻辑、每个报价中的原始值/调整后值配对,以及带生效时间的待处理拆分检测 |
| 完全没有价格历史端点 | 记录器(此处可选择启用):5 分钟快照 → parquet → 幂等的每日 OHLCV 汇总 |
| 上游限制为 60 req/s | 礼貌且受速率限制的客户端(≤50 req/s)、按端点缓存、并行批量报价 |
| RPC 归档窗口在距离链头约 45–60 个区块之外会返回 403 | 自适应回溯(48→32→16→8 个区块窗口,≤14 次 getLogs) |
| Blockscout 浏览器会检查 Cloudflare UA,处理合约钱包时会卡住 40 秒 | 浏览器 UA、超时设置、如实降级并返回 error/warnings[],绝不静默返回空列表 |
API 限制与缓存
- 上游在不使用密钥时允许 60 req/s;此客户端会自行限制为**≤50 req/s**(请求间隔 20 ms,线程安全)。
- 暂时性故障(
429/502/503/504、网络错误)最多重试 3 次,退避时间为2s × (attempt+1)。 - 响应缓存(每个进程):
/assets5 min、/prices/{symbol}15 s、/corporate-actions1 h。market_status()和sector_view()仅根据缓存和资产计算;它们绝不会并行请求 194 个价格。
链上数据源与限制
v0.2 链上工具会从 REST
API 之外读取两个无需密钥的公共数据源。两者均免费、受速率限制且部分功能受限。上述每个工具都会如实降级(按字段省略数据,并通过 warnings[] / error 字典报告),绝不会静默返回空结果。
- 公共 JSON-RPC(默认值为
robinhood-rpc.publicnode.com,可通过ARCUS_RPC_URL覆盖):eth_call(例如totalSupply())可正常工作。eth_getLogs只能查询最新区块之后约 45–60 个区块的浮动窗口;更宽或更早的范围会返回 HTTP 403“Archive requests require a personal token”(后端为 Alchemy)。该窗口会逐分钟变化,因此transfer_history()会按窗口回溯,初始宽度为 48 个区块,每遇到一次 403 就依次缩小为 48→32→16→8 个区块,getLogs请求最多约 14 次。eth_getLogs日志对象会直接携带blockTimestamp,因此无需逐块查询。 - 备用 RPC(
robinhood.drpc.org,ARCUS_RPC_FALLBACK_URL):不支持eth_getLogs和eth_call(JSON-RPC 返回“method not available”); 仅用于eth_chainId/eth_blockNumber。 - Blockscout v2 浏览器(
robinhoodchain.blockscout.com/api/v2,ARCUS_EXPLORER_URL):每个请求都必须包含浏览器 User-Agent;自 2026 年 9 月起,还必须通过 Cloudflare 的TLS 指纹机器人管理检测,因此即使带有浏览器请求头,普通客户端也会收到 403。安装可选扩展后,网关会通过 curl_cffi Chrome 模拟,对每个 Cloudflare 403 重试一次:pip install "arcus-agent-gateway[browser]"。如果未安装该扩展,两个依赖浏览器的工具(holder_snapshot、wallet_holdings)会返回包含以下确切提示的cloudflare错误;其他功能仍可正常工作。 代币页面(holders_count、circulating_market_cap、total_supply)、一个持有者页面(最多 50 行,不会循环翻页)以及地址的token-balances均来自此处,缓存时间为 600 s。在普通钱包上,token-balances的响应时间约为 0.5 s,但在大型合约地址上可能会卡住 40 s 以上;客户端会在 15 s 后以explorer-timeout类型如实报错。 - 链上活动 ≠ 交易。 区块链会记录地址之间的
Transfer、铸造和赎回事件;它不包含任何订单簿交易或价格信息。价格请使用quote()/quotes()查询,代币转移记录请使用transfer_history()查询。
原始价格免责声明
价格完全按照 Robinhood 返回的数据提供(RAW);不会应用乘数进行调整,*_adjusted 字段是我们计算得出的数据,并非上游数据。所有数据仅供参考,不得用于交易决策;采取行动前,应先向官方来源核实。我们不保证数据的完整性、准确性或时效性。
可选的价格历史记录器
Robinhood Chain REST API 没有价格历史端点,只有当前报价。对于这 194 种代币化股票,这个记录器是唯一的历史数据来源。它是可选启用,默认禁用;除非你明确启用,否则不会记录任何数据。
工作方式。 默认每 5 分钟采集一次:通过同一个限速客户端获取每种 ACTIVE 可交易代币的报价(上限为 50 req/s;平均负载约为 0.65 req/s),为每个交易代码追加一行到 data/history/snapshots_YYYYMM.parquet(按月轮换),并维护每日 OHLCV 汇总文件 data/history/daily.parquet(以 mid_adjusted 计算开盘价/最高价/最低价/收盘价,volume = 当日累计 daily_volume 的最大值)。汇总任务会在 UTC 午夜后的首次采集中运行,处理前一天的数据,并且具备幂等性(重新处理某一天会覆盖原有数据,不会产生重复项)。
启用方法:
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)
数据占用与轮换。 全部 194 种代币每 5 分钟采集一次,快照约占每天 2–3 MB,每日汇总约占 10 KB。快照按月轮换(snapshots_YYYYMM.parquet);不再需要原始粒度数据时,可删除旧月份的数据。daily.parquet 是紧凑的长期存储文件。数据写入 ~/.local/state/arcus-agent-gateway/history/(可通过 ARCUS_GATEWAY_DATA 覆盖)。
读取数据: price_history 工具会从同一目录提供 daily 日线数据和 raw 快照。若缺少 pyarrow 或数据,该工具会返回可执行的错误提示,指引你安装 [recorder] extra,而不会静默返回空结果。
安全与隐私
- 无需密钥,只读。 不需要 API 密钥或身份验证,也不会写入数据。每个工具在 MCP 协议中都标注为
readOnlyHint: true/destructiveHint: false。 - 从设计上进行限速。 客户端针对公开 REST 接口限制为 50 req/s;公开 RPC 请求也使用同一限速器;Blockscout 调用会携带标准浏览器 User-Agent,并设置各自的超时时间。
- 不收集遥测数据,不记录你的提示词。 服务会在内存中缓存公开市场数据(只有启用可选记录器时才会写入 parquet 文件);除了 API 读取请求本身,不会有任何数据离开你的设备。
套件中的项目
四个同系列的只读 MCP 网关,风格一致:无需密钥、带缓存、如实处理降级。
| 网关 | 重点 |
|---|---|
| dydx-agent-gateway | dYdX v4:经验证的交易者 PnL、资金费率/OI 异常检测器、排行榜 |
| arcus-agent-gateway(你正在查看) | Robinhood Chain 上的 194 种代币化美国股票:报价、持有者、巨鲸转账 |
| hyperliquid-agent-gateway | Hyperliquid:233 种永续合约 + 现货、资金费率套利、账户风险、HyperEVM |
| aster-agent-gateway | Aster DEX:约 580 种期货,包括 24/7 TradFi 永续合约、资金费率上限/下限 |
这四个项目都已发布在 glama.ai 和 PyPI 上;使用 uvx <name> 即可安装其中任意项目。
许可证
MIT,详见 LICENSE。与 Robinhood Markets, Inc. 无关联。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。