@@ -295,12 +295,23 @@ private Mono<Disposable> reconnect(McpTransportStream<Disposable> stream) {
295295 if (statusCode >= 200 && statusCode < 300 ) {
296296
297297 if (MESSAGE_EVENT_TYPE .equals (responseEvent .sseEvent ().event ())) {
298+ String data = responseEvent .sseEvent ().data ();
299+ // Per 2025-11-25 spec (SEP-1699), servers may
300+ // send SSE events
301+ // with empty data to prime the client for
302+ // reconnection.
303+ // Skip these events as they contain no JSON-RPC
304+ // message.
305+ if (data == null || data .isBlank ()) {
306+ logger .debug ("Skipping SSE event with empty data (stream primer)" );
307+ return Flux .empty ();
308+ }
298309 try {
299310 // We don't support batching ATM and probably
300311 // won't since the next version considers
301312 // removing it.
302- McpSchema .JSONRPCMessage message = McpSchema . deserializeJsonRpcMessage (
303- this .jsonMapper , responseEvent . sseEvent (). data () );
313+ McpSchema .JSONRPCMessage message = McpSchema
314+ . deserializeJsonRpcMessage ( this .jsonMapper , data );
304315
305316 Tuple2 <Optional <String >, Iterable <McpSchema .JSONRPCMessage >> idWithMessages = Tuples
306317 .of (Optional .ofNullable (responseEvent .sseEvent ().id ()),
@@ -503,13 +514,23 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage sentMessage) {
503514 else if (contentType .contains (TEXT_EVENT_STREAM )) {
504515 return Flux .just (((ResponseSubscribers .SseResponseEvent ) responseEvent ).sseEvent ())
505516 .flatMap (sseEvent -> {
517+ String data = sseEvent .data ();
518+ // Per 2025-11-25 spec (SEP-1699), servers may send SSE
519+ // events
520+ // with empty data to prime the client for reconnection.
521+ // Skip these events as they contain no JSON-RPC message.
522+ if (data == null || data .isBlank ()) {
523+ logger .debug ("Skipping SSE event with empty data (stream primer)" );
524+ deliveredSink .success ();
525+ return Flux .empty ();
526+ }
506527 try {
507528 // We don't support batching ATM and probably
508529 // won't
509530 // since the
510531 // next version considers removing it.
511532 McpSchema .JSONRPCMessage message = McpSchema
512- .deserializeJsonRpcMessage (this .jsonMapper , sseEvent . data () );
533+ .deserializeJsonRpcMessage (this .jsonMapper , data );
513534
514535 Tuple2 <Optional <String >, Iterable <McpSchema .JSONRPCMessage >> idWithMessages = Tuples
515536 .of (Optional .ofNullable (sseEvent .id ()), List .of (message ));
0 commit comments