Skip to content

Commit 427cd65

Browse files
edis-uipathclaude
andcommitted
fix: address PR #159 review remarks
- Update uipath SDK to >=2.8.23 and add uipath-runtime >=0.8.0 dependency - Use UiPathRuntimeContext for mcp_server_id/slug instead of manual uipath.json parsing - Add get_settings() method to factory protocol - Remove TODO comment on auth validation (confirmed needed) - Remove manual tracing/LlmOpsHttpExporter setup (handled by CLI) - Fix self.context.folder_key bug in _on_runtime_abort (use self._folder_key) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e9ea4fe commit 427cd65

4 files changed

Lines changed: 42 additions & 54 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ requires-python = ">=3.11"
77
dependencies = [
88
"mcp==1.24.0",
99
"pysignalr==1.3.0",
10-
"uipath>=2.2.16, <2.3.0",
10+
"uipath>=2.8.23, <2.9.0",
11+
"uipath-runtime>=0.8.0, <0.9.0",
1112
]
1213
classifiers = [
1314
"Development Status :: 3 - Alpha",

src/uipath_mcp/_cli/_runtime/_factory.py

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
"""Factory for creating MCP runtime instances."""
22

3-
import json
43
import logging
5-
import os
64
import uuid
7-
from typing import Any
85

96
from uipath.runtime import (
107
UiPathRuntimeContext,
8+
UiPathRuntimeFactorySettings,
119
UiPathRuntimeProtocol,
1210
)
1311
from uipath.runtime.errors import UiPathErrorCategory
@@ -33,29 +31,6 @@ def __init__(
3331
"""
3432
self.context = context
3533
self._mcp_config: McpConfig | None = None
36-
self._server_id: str | None = None
37-
self._server_slug: str | None = None
38-
39-
# Load fps context from uipath.json if available
40-
self._load_fps_context()
41-
42-
def _load_fps_context(self) -> None:
43-
"""
44-
Load fps context from uipath.json for server registration.
45-
"""
46-
config_path = self.context.config_path or "uipath.json"
47-
if os.path.exists(config_path):
48-
try:
49-
with open(config_path, "r") as f:
50-
config: dict[str, Any] = json.load(f)
51-
52-
config_runtime = config.get("runtime", {})
53-
if "fpsContext" in config_runtime:
54-
fps_context = config_runtime["fpsContext"]
55-
self._server_id = fps_context.get("Id")
56-
self._server_slug = fps_context.get("Slug")
57-
except Exception as e:
58-
logger.warning(f"Failed to load fps context: {e}")
5934

6035
def _load_mcp_config(self) -> McpConfig:
6136
"""Load mcp.json configuration."""
@@ -136,10 +111,14 @@ async def new_runtime(
136111
runtime_id=runtime_id,
137112
entrypoint=entrypoint,
138113
folder_key=self.context.folder_key,
139-
server_id=self._server_id,
140-
server_slug=self._server_slug,
114+
server_id=self.context.mcp_server_id,
115+
server_slug=self.context.mcp_server_slug,
141116
)
142117

118+
async def get_settings(self) -> UiPathRuntimeFactorySettings | None:
119+
"""Get factory settings."""
120+
return None
121+
143122
async def dispose(self) -> None:
144123
"""Cleanup factory resources."""
145124
self._mcp_config = None

src/uipath_mcp/_cli/_runtime/_runtime.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
from mcp import ClientSession, StdioServerParameters, stdio_client
1313
from mcp.types import JSONRPCResponse, ListToolsResult
1414
from opentelemetry import trace
15-
from opentelemetry.sdk.trace import TracerProvider
16-
from opentelemetry.sdk.trace.export import BatchSpanProcessor
1715
from pysignalr.client import SignalRClient
1816
from pysignalr.messages import CompletionMessage
1917
from uipath.platform import UiPath
@@ -30,7 +28,6 @@
3028
UiPathErrorCode,
3129
)
3230
from uipath.runtime.events import UiPathRuntimeStateEvent
33-
from uipath.tracing import LlmOpsHttpExporter
3431

3532
from .._utils._config import McpServer
3633
from ._context import UiPathServerType
@@ -79,7 +76,6 @@ def __init__(
7976
self._cancel_event = asyncio.Event()
8077
self._keep_alive_task: Optional[asyncio.Task[None]] = None
8178
self._uipath = UiPath()
82-
self._trace_provider: Optional[TracerProvider] = None
8379

8480
# Context fields accessed from environment
8581
self._job_id = os.environ.get("UIPATH_JOB_KEY")
@@ -89,7 +85,6 @@ def __init__(
8985

9086
def _validate_auth(self) -> None:
9187
"""Validate authentication-related configuration.
92-
TODO: do we still need this?
9388
9489
Raises:
9590
UiPathMcpRuntimeError: If any required authentication values are missing.
@@ -236,13 +231,6 @@ async def emit_state(node_name: str, payload: dict[str, Any]) -> None:
236231
await event_queue.put(event)
237232

238233
try:
239-
if self._job_id:
240-
self._trace_provider = TracerProvider()
241-
trace.set_tracer_provider(self._trace_provider)
242-
self._trace_provider.add_span_processor(
243-
BatchSpanProcessor(LlmOpsHttpExporter())
244-
)
245-
246234
await emit_state("initializing", {"status": "validating_auth"})
247235

248236
# Validate authentication configuration
@@ -371,8 +359,6 @@ async def emit_state(node_name: str, payload: dict[str, Any]) -> None:
371359
) from e
372360
finally:
373361
await self._cleanup()
374-
if self._trace_provider:
375-
self._trace_provider.shutdown()
376362

377363
async def dispose(self) -> None:
378364
"""Cleanup runtime resources."""
@@ -705,7 +691,7 @@ async def _on_runtime_abort(self) -> None:
705691
response = await self._uipath.api_client.request_async(
706692
"POST",
707693
f"agenthub_/mcp/{self.slug}/runtime/abort?runtimeId={self._runtime_id}",
708-
headers={"X-UIPATH-FolderKey": self.context.folder_key},
694+
headers={"X-UIPATH-FolderKey": self._folder_key},
709695
)
710696
if response.status_code == 202:
711697
logger.info(

uv.lock

Lines changed: 32 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)