diff --git a/src/features/skill-mcp-manager/oauth-handler.ts b/src/features/skill-mcp-manager/oauth-handler.ts index 5e76a2f81..d1b2b7513 100644 --- a/src/features/skill-mcp-manager/oauth-handler.ts +++ b/src/features/skill-mcp-manager/oauth-handler.ts @@ -116,3 +116,42 @@ export async function handleStepUpIfNeeded(params: { return false } } + +export async function handlePostRequestAuthError(params: { + error: Error + config: ClaudeCodeMcpServer + authProviders: Map + createOAuthProvider?: OAuthProviderFactory + refreshAttempted?: Set +}): Promise { + const { error, config, authProviders, createOAuthProvider, refreshAttempted = new Set() } = params + + if (!config.oauth || !config.url) { + return false + } + + const statusMatch = /\b(401|403)\b/.exec(error.message) + if (!statusMatch) { + return false + } + + const provider = getOrCreateAuthProvider(authProviders, config.url, config.oauth, createOAuthProvider) + const tokenData = provider.tokens() + + if (!tokenData?.refreshToken) { + return false + } + + if (refreshAttempted.has(config.url)) { + return false + } + + refreshAttempted.add(config.url) + + try { + await provider.refresh(tokenData.refreshToken) + return true + } catch { + return false + } +}