@@ -16,7 +16,7 @@ use futures::future::try_join_all;
1616use futures:: { StreamExt , TryFutureExt } ;
1717#[ cfg( feature = "hyper-server" ) ]
1818use rust_mcp_transport:: SessionId ;
19- use rust_mcp_transport:: { IoStream , TransportDispatcher } ;
19+ use rust_mcp_transport:: { IoStream , RequestIdGen , RequestIdGenNumeric , TransportDispatcher } ;
2020use std:: collections:: HashMap ;
2121use std:: sync:: Arc ;
2222use std:: time:: Duration ;
@@ -45,6 +45,7 @@ pub struct ServerRuntime {
4545 #[ cfg( feature = "hyper-server" ) ]
4646 session_id : Option < SessionId > ,
4747 transport_map : tokio:: sync:: RwLock < HashMap < String , TransportType > > ,
48+ request_id_gen : Box < dyn RequestIdGen > ,
4849 client_details_tx : watch:: Sender < Option < InitializeRequestParams > > ,
4950 client_details_rx : watch:: Receiver < Option < InitializeRequestParams > > ,
5051}
@@ -79,22 +80,26 @@ impl McpServer for ServerRuntime {
7980 message : MessageFromServer ,
8081 request_id : Option < RequestId > ,
8182 request_timeout : Option < Duration > ,
82- ) -> SdkResult < Option < ClientMessages > > {
83+ ) -> SdkResult < Option < ClientMessage > > {
8384 let transport_map = self . transport_map . read ( ) . await ;
8485 let transport = transport_map. get ( DEFAULT_STREAM_ID ) . ok_or (
8586 RpcError :: internal_error ( )
8687 . with_message ( "transport stream does not exists or is closed!" . to_string ( ) ) ,
8788 ) ?;
8889
8990 let outgoing_request_id = self
90- . request_id_for_message ( transport , & message , request_id )
91- . await ;
91+ . request_id_gen
92+ . request_id_for_message ( & message , request_id ) ;
9293
9394 let mcp_message = ServerMessage :: from_message ( message, outgoing_request_id) ?;
94- transport
95+
96+ let response = transport
9597 . send_message ( ServerMessages :: Single ( mcp_message) , request_timeout)
96- . map_err ( |err| err. into ( ) )
97- . await
98+ . await ?
99+ . map ( |res| res. as_single ( ) )
100+ . transpose ( ) ?;
101+
102+ Ok ( response)
98103 }
99104
100105 async fn send_batch (
@@ -211,40 +216,6 @@ impl ServerRuntime {
211216 Ok ( ( ) )
212217 }
213218
214- /// Determines the request ID for an outgoing MCP message.
215- ///
216- /// For requests, generates a new ID using the internal counter. For responses or errors,
217- /// uses the provided `request_id`. Notifications receive no ID.
218- ///
219- /// # Arguments
220- /// * `message` - The MCP message to evaluate.
221- /// * `request_id` - An optional existing request ID (required for responses/errors).
222- ///
223- /// # Returns
224- /// An `Option<RequestId>`: `Some` for requests or responses/errors, `None` for notifications.
225- pub ( crate ) async fn request_id_for_message (
226- & self ,
227- transport : & Arc <
228- dyn TransportDispatcher <
229- ClientMessages ,
230- MessageFromServer ,
231- ClientMessage ,
232- ServerMessages ,
233- ServerMessage ,
234- > ,
235- > ,
236- message : & MessageFromServer ,
237- request_id : Option < RequestId > ,
238- ) -> Option < RequestId > {
239- let message_sender = transport. message_sender ( ) ;
240- let guard = message_sender. read ( ) . await ;
241- if let Some ( dispatcher) = guard. as_ref ( ) {
242- dispatcher. request_id_for_message ( message, request_id)
243- } else {
244- None
245- }
246- }
247-
248219 pub ( crate ) async fn handle_message (
249220 & self ,
250221 message : ClientMessage ,
@@ -471,6 +442,7 @@ impl ServerRuntime {
471442 transport_map : tokio:: sync:: RwLock :: new ( HashMap :: new ( ) ) ,
472443 client_details_tx,
473444 client_details_rx,
445+ request_id_gen : Box :: new ( RequestIdGenNumeric :: new ( None ) ) ,
474446 }
475447 }
476448
@@ -497,6 +469,7 @@ impl ServerRuntime {
497469 transport_map : tokio:: sync:: RwLock :: new ( map) ,
498470 client_details_tx,
499471 client_details_rx,
472+ request_id_gen : Box :: new ( RequestIdGenNumeric :: new ( None ) ) ,
500473 }
501474 }
502475}
0 commit comments