Search the alley

記事を検索

2文字以上でタイトル・カテゴリ・タグを検索できます。

MCP OAuth認証のCIMD・DCR移行ガイド|iss・scope・resource・PKCEの確認順

MCP 2026-07-28のOAuth認証を、CIMD・DCR・Protected Resource Metadata・iss・resource・scope・PKCEに分けて整理。HTTPとstdioの違い、401/403の切り分け、移行前チェックを解説します。

公開 2026.08.09 / 更新 2026.08.09

この記事のポイント

  • MCPのAuthorization仕様はHTTP-based transportが対象で、stdioは同じOAuthフローをそのまま適用しない
  • Client ID Metadata Documents(CIMD)、pre-registration、DCRを、接続先との関係と対応状況で選ぶ
  • Protected Resource Metadata、issuer、iss、resourceを別々に検証し、authorization serverごとにcredentialを分ける
  • scope challenge、403、step-up、PKCE、token audienceを実装・運用のチェック項目へ落とす

先に結論:MCP認証はCIMDかDCRかだけを選ぶ作業ではない

MCP 2026-07-28のAuthorization仕様を実装するときは、登録方式だけでなく、どのtransportを使うか、Protected Resource Metadataからどのauthorization serverを発見するか、issuerとcredentialをどう結びつけるか、どのresourceとscopeを要求するか、tokenをどう検証するかまで分けて確認します。CIMD(Client ID Metadata Documents)は新しい接続先での候補、DCR(Dynamic Client Registration)は後方互換の選択肢ですが、どちらを選んでもPKCE、redirect URI、audience、token保管の確認は残ります。

まず登場人物を4つに分ける

役割何をするか確認する境界
MCP clientユーザーに代わってMCP serverへrequestするregistration、redirect、PKCE、token保管、scope
MCP server / resource server保護されたresourceを提供し、tokenを検証するProtected Resource Metadata、audience、401/403、token passthrough禁止
Authorization serverユーザー認証・consent後にtokenを発行するissuer、metadata、client registration、scope、refresh token
Resource owner接続と権限を承認する主体同意画面、送信先、scope、再認証の意味

MCP serverとauthorization serverは同じ運営主体とは限りません。公式仕様でも、authorization serverはresource serverと別の場所に置けると説明されています。接続先URLとissuerを一つの文字列として扱わず、どのserverが何を発行したかを記録します。

登録方式は3つ:CIMD・事前登録・DCR

方式仕様上の位置づけ向いている状況
Pre-registrationclientとserverの既存関係がある場合の登録自分の組織や管理下のserverでclient情報を固定できる
CIMDHTTPS URLをclient_idとして使うClient ID Metadata Documentsclientとserverに事前の関係がない接続先
DCR後方互換のために残るDynamic Client Registration接続先がCIMD非対応でregistration endpointを提供する
User input他の方式が使えないときにclient情報を利用者が入力接続先の設定画面や手動登録が必要

複数方式に対応するclientの優先順位は、pre-registration、CIMD、DCR、利用者入力の順です。接続先のmetadataにCIMD対応があるか、DCRのregistration_endpointがあるかを確認し、DCRを最初から固定の前提にしない設計にします。

