Skip to content

Commit bb38e0b

Browse files
committed
mcp: bump sse timeout
5 seconds is too low for slow services
1 parent 8716d3c commit bb38e0b

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

src/redpanda/agents/_mcp.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
import json
1616
from contextlib import asynccontextmanager
17+
from datetime import timedelta
1718
from typing import Any, override
1819

1920
from mcp import ClientSession, Tool as MCPToolDef
2021
from mcp.client.sse import sse_client
2122
from mcp.client.stdio import StdioServerParameters, stdio_client
23+
from mcp.client.streamable_http import streamablehttp_client
2224
from mcp.client.websocket import websocket_client
2325
from mcp.shared.exceptions import McpError
2426
from opentelemetry import trace
@@ -100,6 +102,29 @@ def __init__(self, url: str, cache_enabled: bool = True):
100102
self.url = url
101103

102104

105+
class StreamableHTTPMCPEndpoint(MCPEndpoint):
106+
"""
107+
A MCP endpoint that communicates with an MCP server over HTTP streaming.
108+
"""
109+
110+
url: str
111+
112+
def __init__(self, url: str, cache_enabled: bool = True):
113+
"""
114+
Create a new WebsocketMCPEndpoint instance.
115+
116+
Args:
117+
url: The URL of the WebSocket server.
118+
cache_enabled: Whether to cache the list of {tools,resources,prompts} from the server.
119+
"""
120+
super().__init__(cache_enabled)
121+
self.url = url
122+
123+
@property
124+
def headers(self) -> dict[str, Any]:
125+
return {}
126+
127+
103128
@asynccontextmanager
104129
async def mcp_client(server: MCPEndpoint):
105130
"""
@@ -110,13 +135,19 @@ async def mcp_client(server: MCPEndpoint):
110135
async with ClientSession(read, write) as client:
111136
yield MCPClient(server, client)
112137
elif isinstance(server, SSEMCPEndpoint):
113-
async with sse_client(server.url, server.headers) as (read, write):
138+
async with sse_client(server.url, server.headers, timeout=30) as (read, write):
114139
async with ClientSession(read, write) as client:
115140
yield MCPClient(server, client)
116141
elif isinstance(server, WebsocketMCPEndpoint):
117142
async with websocket_client(server.url) as (read, write):
118143
async with ClientSession(read, write) as client:
119144
yield MCPClient(server, client)
145+
elif isinstance(server, StreamableHTTPMCPEndpoint):
146+
async with streamablehttp_client(
147+
server.url, server.headers, timeout=timedelta(seconds=30)
148+
) as (read, write, _get_session_id):
149+
async with ClientSession(read, write) as client:
150+
yield MCPClient(server, client)
120151
else:
121152
raise NotImplementedError(f"Unknown server type: {server}")
122153

0 commit comments

Comments
 (0)