33import com .fasterxml .jackson .core .type .TypeReference ;
44import com .fasterxml .jackson .databind .ObjectMapper ;
55import io .modelcontextprotocol .common .McpTransportContext ;
6+ import io .modelcontextprotocol .json .TypeRef ;
67import io .modelcontextprotocol .server .McpTransportContextExtractor ;
78import io .modelcontextprotocol .spec .*;
89import io .modelcontextprotocol .util .Assert ;
2324import reactor .core .publisher .Mono ;
2425
2526import java .io .IOException ;
27+ import java .lang .reflect .Type ;
2628import java .time .Duration ;
2729import java .util .List ;
2830import java .util .Map ;
@@ -115,7 +117,7 @@ private DefaultMcpStreamableServerTransportProvider(ObjectMapper objectMapper,
115117
116118 @ Override
117119 public List <String > protocolVersions () {
118- return List .of (ProtocolVersions .MCP_2024_11_05 , ProtocolVersions .MCP_2025_03_26 );
120+ return List .of (ProtocolVersions .MCP_2024_11_05 , ProtocolVersions .MCP_2025_03_26 , ProtocolVersions . MCP_2025_06_18 );
119121 }
120122
121123 @ Override
@@ -215,7 +217,9 @@ public Object handleGet(HttpClassicServerRequest request, HttpClassicServerRespo
215217
216218 if (session == null ) {
217219 response .statusCode (HttpResponseStatus .NOT_FOUND .statusCode ());
218- return Entity .createObject (response , new McpError ("Session not found: " + sessionId ));
220+ return Entity .createObject (response , McpError .builder (McpSchema .ErrorCodes .INVALID_PARAMS )
221+ .message ("Session not found: " + sessionId )
222+ .build ());
219223 }
220224
221225 logger .info ("[GET] Handling GET request for session: {}" , sessionId );
@@ -308,7 +312,9 @@ public Object handlePost(HttpClassicServerRequest request,
308312 || !acceptHeaders .contains (MimeType .APPLICATION_JSON .value ())) {
309313 response .statusCode (HttpResponseStatus .BAD_REQUEST .statusCode ());
310314 return Entity .createObject (response ,
311- new McpError ("Invalid Accept headers. Expected TEXT_EVENT_STREAM and APPLICATION_JSON" ));
315+ McpError .builder (McpSchema .ErrorCodes .INVALID_REQUEST )
316+ .message ("Invalid Accept headers. Expected TEXT_EVENT_STREAM and APPLICATION_JSON" )
317+ .build ());
312318 }
313319 McpTransportContext transportContext = this .contextExtractor .extract (request );
314320 try {
@@ -341,14 +347,18 @@ public Object handlePost(HttpClassicServerRequest request,
341347 catch (Exception e ) {
342348 logger .error ("Failed to initialize session: {}" , e .getMessage ());
343349 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
344- return Entity .createObject (response , new McpError (e .getMessage ()));
350+ return Entity .createObject (response , McpError .builder (McpSchema .ErrorCodes .INTERNAL_ERROR )
351+ .message (e .getMessage ())
352+ .build ());
345353 }
346354 }
347355
348356 // Handle other messages that require a session
349357 if (!request .headers ().contains (HttpHeaders .MCP_SESSION_ID )) {
350358 response .statusCode (HttpResponseStatus .BAD_REQUEST .statusCode ());
351- return Entity .createObject (response , new McpError ("Session ID missing" ));
359+ return Entity .createObject (response , McpError .builder (McpSchema .ErrorCodes .INVALID_REQUEST )
360+ .message ("Session ID missing" )
361+ .build ());
352362 }
353363
354364 String sessionId = request .headers ().first (HttpHeaders .MCP_SESSION_ID ).orElse ("" );
@@ -357,7 +367,9 @@ public Object handlePost(HttpClassicServerRequest request,
357367
358368 if (session == null ) {
359369 response .statusCode (HttpResponseStatus .NOT_FOUND .statusCode ());
360- return Entity .createObject (response , new McpError ("Session not found: " + sessionId ));
370+ return Entity .createObject (response , McpError .builder (McpSchema .ErrorCodes .INVALID_PARAMS )
371+ .message ("Session not found: " + sessionId )
372+ .build ());
361373 }
362374
363375 if (message instanceof McpSchema .JSONRPCResponse jsonrpcResponse ) {
@@ -408,18 +420,18 @@ public void onFailed(Exception e) {
408420 }
409421 else {
410422 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
411- return Entity .createObject (response , new McpError ( "Unknown message type" ));
423+ return Entity .createObject (response , McpError . builder ( McpSchema . ErrorCodes . INTERNAL_ERROR ). message ( "Unknown message type" ). build ( ));
412424 }
413425 }
414426 catch (IllegalArgumentException | IOException e ) {
415427 logger .error ("Failed to deserialize message: {}" , e .getMessage ());
416428 response .statusCode (HttpResponseStatus .BAD_REQUEST .statusCode ());
417- return Entity .createObject (response , new McpError ( "Invalid message format" ));
429+ return Entity .createObject (response , McpError . builder ( McpSchema . ErrorCodes . PARSE_ERROR ). message ( "Invalid message format" ). build ( ));
418430 }
419431 catch (Exception e ) {
420432 logger .error ("Error handling message: {}" , e .getMessage ());
421433 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
422- return Entity .createObject (response , new McpError ( e .getMessage ()));
434+ return Entity .createObject (response , McpError . builder ( McpSchema . ErrorCodes . INTERNAL_ERROR ). message ( e .getMessage ()). build ( ));
423435 }
424436 }
425437
@@ -455,7 +467,7 @@ public Object handleDelete(HttpClassicServerRequest request, HttpClassicServerRe
455467 logger .info ("[DELETE] Receiving delete request from session: {}" , sessionId );
456468 if (session == null ) {
457469 response .statusCode (HttpResponseStatus .NOT_FOUND .statusCode ());
458- return Entity .createObject (response , new McpError ( "Session not found: " + sessionId ));
470+ return Entity .createObject (response , McpError . builder ( McpSchema . ErrorCodes . INVALID_PARAMS ). message ( "Session not found: " + sessionId ). build ( ));
459471 }
460472
461473 try {
@@ -467,7 +479,7 @@ public Object handleDelete(HttpClassicServerRequest request, HttpClassicServerRe
467479 catch (Exception e ) {
468480 logger .error ("Failed to delete session {}: {}" , sessionId , e .getMessage ());
469481 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
470- return Entity .createObject (response , new McpError ( e .getMessage ()));
482+ return Entity .createObject (response , McpError . builder ( McpSchema . ErrorCodes . INTERNAL_ERROR ). message ( e .getMessage ()). build ( ));
471483 }
472484 }
473485
@@ -591,8 +603,15 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message, String messageId
591603 * @param <T> The target type
592604 */
593605 @ Override
594- public <T > T unmarshalFrom (Object data , TypeReference <T > typeRef ) {
595- return objectMapper .convertValue (data , typeRef );
606+ public <T > T unmarshalFrom (Object data , TypeRef <T > typeRef ) {
607+ // Convert TypeRef to TypeReference for ObjectMapper compatibility
608+ TypeReference <T > typeReference = new TypeReference <T >() {
609+ @ Override
610+ public Type getType () {
611+ return typeRef .getType ();
612+ }
613+ };
614+ return objectMapper .convertValue (data , typeReference );
596615 }
597616
598617 /**
0 commit comments