@@ -275,6 +275,27 @@ async def run_client_credentials_basic(server_url: str) -> None:
275275async def run_auth_code_client (server_url : str ) -> None :
276276 """Authorization code flow (default for auth/* scenarios)."""
277277 callback_handler = ConformanceOAuthCallbackHandler ()
278+ storage = InMemoryTokenStorage ()
279+
280+ # Check for pre-registered client credentials from context
281+ context_json = os .environ .get ("MCP_CONFORMANCE_CONTEXT" )
282+ if context_json :
283+ try :
284+ context = json .loads (context_json )
285+ client_id = context .get ("client_id" )
286+ client_secret = context .get ("client_secret" )
287+ if client_id :
288+ await storage .set_client_info (
289+ OAuthClientInformationFull (
290+ client_id = client_id ,
291+ client_secret = client_secret ,
292+ redirect_uris = [AnyUrl ("http://localhost:3000/callback" )],
293+ token_endpoint_auth_method = "client_secret_basic" if client_secret else "none" ,
294+ )
295+ )
296+ logger .debug (f"Pre-loaded client credentials: client_id={ client_id } " )
297+ except json .JSONDecodeError :
298+ logger .exception ("Failed to parse MCP_CONFORMANCE_CONTEXT" )
278299
279300 oauth_auth = OAuthClientProvider (
280301 server_url = server_url ,
@@ -284,7 +305,7 @@ async def run_auth_code_client(server_url: str) -> None:
284305 grant_types = ["authorization_code" , "refresh_token" ],
285306 response_types = ["code" ],
286307 ),
287- storage = InMemoryTokenStorage () ,
308+ storage = storage ,
288309 redirect_handler = callback_handler .handle_redirect ,
289310 callback_handler = callback_handler .handle_callback ,
290311 client_metadata_url = "https://conformance-test.local/client-metadata.json" ,
0 commit comments