diff --git a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml
index 5377bed5ec6..3c50f01d5f1 100644
--- a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml
+++ b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml
@@ -49,6 +49,13 @@
+
+ org.springframework.ai
+ spring-ai-mcp
+ ${project.parent.version}
+ test
+
+
org.springframework.ai
spring-ai-test
diff --git a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java
index af42d744158..64a080489ee 100644
--- a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java
+++ b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java
@@ -20,6 +20,8 @@
import org.junit.jupiter.api.Test;
+import org.springframework.ai.mcp.AsyncMcpToolCallbackProvider;
+import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.model.tool.DefaultToolCallingManager;
import org.springframework.ai.model.tool.ToolCallingManager;
import org.springframework.ai.tool.StaticToolCallbackProvider;
@@ -45,12 +47,17 @@
import org.springframework.util.ReflectionUtils;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
/**
* Unit tests for {@link ToolCallingAutoConfiguration}.
*
* @author Thomas Vitale
* @author Christian Tzolov
+ * @author Yanming Zhou
*/
class ToolCallingAutoConfigurationTests {
@@ -185,6 +192,27 @@ void throwExceptionOnErrorEnabled() {
});
}
+ @Test
+ void toolCallbackResolverDoesNotUseMcpToolCallbackProviders() {
+ new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(ToolCallingAutoConfiguration.class))
+ .withUserConfiguration(Config.class)
+ .run(context -> {
+ var syncMcpToolCallbackProvider = context.getBean("syncMcpToolCallbackProvider",
+ ToolCallbackProvider.class);
+ var asyncMcpToolCallbackProvider = context.getBean("asyncMcpToolCallbackProvider",
+ ToolCallbackProvider.class);
+
+ verify(syncMcpToolCallbackProvider, never()).getToolCallbacks();
+ verify(asyncMcpToolCallbackProvider, never()).getToolCallbacks();
+
+ var toolCallbackResolver = context.getBean(ToolCallbackResolver.class);
+ assertThat(toolCallbackResolver.resolve("getForecast")).isNotNull();
+
+ verify(syncMcpToolCallbackProvider, never()).getToolCallbacks();
+ verify(asyncMcpToolCallbackProvider, never()).getToolCallbacks();
+ });
+ }
+
static class WeatherService {
@Tool(description = "Get the weather in location. Return temperature in 36°F or 36°C format.")
@@ -267,6 +295,20 @@ public ToolCallback toolCallbacks6() {
.build();
}
+ @Bean
+ public SyncMcpToolCallbackProvider syncMcpToolCallbackProvider() {
+ SyncMcpToolCallbackProvider provider = mock(SyncMcpToolCallbackProvider.class);
+ when(provider.getToolCallbacks()).thenReturn(new ToolCallback[0]);
+ return provider;
+ }
+
+ @Bean
+ public AsyncMcpToolCallbackProvider asyncMcpToolCallbackProvider() {
+ AsyncMcpToolCallbackProvider provider = mock(AsyncMcpToolCallbackProvider.class);
+ when(provider.getToolCallbacks()).thenReturn(new ToolCallback[0]);
+ return provider;
+ }
+
public record Request(String location) {
}