diff --git a/src/ModelContextProtocol.Core/Protocol/CreateMessageRequestParams.cs b/src/ModelContextProtocol.Core/Protocol/CreateMessageRequestParams.cs index 711f1fcea..ef5e57d2c 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 f57faf1d8..4771f550b 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 void WithToolChoiceNone_SerializationRoundtrips() 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"]!); + } }