From 1a1985186ad6f4e244d456693ce664011c284b96 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Tue, 10 Feb 2026 11:15:10 +0400 Subject: [PATCH] fix(mcp): Normalize credential input_data for JSON schema validation The model_validator on CredentialsMetaInput normalizes legacy "ProviderName.MCP" format for Pydantic validation, but validate_data() uses raw JSON schema which bypasses Pydantic. Write normalized values back to input_data after Pydantic processes them so both validation paths see correct data. --- autogpt_platform/backend/backend/data/graph_test.py | 6 ++++++ autogpt_platform/backend/backend/executor/manager.py | 3 +++ 2 files changed, 9 insertions(+) diff --git a/autogpt_platform/backend/backend/data/graph_test.py b/autogpt_platform/backend/backend/data/graph_test.py index 1e4a2246a2..7a545cf11e 100644 --- a/autogpt_platform/backend/backend/data/graph_test.py +++ b/autogpt_platform/backend/backend/data/graph_test.py @@ -479,12 +479,14 @@ def test_mcp_credential_combine_different_servers(): field_sentry = CredentialsFieldInfo( credentials_provider=frozenset([ProviderName.MCP]), credentials_types=frozenset(["oauth2"]), + credentials_scopes=None, discriminator="server_url", discriminator_values={"https://mcp.sentry.dev/mcp"}, ) field_linear = CredentialsFieldInfo( credentials_provider=frozenset([ProviderName.MCP]), credentials_types=frozenset(["oauth2"]), + credentials_scopes=None, discriminator="server_url", discriminator_values={"https://mcp.linear.app/mcp"}, ) @@ -519,12 +521,14 @@ def test_mcp_credential_combine_same_server(): field_a = CredentialsFieldInfo( credentials_provider=frozenset([ProviderName.MCP]), credentials_types=frozenset(["oauth2"]), + credentials_scopes=None, discriminator="server_url", discriminator_values={"https://mcp.sentry.dev/mcp"}, ) field_b = CredentialsFieldInfo( credentials_provider=frozenset([ProviderName.MCP]), credentials_types=frozenset(["oauth2"]), + credentials_scopes=None, discriminator="server_url", discriminator_values={"https://mcp.sentry.dev/mcp"}, ) @@ -550,11 +554,13 @@ def test_mcp_credential_combine_no_discriminator_values(): field_a = CredentialsFieldInfo( credentials_provider=frozenset([ProviderName.MCP]), credentials_types=frozenset(["oauth2"]), + credentials_scopes=None, discriminator="server_url", ) field_b = CredentialsFieldInfo( credentials_provider=frozenset([ProviderName.MCP]), credentials_types=frozenset(["oauth2"]), + credentials_scopes=None, discriminator="server_url", ) diff --git a/autogpt_platform/backend/backend/executor/manager.py b/autogpt_platform/backend/backend/executor/manager.py index b1daabd0ee..d58a9fae7c 100644 --- a/autogpt_platform/backend/backend/executor/manager.py +++ b/autogpt_platform/backend/backend/executor/manager.py @@ -277,6 +277,9 @@ async def execute_node( continue # No credentials configured — block runs without credentials_meta = input_type(**field_value) + # Write normalized values back so JSON schema validation also passes + # (model_validator may have fixed legacy formats like "ProviderName.MCP") + input_data[field_name] = credentials_meta.model_dump(mode="json") credentials, lock = await creds_manager.acquire(user_id, credentials_meta.id) creds_locks.append(lock) extra_exec_kwargs[field_name] = credentials