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.";