From ce2a5e4a4b7c4bd5d04c889ef58a367b61d8ff8c Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:08:03 -0500 Subject: [PATCH] Fix CreateMessageRequestParams.Metadata type to JsonObject (#1354) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> Co-authored-by: Stephen Toub --- .../Protocol/CreateMessageRequestParams.cs | 4 +-- .../CreateMessageRequestParamsTests.cs | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/ModelContextProtocol.Core/Protocol/CreateMessageRequestParams.cs b/src/ModelContextProtocol.Core/Protocol/CreateMessageRequestParams.cs index 711f1fc..ef5e57d 100644 --- a/src/ModelContextProtocol.Core/Protocol/CreateMessageRequestParams.cs +++ b/src/ModelContextProtocol.Core/Protocol/CreateMessageRequestParams.cs @@ -1,5 +1,5 @@ using System.Diagnostics.CodeAnalysis; -using System.Text.Json; +using System.Text.Json.Nodes; using System.Text.Json.Serialization; namespace ModelContextProtocol.Protocol; @@ -68,7 +68,7 @@ public sealed class CreateMessageRequestParams : RequestParams /// /// [JsonPropertyName("metadata")] - public JsonElement? Metadata { get; set; } + public JsonObject? Metadata { get; set; } /// /// Gets or sets the server's preferences for which model to select. diff --git a/tests/ModelContextProtocol.Tests/Protocol/CreateMessageRequestParamsTests.cs b/tests/ModelContextProtocol.Tests/Protocol/CreateMessageRequestParamsTests.cs index f57faf1..4771f55 100644 --- a/tests/ModelContextProtocol.Tests/Protocol/CreateMessageRequestParamsTests.cs +++ b/tests/ModelContextProtocol.Tests/Protocol/CreateMessageRequestParamsTests.cs @@ -1,5 +1,6 @@ using ModelContextProtocol.Protocol; using System.Text.Json; +using System.Text.Json.Nodes; namespace ModelContextProtocol.Tests.Protocol; @@ -166,6 +167,37 @@ public class CreateMessageRequestParamsTests Assert.NotNull(deserialized.ToolChoice); Assert.Equal("none", deserialized.ToolChoice.Mode); } + + [Fact] + public void WithMetadata_SerializationRoundtrips() + { + CreateMessageRequestParams requestParams = new() + { + MaxTokens = 500, + Messages = + [ + new SamplingMessage + { + Role = Role.User, + Content = [new TextContentBlock { Text = "Hello" }] + } + ], + Metadata = new JsonObject + { + ["provider"] = "test-provider", + ["custom_setting"] = 42 + } + }; + + var json = JsonSerializer.Serialize(requestParams, McpJsonUtilities.DefaultOptions); + var deserialized = JsonSerializer.Deserialize(json, McpJsonUtilities.DefaultOptions); + + Assert.NotNull(deserialized); + Assert.Equal(500, deserialized.MaxTokens); + Assert.NotNull(deserialized.Metadata); + Assert.Equal("test-provider", (string?)deserialized.Metadata["provider"]); + Assert.Equal(42, (int)deserialized.Metadata["custom_setting"]!); + } }