CIMDで最低限確認すること

  • client metadata documentをHTTPS URLで公開し、client_id URLにpathを持たせる
  • metadataのclient_idとdocument URLを完全一致させる
  • client_name、redirect_urisなど必須項目をそろえる
  • Authorization server metadataのclient_id_metadata_document_supportedを確認する
  • redirect URIをmetadataに固定し、接続先が完全一致で検証することを確認する
  • 公開metadataが更新されたときのcache、差し替え、削除、監査方法を決める
{
  "client_id": "https://app.example.com/oauth/client-metadata.json",
  "client_name": "Example MCP Client",
  "redirect_uris": [
    "https://app.example.com/oauth/callback"
  ],
  "grant_types": ["authorization_code"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none"
}

DCRは非推奨・後方互換の選択肢として扱う

2026-07-28のClient Registration仕様では、DCRはdeprecatedで、新しい実装はCIMDを使うべき選択肢として整理されています。一方で、CIMDに対応しないauthorization serverとの後方互換のため、DCRは利用可能な選択肢として残っています。DCRを使う場合は、registration endpointの存在だけでなく、発行されたclient credentialをどのissuerに結びつけるか、再登録条件、保存場所、削除方法を記録します。

DCRでloopback redirect errorが出るときはapplication_typeを見る

OIDC対応のauthorization serverがredirect URIをapplication_typeで制約する場合、desktop、mobile、CLI、loopback hostを使うnative clientはapplication_type: nativeを指定する必要があります。web用の既定値webのままだと、loopback redirectが拒否されることがあります。非OIDC serverでは無視される場合もあるため、エラー文だけで全MCPに共通する原因と決めつけず、authorization server metadataと登録仕様を確認します。

clientの形application_typeの確認redirect URIの確認
Desktop / CLI / loopbacknativeを指定するかloopback host、port、pathの一致
Remote web appwebを想定するかHTTPS、固定host、完全一致
Mobilenative相当の扱いかアプリのredirect schemeと登録値

Authorization Server Discoveryは401から始まる

MCP serverはProtected Resource Metadataによって、関連するauthorization serverの場所をclientへ知らせます。clientは401 UnauthorizedのWWW-Authenticate headerにあるresource_metadataを優先し、なければMCP endpointに対応するwell-known URIを確認します。その後、authorization server metadataまたはOpenID Connect Discoveryからendpointと対応機能を取得します。

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource", scope="files:read"
  • WWW-Authenticateのresource_metadata URLを読み、authorization_serversを確認する
  • 複数のauthorization serverがある場合も、issuerごとにregistration stateとtokenを分ける
  • well-knownから取得したmetadataのissuerが、取得元から組み立てたissuerと一致するか検証する
  • metadataのissuerが別ドメインや別tenantを指していたら、接続を続けず原因を確認する
  • authorization serverを変えたとき、別issuerのcredentialを再利用しない

issはauthorization responseのissuer混同を防ぐ

MCPのAuthorization仕様では、clientは認証開始前に検証済みmetadataからissuerを記録し、PKCE verifierやstateと同じrequest recordに関連付けます。authorization responseにissが含まれる場合は記録済みissuerと比較し、metadataがiss対応を宣言しているのにissがない場合はresponseを拒否します。文字列比較の前にhostや末尾slashを勝手に正規化しない点も重要です。

状態clientの扱い
metadataがiss対応、responseにissあり記録したissuerと単純比較し、一致しなければ拒否
metadataがiss対応、responseにissなし仕様に従いresponseを拒否
metadataがiss対応を宣言していない、responseにissあり存在するissを記録issuerと比較
issuerを未検証のURLから記録検証前提が崩れているため、認証を継続しない

resourceはtokenの行き先を明示する

MCP clientはauthorization requestとtoken requestの両方にresource parameterを含め、対象となるMCP serverのcanonical URIを指定します。これにより、別のresource向けに発行されたtokenをMCP serverが受け入れるリスクを下げます。接続先のURL、path、末尾slashを仕様のcanonical URIとして一貫させ、clientとserverで別の表記を使わないようにします。

authorization request: resource=https%3A%2F%2Fmcp.example.com
token request:         resource=https%3A%2F%2Fmcp.example.com

scopeは最小権限とstep-upを一緒に設計する

初回認証では、401のWWW-Authenticateにあるscope challengeを優先し、必要な権限だけを要求します。scopeが不足した状態で操作した場合、serverは403 Forbiddenとinsufficient_scopeのchallengeを返し、clientは既存scopeと今回必要なscopeのunionで再認証するstep-upを検討します。無制限に再試行せず、scope upgradeの回数と対象resourceを記録して停止条件を設けます。

状況確認次の扱い
初回401resource_metadataとscope challenge必要なscopeだけで認証を開始
scope不足の403insufficient_scope、required scope、resource既存scopeを失わずstep-upを検討
再認証が繰り返されるscope設計、serverのchallenge、retry回数自動再試行を止めて設定を見直す
書き込みが不要な作業read scopeだけで足りるかwrite/delete scopeを要求しない

token・PKCE・redirect URIの最低限

  • access tokenはAuthorization headerで送る。URI query stringへ入れない
  • MCP serverはtokenのaudienceと発行元を検証し、自分向けでないtokenを受け入れない
  • authorization code flowではPKCEを使い、S256を利用できる場合はS256を選ぶ
  • authorization server endpointはHTTPS、redirect URIはloopback hostまたはHTTPSに限定する
  • redirect URIは登録値との完全一致を確認し、stateの欠落・不一致を受け入れない
  • refresh tokenは安全に保存し、発行されると決めつけず、ログに実値を残さない

401・403・redirect errorの切り分け

症状最初に確認するもの避けたい判断
401でmetadataが見つからないWWW-Authenticate、well-known、endpoint pathauthorization URLを手で推測して続ける
loopback redirectが拒否されるapplication_type、redirect URI、OIDC metadataredirect URIを広げて通す
iss mismatch検証済みissuer、responseのiss、正規化処理文字列を勝手に整形して一致扱いする
403 insufficient_scopechallengeのscope、既存grant、step-up回数全scopeを要求して無限retryする
token rejected by serverresource、audience、issuer、期限別MCP serverのtokenを流用する
stdioとHTTPで挙動が違うtransport、credentialの取得場所、server設定HTTP OAuthをstdioへそのまま適用する

実装前のMCP OAuthチェックリスト

  • HTTP-based transportかstdioかを記録し、対象仕様を分けた
  • Protected Resource MetadataのURL、authorization_servers、issuerを保存した
  • pre-registration、CIMD、DCRのどれを使うか、接続先の対応を確認した
  • CIMDのHTTPS URL、client_id完全一致、redirect_uris、metadata更新を確認した
  • DCRを使う場合はdeprecatedな後方互換経路として、application_typeと再登録を設計した
  • authorization responseのiss、state、PKCEを検証し、issuerごとにcredentialを分けた
  • authorization/token requestのresourceとscopeを一致させ、最小権限にした
  • token audience、token保管、refresh、ログ、上流APIへのpassthrough禁止を確認した
  • 401/403、scope不足、metadata不一致、認証server変更時の停止・再登録をテストした

MCP OAuth認証のFAQ

MCPのAuthorization仕様は必須ですか?

認証自体はMCP実装でoptionalです。HTTP-based transportでAuthorizationを使う場合は公式仕様に従うことが推奨され、stdioは同じ仕様を使わず環境からcredentialを取得することが推奨されています。

CIMDとDCRはどちらを使いますか?

複数方式に対応するclientでは、pre-registration、CIMD、DCR、利用者入力の順が案内されています。CIMD非対応のauthorization serverとの後方互換ではDCRを使う余地がありますが、新しい実装ではCIMDを候補にします。

DCRは廃止されましたか?

Client Registration仕様ではDCRはdeprecatedですが、CIMDに対応しないauthorization serverとの後方互換のために残っています。接続先のmetadataとregistration endpointを確認し、DCR固定にしない設計にします。

MCPの401 responseで何を見ますか?

WWW-Authenticate headerのresource_metadataとscopeを確認します。Protected Resource Metadataからauthorization serverを発見し、metadataのissuerを検証してからregistrationとauthorizationへ進みます。

MCPの403 insufficient_scopeはどう直しますか?

serverが返すscope challengeと既存のgrantを確認し、必要なscopeのunionでstep-upを検討します。書き込み不要の作業でwrite scopeを追加せず、再試行回数に上限を置きます。

MCP tokenを別のserverでも使えますか?

使い回せると決めつけないでください。仕様ではresourceとaudienceにより対象serverへtokenを結びつけ、serverは自分向けでないtokenを受け入れないことが求められます。authorization serverが変わればcredentialも分けます。

MCP OAuthの実装で最初に見るべき項目は?

transport、Protected Resource Metadata、issuer、登録方式、redirect URI、PKCE、resource、scope、token audienceの順に記録します。接続できたことだけで安全・最小権限とは判断しません。

まとめ:認証フローを分割してから移行する

MCP OAuth認証の移行では、CIMDを採用するかDCRを残すかだけを決めず、HTTPとstdioの違い、Protected Resource Metadata、authorization serverのissuer、registration、iss、resource、scope、PKCE、token audienceを分解します。401/403やloopback redirectのエラーも、権限を広げて通すのではなく、仕様の発見・登録・検証順に戻って原因を切り分けます。まずテスト用接続と読み取りscopeで確認し、接続先・SDK・clientの対応がそろってから書き込みや本番へ進めるのが安全です。