mcpField
R
Robinhood Crypto

Robinhood Crypto

ローカル
github.com金融データ113 週間前に更新

Robinhood Crypto について

Robinhood Cryptoは、公式Robinhood Crypto Trading API向けのMCPツールキットで、暗号資産の口座情報や取引自動化を扱うエージェントと運用者を対象とします。読み取り専用アクセスと取引実行を分け、リスク制御付きの永続的な合成注文ジョブに対応します。取引は実資金を使い、サンドボックスはありません。

主な機能

  1. 01相場、保有資産、注文履歴
  2. 02FIFO原価と実現損益
  3. 03永続的な合成注文タイプ13種
  4. 04明示的な有効化とリスク上限・キルスイッチ
  5. 05モジュール単位のツール登録
  6. 06取引ジャーナルと接続診断

活用シーン

  1. 01暗号資産価格と口座保有状況の確認
  2. 02原価と実現損益の確認
  3. 03合成注文のバックグラウンド実行
  4. 04自動取引の上限設定と停止

MCP 対応

読み取り専用のデータサーバーと取引サーバーを分けてMCPクライアントに提供します。データサーバーは口座・相場情報のツールを公開し、取引サーバーは明示的に有効化すると注文や永続的な戦略を実行でき、保護策はコードで強制されます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"nirholas-robinhood": {
"command": "npx",
"args": [
"-y",
"robinhood-mcp"
],
"env": {
"ROBINHOOD_CRYPTO_API_KEY": "<ROBINHOOD_CRYPTO_API_KEY>",
"ROBINHOOD_CRYPTO_PRIVATE_KEY": "<ROBINHOOD_CRYPTO_PRIVATE_KEY>",
"ROBINHOOD_CRYPTO_API_VERSION": "<ROBINHOOD_CRYPTO_API_VERSION>",
"ROBINHOOD_CRYPTO_BASE_URL": "<ROBINHOOD_CRYPTO_BASE_URL>"
}
}
}
}
起動コマンドnpx -y robinhood-mcp
設定が必要な環境変数
ROBINHOOD_CRYPTO_API_KEYシークレットAPI key from your Robinhood crypto account settings (robinhood.com/account/crypto, web classic only).
ROBINHOOD_CRYPTO_PRIVATE_KEYシークレットBase64-encoded 32-byte Ed25519 private seed whose public key is registered with Robinhood. Generate one with `npx robinhood-keygen`.
ROBINHOOD_CRYPTO_API_VERSIONAPI version: "v1" (default) or "v2". v2 adds fee-tier data to accounts and orders.
ROBINHOOD_CRYPTO_BASE_URLOverride the API host. Defaults to https://trading.robinhood.com.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmrobinhood-mcp0.1.1

ツール

1

掲載時のツール一覧 · 2 週間前に更新

このツールにパラメーターはありません。

詳細

robinhood-mcp

GitHub stars License Last commit PRs welcome AI agent friendly

Model Context Protocol 経由で提供される、Robinhood 公式暗号資産取引 API向けの取引実行ツールキットです。

Robinhood の暗号資産 API が公開している注文タイプは、market、limit、stop_loss、stop_limit の4種類だけです。ブラケット注文、OCO 注文、トレーリングストップ、TWAP、アイスバーグ注文、段階的な買い増し注文、定期的な DCA、ポートフォリオのリバランスには対応していません。これらは実際に求められている注文タイプであり、いずれも同じ要件があります。リクエストの応答後も何かが動き続けなければなりません。1回のツール呼び出しの間だけ有効なトレーリングストップは、トレーリングストップとは言えません。このパッケージは Robinhood にない13種類の注文タイプを実現し、エージェントの切断後、サーバーの再起動後、マシンの再起動後も存続する永続的なバックグラウンドジョブとして実行します。その周辺には、オプトイン方式の8つのモジュールにわたる約73個のツールがあります。価格情報と保有資産、FIFO 原価基準と実現損益、取引ジャーナル、強制キルスイッチ付きのリスク上限、連携の診断機能を備えています。

これは Robinhood Chain ではなく、Robinhood の株式取引にも対応していません。対象は trading.robinhood.com の証券会社向け Crypto Trading API で、docs.robinhood.com/crypto/trading にドキュメントがあります。


署名ベンチ — nirholas.github.io/robinhood-mcp

プロジェクトのサイトは、インタラクティブなEd25519 署名ベンチです。実際の Robinhood 取引リクエストを組み立て、ブラウザー上で本物の署名を生成できます。計算は Robinhood が公開しているサンプルキーを使ってクライアント側で実行され、データが外部に送信されることはありません。その後、Robinhood 自身のドキュメントの誤りを実証する様子を確認できます。公開されているテストベクトルが検証できるのは、すべてのクライアントが実際に送信する JSON 本文ではなく、Python の dict 表現に対してです。docs/ にある単一の自己完結型ページなので、静的ホスティングであればどこにでもデプロイできます。

ワンクリックで独自のコピーをデプロイできます。

