Hi, My configuration is: spring-ai-starter-mcp-server-webmvc:1.1.0 spring.ai.mcp.server.protocol = STATELESS spring.ai.mcp.server.type= SYNC
McpTool was not scanned in case of AOP.
Example:
@Service public class CaseMcpTool {
@Tool(description = "{Get balance of case reference . Balance of case reference . Method load balance of the case reference.") @McpTool(description = "Get balance of case reference . Balance of case reference . Method load balance of the case reference.") public String findBalanceByCaseReference(@McpToolParam(description = "Case reference .") String reference) { return "1000"; } }
In AbstractAnnotatedMethodBeanPostProcessor#postProcessAfterInitialization the bean "caseMcpTool" is found and register.
But in StatelessServerSpecificationFactoryAutoConfiguration#toolSpecs -> SyncStatelessMcpToolProvider.getToolSpecifications there is an issue here:
public List
List<SyncToolSpecification> toolSpecs = this.toolObjects.stream()
.map(toolObject -> Stream.of(this.doGetClassMethods(toolObject))
.filter(method -> **method.isAnnotationPresent(McpTool.class)**)
method.isAnnotationPresent(McpTool.class)) cannot find McpTool annotation in case of AOP .
Maybe you have to use AopUtils.isAopProxy(toolObject)
When I add this ToolCallbackProvider , all is Ok:
@Bean public ToolCallbackProvider imxTools() { return MethodToolCallbackProvider.builder().toolObjects(new CaseMcpTool()).build(); }
Without ToolCallbackProvider , McpTool didn't work.