using System.ComponentModel; using ModelContextProtocol; using ModelContextProtocol.Protocol; using ModelContextProtocol.Server; #pragma warning disable MCP9005 // The frozen alpha conformance fixture deliberately probes the legacy sampling capability. namespace Agent.Mcp.TestHost; [McpServerToolType] public sealed class ConformanceTools { [McpServerTool(Name = "test_missing_capability")] [Description("Conformance-only sampling capability probe.")] public async Task TestMissingCapability(McpServer server, CancellationToken cancellationToken) { await server.SampleAsync(new CreateMessageRequestParams { MaxTokens = 1, Messages = [new SamplingMessage { Role = Role.User, Content = [new TextContentBlock { Text = "probe" }] }] }, cancellationToken).ConfigureAwait(false); return "sampled"; } [McpServerTool(Name = "test_streaming_elicitation")] [Description("Conformance-only response-stream framing probe.")] public string TestStreamingElicitation() => "stream complete"; [McpServerTool(Name = "test_logging_tool")] [Description("Conformance-only request log-level probe.")] public string TestLoggingTool() => "no request-scoped log emitted"; [McpServerTool(Name = "confirm_delete")] [Description("Conformance-only elicitation task fixture.")] public string ConfirmDelete(RequestContext context, string filename) { if (context.Params?.InputResponses?.Count > 0) return $"delete {filename}: accepted"; throw new InputRequiredException(new Dictionary { ["confirm-delete"] = Elicitation($"Confirm deletion of {filename}", "confirm", new ElicitRequestParams.BooleanSchema()) }, "confirm-delete"); } [McpServerTool(Name = "multi_input")] [Description("Conformance-only multiple elicitation task fixture.")] public string MultiInput(RequestContext context) { if (context.Params?.InputResponses?.Count >= 2) return "both inputs received"; throw new InputRequiredException(new Dictionary { ["first"] = Elicitation("First confirmation", "confirm", new ElicitRequestParams.BooleanSchema()), ["second"] = Elicitation("Second confirmation", "confirm", new ElicitRequestParams.BooleanSchema()) }, "multi-input"); } [McpServerTool(Name = "test_tool_with_task")] [Description("Conformance-only MRTR and Tasks composition fixture.")] public string TestToolWithTask(RequestContext context) { if (context.Params?.InputResponses is { Count: > 0 } responses) { string response = System.Text.Json.JsonSerializer.Serialize(responses); return response.Contains("Alice", StringComparison.Ordinal) ? "Hello, Alice" : "Hello, user"; } throw new InputRequiredException(new Dictionary { ["user-name"] = Elicitation("Provide a user name", "name", new ElicitRequestParams.StringSchema()) }, "user-name"); } private static InputRequest Elicitation(string message, string propertyName, ElicitRequestParams.PrimitiveSchemaDefinition schema) => InputRequest.ForElicitation(new ElicitRequestParams { Mode = "form", Message = message, RequestedSchema = new ElicitRequestParams.RequestSchema { Properties = new Dictionary { [propertyName] = schema }, Required = [propertyName] } }); public sealed class Confirmation { public bool Confirm { get; set; } } public sealed class UserName { public string? Name { get; set; } } }