diff --git a/src/ModelContextProtocol.Core/Client/McpClientImpl.cs b/src/ModelContextProtocol.Core/Client/McpClientImpl.cs index 8317656d0..ae726e825 100644 --- a/src/ModelContextProtocol.Core/Client/McpClientImpl.cs +++ b/src/ModelContextProtocol.Core/Client/McpClientImpl.cs @@ -85,6 +85,12 @@ private void RegisterHandlers(McpClientOptions options, NotificationHandlers not notificationHandlers.RegisterRange(notificationHandlersFromOptions); } + requestHandlers.Set( + RequestMethods.Ping, + (request, _, cancellationToken) => new ValueTask(new PingResult()), + McpJsonUtilities.JsonContext.Default.JsonNode, + McpJsonUtilities.JsonContext.Default.PingResult); + if (taskStatusHandler is not null) { notificationHandlers.Register( diff --git a/tests/ModelContextProtocol.Tests/Client/McpClientTests.cs b/tests/ModelContextProtocol.Tests/Client/McpClientTests.cs index 32e04da60..9a99f597c 100644 --- a/tests/ModelContextProtocol.Tests/Client/McpClientTests.cs +++ b/tests/ModelContextProtocol.Tests/Client/McpClientTests.cs @@ -782,4 +782,16 @@ public async Task SetLoggingLevelAsync_WithRequestParams_NullThrows() await Assert.ThrowsAsync("requestParams", () => client.SetLoggingLevelAsync((SetLevelRequestParams)null!, TestContext.Current.CancellationToken)); } + + [Fact] + public async Task ServerCanPingClient() + { + await using McpClient client = await CreateMcpClientForServer(); + + var pingRequest = new JsonRpcRequest { Method = RequestMethods.Ping }; + var response = await Server.SendRequestAsync(pingRequest, TestContext.Current.CancellationToken); + + Assert.NotNull(response); + Assert.NotNull(response.Result); + } }