必看!SpringAI轻松构建MCP Client-Server架构
MCP 这个概念相信大家已经听了无数次了,但不同人会有不同的解释,你可能也是听得云里雾里的。
不过没关系,今天这篇内容会通过 Spring AI 给你实现一个 MCP 的 Client 和 Server 架构,让你彻底搞懂 MCP 的概念,以及学会 MCP 的开发技能。
什么是MCP?
MCP 是 Model Context Protocol,模型上下文协议,它是由 Anthropic(Claude 大模型母公司)提出的开放协议,用于大模型连接外部“数据源”的一种协议。
它可以通俗的理解为 Java 界的 Spring Cloud Openfeign,只不过 Openfeign 是用于微服务通讯的,而 MCP 用于大模型通讯的,但它们都是为了通讯获取某项数据的一种机制,如下图所示:

为什么需要MCP?
MCP 存在的意义是它解决了大模型时代最关键的三个问题:数据孤岛、开发低效和生态碎片化等问题。
1.打破数据孤岛,让AI“连接万物”
大模型本身无法直接访问实时数据或本地资源(如数据库、文件系统),传统方式需要手动复制粘贴或定制接口。MCP 通过标准化协议,让大模型像“插USB”一样直接调用外部工具和数据源,例如:
- 查天气时自动调用气象 API,无需手动输入数据。
- 分析企业数据时直接连接内部数据库,避免信息割裂。
2.降低开发成本,一次适配所有场景
在之前每个大模型(如 DeepSeek、ChatGPT)需要为每个工具单独开发接口(Function Calling),导致重复劳动,MCP 通过统一协议:
- 开发者只需写一次 MCP 服务端,所有兼容 MCP 的模型都能调用。
- 用户无需关心技术细节,大模型可直接操作本地文件、设计软件等。
3.提升安全性与互操作性
- 安全性:MCP 内置权限控制和加密机制,比直接开放数据库更安全。
- 生态统一:类似 USB 接口,MCP 让不同厂商的工具能“即插即用”,避免生态分裂。
4.推动AIAgent的进化
MCP 让大模型从“被动应答”变为“主动调用工具”,例如:
- 自动抓取网页新闻补充实时知识。
- 打开 Idea 编写一个“Hello World”的代码。
MCP 的诞生,相当于为AI世界建立了“通用语言”,让模型、数据和工具能高效协作,最终释放大模型的全部潜力。
MCP组成和执行流程
MCP 架构分为以下 3 部分:
- 客户端:大模型应用(如 DeepSeek、ChatGPT)发起请求。
- 服务器:中间层,连接具体工具(如数据库、设计软件)。
- 资源:具体的数据或工具(如 Exce l文件、网页 API)。
运行流程:
- 用户提问。
- 大模型通过 MCP 客户端发送请求。
- MCP 服务器接收指令。
- 调用对应工具(如数据库)执行。
- 返回结果给大模型。
- 生成最终回答。
Spring AI MCP 介绍
Spring AI MCP 是通过 Spring Boot 集成扩展了 MCP 的 Java SDK(开发工具),它同时提供了 Spring Boot 客户端和服务器的启动器,方便使用 Spring AI MCP 快速开发 AI 应用程序。
Spring AI MCP 实战
当前案例中,我们使用 MCP 实现一个天气查询小助手,其中包含的主要角色有:
- MCP Server:MCP 服务提供方,提供天气查询功能。
- MCP Client:MCP 客户端(大模型端)我们对接 DeepSeek LLM 实现对 MCP Server 的调用,从而实现天气预报的查询功能。
具体交互流程如下:

