diff --git a/Directory.Packages.props b/Directory.Packages.props
index fa70d20a..585b3c11 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -2,7 +2,7 @@
true
10.0.0-preview.3.25171.5
- 9.4.4-preview.1.25259.16
+ 9.5.0-preview.1.25262.9
@@ -31,7 +31,7 @@
-
+
diff --git a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.cs b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.cs
index 0be6467b..45fdadd0 100644
--- a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.cs
+++ b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.cs
@@ -48,7 +48,7 @@ public static partial class McpServerBuilderExtensions
{
builder.Services.AddSingleton((Func)(toolMethod.IsStatic ?
services => McpServerTool.Create(toolMethod, options: new() { Services = services, SerializerOptions = serializerOptions }) :
- services => McpServerTool.Create(toolMethod, typeof(TToolType), new() { Services = services, SerializerOptions = serializerOptions })));
+ services => McpServerTool.Create(toolMethod, static r => CreateTarget(r.Services, typeof(TToolType)), new() { Services = services, SerializerOptions = serializerOptions })));
}
}
@@ -105,7 +105,7 @@ public static IMcpServerBuilder WithTools(this IMcpServerBuilder builder, IEnume
{
builder.Services.AddSingleton((Func)(toolMethod.IsStatic ?
services => McpServerTool.Create(toolMethod, options: new() { Services = services , SerializerOptions = serializerOptions }) :
- services => McpServerTool.Create(toolMethod, toolType, new() { Services = services , SerializerOptions = serializerOptions })));
+ services => McpServerTool.Create(toolMethod, r => CreateTarget(r.Services, toolType), new() { Services = services , SerializerOptions = serializerOptions })));
}
}
}
@@ -188,7 +188,7 @@ where t.GetCustomAttribute() is not null
{
builder.Services.AddSingleton((Func)(promptMethod.IsStatic ?
services => McpServerPrompt.Create(promptMethod, options: new() { Services = services, SerializerOptions = serializerOptions }) :
- services => McpServerPrompt.Create(promptMethod, typeof(TPromptType), new() { Services = services, SerializerOptions = serializerOptions })));
+ services => McpServerPrompt.Create(promptMethod, static r => CreateTarget(r.Services, typeof(TPromptType)), new() { Services = services, SerializerOptions = serializerOptions })));
}
}
@@ -245,7 +245,7 @@ public static IMcpServerBuilder WithPrompts(this IMcpServerBuilder builder, IEnu
{
builder.Services.AddSingleton((Func)(promptMethod.IsStatic ?
services => McpServerPrompt.Create(promptMethod, options: new() { Services = services, SerializerOptions = serializerOptions }) :
- services => McpServerPrompt.Create(promptMethod, promptType, new() { Services = services, SerializerOptions = serializerOptions })));
+ services => McpServerPrompt.Create(promptMethod, r => CreateTarget(r.Services, promptType), new() { Services = services, SerializerOptions = serializerOptions })));
}
}
}
@@ -325,7 +325,7 @@ where t.GetCustomAttribute() is not null
{
builder.Services.AddSingleton((Func)(resourceTemplateMethod.IsStatic ?
services => McpServerResource.Create(resourceTemplateMethod, options: new() { Services = services }) :
- services => McpServerResource.Create(resourceTemplateMethod, typeof(TResourceType), new() { Services = services })));
+ services => McpServerResource.Create(resourceTemplateMethod, static r => CreateTarget(r.Services, typeof(TResourceType)), new() { Services = services })));
}
}
@@ -381,7 +381,7 @@ public static IMcpServerBuilder WithResources(this IMcpServerBuilder builder, IE
{
builder.Services.AddSingleton((Func)(resourceTemplateMethod.IsStatic ?
services => McpServerResource.Create(resourceTemplateMethod, options: new() { Services = services }) :
- services => McpServerResource.Create(resourceTemplateMethod, resourceTemplateType, new() { Services = services })));
+ services => McpServerResource.Create(resourceTemplateMethod, r => CreateTarget(r.Services, resourceTemplateType), new() { Services = services })));
}
}
}
@@ -775,4 +775,13 @@ private static void AddSingleSessionServerDependencies(IServiceCollection servic
});
}
#endregion
+
+ #region Helpers
+ /// Creates an instance of the target object.
+ private static object CreateTarget(
+ IServiceProvider? services,
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type) =>
+ services is not null ? ActivatorUtilities.CreateInstance(services, type) :
+ Activator.CreateInstance(type)!;
+ #endregion
}
diff --git a/src/ModelContextProtocol/Server/AIFunctionMcpServerPrompt.cs b/src/ModelContextProtocol/Server/AIFunctionMcpServerPrompt.cs
index a31a4a28..4cad449d 100644
--- a/src/ModelContextProtocol/Server/AIFunctionMcpServerPrompt.cs
+++ b/src/ModelContextProtocol/Server/AIFunctionMcpServerPrompt.cs
@@ -4,7 +4,6 @@
using ModelContextProtocol.Utils;
using ModelContextProtocol.Utils.Json;
using System.ComponentModel;
-using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text.Json;
@@ -49,15 +48,20 @@ internal sealed class AIFunctionMcpServerPrompt : McpServerPrompt
///
public static new AIFunctionMcpServerPrompt Create(
MethodInfo method,
- [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type targetType,
+ Func, object> createTargetFunc,
McpServerPromptCreateOptions? options)
{
Throw.IfNull(method);
+ Throw.IfNull(createTargetFunc);
options = DeriveOptions(method, options);
return Create(
- AIFunctionFactory.Create(method, targetType, CreateAIFunctionFactoryOptions(method, options)),
+ AIFunctionFactory.Create(method, args =>
+ {
+ var request = (RequestContext)args.Context![typeof(RequestContext)]!;
+ return createTargetFunc(request);
+ }, CreateAIFunctionFactoryOptions(method, options)),
options);
}
@@ -69,7 +73,6 @@ private static AIFunctionFactoryOptions CreateAIFunctionFactoryOptions(
Description = options?.Description,
MarshalResult = static (result, _, cancellationToken) => new ValueTask