Deploy to Cloudflare Deploy to Netlify Deploy with Vercel

デプロイ先方法
GitHub PagesSettings → Pages → Source: main / /docs。nirholas.github.io/robinhood-mcp/ で公開されます。ビルド手順は不要です。
Cloudflare Pages上のボタンを使うか、wrangler pages deploy docs を実行します。設定は wrangler.toml にあります。
Google CloudHTTPS ロードバランサーの背後で gcloud storage cp -r docs/* gs://<bucket>/ を実行するか、docs/ をルートとする任意の静的サーバーで Cloud Run を使用します。
Netlify / Vercel上のボタンを使用します。公開ディレクトリは docs/ です(netlify.toml、vercel.json)。

安全性

Robinhood はサンドボックスを提供していません。 ペーパーアカウントも、テスト環境も、ドライラン用のホストもありません。このパッケージで発注できる注文はすべて、実際の証券口座で実際のお金を使うもので、事前に試す方法はありません。ROBINHOOD_CRYPTO_ENABLE_TRADING=1 を設定する前に、このセクションをお読みください。

以下のガードはすべて、ツールの説明文ではなく、すべての注文が通過する単一の Executor の内部でコードにより適用されます。プロンプト内の指示は提案にすぎませんが、発生するエラーはそうではありません。

ガード動作
バイナリの分離robinhood-mcp データサーバーには、取引可能なツールは登録されません。汎用アシスタントに接続しても、注文が発生することはありません。
明示的なオプトインROBINHOOD_CRYPTO_ENABLE_TRADING=1 が設定されていない場合、取引サーバーとデーモンは起動を拒否します。誤って起動することはありません。
注文ごとの USD 上限すべての注文は送信前に価格が算出され、ROBINHOOD_CRYPTO_MAX_ORDER_USD(デフォルトは $100)を超えると拒否されます。これはフェイルクローズ動作です。USD 価値を事前に特定できない場合、安価だと推定するのではなく注文を拒否します。
累積 USD 上限ROBINHOOD_CRYPTO_MAX_DAILY_USD は、プロセスが合計でその金額に達すると、それ以上の注文を拒否します。
シンボルの許可リストROBINHOOD_CRYPTO_SYMBOL_ALLOWLIST が設定されている場合、そのペアのみ取引できます。それ以外はすべて拒否されます。
買いのみROBINHOOD_CRYPTO_BUY_ONLY=1 を設定すると、すべての売り注文が拒否されます。
ガード付きと自律型デフォルトの guarded モードでは、注文ツールは送信するはずの正確なリクエストと価格算出済みの見積もりを返します。confirm: true を含む2回目の呼び出しが行われるまで、注文は発注されません。ROBINHOOD_CRYPTO_AUTONOMOUS=1 を設定すると、このゲートは省略され、無人運用の戦略に対応します。
キルスイッチrisk_kill_switch_engage はすべての実行を停止し、実行中のすべてのジョブを一時停止します。状態はディスクに永続化され、すべての注文で読み取られ、キャッシュされず、Executor 内で確認されます。

これらの制御については、誤解されやすい点が2つあるため、明確に説明しておきます。

自律型で取り除かれるのは人間であり、上限ではありません。 注文ごとの上限、累積上限、許可リスト、買いのみのフラグは、いずれも自律型モードでも引き続き適用されます。無人のエージェントは、注文の暴走が最も起こりやすく、最も気づかれにくいケースです。

キルスイッチはデーモンにも適用されます。 リスクツールのモジュール内ではなく、Executor の隣に配置されています。これは、robinhood-mcp-daemon が独自の Executor を構築し、ツールモジュールを一切読み込まないためです。モジュールに実装した停止機能では、システム内で無人のまま注文を続ける唯一のプロセスを停止できません。状態はキャッシュされず、注文のたびにディスクから読み取られるため、MCP セッションからスイッチを入れると、そのスイッチが存在する前から稼働しているデーモンも停止します。これはフェイルクローズ動作です。解析できない行は「作動中」として読み取られます。破損した行のまま取引を再開することこそ、キルスイッチが防ぐべき事態だからです。

2つの制限については、何ができないかを正直に説明しておきます。累積上限は、プロセスごとのメモリ内カウンターであり、再起動するとリセットされます。暴走ループを抑止するためのもので、会計システムでも厳格な予算管理でもありません。また、永続ジョブの総支出には上限がありません。注文ごとの上限はジョブが発注する各注文に適用されますが、注文ごとの上限が $100 の TWAP で50回に分割すれば、合計 $5,000 を発注できます。ジョブのサイズは慎重に設定し、無人運用の処理を始める前に risk_status を確認してください。

最後に、API キー自体の権限を適切に設定してください。Robinhood では、認証情報ごとに権限を選択できます。読み取りだけが必要な場合は、注文の発注権限を付与しないでください。そうすれば、そのキーをどのソフトウェアが保持していても取引できません。IP 許可リストも利用できるため、使用をおすすめします。


インストール

Node.js 22.5 以降が必要です(永続ジョブストアで node:sqlite を使用します)。

事前にインストールするものはありません。MCP クライアントが npx でサーバーを起動します。

1. 認証情報を作成する
npx robinhood-keygen

これにより、新しい Ed25519 キーペアが JSON 形式で標準出力に出力され、手順が標準エラー出力に表示されます。続いて、次の手順を行います。

  1. robinhood.com/account/crypto で公開鍵を登録します。このページは従来のウェブ版のみで利用でき、モバイルアプリと新しいウェブ UI では利用できません。
  2. 代わりに Robinhood から API キーが発行されます。これが ROBINHOOD_CRYPTO_API_KEY です。
  3. 秘密鍵は ROBINHOOD_CRYPTO_PRIVATE_KEY として保持します。これはbase64 エンコードされた 32 バイトの Ed25519 シードであり、64 バイトの展開済みキーペアでも PKCS#8 でもありません。Ed25519 ライブラリの中には seed‖publicKey をエクスポートするものがあり、それを貼り付けると 64 バイトになり、すべてのリクエストが失敗します。秘密鍵はパスワードと同じように扱ってください。取引を承認するためのものであり、このパッケージはローカルで計算する署名以外の用途で、これを保存したり送信したりすることはありません。

すでに別の場所でキーペアを作成している場合は、dev モジュールの verify_keypair で、何も送信せずに秘密鍵が登録済みの公開鍵と一致するか確認できます。

2. MCP クライアントにサーバーを追加する

このパッケージには 2 つのバイナリが含まれており、意図的に別々になっています。

サーバーバイナリできること
データrobinhood-mcp相場、保有資産、アカウント、注文履歴、取得原価、損益。注文は発注できません。
取引robinhood-mcp-trading上記すべてに加えて、実際の注文、合成注文タイプ、リスク管理。

読み取り専用。 まずはこちらを起動し、汎用アシスタントに接続してください。claude_desktop_config.json(Claude Desktop)、.mcp.json(Claude Code)、またはクライアントに相当する設定ファイルに貼り付けます。

{
  "mcpServers": {
    "robinhood-crypto": {
      "command": "npx",
      "args": ["-y", "robinhood-mcp"],
      "env": {
        "ROBINHOOD_CRYPTO_API_KEY": "rh-api-...",
        "ROBINHOOD_CRYPTO_PRIVATE_KEY": "your-base64-seed"
      }
    }
  }
}

アシスタントに「Robinhood の暗号資産の購入可能額はいくらですか? BTC の取引価格はいくらですか?」と尋ねてみてください。

取引。 実際に注文を発注するため、別のエントリになっています。

{
  "mcpServers": {
    "robinhood-crypto-trading": {
      "command": "npx",
      "args": ["-y", "robinhood-mcp-trading"],
      "env": {
        "ROBINHOOD_CRYPTO_API_KEY": "rh-api-...",
        "ROBINHOOD_CRYPTO_PRIVATE_KEY": "your-base64-seed",
        "ROBINHOOD_CRYPTO_ENABLE_TRADING": "1",
        "ROBINHOOD_CRYPTO_MAX_ORDER_USD": "50",
        "ROBINHOOD_CRYPTO_MAX_DAILY_USD": "500",
        "ROBINHOOD_CRYPTO_SYMBOL_ALLOWLIST": "BTC-USD,ETH-USD"
      }
    }
  }
}

損失しても問題ない金額を上限に設定してください。誤解された指示が実際の約定につながるのを防ぐ唯一のものです。

両方のエントリを同時に実行できます。データサーバーは常時接続しておいても安全です。取引する場合に、取引サーバーを追加してください。

認証情報をまだ設定していない場合

データサーバーは起動します。終了する代わりに(終了すると、多くの MCP クライアントでは「サーバーの起動に失敗しました」という詳細の分からないエラーとして表示されます)、不足している項目と対処方法を報告する get_setup_status ツール 1 つだけを備えて起動します。このツールしか表示されない場合は、認証情報が設定されていません。ROBINHOOD_CRYPTO_API_KEY と ROBINHOOD_CRYPTO_PRIVATE_KEY を設定してからサーバーを再起動すると、すべてのツールが利用可能になります。

取引サーバーは意図的に起動条件が厳しく、ROBINHOOD_CRYPTO_ENABLE_TRADING=1 を設定しないと起動しません。そのため、誤って起動することはありません。


モジュール

このツールキットは、1つのエージェントが一度に扱うには大きすぎます。各ツールはコンテキストを消費し、選択肢を増やすため、ツールの選択精度が目に見えて低下します。そのため、機能はオペレーターが ROBINHOOD_MCP_MODULES で有効にするモジュールとして提供されます。選択したモジュールだけが登録されます。

モジュール機能デフォルト注文を発注
market気配値、保有資産、口座詳細、取引ペア、注文履歴。有効いいえ
orders4種類のネイティブ注文タイプを個別のツールとして提供するほか、汎用の place_order と cancel_order を提供します。有効はい
algo永続的なバックグラウンドジョブとして実行する、13種類の合成注文タイプ。有効はい
portfolioFIFO 原価基準、実現損益と税務ロット、配分、スリッページ、ボラティリティ、リスクベースのポジションサイズ決定。有効いいえ
riskエクスポージャー、集中度、ドローダウン、取引前チェック、強制適用されるキルスイッチ。有効はい
journal約定、往復取引、勝率とプロフィットファクター、日次サマリー、古い未決済注文、CSV エクスポート、照合。無効いいえ
opsヘルスチェック、クロックスキュー、キー検証、レート制限の状態、API バージョン、スーパーバイザー、未決済インテントの状態。無効いいえ
dev接続診断、署名の説明、キーペアの生成と検証、クライアントコード生成、環境チェック。無効いいえ

risk は、キルスイッチを作動させると実行中のジョブが一時停止するため、注文を発注するモジュールに分類されています。ただし、それ自体が注文を送信することはありません。

選択の仕組み:

  • 未設定の場合、デフォルトのセット(market、orders、algo、portfolio、risk)から、サーバーがホストできないものを除いたモジュールが読み込まれます。これにより、取引サーバーでは52個、データサーバーでは16個のツールが読み込まれます。
  • カンマ区切りのリストを指定すると、そのモジュールだけが読み込まれます。例:ROBINHOOD_MCP_MODULES=market,orders,risk。
  • **all**を指定すると、すべてが読み込まれます。取引サーバーでは73個のツールが読み込まれます。

不明なモジュール名が指定されると、黙って無視されるのではなく、起動に失敗します。ツールが静かに無効になる入力ミスより、サーバーが起動を拒否するほうが望ましいためです。

すべてを読み込むと、ツールの選択精度が低下します。 all は機能を調べる開発者には便利ですが、本番環境のエージェントには適していません。タスクで実際に必要なモジュールを選んでください。エージェントがある機能を実行できないと報告した場合は、list_modules を呼び出させてください。このツールは、不足している機能を有効にするための正確な ROBINHOOD_MCP_MODULES の値を示すため、無効なモジュールをツールキットに備わっていない機能と誤認することはありません。

データサーバーは変更を伴うモジュール(orders、algo、risk)の読み込みを拒否し、読み込みを要求された場合は起動に失敗します。そのため、オペレーターが実行機能を有効にしたと誤認することはありません。

73個すべてのツールの完全なパラメーターリファレンス:docs/tools.md。


13種類の合成注文タイプ

これらはそれぞれ、Robinhood の4種類の基本注文タイプを基盤とし、スーパーバイザーが時間の経過に合わせて処理を進めます。各注文タイプは、型付きスキーマを備えた専用ツールで開始されるため、パラメーターの不足や名前の誤りは、ジョブの実行中ではなくスキーマの境界でエラーになります。

注文タイプツール機能主なパラメーター
TWAPalgo_twap_start1 件の大口注文を、指定した時間にわたって均等な間隔の小口注文に分割します。これにより、単一のスプレッドを支払うのではなく、時間枠全体で平均的な価格でエントリーできます。total_quantity、slices、duration_minutes、任意の limit_price ガード
トレーリングストップalgo_trailing_stop_start相場に追随するストップを設定します。ストップは有利な方向にのみ更新され、後退しません。価格がトレール幅を超えて戻ったときに、全数量を決済します。quantity、trail_percent と trail_amount のいずれか一方のみ、任意の activation_price
ブラケットalgo_bracket_startポジションにエントリーし、互いにキャンセルし合う利確注文と損切り注文を設定します。これにより、決済注文が片方だけ残ることはありません。entry_type、entry_price、take_profit_price、stop_loss_price
OCOalgo_oco_start既存のポジションに対して利確注文とストップ注文を出し、約定しなかった方をキャンセルします。quantity、take_profit_price、stop_price、任意の stop_limit_price
DCAalgo_dca_start指定した回数に達するまで、一定額を決められたスケジュールで繰り返し購入または売却します。interval_hours、occurrences、quote_amount_per_buy と asset_quantity_per_buy のいずれか一方、任意の max_price
ラダーalgo_ladder_start価格帯にわたって指値注文を複数出し、価格の変動に合わせてポジションを段階的に構築または解消します。total_quantity、levels、start_price、end_price、distribution
アイスバーグalgo_iceberg_start大口注文を小さな表示数量の背後で執行し、小口注文が約定するたびに補充することで、板に全数量が表示されないようにします。total_quantity、visible_quantity、max_duration_minutes、任意の limit_price
チェイスalgo_chase_start指値注文を出し、板が離れるのに合わせて注文を再提示することで、スプレッドを越えずに約定を目指します。quantity、max_chases、offset_bps、任意の limit_price 上限
グリッドalgo_grid_start価格帯の下側に買い注文、上側に売り注文を出します。注文が約定するたびに、1 段離れた反対側の注文を出し直し、往復取引ごとに価格差を収益化します。lower_price、upper_price、grid_levels、quantity_per_grid、任意の max_cycles/max_duration_minutes/stop_price
モメンタムalgo_momentum_start価格が直近のレンジを指定した幅だけ上抜けまたは下抜けしたときにエントリーし、その後、到達した値動きの指定割合だけ価格が戻ったときに決済します。side、quantity、lookback_ticks、breakout_pct、exit_pct、max_duration_minutes
平均回帰algo_mean_reversion_start直近の平均から指定した標準偏差の数だけ乖離した価格に逆張りし、価格が平均に向かって戻ったときに取引を決済します。quantity、lookback_ticks、entry_z、exit_z、side_mode、max_duration_minutes
買い集めalgo_accumulate_start価格が弱含みのときにのみ目標数量まで買い進めます。価格が直近の平均を指定割合だけ下回り、かつ上限価格以下になったときに小口分を購入します。target_quantity、slice_quantity、max_price、buy_below_pct、lookback_ticks、max_duration_minutes
リバランスalgo_rebalance_start保有資産を目標ウェイトに近づけるため、比率が高すぎる資産を売却し、比率が低すぎる資産を購入します。購入より先に売却します。targets、tolerance_bps、max_legs_per_tick、dry_run

各ツールの説明には、それぞれの失敗条件が記載されています。失敗条件は戦略によって異なります。たとえば、limit_price を設定した TWAP は、目標数量をすべて執行できずに終了する場合があります。OCO では、一方の注文が約定してからもう一方がキャンセルされるまで、避けられないエクスポージャーが生じます。また、両方の注文が約定した場合は成功ではなく failed と報告されます。max_duration_minutes に達したアイスバーグは、執行中の小口注文をキャンセルし、数量未達のまま完了します。実際に実行する前にツールの説明を読み、algo_rebalance_start の dry_run を使って、注文が送信される前に各注文の内容を確認してください。 この API は現物取引専用であるため、4 つのツールに制約があります。 借り入れも空売りポジションの開始もできないため、ここでは空売りを行うものはありません。

  • algo_mean_reversion_start は、side_mode が short_only または both でも空売りは行いません。極端な高値で既存の保有分を売り、価格が戻ったときに買い戻します。アカウントが quantity をカバーできるだけの保有分をすでに持っていない限り、どちらのモードも開始時に拒否されます。また、空売りの各エントリーでは、注文を出す前に残高が再確認されます。
  • algo_momentum_start の side: "sell" も同様です。これはアカウントがすでに保有しているコインをモメンタムに応じて売却するもので、空売りではありません。保有分がない場合、init はジョブを拒否します。
  • algo_grid_start は、自身の買い注文で調達していないコインを売却しません。max_cycles と max_duration_minutes には必ず値が設定されます(デフォルトは 100 サイクル、7 日間)。どちらも設定されていないグリッドは終了しないためです。清算を行うのは stop_price のみです。指値注文をキャンセルし、グリッドの保有分を成行で売却します。
  • algo_accumulate_start は、algo_dca_start のように一定の間隔で買うのではなく、価格の下落を待ちます。そのため、max_duration_minutes が過ぎる前に条件に合う下落がなければ、目標未達で終了する可能性があります。目標未達で終了した実行は、未達として報告されます。

永続ジョブ

開始ツールは、呼び出しの中でアルゴリズムを実行しません。永続ジョブを作成して戻り、その後はスーパーバイザーが実行を管理します。

   algo_twap_start ("TWAP 0.5 BTC over 2 hours")
        |
        v
    JobStore (SQLite)  <-->  Supervisor  -->  Strategy.advance()  -->  Executor
                              (tick loop)

それが重要な理由です。ジョブは会話が終わっても存続します。 エージェントの切断、MCP サーバーの再起動、マシンの再起動後も存続します。また、チャットウィンドウを閉じた後も資金を使い続けます。そのため、すべての開始ツールでその旨を伝えており、algo_cancel_job が用意されています。

ジョブは ~/.robinhood-mcp/jobs.db にある SQLite データベースに保存され、ROBINHOOD_MCP_DB で保存先を変更できます。ジョブが別のフォルダーから開始されても存続し、誤ってリポジトリにコミットされないよう、作業ディレクトリではなくホームディレクトリの下に置かれています。キルスイッチの状態も同じファイルに保存されるため、スイッチと、スイッチによって停止されるジョブが、どのデータベースを正とするかについて食い違うことはありません。

無人実行

MCP サーバーはクライアントが開いている間だけ実行されるため、MCP 経由で開始したジョブが進行するのは、その会話が続いている間だけです。無人実行するには、同じジョブデータベースを管理するデーモンを実行します。

ROBINHOOD_CRYPTO_ENABLE_TRADING=1 \
ROBINHOOD_CRYPTO_MAX_ORDER_USD=50 \
npx robinhood-mcp-daemon

systemd、launchd、pm2、コンテナなど、再起動を行う仕組みの下で実行してください。設計上、再起動は安全です。認証情報はマシン上に保持され、デーモンは Robinhood とのみ通信します。

ジョブが存在し、正常に見えるのに何も起きていない場合、スーパーバイザーの処理が進んでいません。この問題の確認には ops_supervisor_status を使います。この問題ではエラーがまったく発生しません。TWAP の処理が進んでいないなら、遅いのではなく停止しています。

クラッシュ時の安全性

ここで間違えると、実際の資金を使った実注文が二重に約定してしまいます。

単純な設計では、注文を送信してから、その後に記録します。この2つのステップの間にプロセスが停止すると、Robinhood には注文が存在するのに、ジョブにはその記録が残りません。再起動後にストラテジーが同じ注文分を再度実行し、ユーザーは二重に約定することになります。

代わりに、すべての注文を次の3段階の書き込みとして処理します。

  1. 予約。 client_order_id を生成し、ネットワーク呼び出しの前にインテント行を永続化します。
  2. 送信。 そのIDをそのまま使って POST します。曖昧な書き込みを再試行すると二重約定につながる可能性があるため、再試行は無効にします。
  3. 確定。 応答を記録します。

起動時に、スーパーバイザーは未処理のインテントをすべて client_order_id で Robinhood と照合します。見つかった場合は、クラッシュ前に注文が発注されていたことを意味するため、その注文を引き継ぎ、再送信はしません。確実に見つからなかった場合は、Robinhood が注文を受け取っていません。照会自体が完了しなかった場合、インテントは保留のままとなり、再試行されます。結論が出ていない回答を「見つからなかった」と解釈してはなりません。Robinhood には client_order_id による照会フィルターがないため、照会は注文履歴を上限付きで走査します。注文が有効なままのインテントを放棄すると、新しいIDで同じ注文分を再発注することになるためです。

クラッシュ後は、ops_jobs_pending_intents に未確定のまま残った項目が一覧表示され、journal_reconcile はローカルの記録全体を Robinhood と照合します。これらを手動で再送信しないでください。照合時に注文が存在すれば引き継がれます。新しいIDで手動再送信すると、意図した1回の約定が実際には2回発生することになります。


設定

変数必須デフォルト用途
ROBINHOOD_CRYPTO_API_KEYはいなし公開鍵を登録したときに Robinhood から発行される API キーです。
ROBINHOOD_CRYPTO_PRIVATE_KEYはいなしBase64 でエンコードされた 32バイトの Ed25519 シードです。64バイトに展開された鍵や PKCS#8 は使用できません。
ROBINHOOD_CRYPTO_API_VERSIONいいえv1v1 または v2 です。v2 では手数料ティアのデータが追加されます。それ以外の値では起動に失敗します。
ROBINHOOD_CRYPTO_BASE_URLいいえhttps://trading.robinhood.comAPI ホストを上書きします。接続先に指定できるサンドボックスホストはありません。
ROBINHOOD_MCP_MODULESいいえデフォルトのセットカンマ区切りのモジュール名、または all です。不明な名前を指定すると起動に失敗します。
ROBINHOOD_MCP_DBいいえ~/.robinhood-mcp/jobs.db永続ジョブとキルスイッチの状態を保存する場所です。
ROBINHOOD_MCP_TICK_MSいいえ5000デーモンスーパーバイザーのティック間隔(ミリ秒)です。
ROBINHOOD_CRYPTO_ENABLE_TRADINGトレーディングサーバーとデーモンで必須0どちらを起動する場合も、値を正確に 1 にする必要があります。これ以外の値ではトレーディングは有効になりません。
ROBINHOOD_CRYPTO_AUTONOMOUSいいえ01 にすると即時に実行され、confirm を無視します。支出上限は引き続き適用されます。
ROBINHOOD_CRYPTO_MAX_ORDER_USDいいえ1001注文あたりの絶対上限です。すべてのモードで適用されます。正の数を指定する必要があります。
ROBINHOOD_CRYPTO_MAX_DAILY_USDいいえ未設定(上限なし)プロセスごとの累積上限です。メモリー内で管理され、再起動時にリセットされます。
ROBINHOOD_CRYPTO_SYMBOL_ALLOWLISTいいえ未設定(すべてのペア)カンマ区切りのペアです。例:BTC-USD,ETH-USD。設定した場合、これらのペアのみ取引できます。
ROBINHOOD_CRYPTO_BUY_ONLYいいえ01 にすると、すべての売り注文を拒否します。

コピーして使える設定例は .env.example を参照してください。check_environment(dev モジュール内)は、秘密情報を出力せずに、これらの設定のうちどれが設定されているか、またそれぞれが現在どのように動作するかを報告します。risk_limits_export(risk モジュール内)は、適用されるすべての制限と、それを設定する変数を出力します。

v1 と v2

v2 では手数料ティアのデータが追加されていますが、そのまま置き換えられるものではありません。holdings、orders、注文発注の各エンドポイントでは account_number クエリパラメーターが必要です(ここでは自動的に解決されます)。estimated_price は /marketdata/ から /trading/ に移動し、v2 では v1 が partially_filled と報告する注文状態を pending と報告します。これらの理由により、どちらかのバージョン向けに書かれたコードは、もう一方のバージョンでは動作しない場合があります。デフォルトは v1 です。手数料データが必要な場合は v2 を設定してください。実行時の違いについては ops_api_version が説明します。


使用例

取引価格を確認してから発注する

ガードモードでは、注文ツールはまずプレビューを表示します。一般的なやり取りは次のとおりです。

  1. get_best_bid_ask に symbols: ["BTC-USD"] を指定して、現在の市場を確認します。
  2. get_trading_pairs に symbols: ["BTC-USD"] を指定して、数量の増分を確認します。小数点以下の桁数が多すぎる数量は拒否されるためです。
  3. risk_check_order を使って、注文を発注せずにすべての制御条件に照らしてテストします。許可するかどうかを示す単純な true または false を返し、拒否の原因となる制御条件を明示します。
  4. buy_limit に symbol: "BTC-USD"、limit_price: "60000.00"、quote_amount: "25.00" を指定します。confirm を指定しない場合、送信される正確なリクエストと価格見積もりを返し、発注は行いません。
  5. 同じ引数に confirm: true を加えて、もう一度 buy_limit を実行します。今度はリクエストが送信されます。
  6. 返された注文 ID を指定して get_order を実行し、約定を確認します。

特に重要なのは手順 3 です。複数注文の計画では、実際の資金を使って途中まで実行してしまうのではなく、事前に失敗を確認できます。

2 時間かけて積み立て、その後ポジションを保護する

一度にスプレッドを支払うのではなく、この時間枠で平均化できるように、エントリーを分割します。

  • algo_twap_start に symbol: "BTC-USD"、side: "buy"、total_quantity: "0.05"、slices: 12、duration_minutes: 120 を指定します。

ジョブ ID が返され、すぐに処理が戻ります。algo_list_jobs で進捗を追跡するか、algo_get_job でイベント履歴全体と発注済みのすべての注文を確認します。早めに停止するには algo_cancel_job を使います。これは以降の注文を停止するもので、すでに発注され、板に残っている注文はキャンセルされない点に注意してください。そうした注文は algo_get_job で ID を確認し、cancel_order でキャンセルできます。

約定したら、OCO の決済注文ペアでポジションを保護します。

  • algo_oco_start に symbol: "BTC-USD"、side: "sell"、quantity: "0.05"、take_profit_price: "72000.00"、stop_price: "58000.00" を指定します。

どちらも会話が終わった後も動作し続けるため、チャットを閉じた後も進行させたい場合は robinhood-mcp-daemon を実行してください。

すべて停止する

何かがおかしいようで、原因を調べるよりも停止したい場合は、次のようにします。

  • risk_kill_switch_engage に reason を指定します。これが返された時点ですべての注文が拒否され、実行中のすべてのジョブが一時停止します。また、サーバーとデーモンの両方を再起動しても停止状態は維持されます。
  • Robinhood で板に残っている注文は cancel_order でキャンセルします。キルスイッチではそれらの注文はキャンセルされません。
  • risk_status で全体の状態を確認し、原因が解消したら confirm: true を指定して risk_kill_switch_release を実行します。

ライブラリとしての使用

署名付きクライアントは MCP なしで動作します。

import { RobinhoodCryptoClient, loadCredentials } from 'robinhood-mcp';

const client = new RobinhoodCryptoClient(loadCredentials());
const quote = await client.get('/api/v1/crypto/marketdata/best_bid_ask/', {
  query: { symbol: ['BTC-USD'] },
});
console.log(quote);

レスポンスは Robinhood から送信されたとおりに返されます。フィールド名は意図的に変換していません。公開されているスキーマとコミュニティのクライアントでは、一部の項目に食い違いがあります。誤った変換はデータを気付かないうちに破損させますが、そのまま受け渡せば上流の形式が変わっても正しさを保てます。

認証と、注意すべき2つのこと

すべてのリクエストには x-api-key、x-timestamp、x-signature が含まれます。署名は、以下に対する分離型 Ed25519 署名です。

message = api_key + timestamp + path + method + body

区切り文字なしで連結します。重要な点は3つあります。

  • 秘密鍵は32バイトのシードです。 64バイトの展開済みキーペアでも、PKCS#8 でもありません。Ed25519 ライブラリの中には seed‖publicKey をエクスポートするものがあり、それを貼り付けると64バイトになって失敗します。このパッケージは名前からそのケースを検出します。
  • タイムスタンプは Unix 秒で、有効期限は30秒です。 Date.now() はミリ秒を返すため、そのまま使うとすべてのリクエストが失敗します。システムクロックを同期し、401 がキーの誤りに見えても、クロックのずれが原因かもしれない場合は ops_clock_skew を使用してください。
  • パスにはクエリー文字列と末尾のスラッシュが含まれます。 どちらも署名対象です。本文は一度だけシリアライズし、その正確なバイト列に署名して、同じバイト列を送信してください。再シリアライズするとキーの順序や空白が変わり、形式は正しくても署名が無効なリクエストになります。

署名が拒否された場合、dev モジュールの explain_signature で、署名対象の正確なバイト列を確認し、別の実装とバイト単位で比較できます。また、diagnose_connection は、401 のよくある原因を切り分けるためのすべてのチェックを実行します。

Robinhood が公開している適合性検証ベクトルには誤りがあります

ドキュメントには実行例が掲載され、署名と照合するよう案内されています。このベクトルは、実際のクライアントが送信する JSON 本文に対応していません。 Python の dict の repr に署名して生成されたもので、シングルクォート、コロンの後の空白、そして付属の表とは異なるキー順序が使われています。

{'client_order_id': '...', 'side': 'buy', 'symbol': 'BTC-USD', 'type': 'market', ...}

すべての正常に動作するクライアントや Robinhood 自身のサンプルコードが実行時に行うように、実際の JSON 本文に署名しても、公開されている署名は再現されません。このベクトルを適合性チェックに使うと、正しい実装を壊れた実装に「修正」してしまいます。

この2つの事実は tests/signer.test.ts に固定されており、この特異な挙動が記録に残ります。署名機能は、より確かな方法で検証されています。Robinhood はサンプルキーペアの公開鍵と秘密鍵の両方を公開しており、この実装は秘密鍵から公開鍵を正確に導出したうえで、独立した検証を通じて署名を往復させています。


このパッケージが対応しないこと

  • 株式とオプションには対応しません。 これは暗号資産 API です。agent.robinhood.com/mcp/trading にある Robinhood のエージェント型取引製品は、独自の OAuth フローを持つ株式専用の別インターフェースであり、ここではラップされていません。株式やオプションを追加する予定はありません。
  • 非公開 API のスクレイピングは行いません。 コミュニティ製サーバーの中には、ブラウザーセッションや認証不要の内部 API を使って Robinhood を操作するものがあります。このパッケージは、ドキュメント化された、署名付きのサポート対象 API のみを使用します。
  • サンドボックスはありません。そもそも存在しないためです。 切り替え可能なペーパーモードはなく、Robinhood の外部から追加することもできません。ROBINHOOD_CRYPTO_BASE_URL でホストを上書きできますが、接続先となるテスト用ホストはありません。上記のガードが代替手段であり、利用できるのはこれだけです。
  • 過去のローソク足データや板の厚みには対応しません。 Robinhood はそのどちらも公開していません。そのため、get_volatility は価格系列を取得するのではなく、提供された価格系列を使用し、estimate_slippage は提示スプレッドのみをモデル化します。これは実際のコストをシミュレーションするのではなく、その下限を示します。
  • 複数の取引所を横断したビューはありません。 コストベース、実現損益、ドローダウン、ジャーナルのパフォーマンスなど、すべての派生値は Robinhood の注文履歴だけから再構築されます。入金、出金、別の取引所からの振替、ステーキング報酬、エアドロップは反映されず、影響を受けるツールでは各自の説明にその旨が記載されています。
  • OpenAPI 仕様は同梱していません。 同梱版は気付かないうちに古くなるため、scripts/fetch-spec.mjs が最新の仕様を取得します。

開発

npm install
npm test          # unit and integration tests, no credentials or network
npm run typecheck
npm run build
npm run smoke     # launch both built servers over real stdio and list their tools
npm run test:live # hits the real API; requires credentials; read-only

npm test はネットワークに一切アクセスしません。戦略の計算、ポリシーの適用、調整処理は、実際の SQLite ストアをメモリ上で使用してテストし、差し替えるのはネットワーク境界だけです。npm run smoke は実際の MCP クライアントが行うハンドシェイクを実施するため、ユニットテストでは検出できない、古い dist/、誤った bin のシバン、登録時に例外を投げるモジュールを検出できます。ライブテストスイートはオプトイン方式で読み取り専用であり、注文は行いません。

設計の根拠、レイヤー構成、コードの追加場所については、こちらをご覧ください。

ライセンス

Apache-2.0。LICENSEをご覧ください。

スター履歴

スター履歴チャート

プロジェクトを支援する

robinhood-mcp が時間の節約に役立ったら、ぜひ GitHub でスターを付けてください。スターを通じて、ほかの開発者や AI エージェントが信頼できるリポジトリを見つけやすくなります。クリックひとつで支援できます。

使ってくれそうな人を知っていますか? X に投稿 · Bluesky で共有 · LinkedIn で共有 · Hacker News に投稿 · Reddit で共有

AI エージェントにも対応

コーディングエージェントや LLM ツールは、このリポジトリを直接読み取れます。AGENTS.md、llms.txt、llms-full.txtをご覧ください。エージェントに https://github.com/nirholas/robinhood-mcp を指定すれば、必要なコンテキストを取得できます。

同じ作者によるその他のプロジェクト

コントリビューター

コントリビューター

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。