1+ using  ModelContextProtocol . Client ; 
2+ using  System . Reflection ; 
3+ using  System . Text . Json ; 
4+ 
5+ /// <summary> 
6+ /// Extract and inject the OAuth token, until we get the TokenCache (https://github.com/modelcontextprotocol/csharp-sdk/pull/834). 
7+ /// </summary> 
8+ public  static class  HttpClientTransportOAuthTokenHelper 
9+ { 
10+ 	public  static string ?  ExtractOAuthToken ( this  HttpClientTransport  httpTransport ) 
11+ 	{ 
12+ 		var  mcpHttpClientField  =  httpTransport . GetType ( ) . GetField ( "_mcpHttpClient" ,  BindingFlags . NonPublic  |  BindingFlags . Instance ) ; 
13+ 		var  mcpHttpClient  =  mcpHttpClientField ? . GetValue ( httpTransport ) ; 
14+ 		var  clientOAuthProviderField  =  ( mcpHttpClient ? . GetType ( )  as  TypeInfo ) ? . DeclaredFields . FirstOrDefault ( df =>  df . FieldType . FullName  ==  "ModelContextProtocol.Authentication.ClientOAuthProvider" ) ; 
15+ 		var  clientOAuthProvider  =  clientOAuthProviderField ? . GetValue ( mcpHttpClient ) ; 
16+ 		var  tokenField  =  clientOAuthProvider ? . GetType ( ) . GetField ( "_token" ,  BindingFlags . NonPublic  |  BindingFlags . Instance ) ; 
17+ 		var  token  =  tokenField ? . GetValue ( clientOAuthProvider ) ; 
18+ 		var  obtainedAtProperty  =  token ? . GetType ( ) . GetProperty ( "ObtainedAt" ) ; 
19+ 		var  obtainedAt  =  obtainedAtProperty ? . GetValue ( token ) ; 
20+ 		if  ( token  ==  null  ||  obtainedAt  ==  null )  return  null ; 
21+ 		var  tokenJson  =  JsonSerializer . Serialize ( token ,  token ! . GetType ( ) ) ; 
22+ 		return  JsonSerializer . Serialize ( new  {  tokenJson ,  obtainedAt  } ) ; 
23+ 	} 
24+ 
25+ 	public  static void  InjectOAuthToken ( this  HttpClientTransport  httpTransport ,  string ?  token ) 
26+ 	{ 
27+ 		if  ( string . IsNullOrEmpty ( token ) )  return ; 
28+ 		var  tokenObj  =  JsonSerializer . Deserialize < JsonElement > ( token ) ; 
29+ 		var  tokenJson  =  tokenObj . GetProperty ( "tokenJson" ) . GetString ( ) ; 
30+ 		var  obtainedAt  =  tokenObj . GetProperty ( "obtainedAt" ) . GetDateTimeOffset ( ) ; 
31+ 		var  mcpHttpClientField  =  httpTransport . GetType ( ) . GetField ( "_mcpHttpClient" ,  BindingFlags . NonPublic  |  BindingFlags . Instance ) ; 
32+ 		var  mcpHttpClient  =  mcpHttpClientField ? . GetValue ( httpTransport ) ; 
33+ 		var  clientOAuthProviderField  =  ( mcpHttpClient ? . GetType ( )  as  TypeInfo ) ? . DeclaredFields . FirstOrDefault ( df =>  df . FieldType . FullName  ==  "ModelContextProtocol.Authentication.ClientOAuthProvider" ) ; 
34+ 		var  clientOAuthProvider  =  clientOAuthProviderField ? . GetValue ( mcpHttpClient ) ; 
35+ 		var  tokenField  =  clientOAuthProvider ? . GetType ( ) . GetField ( "_token" ,  BindingFlags . NonPublic  |  BindingFlags . Instance ) ; 
36+ 		var  tokenType  =  tokenField ? . FieldType ; 
37+ 		var  deserializedToken  =  JsonSerializer . Deserialize ( tokenJson ! ,  tokenType ! ) ; 
38+ 		if  ( deserializedToken  !=  null ) 
39+ 		{ 
40+ 			var  obtainedAtProperty  =  tokenType ! . GetProperty ( "ObtainedAt" ) ; 
41+ 			obtainedAtProperty ? . SetValue ( deserializedToken ,  obtainedAt ) ; 
42+ 			tokenField ? . SetValue ( clientOAuthProvider ,  deserializedToken ) ; 
43+ 		} 
44+ 	} 
45+ } 
0 commit comments