From 5e6b6cbf214a91cfaf97435c73292b8434a334e3 Mon Sep 17 00:00:00 2001 From: dajiaohuang Date: Fri, 23 Oct 2026 02:46:08 +0800 Subject: [PATCH] Fix optional tool argument defaults --- MCPSharp.Test/ToolHandlerTests.cs | 36 ++++++++++++++++++++++++++++++ MCPSharp/Core/Tools/ToolHandler.cs | 4 +++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 MCPSharp.Test/ToolHandlerTests.cs diff --git a/MCPSharp.Test/ToolHandlerTests.cs b/MCPSharp.Test/ToolHandlerTests.cs new file mode 100644 index 0000000..445dd36 --- /dev/null +++ b/MCPSharp.Test/ToolHandlerTests.cs @@ -0,0 +1,36 @@ +using MCPSharp.Core.Tools; +using MCPSharp.Model; + +namespace MCPSharp.Test; + +[TestClass] +public class ToolHandlerTests +{ + [TestMethod] + public async Task HandleAsync_UsesDeclaredDefaultForMissingOptionalString() + { + var method = GetType().GetMethod(nameof(OptionalString))!; + var handler = new ToolHandler(new Tool { Name = method.Name }, method); + + var result = await handler.HandleAsync(new Dictionary()); + + Assert.IsFalse(result.IsError); + Assert.AreEqual("fallback", result.Content[0].Text); + } + + [TestMethod] + public async Task HandleAsync_UsesDeclaredDefaultForMissingOptionalValueType() + { + var method = GetType().GetMethod(nameof(OptionalCount))!; + var handler = new ToolHandler(new Tool { Name = method.Name }, method); + + var result = await handler.HandleAsync(new Dictionary()); + + Assert.IsFalse(result.IsError); + Assert.AreEqual("7", result.Content[0].Text); + } + + public string OptionalString(string value = "fallback") => value; + + public int OptionalCount(int count = 7) => count; +} diff --git a/MCPSharp/Core/Tools/ToolHandler.cs b/MCPSharp/Core/Tools/ToolHandler.cs index 9f541ee..9c81670 100644 --- a/MCPSharp/Core/Tools/ToolHandler.cs +++ b/MCPSharp/Core/Tools/ToolHandler.cs @@ -29,7 +29,9 @@ public async Task HandleAsync(Dictionary paramet } else { - inputValues.Add(par.Name, par.ParameterType.IsValueType ? Activator.CreateInstance(par.ParameterType) : null); + inputValues.Add(par.Name, par.HasDefaultValue + ? par.DefaultValue + : par.ParameterType.IsValueType ? Activator.CreateInstance(par.ParameterType) : null); } }