From 234d3ff919578c3ab597580035ec5e9261a52d00 Mon Sep 17 00:00:00 2001 From: Christian Tzolov Date: Fri, 2 May 2025 14:28:17 +0300 Subject: [PATCH] refactor(mcp): update to use Spring Boot autoconfiguration and rename tool callbacks Update MCP examples to use Spring Boot autoconfiguration instead of manual configuration. Replace deprecated defaultTools method with defaultToolCallbacks across all examples. Update documentation to reflect these changes and provide more detailed configuration examples. - Update API from defaultTools to defaultToolCallbacks in all MCP examples - Update README files with more detailed configuration examples Signed-off-by: Christian Tzolov --- model-context-protocol/brave/README.md | 66 ++++++++----------- .../ai/mcp/samples/brave/Application.java | 9 +-- .../starter-default-client/README.md | 19 ++++-- .../ai/mcp/samples/client/Application.java | 2 +- .../starter-webflux-client/README.md | 31 +++++++-- .../ai/mcp/samples/client/Application.java | 2 +- .../ai/mcp/sample/client/ClientSse.java | 32 --------- .../ai/mcp/sample/client/ClientStdio.java | 49 -------------- .../ai/mcp/sample/client/SampleClient.java | 61 ----------------- .../sampling/mcp-sampling-client/README.md | 23 +++++-- .../samples/client/McpClientApplication.java | 2 +- .../ai/mcp/samples/sqlite/Application.java | 2 +- .../ai/mcp/samples/sqlite/Application.java | 2 +- .../web-search/brave-chatbot/README.md | 2 +- .../ai/mcp/samples/brave/Application.java | 4 +- .../web-search/brave-starter/README.md | 4 +- .../ai/mcp/samples/brave/Application.java | 2 +- 17 files changed, 95 insertions(+), 217 deletions(-) delete mode 100644 model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientSse.java delete mode 100644 model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientStdio.java delete mode 100644 model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/SampleClient.java diff --git a/model-context-protocol/brave/README.md b/model-context-protocol/brave/README.md index d7c1f23..12b8b46 100644 --- a/model-context-protocol/brave/README.md +++ b/model-context-protocol/brave/README.md @@ -1,6 +1,6 @@ # Spring AI - Model Context Protocol (MCP) Brave Search Example -This example demonstrates how to create a Spring AI Model Context Protocol (MCP) client that communicates with the [Brave Search MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/brave-search). The application shows how to build an MCP client that enables natural language interactions with Brave Search, allowing you to perform internet searches through a conversational interface. Instead of using Spring Boot autoconfiguration, this example demonstrates how to manually configure the MCP client transport using an `@Bean` definition. +This example demonstrates how to create a Spring AI Model Context Protocol (MCP) client that communicates with the [Brave Search MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/brave-search). The application shows how to build an MCP client that enables natural language interactions with Brave Search, allowing you to perform internet searches through a conversational interface. This example uses Spring Boot autoconfiguration to set up the MCP client through configuration files. When run, the application demonstrates the MCP client's capabilities by asking a specific question: "Does Spring AI supports the Model Context Protocol? Please provide some references." The MCP client uses Brave Search to find relevant information and returns a comprehensive answer. After providing the response, the application exits. @@ -52,56 +52,46 @@ The application will execute a single query asking about Spring AI's support for ## How it Works -The application integrates Spring AI with the Brave Search MCP server through several components: +The application integrates Spring AI with the Brave Search MCP server through Spring Boot autoconfiguration: -### MCP Client Setup +### MCP Client Configuration -```java -@Bean -public McpSyncClient mcpClient() { +The MCP client is configured using configuration files: - // https://github.com/modelcontextprotocol/servers/tree/main/src/brave-search - var stdioParams = ServerParameters.builder("npx") - .args("-y", "@modelcontextprotocol/server-brave-search") - .addEnvVar("BRAVE_API_KEY", System.getenv("BRAVE_API_KEY")) - .build(); +1. `application.properties`: +```properties +spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json +``` - var mcpClient = McpClient.sync(new StdioClientTransport(stdioParams)).build(); - var init = mcpClient.initialize(); - logger.info("MCP Initialized: {}", init); - return mcpClient; +2. `mcp-servers-config.json`: +```json +{ + "mcpServers": { + "brave-search": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-brave-search" + ], + "env": { + } + } + } } ``` -The MCP client is configured to: -1. Use the Brave Search MCP server via npx -2. Pass the Brave API key from environment variables -3. Initialize a synchronous connection to the server - -### Function Callbacks - -The application automatically discovers and registers available Brave Search tools: - -```java -List functionCallbacks = mcpClient.listTools(null) - .tools() - .stream() - .map(tool -> new McpFunctionCallback(mcpClient, tool)) - .toList(); -``` - -These callbacks enable the ChatClient to: -- Access Brave Search tools during conversations -- Handle function calls requested by the AI model -- Execute search queries against the Brave Search API +This configuration: +1. Uses the Brave Search MCP server via npx +2. The Brave API key is passed from environment variables +3. Initializes a synchronous connection to the server ### Chat Integration -The ChatClient is configured with the Brave Search function callbacks: +The ChatClient is configured with the MCP tool callbacks in the Application class: ```java var chatClient = chatClientBuilder - .defaultFunctions(functionCallbacks.toArray(new McpFunctionCallback[0])) + .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpSyncClients)) .build(); ``` diff --git a/model-context-protocol/brave/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java b/model-context-protocol/brave/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java index 0a9044a..77d8e43 100644 --- a/model-context-protocol/brave/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java +++ b/model-context-protocol/brave/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java @@ -11,7 +11,6 @@ import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication @@ -20,24 +19,22 @@ public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(Application.class, args).close(); } @Bean public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, - List mcpSyncClients, ConfigurableApplicationContext context) { + List mcpSyncClients) { return args -> { var chatClient = chatClientBuilder - .defaultTools(new SyncMcpToolCallbackProvider(mcpSyncClients)) + .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpSyncClients)) .build(); String question = "Does Spring AI supports the Model Context Protocol? Please provide some references."; logger.info("QUESTION: {}\n", question); logger.info("ASSISTANT: {}\n", chatClient.prompt(question).call().content()); - - context.close(); }; } } \ No newline at end of file diff --git a/model-context-protocol/client-starter/starter-default-client/README.md b/model-context-protocol/client-starter/starter-default-client/README.md index e5d9be7..80c8e71 100644 --- a/model-context-protocol/client-starter/starter-default-client/README.md +++ b/model-context-protocol/client-starter/starter-default-client/README.md @@ -6,7 +6,7 @@ Follow the [MCP Client Boot Starter](https://docs.spring.io/spring-ai/reference/ ## Overview -The project uses Spring Boot and Spring AI to create a command-line application that demonstrates MCP server integration. The application: +The project uses Spring Boot 3.3.6 and Spring AI 1.0.0-SNAPSHOT to create a command-line application that demonstrates MCP server integration. The application: - Connects to MCP servers using STDIO and/or SSE (HttpClient-based) transports - Integrates with Spring AI's chat capabilities - Demonstrates tool execution through MCP servers @@ -19,7 +19,7 @@ For example, running the application with `-Dai.user.input="Does Spring AI suppo - Java 17 or later - Maven 3.6+ - Anthropic API key (Claude) (Get one at https://docs.anthropic.com/en/docs/initial-setup) -- Brave Search API key (Get one at https://brave.com/search/api/) +- Brave Search API key (for the Brave Search MCP server) (Get one at https://brave.com/search/api/) ## Dependencies @@ -54,6 +54,9 @@ spring.main.web-application-type=none # AI Provider Configuration spring.ai.anthropic.api-key=${ANTHROPIC_API_KEY} + +# Enable the MCP client tool-callback auto-configuration +spring.ai.mcp.client.toolcallback.enabled=true ``` #### STDIO Transport Properties @@ -117,10 +120,12 @@ The application demonstrates a simple command-line interaction with an AI model ## Running the Application -1. Set the required environment variable: +1. Set the required environment variables: ```bash export ANTHROPIC_API_KEY=your-api-key - export BRAVE_API_KEY='your-brave-api-key-here' + + # For the Brave Search MCP server + export BRAVE_API_KEY=your-brave-api-key ``` 2. Build the application: @@ -130,10 +135,14 @@ The application demonstrates a simple command-line interaction with an AI model 3. Run the application: ```bash + # Run with the default question from application.properties + java -jar target/mcp-starter-default-client-0.0.1-SNAPSHOT.jar + + # Or specify a custom question java -Dai.user.input='Does Spring AI support MCP?' -jar target/mcp-starter-default-client-0.0.1-SNAPSHOT.jar ``` -The application will execute the question "Does Spring AI support MCP?", use the provided brave (or other tools) to answer it, and display the AI assistant's response. +The application will execute the question, use the configured MCP tools to answer it, and display the AI assistant's response. ## Additional Resources diff --git a/model-context-protocol/client-starter/starter-default-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java b/model-context-protocol/client-starter/starter-default-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java index 88392de..b41cc4a 100644 --- a/model-context-protocol/client-starter/starter-default-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java +++ b/model-context-protocol/client-starter/starter-default-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java @@ -41,7 +41,7 @@ public class Application { return args -> { var chatClient = chatClientBuilder - .defaultTools(tools) + .defaultToolCallbacks(tools) .build(); System.out.println("\n>>> QUESTION: " + userInput); diff --git a/model-context-protocol/client-starter/starter-webflux-client/README.md b/model-context-protocol/client-starter/starter-webflux-client/README.md index 76775ef..555b488 100644 --- a/model-context-protocol/client-starter/starter-webflux-client/README.md +++ b/model-context-protocol/client-starter/starter-webflux-client/README.md @@ -6,20 +6,21 @@ Follow the [MCP Client Boot Starter](https://docs.spring.io/spring-ai/reference/ ## Overview -The project uses Spring Boot and Spring AI to create a command-line application that demonstrates MCP server integration with WebFlux. The application: +The project uses Spring Boot 3.3.6 and Spring AI 1.0.0-SNAPSHOT to create a command-line application that demonstrates MCP server integration with WebFlux. The application: - Connects to MCP servers using STDIO and/or SSE (WebFlux-based) transports - Integrates with Spring AI's chat capabilities - Demonstrates tool execution through MCP servers - Takes a user-defined question via the `-Dai.user.input` command-line property, which is mapped to a Spring `@Value` annotation in the code -For example, running the application with `-Dai.user.input="Does Spring AI support MCP?"` will inject this question into the application through Spring's property injection, and the application will use it to query the MCP server using WebFlux's reactive programming model. +For example, running the application with `-Dai.user.input="What tools are available?"` will inject this question into the application through Spring's property injection, and the application will use it to query the MCP server using WebFlux's reactive programming model. ## Prerequisites - Java 17 or later - Maven 3.6+ - Anthropic API key (Claude) (Get one at https://docs.anthropic.com/en/docs/initial-setup) -- Brave Search API key (Get one at https://brave.com/search/api/) +- OpenAI API key (optional, commented out by default) (Get one at https://platform.openai.com/api-keys) +- Brave Search API key (for the Brave Search MCP server) (Get one at https://brave.com/search/api/) ## Dependencies @@ -35,6 +36,11 @@ The project uses the following main dependencies: org.springframework.ai spring-ai-starter-model-anthropic + + ``` @@ -54,6 +60,10 @@ spring.main.web-application-type=none # AI Provider Configuration spring.ai.anthropic.api-key=${ANTHROPIC_API_KEY} +spring.ai.openai.api-key=${OPENAI_API_KEY} + +# Enable the MCP client tool-callback auto-configuration +spring.ai.mcp.client.toolcallback.enabled=true ``` #### STDIO Transport Properties @@ -111,16 +121,19 @@ The application demonstrates a simple command-line interaction with an AI model 1. The application starts and configures multiple MCP Clients (one for each provided STDIO or SSE connection configuration) 2. It builds a ChatClient with the configured MCP tools -3. Sends a predefined question (set vi the `ai.user.input` property) to the AI model +3. Sends a predefined question (set via the `ai.user.input` property) to the AI model 4. Displays the AI's response 5. Automatically closes the application ## Running the Application -1. Set the required environment variable: +1. Set the required environment variables: ```bash export ANTHROPIC_API_KEY=your-api-key - export BRAVE_API_KEY='your-brave-api-key-here' + # If using OpenAI (uncomment the dependency in pom.xml first) + # export OPENAI_API_KEY=your-openai-api-key + # For the Brave Search MCP server + export BRAVE_API_KEY=your-brave-api-key ``` 2. Build the application: @@ -130,10 +143,14 @@ The application demonstrates a simple command-line interaction with an AI model 3. Run the application: ```bash + # Run with the default question from application.properties + java -jar target/mcp-starter-webflux-client-0.0.1-SNAPSHOT.jar + + # Or specify a custom question java -Dai.user.input='Does Spring AI support MCP?' -jar target/mcp-starter-webflux-client-0.0.1-SNAPSHOT.jar ``` -The application will execute the question "Does Spring AI support MCP?", use the provided brave (or other tools) to answer it, and display the AI assistant's response. +The application will execute the question, use the configured MCP tools to answer it, and display the AI assistant's response. ## Additional Resources diff --git a/model-context-protocol/client-starter/starter-webflux-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java b/model-context-protocol/client-starter/starter-webflux-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java index a603091..d44f89a 100644 --- a/model-context-protocol/client-starter/starter-webflux-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java +++ b/model-context-protocol/client-starter/starter-webflux-client/src/main/java/org/springframework/ai/mcp/samples/client/Application.java @@ -41,7 +41,7 @@ public class Application { return args -> { var chatClient = chatClientBuilder - .defaultTools(tools) + .defaultToolCallbacks(tools) .build(); System.out.println("\n>>> QUESTION: " + userInput); diff --git a/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientSse.java b/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientSse.java deleted file mode 100644 index 1becf0a..0000000 --- a/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientSse.java +++ /dev/null @@ -1,32 +0,0 @@ -/* -* Copyright 2024 - 2024 the original author or authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* https://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.springframework.ai.mcp.sample.client; - -import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport; - -import org.springframework.web.reactive.function.client.WebClient; - -/** - * @author Christian Tzolov - */ -public class ClientSse { - - public static void main(String[] args) { - var transport = new WebFluxSseClientTransport(WebClient.builder().baseUrl("http://localhost:8080")); - new SampleClient(transport).run(); - } - -} diff --git a/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientStdio.java b/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientStdio.java deleted file mode 100644 index 573fdd6..0000000 --- a/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/ClientStdio.java +++ /dev/null @@ -1,49 +0,0 @@ -/* -* Copyright 2024 - 2024 the original author or authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* https://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.springframework.ai.mcp.sample.client; - -import java.io.File; - -import io.modelcontextprotocol.client.transport.ServerParameters; -import io.modelcontextprotocol.client.transport.StdioClientTransport; - -/** - * With stdio transport, the MCP server is automatically started by the client. - * But you - * have to build the server jar first: - * - *
- * ./mvnw clean install -DskipTests
- * 
- */ -public class ClientStdio { - - public static void main(String[] args) { - - System.out.println(new File(".").getAbsolutePath()); - - var stdioParams = ServerParameters.builder("java") - .args("-Dspring.ai.mcp.server.stdio=true", "-Dspring.main.web-application-type=none", - "-Dlogging.pattern.console=", "-jar", - "model-context-protocol/weather/starter-webflux-server/target/mcp-weather-starter-webflux-server-0.0.1-SNAPSHOT.jar") - .build(); - - var transport = new StdioClientTransport(stdioParams); - - new SampleClient(transport).run(); - } - -} diff --git a/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/SampleClient.java b/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/SampleClient.java deleted file mode 100644 index a02400c..0000000 --- a/model-context-protocol/dynamic-tool-update/server/src/test/java/org/springframework/ai/mcp/sample/client/SampleClient.java +++ /dev/null @@ -1,61 +0,0 @@ -/* -* Copyright 2024 - 2024 the original author or authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* https://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.springframework.ai.mcp.sample.client; - -import java.util.Map; - -import io.modelcontextprotocol.client.McpClient; -import io.modelcontextprotocol.spec.McpClientTransport; -import io.modelcontextprotocol.spec.McpSchema.CallToolRequest; -import io.modelcontextprotocol.spec.McpSchema.CallToolResult; -import io.modelcontextprotocol.spec.McpSchema.ListToolsResult; - -/** - * @author Christian Tzolov - */ - -public class SampleClient { - - private final McpClientTransport transport; - - public SampleClient(McpClientTransport transport) { - this.transport = transport; - } - - public void run() { - - var client = McpClient.sync(this.transport).build(); - - client.initialize(); - - client.ping(); - - // List and demonstrate tools - ListToolsResult toolsList = client.listTools(); - System.out.println("Available Tools = " + toolsList); - - CallToolResult weatherForcastResult = client.callTool(new CallToolRequest("getWeatherForecastByLocation", - Map.of("latitude", "47.6062", "longitude", "-122.3321"))); - System.out.println("Weather Forcast: " + weatherForcastResult); - - CallToolResult alertResult = client.callTool(new CallToolRequest("getAlerts", Map.of("state", "NY"))); - System.out.println("Alert Response = " + alertResult); - - client.closeGracefully(); - - } - -} diff --git a/model-context-protocol/sampling/mcp-sampling-client/README.md b/model-context-protocol/sampling/mcp-sampling-client/README.md index 1ef8807..fa018f4 100644 --- a/model-context-protocol/sampling/mcp-sampling-client/README.md +++ b/model-context-protocol/sampling/mcp-sampling-client/README.md @@ -10,6 +10,7 @@ The MCP Sampling Client: - Integrates with both OpenAI and Anthropic models - Demonstrates how to use model hints to select the appropriate LLM - Combines creative responses from multiple LLMs into a single result +- Provides logging capabilities for MCP operations ## MCP Sampling Implementation @@ -20,8 +21,13 @@ MCP Sampling is a powerful capability that allows an MCP server to delegate cert ```java @Bean McpSyncClientCustomizer samplingCustomizer(Map chatClients) { - return (name, spec) -> { - spec.sampling(llmRequest -> { + return (name, mcpClientSpec) -> { + + mcpClientSpec = mcpClientSpec.loggingConsumer(logingMessage -> { + System.out.println("MCP LOGGING: [" + logingMessage.level() + "] " + logingMessage.data()); + }); + + mcpClientSpec.sampling(llmRequest -> { var userPrompt = ((McpSchema.TextContent) llmRequest.messages().get(0).content()).text(); String modelHint = llmRequest.modelPreferences().hints().get(0).name(); @@ -39,6 +45,7 @@ McpSyncClientCustomizer samplingCustomizer(Map chatClients) return CreateMessageResult.builder().content(new McpSchema.TextContent(response)).build(); }); + System.out.println("Customizing " + name); }; } ``` @@ -61,11 +68,10 @@ public Map chatClients(List chatModels) { 4. **Integration with Spring AI**: The client leverages Spring AI's auto-configuration to set up the necessary components: ```java -var mcpToolProvider = new SyncMcpToolCallbackProvider( - mcpClientsProvider.stream().flatMap(List::stream).toList()); +var mcpToolProvider = new SyncMcpToolCallbackProvider(mcpClients); ChatClient chatClient = ChatClient.builder(openAiChatModel) - .defaultTools(mcpToolProvider) + .defaultToolCallbacks(mcpToolProvider) .build(); ``` @@ -113,6 +119,9 @@ spring.ai.mcp.client.sse.connections.server1.url=http://localhost:8080 # Logging configuration logging.level.io.modelcontextprotocol.client=WARN logging.level.io.modelcontextprotocol.spec=WARN + +# Uncomment to disable MCP tool callbacks +# spring.ai.mcp.client.toolcallback.enabled=false ``` ## How It Works @@ -161,8 +170,8 @@ When you run the application, you'll see output similar to: ``` > USER: What is the weather in Amsterdam right now? -Please incorporate all creative responses from all LLM providers. -After the other providers add a poem that synthesizes the the poems from all the other providers. +Please incorporate all createive responses from all LLM providers. +After the other providers add a poem that synthesizes the poems from all the other providers. > ASSISTANT: I checked the current weather in Amsterdam for you. Here are the creative responses from different AI providers: diff --git a/model-context-protocol/sampling/mcp-sampling-client/src/main/java/org/springframework/ai/mcp/samples/client/McpClientApplication.java b/model-context-protocol/sampling/mcp-sampling-client/src/main/java/org/springframework/ai/mcp/samples/client/McpClientApplication.java index 8ebe15d..28e010f 100644 --- a/model-context-protocol/sampling/mcp-sampling-client/src/main/java/org/springframework/ai/mcp/samples/client/McpClientApplication.java +++ b/model-context-protocol/sampling/mcp-sampling-client/src/main/java/org/springframework/ai/mcp/samples/client/McpClientApplication.java @@ -49,7 +49,7 @@ public class McpClientApplication { var mcpToolProvider = new SyncMcpToolCallbackProvider(mcpClients); - ChatClient chatClient = ChatClient.builder(openAiChatModel).defaultTools(mcpToolProvider).build(); + ChatClient chatClient = ChatClient.builder(openAiChatModel).defaultToolCallbacks(mcpToolProvider).build(); String userQuestion = """ What is the weather in Amsterdam right now? diff --git a/model-context-protocol/sqlite/chatbot/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java b/model-context-protocol/sqlite/chatbot/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java index 83d6254..c7ad932 100644 --- a/model-context-protocol/sqlite/chatbot/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java +++ b/model-context-protocol/sqlite/chatbot/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java @@ -34,7 +34,7 @@ public class Application { return args -> { var chatClient = chatClientBuilder - .defaultTools(new SyncMcpToolCallbackProvider(mcpClients)) + .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpClients)) .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) .build(); diff --git a/model-context-protocol/sqlite/simple/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java b/model-context-protocol/sqlite/simple/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java index 4db16d4..594aef1 100644 --- a/model-context-protocol/sqlite/simple/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java +++ b/model-context-protocol/sqlite/simple/src/main/java/org/springframework/ai/mcp/samples/sqlite/Application.java @@ -30,7 +30,7 @@ public class Application { return args -> { var chatClient = chatClientBuilder - .defaultTools(new SyncMcpToolCallbackProvider(mcpClients)) + .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpClients)) .build(); System.out.println("Running predefined questions with AI model responses:\n"); diff --git a/model-context-protocol/web-search/brave-chatbot/README.md b/model-context-protocol/web-search/brave-chatbot/README.md index 682e66f..49b575c 100644 --- a/model-context-protocol/web-search/brave-chatbot/README.md +++ b/model-context-protocol/web-search/brave-chatbot/README.md @@ -119,7 +119,7 @@ The chatbot is implemented using Spring AI's ChatClient with MCP tool integratio ```java var chatClient = chatClientBuilder .defaultSystem("You are a useful assistant, expert in AI and Java.") - .defaultTools((Object[]) mcpToolAdapter.toolCallbacks()) + .defaultToolCallbacks((Object[]) mcpToolAdapter.toolCallbacks()) .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) .build(); ``` diff --git a/model-context-protocol/web-search/brave-chatbot/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java b/model-context-protocol/web-search/brave-chatbot/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java index ff3f64d..709871f 100644 --- a/model-context-protocol/web-search/brave-chatbot/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java +++ b/model-context-protocol/web-search/brave-chatbot/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java @@ -9,8 +9,6 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; import org.springframework.ai.chat.memory.InMemoryChatMemory; import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -30,7 +28,7 @@ public class Application { var chatClient = chatClientBuilder .defaultSystem("You are useful assistant and can perform web searches Brave's search API to reply to your questions.") - .defaultTools(new SyncMcpToolCallbackProvider(mcpSyncClients)) + .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpSyncClients)) .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) .build(); diff --git a/model-context-protocol/web-search/brave-starter/README.md b/model-context-protocol/web-search/brave-starter/README.md index 97699a0..9b15139 100644 --- a/model-context-protocol/web-search/brave-starter/README.md +++ b/model-context-protocol/web-search/brave-starter/README.md @@ -149,7 +149,7 @@ public class Application { List tools, ConfigurableApplicationContext context) { return args -> { var chatClient = chatClientBuilder - .defaultTools(tools) + .defaultToolCallbacks(tools) .build(); String question = "Does Spring AI support the Model Context Protocol? Please provide some references."; @@ -213,7 +213,7 @@ public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilde List tools, ConfigurableApplicationContext context) { return args -> { var chatClient = chatClientBuilder - .defaultTools(tools) + .defaultToolCallbacks(tools) .build(); String question = "Does Spring AI support the Model Context Protocol? " diff --git a/model-context-protocol/web-search/brave-starter/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java b/model-context-protocol/web-search/brave-starter/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java index b2aabc8..b78fb58 100644 --- a/model-context-protocol/web-search/brave-starter/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java +++ b/model-context-protocol/web-search/brave-starter/src/main/java/org/springframework/ai/mcp/samples/brave/Application.java @@ -41,7 +41,7 @@ public class Application { return args -> { var chatClient = chatClientBuilder - .defaultTools(new SyncMcpToolCallbackProvider(mcpSyncClients)) + .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpSyncClients)) .build(); String question = "Does Spring AI support the Model Context Protocol? Please provide some references.";