55
66from mcp import StdioServerParameters , stdio_client
77from mcp .shared .message import SessionMessage
8- from mcp .types import JSONRPCError , JSONRPCMessage , JSONRPCRequest , JSONRPCResponse
8+ from mcp .types import (
9+ ErrorData ,
10+ JSONRPCError ,
11+ JSONRPCMessage ,
12+ JSONRPCRequest ,
13+ JSONRPCResponse ,
14+ )
915from opentelemetry import trace
1016from uipath import UiPath
1117
@@ -31,7 +37,8 @@ def __init__(self, server_config: McpServer, session_id: str):
3137 self ._run_task = None
3238 self ._message_queue = asyncio .Queue ()
3339 self ._active_requests : Dict [str , str ] = {}
34- self ._last_request_id : None
40+ self ._last_request_id = None
41+ self ._last_message_id = None
3542 self ._uipath = UiPath ()
3643 self ._mcp_tracer = McpTracer (tracer , logger )
3744 self ._server_stderr_output : Optional [str ] = None
@@ -122,11 +129,17 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
122129 session_message = None
123130 try :
124131 session_message = await self ._read_stream .receive ()
132+ if isinstance (session_message , Exception ):
133+ logger .error (f"Received error: { session_message } " )
134+ continue
125135 message = session_message .message
126136 # For responses, determine which request_id to use
127137 if self ._is_response (message ):
128138 message_id = self ._get_message_id (message )
129- if message_id and message_id in self ._active_requests :
139+ if (
140+ message_id
141+ and message_id in self ._active_requests
142+ ):
130143 # Use the stored request_id for this response
131144 request_id = self ._active_requests [message_id ]
132145 # Send with the matched request_id
@@ -140,7 +153,9 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
140153 )
141154 else :
142155 # For non-responses, use the last known request_id
143- await self ._send_message (message , self ._last_request_id )
156+ await self ._send_message (
157+ message , self ._last_request_id
158+ )
144159 except Exception as e :
145160 if session_message :
146161 logger .info (session_message )
@@ -149,12 +164,20 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
149164 exc_info = True ,
150165 )
151166 await self ._send_message (
152- JSONRPCError (
153- code = - 32000 ,
154- message = f"Error processing message: { session_message } { e } " ,
167+ JSONRPCMessage (
168+ root = JSONRPCError (
169+ jsonrpc = "2.0" ,
170+ # Use the last known message id for error reporting
171+ id = self ._last_message_id ,
172+ error = ErrorData (
173+ code = - 32000 ,
174+ message = f"Error processing message: { e } " ,
175+ ),
176+ )
155177 ),
156178 self ._last_request_id ,
157179 )
180+ continue
158181 finally :
159182 # Cancel the consumer when we exit the loop
160183 consumer_task .cancel ()
@@ -267,6 +290,7 @@ async def _get_messages_internal(self, request_id: str) -> None:
267290 if self ._is_request (json_message ):
268291 message_id = self ._get_message_id (json_message )
269292 if message_id :
293+ self ._last_message_id = message_id
270294 self ._active_requests [message_id ] = request_id
271295 with self ._mcp_tracer .create_span_for_message (
272296 json_message ,
0 commit comments