Skip to content

Commit 71b3289

Browse files
wukathcopybara-github
authored andcommitted
fix: Only prepend "https://" to the MCP server url if it doesn't already have a scheme
There isn't a consistent format for MCP server urls in the registry-- some customers add the https:// but others don't. To standardize, only prepend if it isn't there already. Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 846451152
1 parent f51b9b7 commit 71b3289

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

src/google/adk/tools/api_registry.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,13 @@ def get_toolset(
102102
mcp_server_url = server["urls"][0]
103103
headers = self._get_auth_headers()
104104

105+
# Only prepend "https://" if the URL doesn't already have a scheme
106+
if not mcp_server_url.startswith(("http://", "https://")):
107+
mcp_server_url = "https://" + mcp_server_url
108+
105109
return McpToolset(
106110
connection_params=StreamableHTTPConnectionParams(
107-
url="https://" + mcp_server_url,
111+
url=mcp_server_url,
108112
headers=headers,
109113
),
110114
tool_filter=tool_filter,

tests/unittests/tools/test_api_registry.py

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from unittest.mock import MagicMock
1919
from unittest.mock import patch
2020

21+
from google.adk.tools import api_registry
2122
from google.adk.tools.api_registry import ApiRegistry
2223
from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams
2324
import httpx
@@ -35,6 +36,14 @@
3536
{
3637
"name": "test-mcp-server-no-url",
3738
},
39+
{
40+
"name": "test-mcp-server-http",
41+
"urls": ["http://mcp.server_http.com"],
42+
},
43+
{
44+
"name": "test-mcp-server-https",
45+
"urls": ["https://mcp.server_https.com"],
46+
},
3847
]
3948
}
4049

@@ -70,10 +79,12 @@ def test_init_success(self, MockHttpClient):
7079
api_registry_project_id=self.project_id, location=self.location
7180
)
7281

73-
self.assertEqual(len(api_registry._mcp_servers), 3)
82+
self.assertEqual(len(api_registry._mcp_servers), 5)
7483
self.assertIn("test-mcp-server-1", api_registry._mcp_servers)
7584
self.assertIn("test-mcp-server-2", api_registry._mcp_servers)
7685
self.assertIn("test-mcp-server-no-url", api_registry._mcp_servers)
86+
self.assertIn("test-mcp-server-http", api_registry._mcp_servers)
87+
self.assertIn("test-mcp-server-https", api_registry._mcp_servers)
7788
mock_client_instance.get.assert_called_once_with(
7889
f"https://cloudapiregistry.googleapis.com/v1beta/projects/{self.project_id}/locations/{self.location}/mcpServers",
7990
headers={
@@ -95,10 +106,12 @@ def test_init_with_quota_project_id_success(self, MockHttpClient):
95106
api_registry_project_id=self.project_id, location=self.location
96107
)
97108

98-
self.assertEqual(len(api_registry._mcp_servers), 3)
109+
self.assertEqual(len(api_registry._mcp_servers), 5)
99110
self.assertIn("test-mcp-server-1", api_registry._mcp_servers)
100111
self.assertIn("test-mcp-server-2", api_registry._mcp_servers)
101112
self.assertIn("test-mcp-server-no-url", api_registry._mcp_servers)
113+
self.assertIn("test-mcp-server-http", api_registry._mcp_servers)
114+
self.assertIn("test-mcp-server-https", api_registry._mcp_servers)
102115
mock_client_instance.get.assert_called_once_with(
103116
f"https://cloudapiregistry.googleapis.com/v1beta/projects/{self.project_id}/locations/{self.location}/mcpServers",
104117
headers={
@@ -232,6 +245,41 @@ async def test_get_toolset_with_filter_and_prefix(
232245
)
233246
self.assertEqual(toolset, MockMcpToolset.return_value)
234247

248+
def test_get_toolset_url_scheme(self):
249+
params = [
250+
("test-mcp-server-http", "http://mcp.server_http.com"),
251+
("test-mcp-server-https", "https://mcp.server_https.com"),
252+
]
253+
for mock_server_name, mock_url in params:
254+
with self.subTest(server_name=mock_server_name):
255+
with (
256+
patch.object(httpx, "Client", autospec=True) as MockHttpClient,
257+
patch.object(
258+
api_registry, "McpToolset", autospec=True
259+
) as MockMcpToolset,
260+
):
261+
mock_response = create_autospec(httpx.Response, instance=True)
262+
mock_response.json.return_value = MOCK_MCP_SERVERS_LIST
263+
mock_client_instance = MockHttpClient.return_value
264+
mock_client_instance.__enter__.return_value = mock_client_instance
265+
mock_client_instance.get.return_value = mock_response
266+
267+
api_registry_instance = ApiRegistry(
268+
api_registry_project_id=self.project_id, location=self.location
269+
)
270+
271+
api_registry_instance.get_toolset(mock_server_name)
272+
273+
MockMcpToolset.assert_called_once_with(
274+
connection_params=StreamableHTTPConnectionParams(
275+
url=mock_url,
276+
headers={"Authorization": "Bearer mock_token"},
277+
),
278+
tool_filter=None,
279+
tool_name_prefix=None,
280+
header_provider=None,
281+
)
282+
235283
@patch("httpx.Client", autospec=True)
236284
async def test_get_toolset_server_not_found(self, MockHttpClient):
237285
mock_response = MagicMock()

0 commit comments

Comments
 (0)