From 971740b1426b7e9640574f7df4541a4207774620 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Mon, 30 Jun 2025 10:57:35 -0400 Subject: [PATCH] Make CallToolResult.IsError optional Match the spec, and avoid sending the property in the success case. --- .../Protocol/CallToolResult.cs | 2 +- .../HttpServerIntegrationTests.cs | 10 +++++----- .../MapMcpTests.cs | 2 +- .../ClientIntegrationTests.cs | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ModelContextProtocol.Core/Protocol/CallToolResult.cs b/src/ModelContextProtocol.Core/Protocol/CallToolResult.cs index 7438522c..5d4750aa 100644 --- a/src/ModelContextProtocol.Core/Protocol/CallToolResult.cs +++ b/src/ModelContextProtocol.Core/Protocol/CallToolResult.cs @@ -44,5 +44,5 @@ public sealed class CallToolResult : Result /// and potentially self-correct in subsequent requests. /// [JsonPropertyName("isError")] - public bool IsError { get; set; } + public bool? IsError { get; set; } } diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/HttpServerIntegrationTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/HttpServerIntegrationTests.cs index 394fa497..eb623686 100644 --- a/tests/ModelContextProtocol.AspNetCore.Tests/HttpServerIntegrationTests.cs +++ b/tests/ModelContextProtocol.AspNetCore.Tests/HttpServerIntegrationTests.cs @@ -94,7 +94,7 @@ public async Task CallTool_Sse_EchoServer() // assert Assert.NotNull(result); - Assert.False(result.IsError); + Assert.Null(result.IsError); var textContent = Assert.Single(result.Content.OfType()); Assert.Equal("Echo: Hello MCP!", textContent.Text); } @@ -115,9 +115,9 @@ public async Task CallTool_EchoSessionId_ReturnsTheSameSessionId() Assert.NotNull(result2); Assert.NotNull(result3); - Assert.False(result1.IsError); - Assert.False(result2.IsError); - Assert.False(result3.IsError); + Assert.Null(result1.IsError); + Assert.Null(result2.IsError); + Assert.Null(result3.IsError); var textContent1 = Assert.Single(result1.Content.OfType()); var textContent2 = Assert.Single(result2.Content.OfType()); @@ -298,7 +298,7 @@ public async Task CallTool_Sse_EchoServer_Concurrently() ); Assert.NotNull(result); - Assert.False(result.IsError); + Assert.Null(result.IsError); var textContent = Assert.Single(result.Content.OfType()); Assert.Equal($"Echo: Hello MCP! {i}", textContent.Text); } diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpTests.cs index 2fd23204..7f94689b 100644 --- a/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpTests.cs +++ b/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpTests.cs @@ -171,7 +171,7 @@ public async Task Sampling_DoesNotCloseStream_Prematurely() }, cancellationToken: TestContext.Current.CancellationToken); Assert.NotNull(result); - Assert.False(result.IsError); + Assert.Null(result.IsError); var textContent = Assert.Single(result.Content); Assert.Equal("text", textContent.Type); Assert.Equal("Sampling completed successfully. Client responded: Sampling response from client", Assert.IsType(textContent).Text); diff --git a/tests/ModelContextProtocol.Tests/ClientIntegrationTests.cs b/tests/ModelContextProtocol.Tests/ClientIntegrationTests.cs index a8ee21d7..3e4361a5 100644 --- a/tests/ModelContextProtocol.Tests/ClientIntegrationTests.cs +++ b/tests/ModelContextProtocol.Tests/ClientIntegrationTests.cs @@ -91,7 +91,7 @@ public async Task CallTool_Stdio_EchoServer(string clientId) // assert Assert.NotNull(result); - Assert.False(result.IsError); + Assert.Null(result.IsError); var textContent = Assert.Single(result.Content.OfType()); Assert.Equal("Echo: Hello MCP!", textContent.Text); } @@ -107,7 +107,7 @@ public async Task CallTool_Stdio_EchoSessionId_ReturnsEmpty() // assert Assert.NotNull(result); - Assert.False(result.IsError); + Assert.Null(result.IsError); var textContent = Assert.Single(result.Content.OfType()); Assert.Empty(textContent.Text); } @@ -485,7 +485,7 @@ public async Task CallTool_Stdio_MemoryServer() // assert Assert.NotNull(result); - Assert.False(result.IsError); + Assert.Null(result.IsError); Assert.Single(result.Content, c => c.Type == "text"); await client.DisposeAsync();