3838from ._context import UiPathServerType
3939from ._exception import McpErrorCode , UiPathMcpRuntimeError
4040from ._session import BaseSessionServer , StdioSessionServer , StreamableHttpSessionServer
41+ from ._token_refresh import TokenRefresher
4142
4243logger = logging .getLogger (__name__ )
4344tracer = trace .get_tracer (__name__ )
@@ -85,6 +86,7 @@ def __init__(
8586 self ._http_stderr_drain_task : asyncio .Task [None ] | None = None
8687 self ._http_server_stderr_lines : list [str ] = []
8788 self ._uipath = UiPath ()
89+ self ._token_refresher : TokenRefresher | None = None
8890 self ._cleanup_done = False
8991
9092 # Context fields from UiPathConfig
@@ -206,15 +208,19 @@ async def _run_server(self) -> UiPathRuntimeResult:
206208 root_span .set_attribute ("command" , str (self ._server .command ))
207209 root_span .set_attribute ("args" , json .dumps (self ._server .args ))
208210 root_span .set_attribute ("span_type" , "MCP Server" )
209- bearer_token = self ._uipath ._config .secret
211+
212+ signalr_headers = {
213+ "X-UiPath-Internal-TenantId" : str (self ._tenant_id ),
214+ "X-UiPath-Internal-AccountId" : str (self ._org_id ),
215+ "X-UIPATH-FolderKey" : self ._folder_key ,
216+ "Authorization" : f"Bearer { self ._uipath ._config .secret } " ,
217+ }
218+
219+ self ._token_refresher = TokenRefresher (self ._uipath )
220+
210221 self ._signalr_client = SignalRClient (
211222 signalr_url ,
212- headers = {
213- "X-UiPath-Internal-TenantId" : str (self ._tenant_id ),
214- "X-UiPath-Internal-AccountId" : str (self ._org_id ),
215- "X-UIPATH-FolderKey" : self ._folder_key ,
216- "Authorization" : f"Bearer { bearer_token } " ,
217- },
223+ headers = signalr_headers ,
218224 )
219225 self ._signalr_client .on ("MessageReceived" , self ._handle_signalr_message )
220226 self ._signalr_client .on (
@@ -236,6 +242,7 @@ async def _run_server(self) -> UiPathRuntimeResult:
236242 run_task = asyncio .create_task (self ._signalr_client .run ())
237243 cancel_task = asyncio .create_task (self ._cancel_event .wait ())
238244 self ._keep_alive_task = asyncio .create_task (self ._keep_alive ())
245+ self ._token_refresher .start ()
239246
240247 try :
241248 # Wait for either the run to complete or cancellation
@@ -297,6 +304,9 @@ async def _cleanup(self) -> None:
297304
298305 await self ._on_runtime_abort ()
299306
307+ if self ._token_refresher :
308+ await self ._token_refresher .stop ()
309+
300310 if self ._keep_alive_task :
301311 self ._keep_alive_task .cancel ()
302312 try :
@@ -374,11 +384,11 @@ async def _handle_signalr_message(self, args: list[str]) -> None:
374384 session_server : BaseSessionServer
375385 if self ._server .is_streamable_http :
376386 session_server = StreamableHttpSessionServer (
377- self ._server , self .slug , session_id
387+ self ._server , self .slug , session_id , self . _uipath
378388 )
379389 else :
380390 session_server = StdioSessionServer (
381- self ._server , self .slug , session_id
391+ self ._server , self .slug , session_id , self . _uipath
382392 )
383393 try :
384394 await session_server .start ()
0 commit comments