实现 MCP Server 代码编写
MCP Server 主要实现步骤如下:
- 添加 MCP Server 依赖。
- 设置 MCP 配置信息。
- 编写 MCP Server 服务代码。
- 将 MCP Server 进行暴露设置。
关键实现代码如下。
添加 MCP Server 依赖
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<name>Central Portal Snapshots</name>
<id>central-portal-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
MCP Server 依赖有三种类型:
- 标准输入/输出 (STDIO):spring-ai-starter-mcp-server
- Spring MVC(服务器发送的事件):spring-ai-starter-mcp-server-webmvc
- Spring WebFlux(响应式 SSE):spring-ai-starter-mcp-server-webflux
设置 MCP 配置信息
MCP Server 包含以下配置信息:
| 配置项 | 描述 | 默认值 |
|---|---|---|
| enabled | 启用/禁用 MCP 服务器 | TRUE |
| stdio | 启用/禁用 stdio 传输 | FALSE |
| name | 用于标识的服务器名称 | mcp-server |
| version | 服务器版本 | 1.0.0 |
| type | 服务器类型 (SYNC/ASYNC) | SYNC |
| resource-change-notification | 启用资源更改通知 | TRUE |
| prompt-change-notification | 启用提示更改通知 | TRUE |
| tool-change-notification | 启用工具更改通知 | TRUE |
| tool-response-mime-type | (可选)每个工具名称的响应 MIME 类型。例如,将 mime 类型与工具名称相关联spring.ai.mcp.server.tool-response-mime-type.generateImage=image/pngimage/pnggenerateImage() | - |
| sse-message-endpoint | Web 传输的 SSE 终端节点路径 | /mcp/message |
其中 MCP Server 又分为以下两种类型。
服务器类型
- 同步服务器:默认服务器类型,它专为应用程序中的简单请求-响应模式而设计。要启用此服务器类型,请在您的配置中设置。 激活后,它会自动处理同步工具规格的配置,spring.ai.mcp.server.type=SYNC。
- 异步服务器:异步服务器实现使用非阻塞作并针对非阻塞作进行了优化。要启用此服务器类型,请使用配置您的应用程序。此服务器类型会自动设置具有内置 Project Reactor 支持的异步工具规范,spring.ai.mcp.server.type=ASYNC。
编写 MCP Server 服务代码
编写天气预报查询伪代码:
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class WeatherService {
@Tool(description = "根据城市名称获取天气预报")
public String getWeatherByCity(String city) {
Map<String, String> mockData = Map.of(
"西安", "晴天",
"北京", "小雨",
"上海", "大雨"
);
return mockData.getOrDefault(city, "抱歉:未查询到对应城市!");
}
}
将服务暴露出去
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
这样 MCP Server 就编写完成了。
实现 MCP Client 代码编写
MCP Client 主要实现步骤如下:
- 添加 MCP Client 相关依赖。
- 设置配置信息。
- 设置 ChatClient 对象(调用 MCP Server)。
- 编写测试代码调用 MCP Server。
核心实现代码如下:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ClientController {
@Autowired
private ChatClient chatClient;
@RequestMapping("/chat")
public String chat(@RequestParam(value = "msg",defaultValue = "今天天气如何?") String msg) {
String response = chatClient.prompt()
.user(msg)
.call()
.content();
System.out.println("响应结果: " + response);
return response;
}
}
最终执行结果如下:

因为 MCP Server 只配置了 3 个城市,所以查询结果和预期相符:

