From 0294c574a6ff10bfee8f978da6cd5717ac4437b9 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Mon, 31 Mar 2025 06:28:46 -0400 Subject: [PATCH] Fix binding to wrong overload in WithTools (#152) --- .../McpServerBuilderExtensions.Tools.cs | 4 +- .../McpServerBuilderExtensionsToolsTests.cs | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs b/src/ModelContextProtocol/Configuration/McpServerBuilderExtensions.Tools.cs index 8b63e20..2dc0772 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 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, toolType, new() { Services = services }))); } } diff --git a/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs b/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs index 700910e..51da7d9 100644 --- a/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs +++ b/tests/ModelContextProtocol.Tests/Configuration/McpServerBuilderExtensionsToolsTests.cs @@ -395,6 +395,54 @@ public class McpServerBuilderExtensionsToolsTests : LoggedTest, IAsyncDisposable 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() {