diff --git a/tests/ModelContextProtocol.Tests/Protocol/ElicitationTypedTests.cs b/tests/ModelContextProtocol.Tests/Protocol/ElicitationTypedTests.cs index 7ac39d59..adca9f1d 100644 --- a/tests/ModelContextProtocol.Tests/Protocol/ElicitationTypedTests.cs +++ b/tests/ModelContextProtocol.Tests/Protocol/ElicitationTypedTests.cs @@ -34,6 +34,20 @@ protected override void ConfigureServices(ServiceCollection services, IMcpServer Assert.Equal(SampleRole.Admin, result.Content!.Role); Assert.Equal(99.5, result.Content!.Score); } + else if (request.Params!.Name == "TestElicitationTypedNoSerializationOptions") + { + var result = await request.Server.ElicitAsync( + message: "Please provide more information.", + cancellationToken: CancellationToken.None); + + Assert.Equal("accept", result.Action); + Assert.NotNull(result.Content); + Assert.Equal("Alice", result.Content!.Name); + Assert.Equal(30, result.Content!.Age); + Assert.True(result.Content!.Active); + Assert.Equal(SampleRole.Admin, result.Content!.Role); + Assert.Equal(99.5, result.Content!.Score); + } else if (request.Params!.Name == "TestElicitationCamelForm") { var result = await request.Server.ElicitAsync( @@ -194,6 +208,107 @@ public async Task Can_Elicit_Typed_Information() Assert.Equal("success", (result.Content[0] as TextContentBlock)?.Text); } + [Fact] + public async Task Can_Elicit_Typed_Information_No_SerializationOptions() + { + if (JsonSerializer.IsReflectionEnabledByDefault is false) + { + Assert.Skip("Reflection is disabled by default. This test requires reflection to be enabled."); + } + + await using McpClient client = await CreateMcpClientForServer(new McpClientOptions + { + Capabilities = new() + { + Elicitation = new() + { + ElicitationHandler = async (request, cancellationToken) => + { + Assert.NotNull(request); + Assert.Equal("Please provide more information.", request.Message); + + Assert.Equal(6, request.RequestedSchema.Properties.Count); + + foreach (var entry in request.RequestedSchema.Properties) + { + var key = entry.Key; + var value = entry.Value; + switch (key) + { + case "name": + var stringSchema = Assert.IsType(value); + Assert.Equal("string", stringSchema.Type); + break; + + case "age": + var intSchema = Assert.IsType(value); + Assert.Equal("integer", intSchema.Type); + break; + + case "active": + var boolSchema = Assert.IsType(value); + Assert.Equal("boolean", boolSchema.Type); + break; + + case "role": + var enumSchema = Assert.IsType(value); + Assert.Equal("string", enumSchema.Type); + Assert.Equal([nameof(SampleRole.User), nameof(SampleRole.Admin)], enumSchema.Enum); + break; + + case "score": + var numSchema = Assert.IsType(value); + Assert.Equal("number", numSchema.Type); + break; + + case "created": + var dateTimeSchema = Assert.IsType(value); + Assert.Equal("string", dateTimeSchema.Type); + Assert.Equal("date-time", dateTimeSchema.Format); + + break; + + default: + Assert.Fail($"Unexpected property in schema: {key}"); + break; + } + } + + return new ElicitResult + { + Action = "accept", + Content = new Dictionary + { + [nameof(SampleForm.Name)] = (JsonElement)JsonSerializer.Deserialize(""" + "Alice" + """, McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, + [nameof(SampleForm.Age)] = (JsonElement)JsonSerializer.Deserialize(""" + 30 + """, McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, + [nameof(SampleForm.Active)] = (JsonElement)JsonSerializer.Deserialize(""" + true + """, McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, + [nameof(SampleForm.Role)] = (JsonElement)JsonSerializer.Deserialize(""" + "Admin" + """, McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, + [nameof(SampleForm.Score)] = (JsonElement)JsonSerializer.Deserialize(""" + 99.5 + """, McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, + [nameof(SampleForm.Created)] = (JsonElement)JsonSerializer.Deserialize(""" + "2023-08-27T03:05:00" + """, McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, + }, + }; + }, + }, + }, + }); + + var result = await client.CallToolAsync("TestElicitationTypedNoSerializationOptions", cancellationToken: TestContext.Current.CancellationToken); + + Assert.Equal("success", (result.Content[0] as TextContentBlock)?.Text); + } + [Fact] public async Task Elicit_Typed_Respects_NamingPolicy() {