feat: implement ping request handler in MCP async client (#203)
- Add ping request handler that responds with empty Map instead of null - Ensure compliance with MCP protocol requirement for ping responses - Add test for ping message request handling Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
This commit is contained in:
parent
1cbace3353
commit
ebb9764c1b
2 changed files with 30 additions and 1 deletions
|
|
@ -187,6 +187,9 @@ public class McpAsyncClient {
|
||||||
// Request Handlers
|
// Request Handlers
|
||||||
Map<String, RequestHandler<?>> requestHandlers = new HashMap<>();
|
Map<String, RequestHandler<?>> requestHandlers = new HashMap<>();
|
||||||
|
|
||||||
|
// Ping MUST respond with an empty data, but not NULL response.
|
||||||
|
requestHandlers.put(McpSchema.METHOD_PING, params -> Mono.just(Map.of()));
|
||||||
|
|
||||||
// Roots List Request Handler
|
// Roots List Request Handler
|
||||||
if (this.clientCapabilities.roots() != null) {
|
if (this.clientCapabilities.roots() != null) {
|
||||||
requestHandlers.put(McpSchema.METHOD_ROOTS_LIST, rootsListRequestHandler());
|
requestHandlers.put(McpSchema.METHOD_ROOTS_LIST, rootsListRequestHandler());
|
||||||
|
|
|
||||||
|
|
@ -525,4 +525,30 @@ class McpAsyncClientResponseHandlerTests {
|
||||||
.hasMessage("Elicitation handler must not be null when client capabilities include elicitation");
|
.hasMessage("Elicitation handler must not be null when client capabilities include elicitation");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testPingMessageRequestHandling() {
|
||||||
|
MockMcpClientTransport transport = initializationEnabledTransport();
|
||||||
|
|
||||||
|
McpAsyncClient asyncMcpClient = McpClient.async(transport).build();
|
||||||
|
|
||||||
|
assertThat(asyncMcpClient.initialize().block()).isNotNull();
|
||||||
|
|
||||||
|
// Simulate incoming ping request from server
|
||||||
|
McpSchema.JSONRPCRequest pingRequest = new McpSchema.JSONRPCRequest(McpSchema.JSONRPC_VERSION,
|
||||||
|
McpSchema.METHOD_PING, "ping-id", null);
|
||||||
|
transport.simulateIncomingMessage(pingRequest);
|
||||||
|
|
||||||
|
// Verify response
|
||||||
|
McpSchema.JSONRPCMessage sentMessage = transport.getLastSentMessage();
|
||||||
|
assertThat(sentMessage).isInstanceOf(McpSchema.JSONRPCResponse.class);
|
||||||
|
|
||||||
|
McpSchema.JSONRPCResponse response = (McpSchema.JSONRPCResponse) sentMessage;
|
||||||
|
assertThat(response.id()).isEqualTo("ping-id");
|
||||||
|
assertThat(response.error()).isNull();
|
||||||
|
assertThat(response.result()).isInstanceOf(Map.class);
|
||||||
|
assertThat(((Map<?, ?>) response.result())).isEmpty();
|
||||||
|
|
||||||
|
asyncMcpClient.closeGracefully();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue