MCPコネクタのためのOpenID設定の修正

今週、リモートのMCPコネクタの修正に、あまりにも多くの時間を費やしてしまった。

コネクタが私のOAuthサーバーを見つけられず、エラーが繰り返された。サーバーは正常に動作していた。問題は、たった一つのルートの欠落とリダイレクトだった。

MCPでOAuthを使用する場合、ディスカバリ・ドキュメントが機能することを期待する。ほとんどのツールは、以下の2つのパスを探す:

  • /.well-known/oauth-authorization-server
  • /.well-known/oauth-protected-resource

これらは、クライアントに対して認可エンドポイントとトークンエンドポイントがどこにあるかを伝えるものである。

問題は、多くのクライアントがそれらの特定のパスを探さないことだ。代わりに、/.well-known/openid-configuration を探す。

これはOpenID Connectのパスである。異なる仕様ではあるが、同じ場所に存在する。私のパッケージはOAuthの仕様に従っており、OIDCの仕様に従っていないため、このパスを登録していなかった。

クライアントは存在しないドアを叩く。そして404エラーを受け取り、終了してしまう。

私には2つの選択肢があった:

  1. Nginxでリバースプロキシのリダイレクトを使用する。これは安易な修正だ。ロジックがコードからインフラへと移ってしまう。テストが難しく、デプロイ中に壊れやすい。

  2. アプリケーション内で修正する。こちらの方が優れた方法だ。

私はアプリがその要求に応答するようにすることを選んだ。OpenIDのパスをOAuthの認可パスへとリダイレクトするエイリアスを作成した。

308 Permanent Redirectを使用した。

302リダイレクトは、POSTリクエストをGETリクエストに変えてしまう可能性がある。一方、308リダイレクトは厳格だ。クライアントに対し、新しいURLへ移動しつつ、同じメソッドとボディを維持するように指示する。これは恒久的な移動を扱うための正しい方法である。

また、これを設定フラグの背後に配置した。これにより、ユーザーが独自のOIDCディスカバリを実行している場合に、この機能をオフにすることができる。

コード内でこれを行うことで、テストを書くことができる:

  • 1つのテストでは、リダイレクトが正しく行われるかを確認する。
  • もう1つのテスト

MCPコネクタをスムーズに動作させる、よく知られたOpenID設定エイリアス

MCP (Model Context Protocol) コネクタを扱ったことがある方なら、なぜ一部のコネクタはスムーズに動作し、他のものは手動設定が必要なのかと疑問に思ったことがあるかもしれません。

その答えは、認証と認可の世界における「魔法のような小さなエンドポイント」にあります。それが .well-known/openid-configuration です。

OpenID Connect Discovery とは?

OpenID Connect (OIDC) は、認証のための標準プロトコルです。しかし、認証プロセスを完了するには、多くの詳細な情報が必要になります。例えば:

  • Authorization Endpoint (認可エンドポイント): ユーザーがログインするためのURL
  • Token Endpoint (トークンエンドポイント): アクセストークンを取得するためのURL
  • JWKS URI: トークンの署名を検証するための公開鍵セットのURL
  • Scopes (スコープ): 利用可能な権限の範囲

これらすべての情報を、開発者が手動でコネクタに設定するのは非常に手間がかかり、ミスも起こりやすい作業です。

ここで登場するのが OpenID Connect Discovery です。

.well-known/openid-configuration の役割

この仕様では、IDプロバイダー (IdP) が自身の構成情報を公開するための特定のパスを定義しています。

もし、あるMCPコネクタが https://example-idp.com というベースURLを知っているなら、コネクタは自動的に https://example-idp.com/.well-known/openid-configuration にアクセスします。

そこには、以下のようなJSON形式のメタデータが含まれています:

{
  "issuer": "https://example-idp.com",
  "authorization_endpoint": "https://example-idp.com/authorize",
  "token_endpoint": "https://example-idp.com/token",
  "jwks_uri": "https://example-idp.com/keys",
  "response_types_supported": ["code"],
  "subject_types_supported": ["public"],
  "id_token_signing_alg_values_supported": ["RS256"]
}

なぜこれが MCP コネクタにとって重要なのか?

MCP (Model Context Protocol) は、AIモデルが外部ツールやデータソースと対話するための新しい標準です。多くのMCPコネクタは、企業のデータやツールに安全にアクセスするために、OIDCを利用した認証を必要とします。

この「Discovery」メカニズムがあるおかげで、MCPコネクタは以下のような体験を提供できます:

  1. ゼロ構成 (Zero-config): ユーザーはベースURLを入力するだけで、残りの設定はすべて自動で行われます。
  2. 堅牢性: 設定ミスによる認証エラーが減少します。
  3. 柔軟性: IDプロバイダーがエンドポイントを変更しても、メタデータが更新されていればコネクタは自動的に追従できます。

まとめ

.well-known/openid-configuration は、一見地味なエンドポイントですが、MCPコネクタを「プラグ・アンド・プレイ」で動作させるための不可欠な要素です。

認証の標準化を活用することで、MCPエコシステムはより使いやすく、より安全なものになっていくでしょう。