Skip to content

Commit 32fdbd0

Browse files
authored
Merge pull request #14 from UiPath/fix/samples
fix: use ws as notification part 1
2 parents b080c0a + cd2634c commit 32fdbd0

File tree

4 files changed

+34
-35
lines changed

4 files changed

+34
-35
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.9"
3+
version = "0.0.10"
44
description = "UiPath MCP SDK"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.10"

src/uipath_mcp/_cli/_runtime/_runtime.py

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ async def execute(self) -> Optional[UiPathRuntimeResult]:
5353

5454
# Set up SignalR client
5555
signalr_url = (
56-
f"{os.environ.get('UIPATH_URL')}/mcp_/wsstunnel?slug={self.server.name}&jobKey={self.context.job_id}"
56+
f"{os.environ.get('UIPATH_URL')}/mcp_/wsstunnel?slug={self.server.name}&sessionId={self.server.session_id}"
5757
)
5858

5959
self.cancel_event = asyncio.Event()
@@ -73,7 +73,7 @@ async def execute(self) -> Optional[UiPathRuntimeResult]:
7373

7474
# Keep the runtime alive
7575
# Start SignalR client and keep it running (this is a blocking call)
76-
logger.info("Starting SignalR client...")
76+
logger.info("Starting websocket client...")
7777

7878
run_task = asyncio.create_task(self.signalr_client.run())
7979

@@ -144,14 +144,13 @@ async def handle_signalr_message(self, args: list) -> None:
144144
Handle incoming SignalR messages.
145145
The SignalR client will call this with the arguments from the server.
146146
"""
147-
if len(args) < 2:
147+
if len(args) < 1:
148148
logger.error(f"Received invalid SignalR message arguments: {args}")
149149
return
150150

151151
session_id = args[0]
152-
message = args[1]
153152

154-
logger.info(f"Received message for session {session_id}: {message}")
153+
logger.info(f"Received websocket notification... {session_id}")
155154

156155
try:
157156
# Check if we have a session server for this session_id
@@ -165,11 +164,11 @@ async def handle_signalr_message(self, args: list) -> None:
165164
session_server = self.session_servers[session_id]
166165

167166
# Forward the message to the session's MCP server
168-
await session_server.send_message(message)
167+
await session_server.get_messages()
169168

170169
except Exception as e:
171170
logger.error(
172-
f"Error handling SignalR message for session {session_id}: {str(e)}"
171+
f"Error handling websocket notification for session {session_id}: {str(e)}"
173172
)
174173

175174
async def handle_signalr_error(self, error: Any) -> None:
@@ -178,36 +177,20 @@ async def handle_signalr_error(self, error: Any) -> None:
178177

179178
async def handle_signalr_open(self) -> None:
180179
"""Handle SignalR connection open event."""
181-
logger.info("SignalR connection established")
182-
uipath = UiPath()
183-
response = uipath.api_client.request(
184-
"GET",
185-
f"mcp_/mcp/{self.server.name}/message?jobKey={self.context.job_id}"
186-
)
187-
if response.status_code == 200:
188-
data = response.json()
189-
session_id = data["sessionId"]
190-
message = data["message"]
191-
logger.info(f"Received message from UiPath MCP: {data}")
192-
if session_id and session_id.strip():
193-
if session_id not in self.session_servers:
194-
# Create and start a new session server
195-
session_server = SessionServer(self.server, session_id)
196-
self.session_servers[session_id] = session_server
197-
await session_server.start(self.signalr_client)
198-
199-
# Get the session server for this session
200-
session_server = self.session_servers[session_id]
201-
202-
if message and message.strip():
203-
logger.info(f"Forwarding message to session {session_id}: {message}")
204-
# Forward the message to the session's MCP server
205-
await session_server.send_message(message)
180+
181+
logger.info("Websocket connection established.")
182+
if self.server.session_id:
183+
try:
184+
session_server = SessionServer(self.server, self.server.session_id)
185+
await session_server.start(self.signalr_client)
186+
self.session_servers[self.server.session_id] = session_server
187+
await session_server.get_messages()
188+
except Exception as e:
189+
logger.error(f"Error starting session server: {str(e)}")
206190

207191
async def handle_signalr_close(self) -> None:
208192
"""Handle SignalR connection close event."""
209-
logger.info("SignalR connection closed")
210-
193+
logger.info("SignalR connection closed.")
211194
# Clean up all session servers when the connection closes
212195
await self.cleanup()
213196

src/uipath_mcp/_cli/_runtime/_session.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from mcp import StdioServerParameters
66
from mcp.client.stdio import stdio_client
77
from pysignalr.client import SignalRClient
8+
from uipath import UiPath
89

910
from .._utils._config import McpServer
1011

@@ -164,6 +165,20 @@ async def send_message(self, message: str) -> None:
164165
await self._message_queue.put(message)
165166
logger.debug(f"Session {self.session_id} - message queued for processing")
166167

168+
async def get_messages(self) -> None:
169+
"""Get new messages from UiPath MCP Server."""
170+
uipath = UiPath()
171+
response = uipath.api_client.request(
172+
"GET",
173+
f"mcp_/mcp/{self.server_config.name}/messages?sessionId={self.session_id}",
174+
)
175+
if response.status_code == 200:
176+
messages = response.json()
177+
logger.info(f"Get messages from UiPath MCP Server: {messages}")
178+
for message in messages:
179+
logger.info(f"Forwarding message to local MCP Server: {message}")
180+
await self.send_message(message)
181+
167182
async def cleanup(self) -> None:
168183
"""Clean up resources and stop the server."""
169184
logger.info(f"Cleaning up session {self.session_id}")

src/uipath_mcp/_cli/_utils/_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class McpServer:
1010

1111
def __init__(self, name: str, server_config: Dict[str, Any]):
1212
self.name = name
13+
self.session_id = server_config.get("sessionId")
1314
self.type = server_config.get("type")
1415
self.command = server_config.get("command")
1516
self.args = server_config.get("args", [])

0 commit comments

Comments
 (0)