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.
This commit is contained in:
Zamil Majdy
2026-02-10 11:15:10 +04:00
parent 8fd13ade74
commit 1a1985186a
2 changed files with 9 additions and 0 deletions

View File

@@ -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",
)

View File

@@ -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