11import pkceChallenge from "pkce-challenge" ;
2- import { z } from "zod" ;
32import { LATEST_PROTOCOL_VERSION } from "../types.js" ;
4-
5- export const OAuthMetadataSchema = z
6- . object ( {
7- issuer : z . string ( ) ,
8- authorization_endpoint : z . string ( ) ,
9- token_endpoint : z . string ( ) ,
10- registration_endpoint : z . string ( ) . optional ( ) ,
11- scopes_supported : z . array ( z . string ( ) ) . optional ( ) ,
12- response_types_supported : z . array ( z . string ( ) ) ,
13- response_modes_supported : z . array ( z . string ( ) ) . optional ( ) ,
14- grant_types_supported : z . array ( z . string ( ) ) . optional ( ) ,
15- token_endpoint_auth_methods_supported : z . array ( z . string ( ) ) . optional ( ) ,
16- token_endpoint_auth_signing_alg_values_supported : z
17- . array ( z . string ( ) )
18- . optional ( ) ,
19- service_documentation : z . string ( ) . optional ( ) ,
20- revocation_endpoint : z . string ( ) . optional ( ) ,
21- revocation_endpoint_auth_methods_supported : z . array ( z . string ( ) ) . optional ( ) ,
22- revocation_endpoint_auth_signing_alg_values_supported : z
23- . array ( z . string ( ) )
24- . optional ( ) ,
25- introspection_endpoint : z . string ( ) . optional ( ) ,
26- introspection_endpoint_auth_methods_supported : z
27- . array ( z . string ( ) )
28- . optional ( ) ,
29- introspection_endpoint_auth_signing_alg_values_supported : z
30- . array ( z . string ( ) )
31- . optional ( ) ,
32- code_challenge_methods_supported : z . array ( z . string ( ) ) . optional ( ) ,
33- } )
34- . passthrough ( ) ;
35-
36- export const OAuthTokensSchema = z
37- . object ( {
38- access_token : z . string ( ) ,
39- token_type : z . string ( ) ,
40- expires_in : z . number ( ) . optional ( ) ,
41- scope : z . string ( ) . optional ( ) ,
42- refresh_token : z . string ( ) . optional ( ) ,
43- } )
44- . strip ( ) ;
45-
46- /**
47- * Client metadata schema according to RFC 7591 OAuth 2.0 Dynamic Client Registration
48- */
49- export const OAuthClientMetadataSchema = z . object ( {
50- redirect_uris : z . array ( z . string ( ) ) ,
51- token_endpoint_auth_method : z . string ( ) . optional ( ) ,
52- grant_types : z . array ( z . string ( ) ) . optional ( ) ,
53- response_types : z . array ( z . string ( ) ) . optional ( ) ,
54- client_name : z . string ( ) . optional ( ) ,
55- client_uri : z . string ( ) . optional ( ) ,
56- logo_uri : z . string ( ) . optional ( ) ,
57- scope : z . string ( ) . optional ( ) ,
58- contacts : z . array ( z . string ( ) ) . optional ( ) ,
59- tos_uri : z . string ( ) . optional ( ) ,
60- policy_uri : z . string ( ) . optional ( ) ,
61- jwks_uri : z . string ( ) . optional ( ) ,
62- jwks : z . any ( ) . optional ( ) ,
63- software_id : z . string ( ) . optional ( ) ,
64- software_version : z . string ( ) . optional ( ) ,
65- } ) . passthrough ( ) ;
66-
67- /**
68- * Client information response schema according to RFC 7591
69- */
70- export const OAuthClientInformationSchema = z . object ( {
71- client_id : z . string ( ) ,
72- client_secret : z . string ( ) . optional ( ) ,
73- client_id_issued_at : z . number ( ) . optional ( ) ,
74- client_secret_expires_at : z . number ( ) . optional ( ) ,
75- } ) . passthrough ( ) ;
76-
77- export type OAuthMetadata = z . infer < typeof OAuthMetadataSchema > ;
78- export type OAuthTokens = z . infer < typeof OAuthTokensSchema > ;
79-
80- export type OAuthClientMetadata = z . infer < typeof OAuthClientMetadataSchema > ;
81- export type OAuthClientInformation = z . infer < typeof OAuthClientInformationSchema > ;
3+ import type { OAuthClientMetadata , OAuthClientInformation , OAuthTokens , OAuthMetadata , OAuthClientInformationFull } from "../shared/auth.js" ;
4+ import { OAuthClientInformationFullSchema , OAuthMetadataSchema , OAuthTokensSchema } from "../shared/auth.js" ;
825
836/**
847 * Implements an end-to-end OAuth client to be used with one MCP server.
@@ -113,7 +36,7 @@ export interface OAuthClientProvider {
11336 * This method is not required to be implemented if client information is
11437 * statically known (e.g., pre-registered).
11538 */
116- saveClientInformation ?( clientInformation : OAuthClientInformation ) : void | Promise < void > ;
39+ saveClientInformation ?( clientInformation : OAuthClientInformationFull ) : void | Promise < void > ;
11740
11841 /**
11942 * Loads any existing OAuth tokens for the current session, or returns
@@ -175,12 +98,13 @@ export async function auth(
17598 throw new Error ( "OAuth client information must be saveable for dynamic registration" ) ;
17699 }
177100
178- clientInformation = await registerClient ( serverUrl , {
101+ const fullInformation = await registerClient ( serverUrl , {
179102 metadata,
180103 clientMetadata : provider . clientMetadata ,
181104 } ) ;
182105
183- await provider . saveClientInformation ( clientInformation ) ;
106+ await provider . saveClientInformation ( fullInformation ) ;
107+ clientInformation = fullInformation ;
184108 }
185109
186110 // Exchange authorization code for tokens
@@ -448,7 +372,7 @@ export async function registerClient(
448372 metadata ?: OAuthMetadata ;
449373 clientMetadata : OAuthClientMetadata ;
450374 } ,
451- ) : Promise < OAuthClientInformation > {
375+ ) : Promise < OAuthClientInformationFull > {
452376 let registrationUrl : URL ;
453377
454378 if ( metadata ) {
@@ -473,5 +397,5 @@ export async function registerClient(
473397 throw new Error ( `Dynamic client registration failed: HTTP ${ response . status } ` ) ;
474398 }
475399
476- return OAuthClientInformationSchema . parse ( await response . json ( ) ) ;
400+ return OAuthClientInformationFullSchema . parse ( await response . json ( ) ) ;
477401}
0 commit comments