fix(mcp): Auto-select credential and gracefully handle stale IDs

- Auto-select credential when exactly one match exists (even for
  optional fields). Only skip auto-select for optional fields with
  multiple choices.
- In executor, catch ValueError from creds_manager.acquire() for
  optional credential fields — fall back to running without credentials
  instead of crashing when stale IDs reference deleted credentials.
This commit is contained in:
Zamil Majdy
2026-02-10 11:25:06 +04:00
parent 27ba4e8e93
commit 4db27ca112
2 changed files with 18 additions and 2 deletions

View File

@@ -280,7 +280,21 @@ async def execute_node(
# 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)
try:
credentials, lock = await creds_manager.acquire(
user_id, credentials_meta.id
)
except ValueError:
# Credential was deleted or doesn't exist.
# If the field has a default, run without credentials.
if input_model.model_fields[field_name].default is not None:
log_metadata.warning(
f"Credentials #{credentials_meta.id} not found, "
"running without (field has default)"
)
input_data[field_name] = input_model.model_fields[field_name].default
continue
raise
creds_locks.append(lock)
extra_exec_kwargs[field_name] = credentials

View File

@@ -117,7 +117,9 @@ export function useCredentialsInput({
if (hasAttemptedAutoSelect.current) return;
hasAttemptedAutoSelect.current = true;
if (isOptional) return;
// Auto-select if exactly one credential matches.
// For optional fields with multiple options, let the user choose.
if (isOptional && savedCreds.length > 1) return;
const cred = savedCreds[0];
onSelectCredential({