Arcus Agent Gateway について
Arcus Agent Gatewayは、Robinhood Chain上の194銘柄のトークン化米国株を扱う読み取り専用ゲートウェイです。エージェントに相場、オンチェーン保有者、ウォレット残高、送金情報を提供し、価格のトークン倍率も考慮します。
主な機能
- 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 エージェントはそのすべてを利用できます。読み取り専用で、キーは不要、書き込みもありません。すべてのツールは api.robinhood.com/rhj と2つの公開オンチェーンソースに対する GET であり、熱心なエージェントが上流 API に過剰なリクエストを送らないよう、キャッシュとレート制限が適用されています。
ユースケース
AAPL の保有者を尋ねると、総供給量に占める割合と、コントラクトかウォレットかの区分が付いた上位保有者のアドレスが返されます。ある保有者コントラクトは NVDA の35%を保有しています。こうした集中リスクは、株価ページでは決して分かりません。
wallet_holdings は、194銘柄すべてを対象に任意のアドレスを読み取り、最新の株価を取得できたポジションの評価額を算出します。transfer_history は、min_value フィルターを使って最近の ERC-20 Transfer を追跡します。これにより、わずかな取引ではなく、大口取引を見つけられます。
ここで注意が必要なのが価格です。そのため、分割にも安全に対応できるよう、すべての株価に未調整の値と倍率調整後の値が併せて含まれます。また、予定されている株式分割(NVDA では2026-11に4.0の倍率が設定されています)には、警告と適用時刻が含まれます。市場の健全性、取引停止中のトークン、13セクターの平均を朝に確認するには、低コストの呼び出しを2回行うだけです。
実際の出力を含む詳しい手順については、examples/use-cases.md をご覧ください。
クイックスタート
Claude Code:
claude mcp add arcus -- uvx arcus-agent-gateway
stdio で実行する場合(ローカルエージェント向けのデフォルト):
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:サーバーを登録し、エージェントスキルをコピーします
# 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) | トークン化された株式をトークンごとに1行で表示します(シンボル、名前、ステータス、倍率、取引可能かどうか)。status は ASSET_STATUS_* プレフィックスで絞り込みます。'ALL' を指定すると絞り込みを無効にします。有効なシンボルを確認するには、まずこちらをお使いください。 |
| 2 | quote | quote(symbol) | 資産メタデータと結合したリアルタイムの気配値です。未調整および倍率調整後の買値/売値/スプレッド、is_halted、取引機能、倍率の情報を返します。不明なシンボルを指定すると、token_list() を案内するエラーが発生します。 |
| 3 | quotes | quotes(symbols) | quote() の結果をまとめて取得します。1回の呼び出しにつき最大20件で、それを超えるとエラーになります。不明なシンボルはバッチ処理を失敗させず、errors に含まれます。リクエストは並列実行されるため(セマフォ8)、キャッシュされていないシンボル10件を取得する場合、約3秒ではなく0.6~1秒で完了します。 |
| 4 | token_detail | token_detail(symbol) | 詳細情報を返します。コントラクト/チェーン/ISIN のメタデータ、埋め込みの気配値、直近5件のコーポレートアクション、履歴に関する注記を含む倍率情報、warnings(保留中の株式分割)を確認できます。 |
| 5 | market_status | market_status() | 資産情報のみから市場全体の状態を返します(194銘柄の価格を取得することはありません)。合計数、取引不可の件数、キャッシュ済みの取引停止銘柄リスト、時間外取引の推定値を含みます。 |
| 6 | corporate_actions | corporate_actions(symbol=None, limit=10) | 全トークン、または指定したシンボルの株式分割/配当を返します。API のフィールド名の違いにも対応します。 |
| 7 | search | search(query, limit=10) | トークンリストを対象にローカルであいまい検索します。apple → AAPL。スコアとセクター情報を添えて、上位の limit 件(上限50件)を返します。 |
| 8 | sector_view | sector_view(warm=False, sector=None) | 13セクターの静的マップを、規模と倍率調整後のセクター平均とともに返します。デフォルト(warm=False)ではキャッシュのみを使用し、リクエストはゼロで、warmed: false を返します。warm=True, sector="..." を指定すると、そのセクターのみ新しい気配値を並列取得し、requests_made を報告します。 |
| 9 | onchain_info | onchain_info(symbol) | 独立した3つの情報源からオンチェーン情報を取得して結合します(各情報源での失敗は必ず 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 エクスプローラーから、トークンのコントラクトの上位保有者を取得します(1ページ、最大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(ログ自身の blockTimestamp から取得した ISO 形式の日時)、from、to、value(浮動小数点数)、tx_hash、block を含みます。min_value はトークン単位で絞り込みます。ウィンドウを使い切ってログが0件の場合、explorer を案内する明示的な注記が表示されます。キャッシュ期間は60秒です。 |
| — | ウォッチリスト | — | ツールではありません。価格の追跡は、エージェントのスケジューラー(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)。 - 未調整値と調整後の値は必ずセットで扱われます。 すべての気配値には、
multiplierブロックの隣にbid_raw/ask_raw/spread_rawとbid_adjusted/ask_adjusted/mid_adjustedの両方が含まれ、どちらか一方だけになることはありません。 - オンチェーンの数量(トークン残高、ミント/バーン量)は元々乗数適用後の単位ですが、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 は公開されており、エージェントが直接アクセスするたびに、同じ落とし穴に気づいて一から対処することになります。
| 生のソースから得られるもの | 自分で構築する必要があるもの |
|---|---|
乗数で調整されていない未調整価格(コントラクト単位の bid/ask) | 乗数の計算、各気配値の未調整値/調整後の値のペア、有効時刻を含む分割保留の検出 |
| 価格履歴エンドポイントがない | レコーダー(ここではオプトイン方式):5 分間隔のスナップショット → parquet → 冪等な日次 OHLCV 集計 |
| 上流の上限は 60 req/s | 適切にレート制限されたクライアント(≤50 req/s)、エンドポイントごとのキャッシュ、並列バッチ気配値取得 |
| head から約 45~60 ブロックより古い範囲で 403 を返す RPC アーカイブウィンドウ | 適応型の遡及処理(48→32→16→8 ブロックのウィンドウ、getLogs は最大 14 回) |
| Cloudflare の UA チェックがあり、コントラクトウォレットでは 40 秒間ハングする Blockscout エクスプローラー | ブラウザー UA、タイムアウト、error/warnings[] による適切な縮退動作。空のリストを黙って返すことはありません |
API の制限とキャッシュ
- 上流はキーなしで 60 req/s まで許可しています。このクライアントは ≤ 50 req/s に自主制限しています(リクエスト間に 20 ms の間隔を設け、スレッドセーフです)。
- 一時的なエラー(
429/502/503/504、ネットワークエラー)は、2s × (attempt+1)のバックオフで最大 3 回再試行します。 - レスポンスキャッシュ(プロセスごと):
/assetsは 5 min、/prices/{symbol}は 15 s、/corporate-actionsは 1 h です。market_status()とsector_view()はキャッシュとアセットのみから計算され、価格リクエストを 194 件にわたって送信することはありません。
オンチェーンのデータソースと制限事項
v0.2 のオンチェーンツールは、REST API と並行してキー不要の公開データソースを2つ読み取ります。どちらも無料ですが、レート制限があり、一部に制限があります。上記のすべてのツールは、空の結果を黙って返すのではなく、フィールドごとの省略と 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を受け取ります。オプションの追加パッケージがインストールされている場合、ゲートウェイは Cloudflare の403を curl_cffi の Chrome なりすましを使って1回再試行します。pip install "arcus-agent-gateway[browser]"。これがない場合、エクスプローラーを利用する2つのツール(holder_snapshot、wallet_holdings)は、次の正確なヒントを含むcloudflareエラーを正直に返します。それ以外の機能は引き続き動作します。 トークンページ(holders_count、circulating_market_cap、total_supply)、1ページ分のホルダー情報(最大50行、ページネーションのループなし)、アドレスのtoken-balancesはここから取得し、600秒間キャッシュされます。token-balancesは通常のウォレットでは約0.5秒で応答しますが、巨大なコントラクトアドレスでは40秒以上ハングします。クライアントは15秒後にexplorer-timeoutの種類で正直に失敗を返します。 - オンチェーンのアクティビティ ≠ 取引。ブロックチェーンには、アドレス間の
Transfer、mint、redeem イベントが記録されますが、板取引や価格については何も記録されません。価格にはquote()/quotes()を、トークンの移動にはtransfer_history()を使用してください。
生価格に関する免責事項
価格は Robinhood から届いたとおりにそのまま(RAW)提供されます。倍率による調整は行われず、*_adjusted フィールドは上流データではなくこちらで計算した値です。すべてのデータは情報提供のみを目的としており、取引判断には使用しないでください。利用前に公式ソースで確認してください。完全性、正確性、適時性について、いかなる保証もありません。
オプションの価格履歴レコーダー
Robinhood Chain REST API には価格履歴エンドポイントがなく、取得できるのは現在の気配値のみです。194 銘柄のトークン化株式については、このレコーダーが唯一の履歴データソースです。オプトイン方式で、デフォルトでは無効になっています。明示的に有効にしない限り、何も記録されません。
**仕組み。**デフォルトでは 5 分ごとに 1 回ティックし、同じレート制限付きクライアント(上限 50 req/s、平均負荷 ≈ 0.65 req/s)を通じて、ACTIVE 状態の取引可能なトークンすべての気配値を取得します。銘柄ごとに 1 行を data/history/snapshots_YYYYMM.parquet に追記し(毎月ローテーション)、日次 OHLCV 集計ファイル data/history/daily.parquet を維持します(mid_adjusted の始値/高値/安値/終値、volume はその日の累積 daily_volume の最大値)。前日分の集計は UTC の午前 0 時以降、最初のティックで実行され、冪等です(同じ日の処理を再実行すると上書きされ、重複は発生しません)。
有効にするには:
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 分間隔で記録すると、スナップショットは 1 日あたり約 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] エクストラをインストールしてください。
セキュリティとプライバシー
- **キー不要、読み取り専用です。**API キーも認証も書き込みも不要です。すべてのツールは MCP の通信上で
readOnlyHint: true/destructiveHint: falseとして注釈されています。 - **設計上、レート制限があります。**クライアントは公開 REST インターフェースへのリクエストを 50 req/s に制限します。公開 RPC リクエストにも同じ制限が適用されます。Blockscout の呼び出しには一般的なブラウザーの User-Agent が設定され、個別のタイムアウトが適用されます。
- **テレメトリーなし、プロンプトのログ記録なし。**サーバーは公開市場データをメモリにキャッシュします(オプションのレコーダーを有効にした場合に限り、Parquet ファイルにも保存します)。API からの読み取り以外で、データがマシンの外に送信されることはありません。
スイートの一部
読み取り専用の MCP ゲートウェイ 4 つで構成され、すべて同じ方針です。キー不要、キャッシュ対応、問題発生時の動作も明確です。
| ゲートウェイ | 対象 |
|---|---|
| dydx-agent-gateway | dYdX v4:検証済みトレーダーの損益、資金調達率/OI の異常検出、リーダーボード |
| arcus-agent-gateway(このページのプロジェクト) | Robinhood Chain 上の 194 銘柄のトークン化米国株式:気配値、保有者、クジラの送金 |
| hyperliquid-agent-gateway | Hyperliquid:233 の無期限先物と現物、資金調達率キャリー、アカウントリスク、HyperEVM |
| aster-agent-gateway | Aster DEX:約 580 種類の先物(24 時間 365 日取引可能な TradFi 無期限先物を含む)、資金調達率の上限/下限 |
4 つすべてが glama.ai と PyPI で公開されており、いずれも uvx <name> でインストールできます。
ライセンス
MIT ライセンスです。詳細は LICENSE を参照してください。Robinhood Markets, Inc. とは提携していません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。