@@ -131,22 +131,6 @@ where
131131 . ok_or_else ( || ServerInitializeError :: ConnectionClosed ( context. to_string ( ) ) )
132132}
133133
134- /// Helper function to expect a request from the stream
135- async fn expect_request < T > (
136- transport : & mut T ,
137- context : & str ,
138- ) -> Result < ( ClientRequest , RequestId ) , ServerInitializeError >
139- where
140- T : Transport < RoleServer > ,
141- {
142- let msg = expect_next_message ( transport, context) . await ?;
143- let msg_clone = msg. clone ( ) ;
144- msg. into_request ( )
145- . ok_or ( ServerInitializeError :: ExpectedInitializeRequest ( Some (
146- msg_clone,
147- ) ) )
148- }
149-
150134pub async fn serve_server_with_ct < S , T , E , A > (
151135 service : S ,
152136 transport : T ,
@@ -177,8 +161,35 @@ where
177161 let mut transport = transport. into_transport ( ) ;
178162 let id_provider = <Arc < AtomicU32RequestIdProvider > >:: default ( ) ;
179163
180- // Get initialize request
181- let ( request, id) = expect_request ( & mut transport, "initialized request" ) . await ?;
164+ // Get initialize request; the MCP spec permits ping before initialize.
165+ // See: https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle#initialization
166+ let ( request, id) = loop {
167+ let msg = expect_next_message ( & mut transport, "initialize request" ) . await ?;
168+ match msg {
169+ ClientJsonRpcMessage :: Request ( req)
170+ if matches ! ( req. request, ClientRequest :: PingRequest ( _) ) =>
171+ {
172+ transport
173+ . send ( ServerJsonRpcMessage :: response (
174+ ServerResult :: EmptyResult ( EmptyResult { } ) ,
175+ req. id ,
176+ ) )
177+ . await
178+ . map_err ( |error| {
179+ ServerInitializeError :: transport :: < T > (
180+ error,
181+ "sending pre-init ping response" ,
182+ )
183+ } ) ?;
184+ }
185+ ClientJsonRpcMessage :: Request ( req) => break ( req. request , req. id ) ,
186+ other => {
187+ return Err ( ServerInitializeError :: ExpectedInitializeRequest ( Some (
188+ other,
189+ ) ) ) ;
190+ }
191+ }
192+ } ;
182193
183194 let ClientRequest :: InitializeRequest ( peer_info) = & request else {
184195 return Err ( ServerInitializeError :: ExpectedInitializeRequest ( Some (
0 commit comments