205-Spring AI Model Context Protocol 功能:Brave Search 功能完整案例

205-Spring AI Model Context Protocol 功能:Brave Search 功能完整案例

本案例演示如何创建一个 Spring AI Model Context Protocol (MCP) 客户端,该客户端与 Brave Search MCP 服务器通信。应用程序展示了如何构建一个 MCP 客户端,通过对话界面实现与 Brave Search 的自然语言交互,允许您通过对话界面执行互联网搜索。本示例使用 Spring Boot 自动配置通过配置文件设置 MCP 客户端。

运行时,应用程序通过询问特定问题来演示 MCP 客户端的功能:"Spring AI 是否支持 Model Context Protocol?请提供一些参考资料。"MCP 客户端使用 Brave Search 查找相关信息并返回全面答案。提供响应后,应用程序退出。

1. 案例目标

我们将创建一个展示以下功能的 Spring Boot 应用:

  1. MCP 客户端配置:通过配置文件设置与 Brave Search MCP 服务器的连接。
  2. 自然语言搜索:通过对话界面实现互联网搜索功能。
  3. 自动查询执行:应用程序启动时自动执行预设问题,展示 MCP 客户端的功能。

2. 技术栈与核心依赖

  • Spring Boot 3.4.5
  • Spring AI 1.1.0-SNAPSHOT
  • Spring AI MCP Client (用于连接 MCP 服务器)
  • Spring AI OpenAI (用于处理自然语言交互)
  • Maven (项目构建工具)

在 pom.xml 中,你需要引入以下核心依赖:

<dependencies> <!-- Spring Boot 启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- Spring AI OpenAI 模型启动器 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency> <!-- Spring AI MCP 客户端启动器 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-client</artifactId> </dependency> </dependencies> <!-- 添加 Spring AI BOM 进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.1.0-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

3. 项目配置

在 src/main/resources/application.properties 文件中,配置你的 OpenAI API Key 和 MCP 客户端设置。

debug=true spring.application.name=mcp spring.main.web-application-type=none # OpenAI API Key 配置 spring.ai.openai.api-key=${OPENAI_API_KEY} # MCP 客户端配置 spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json # 日志配置 logging.level.root=INFO logging.level.org.springframework.ai.mcp=WARN logging.level.org.springframework.ai.mcp.client.transport.StdioClientTransport=WARN logging.level.org.springframework.ai.mcp.samples.brave=INFO logging.level.io.modelcontextprotocol.client=WARN logging.level.io.modelcontextprotocol.spec=WARN

重要提示:请将 OPENAI_API_KEY 环境变量设置为你从 OpenAI 获取的有效 API Key。

4. MCP 服务器配置

在 src/main/resources/mcp-servers-config.json 文件中,配置 Brave Search MCP 服务器:

{ "mcpServers": { "brave-search": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-brave-search" ], "env": { } } } }

此配置:

  • 通过 npx 使用 Brave Search MCP 服务器
  • Brave API 密钥通过环境变量传递
  • 初始化与服务器的同步连接

5. 编写 Java 代码

5.1 Application.java

主应用程序类,配置 ChatClient 并执行预设问题。

package org.springframework.ai.mcp.samples.brave; import java.util.List; import io.modelcontextprotocol.client.McpSyncClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; 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.annotation.Bean; @SpringBootApplication public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { SpringApplication.run(Application.class, args).close(); } @Bean public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, List<McpSyncClient> mcpSyncClients) { return args -> { var chatClient = chatClientBuilder .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()); }; } }

代码解析

这段代码的主要功能:

  • 应用程序入口:标准的 Spring Boot 应用程序入口点。
  • ChatClient 配置:使用 SyncMcpToolCallbackProvider 配置 ChatClient,使其能够使用 MCP 工具回调。
  • 预设问题执行:在应用程序启动时,自动执行一个关于 Spring AI 是否支持 Model Context Protocol 的问题。
  • 日志记录:记录问题和 AI 助手的回答。

6. 运行与测试

