schwab-mcp について
schwab-mcp は、FastMCP を通じて Charles Schwab の口座・市場データを AI エージェントに提供するマルチテナント MCP サーバーです。口座やオプションの読み取り専用データを扱い、Bitcoin Lightning による従量課金を採用しています。
主な機能
- 01保有資産、残高、口座価値の取得
- 02リアルタイム相場と値上がり・値下がり銘柄の取得
- 03Greeks を含むオプションチェーンの絞り込み
- 04注文、取引、価格履歴の確認
- 05Lightning の前払い残高と呼び出しごとの課金
活用シーン
- 01保有資産と日次損益の確認
- 02戦略ルールに基づく新規取引の評価
- 03既存ポートフォリオに沿ったオプション候補の検索
- 04報告用の口座取引情報の取得
MCP 対応
MCP サーバーとして、Streamable HTTP 経由で Charles Schwab の口座データ取得ツールをクライアントに公開します。証券ツールは読み取り専用で、Tollbooth DPYC の Lightning 残高から課金されます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://schwab-mcp.fastmcp.app/mcpclaude mcp add --transport http lonniev-schwab https://schwab-mcp.fastmcp.app/mcp{"mcpServers":{"lonniev-schwab":{"type":"http","url":"https://schwab-mcp.fastmcp.app/mcp"}}}Cursor で開く{"servers":{"lonniev-schwab":{"type":"http","url":"https://schwab-mcp.fastmcp.app/mcp"}}}VS Code で開く{"mcpServers":{"lonniev-schwab":{"type":"http","url":"https://schwab-mcp.fastmcp.app/mcp"}}}{"mcpServers":{"lonniev-schwab":{"serverUrl":"https://schwab-mcp.fastmcp.app/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
65| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| npub | string | はい | 残高を確認する Nostr 公開鍵(npub1...)。 |
| dpop_token | string | はい | 呼び出し元が npub を保持していることを証明するもの:receive_npub_proof からの許可エンベロープ、または npub で署名された kind-27235 Nostr イベントの生 JSON(`u` タグがこのツール名になっているもの)。 |
詳細
schwab-mcp

