From 7744b89e96bbc6242e254654e41680ecf8400320 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Tue, 10 Feb 2026 09:04:38 +0400 Subject: [PATCH] fix(mcp): Use ProviderName.MCP.value instead of str() for credential provider Python 3.13 changed str(StrEnum) to return "ClassName.MEMBER" instead of the plain value. This caused MCP credentials to be stored with provider "ProviderName.MCP" instead of "mcp", leading to type/provider mismatch errors during graph validation and execution. --- .../backend/backend/api/features/mcp/routes.py | 8 ++++---- autogpt_platform/backend/backend/blocks/mcp/oauth.py | 4 ++-- .../backend/backend/integrations/creds_manager.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/autogpt_platform/backend/backend/api/features/mcp/routes.py b/autogpt_platform/backend/backend/api/features/mcp/routes.py index 6f517c52f4..275d603add 100644 --- a/autogpt_platform/backend/backend/api/features/mcp/routes.py +++ b/autogpt_platform/backend/backend/api/features/mcp/routes.py @@ -80,7 +80,7 @@ async def discover_tools( if not auth_token: try: mcp_creds = await creds_manager.store.get_creds_by_provider( - user_id, str(ProviderName.MCP) + user_id, ProviderName.MCP.value ) # Find the freshest credential for this server URL best_cred: OAuth2Credentials | None = None @@ -250,7 +250,7 @@ async def mcp_oauth_login( ) state_token, code_challenge = await creds_manager.store.store_state_token( user_id, - str(ProviderName.MCP), + ProviderName.MCP.value, scopes, state_metadata={ "authorize_url": authorize_url, @@ -308,7 +308,7 @@ async def mcp_oauth_callback( will automatically use the stored credential. """ valid_state = await creds_manager.store.verify_state_token( - user_id, request.state_token, str(ProviderName.MCP) + user_id, request.state_token, ProviderName.MCP.value ) if not valid_state: raise fastapi.HTTPException( @@ -356,7 +356,7 @@ async def mcp_oauth_callback( # Remove old MCP credentials for the same server to prevent stale token buildup try: old_creds = await creds_manager.store.get_creds_by_provider( - user_id, str(ProviderName.MCP) + user_id, ProviderName.MCP.value ) for old in old_creds: if ( diff --git a/autogpt_platform/backend/backend/blocks/mcp/oauth.py b/autogpt_platform/backend/backend/blocks/mcp/oauth.py index 8cce1099e5..9636c42e8b 100644 --- a/autogpt_platform/backend/backend/blocks/mcp/oauth.py +++ b/autogpt_platform/backend/backend/blocks/mcp/oauth.py @@ -113,7 +113,7 @@ class MCPOAuthHandler(BaseOAuthHandler): expires_in = tokens.get("expires_in") return OAuth2Credentials( - provider=str(self.PROVIDER_NAME), + provider=getattr(self.PROVIDER_NAME, "value", self.PROVIDER_NAME), title=None, access_token=SecretStr(tokens["access_token"]), refresh_token=( @@ -163,7 +163,7 @@ class MCPOAuthHandler(BaseOAuthHandler): return OAuth2Credentials( id=credentials.id, - provider=str(self.PROVIDER_NAME), + provider=getattr(self.PROVIDER_NAME, "value", self.PROVIDER_NAME), title=credentials.title, access_token=SecretStr(tokens["access_token"]), refresh_token=( diff --git a/autogpt_platform/backend/backend/integrations/creds_manager.py b/autogpt_platform/backend/backend/integrations/creds_manager.py index ea5d92087b..bd5203eaeb 100644 --- a/autogpt_platform/backend/backend/integrations/creds_manager.py +++ b/autogpt_platform/backend/backend/integrations/creds_manager.py @@ -137,7 +137,7 @@ class IntegrationCredentialsManager: self, user_id: str, credentials: OAuth2Credentials, lock: bool = True ) -> OAuth2Credentials: async with self._locked(user_id, credentials.id, "refresh"): - if credentials.provider == str(ProviderName.MCP): + if credentials.provider == ProviderName.MCP.value: oauth_handler = _create_mcp_oauth_handler(credentials) else: oauth_handler = await _get_provider_oauth_handler(credentials.provider)