java
@Configuration
public class ToolAutoRegistrar {
@Autowired
private ListableBeanFactory beanFactory;
@Bean
public ToolCallbackProvider toolCallbackProvider() {
List<Object> toolBeans = beanFactory.getBeansWithAnnotation(Service.class)
.values().stream()
.filter(bean -> Arrays.stream(bean.getClass().getMethods())
.anyMatch(method -> method.isAnnotationPresent(Tool.class)))
.collect(Collectors.toList());
return MethodToolCallbackProvider.builder()
.toolObjects(toolBeans.toArray())
.build();
}
}
这段代码会自动查找所有 @Service Bean 中包含 @Tool 注解的方法,然后注册进去。
更加健壮的代码
java
package com.example.mcp.config;
import org.springframework.aop.framework.AopProxyUtils;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.MethodToolCallbackProvider;
import org.springframework.ai.tool.Tool;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
@Configuration
public class ToolAutoRegistrar {
@Bean
public ToolCallbackProvider toolCallbackProvider(ListableBeanFactory beanFactory) {
List<Object> toolBeans = beanFactory.getBeansOfType(Object.class)
.values().stream()
.filter(bean -> hasToolAnnotatedMethod(bean))
.collect(Collectors.toList());
return MethodToolCallbackProvider.builder()
.toolObjects(toolBeans.toArray())
.build();
}
private boolean hasToolAnnotatedMethod(Object bean) {
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(bean);
for (Method method : targetClass.getDeclaredMethods()) {
if (method.isAnnotationPresent(Tool.class)) {
return true;
}
}
return false;
}
}