Spring AI+MCP强强联合:三步打造智能体开发王炸组合!

环境:SpringBoot3.4.2



1. 简介

1.1 什么是MCP

Model Context Protocol(MCP)模型上下文协议是一种标准化协议,它让大模型能够更容易地和外部的数据、工具连接起来。你可以把MCP想象成一个通用的插头或者接口,就像USB-C一样,不管是什么设备,只要插上这个接口,就能和电脑、充电器等连接起来。

注意,它连接的不是物理设备,而是AI模型和外部的数据源、工具等。有了MCP,AI模型就能更方便地获取外部的信息,完成更多的任务。比如,通过MCP,AI模型可以操作电脑读写文件,或者模拟浏览器操作等。

1.2 为什么需要MCP

首先,MCP提供了一个标准化的接口,使得AI模型能够轻松地与各种外部工具和数据源进行交互,无需为每个工具或数据源单独开发集成代码。

其次,MCP还解决了数据孤岛问题,通过统一协议连接分散的数据源,使AI模型能够实时访问和利用最新的数据。

总的来说,MCP就像是一个桥梁,让AI模型与外部世界更好地连接起来,从而发挥出更大的价值和潜力。

1.3 Java与MCP架构

  • 客户端/服务器层:McpClient负责处理客户端操作,而McpServer则管理服务器端协议操作。两者都利用McpSession来进行通信管理。

  • 会话层(McpSession):通过DefaultMcpSession实现来管理通信模式和状态。

  • 传输层(McpTransport):处理JSON-RPC消息的序列化和反序列化,并支持多种传输实现。

MCP Client


MCP客户端是模型上下文协议(MCP)架构中的关键组件,负责建立和管理与MCP服务器的连接。它实现了协议的客户端部分,如下图所示:

Java MCP Client Architecture

MCP Server


MCP服务器是模型上下文协议(MCP)架构中的基础组件,它为客户端提供工具、资源和功能。它实现了协议的服务器端部分,如下图所示:

Java MCP Server Architecture

Spring AI 提供了相对应的Spring Boot staters来非常方便的进行 MCP 的集成。接下来,我们将详细的完成一个完整的MCP应用案例。

2. 实战案例

2.1 服务端开发

我们将在 MCP 服务端提供2个外部功能:查询天气预报、获取IP地址详细信息。

引入依赖

<dependency>  <groupId>com.alibaba.cloud.ai</groupId>  <artifactId>spring-ai-alibaba-starter</artifactId>  <version>1.0.0-M6.1</version></dependency><dependency>  <groupId>org.springframework.ai</groupId>  <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId></dependency><dependency>  <groupId>org.springframework.ai</groupId>  <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId></dependency>

说明:

  • 引入alibaba-starter我们将使用阿里的大模型

  • 引入mcp-server-webflux,以支持基于 Spring WebFlux 的 SSE(服务器发送事件)服务器传输

配置文件

​​​​​​​

spring:  ai:    dashscope:      api-key: sk-xxxooo      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1      chat:        options:          stream: true          model: qwen-turbo---spring:  ai:    mcp:      server:        enabled: true        name: ai_mcp_server        version: 1.0.0        type: ASYNC        sse-message-endpoint: /mcp/message

以上我们就完成了基本的配置。接下来,我们需要提供2个外部工具。

工具编写

获取天气预报

​​​​​​​

public class CommonTool {    @Tool(description = "获取当前天气预报")  WeatherResponse getCurrentWeather(WeatherRequest request) {    System.err.printf("准备查询【%s】天气预报%n", request.city()) ;    RestClient client = RestClient.create(URI.create("https://api.vvhan.com")) ;    Map<?, ?> result = client.get()        .uri("/api/weather?city={0}", request.city())        .retrieve()        .body(Map.class) ;    try {      return new WeatherResponse(new ObjectMapper().writeValueAsString(result)) ;    } catch (JsonProcessingException e) {      throw new RuntimeException(e) ;    }  }    @Tool(description = "获取IP地址详细信息")  String getIpAddressInfo(String ip) {    System.err.printf("准备查询【%s】详细信息%n", ip) ;    RestClient client = RestClient.create(URI.create("https://api.vvhan.com")) ;    Map<?, ?> result = client.get()        .uri("/api/ipInfo?ip={0}", ip)        .retrieve()        .body(Map.class) ;    try {      return new ObjectMapper().writeValueAsString(result) ;    } catch (JsonProcessingException e) {      throw new RuntimeException(e) ;    }  }}

注册工具

​​​​​​​

@Configurationpublic class ToolsConfig {  @Bean  ToolCallbackProvider tools() {    ToolCallback[] toolCallbacks = ToolCallbacks.from(new CommonTool()) ;    return ToolCallbackProvider.from(toolCallbacks) ;  }}

如上所述,我们就成功构建了一个仅包含两个外部工具的MCP服务器。

启动服务

图片

  • 默认开启了一个/see端点(其实,还有一个消息传输的端点)

  • 提示注册了2个工具(也不知道给个空格的)

     

接下来,我们进行客户端的开发。

2.2 客户端开发

引入依赖

​​​​​​​

<dependency>  <groupId>org.springframework.ai</groupId>  <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId></dependency><dependency>  <groupId>org.springframework.ai</groupId>  <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId></dependency><dependency>  <groupId>com.alibaba.cloud.ai</groupId>  <artifactId>spring-ai-alibaba-starter</artifactId>  <version>1.0.0-M6.1</version></dependency>

注意,这里引入的是mcp-client包。

配置文件

​​​​​​​

spring:  ai:    mcp:      client:        enable: true        name: ai-mcp-client        initialized: true        type: ASYNC        sse:          connections:            server1:              url: http://localhost:8888

