Skip to content

Commit c5b9d49

Browse files
committed
feat: #479 support for streamable http MCP servers for MCPToolset
1 parent 0299020 commit c5b9d49

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ dependencies = [
3535
"google-cloud-storage>=2.18.0, <3.0.0", # For GCS Artifact service
3636
"google-genai>=1.12.1", # Google GenAI SDK
3737
"graphviz>=0.20.2", # Graphviz for graph rendering
38-
"mcp>=1.5.0;python_version>='3.10'", # For MCP Toolset
38+
"mcp>=1.8.0;python_version>='3.10'", # For MCP Toolset
3939
"opentelemetry-api>=1.31.0", # OpenTelemetry
4040
"opentelemetry-exporter-gcp-trace>=1.9.0",
4141
"opentelemetry-sdk>=1.31.0",

src/google/adk/tools/mcp_tool/mcp_session_manager.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from contextlib import AsyncExitStack
1616
import functools
1717
import sys
18+
from datetime import timedelta
1819
from typing import Any, TextIO
1920
import anyio
2021
from pydantic import BaseModel
@@ -23,6 +24,7 @@
2324
from mcp import ClientSession, StdioServerParameters
2425
from mcp.client.sse import sse_client
2526
from mcp.client.stdio import stdio_client
27+
from mcp.client.streamable_http import streamablehttp_client
2628
except ImportError as e:
2729
import sys
2830

@@ -48,6 +50,19 @@ class SseServerParams(BaseModel):
4850
sse_read_timeout: float = 60 * 5
4951

5052

53+
class StreamableHTTPServerParams(BaseModel):
54+
"""Parameters for the MCP SSE connection.
55+
56+
See MCP SSE Client documentation for more details.
57+
https://github.com/modelcontextprotocol/python-sdk/blob/main/src/mcp/client/streamable_http.py
58+
"""
59+
url: str
60+
headers: dict[str, Any] | None = None
61+
timeout: float = 5
62+
sse_read_timeout: float = 60 * 5
63+
terminate_on_close: bool = True
64+
65+
5166
def retry_on_closed_resource(async_reinit_func_name: str):
5267
"""Decorator to automatically reinitialize session and retry action.
5368
@@ -117,7 +132,7 @@ class MCPSessionManager:
117132

118133
def __init__(
119134
self,
120-
connection_params: StdioServerParameters | SseServerParams,
135+
connection_params: StdioServerParameters | SseServerParams | StreamableHTTPServerParams,
121136
exit_stack: AsyncExitStack,
122137
errlog: TextIO = sys.stderr,
123138
) -> ClientSession:
@@ -153,7 +168,7 @@ async def create_session(self) -> ClientSession:
153168
async def initialize_session(
154169
cls,
155170
*,
156-
connection_params: StdioServerParameters | SseServerParams,
171+
connection_params: StdioServerParameters | SseServerParams | StreamableHTTPServerParams,
157172
exit_stack: AsyncExitStack,
158173
errlog: TextIO = sys.stderr,
159174
) -> ClientSession:
@@ -177,6 +192,14 @@ async def initialize_session(
177192
timeout=connection_params.timeout,
178193
sse_read_timeout=connection_params.sse_read_timeout,
179194
)
195+
elif isinstance(connection_params, StreamableHTTPServerParams):
196+
client = streamablehttp_client(
197+
url=connection_params.url,
198+
headers=connection_params.headers,
199+
timeout=timedelta(seconds=connection_params.timeout),
200+
sse_read_timeout=timedelta(seconds=connection_params.sse_read_timeout),
201+
terminate_on_close=connection_params.terminate_on_close,
202+
)
180203
else:
181204
raise ValueError(
182205
'Unable to initialize connection. Connection should be'
@@ -185,6 +208,6 @@ async def initialize_session(
185208
)
186209

187210
transports = await exit_stack.enter_async_context(client)
188-
session = await exit_stack.enter_async_context(ClientSession(*transports))
211+
session = await exit_stack.enter_async_context(ClientSession(*transports[:2]))
189212
await session.initialize()
190213
return session

0 commit comments

Comments
 (0)