Skip to content

Commit d276f03

Browse files
committed
Merge pull request 'fix: chat hangs after error in mcp sse_reader' (#371) from chat-hangs into main
Reviewed-on: https://git.biggo.com/Funmula/dive-mcp-host/pulls/371
2 parents 3f5eddf + bc24848 commit d276f03

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

dive_mcp_host/host/errors.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ def __init__(
3939
self.query = query
4040
self.state_values = state_values
4141
self.error = error
42-
super().__init__(f"Error in query, {error}")
42+
super().__init__(
43+
f"Error in query, type: {type(self.error).__name__}, content: {error}"
44+
)
4345

4446

4547
class GraphNotCompiledError(MCPHostError):

dive_mcp_host/host/tools/mcp_server.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
4141
from mcp.shared.message import SessionMessage
42+
from mcp.shared.session import RequestResponder
4243

4344
from dive_mcp_host.host.conf import ServerConfig
4445

@@ -141,6 +142,28 @@ def __init__(
141142
else:
142143
raise InvalidMcpServerError(self.config.name, "Invalid server config")
143144

145+
async def _message_handler(
146+
self,
147+
message: RequestResponder[types.ServerRequest, types.ClientResult]
148+
| types.ServerNotification
149+
| Exception,
150+
) -> None:
151+
"""Used for handling mcp special responses.
152+
153+
Such as:
154+
- Exception (Literal python exception)
155+
- ProgressResult (ServerNotification) ... etc
156+
"""
157+
logger.info(
158+
"handling message for %s, type: %s, content: %s",
159+
self.name,
160+
type(message).__name__,
161+
message,
162+
)
163+
164+
if isinstance(message, Exception):
165+
raise message
166+
144167
async def _init_tool_info(self, session: ClientSession) -> None:
145168
"""Initialize the session."""
146169
async with asyncio.timeout(10):
@@ -331,7 +354,9 @@ async def _stdio_client_watcher(self) -> None: # noqa: C901, PLR0915
331354
),
332355
errlog=self._stderr_log_proxy,
333356
) as (stream_read, stream_send, pid),
334-
ClientSession(stream_read, stream_send) as session,
357+
ClientSession(
358+
stream_read, stream_send, message_handler=self._message_handler
359+
) as session,
335360
):
336361
self._session = session
337362
self._pid = pid
@@ -363,6 +388,7 @@ async def _stdio_client_watcher(self) -> None: # noqa: C901, PLR0915
363388
httpx.ConnectError,
364389
httpx.InvalidURL,
365390
httpx.TooManyRedirects,
391+
httpx.ConnectTimeout,
366392
) as eg:
367393
err_msg = (
368394
f"Client initialization error for {self.name}: {eg.exceptions}"
@@ -550,7 +576,6 @@ def _http_get_client(
550576
key: value.get_secret_value()
551577
for key, value in self.config.headers.items()
552578
},
553-
sse_read_timeout=0.1,
554579
)
555580
if self.config.transport == "websocket":
556581
return websocket_client(
@@ -564,7 +589,7 @@ async def _http_init_client(self) -> None:
564589
"""Initialize the HTTP client."""
565590
async with (
566591
self._http_get_client() as streams,
567-
ClientSession(*streams) as session,
592+
ClientSession(*streams, message_handler=self._message_handler) as session,
568593
):
569594
await self._init_tool_info(session)
570595

@@ -639,7 +664,9 @@ async def session_ctx() -> AsyncGenerator[ClientSession, None]:
639664
"""
640665
async with (
641666
self._http_get_client() as streams,
642-
ClientSession(*streams) as session,
667+
ClientSession(
668+
*streams, message_handler=self._message_handler
669+
) as session,
643670
self._session_wrapper(),
644671
):
645672
await session.initialize()
@@ -750,7 +777,9 @@ async def session_ctx() -> AsyncGenerator[ClientSession, None]:
750777
"""
751778
async with (
752779
self._http_get_client() as streams,
753-
ClientSession(*streams) as session,
780+
ClientSession(
781+
*streams, message_handler=self._message_handler
782+
) as session,
754783
self._session_wrapper(
755784
restart_client=lambda e: isinstance(e, httpx.ConnectError)
756785
),

0 commit comments

Comments
 (0)