1- use std:: sync:: Arc ;
1+ use std:: { sync:: Arc , time :: Duration } ;
22
33use async_trait:: async_trait;
44use rust_mcp_schema:: {
@@ -170,15 +170,19 @@ pub trait McpClient: Sync + Send {
170170 /// This function sends a `RequestFromClient` message to the server, waits for the response,
171171 /// and handles the result. If the response is empty or of an invalid type, an error is returned.
172172 /// Otherwise, it returns the result from the server.
173- async fn request ( & self , request : RequestFromClient ) -> SdkResult < ResultFromServer > {
173+ async fn request (
174+ & self ,
175+ request : RequestFromClient ,
176+ timeout : Option < Duration > ,
177+ ) -> SdkResult < ResultFromServer > {
174178 let sender = self . sender ( ) . await . read ( ) . await ;
175179 let sender = sender
176180 . as_ref ( )
177181 . ok_or ( schema_utils:: SdkError :: connection_closed ( ) ) ?;
178182
179183 // Send the request and receive the response.
180184 let response = sender
181- . send ( MessageFromClient :: RequestFromClient ( request) , None )
185+ . send ( MessageFromClient :: RequestFromClient ( request) , None , timeout )
182186 . await ?;
183187
184188 let server_message = response. ok_or_else ( || {
@@ -205,6 +209,7 @@ pub trait McpClient: Sync + Send {
205209 . send (
206210 MessageFromClient :: NotificationFromClient ( notification) ,
207211 None ,
212+ None ,
208213 )
209214 . await ?;
210215 Ok ( ( ) )
@@ -220,9 +225,9 @@ pub trait McpClient: Sync + Send {
220225 /// # Returns
221226 /// A `SdkResult` containing the `rust_mcp_schema::Result` if the request is successful.
222227 /// If the request or conversion fails, an error is returned.
223- async fn ping ( & self ) -> SdkResult < rust_mcp_schema:: Result > {
228+ async fn ping ( & self , timeout : Option < Duration > ) -> SdkResult < rust_mcp_schema:: Result > {
224229 let ping_request = PingRequest :: new ( None ) ;
225- let response = self . request ( ping_request. into ( ) ) . await ?;
230+ let response = self . request ( ping_request. into ( ) , timeout ) . await ?;
226231 Ok ( response. try_into ( ) ?)
227232 }
228233
@@ -231,13 +236,13 @@ pub trait McpClient: Sync + Send {
231236 params : CompleteRequestParams ,
232237 ) -> SdkResult < rust_mcp_schema:: CompleteResult > {
233238 let request = CompleteRequest :: new ( params) ;
234- let response = self . request ( request. into ( ) ) . await ?;
239+ let response = self . request ( request. into ( ) , None ) . await ?;
235240 Ok ( response. try_into ( ) ?)
236241 }
237242
238243 async fn set_logging_level ( & self , level : LoggingLevel ) -> SdkResult < rust_mcp_schema:: Result > {
239244 let request = SetLevelRequest :: new ( SetLevelRequestParams { level } ) ;
240- let response = self . request ( request. into ( ) ) . await ?;
245+ let response = self . request ( request. into ( ) , None ) . await ?;
241246 Ok ( response. try_into ( ) ?)
242247 }
243248
@@ -246,7 +251,7 @@ pub trait McpClient: Sync + Send {
246251 params : GetPromptRequestParams ,
247252 ) -> SdkResult < rust_mcp_schema:: GetPromptResult > {
248253 let request = GetPromptRequest :: new ( params) ;
249- let response = self . request ( request. into ( ) ) . await ?;
254+ let response = self . request ( request. into ( ) , None ) . await ?;
250255 Ok ( response. try_into ( ) ?)
251256 }
252257
@@ -255,7 +260,7 @@ pub trait McpClient: Sync + Send {
255260 params : Option < ListPromptsRequestParams > ,
256261 ) -> SdkResult < rust_mcp_schema:: ListPromptsResult > {
257262 let request = ListPromptsRequest :: new ( params) ;
258- let response = self . request ( request. into ( ) ) . await ?;
263+ let response = self . request ( request. into ( ) , None ) . await ?;
259264 Ok ( response. try_into ( ) ?)
260265 }
261266
@@ -269,7 +274,7 @@ pub trait McpClient: Sync + Send {
269274 // that excepts an empty params to be passed (like server-everything)
270275 let request =
271276 ListResourcesRequest :: new ( params. or ( Some ( ListResourcesRequestParams :: default ( ) ) ) ) ;
272- let response = self . request ( request. into ( ) ) . await ?;
277+ let response = self . request ( request. into ( ) , None ) . await ?;
273278 Ok ( response. try_into ( ) ?)
274279 }
275280
@@ -278,7 +283,7 @@ pub trait McpClient: Sync + Send {
278283 params : Option < ListResourceTemplatesRequestParams > ,
279284 ) -> SdkResult < rust_mcp_schema:: ListResourceTemplatesResult > {
280285 let request = ListResourceTemplatesRequest :: new ( params) ;
281- let response = self . request ( request. into ( ) ) . await ?;
286+ let response = self . request ( request. into ( ) , None ) . await ?;
282287 Ok ( response. try_into ( ) ?)
283288 }
284289
@@ -287,7 +292,7 @@ pub trait McpClient: Sync + Send {
287292 params : ReadResourceRequestParams ,
288293 ) -> SdkResult < rust_mcp_schema:: ReadResourceResult > {
289294 let request = ReadResourceRequest :: new ( params) ;
290- let response = self . request ( request. into ( ) ) . await ?;
295+ let response = self . request ( request. into ( ) , None ) . await ?;
291296 Ok ( response. try_into ( ) ?)
292297 }
293298
@@ -296,7 +301,7 @@ pub trait McpClient: Sync + Send {
296301 params : SubscribeRequestParams ,
297302 ) -> SdkResult < rust_mcp_schema:: Result > {
298303 let request = SubscribeRequest :: new ( params) ;
299- let response = self . request ( request. into ( ) ) . await ?;
304+ let response = self . request ( request. into ( ) , None ) . await ?;
300305 Ok ( response. try_into ( ) ?)
301306 }
302307
@@ -305,13 +310,13 @@ pub trait McpClient: Sync + Send {
305310 params : UnsubscribeRequestParams ,
306311 ) -> SdkResult < rust_mcp_schema:: Result > {
307312 let request = UnsubscribeRequest :: new ( params) ;
308- let response = self . request ( request. into ( ) ) . await ?;
313+ let response = self . request ( request. into ( ) , None ) . await ?;
309314 Ok ( response. try_into ( ) ?)
310315 }
311316
312317 async fn call_tool ( & self , params : CallToolRequestParams ) -> SdkResult < CallToolResult > {
313318 let request = CallToolRequest :: new ( params) ;
314- let response = self . request ( request. into ( ) ) . await ?;
319+ let response = self . request ( request. into ( ) , None ) . await ?;
315320 Ok ( response. try_into ( ) ?)
316321 }
317322
@@ -320,7 +325,7 @@ pub trait McpClient: Sync + Send {
320325 params : Option < ListToolsRequestParams > ,
321326 ) -> SdkResult < rust_mcp_schema:: ListToolsResult > {
322327 let request = ListToolsRequest :: new ( params) ;
323- let response = self . request ( request. into ( ) ) . await ?;
328+ let response = self . request ( request. into ( ) , None ) . await ?;
324329 Ok ( response. try_into ( ) ?)
325330 }
326331
0 commit comments