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