diff --git a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs index 8b63e20b..2dc0772c 100644 --- a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs +++ b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs @@ -38,7 +38,7 @@ public static partial class McpServerBuilderExtensions if (toolMethod.GetCustomAttribute() is not null) { builder.Services.AddSingleton((Func)(toolMethod.IsStatic ? - services => McpServerTool.Create(toolMethod, new McpServerToolCreateOptions() { Services = services }) : + services => McpServerTool.Create(toolMethod, options: new() { Services = services }) : services => McpServerTool.Create(toolMethod, typeof(TTool), new() { Services = services }))); } } @@ -71,7 +71,7 @@ public static IMcpServerBuilder WithTools(this IMcpServerBuilder builder, params if (toolMethod.GetCustomAttribute() is not null) { builder.Services.AddSingleton((Func)(toolMethod.IsStatic ? - services => McpServerTool.Create(toolMethod, new McpServerToolCreateOptions() { Services = services }) : + services => McpServerTool.Create(toolMethod, options: new() { Services = services }) : services => McpServerTool.Create(toolMethod, toolType, new() { Services = services }))); } } diff --git a/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs b/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs index 700910e5..51da7d97 100644 --- a/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs +++ b/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs @@ -395,6 +395,54 @@ public void Register_Tools_From_Current_Assembly() Assert.Contains(services.GetServices(), t => t.ProtocolTool.Name == "Echo"); } + [Theory] + [InlineData(false)] + [InlineData(true)] + public void WithTools_Parameters_Satisfiable_From_DI(bool parameterInServices) + { + ServiceCollection sc = new(); + if (parameterInServices) + { + sc.AddSingleton(new ComplexObject()); + } + sc.AddMcpServer().WithTools(typeof(EchoTool)); + IServiceProvider services = sc.BuildServiceProvider(); + + McpServerTool tool = services.GetServices().First(t => t.ProtocolTool.Name == "EchoComplex"); + if (parameterInServices) + { + Assert.DoesNotContain("\"complex\"", JsonSerializer.Serialize(tool.ProtocolTool.InputSchema)); + } + else + { + Assert.Contains("\"complex\"", JsonSerializer.Serialize(tool.ProtocolTool.InputSchema)); + } + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void WithToolsFromAssembly_Parameters_Satisfiable_From_DI(bool parameterInServices) + { + ServiceCollection sc = new(); + if (parameterInServices) + { + sc.AddSingleton(new ComplexObject()); + } + sc.AddMcpServer().WithToolsFromAssembly(); + IServiceProvider services = sc.BuildServiceProvider(); + + McpServerTool tool = services.GetServices().First(t => t.ProtocolTool.Name == "EchoComplex"); + if (parameterInServices) + { + Assert.DoesNotContain("\"complex\"", JsonSerializer.Serialize(tool.ProtocolTool.InputSchema)); + } + else + { + Assert.Contains("\"complex\"", JsonSerializer.Serialize(tool.ProtocolTool.InputSchema)); + } + } + [Fact] public async Task Recognizes_Parameter_Types() {