@@ -232,10 +232,8 @@ private async Task<McpUnauthorizedResponseResult> PerformOAuthAuthorizationAsync
232232 CancellationToken cancellationToken )
233233 {
234234 // Get available authorization servers from the 401 response
235- var availableAuthorizationServers = await _authorizationHelpers . GetAvailableAuthorizationServersAsync (
236- response ,
237- _serverUrl ,
238- cancellationToken ) ;
235+ var protectedResourceMetadata = await _authorizationHelpers . ExtractProtectedResourceMetadata ( response , _serverUrl , cancellationToken ) ;
236+ var availableAuthorizationServers = protectedResourceMetadata . AuthorizationServers ?? [ ] ;
239237
240238 if ( ! availableAuthorizationServers . Any ( ) )
241239 {
@@ -269,7 +267,7 @@ private async Task<McpUnauthorizedResponseResult> PerformOAuthAuthorizationAsync
269267 _authServerMetadata = authServerMetadata ;
270268
271269 // Perform the OAuth flow
272- var token = await InitiateAuthorizationCodeFlowAsync ( authServerMetadata , cancellationToken ) ;
270+ var token = await InitiateAuthorizationCodeFlowAsync ( protectedResourceMetadata , authServerMetadata , cancellationToken ) ;
273271 if ( token != null )
274272 {
275273 _token = token ;
@@ -342,7 +340,7 @@ private async Task<McpUnauthorizedResponseResult> PerformOAuthAuthorizationAsync
342340 if ( response . IsSuccessStatusCode )
343341 {
344342 using var stream = await response . Content . ReadAsStreamAsync ( cancellationToken ) ;
345- var metadata = await JsonSerializer . DeserializeAsync < AuthorizationServerMetadata > ( stream , McpJsonUtilities . JsonContext . Default . AuthorizationServerMetadata , cancellationToken ) ;
343+ var metadata = await JsonSerializer . DeserializeAsync ( stream , McpJsonUtilities . JsonContext . Default . AuthorizationServerMetadata , cancellationToken ) ;
346344
347345 if ( metadata != null )
348346 {
@@ -413,21 +411,25 @@ private async Task<McpUnauthorizedResponseResult> PerformOAuthAuthorizationAsync
413411 }
414412
415413 private async Task < TokenContainer ? > InitiateAuthorizationCodeFlowAsync (
414+ ProtectedResourceMetadata protectedResourceMetadata ,
416415 AuthorizationServerMetadata authServerMetadata ,
417416 CancellationToken cancellationToken )
418417 {
419418 var codeVerifier = GenerateCodeVerifier ( ) ;
420419 var codeChallenge = GenerateCodeChallenge ( codeVerifier ) ;
421420
422- var authUrl = BuildAuthorizationUrl ( authServerMetadata , codeChallenge ) ;
421+ var authUrl = BuildAuthorizationUrl ( protectedResourceMetadata , authServerMetadata , codeChallenge ) ;
423422 var authCode = await GetAuthorizationCodeAsync ( authUrl , cancellationToken ) ;
424423 if ( string . IsNullOrEmpty ( authCode ) )
425424 return null ;
426425
427426 return await ExchangeCodeForTokenAsync ( authServerMetadata , authCode ! , codeVerifier , cancellationToken ) ;
428427 }
429428
430- private Uri BuildAuthorizationUrl ( AuthorizationServerMetadata authServerMetadata , string codeChallenge )
429+ private Uri BuildAuthorizationUrl (
430+ ProtectedResourceMetadata protectedResourceMetadata ,
431+ AuthorizationServerMetadata authServerMetadata ,
432+ string codeChallenge )
431433 {
432434 if ( authServerMetadata . AuthorizationEndpoint . Scheme != Uri . UriSchemeHttp &&
433435 authServerMetadata . AuthorizationEndpoint . Scheme != Uri . UriSchemeHttps )
@@ -442,9 +444,10 @@ private Uri BuildAuthorizationUrl(AuthorizationServerMetadata authServerMetadata
442444 queryParams [ "code_challenge" ] = codeChallenge ;
443445 queryParams [ "code_challenge_method" ] = "S256" ;
444446
445- if ( _scopes . Any ( ) )
447+ var scopesSupported = protectedResourceMetadata . ScopesSupported ?? [ ] ;
448+ if ( _scopes . Count > 0 || scopesSupported . Count > 0 )
446449 {
447- queryParams [ "scope" ] = string . Join ( " " , _scopes ) ;
450+ queryParams [ "scope" ] = string . Join ( " " , [ .. _scopes , .. scopesSupported ] ) ;
448451 }
449452
450453 var uriBuilder = new UriBuilder ( authServerMetadata . AuthorizationEndpoint )
0 commit comments