mcpField
A
Arcus Agent Gateway

Arcus Agent Gateway

本地服务
github.com/alekskram金融数据15 周前更新

关于 Arcus Agent Gateway

Arcus Agent Gateway 是只读网关,提供 Robinhood Chain 上 194 种代币化美国股票的数据。它面向 Agent 提供报价、链上持仓者、钱包持仓和转账信息,并在价格中处理代币乘数。

主要功能

  1. 01获取单只及批量报价
  2. 02查看持仓者和钱包持仓
  3. 03读取近期代币转账事件
  4. 04查看市场状态和行业数据
  5. 05处理代币乘数及待执行拆股

适用场景

  1. 01检查代币持仓者集中度
  2. 02查看地址持有的代币化股票
  3. 03按金额筛选近期大额转账
  4. 04在拆股前后对比原始及调整后价格

MCP 相关

MCP 服务提供 13 个只读工具,用于查询代币化股票、报价、市场数据、持仓者、钱包及链上活动。它无需密钥即可读取公共数据源,并提供缓存和限速处理。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"alekskram-arcus-agent-gateway": {
"command": "uvx",
"args": [
"arcus-agent-gateway"
]
}
}
}
启动命令uvx arcus-agent-gateway

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiarcus-agent-gateway0.2.4

工具

13

收录的工具列表 · 更新于 2 周前

参数类型必填说明
limitinteger否
statusstring否

详细介绍

arcus-agent-gateway

CI PyPI PyPI downloads MCP Catalog License: MIT Python 3.11+

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 中注册的内容完全一致。

#工具签名功能说明
1token_listtoken_list(status="ACTIVE", limit=100)代币化股票,每个代币一行(symbol、name、status、multiplier、tradable);status 用于筛选 ASSET_STATUS_* 前缀,'ALL' 表示不筛选。可从这里开始查找有效 symbol。
2quotequote(symbol)实时行情与资产元数据合并:原始及按 multiplier 调整后的买价/卖价/价差、is_halted、交易能力和 multiplier 区块。未知 symbol 会报错并提示使用 token_list()。
3quotesquotes(symbols)批量返回 quote() 行,每次最多 20 个(超出会报错)。未知 symbol 会列入 errors,不会导致整批失败。请求并行执行(信号量为 8);查询 10 个未缓存的 symbol 只需 0.6–1 秒,而非约 3 秒。
4token_detailtoken_detail(symbol)完整档案:合约/链/ISIN 元数据、内嵌行情、最近 5 条公司行动、附带历史说明的 multiplier 区块,以及 warnings(待处理拆股)。
5market_statusmarket_status()仅根据资产数据提供全市场状况(绝不获取 194 个价格):总数、不可交易数量、缓存的停牌列表、盘前盘后交易时段估算。
6corporate_actionscorporate_actions(symbol=None, limit=10)查询所有代币或单个 symbol 的拆股/股息;兼容 API 中不同的字段名称。
7searchsearch(query, limit=10)在代币列表中进行本地模糊搜索;apple → AAPL;返回排名靠前的 limit 个结果(上限 50),附带评分和行业。
8sector_viewsector_view(warm=False, sector=None)包含 13 个行业的静态映射,提供规模和按 multiplier 调整后的行业均值。默认值(warm=False):仅使用缓存,不发送请求,warmed: false。warm=True, sector="...":仅针对该行业并行获取最新行情,并报告 requests_made。
9onchain_infoonchain_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 标签。
10price_historyprice_history(symbol, timeframe="daily", limit=90)从可选记录器的本地 parquet 存储中获取 OHLCV 历史数据(见下文)。如实处理降级情况:缺少 pyarrow 或数据时返回可执行的 error 字典,绝不静默返回空列表。
11holder_snapshotholder_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 字典。
12wallet_holdingswallet_holdings(address)查询钱包持有的 194 种代币化股票(explorer token-balances ∩ assets() 范围)。行字段:symbol、name、value(浮点型代币单位)。est_position_usd / portfolio_usd_total 仅使用价格缓存中已有的行情计算(不并行获取行情);缺少或过期的行情会导致估算值为 null,并附带说明。缓存 120 秒。
13transfer_historytransfer_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)。
  • 响应缓存(每个进程):/assets 5 min、/prices/{symbol} 15 s、/corporate-actions 1 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-gatewaydYdX v4:经验证的交易者 PnL、资金费率/OI 异常检测器、排行榜
arcus-agent-gateway(你正在查看)Robinhood Chain 上的 194 种代币化美国股票:报价、持有者、巨鲸转账
hyperliquid-agent-gatewayHyperliquid:233 种永续合约 + 现货、资金费率套利、账户风险、HyperEVM
aster-agent-gatewayAster DEX:约 580 种期货,包括 24/7 TradFi 永续合约、资金费率上限/下限

这四个项目都已发布在 glama.ai 和 PyPI 上;使用 uvx <name> 即可安装其中任意项目。

许可证

MIT,详见 LICENSE。与 Robinhood Markets, Inc. 无关联。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。