#pragma warning disable MCPEXP001 // MRTR (SEP-2322) is experimental.
using ModelContextProtocol;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
using System.ComponentModel;
using System.Text.Json;
namespace ConformanceServer.Prompts;
///
/// Prompt implementing the SEP-2322 D1 conformance scenario (incomplete-result-non-tool-request),
/// proving that prompts/get can return an just like
/// tools/call.
///
[McpServerPromptType]
public sealed class IncompleteResultPrompts
{
[McpServerPrompt(Name = "test_input_required_result_prompt")]
[Description("SEP-2322 D1: prompts/get returns InputRequiredResult until user_context is supplied.")]
public static GetPromptResult IncompleteResultPrompt(RequestContext context)
{
if (context.Params!.InputResponses is { } responses &&
responses.TryGetValue("user_context", out var response))
{
var elicit = response.Deserialize(InputResponse.ElicitResultJsonTypeInfo);
var contextValue = TryReadString(elicit?.Content, "context") ?? "(unknown)";
return new GetPromptResult
{
Description = "Prompt customized with elicited user context.",
Messages =
[
new PromptMessage
{
Role = Role.User,
Content = new TextContentBlock { Text = $"Please continue using context: {contextValue}" },
},
],
};
}
throw new InputRequiredException(
new Dictionary
{
["user_context"] = InputRequest.ForElicitation(new ElicitRequestParams
{
Message = "What context should the prompt use?",
RequestedSchema = new ElicitRequestParams.RequestSchema
{
Properties = new Dictionary
{
["context"] = new ElicitRequestParams.StringSchema(),
},
Required = ["context"],
},
}),
});
}
private static string? TryReadString(IDictionary? content, string key)
{
if (content is null || !content.TryGetValue(key, out var element))
{
return null;
}
return element.ValueKind == JsonValueKind.String ? element.GetString() : element.ToString();
}
}