using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using ModelContextProtocol.Protocol;
using System.ComponentModel;
using System.Reflection;
using System.Text.Json;
namespace ModelContextProtocol.Server;
/// Provides an that's implemented via an .
internal sealed class AIFunctionMcpServerPrompt : McpServerPrompt
{
///
/// Creates an instance for a method, specified via a instance.
///
public static new AIFunctionMcpServerPrompt Create(
Delegate method,
McpServerPromptCreateOptions? options)
{
Throw.IfNull(method);
options = DeriveOptions(method.Method, options);
return Create(method.Method, method.Target, options);
}
///
/// Creates an instance for a method, specified via a instance.
///
public static new AIFunctionMcpServerPrompt Create(
MethodInfo method,
object? target,
McpServerPromptCreateOptions? options)
{
Throw.IfNull(method);
options = DeriveOptions(method, options);
return Create(
AIFunctionFactory.Create(method, target, CreateAIFunctionFactoryOptions(method, options)),
options);
}
///
/// Creates an instance for a method, specified via a instance.
///
public static new AIFunctionMcpServerPrompt Create(
MethodInfo method,
Func, object> createTargetFunc,
McpServerPromptCreateOptions? options)
{
Throw.IfNull(method);
Throw.IfNull(createTargetFunc);
options = DeriveOptions(method, options);
return Create(
AIFunctionFactory.Create(method, args =>
{
var request = (RequestContext)args.Context![typeof(RequestContext)]!;
return createTargetFunc(request);
}, CreateAIFunctionFactoryOptions(method, options)),
options);
}
private static AIFunctionFactoryOptions CreateAIFunctionFactoryOptions(
MethodInfo method, McpServerPromptCreateOptions? options) =>
new()
{
Name = options?.Name ?? method.GetCustomAttribute()?.Name,
Description = options?.Description,
MarshalResult = static (result, _, cancellationToken) => new ValueTask