証券口座のデータを、会話形式で。 AI アシスタントに保有ポジションについて尋ねたり、オプションスプレッドをスクリーニングしたり、今日の取引を戦略ルールに照らして監査したり、終業時のレポートを取得したりできます。すべて自然言語で利用できます。データ料金は、1 セッションあたり約 6 sats(約 0.005 ドル)です。
これが存在する理由
schwab-mcp のデータは、ThinkOrSwim、OptionAlpha、Schwab 独自のウェブ UI で入手できるものばかりです。そうしたツールでは得られないのが、次の情報を組み合わせたパーソナルなトレーディングアシスタントです。
- ライブの保有ポジションと口座残高
- Greeks、IV、OTM% を含むリアルタイムのオプションチェーン
- 取引戦略のルール(クレジットの最低額、RWR の目標、セクター集中度の上限)
- 市場の状況(決算カレンダー、VIX 水準、セクターローテーション)
- 上記すべてをひとつの会話で
*「今日の新しい取引をどう評価しますか?」と尋ねれば、基準に照らした体系的な監査結果が得られます。「私の戦略に沿い、現在のポートフォリオとのバランスも取れた SPS の候補を 3 つ教えてください」*と尋ねれば、実際の保有ポジションに基づいた、セクター、決算、IV を考慮した提案が得られます。一般論にとどまりません。
情報を統合するのは AI です。schwab-mcp はデータを橋渡しします。支払いは Bitcoin Lightning の sats による都度払いで、サブスクリプションも KYC もベンダーロックインもありません。朝のレポート、夕方のレポート、追加分析を含む 1 日分の利用料金は約 6 sats(0.01 ドル未満)です。
FastMCP を介して、MCP で Charles Schwab の証券データを AI エージェントに公開するマルチテナントサーバーです。Tollbooth DPYC™ の Lightning マイクロペイメントで収益化します。api.schwabapi.com への httpx による直接の非同期呼び出しを使用し、Streamable HTTP でサービスを提供します。
Don't Pester Your Customer™(DPYC™)— 起業家精神あふれる Bitcoin 支持者のための API 収益化
Norton Juster 作、Jules Feiffer 挿絵の The Phantom Tollbooth(1961 年)に着想を得ています。
DPYC™ エコノミー
DPYC™ は Don't Pester Your Customer の略です。これは、セッション途中の支払いポップアップ、サブスクリプションへの登録を促す画面、KYC の煩わしさをなくす、API 収益化の理念およびプロトコルです。
仕組み
-
事前チャージ残高 -- ユーザーはツールを使う前に、Bitcoin Lightning 経由でクレジット(api_sats)を購入します。ツールの呼び出しごとに、残高から通知なく差し引かれます。中断も、「アップグレードしてください」というモーダルもありません。クレジットの有効期限は、運営者の料金モデルで設定された
tranche_lifetimeの期間後です。 -
Nostr キーペアによるアイデンティティ -- ユーザーはメールアドレスやパスワードではなく、Nostr の公開鍵(
npub)で識別されます。役割ごとにキーペアを 1 つ使用し、ユーザー自身が管理します。アカウント作成フォームはありません。 -
接続上のアイデンティティ -- 有料ツールの呼び出しでは、毎回パトロンの
npubを指定し、接続によってそれを証明します。nsec を保持するクライアントは、各リクエストに署名します(NIP-98)。鍵を持たないクライアントは OAuth で接続し、request_npub_proof/receive_npub_proofを通じて一度だけ npub を証明します。これは、パトロンが Nostr クライアントで承認する人間が関与する Secure Courier のやり取りです。その後、接続は、パトロンが選択した期間にわたって、MCP の再起動後も npub を保持します。 -
UUID をキーとするツールのアイデンティティ -- 各ツールは、機能名から導出された決定的な UUID v5 を持つ
ToolIdentityオブジェクトです。料金の目安はcategoryフィールドに基づきます。カテゴリ 料金の目安 用途 free0 sats 残高確認、ステータス read1 sat 簡単な検索 write5 sats 複数ステップの操作 heavy10 sats 高負荷なクエリ 実際の価格(api_sats)は、Neon における運営者の料金モデルによって動的に設定されます。
-
失敗時のロールバック -- 差し引き後に下流の API が失敗した場合、補償トランシェによってクレジットは自動的にロールバックされます。ユーザーが失敗した呼び出しに対して支払うことはありません。
-
ソーシャルコントラクト -- DPYC™ エコシステムは、参加が任意のコミュニティです。
- 市民 -- API サービスを利用するユーザー
- 運営者 -- MCP サービス(このサービスのようなもの)を実行する開発者
- 認証機関 -- 運営者を認定し、購入に対して少額の税を徴収します
- 初代キュレーター -- チェーンの起点であり、初期の cert-sat 供給を発行します
ツール
ブローカレッジ(有料 -- クレジットによる利用制限あり)
すべての有料ツールはパトロンの npub を受け取り、接続によってそれを証明します。
| ツール | ティア | 説明 |
|---|---|---|
get_brokerage_positions | write | 自動オプションスプレッド検出(ブル・プット/ベア・コール)機能付きのポートフォリオ保有状況 |
get_brokerage_balances | write | 現金、購買余力、純清算価値、当日損益 |
get_stock_quote | write | 1 つ以上の銘柄のリアルタイム相場 |
get_market_movers | write | 市場指数($SPX、$DJI、$COMPX)の値上がり・値下がり上位銘柄 |
get_market_hours | write | 株式、オプション、債券、先物、外国為替市場の取引時間 |
search_instruments | write | ティッカー、名称、または CUSIP による金融商品検索 |
get_option_chain | heavy | Greeks、IV、OTM%、OI 閾値で絞り込んだオプションチェーン |
get_price_history | heavy | 過去の OHLCV ローソク足データ |
get_brokerage_orders | heavy | 複数レッグのスプレッドに対応した注文履歴(デフォルトは 30 日間) |
get_brokerage_order | heavy | ID による単一注文の詳細 |
get_brokerage_transactions | heavy | 取引履歴 -- 売買、配当、現金の移動(デフォルトは 30 日間) |
get_brokerage_transaction | heavy | ID による単一取引の詳細 |
無料
| ツール | 説明 |
|---|---|
session_status | オペレーターのライフサイクル状態と準備状況を確認します |
service_status | このサービスの健全性と設定を確認します |
begin_oauth | OAuth2 フローを開始します -- Schwab の認証 URL を返します |
check_oauth_status | OAuth フローが完了し、セッションが有効になったかをポーリングします |
get_account_numbers | リンクされた Schwab の口座番号とハッシュを一覧表示します |
request_credential_channel | Nostr DM 経由で認証情報を受け取るための Secure Courier チャネルを開きます |
receive_credentials | 暗号化された保管庫から認証情報を受け取ります |
forget_credentials | 再配信に備えて保管庫の認証情報を削除します |
update_patron_credential | パトロンの認証情報フィールドを 1 つ追加または更新します |
delete_patron_credential | パトロンの認証情報フィールドを 1 つ削除します |
get_patron_credential_fields | 保存済みのパトロン認証情報フィールド名を一覧表示します |
check_balance | クレジット残高と使用状況を確認します |
check_price | ツールを呼び出す前に料金を確認します |
purchase_credits | クレジット購入用の Lightning 請求書を作成します |
check_payment | Lightning 決済を検証し、残高にクレジットを加算します |
restore_credits | 以前に支払った請求書からクレジットを復元します |
account_statement | 口座明細の概要を表示します |
account_statement_infographic | 口座の SVG インフォグラフィックを表示します(1 sat) |
check_authority_balance | Authority におけるオペレーターの cert-sat 残高を確認します |
get_pricing_model | 現在有効な料金モデルを表示します |
list_constraint_types | 利用可能な制約タイプとスキーマを一覧表示します |
request_npub_proof | Nostr DM 経由で npub の所有証明をリクエストし、その nonce を返します |
receive_npub_proof | 返信をこの接続に取り込み、この接続で npub を保持します |
get_operator_onboarding_status | オペレーター設定の準備状況を報告します |
get_patron_onboarding_status | パトロン認証情報の準備状況を報告します |
list_notarizations | 最近の Bitcoin 公証記録を一覧表示します |
get_notarization_proof | パトロン残高の Merkle 包含証明を生成します |
すべての証券会社ツールは読み取り専用です。注文は行われません。
アーキテクチャ
- マルチテナント:オペレーターは Secure Courier を介して
btcpay_host+btcpay_api_key+btcpay_store_id+app_key+secretを提供します(service="schwab-operator")。各パトロンは OAuth2 ブラウザーフローで認証します。セッションは npub をキーとして管理されます。Schwab の認証情報を環境変数に保存することはありません - Direct httpx:ベアラー認証と先行的なトークン更新を備えた薄い
SchwabClientラッパーです(サードパーティ製 Schwab SDK は使用しません) - Tollbooth DPYC™:事前入金式の Lightning 残高、Authority 認定の購入オーダー、台帳の永続化に使用する NeonVault(Postgres)
- レジストリによる検出:OAuth2 コレクター URL は実行時に DPYC™ レジストリから解決されます(
OAUTH_COLLECTOR_URL環境変数は不要です) - 認証情報の検証:オペレーターの認証情報は受信時に検証され、保管する前に
btcpay_host、app_key、secretがすべて揃っている必要があります - 接続に紐づく ID:npub の鍵で署名されたリクエスト(NIP-98)、または Secure Courier DM を 1 回送信した後に npub を保持する OAuth 接続のいずれかです。再起動後も維持され、期間はパトロンが選択します。制限付きツール(オペレーター専用)を使うには、同じ方法でオペレーターの npub を証明する必要があります。
はじめに
このガイドでは、Nostr ID の生成から最初の証券データ呼び出しまで、Tollbooth のオンボーディング手順全体を説明します。オペレーター(schwab-mcp をデプロイする人)と、Claude.ai または別の MCP クライアントを通じて利用するパトロンの両方が対象です。
1. Nostr ID(npub)を取得する
DPYC™ エコシステムの参加者は全員、Nostr キーペアで識別されます。メールアドレスもパスワードも不要で、ベンダーロックインもありません。
npub とは? Nostr プロトコルの公開鍵を bech32 文字列でエンコードしたもので、npub1... で始まります。対応する秘密鍵(nsec1...)はデバイス上に保持されます。npub は共有しても安全です。システムはこれによってユーザーを識別します。
生成方法:
- Oxcart をインストールします(DPYC™ ワークフローで推奨される Nostr クライアントです。ほかのクライアントはテストされていません)
- アカウントを作成します。アプリがキーペアを自動生成します
- アプリのプロフィール/設定画面で npub を確認します(
npub1...で始まります)
または、nak などの CLI キージェネレーターを使用します:nak key generate
オペレーターは、個人用の Nostr アカウントとは別に、サービス ID 用の npub を用意してください。
2. DPYC™ シチズンとして登録する
クレジットの購入やサービスの運用を始める前に、DPYC™ コミュニティに npub を登録してください。
- Claude.ai で(DPYC Oracle に接続した状態で)、
how_to_join()を呼び出し、シチズンシップについて確認します - Oracle の指示に従って npub を登録します
シチズンシップは無料で、Tollbooth ネットワーク全体で利用できるポータブルな ID を取得できます。
3. オペレーター向け — BTCPay ストアをセットアップする
オペレーターは BTCPay Server を介して、パトロンから Lightning 決済を受け取ります。必要なものは次のとおりです。
- BTCPay Server インスタンス(セルフホストまたは Authority によるホスティング)
- 請求書の作成権限を持つ Store ID と API Key
これらの認証情報は環境変数には設定せず、Secure Courier を介して受け取ります(手順 6 を参照)。
4. オペレーター向け — Tollbooth Authority に登録する
DPYC™ の信頼チェーンでは、すべてのオペレーターが Authority のスポンサーを受けます。Authority は購入注文を認証し、少額の手数料(デフォルトは 2%)を徴収します。
- 自分自身の Schwab MCP で、
request_adoption(authority_npub=<your Authority's npub>, service_url=<your MCP endpoint>)を呼び出し、オペレーターの nsec でリクエストに署名します(NIP-98。Pricing Studio が代行します) - Authority の所有者がリクエストを承認すると(
approve_operator_request)、台帳エントリーが作成され、Neon データベースがプロビジョニングされます - 完了すると、MCP 上の
adoption_status(authority_npub=...)がprovisionedを返します
5. オペレーター向け — 認証残高に入金する
サービスからパトロンにクレジットを発行する前に、認証用 sat が必要です。
- Authority で
authority_purchase_credits(amount_sats=1000)を呼び出します。Lightning 請求書が返されます - 任意の Lightning ウォレットで請求書を支払います
authority_check_payment(invoice_id="...")を呼び出します。決済が確認され、残高に入金されます
パトロンがサービスからクレジットを購入すると、認証用 sat の残高は自動的に消費されます。
6. オペレーター向け — 認証情報を届ける(Secure Courier)
オペレーターは Schwab Developer アプリを登録し、BTCPay と Schwab API の両方の認証情報を Secure Courier 経由で届ける必要があります。認証情報がチャットに表示されることはありません。
Schwab Developer アプリでは、ベンダー側のフィールド名として app_key と secret を使用します(これらは内部的に OAuth の client_id と client_secret に対応します)。Schwab に登録する redirect_uri に /callback の接尾辞を付けないでください。レジストリに表示されているベースコレクター URL をそのまま使用してください。
Secure Courier は人間が介在するやり取りです。オペレーターは自身の Nostr クライアントで意識的に返信します。受信後、リレーは破棄的に消去されます。メッセージは消費され、通信上に残りません。
request_credential_channel(service="schwab-operator", sender_npub=<operator_npub>)を呼び出します。nonceが返され、Nostr クライアント(Oxcart)にウェルカム DM が届きます- Oxcart で、DM に次の内容を返信します:
{ "btcpay_host": "https://btcpay.example.com", "btcpay_api_key": "YOUR_API_KEY", "btcpay_store_id": "YOUR_STORE_ID", "app_key": "YOUR_SCHWAB_APP_KEY", "secret": "YOUR_SCHWAB_SECRET" } receive_credentials(sender_npub=<operator_npub>, service="schwab-operator", nonce=<that nonce>)を呼び出します。認証情報(btcpay_host、app_key、secretがすべて存在すること)が検証され、保管庫に保存されます
これはデプロイごとに一度だけ行うセットアップです。オペレーターの認証情報は暗号化されて NeonVault に保存され、サーバーの再起動後も保持されます。
7. 利用者向け — クレジットを購入する(api_sats)
利用者はあらかじめサトシ残高に入金し、都度の支払いによる中断なしに、残高を使って証券取引ツールを利用できます。これは「顧客に煩わしいことをしない」™ という理念を実践するものです。クレジットは api_sats 単位で計算され、オペレーターが設定した tranche_lifetime の経過後に失効します。
purchase_credits(amount_sats=500)を呼び出します。チェックアウトリンク付きの Lightning 請求書が返されます- 任意の Lightning ウォレット(Phoenix、Breez、Zeus など)で請求書を支払います
check_payment(invoice_id="...")を呼び出し、支払いが確定して残高にクレジットが反映されたことを確認します
有料ツールを呼び出すたびに残高が減少します。いつでも purchase_credits を再度呼び出してチャージできます。check_balance を使えば、いつでも無料で残高を確認できます。check_price を使えば、任意のツールの料金を無料で確認できます。
8. 利用者向け — Schwab アカウントを接続する
schwab-mcp が Schwab アカウントを読み取れるよう、認証する必要があります。
begin_oauth(npub=<your_npub>)を呼び出して認証 URL を取得します- ブラウザーで URL を開き、Schwab にログインします
check_oauth_status(npub=<your_npub>)を呼び出して、セッションが有効になったことを確認しますget_account_numbers(npub=<your_npub>)を呼び出して、アカウントとハッシュの一覧を取得しますupdate_patron_credential(npub=<your_npub>, field="account_hash", value=<hash>)を呼び出して、優先するアカウントを設定します
9. 会話で Schwab ツールを使う
セッションが有効になったら、AI エージェントに自然な言葉で依頼できます:
- 「自分の保有ポジションを表示して」 —
get_brokerage_positionsを呼び出します - 「口座残高はいくら?」 —
get_brokerage_balancesを呼び出します - 「AAPL と MSFT の株価を教えて」 —
get_stock_quoteを呼び出します - 「今日の値上がり率上位は?」 —
get_market_moversを呼び出します - 「明日は市場が開いている?」 —
get_market_hoursを呼び出します - 「Berkshire Hathaway のティッカーを調べて」 —
search_instrumentsを呼び出します - 「来月の GLD のオプションチェーンを表示して」 —
get_option_chainを呼び出します - 「最近の注文を表示して」 —
get_brokerage_ordersを呼び出します - 「過去 1 週間の取引履歴を表示して」 —
get_brokerage_transactionsを呼び出します
無料のツールはいつでも利用できます:
- 「schwab-mcp の残高はいくら?」 —
check_balanceを呼び出します - 「口座明細を表示して」 —
account_statementを呼び出します
セキュリティ
- npub アイデンティティ -- すべてのセッションは Nostr 公開鍵をキーとして使用します。メールアドレス、ユーザー名、パスワードは不要です。
- 接続上のアイデンティティ -- ツールに証明引数はありません。nsec を保持するクライアントは、各 HTTP リクエストに署名します(NIP-98、kind 27235)。OAuth クライアントは
request_npub_proof/receive_npub_proofを使って、接続に npub を一度だけ提示します。パトロンは Nostr クライアントでこれを承認し、期間を選択します(最長 30 日)。 - Secure Courier -- 認証情報は、NIP-44 で暗号化された Nostr DM を通じて交換されます。受信後、リレーからメッセージは破棄されます。メッセージは通信経路上に残りません。
- NeonVault -- 認証情報(
token_json)と台帳の状態は、オペレーターごとの行分離を適用した Postgres に保存されます。環境変数やチャット履歴にシークレットは保存されません。 - オペレーター認証情報の分離 -- BTCPay と Schwab の API 認証情報(
app_key、secret)は、service="schwab-operator"を指定して Secure Courier 経由で送信され、受信時に検証されます。ログやレスポンスに公開されることはありません。
トラブルシューティング
コールドスタート/最初のツール呼び出しが失敗する場合: Horizon ランタイムは最初のリクエスト時にコールドスタートすることがあります。ツール呼び出しをその場でもう一度試してください。数秒以内にサーバーが起動し、2 回目の呼び出しは成功します。
「proof is required」: request_npub_proof を呼び出し、DM に返信してから、receive_npub_proof(patron_npub, nonce) を一度呼び出します。これで接続が npub を保持するようになり、以降の呼び出しでは npub のみを渡します。期間はパトロンが選択します。証明は MCP の再起動後も有効です。
「Insufficient credit balance」: purchase_credits を呼び出して残高を追加してください。check_balance を使うと、現在の api_sats 残高と tranche_lifetime の有効期限を確認できます。
「Operator credentials not configured」: これはオペレーター側の設定の問題であり、パトロン側の問題ではありません。オペレーターは Secure Courier の手順(ステップ 6)を完了して、app_key と secret を送信する必要があります。
認証情報のライフサイクル状態: 認証情報は pending(チャネルを開設済み) -> delivered(人間が DM を送信済み) -> vaulted(取得して検証済み)の順に状態が変わります。receive_credentials が成功ではなくライフサイクル状態を返しても、エラーではありません。フローの現在の段階を示しています。レスポンス内のガイダンスに従ってください。
OAuth トークンがボールトに保存される場合: OAuth2 フローが成功すると、token_json が NeonVault に永続化されます。wheel の restore_oauth_session によって、セッションはサーバーの再起動後も維持されます。この処理では有効期限を検出し、プロバイダー経由でトークンを更新して、ローテーション後のペアをボールトに保存し直します。リフレッシュトークン自体の有効期限が切れた場合(Schwab:7 日間)、パトロンは begin_oauth を再実行する必要があります。
DPYC™ コミュニティリソース
| リソース | 説明 |
|---|---|
| tollbooth-dpyc | オペレーター SDK -- vault、認証、料金設定、Lightning、Nostr アイデンティティのための Python ライブラリ |
| dpyc-community | ガバナンスレジストリ -- メンバーシップ、勧告、脅威モデル、信条、商標 |
| dpyc-oracle | コミュニティコンシェルジュ -- 無料のオンボーディングとメンバー検索 |
| tollbooth-authority | 認証基盤 -- Schnorr 署名付き証明書と手数料の徴収 |
| tollbooth-sample | サンプルオペレーター -- 新しい MCP サービス向けの標準テンプレート |
| tollbooth-pricing-studio | iOS 用料金モデルエディターおよびオペレーターコンソール |
| cypher-mcp | 有料のグラフ検索結果 -- Neo4j/AuraDB 上の名前付き Cypher テンプレート |
| schwab-mcp | Charles Schwab の証券口座データ |
| thebrain-mcp | TheBrain の個人用ナレッジグラフ |
| excalibur-mcp | Secure Courier を利用した X(Twitter)投稿サービス |
| taxsort-mcp | Cloudflare Pages の UI を備えた税分類 |
| optionality-mcp | オプション分析(証券口座データのオペレーター) |
| tollbooth-oauth2-collector | OAuth2 コールバックハンドラー(アドボケイトサービス) |
| tollbooth-shortlinks | URL 短縮ユーティリティ |
| goodearth-mcp | 小規模な特産作物農場向けの気候分析 |
| beesknees-mcp | The Bee's Knees -- 有料のマルチプレイヤーレースゲーム |
| roastify-mcp | Roastify のコーヒーカタログとパッケージアート |
| ChartRemotely-mcp | 音声またはツール呼び出しで、デスクトップのチャートに証券を表示します |
| tollbooth-web | DPYC™ オペレーターのフロントエンド向け共有ブラウザー SDK |
| DPYC Whitepaper | Tollbooth アーキテクチャの技術ホワイトペーパー |
| The Phantom Tollbooth on the Lightning Turnpike | Tollbooth DPYC™ の物語形式の紹介 |
デプロイ
schwab-mcp は Horizon 上で動作します。任意の MCP クライアント(Claude.ai、Claude Desktop、Cursor、独自のエージェント)から接続できます。
https://schwab-mcp.fastmcp.app/mcp
パトロンのアイデンティティは接続に含まれます(NIP-98 署名付きリクエスト、または request_npub_proof / receive_npub_proof の後に npub を保持する OAuth 接続)。Schwab 口座は begin_oauth / check_oauth_status を使って別途リンクします。セッションは npub をキーとして管理されます。
オペレーター環境変数
必須
| 変数 | 説明 |
|---|---|
TOLLBOOTH_NOSTR_OPERATOR_NSEC | オペレーターの Nostr 秘密鍵 -- アイデンティティ、Secure Courier の DM、監査署名に使用する単一のブートストラップキー |
起動に必要な環境変数はこれだけです。認証済みオペレーターは、暗号化された Nostr DM を介して Authority から Neon データベース URL を取得します。NEON_DATABASE_URL は環境変数から読み込まれません。リレーのセットは共有の dpyc-community レジストリから取得し、トランシェの有効期間はオペレーターの料金モデルから取得するため、どちらも環境変数ではありません。
任意の調整項目
| 変数 | 説明 |
|---|---|
SCHWAB_TRADER_API | API のベース URL(デフォルトは https://api.schwabapi.com) |
Secure Courier 経由の認証情報(環境変数は使用しません)
BTCPay の認証情報(btcpay_host、btcpay_api_key、btcpay_store_id)と Schwab API の認証情報(app_key、secret)は、Secure Courier(service="schwab-operator")経由でのみ配信され、受信時に検証されたうえで暗号化された保管庫に保存されます。環境変数やチャットにシークレットを含めないでください。
開発
前提条件
- Python 3.12+
- API 認証情報を取得済みの Schwab Developer アプリ
- Secure Courier で認証情報を配信するための Oxcart Nostr クライアント
インストールとテスト
uv sync # or: pip install -e ".[dev]"
uv run pytest tests/ -v
プロジェクト構成
schwab-mcp/
server.py # FastMCP server, OperatorRuntime, credit gating, domain tool endpoints
schwab_client.py # Thin async httpx client — bearer auth + token refresh
vault.py # Per-user session management (in-memory cache)
oauth_flow.py # OAuth2 authorization code flow (state tokens, exchange, callback)
settings.py # pydantic-settings (env vars, .env file)
models.py # Pydantic response models
tools/
account.py # Positions, balances, orders, transactions (spread detection)
market.py # Quotes, price history, market movers, market hours, instrument search
options.py # Option chain retrieval + filtering
tests/
test_schwab_client.py # httpx client, token refresh, URL building
test_server.py # Singletons, credit gating, Secure Courier callback
test_vault.py # Session management
test_account.py # Position, balance, order, transaction parsing
test_market.py # Quote + price history formatting
test_oauth_flow.py # OAuth2 state tokens and code exchange
test_options.py # Option chain filtering
先行技術と帰属表示
このリポジトリに含まれる手法、アルゴリズム、および実装は、Lonnie VanZandt による独自の成果であり、2026 年 4 月に初めて公開されたものとみなされる場合があります。この公開により、米国特許法(35 U.S.C. 102)に基づく先行技術が確立されます。
すべての使用、複製、または二次的著作物は、このリポジトリに含まれる Apache License 2.0 に準拠し、NOTICE ファイルに従って原著作者を適切に表示する必要があります。
帰属表示の方法
この成果を使用または基にして開発する場合は、ドキュメントまたはソースに以下を記載してください。
Lonnie VanZandt および Claude.ai による独自の成果に基づいています
初公開:2026 年 4 月
ソース:https://github.com/lonniev/schwab-mcp
Apache License 2.0 に基づきライセンスされています
Bitcoin の支持者やコーヒー愛好家が集う、技術者のバーチャルカフェはこちらです:stablecoin.myshopify.com。
特許に関する通知
著者は、ここに記載された新規の手法およびシステムについて、特許保護を求めるすべての権利を留保します。本成果の公開により、2026 年 4 月の優先日が確立されます。America Invents Act に基づき、著者は初回公開日から 1 年間の猶予期間内に特許出願を行う権利を有します。
出願を検討している方への注意: この公開リポジトリと完全な Git 履歴は、先行技術の証拠となります。このリポジトリの公開後に出願され、実質的に類似する手法を対象とする特許申請は、35 U.S.C. 102(a) に基づき無効とされる可能性があります。
さらに読む
The Phantom Tollbooth on the Lightning Turnpike -- AI API の収益化をさらに収益化し、その後は背景に退いていく方法を綴った全編です。
商標
DPYC™、Tollbooth DPYC™、および Don't Pester Your Customer™ は Lonnie VanZandt の商標です。使用ガイドラインについては、dpyc-community リポジトリの TRADEMARKS.md を参照してください。
ライセンス
Apache License 2.0 -- 詳細については LICENSE と NOTICE を参照してください。
結局のところ、料金所は決して目的地ではありませんでした。いつだって、旅の始まりにすぎなかったのです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。