From d540dc1fb1cf39aad9b3abf11c65cdc425fd4eaa Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Tue, 18 Nov 2025 16:03:31 -0800 Subject: [PATCH] Make `RequestId` non-required (#984) --- .../StreamableHttpHandler.cs | 1 - .../Protocol/JsonRpcMessageWithId.cs | 2 +- .../StatelessServerTests.cs | 3 --- .../Client/McpClientExtensionsTests.cs | 9 --------- .../McpEndpointExtensionsTests.cs | 1 - .../Server/McpServerExtensionsTests.cs | 6 +----- 6 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/ModelContextProtocol.AspNetCore/StreamableHttpHandler.cs b/src/ModelContextProtocol.AspNetCore/StreamableHttpHandler.cs index 9528ddb..9f4af7e 100644 --- a/src/ModelContextProtocol.AspNetCore/StreamableHttpHandler.cs +++ b/src/ModelContextProtocol.AspNetCore/StreamableHttpHandler.cs @@ -250,7 +250,6 @@ internal sealed class StreamableHttpHandler( { var jsonRpcError = new JsonRpcError { - Id = default, Error = new() { Code = errorCode, diff --git a/src/ModelContextProtocol.Core/Protocol/JsonRpcMessageWithId.cs b/src/ModelContextProtocol.Core/Protocol/JsonRpcMessageWithId.cs index 79f4b86..495a432 100644 --- a/src/ModelContextProtocol.Core/Protocol/JsonRpcMessageWithId.cs +++ b/src/ModelContextProtocol.Core/Protocol/JsonRpcMessageWithId.cs @@ -26,5 +26,5 @@ public abstract class JsonRpcMessageWithId : JsonRpcMessage /// Each ID is expected to be unique within the context of a given session. /// [JsonPropertyName("id")] - public required RequestId Id { get; set; } + public RequestId Id { get; set; } } diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/StatelessServerTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/StatelessServerTests.cs index 252af4b..a843e29 100644 --- a/tests/ModelContextProtocol.AspNetCore.Tests/StatelessServerTests.cs +++ b/tests/ModelContextProtocol.AspNetCore.Tests/StatelessServerTests.cs @@ -203,7 +203,6 @@ public class StatelessServerTests(ITestOutputHelper outputHelper) : KestrelInMem var ex = await Assert.ThrowsAsync(() => server.SendRequestAsync(new JsonRpcRequest { - Id = default, Method = RequestMethods.SamplingCreateMessage })); return ex.Message; @@ -222,7 +221,6 @@ public class StatelessServerTests(ITestOutputHelper outputHelper) : KestrelInMem var ex = await Assert.ThrowsAsync(() => server.SendRequestAsync(new JsonRpcRequest { - Id = default, Method = RequestMethods.RootsList })); return ex.Message; @@ -241,7 +239,6 @@ public class StatelessServerTests(ITestOutputHelper outputHelper) : KestrelInMem var ex = await Assert.ThrowsAsync(() => server.SendRequestAsync(new JsonRpcRequest { - Id = default, Method = RequestMethods.ElicitationCreate })); return ex.Message; diff --git a/tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs b/tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs index 8fb7d22..f4e6062 100644 --- a/tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs +++ b/tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs @@ -204,7 +204,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(new object(), McpJsonUtilities.DefaultOptions), }); @@ -226,7 +225,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -249,7 +247,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(callResult, McpJsonUtilities.DefaultOptions), }); @@ -270,7 +267,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(new EmptyResult(), McpJsonUtilities.DefaultOptions), }); @@ -290,7 +286,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(new EmptyResult(), McpJsonUtilities.DefaultOptions), }); @@ -313,7 +308,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -336,7 +330,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -359,7 +352,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -382,7 +374,6 @@ public class McpClientExtensionsTests .Setup(c => c.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); diff --git a/tests/ModelContextProtocol.Tests/McpEndpointExtensionsTests.cs b/tests/ModelContextProtocol.Tests/McpEndpointExtensionsTests.cs index 402b1d0..613c703 100644 --- a/tests/ModelContextProtocol.Tests/McpEndpointExtensionsTests.cs +++ b/tests/ModelContextProtocol.Tests/McpEndpointExtensionsTests.cs @@ -57,7 +57,6 @@ public class McpEndpointExtensionsTests .Setup(s => s.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(42, McpJsonUtilities.DefaultOptions), }); diff --git a/tests/ModelContextProtocol.Tests/Server/McpServerExtensionsTests.cs b/tests/ModelContextProtocol.Tests/Server/McpServerExtensionsTests.cs index bf90b21..e79cf00 100644 --- a/tests/ModelContextProtocol.Tests/Server/McpServerExtensionsTests.cs +++ b/tests/ModelContextProtocol.Tests/Server/McpServerExtensionsTests.cs @@ -94,7 +94,6 @@ public class McpServerExtensionsTests .Setup(s => s.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -146,7 +145,6 @@ public class McpServerExtensionsTests }) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -159,7 +157,7 @@ public class McpServerExtensionsTests Assert.Equal(ChatRole.Assistant, last.Role); Assert.Equal("resp", last.Text); mockServer.Verify(s => s.SendRequestAsync(It.IsAny(), It.IsAny()), Times.Once); - + // Verify that the default value was used Assert.NotNull(capturedRequest); Assert.Equal(CustomMaxSamplingOutputTokens, capturedRequest.MaxTokens); @@ -180,7 +178,6 @@ public class McpServerExtensionsTests .Setup(s => s.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), }); @@ -207,7 +204,6 @@ public class McpServerExtensionsTests .Setup(s => s.SendRequestAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new JsonRpcResponse { - Id = default, Result = JsonSerializer.SerializeToNode(resultPayload, McpJsonUtilities.DefaultOptions), });