我们配置了一个MCP服务端地址,你可以配置多个按照上面的方式。

完成以上的配置后,我们就可以配置ChatClient,然后进行接口的调用了。

@RestController@RequestMapping("/tools")public class ToolController {  private final ChatClient chatClient ;  public ToolController(ChatClient.Builder aiClientBuilder, ToolCallbackProvider mcpTools) {    this.chatClient = aiClientBuilder        .defaultTools(mcpTools)        .build() ;  }    @GetMapping("/weather")  public ResponseEntity<String> getCurrentWeather(String prompt) {    System.err.println(prompt) ;    String response = this.chatClient        .prompt(prompt)        .call().content() ;    return ResponseEntity.ok(response) ;  }    @GetMapping("/ip")  public ResponseEntity<String> getIpAddressInfo(String prompt) {    System.err.println(prompt) ;    String response = this.chatClient        .prompt(prompt)        .call().content() ;    return ResponseEntity.ok(response) ;  }}

在构造函数中,我们直接注入了ToolCallbackProvider,当我们系统启动时会自动的从配置的服务端进行查找有哪些可用的工具。

启动服务

控制台将输出如下从MCP Server获取的工具:

​​​​​​​

i.m.s.M Line:151 - Received JSON message: {  "jsonrpc": "2.0",  "id": "66d12dae-1",  "result": {    "tools": [      {        "name": "getCurrentWeather",        "description": "获取当前天气预报",         "inputSchema": {           "type": "object",           "properties": {             "request": {               "type": "object",               "properties": {                 "city": {                   "type": "string",                   "description": "城市"                 }               },               "required": ["city"]             }           },           "required": ["request"],           "additionalProperties": false         }       },       {         "name": "getIpAddressInfo",         "description": "获取IP地址详细信息",         "inputSchema": {           "type": "object",           "properties": {             "ip": {               "type": "string"             }           },           "required": ["ip"],           "additionalProperties": false         }       }    ]  }}

测试结果

图片

图片

成功!!!

​​​​​​​

 大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。


2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书 

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。



4.LLM面试题和面经合集


这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。



👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集***

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

<think>好的,用户想了解Spring AIMCP实例。首先,我需要确认MCP在这里具体指什么。在Spring生态中,MCP可能有不同的含义,比如Model-Controller-Presenter,或者是某个特定项目的缩写。不过结合Spring AI来看,可能是指某种与AI模型相关的组件或模式。 接下来,我需要回忆Spring AI的相关内容。Spring AI是一个旨在简化在Spring应用中集成人工智能功能的项目。它可能提供与各种AI模型(如OpenAI、Hugging Face等)交互的抽象层,类似于Spring Data对数据库的抽象。 用户提到的“MCP实例”可能是指某个具体的设计模式或架构组件。例如,Model-Controller-Presenter(MCP)模式,这可能是一种变体的MVC模式,但需要验证是否存在这样的命名。或者,MCP可能指代某个特定的模块或项目名称,比如Model Conversion Pipeline(模型转换管道)或其他缩写。 需要进一步查阅Spring AI的文档或相关资料,确认MCP的具体含义。假设暂时无法访问外部资料,我需要基于已有知识进行推断。可能的推测是,MCP可能是指“Model-Controller-Presenter”模式在Spring AI中的应用,或者是指管理AI模型配置和交互的某个组件。 在回答时,应分步骤解释:首先介绍Spring AI的整体概念,然后逐步引入可能的MCP实例解释,包括其作用、结构和使用场景。同时,提醒用户如果MCP指代特定内容,可能需要更具体的上下文来准确回答。 需要确保回答结构清晰,符合用户要求的中文回答,并且正确使用LaTeX格式标注数学表达式(虽然当前问题不涉及数学,但需注意其他部分)。同时,避免使用Markdown,保持自然的口语化表达。</think>关于Spring AI中的MCP实例,我们需要分步骤理解: 1. **Spring AI基础概念** Spring AISpring生态系统中的新兴项目,旨在为AI模型集成提供标准化接口。其核心思想类似于Spring Data对数据库的抽象,开发者可以通过统一API访问不同AI服务(如OpenAI、Hugging Face等)。 2. **MCP的可能含义分析** - **假设1:Model-Controller-Presenter架构** 在传统Spring MVC模式基础上,可能扩展出针对AI业务场景的三层架构: $$ \text{AI模型层(Model)} \rightarrow \text{逻辑控制层(Controller)} \rightarrow \text{表现适配层(Presenter)} $$ 这种模式适用于需要将原始AI输出转化为业务友好格式的场景 - **假设2:Model Conversion Pipeline** 可能指AI模型转换流水线,例如: ```text 输入预处理 → 模型推理 → 输出后处理 ``` 通过$PipelineBuilder$类实现处理链配置 3. **典型应用场景** - 对话系统实现: ```java @AiController public class ChatController { @PostMapping("/chat") public String handlePrompt(@RequestParam String input) { return aiClient.generate(input); } } ``` - 向量数据库集成:使用$VectorStoreTemplate$进行语义搜索 4. **配置要点** - 通过`application.yml`配置模型参数: ```yaml spring.ai.openai.api-key: ${API_KEY} spring.ai.openai.temperature: 0.7 ``` - 使用$@EnableAiClients$注解激活AI功能 建议在实际开发中结合具体业务需求: 1. 定义清晰的AI服务边界 2. 使用重试机制处理$f(x) = \text{API调用不稳定问题}$ 3. 通过Adapter模式实现多模型热切换 如果需要更精确的"MCP实例"解释,建议提供上下文或查看官方文档中的具体模块定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值