mcpField
T
tollbooth-oauth2-collector

tollbooth-oauth2-collector

リモート
github.com/lonniev開発ツール0今日更新
リポジトリ

tollbooth-oauth2-collector について

Tollbooth サービス向けに、ブラウザーのコールバックで受け取った OAuth2 認可コードを元の MCP サーバーへ渡す、認証不要の FastMCP メールボックスです。コードは封印して短時間保存し、取得後に削除します。クライアント認証情報やトークンは扱いません。

主な機能

  1. 01OAuth2 認可コードの保存
  2. 02NIP-44 によるコードの封印
  3. 03600 秒の保存と一度限りの取得
  4. 04コレクターとサービスの状態確認

活用シーン

  1. 01ブラウザーの OAuth リダイレクトを MCP サーバーへ中継
  2. 02クライアント認証情報を保存せずに認可コードを受け渡し
  3. 03保留中のコードとサービスのビルド状態を確認

MCP 対応

`store_code`、`retrieve_code`、`collector_status`、`service_status` を MCP ツールとして公開します。OAuth フローを開始した MCP サーバーが、このサービスを通じて認可コードを保存・取得します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://tollbooth-oauth2-collector.fastmcp.app/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

4
パラメーター型必須説明
codestringはいOAuth プロバイダーから返された認可コード。
statestringはいパックされた state(``patron_npub.operator_npub``)。

詳細

Tollbooth OAuth2 Collector

License Python

認証を必要としない「単純なメールボックス」として機能し、元の MCP サーバーが取得できるよう OAuth2 認可コードを保持する FastMCP サーバーです。付属のサーバーレス関数(Val Town)が OAuth プロバイダーからのブラウザーリダイレクトを受け取り、コードをこのコレクターの store_code MCP ツールに渡します。この2つの部分からなる設計により、Horizon が /mcp/ パス上の POST トラフィックのみをプロキシする制約を回避できます。OAuth プロバイダーからのブラウザー GET リダイレクトは @mcp.custom_route エンドポイントに到達できないため、サーバーレスコールバックが間をつなぎます。

仕組み

┌───────────────┐   1. redirect_uri → serverless    ┌──────────────────────┐
│ OAuth Provider│ ─────────────────────────────────→│ Serverless callback  │
│ (e.g. Schwab) │   GET ?code=AUTH_CODE&state=STATE  │ (Val Town)           │
└───────────────┘                                    └──────────────────────┘
                                                               │
                                        2. POST store_code     │
                                           (JSON-RPC /mcp/)     ▼
                                                     ┌──────────────────────┐
                                                     │ OAuth2 Collector     │
                                                     │ store_code tool      │
                                                     │ → seals + Postgres   │
                                                     └──────────────────────┘
                                                               │
                                                               │ 3. code stored
                                                               ▼
┌──────────────┐   4. retrieve_code(state=PATRON)    ┌──────────────────────┐
│ MCP Server   │ ─────────────────────────────────→  │ OAuth2 Collector     │
│ (e.g.        │        (JSON-RPC /mcp/)             │ retrieve_code tool   │
│  schwab-mcp) │ ←───────────────────────────────── │ → returns code once  │
└──────────────┘   {"found": true, "code": ...}      │ → deletes from DB    │
                                                     └──────────────────────┘
  1. MCP サーバーが OAuth フローを開始し、redirect_uri にサーバーレスコールバック関数の URL を設定します。state は <patron npub>.<operator npub> です(SDK の pack_oauth_state)。
  2. ユーザーがブラウザーで認可すると、OAuth プロバイダーは ?code=...&state=... を付けてサーバーレスコールバックにリダイレクトします。
  3. サーバーレスコールバック(Val Town)が /mcp/ 経由でコードをコレクターの store_code MCP ツールに POST します。
  4. コレクターが NIP-44 でコードを operator npub 宛てに封印し(SDK の encrypt_collector_code)、patron npub に紐付けて Postgres に保存します(TTL は600秒)。
  5. MCP サーバーが retrieve_code(state=<patron npub>) MCP ツールを呼び出し、封印されたコードを取得します(1回限りの読み取り後、自動削除)。
  6. MCP サーバーが自身の nsec で封印を開き(decrypt_collector_code)、自身の認証情報を使ってコードをトークンと交換します。

