@@ -299,6 +299,67 @@ async fn server_pinned_version_used_as_fallback_for_unknown_client_request() {
299299 assert_eq ! ( negotiated, ProtocolVersion :: V_2025_06_18 ) ;
300300}
301301
302+ fn duplicate_init_request ( id : u64 , version : & str ) -> ClientJsonRpcMessage {
303+ msg ( & format ! (
304+ r#"{{
305+ "jsonrpc": "2.0",
306+ "id": {id},
307+ "method": "initialize",
308+ "params": {{
309+ "protocolVersion": "{version}",
310+ "capabilities": {{ "sampling": {{}} }},
311+ "clientInfo": {{ "name": "renegotiated-client", "version": "9.9.9" }}
312+ }}
313+ }}"#
314+ ) )
315+ }
316+
317+ #[ tokio:: test]
318+ async fn server_accepts_duplicate_initialize ( ) {
319+ let ( server_transport, client_transport) = tokio:: io:: duplex ( 4096 ) ;
320+ let _server = tokio:: spawn ( async move { TestServer :: new ( ) . serve ( server_transport) . await } ) ;
321+ let mut client = IntoTransport :: < rmcp:: RoleClient , _ , _ > :: into_transport ( client_transport) ;
322+
323+ do_initialize ( & mut client) . await ;
324+ client. send ( initialized_notification ( ) ) . await . unwrap ( ) ;
325+
326+ client
327+ . send ( duplicate_init_request ( 2 , "2025-11-25" ) )
328+ . await
329+ . unwrap ( ) ;
330+ let response = client. receive ( ) . await . unwrap ( ) ;
331+ assert ! (
332+ matches!( response, ServerJsonRpcMessage :: Response ( _) ) ,
333+ "expected successful InitializeResult, got: {response:?}"
334+ ) ;
335+ }
336+
337+ #[ tokio:: test]
338+ async fn server_session_remains_usable_after_renegotiation ( ) {
339+ let ( server_transport, client_transport) = tokio:: io:: duplex ( 4096 ) ;
340+ let _server = tokio:: spawn ( async move { TestServer :: new ( ) . serve ( server_transport) . await } ) ;
341+ let mut client = IntoTransport :: < rmcp:: RoleClient , _ , _ > :: into_transport ( client_transport) ;
342+
343+ do_initialize ( & mut client) . await ;
344+ client. send ( initialized_notification ( ) ) . await . unwrap ( ) ;
345+ client
346+ . send ( duplicate_init_request ( 2 , "2025-11-25" ) )
347+ . await
348+ . unwrap ( ) ;
349+ let _renegotiated = client. receive ( ) . await . unwrap ( ) ;
350+
351+ client. send ( ping_request ( 3 ) ) . await . unwrap ( ) ;
352+ let pong = client. receive ( ) . await . unwrap ( ) ;
353+ assert ! (
354+ matches!(
355+ pong,
356+ ServerJsonRpcMessage :: Response ( ref r)
357+ if matches!( r. result, ServerResult :: EmptyResult ( _) )
358+ ) ,
359+ "expected EmptyResult ping after renegotiation, got: {pong:?}"
360+ ) ;
361+ }
362+
302363// Server buffers multiple requests before initialized and processes them in order.
303364#[ tokio:: test]
304365async fn server_init_buffers_multiple_requests_before_initialized ( ) {
0 commit comments