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.
This commit is contained in:
Zamil Majdy
2026-02-10 09:04:38 +04:00
parent 4c02cd8f2f
commit 7744b89e96
3 changed files with 7 additions and 7 deletions

View File

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

View File

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

View File

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