コレクターは、無料の MCP ツールとして collector_status(保留中のコード数と TTL)および service_status(デプロイ済みビルド。git sha を含む)も公開します。サーバーレスコールバックのソースは val/oauth_callback.js にあります。

デプロイ

Horizon にデプロイします。

fastmcp deploy server.py

Horizon で NEON_DATABASE_URL 環境変数を設定し、Neon Postgres インスタンスを指定します。

DPYC Advocate Identity

このコレクターは DPYC Social Contract の Advocate として登録されています。利用する MCP サーバーは Oracle に問い合わせて URL を検出します。

from tollbooth.oracle_client import default_oracle_client

svc = await default_oracle_client().resolve_service(name="tollbooth-oauth2-collector")
collector_url = svc["url"]  # e.g., "https://tollbooth-oauth2-collector.fastmcp.app"

OAUTH_COLLECTOR_URL 環境変数を設定する必要はありません。ピアの検出はレジストリが処理します。

OAuth プロバイダーの開発者ポータルには、コレクターではなくサーバーレスコールバック関数の URL を登録してください。この関数は DPYC レジストリに tollbooth-oauth2-callback という名前で別途登録されており、SDK の begin_oauth はこの URL を redirect_uri として使用します。

callback = await default_oracle_client().resolve_service(name="tollbooth-oauth2-callback")
redirect_uri = callback["url"]  # e.g., "https://tollbooth-dpyc-oauth.val.run"

セキュリティモデル

  • 認可コードだけでは使えません — コードを交換するには client_id と client_secret が必要で、これらは利用する MCP サーバーだけが保持します。
  • 保存時に封印 — コードは state に含まれる operator npub 宛てに NIP-44 で封印されます(SDK の encrypt_collector_code)。封印を開けられるのはその operator の nsec だけで、state が鍵として使われることはありません。
  • 公開 state — state に含まれるのは2つの npub のみです。これらはブラウザー経由でルーティングしても安全な公開鍵です。operator npub を含まない state は拒否されます。
  • 1回限りの読み取り — 取得後、コードは直ちに削除されます(リプレイを防止)。
  • 短い TTL — 期限切れのコードは自動的にクリーンアップされます(600秒)。
  • シークレットを保存しません — コレクターがクライアント認証情報やトークンを参照することはありません。

関連リポジトリ

リポジトリ説明
tollbooth-dpycTollbooth の収益化向け Python SDK
dpyc-communityDPYC ソーシャルコントラクトのレジストリとガバナンス
dpyc-oracle無料のコミュニティコンシェルジュ — メンバーシップ、ガバナンス、オンボーディング
tollbooth-authority認証局 MCP サービス
tollbooth-sampleオペレーター実装のリファレンス/テンプレート
tollbooth-pricing-studioオペレーター向け iOS 料金設定エディター
cypher-mcp収益化されたグラフ回答 — Neo4j/AuraDB 上の名前付き Cypher
schwab-mcpSchwab 証券 MCP サーバー
thebrain-mcp個人向けブレイン・ナレッジグラフ MCP サーバー
excalibur-mcpX (Twitter) 投稿用 MCP サーバー
taxsort-mcp税務書類の仕分けと分類を行う MCP サーバー
optionality-mcpオプション分析 MCP サーバー
goodearth-mcp地域限定の農場気候分析 MCP サーバー
beesknees-mcpThe Bee's Knees マルチプレイヤーレース MCP サーバー
roastify-mcpRoastify のコーヒーカタログとパッケージアートワーク用 MCP サーバー
ChartRemotely-mcpデスクトップチャート中継 MCP サーバー
tollbooth-webオペレーターのフロントエンド向け共有ブラウザー SDK
tollbooth-oauth2-collectorOAuth2 コールバックコレクター(Advocate)
tollbooth-shortlinksURL 短縮ユーティリティ(Advocate)

ライセンス

Copyright 2026 Lonnie VanZandt. Apache License, Version 2.0 の下でライセンスされています。

コメント

MCP は初めてですか?

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

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