Repository navigation
Return Clear error message why no tools are available / IP Filtering occured #22142
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,9 +10,9 @@ | |
| ) | ||
| from litellm.proxy._experimental.mcp_server.utils import merge_mcp_headers | ||
| from litellm.proxy._types import UserAPIKeyAuth | ||
| from litellm.proxy.common_utils.http_parsing_utils import _safe_get_request_headers | ||
| from litellm.proxy.auth.ip_address_utils import IPAddressUtils | ||
| from litellm.proxy.auth.user_api_key_auth import user_api_key_auth | ||
| from litellm.proxy.common_utils.http_parsing_utils import _safe_get_request_headers | ||
| from litellm.types.mcp import MCPAuth | ||
| from litellm.types.utils import CallTypes | ||
|
|
||
|
|
@@ -283,8 +283,10 @@ async def list_tool_rest_api( | |
| ) | ||
| allowed_server_ids_set.update(servers) | ||
|
|
||
| allowed_server_ids = global_mcp_server_manager.filter_server_ids_by_ip( | ||
| list(allowed_server_ids_set), _rest_client_ip | ||
| allowed_server_ids, _ip_blocked_count = ( | ||
| global_mcp_server_manager.filter_server_ids_by_ip_with_info( | ||
| list(allowed_server_ids_set), _rest_client_ip | ||
| ) | ||
| ) | ||
|
|
||
| list_tools_result = [] | ||
|
|
@@ -293,6 +295,26 @@ async def list_tool_rest_api( | |
| # If server_id is specified, only query that specific server | ||
| if server_id: | ||
| if server_id not in allowed_server_ids: | ||
| _server = global_mcp_server_manager.get_mcp_server_by_id(server_id) | ||
| if ( | ||
| _server is not None | ||
| and _rest_client_ip is not None | ||
| and not global_mcp_server_manager._is_server_accessible_from_ip( | ||
| _server, _rest_client_ip | ||
| ) | ||
| ): | ||
| raise HTTPException( | ||
| status_code=403, | ||
| detail={ | ||
| "error": "ip_filtering", | ||
| "message": ( | ||
| f"MCP server '{server_id}' is not accessible from your IP address " | ||
| f"({_rest_client_ip}). This server is restricted to internal " | ||
| "networks only. To make it externally accessible, set " | ||
| "'available_on_public_internet: true' in the server configuration." | ||
| ), | ||
| }, | ||
| ) | ||
|
Comment on lines
+298
to
+317
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Redundant server lookup and private method access This block re-fetches the server via Consider instead checking whether the |
||
| raise HTTPException( | ||
| status_code=403, | ||
| detail={ | ||
|
|
@@ -330,6 +352,19 @@ async def list_tool_rest_api( | |
| } | ||
| else: | ||
| if not allowed_server_ids: | ||
| if _ip_blocked_count > 0: | ||
| raise HTTPException( | ||
| status_code=403, | ||
| detail={ | ||
| "error": "ip_filtering", | ||
| "message": ( | ||
| f"No MCP tools are available for your IP address ({_rest_client_ip}). " | ||
| f"{_ip_blocked_count} server(s) are restricted to internal networks only. " | ||
| "To make servers externally accessible, set " | ||
| "'available_on_public_internet: true' in the server configuration." | ||
| ), | ||
| }, | ||
| ) | ||
| raise HTTPException( | ||
| status_code=403, | ||
| detail={ | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -771,15 +771,25 @@ | |
| user_api_key_auth | ||
| ) | ||
| ) | ||
| allowed_mcp_server_ids = ( | ||
| global_mcp_server_manager.filter_server_ids_by_ip( | ||
| allowed_mcp_server_ids, _ip_blocked = ( | ||
| global_mcp_server_manager.filter_server_ids_by_ip_with_info( | ||
| allowed_mcp_server_ids, client_ip | ||
| ) | ||
| ) | ||
| verbose_logger.debug( | ||
| "MCP IP filter: client_ip=%s, allowed_server_ids=%s", | ||
| client_ip, allowed_mcp_server_ids, | ||
| ) | ||
| if _ip_blocked > 0: | ||
| verbose_logger.debug( | ||
| "MCP IP filtering: %d server(s) are not accessible from client IP %s " | ||
| "because they are restricted to internal networks. " | ||
| "No tools from those servers will be returned. " | ||
| "To expose a server externally, set 'available_on_public_internet: true' " | ||
| "in its configuration.", | ||
| _ip_blocked, | ||
Check failureCode scanning / CodeQL Clear-text logging of sensitive information High
This expression logs
sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expression logs sensitive data (secret) Error loading related location Loading This expression logs sensitive data (password) Error loading related location Loading This expres Copilot AutofixAI 8 months ago Copilot could not generate an autofix suggestion Copilot could not generate an autofix suggestion for this alert. Try pushing a new commit or if the problem persists contact support. |
||
| client_ip, | ||
| ) | ||
| allowed_mcp_servers: List[MCPServer] = [] | ||
| for allowed_mcp_server_id in allowed_mcp_server_ids: | ||
| mcp_server = global_mcp_server_manager.get_mcp_server_by_id( | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Error message exposes internal server configuration details
The error detail includes the client IP address, states that the server is "restricted to internal networks only", and tells the caller how to change the server configuration (
available_on_public_internet: true). This is appropriate for operator-facing logs but may reveal more than desired to external API consumers, especially the configuration key name. A similar concern applies to the all-servers case on line 361.Consider returning a more generic message to the API consumer (e.g., "Access denied for this server") and keeping the configuration hints in server-side logs only.