Implementing OAuth for Streamable HTTP Server & Client without PKCE について
開発者向けに、GitHub Device Flow OAuthを使うStreamable HTTP MCPサーバーとヘッドレスクライアントを実装した例です。PKCEを使わない認可フローを確認できます。
主な機能
- 01Streamable HTTPサーバー
- 02GitHub Device Flow OAuth
- 03ヘッドレスOAuthクライアント
- 04セッションとトークンの処理
活用シーン
- 01MCPサーバーのデバイスフロー認可のテスト
- 02ヘッドレスクライアントのOAuth接続の検証
MCP 対応
Streamable HTTP MCPサーバーと、Device Flow OAuthで接続するヘッドレスクライアントを含みます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
PKCE を使用しない Streamable HTTP サーバーとクライアントの OAuth 実装
概要
このリポジトリでは、次のものを提供します。
- OAuth(デバイスフロー経由)に対応した Streamable HTTP サーバー
- OAuth に対応した Streamable HTTP クライアント(ヘッドレスモード)
OAuth のサポート
これを書いている時点では、MCP Inspector を使用して、OAuth 対応の Streamable HTTP サーバーをテストできませんでした。そのため、デバイスフローを通じて OAuth を実装することにしました。
一般的なブラウザーベースのフロー(たとえば MCP Inspector を使用する場合)では、次のようになります。
- MCP クライアントが MCP サーバーへの接続を要求します。
- サーバーは GitHub AuthProvider を通じてクライアントを認可します(GitHub にリダイレクトします)。ユーザーがスコープを認可すると、サーバーのコールバックハンドラーが次の処理を行います。 a. GitHub からアクセストークンを取得し、続いてユーザーデータを取得します。 b. アクセストークンと新しいセッショントークンをトークンストアに保存します。 c. クライアント用の一時的な認証コードを生成し、新しく生成したセッショントークンとともに保存します。 d. 一時的な認証コードを付けてクライアントにリダイレクトします。
- クライアントは一時的な認証コードをセッショントークンと交換し、そのトークンを以降のリクエストに使用します。
このブラウザーフローベースの OAuth を、デバイスフローベースの OAuth に置き換えたいと考えました。次のように動作します。
デバイスフローベースの OAuth では、次の理由から PKCE は不要です。
- リダイレクトも、クライアント側でのコード処理もありません。
- デバイスコードフローは本質的により安全です。理由は次のとおりです。
- ユーザーは URL を開き、GitHub のページで直接コードを入力します。
- すべてのトークン交換はサーバー間で行われます。
- デバイスコード自体の有効期間は短く、リクエストしたクライアント(この場合はサーバー)だけが使用できます。
- サーバーからクライアントに渡されるのはユーザーコードのみです。
ただし、セッションストレージにブラウザーを使用できません。MCP の OAuthServerProvider が現在要求しているメソッド(例:exchangeAuthorizationCode や challengeForAuthorizationCode)を、引き続き実装する必要がある場合があります。
使用方法
- このリポジトリをクローンし、依存関係をインストールします。
npm install
-
GitHub の開発者設定(Settings 内)に移動し、OAuth アプリを作成します。必要な場合は、コールバック URL に「http://localhost」を入力します。「Enable Device Flow」が選択されていることを確認してください。Client ID と Client Secret を控えておきます。
-
ローカルの開発環境で、GITHUB_CLIENT_ID と GITHUB_CLIENT_SECRET の環境変数を設定します。
-
MCP サーバーを起動します。
npx tsx server/index_streamable.ts
- 別のターミナルで MCP クライアントを起動します。
npx tsx client/client.ts
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。