From 79c534ecec7d4e678769b659609edf35aedffe36 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 13:09:16 +0000 Subject: [PATCH] refactor(proxy): resolve MCP display names for 403 detail in a single DB lookup Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../object_permission_utils.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/litellm/proxy/management_helpers/object_permission_utils.py b/litellm/proxy/management_helpers/object_permission_utils.py index 64e82e81996..f55cf234b33 100644 --- a/litellm/proxy/management_helpers/object_permission_utils.py +++ b/litellm/proxy/management_helpers/object_permission_utils.py @@ -300,10 +300,10 @@ async def _resolve_mcp_server_identifiers_to_ids( return resolved -async def _mcp_server_display_names( +async def _mcp_server_display_name_map( server_ids: AbstractSet[str], prisma_client: PrismaClient | None, -) -> list[str]: +) -> Mapping[str, str]: """ Map MCP server IDs to human-readable names for error messages. @@ -331,8 +331,7 @@ async def _mcp_server_display_names( ) } ) - id_to_name: Final = MappingProxyType({**registry_names, **db_names}) - return sorted(id_to_name.get(server_id, server_id) for server_id in server_ids) + return MappingProxyType({**registry_names, **db_names}) _MCP_TOOL_PERMISSIONS_ADAPTER: Final = TypeAdapter(dict[str, list[str] | None]) @@ -729,18 +728,19 @@ async def validate_key_mcp_servers_against_team( ) disallowed_servers: Final = active_requested_servers - allowed_servers - grandfathered_servers if disallowed_servers: - disallowed_names: Final = await _mcp_server_display_names( - server_ids=disallowed_servers, + display_names: Final = await _mcp_server_display_name_map( + server_ids=disallowed_servers | team_allowed_servers | allow_all_keys_servers, prisma_client=prisma_client, ) - allow_all_names: Final = await _mcp_server_display_names( - server_ids=allow_all_keys_servers, - prisma_client=prisma_client, + disallowed_names: Final = sorted( + display_names.get(server_id, server_id) for server_id in disallowed_servers + ) + allow_all_names: Final = sorted( + display_names.get(server_id, server_id) for server_id in allow_all_keys_servers ) if team_obj is not None: - team_allowed_names: Final = await _mcp_server_display_names( - server_ids=team_allowed_servers, - prisma_client=prisma_client, + team_allowed_names: Final = sorted( + display_names.get(server_id, server_id) for server_id in team_allowed_servers ) team_display: Final = team_obj.team_alias or team_obj.team_id detail = (