Skip to content

Commit c2e8d7a

Browse files
committed
feat: style and cleanup
1 parent 2ae41d6 commit c2e8d7a

File tree

5 files changed

+38
-45
lines changed

5 files changed

+38
-45
lines changed

src/uipath_mcp/_cli/_runtime/_exception.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from enum import Enum
2-
from typing import Optional, Union
32

43
from uipath.runtime.errors import (
54
UiPathBaseRuntimeError,
@@ -20,11 +19,11 @@ class UiPathMcpRuntimeError(UiPathBaseRuntimeError):
2019

2120
def __init__(
2221
self,
23-
code: Union[McpErrorCode, UiPathErrorCode],
22+
code: McpErrorCode | UiPathErrorCode,
2423
title: str,
2524
detail: str,
2625
category: UiPathErrorCategory = UiPathErrorCategory.UNKNOWN,
27-
status: Optional[int] = None,
26+
status: int | None = None,
2827
):
2928
super().__init__(
3029
code.value, title, detail, category, status, prefix="UiPathMCP"

src/uipath_mcp/_cli/_runtime/_runtime.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import sys
77
import tempfile
88
import uuid
9-
from typing import Any, AsyncGenerator, Dict, List, Optional
9+
from collections.abc import AsyncGenerator
10+
from typing import Any
1011

1112
from httpx import HTTPStatusError
1213
from mcp import ClientSession, StdioServerParameters, stdio_client
@@ -74,11 +75,11 @@ def __init__(
7475
self._server_id = server_id
7576
self._server_slug = server_slug
7677

77-
self._signalr_client: Optional[SignalRClient] = None
78-
self._session_servers: Dict[str, SessionServer] = {}
79-
self._session_output: Optional[str] = None
78+
self._signalr_client: SignalRClient | None = None
79+
self._session_servers: dict[str, SessionServer] = {}
80+
self._session_output: str | None = None
8081
self._cancel_event = asyncio.Event()
81-
self._keep_alive_task: Optional[asyncio.Task[None]] = None
82+
self._keep_alive_task: asyncio.Task[None] | None = None
8283
self._uipath = UiPath()
8384
self._cleanup_done = False
8485

@@ -396,7 +397,7 @@ async def _register(self) -> None:
396397
"""Register the MCP server with UiPath."""
397398

398399
initialization_successful = False
399-
tools_result: Optional[ListToolsResult] = None
400+
tools_result: ListToolsResult | None = None
400401
server_stderr_output = ""
401402
env_vars = self._server.env
402403

@@ -433,7 +434,6 @@ async def _register(self) -> None:
433434

434435
# Only proceed if initialization was successful
435436
tools_result = await session.list_tools()
436-
# logger.info(tools_result)
437437
except Exception as err:
438438
logger.error(f"Initialization error: {err}")
439439
# Capture stderr output here, after the timeout
@@ -472,7 +472,7 @@ async def _register(self) -> None:
472472
UiPathErrorCategory.DEPLOYMENT,
473473
)
474474

475-
tools_list: List[Dict[str, str | None]] = []
475+
tools_list: list[dict[str, str | None]] = []
476476
client_info = {
477477
"server": {
478478
"Name": self.slug,
@@ -641,12 +641,9 @@ def packaged(self) -> bool:
641641
Returns:
642642
bool: True if this is a packaged runtime (has a process), False otherwise.
643643
"""
644-
process_key = None
645-
process_key = self._process_key
646-
647644
return (
648-
process_key is not None
649-
and process_key != "00000000-0000-0000-0000-000000000000"
645+
self._process_key is not None
646+
and self._process_key != "00000000-0000-0000-0000-000000000000"
650647
)
651648

652649
@property

src/uipath_mcp/_cli/_runtime/_session.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import io
33
import logging
44
import tempfile
5-
from typing import Dict, Optional
5+
from typing import Any
66

77
from mcp import StdioServerParameters, stdio_client
88
from mcp.shared.message import SessionMessage
@@ -33,20 +33,20 @@ def __init__(self, server_config: McpServer, server_slug: str, session_id: str):
3333
self._server_config = server_config
3434
self._server_slug = server_slug
3535
self._session_id = session_id
36-
self._read_stream = None
37-
self._write_stream = None
38-
self._mcp_session = None
39-
self._run_task: Optional[asyncio.Task[None]] = None
36+
self._read_stream: Any = None
37+
self._write_stream: Any = None
38+
self._mcp_session: Any = None
39+
self._run_task: asyncio.Task[None] | None = None
4040
self._message_queue: asyncio.Queue[JSONRPCMessage] = asyncio.Queue()
41-
self._active_requests: Dict[str, str] = {}
42-
self._last_request_id: Optional[str] = None
43-
self._last_message_id: Optional[str] = None
41+
self._active_requests: dict[str, str] = {}
42+
self._last_request_id: str | None = None
43+
self._last_message_id: str | None = None
4444
self._uipath = UiPath()
4545
self._mcp_tracer = McpTracer(tracer, logger)
46-
self._server_stderr_output: Optional[str] = None
46+
self._server_stderr_output: str | None = None
4747

4848
@property
49-
def output(self) -> Optional[str]:
49+
def output(self) -> str | None:
5050
"""Returns the captured stderr output from the MCP server process."""
5151
return self._server_stderr_output
5252

@@ -226,7 +226,7 @@ async def _consume_messages(self):
226226
message = await self._message_queue.get()
227227
try:
228228
if self._write_stream:
229-
logger.info(
229+
logger.debug(
230230
f"Session {self._session_id} - processing queued message: {message}..."
231231
)
232232
await self._write_stream.send(SessionMessage(message=message))
@@ -279,7 +279,7 @@ async def _send_message_internal(
279279
json=message.model_dump(),
280280
)
281281
if response.status_code == 202:
282-
logger.info(f"Outgoing message sent to UiPath MCP Server: {message}")
282+
logger.debug(f"Outgoing message sent to UiPath MCP Server: {message}")
283283
elif 500 <= response.status_code < 600:
284284
raise Exception(f"{response.status_code} - {response.text}")
285285

@@ -292,7 +292,7 @@ async def _get_messages_internal(self, request_id: str) -> None:
292292
self._last_request_id = request_id
293293
messages = response.json()
294294
for message in messages:
295-
logger.info(f"Received message: {message}")
295+
logger.debug(f"Received message: {message}")
296296
json_message = JSONRPCMessage.model_validate(message)
297297
if self._is_request(json_message):
298298
message_id = self._get_message_id(json_message)

src/uipath_mcp/_cli/_runtime/_tracer.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
import json
22
import logging
3-
from typing import Dict, Optional, TypeVar
43

54
import mcp.types as types
65
from opentelemetry import trace
76
from opentelemetry.trace import Span, StatusCode
87

9-
T = TypeVar("T")
10-
118

129
class McpTracer:
1310
"""Helper class to create and manage spans for MCP messages."""
1411

1512
def __init__(
1613
self,
17-
tracer: Optional[trace.Tracer] = None,
18-
logger: Optional[logging.Logger] = None,
14+
tracer: trace.Tracer | None = None,
15+
logger: logging.Logger | None = None,
1916
):
2017
self._tracer = tracer or trace.get_tracer(__name__)
2118
self._logger = logger or logging.getLogger(__name__)
2219
# Dictionary to store active request spans
23-
self._active_request_spans: Dict[str, Span] = {}
20+
self._active_request_spans: dict[str, Span] = {}
2421

2522
def create_span_for_message(self, message: types.JSONRPCMessage, **context) -> Span:
2623
"""Create and configure a span for a message.

src/uipath_mcp/_cli/_utils/_config.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
import logging
33
import os
4-
from typing import Any, Dict, List, Optional
4+
from typing import Any
55

66
logger = logging.getLogger(__name__)
77

@@ -12,7 +12,7 @@ class McpServer:
1212
def __init__(
1313
self,
1414
name: str,
15-
server_config: Dict[str, Any],
15+
server_config: dict[str, Any],
1616
):
1717
self.name = name
1818
self.type = server_config.get("type")
@@ -24,11 +24,11 @@ def __init__(
2424
self.env[key] = os.environ[key]
2525

2626
@property
27-
def file_path(self) -> Optional[str]:
27+
def file_path(self) -> str | None:
2828
"""Get the file path from args if available."""
2929
return self.args[0] if self.args and len(self.args) > 0 else None
3030

31-
def to_dict(self) -> Dict[str, Any]:
31+
def to_dict(self) -> dict[str, Any]:
3232
"""Convert the server model back to a dictionary."""
3333
return {"type": self.type, "command": self.command, "args": self.args}
3434

@@ -39,8 +39,8 @@ def __repr__(self) -> str:
3939
class McpConfig:
4040
def __init__(self, config_path: str = "mcp.json"):
4141
self.config_path = config_path
42-
self._servers: Dict[str, McpServer] = {}
43-
self._raw_config: Dict[str, Any] = {}
42+
self._servers: dict[str, McpServer] = {}
43+
self._raw_config: dict[str, Any] = {}
4444

4545
if self.exists:
4646
self._load_config()
@@ -68,11 +68,11 @@ def _load_config(self) -> None:
6868
logger.error(f"Failed to load mcp.json: {str(e)}")
6969
raise
7070

71-
def get_servers(self) -> List[McpServer]:
71+
def get_servers(self) -> list[McpServer]:
7272
"""Get list of all server models."""
7373
return list(self._servers.values())
7474

75-
def get_server(self, name: str) -> Optional[McpServer]:
75+
def get_server(self, name: str) -> McpServer | None:
7676
"""
7777
Get a server model by name.
7878
If there's only one server available, return that one regardless of name.
@@ -85,11 +85,11 @@ def get_server(self, name: str) -> Optional[McpServer]:
8585
# Otherwise, fall back to looking up by name
8686
return self._servers.get(name)
8787

88-
def get_server_names(self) -> List[str]:
88+
def get_server_names(self) -> list[str]:
8989
"""Get list of all server names."""
9090
return list(self._servers.keys())
9191

92-
def load_config(self) -> Dict[str, Any]:
92+
def load_config(self) -> dict[str, Any]:
9393
"""Load and validate MCP servers configuration."""
9494
if not self.exists:
9595
raise FileNotFoundError(f"Config file not found: {self.config_path}")

0 commit comments

Comments
 (0)