6.1 前置条件

  • Java 17 或更高版本
  • Maven 3.6+
  • npx 包管理器
  • Git
  • OpenAI API 密钥
  • Brave Search API 密钥(在 https://brave.com/search/api/ 获取)

6.2 设置步骤

构建应用程序

./mvnw clean install

设置 API 密钥

export OPENAI_API_KEY='your-openai-api-key-here' export BRAVE_API_KEY='your-brave-api-key-here'

克隆仓库

git clone https://github.com/spring-projects/spring-ai-examples.git cd model-context-protocol/brave

安装 npx:首先确保安装 [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm),然后运行:

npm install -g npx

6.3 运行应用程序

使用 Maven 运行应用程序:

./mvnw spring-boot:run

应用程序将执行一个查询,询问 Spring AI 是否支持 Model Context Protocol。它使用 Brave Search MCP 服务器在互联网上搜索相关信息,通过 MCP 客户端处理结果,并在退出前提供详细回答。

7. 工作原理

7.1 MCP 客户端配置

MCP 客户端通过配置文件进行配置:

application.properties

spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json

mcp-servers-config.json

{ "mcpServers": { "brave-search": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-brave-search" ], "env": { } } } }

7.2 聊天集成

ChatClient 在 Application 类中配置了 MCP 工具回调:

var chatClient = chatClientBuilder .defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpSyncClients)) .build();

此设置允许 AI 模型:

  • 理解何时使用 Brave Search
  • 适当地格式化查询
  • 处理搜索结果并将其整合到回答中

8. 集成测试

项目包含一个集成测试,用于验证应用程序是否正常工作:

8.1 ExampleInfo.json

{ "timeoutSec": 300, "successRegex": [ "Does Spring AI supports the Model Context Protocol", "QUESTION:", "ASSISTANT:", "Spring AI.*Model Context Protocol" ], "requiredEnv": [ "OPENAI_API_KEY", "BRAVE_API_KEY" ], "setupCommands": [] }

8.2 RunBrave.java

///usr/bin/env jbang "$0" "$@" ; exit $? //DEPS org.zeroturnaround:zt-exec:1.12 //DEPS com.fasterxml.jackson.core:jackson-databind:2.17.1 //JAVA 17 //FILES ExampleInfo.json //SOURCES ../../../integration-testing/jbang-lib/IntegrationTestUtils.java /* * Integration test launcher for brave * Refactored to use centralized utilities */ public class RunBrave { public static void main(String... args) throws Exception { IntegrationTestUtils.runIntegrationTest("brave"); } }

9. 实现思路与扩展建议

9.1 实现思路

本案例的核心思想是"通过 MCP 协议连接 AI 模型与外部工具"。我们:

  • 使用标准协议:通过 Model Context Protocol (MCP) 连接 AI 模型与 Brave Search 工具。
  • 自动配置:利用 Spring Boot 的自动配置功能,通过配置文件轻松设置 MCP 客户端。
  • 工具回调:通过 SyncMcpToolCallbackProvider 将 MCP 工具集成到 ChatClient 中。

9.2 扩展建议

  • 多 MCP 服务器:可以配置多个 MCP 服务器,使 AI 模型能够访问更多工具和服务。
  • 自定义工具:开发自定义 MCP 服务器,提供特定领域的工具和功能。
  • 异步处理:使用异步 MCP 客户端,提高应用程序的响应性能。
  • Web 界面:添加 Web 界面,使用户能够直接与 AI 模型进行交互,而不仅仅是预设问题。
  • 错误处理:增强错误处理机制,处理 MCP 服务器连接失败或 API 限制等情况。

Read more

《C/C+++ Boost 轻量级搜索引擎实战:架构流程、技术栈与工程落地指南——构造正/倒排索引(中篇)》

《C/C+++ Boost 轻量级搜索引擎实战:架构流程、技术栈与工程落地指南——构造正/倒排索引(中篇)》

前引:这是一个聚焦基础搜索引擎核心工作流的实操项目,基于 C/C++ 技术生态落地:从全网爬虫抓取网页资源,到服务器端完成 “去标签 - 数据清洗 - 索引构建” 的预处理,再通过 HTTP 服务接收客户端请求、检索索引并拼接结果页返回 —— 完整覆盖了轻量级搜索引擎的端到端逻辑。项目采用 C++11、STL、Boost 等核心技术栈,搭配 CentOS 7 云服务器 + GCC 编译环境(或 VS 系列开发工具)部署,既适配后端工程的性能需求,也能通过可选的前端技术(HTML5/JS 等)优化用户交互,是理解搜索引擎底层原理与 C++ 工程实践的典型案例 目录 【一】Jieba分词工具 【二】正/倒排索引结构设计

By Ne0inhk
【C++指南】类和对象(十):const成员函数

【C++指南】类和对象(十):const成员函数

💓 博客主页:倔强的石头的ZEEKLOG主页             📝Gitee主页:倔强的石头的gitee主页             ⏩ 文章专栏:《C++指南》                                   期待您的关注 目录 引言 一、const成员函数的定义与语法 1. 基本语法 2. 底层原理 二、const成员函数的作用与约束 1. 保障数据安全 2. 与const对象的关系 三、特殊场景与进阶技巧 1. mutable关键字 2. 函数重载 3. 权限传递规则 四、最佳实践与常见误区 1. 编码规范建议 2. 易错点分析 五、总结 引言 在C++中,const成员函数是面向对象编程中保障数据安全性的重要机制。它通过限制函数对类成员的修改权限,提升代码的健壮性和可维护性。 本文将结合代码示例,从语法、原理到实际应用场景,全面解析const成员函数的核心要点。   一、const成员函数的定义与语法

By Ne0inhk

多态(C++)

一、(1)编译时(静态)  函数重载,函数模板 (2)运行时(动态)    重点 二、多态的定义及实现 1.构成条件 多态是一个继承关系下的类对象,去调用同一函数,产生不同的行为 1.1必须重要条件 a.必须是基类(父类)的指针或引用调用函数 b.被调用的函数必须是虚函数 其中基类的virtual可以不写,但是不建议,而且这也是考试的埋坑处 1.2虚函数的重写/覆盖:基类中有一个跟派生类完全相同的虚函数(即返回值类型,函数名字,参数列表(指类型int,char...))也称三同 接下来我们看一道知道答案想给面试官背后来个板砖的题 这里按照常规思路,调用test(),而父子类func构成多态(与参数的值无关,类型相同即可), 那么大部分人都会觉得是A->1,这就调到的出题人的坑里,这就考验大家在平时对于细节的掌握,其实构成多态是形成如下的函数

By Ne0inhk