()
| 2035 | } |
| 2036 | |
| 2037 | async discoveryState(): Promise<OAuthDiscoveryState | undefined> { |
| 2038 | const storage = getSecureStorage() |
| 2039 | const data = storage.read() |
| 2040 | const serverKey = getServerKey(this.serverName, this.serverConfig) |
| 2041 | |
| 2042 | const cached = data?.mcpOAuth?.[serverKey]?.discoveryState |
| 2043 | if (cached?.authorizationServerUrl) { |
| 2044 | logMCPDebug( |
| 2045 | this.serverName, |
| 2046 | `Returning cached discovery state (authServer: ${cached.authorizationServerUrl})`, |
| 2047 | ) |
| 2048 | |
| 2049 | return { |
| 2050 | authorizationServerUrl: cached.authorizationServerUrl, |
| 2051 | resourceMetadataUrl: cached.resourceMetadataUrl, |
| 2052 | resourceMetadata: |
| 2053 | cached.resourceMetadata as OAuthDiscoveryState['resourceMetadata'], |
| 2054 | authorizationServerMetadata: |
| 2055 | cached.authorizationServerMetadata as OAuthDiscoveryState['authorizationServerMetadata'], |
| 2056 | } |
| 2057 | } |
| 2058 | |
| 2059 | // Check config hint for direct metadata URL |
| 2060 | const metadataUrl = this.serverConfig.oauth?.authServerMetadataUrl |
| 2061 | if (metadataUrl) { |
| 2062 | logMCPDebug( |
| 2063 | this.serverName, |
| 2064 | `Fetching metadata from configured URL: ${metadataUrl}`, |
| 2065 | ) |
| 2066 | try { |
| 2067 | const metadata = await fetchAuthServerMetadata( |
| 2068 | this.serverName, |
| 2069 | this.serverConfig.url, |
| 2070 | metadataUrl, |
| 2071 | ) |
| 2072 | if (metadata) { |
| 2073 | return { |
| 2074 | authorizationServerUrl: metadata.issuer, |
| 2075 | authorizationServerMetadata: |
| 2076 | metadata as OAuthDiscoveryState['authorizationServerMetadata'], |
| 2077 | } |
| 2078 | } |
| 2079 | } catch (error) { |
| 2080 | logMCPDebug( |
| 2081 | this.serverName, |
| 2082 | `Failed to fetch from configured metadata URL: ${errorMessage(error)}`, |
| 2083 | ) |
| 2084 | } |
| 2085 | } |
| 2086 | |
| 2087 | return undefined |
| 2088 | } |
| 2089 | |
| 2090 | async refreshAuthorization( |
| 2091 | refreshToken: string, |
no test coverage detected