Skip to content

Commit 0502200

Browse files
committed
fix: include mcp_tool_permissions server ids in allowed mcp servers
when a key/team/end-user has mcp_tool_permissions for a server but that server is not in mcp_servers, the server was excluded from the allowed list — making the tool permissions useless. now we union the keys from mcp_tool_permissions into the allowed server set alongside direct servers and access group servers. fixes #21954
1 parent ea5d551 commit 0502200

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

litellm/proxy/_experimental/mcp_server/auth/user_api_key_auth_mcp.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -649,8 +649,13 @@ async def _get_allowed_mcp_servers_for_key(
649649
)
650650
)
651651

652-
# Combine both lists
653-
all_servers = direct_mcp_servers + access_group_servers
652+
# servers referenced in tool permissions should also be accessible
653+
tool_perm_servers = list(
654+
(key_object_permission.mcp_tool_permissions or {}).keys()
655+
)
656+
657+
# Combine all lists
658+
all_servers = direct_mcp_servers + access_group_servers + tool_perm_servers
654659
return list(set(all_servers))
655660
except Exception as e:
656661
verbose_logger.warning(
@@ -686,8 +691,13 @@ async def _get_allowed_mcp_servers_for_team(
686691
)
687692
)
688693

689-
# Combine both lists
690-
all_servers = direct_mcp_servers + access_group_servers
694+
# servers referenced in tool permissions should also be accessible
695+
tool_perm_servers = list(
696+
(object_permissions.mcp_tool_permissions or {}).keys()
697+
)
698+
699+
# Combine all lists
700+
all_servers = direct_mcp_servers + access_group_servers + tool_perm_servers
691701
return list(set(all_servers))
692702
except Exception as e:
693703
verbose_logger.warning(
@@ -737,17 +747,20 @@ async def _get_allowed_mcp_servers_for_end_user(
737747
# Get direct MCP servers
738748
direct_mcp_servers = end_user_obj.object_permission.mcp_servers or []
739749

740-
741-
742750
# Get MCP servers from access groups
743751
access_group_servers = (
744752
await MCPRequestHandler._get_mcp_servers_from_access_groups(
745753
end_user_obj.object_permission.mcp_access_groups or []
746754
)
747755
)
748756

749-
# Combine both lists
750-
all_servers = direct_mcp_servers + access_group_servers
757+
# servers referenced in tool permissions should also be accessible
758+
tool_perm_servers = list(
759+
(end_user_obj.object_permission.mcp_tool_permissions or {}).keys()
760+
)
761+
762+
# Combine all lists
763+
all_servers = direct_mcp_servers + access_group_servers + tool_perm_servers
751764
return list(set(all_servers))
752765
except Exception as e:
753766
verbose_logger.warning(

tests/test_litellm/proxy/_experimental/mcp_server/auth/test_user_api_key_auth_mcp.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,3 +1738,34 @@ async def test_get_allowed_tools_for_server_agent_no_restriction(self):
17381738
user_api_key_auth=user_api_key_auth,
17391739
)
17401740
assert sorted(result) == ["tool_a", "tool_b"]
1741+
1742+
1743+
@pytest.mark.asyncio
1744+
async def test_tool_permission_servers_included_in_allowed_servers():
1745+
"""
1746+
Servers listed only in mcp_tool_permissions (not in mcp_servers)
1747+
should still be accessible.
1748+
1749+
Regression test for https://github.com/BerriAI/litellm/issues/21954
1750+
"""
1751+
perm = MagicMock()
1752+
perm.mcp_servers = []
1753+
perm.mcp_access_groups = []
1754+
perm.mcp_tool_permissions = {"server_id_123": ["tool_a", "tool_b"]}
1755+
1756+
user_api_key_auth = UserAPIKeyAuth(
1757+
api_key="test-key",
1758+
user_id="test-user",
1759+
)
1760+
1761+
with patch.object(
1762+
MCPRequestHandler, "_get_key_object_permission", return_value=perm
1763+
), patch.object(
1764+
MCPRequestHandler, "_get_mcp_servers_from_access_groups",
1765+
new_callable=AsyncMock,
1766+
return_value=[],
1767+
):
1768+
result = await MCPRequestHandler._get_allowed_mcp_servers_for_key(
1769+
user_api_key_auth=user_api_key_auth,
1770+
)
1771+
assert "server_id_123" in result

0 commit comments

Comments
 (0)