最終確認: 2026-08-01
本書はP2-60 PR 1の認可サーバー・MCPクライアント互換性評価を記録する。 設計判断だけを対象とし、public MCP endpointの有効化やコード変更は行わない。
以下の認可サーバー比較は、当初のMCP Authorization 2025-11-25に対する
判断記録であり、OAuth profileとして引き続き有効である。EgressViewのtransportは
現在2025-11-25と2026-07-28の両方を提供し、公開gateのactive probeで
両revisionを必須にする。実clientは現在のreleaseが対応するrevisionを記録し、
modern対応版の公開後に追加回帰する。この更新によってendpointを公開することはない。
AWS固有の判定は、Kiroに設定済みのAWS Documentation MCP serverでも二重確認した。 このserverはAWS一次資料を検索するものであり、AWS accountへの接続やCognito requestの実行は行わない。
厳格profileを完全に通過する認可サーバーはない。実運用はCognito Essentialsを 条件付き第一候補、Keycloakを標準準拠性優先のfallbackとする。どちらにも明示的な 互換性例外が残る。
code_challenge_methods_supportedがなかった。
MCP clientはこのfieldがない場合に認可を中止する必要がある。CognitoはRFC 8707
resource bindingとPKCE S256自体には対応するが、metadata要件を代替しない。resource parameterは処理しない。ただし初期版を
MCP resource 1つに限定し、全許可scopeを同じcanonical audへmappingし、
EgressViewが完全一致しないtokenを拒否すれば、token用途制限というsecurity
goalは維持できる。RFC 8707準拠とは表記せず、暫定互換例外として扱う。CognitoをDNS非公開stagingで先に試す。明示的compatibility profileはAWS regional user-pool issuerとの完全一致時だけPKCE metadata fieldの欠落を許容し、署名、issuer、 有効期限、canonical audience、scope検証は維持する。PKCE S256のwire証跡と Inspector、Claude Code、Copilot CLIのversion付き試験が合格した場合だけ採用する。 対象clientが非互換ならKeycloakへ切り替える。KeycloakのCIMDはexperimentalであり、 固定audience mapperも単一resource限定のRFC 8707例外として残る。
Internet公開やAWS環境変更を行わず、Keycloak 26.7.0、EgressView MCP、fixture APIを
loopbackだけで試験した。Claude Code 2.1.220とGitHub Copilot CLI 1.0.75はいずれも
PKCE S256、resource、RFC 9207 response issを送受信できたが、wire traceでは
legacy initializeを使い、選択revisionは2025-11-25だった。したがって
2026-07-28 client gateは未達で、公開禁止を維持する。
独立probeでは固定audience、read/write scope、RS256、60秒access tokenを
EgressViewが受理し、連続refresh rotationも成功した。ただし2世代前のrefresh
token再利用は最初のrequestが成功し、その後family全体がinvalid_grantとなった。
gateはこの挙動をrevoke-family方式として、replay後に現行familyも失敗し、
access token寿命が15分以下の場合だけ許可する。replay request自体を拒否しながら
現行familyを維持するproviderはreject-replay方式を使う。異なる意味を同じ成功と
みなさず、証跡へ採用方式を記録する。modern対応client release後にissuer変更、
scope step-up、実client refreshを再試験する。
EgressViewはlegacy 2025-11-25とmodern 2026-07-28の両protocol eraで
必要なMCP Authorization要件に対応する。
resourceをauthorization requestとtoken requestの両方へ送る。code_challenge_methods_supportedにS256を公開する。暫定Keycloak profileは最初の要件に対する明示的な例外である。MCP resourceを 1つに限定し、公開する全scopeが同じcanonical audienceを付与することを必須とする。 RFC 8707正式対応まではmulti-resource構成を禁止する。
本評価ではpublic DNS名を推測で決めない。実接続試験前に
https://mcp.example.net/mcpのようなURIを1つ確定し、MCP endpoint、
Protected Resource Metadataのresource、Cognito resource server identifier、
authorization/token requestのresource、access tokenのaudで完全に一致させる。
| 要件 | Cognito | Keycloak | authentik |
|---|---|---|---|
| RFC 8707 resource binding | authorize側は公式確認済み、token endpointの文書化parameterにresourceなし |
非対応と公式明記 | 公式な対応根拠なし、不可 |
canonical resourceへのaud束縛 |
resource binding成功時は対応 | scope mapperによる回避のみ | custom claimはRFC 8707の代替にならない |
| PKCE S256 | protocol対応はあるが実discoveryにcode_challenge_methods_supportedなし、厳格判定は失敗 |
対応・強制可能 | 対応、discovery fieldは実測保存 |
| client登録 | 本設計では事前登録のみ | 事前登録、DCR、実験的CIMD | 事前登録は確認、DCR/CIMDは未確認 |
| callback | 固定callbackを最大100件登録可能、wildcard挙動は公式文書になし | 完全一致redirectを設定可能 | 完全一致またはregex |
| refresh / rotation | 対応、rotation grace periodは最大60秒 | 対応・設定可能 | offline_access必須、rotation設定可能 |
| 失効endpoint | /oauth2/revoke |
OIDC revoke endpoint | /application/o/revoke/ |
| P2-60判定 | compatibility profile付きの条件付き第一候補 | 単一resource例外を持つ標準準拠性優先fallback | 根拠不足で未選定 |
公式client文書はOAuthの全wire parameterを公開していない。「実測必須」は、
authorization/token両方のresource、PKCE S256、refresh、失効を認可traceで
確認するまで、そのclient向けproviderを採用しないことを意味する。
| Client | 公式確認できた機能 | 登録・callback | Cognito判定 |
|---|---|---|---|
| ChatGPT custom MCP app | OAuth、refresh token、offline_access広告の必要性 |
汎用のstatic client ID・callback仕様は公開文書で未確認 | 実互換性試験が必要 |
| Claude web / Desktop | OAuth、DCR、custom client ID/secret、token期限・refresh | https://claude.ai/api/mcp/auth_callback固定。将来用https://claude.com/api/mcp/auth_callbackも登録 |
実互換性試験が必要 |
| Claude Code | browser OAuth、token安全保存、自動refresh | localhost callbackは公式guideにあるがstatic client設定は未確認 | 実互換性試験が必要 |
| Cursor | Streamable HTTP/SSE OAuth、static-client OAuth改善 | release間でcallback挙動が変化し、公開MCP referenceでは設定不可 | 実互換性試験が必要 |
| Kiro CLI | browser OAuth、事前登録public/confidential client、scope指定、refresh/再認証 | loopback URL、port、pathを完全指定可能 | 実互換性試験が必要 |
Cognitoはmetadata欠落を許容しながらPKCE S256を実際に使うclientだけを対応対象とし、 versionごとにDNS非公開gateを通す。対象clientが非互換ならKeycloakへ切り替える。
Keycloak用インフラを構築する前に、使い捨てのCognito Essentials poolでmanaged loginを再評価した。Authorization Code + PKCE S256、URL形式resource server、 secretなしpublic client、固定localhost callback、5分access token、refresh token rotation、token revocationを使用した。
audはcanonical MCP resourceと一致した。audとscopeを
維持した。invalid_grantで拒否された。unauthorized_client、未登録callback portは
redirect_mismatchで拒否された。code_challenge_methods_supportedとregistration_endpointを公開せず、custom
scopeもscopes_supportedへ掲載しなかった。EgressViewの実OAuth verifierは
Authorization Server Metadata does not advertise PKCE S256でfail-closedした。トークン発行、resource binding、rotation、失効は要件を満たすため、Cognitoを 厳格MCP metadata profileには適合しない条件付き第一候補とする。compatibility profileは完全一致するCognito issuerのfield欠落だけを許容し、公開前にPKCE S256の wire証跡とclient version付き試験を要求する。metadata proxy、PKCE無効化、JWT検証 緩和は行わない。試験用poolとdomainは削除し、既存pool、EC2、DNS、ALB、 Security Group、EgressView設定は変更していない。
既存の無関係なAmplify user poolは変更・流用しなかった。自己登録を無効化した tag付きP2-60専用poolを一時作成し、次の試験後に削除した。
network.read /
notes.write scope、secretなしpublic clientを作成した。code_challenge_methods_supportedとregistration_endpointがなかった。
managed login domain自身の/.well-known/openid-configurationは404で、
discoveryはregional issuer pathから提供された。resourceなし・ありの両方で
invalid_grantとなった。無効refresh token + resourceもinvalid_grantだった。
Cognitoはgrant検証前にparameter自体を拒否しないが、このnegative testだけでは
正常発行tokenへのbindingを証明しない。response_type=tokenはunauthorized_clientで拒否され、
code-only client gateは成功した。MCP Authorization 2025-11-25はPKCE metadata fieldがない場合、clientへ認可中止を 要求する。この初回結果は厳格profileで失敗しており、後から追加したcompatibility profileも仕様上の判定自体は変更しない。
AWS Documentation MCPでも、AWSがresourceを/oauth2/authorizeで説明する一方、
/oauth2/tokenのparameter一覧には含めていないことを確認した。ただし、文書に
ないことは未知parameterを拒否する証明にはならない。また、AWSはPKCEでS256だけを
対応すると明記するが、MCP必須のdiscovery JSON fieldは明記していない。この2点は
実測gateのままとする。
Kiro設定内に見つかったaccount操作型AWS MCP entryはactiveではなく、proxy executableも存在しなかった。AWS Documentation MCPを一次資料調査に、認証済み AWS CLIを一時検証に使用した。有効tokenは発行せず、検証resourceは全て削除した。
port 3010はまだ公開しない。CognitoをDNS非公開stagingで先に試し、対応client versionごとにcompatibility証跡を要求する。合格時はCognitoを採用し、不合格時は Keycloak fallbackを構築して単一resourceのRFC 8707例外を記録する。どちらも P2-60 gate完了前にDNSを公開しない。