diff --git a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java index 271f38231..8598e3164 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java +++ b/mcp/src/main/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransport.java @@ -424,8 +424,8 @@ public Mono sendMessage(JSONRPCMessage message) { .flatMap(body -> sendHttpPost(messageEndpointUri, body).handle((response, sink) -> { if (response.statusCode() != 200 && response.statusCode() != 201 && response.statusCode() != 202 && response.statusCode() != 206) { - sink.error(new RuntimeException( - "Sending message failed with a non-OK HTTP code: " + response.statusCode())); + sink.error(new RuntimeException("Sending message failed with a non-OK HTTP code: " + + response.statusCode() + " - " + response.body())); } else { sink.next(response); @@ -453,7 +453,7 @@ private Mono serializeMessage(final JSONRPCMessage message) { }); } - private Mono> sendHttpPost(final String endpoint, final String body) { + private Mono> sendHttpPost(final String endpoint, final String body) { final URI requestUri = Utils.resolveUri(baseUri, endpoint); final HttpRequest request = this.requestBuilder.copy() .uri(requestUri) @@ -461,7 +461,7 @@ private Mono> sendHttpPost(final String endpoint, final Strin .build(); // TODO: why discard the body? - return Mono.fromFuture(httpClient.sendAsync(request, HttpResponse.BodyHandlers.discarding())); + return Mono.fromFuture(httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())); } /** diff --git a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java index 3f1b71e63..31430543a 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java +++ b/mcp/src/test/java/io/modelcontextprotocol/client/transport/HttpClientSseClientTransportTests.java @@ -105,6 +105,16 @@ void cleanup() { container.stop(); } + @Test + void testErrorOnBogusMessage() { + // bogus message + JSONRPCRequest bogusMessage = new JSONRPCRequest(null, null, "test-id", Map.of("key", "value")); + + StepVerifier.create(transport.sendMessage(bogusMessage)) + .verifyErrorMessage( + "Sending message failed with a non-OK HTTP code: 400 - Invalid message: {\"id\":\"test-id\",\"params\":{\"key\":\"value\"}}"); + } + @Test void testMessageProcessing() { // Create a test message