5
5
6
6
from mcp import StdioServerParameters , stdio_client
7
7
from 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
+ )
9
15
from opentelemetry import trace
10
16
from uipath import UiPath
11
17
@@ -31,7 +37,8 @@ def __init__(self, server_config: McpServer, session_id: str):
31
37
self ._run_task = None
32
38
self ._message_queue = asyncio .Queue ()
33
39
self ._active_requests : Dict [str , str ] = {}
34
- self ._last_request_id : None
40
+ self ._last_request_id = None
41
+ self ._last_message_id = None
35
42
self ._uipath = UiPath ()
36
43
self ._mcp_tracer = McpTracer (tracer , logger )
37
44
self ._server_stderr_output : Optional [str ] = None
@@ -122,11 +129,17 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
122
129
session_message = None
123
130
try :
124
131
session_message = await self ._read_stream .receive ()
132
+ if isinstance (session_message , Exception ):
133
+ logger .error (f"Received error: { session_message } " )
134
+ continue
125
135
message = session_message .message
126
136
# For responses, determine which request_id to use
127
137
if self ._is_response (message ):
128
138
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
+ ):
130
143
# Use the stored request_id for this response
131
144
request_id = self ._active_requests [message_id ]
132
145
# Send with the matched request_id
@@ -140,7 +153,9 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
140
153
)
141
154
else :
142
155
# 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
+ )
144
159
except Exception as e :
145
160
if session_message :
146
161
logger .info (session_message )
@@ -149,12 +164,20 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
149
164
exc_info = True ,
150
165
)
151
166
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
+ )
155
177
),
156
178
self ._last_request_id ,
157
179
)
180
+ continue
158
181
finally :
159
182
# Cancel the consumer when we exit the loop
160
183
consumer_task .cancel ()
@@ -267,6 +290,7 @@ async def _get_messages_internal(self, request_id: str) -> None:
267
290
if self ._is_request (json_message ):
268
291
message_id = self ._get_message_id (json_message )
269
292
if message_id :
293
+ self ._last_message_id = message_id
270
294
self ._active_requests [message_id ] = request_id
271
295
with self ._mcp_tracer .create_span_for_message (
272
296
json_message ,
0 commit comments