using Microsoft.Extensions.AI; using Microsoft.Extensions.DependencyInjection; using ModelContextProtocol.Protocol; using System.Text.Json; namespace ModelContextProtocol.Server; /// /// Used to indicate that a method should be considered an . /// /// /// /// This attribute is applied to methods that should be exposed as prompts in the Model Context Protocol. When a class /// containing methods marked with this attribute is registered with McpServerBuilderExtensions, /// these methods become available as prompts that can be called by MCP clients. /// /// /// When methods are provided directly to , the attribute is not required. /// /// /// By default, parameters are sourced from the dictionary, which is a collection /// of key/value pairs. Those parameters are deserialized from the /// values in that collection. There are a few exceptions to this: /// /// /// /// parameters are automatically bound to a provided by the /// and that respects any s sent by the client for this operation's /// . /// /// /// /// /// parameters are bound from the for this request. /// /// /// /// /// parameters are bound directly to the instance associated /// with this request's . Such parameters may be used to understand /// what server is being used to process the request, and to interact with the client issuing the request to that server. /// /// /// /// /// parameters accepting values /// are bound to an instance manufactured to forward progress notifications /// from the prompt to the client. If the client included a in their request, progress reports issued /// to this instance will propagate to the client as notifications with /// that token. If the client did not include a , the instance will ignore any progress reports issued to it. /// /// /// /// /// When the is constructed, it may be passed an via /// . Any parameter that can be satisfied by that /// according to will be resolved from the provided to the /// prompt invocation rather than from the argument collection. /// /// /// /// /// Any parameter attributed with will similarly be resolved from the /// provided to the prompt invocation rather than from the argument collection. /// /// /// /// /// /// All other parameters are deserialized from the s in the dictionary. /// /// /// In general, the data supplied via the 's dictionary is passed along from the caller and /// should thus be considered unvalidated and untrusted. To provide validated and trusted data to the invocation of the prompt, consider having /// the prompt be an instance method, referring to data stored in the instance, or using an instance or parameters resolved from the /// to provide data to the method. /// /// /// Return values from a method are used to create the that is sent back to the client: /// /// /// /// /// Converted to a list containing a single with its set to contain the . /// /// /// /// Converted to a list containing the single . /// /// /// of /// Converted to a list containing all of the returned instances. /// /// /// /// Converted to a list of instances derived from the with . /// /// /// of /// Converted to a list of instances derived from all of the instances with . /// /// /// /// Other returned types will result in an being thrown. /// /// /// Parameters of type that are decorated with AllowedValuesAttribute /// will automatically have their allowed values surfaced as completions in response to completion/complete requests from clients, /// without requiring a custom to be configured. /// /// [AttributeUsage(AttributeTargets.Method)] public sealed class McpServerPromptAttribute : Attribute { /// /// Initializes a new instance of the class. /// public McpServerPromptAttribute() { } /// Gets or sets the name of the prompt. /// If , the method name is used. public string? Name { get; set; } /// Gets or sets the title of the prompt. public string? Title { get; set; } /// /// Gets or sets the source URI for the prompt's icon. /// /// /// /// This value can be an HTTP/HTTPS URL pointing to an image file or a data URI with base64-encoded image data. /// When specified, a single icon will be added to the prompt. /// /// /// For more advanced icon configuration (multiple icons, MIME type specification, size characteristics), /// use when creating the prompt programmatically. /// /// public string? IconSource { get; set; } }