Skip to content

Commit 4f3160f

Browse files
authored
Merge pull request #117 from UiPath/fix/better_error_handling
fix: handle invalid stdout messages
2 parents 41fff58 + 0d19491 commit 4f3160f

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath-mcp"
3-
version = "0.0.94"
3+
version = "0.0.95"
44
description = "UiPath MCP SDK"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"

src/uipath_mcp/_cli/_runtime/_session.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55

66
from mcp import StdioServerParameters, stdio_client
77
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+
)
915
from opentelemetry import trace
1016
from 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

Comments
 (0)