Bug description
When a server sends a request to a Java SDK client, an asynchronous sampling or elicitation handler can return Mono.empty(). McpClientSession then sends no JSON-RPC response, so the server waits until its request timeout.
JSON-RPC 2.0 requires a response for every request with an ID. An empty handler completion should produce an error response with the original request ID.
This is the client-side counterpart to #1081. The open fix at #1099 changes only server-side dispatch paths.
Environment
- Java SDK v2.0.1, commit
c7e1cfe90edcd9cbe030924310a194dc5492eab2
- Java SDK main, commit
39c225e46c51311eaf82192f15b950e421580fb5
- Temurin 25.0.3, compiling with the repository's Java 17 target
Steps to reproduce
Register a client request handler that returns Mono.empty(), then deliver a JSON-RPC request with an ID:
var transport = new MockMcpClientTransport();
var session = new McpClientSession(TIMEOUT, transport,
Map.of("test.method", params -> Mono.empty()), Map.of(), Function.identity());
transport.simulateIncomingMessage(new McpSchema.JSONRPCRequest("test.method", "test-id"));
assertThat(transport.getLastSentMessage()).isInstanceOf(McpSchema.JSONRPCResponse.class);
Both v2.0.1 and main fail because getLastSentMessage() is null:
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
Expecting actual not to be null
Expected behavior
The client sends one JSON-RPC error response with ID test-id and code -32603.
Minimal Complete Reproducible example
The regression test is in McpClientSessionTests.testEmptyRequestHandlerSendsErrorResponse.
Bug description
When a server sends a request to a Java SDK client, an asynchronous sampling or elicitation handler can return
Mono.empty().McpClientSessionthen sends no JSON-RPC response, so the server waits until its request timeout.JSON-RPC 2.0 requires a response for every request with an ID. An empty handler completion should produce an error response with the original request ID.
This is the client-side counterpart to #1081. The open fix at #1099 changes only server-side dispatch paths.
Environment
c7e1cfe90edcd9cbe030924310a194dc5492eab239c225e46c51311eaf82192f15b950e421580fb5Steps to reproduce
Register a client request handler that returns
Mono.empty(), then deliver a JSON-RPC request with an ID:Both v2.0.1 and main fail because
getLastSentMessage()isnull:Expected behavior
The client sends one JSON-RPC error response with ID
test-idand code-32603.Minimal Complete Reproducible example
The regression test is in
McpClientSessionTests.testEmptyRequestHandlerSendsErrorResponse.