Skip to content

Commit 3ae9762

Browse files
authored
Merge pull request #125 from UiPath/fix/decouple_entrypoint
Fix: Use FpsContext slug if available
2 parents 36c26ba + 7cbc60e commit 3ae9762

File tree

4 files changed

+47
-14
lines changed

4 files changed

+47
-14
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.97"
3+
version = "0.0.98"
44
description = "UiPath MCP SDK"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"

src/uipath_mcp/_cli/_runtime/_context.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,33 @@ class UiPathMcpRuntimeContext(UiPathRuntimeContext):
1111

1212
config: Optional[McpConfig] = None
1313
folder_key: Optional[str] = None
14+
server_id: Optional[str] = None
15+
server_slug: Optional[str] = None
16+
17+
@classmethod
18+
def from_config(cls, config_path=None):
19+
"""Load configuration from uipath.json file with MCP-specific handling."""
20+
# Use the parent's implementation
21+
instance = super().from_config(config_path)
22+
23+
# Convert to our type (since parent returns UiPathRuntimeContext)
24+
mcp_instance = cls(**instance.model_dump())
25+
26+
# Add AgentHub-specific configuration handling
27+
import json
28+
import os
29+
30+
path = config_path or "uipath.json"
31+
if os.path.exists(path):
32+
with open(path, "r") as f:
33+
config = json.load(f)
34+
35+
if "fpsContext" in config:
36+
fps_context = config["fpsContext"]
37+
mcp_instance.server_id = fps_context.get("Id")
38+
mcp_instance.server_slug = fps_context.get("Slug")
39+
40+
return mcp_instance
1441

1542

1643
class UiPathServerType(Enum):

src/uipath_mcp/_cli/_runtime/_runtime.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ async def execute(self) -> Optional[UiPathRuntimeResult]:
9696

9797
logger.info(f"Folder key: {self.context.folder_key}")
9898

99-
with tracer.start_as_current_span(self._server.name) as root_span:
99+
with tracer.start_as_current_span(self.slug) as root_span:
100100
root_span.set_attribute("runtime_id", self._runtime_id)
101101
root_span.set_attribute("command", self._server.command)
102102
root_span.set_attribute("args", self._server.args)
@@ -257,7 +257,7 @@ async def _handle_signalr_message(self, args: list) -> None:
257257
# Check if we have a session server for this session_id
258258
if session_id not in self._session_servers:
259259
# Create and start a new session server
260-
session_server = SessionServer(self._server, session_id)
260+
session_server = SessionServer(self._server, self.slug, session_id)
261261
try:
262262
await session_server.start()
263263
except Exception as e:
@@ -368,8 +368,9 @@ async def _register(self) -> None:
368368
try:
369369
client_info = {
370370
"server": {
371-
"Name": self._server.name,
372-
"Slug": self._server.name,
371+
"Id": self.context.server_id,
372+
"Name": self.slug,
373+
"Slug": self.slug,
373374
"Version": "1.0.0",
374375
"Type": self.server_type.value,
375376
},
@@ -390,7 +391,7 @@ async def _register(self) -> None:
390391
# Register with UiPath MCP Server
391392
await self._uipath.api_client.request_async(
392393
"POST",
393-
f"agenthub_/mcp/{self._server.name}/runtime/start?runtimeId={self._runtime_id}",
394+
f"agenthub_/mcp/{self.slug}/runtime/start?runtimeId={self._runtime_id}",
394395
json=client_info,
395396
headers={"X-UIPATH-FolderKey": self.context.folder_key},
396397
)
@@ -417,14 +418,14 @@ async def _on_session_start_error(self, session_id: str) -> None:
417418
try:
418419
response = await self._uipath.api_client.request_async(
419420
"POST",
420-
f"agenthub_/mcp/{self._server.name}/out/message?sessionId={session_id}",
421+
f"agenthub_/mcp/{self.slug}/out/message?sessionId={session_id}",
421422
json=JSONRPCResponse(
422423
jsonrpc="2.0",
423424
id=0,
424425
result={
425426
"protocolVersion": "initialize-failure",
426427
"capabilities": {},
427-
"serverInfo": {"name": self._server.name, "version": "1.0"},
428+
"serverInfo": {"name": self.slug, "version": "1.0"},
428429
},
429430
).model_dump(),
430431
)
@@ -496,7 +497,7 @@ async def _on_runtime_abort(self) -> None:
496497
try:
497498
response = await self._uipath.api_client.request_async(
498499
"POST",
499-
f"agenthub_/mcp/{self._server.name}/runtime/abort?runtimeId={self._runtime_id}",
500+
f"agenthub_/mcp/{self.slug}/runtime/abort?runtimeId={self._runtime_id}",
500501
)
501502
if response.status_code == 202:
502503
logger.info(
@@ -536,6 +537,10 @@ def packaged(self) -> bool:
536537
and process_key != "00000000-0000-0000-0000-000000000000"
537538
)
538539

540+
@property
541+
def slug(self) -> str:
542+
return self.context.server_slug or self._server.name
543+
539544
@property
540545
def server_type(self) -> UiPathServerType:
541546
"""

src/uipath_mcp/_cli/_runtime/_session.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
class SessionServer:
2929
"""Manages a server process for a specific session."""
3030

31-
def __init__(self, server_config: McpServer, session_id: str):
31+
def __init__(self, server_config: McpServer, server_slug: str, session_id: str):
3232
self._server_config = server_config
33+
self._server_slug = server_slug
3334
self._session_id = session_id
3435
self._read_stream = None
3536
self._write_stream = None
@@ -244,7 +245,7 @@ async def _send_message(self, message: JSONRPCMessage, request_id: str) -> None:
244245
message,
245246
session_id=self._session_id,
246247
request_id=request_id,
247-
server_name=self._server_config.name,
248+
server_name=self._server_slug,
248249
) as _:
249250
for attempt in range(MAX_RETRIES + 1):
250251
try:
@@ -268,7 +269,7 @@ async def _send_message_internal(
268269
) -> None:
269270
response = await self._uipath.api_client.request_async(
270271
"POST",
271-
f"agenthub_/mcp/{self._server_config.name}/out/message?sessionId={self._session_id}&requestId={request_id}",
272+
f"agenthub_/mcp/{self._server_slug}/out/message?sessionId={self._session_id}&requestId={request_id}",
272273
json=message.model_dump(),
273274
)
274275
if response.status_code == 202:
@@ -279,7 +280,7 @@ async def _send_message_internal(
279280
async def _get_messages_internal(self, request_id: str) -> None:
280281
response = await self._uipath.api_client.request_async(
281282
"GET",
282-
f"agenthub_/mcp/{self._server_config.name}/in/messages?sessionId={self._session_id}&requestId={request_id}",
283+
f"agenthub_/mcp/{self._server_slug}/in/messages?sessionId={self._session_id}&requestId={request_id}",
283284
)
284285
if response.status_code == 200:
285286
self._last_request_id = request_id
@@ -296,7 +297,7 @@ async def _get_messages_internal(self, request_id: str) -> None:
296297
json_message,
297298
session_id=self._session_id,
298299
request_id=request_id,
299-
server_name=self._server_config.name,
300+
server_name=self._server_slug,
300301
) as _:
301302
await self._message_queue.put(json_message)
302303
elif 500 <= response.status_code < 600:

0 commit comments

Comments
 (0)