3
3
import tempfile
4
4
from typing import Dict , Optional
5
5
6
- import mcp .types as types
7
6
from mcp import StdioServerParameters , stdio_client
7
+ from mcp .shared .message import SessionMessage
8
+ from mcp .types import JSONRPCError , JSONRPCMessage , JSONRPCRequest , JSONRPCResponse
8
9
from opentelemetry import trace
9
10
from uipath import UiPath
10
11
@@ -118,8 +119,8 @@ async def _run_server(self, server_params: StdioServerParameters) -> None:
118
119
try :
119
120
while True :
120
121
# Get message from local server
121
- message = await self ._read_stream .receive ()
122
-
122
+ session_message = await self ._read_stream .receive ()
123
+ message = session_message . message
123
124
# For responses, determine which request_id to use
124
125
if self ._is_response (message ):
125
126
message_id = self ._get_message_id (message )
@@ -180,7 +181,7 @@ async def _consume_messages(self):
180
181
logger .info (
181
182
f"Session { self ._session_id } - processing queued message: { message } ..."
182
183
)
183
- await self ._write_stream .send (message )
184
+ await self ._write_stream .send (SessionMessage ( message = message ) )
184
185
except Exception as e :
185
186
logger .error (
186
187
f"Error processing message for session { self ._session_id } : { e } "
@@ -196,9 +197,7 @@ async def _consume_messages(self):
196
197
except asyncio .QueueEmpty :
197
198
break
198
199
199
- async def _send_message (
200
- self , message : types .JSONRPCMessage , request_id : str
201
- ) -> None :
200
+ async def _send_message (self , message : JSONRPCMessage , request_id : str ) -> None :
202
201
"""Send new message to UiPath MCP Server."""
203
202
with self ._mcp_tracer .create_span_for_message (
204
203
message ,
@@ -224,7 +223,7 @@ async def _send_message(
224
223
raise
225
224
226
225
async def _send_message_internal (
227
- self , message : types . JSONRPCMessage , request_id : str
226
+ self , message : JSONRPCMessage , request_id : str
228
227
) -> None :
229
228
response = await self ._uipath .api_client .request_async (
230
229
"POST" ,
@@ -246,7 +245,7 @@ async def _get_messages_internal(self, request_id: str) -> None:
246
245
messages = response .json ()
247
246
for message in messages :
248
247
logger .info (f"Received message: { message } " )
249
- json_message = types . JSONRPCMessage .model_validate (message )
248
+ json_message = JSONRPCMessage .model_validate (message )
250
249
if self ._is_request (json_message ):
251
250
message_id = self ._get_message_id (json_message )
252
251
if message_id :
@@ -261,23 +260,21 @@ async def _get_messages_internal(self, request_id: str) -> None:
261
260
elif 500 <= response .status_code < 600 :
262
261
raise Exception (f"{ response .status_code } - { response .text } " )
263
262
264
- def _is_request (self , message : types . JSONRPCMessage ) -> bool :
263
+ def _is_request (self , message : JSONRPCMessage ) -> bool :
265
264
"""Check if a message is a JSONRPCRequest."""
266
265
if hasattr (message , "root" ):
267
266
root = message .root
268
- return isinstance (root , types . JSONRPCRequest )
267
+ return isinstance (root , JSONRPCRequest )
269
268
return False
270
269
271
- def _is_response (self , message : types . JSONRPCMessage ) -> bool :
270
+ def _is_response (self , message : JSONRPCMessage ) -> bool :
272
271
"""Check if a message is a JSONRPCResponse or JSONRPCError."""
273
272
if hasattr (message , "root" ):
274
273
root = message .root
275
- return isinstance (root , types .JSONRPCResponse ) or isinstance (
276
- root , types .JSONRPCError
277
- )
274
+ return isinstance (root , JSONRPCResponse ) or isinstance (root , JSONRPCError )
278
275
return False
279
276
280
- def _get_message_id (self , message : types . JSONRPCMessage ) -> str :
277
+ def _get_message_id (self , message : JSONRPCMessage ) -> str :
281
278
"""Extract the message id from a JSONRPCMessage."""
282
279
if hasattr (message , "root" ) and hasattr (message .root , "id" ):
283
280
return str (message .root .id )
0 commit comments