想要获取完整案例的同学加V:vipStone【备注MCP】
小结
到这里使用 Spring AI 就实现了 MCP Client 和 Server 的调用了,可以看出 MCP 的推出只是为了增强大模型的能力的,有了 MCP 协议之后,任何大模型就可以调用任意实现了 MCP Server 的服务了,这样就无线扩充了大模型的能力,为 AI 的发展提供了标准的协议和便利的对接。
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列等模块。
必看!SpringAI轻松构建MCP Client-Server架构的更多相关文章
- Mac新手必看教程——轻松玩转Mac OS
背景: 大部分用户接触的第一个操作系统大多是windows,本人记得曾经小学的微机课也是以win98为基础学习了一众office软件.随着工作的多样化,单一的windows系统已经无法满足部分需求,而 ...
- 【架构师之路】APP架构师必看:面对爆发流量如何进行架构调整
一.APP架构与WEB架构的最大不同 移动APP的架构和传统PC的WEB架构有三点不同: 1.连接的稳定性.在传统的web端连接成功后就可以认为它是稳定的,但在移动端.无线端,APP连接非常敏感,可能 ...
- 构建基于分布式SOA架构的统一身份认证体系
摘要:本文充分利用SOA架构松耦合的特点,通过规范统一网络接口实现业务系统整合,既提升系统安全性,又简化资源访问操作,具有重要的理论和现实意义. 统一身份认证旨在将分散在各个信息系统中的用户和权限资源 ...
- 修复STS4 server中没有Tomcat的问题(必看,官方推荐,包教包会,国内首发)
版权声明:原创.欢迎转载,转载请注明来源,谢谢. https://blog.csdn.net/qq_41910280/article/details/83279129 修复STS4 server中没有 ...
- 深入浅出 Redis client/server交互流程
综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...
- 新手必看,史上最全的iOS开发教程集锦,没有之一!
最近大火的iPhone XS Max和iPhone XS,不知道有没有同学已经下手了呢?一万三的价位确实让很多人望而却步啊.据说为了赢得中国的用户,专门出了双卡双待的,可想而知中国市场这块“肥肉”人人 ...
- 百度搜索 “Java面试题” 前200页(面试必看)
前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...
- 2019JS必看面试题
2019JS必看面试题:https://www.jianshu.com/p/f1f39d5b2a2e 1. javascript的typeof返回哪些数据类型. 答案:string,boolean,n ...
- Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)
转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...
- 15个初学者必看的基础SQL查询语句
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...
随机推荐
- Detectron2使用
Detectron2使用 Detectron2安装 git clone https://github.com/facebookresearch/detectron2.git cd detectron2 ...
- GIS开发的基础优化策略
GIS开发的基础优化策略 1. GIS开发 空间字段要建对,类型明确,坐标系明确. 空间索引要建立,提高查询效率. 使用空间字段要谨慎,不用的地方不要查. 地图显示尽量用切片,用WMTS. WMS能用 ...
- 关于vue加element-ui上传文件获取文件的sha256的值
首先使用element的上传文件的组件 安装依赖crypto-js npm i crypto-js <el-upload class="upload-demo" drag : ...
- 《CUDA编程:基础与实践》读书笔记(4):CUDA流
1. CUDA流 一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列.除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者.一个CUDA流中的各个操作按照主机发布的次序执行:但来 ...
- shell脚本中的变量
在shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的作用当然不是为了专业.如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次.突然你觉得 ...
- ctfshow--红包一 ob混淆
上来是一段混淆的ob混淆的js代码,还会有个setinterval无限debugger反调试 点击查看代码 function _0x51ba() { const _0x4b06d7 = ['paddi ...
- VScode配置X11转发!让你彻底摆脱显示屏!!!
作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 在我们远程SSH使用开发板或者是服务器开发的时候,你是否总是苦于没有图像显示环境导致OpenCV的cv2.sho ...
- moectf2023 web wp
gas!gas!gas! 直接跑脚本 import requests session=requests.Session() url="http://127.0.0.1:14447" ...
- oracle配置SGA参数不当导致不能正确启动数据库实例处理
原因:生成环境数据库想要增加数据库内存配置参数SGA_TARGET增加到42G,但是没有配置SGA_MAX_SIZE参数值,导致SHUTDOWN IMMEDIATE停止数据库,再STARTUP启动数据 ...
- 蝉联第一,天翼云电脑持续领跑中国DaaS市场!
近日,IDC发布的<中国虚拟桌面软件及云服务市场半年跟踪报告>数据显示,中国电信天翼云在2023年上半年中国桌面即服务(Desktop as a Service,以下简称"Daa ...