Closed
Description
Describe the bug
When tool is called, both the first and second times are normal, and when the third time, a stack overflow occurs
To Reproduce
Steps to reproduce the behavior:
- Reuse the original business logic
Expected behavior
Logs
error log
Stack overflow.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)
at DynamicClass.ResolveService(ILEmitResolverBuilderRuntimeContext, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)
at DynamicClass.ResolveService(ILEmitResolverBuilderRuntimeContext, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceIdentifier, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(System.Type)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities+ConstructorInfoEx.GetService(System.IServiceProvider, Int32)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities+ConstructorMatcher.CreateInstance(System.IServiceProvider)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(System.IServiceProvider, System.Type, System.Object[])
at Microsoft.Extensions.DependencyInjection.McpServerBuilderExtensions.CreateTarget(System.IServiceProvider, System.Type)
at Microsoft.Extensions.DependencyInjection.McpServerBuilderExtensions+<>c__DisplayClass3_1.<WithTools>b__2(ModelContextProtocol.Server.RequestContext`1<ModelContextProtocol.Protocol.CallToolRequestParams>)
at ModelContextProtocol.Server.AIFunctionMcpServerTool+<>c__DisplayClass2_0.<Create>b__0(Microsoft.Extensions.AI.AIFunctionArguments)
at Microsoft.Extensions.AI.AIFunctionFactory+ReflectionAIFunction+<InvokeCoreAsync>d__26.MoveNext()
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[[Microsoft.Extensions.AI.AIFunctionFactory+ReflectionAIFunction+<InvokeCoreAsync>d__26, Microsoft.Extensions.AI.Abstractions, Version=9.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]](<InvokeCoreAsync>d__26 ByRef)
at System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Start[[Microsoft.Extensions.AI.AIFunctionFactory+ReflectionAIFunction+<InvokeCoreAsync>d__26, Microsoft.Extensions.AI.Abstractions, Version=9.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]](<InvokeCoreAsync>d__26 ByRef)
at Microsoft.Extensions.AI.AIFunctionFactory+ReflectionAIFunction.InvokeCoreAsync(Microsoft.Extensions.AI.AIFunctionArguments, System.Threading.CancellationToken)
at Microsoft.Extensions.AI.AIFunction.InvokeAsync(Microsoft.Extensions.AI.AIFunctionArguments, System.Threading.CancellationToken)
at ModelContextProtocol.Server.AIFunctionMcpServerTool+<InvokeAsync>d__14.MoveNext()
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[[ModelContextProtocol.Server.AIFunctionMcpServerTool+<InvokeAsync>d__14, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<InvokeAsync>d__14 ByRef)
at System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Start[[ModelContextProtocol.Server.AIFunctionMcpServerTool+<InvokeAsync>d__14, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<InvokeAsync>d__14 ByRef)
at ModelContextProtocol.Server.AIFunctionMcpServerTool.InvokeAsync(ModelContextProtocol.Server.RequestContext`1<ModelContextProtocol.Protocol.CallToolRequestParams>, System.Threading.CancellationToken)
at ModelContextProtocol.Server.McpServer+<>c__DisplayClass40_0.<ConfigureTools>b__3(ModelContextProtocol.Server.RequestContext`1<ModelContextProtocol.Protocol.CallToolRequestParams>, System.Threading.CancellationToken)
at ModelContextProtocol.Server.McpServer.InvokeHandlerAsync[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Func`3<ModelContextProtocol.Server.RequestContext`1<System.__Canon>,System.Threading.CancellationToken,System.Threading.Tasks.ValueTask`1<System.__Canon>>, System.__Canon, ModelContextProtocol.Protocol.ITransport, System.Threading.CancellationToken)
at ModelContextProtocol.Server.McpServer+<>c__DisplayClass43_0`2[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].<SetHandler>b__0(System.__Canon, ModelContextProtocol.Protocol.ITransport, System.Threading.CancellationToken)
at ModelContextProtocol.RequestHandlers+<>c__DisplayClass0_0`2+<<Set>b__0>d[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[[ModelContextProtocol.RequestHandlers+<>c__DisplayClass0_0`2+<<Set>b__0>d[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<<Set>b__0>d<System.__Canon,System.__Canon> ByRef)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Start[[ModelContextProtocol.RequestHandlers+<>c__DisplayClass0_0`2+<<Set>b__0>d[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<<Set>b__0>d<System.__Canon,System.__Canon> ByRef)
at ModelContextProtocol.RequestHandlers+<>c__DisplayClass0_0`2[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].<Set>b__0(ModelContextProtocol.Protocol.JsonRpcRequest, System.Threading.CancellationToken)
at ModelContextProtocol.McpSession+<HandleRequest>d__25.MoveNext()
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[[ModelContextProtocol.McpSession+<HandleRequest>d__25, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<HandleRequest>d__25 ByRef)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[[System.__Canon, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Start[[ModelContextProtocol.McpSession+<HandleRequest>d__25, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<HandleRequest>d__25 ByRef)
at ModelContextProtocol.McpSession.HandleRequest(ModelContextProtocol.Protocol.JsonRpcRequest, System.Threading.CancellationToken)
at ModelContextProtocol.McpSession+<HandleMessageAsync>d__22.MoveNext()
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[[ModelContextProtocol.McpSession+<HandleMessageAsync>d__22, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<HandleMessageAsync>d__22 ByRef)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[[ModelContextProtocol.McpSession+<HandleMessageAsync>d__22, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]](<HandleMessageAsync>d__22 ByRef)
at ModelContextProtocol.McpSession.HandleMessageAsync(ModelContextProtocol.Protocol.JsonRpcMessage, System.Threading.CancellationToken)
at ModelContextProtocol.McpSession+<>c__DisplayClass21_1+<<ProcessMessagesAsync>g__ProcessMessageAsync|0>d.MoveNext()
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[ModelContextProtocol.McpSession+<>c__DisplayClass21_1+<<ProcessMessagesAsync>g__ProcessMessageAsync|0>d, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]].ExecutionContextCallback(System.Object)
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(System.Threading.Thread, System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[ModelContextProtocol.McpSession+<>c__DisplayClass21_1+<<ProcessMessagesAsync>g__ProcessMessageAsync|0>d, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]].MoveNext(System.Threading.Thread)
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[ModelContextProtocol.McpSession+<>c__DisplayClass21_1+<<ProcessMessagesAsync>g__ProcessMessageAsync|0>d, ModelContextProtocol, Version=0.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]].ExecuteFromThreadPool(System.Threading.Thread)
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart()
at System.Threading.Thread.StartCallback()
Additional context
[McpServerToolType]
public class DemoTool(
IHttpContextAccessor contextAccessor,
WorkbenchService openWorkbenchService
)
{
private readonly IHttpContextAccessor _contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
[McpServerTool, Description("get server time")]
public async Task<string> ServerTime([Description("format")] string format = "yyyy-MM-dd HH:mm:ss")
{
return $"time: {DateTime.Now.ToString(format)}";
}
}