mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-28 01:32:17 +00:00
fix(mcp): drop orphan user-field keys + reject duplicate field_keys
This commit is contained in:
parent
2cce538305
commit
5437285451
2 changed files with 30 additions and 1 deletions
|
|
@ -1268,6 +1268,24 @@ class MCPUserField(LiteLLMPydanticObjectBase):
|
|||
env_var_name: Optional[str] = None
|
||||
|
||||
|
||||
def _validate_unique_user_field_keys(
|
||||
user_fields: List[MCPUserField],
|
||||
) -> List[MCPUserField]:
|
||||
seen: set = set()
|
||||
duplicates: set = set()
|
||||
for entry in user_fields:
|
||||
key = entry.field_key
|
||||
if key in seen:
|
||||
duplicates.add(key)
|
||||
else:
|
||||
seen.add(key)
|
||||
if duplicates:
|
||||
raise ValueError(
|
||||
f"user_fields contains duplicate field_key values: {sorted(duplicates)}"
|
||||
)
|
||||
return user_fields
|
||||
|
||||
|
||||
class MCPUserFieldValuesRequest(LiteLLMPydanticObjectBase):
|
||||
"""Body for storing the calling user's values for an MCP server's user fields."""
|
||||
|
||||
|
|
@ -1368,6 +1386,11 @@ class NewMCPServerRequest(LiteLLMPydanticObjectBase):
|
|||
"""
|
||||
return values
|
||||
|
||||
@field_validator("user_fields")
|
||||
@classmethod
|
||||
def _user_fields_unique(cls, v: List[MCPUserField]) -> List[MCPUserField]:
|
||||
return _validate_unique_user_field_keys(v)
|
||||
|
||||
|
||||
class UpdateMCPServerRequest(LiteLLMPydanticObjectBase):
|
||||
server_id: str
|
||||
|
|
@ -1427,6 +1450,11 @@ class UpdateMCPServerRequest(LiteLLMPydanticObjectBase):
|
|||
)
|
||||
return values
|
||||
|
||||
@field_validator("user_fields")
|
||||
@classmethod
|
||||
def _user_fields_unique(cls, v: List[MCPUserField]) -> List[MCPUserField]:
|
||||
return _validate_unique_user_field_keys(v)
|
||||
|
||||
|
||||
class LiteLLM_MCPServerTable(LiteLLMPydanticObjectBase):
|
||||
"""Represents a LiteLLM_MCPServerTable record"""
|
||||
|
|
|
|||
|
|
@ -2166,8 +2166,9 @@ if MCP_AVAILABLE:
|
|||
user_fields.append(MCPUserField(**entry))
|
||||
except Exception: # noqa: BLE001 — drop malformed entries silently
|
||||
continue
|
||||
declared_keys = {f.field_key for f in user_fields}
|
||||
stored: Dict[str, str] = stored_values or {}
|
||||
stored_keys = [k for k, v in stored.items() if v]
|
||||
stored_keys = [k for k, v in stored.items() if v and k in declared_keys]
|
||||
missing_keys = [
|
||||
f.field_key
|
||||
for f in user_fields
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue