大模型实战 | 详解基于Spring AI框架,从零开始搭建MCP客户端与服务端
随着人工智能技术的爆发式增长,企业级应用对AI大模型的分析、推理、生成等能力需求日益迫切。然而,传统模型面临“数据孤岛”困境:大量关键业务数据分散在本地系统、专有数据库或第三方服务中,难以通过简单的提示词直接注入模型,导致模型理解受限、决策质量不足。更严峻的是,对于涉及隐私或合规要求的数据(如企业财务信息、医疗记录等),直接暴露给云端模型存在显著安全风险。如何打破数据壁垒,同时确保敏感信息的安全可
背景
随着人工智能技术的爆发式增长,企业级应用对AI大模型的分析、推理、生成等能力需求日益迫切。然而,传统模型面临“数据孤岛”困境:大量关键业务数据分散在本地系统、专有数据库或第三方服务中,难以通过简单的提示词直接注入模型,导致模型理解受限、决策质量不足。更严峻的是,对于涉及隐私或合规要求的数据(如企业财务信息、医疗记录等),直接暴露给云端模型存在显著安全风险。如何打破数据壁垒,同时确保敏感信息的安全可控,成为AI落地的核心挑战。
在此背景下,模型上下文协议(MCP) 应运而生。这一由Anthropic开源的开放协议,为AI模型与外部数据/工具提供了“标准化桥梁”,通过统一的接口规范,使模型能够动态调用本地文件、数据库、API等资源,实现“上下文感知”的智能交互。MCP的核心价值在于:
-
标准化集成: 告别“一对一”定制开发,通过协议对接即可连接任意兼容MCP的数据源或工具,大幅降低生态构建成本。
-
安全与灵活性: 支持本地部署,数据无需离境,兼顾隐私合规与实时访问需求。
-
智能体赋能: 为AI Agent提供“手脚”,使其能自主执行查询、分析、操作等复杂任务流。
而Spring AI作为Java生态中领先的AI开发框架,通过深度集成MCP协议,为开发者提供了企业级解决方案:其模块化架构、对同步/异步通信的支持、以及与Spring Boot的无缝融合,使得构建本地MCP客户端与服务端变得高效且可靠。无论是快速搭建文件系统的本地数据中台,还是构建与业务系统(如CRM、ERP)的实时联动,Spring AI的声明式配置、注解驱动开发模式极大降低了技术门槛。
本文将聚焦于“本地MCP服务建设”实战,详细讲解如何基于Spring AI框架,从零开始搭建MCP客户端与服务端,实现模型与本地资源的的安全交互。通过案例演示,读者将掌握如何通过标准化协议突破数据孤岛,构建既安全可控又具备动态扩展能力的AI应用,为业务智能化升级提供可落地的技术路径。
一、环境准备
1.1 基础环境要求
- JDK:17+(推荐 JDK 21)
- Spring Boot:3.4.5(3.x.x 系列)
- Spring Framework:6.2.6(6.x.x 系列)
- Spring AI:1.0.0-M7+(M6 之前版本存在已知问题)
二、模块架构
2.1 核心模块
三、代码实现
3.1 MCP 客户端
Maven 依赖配置
pom.xml
<dependencies>
<!-- Spring AI Starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<!-- WebFlux 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
<!-- 打包配置 -->
<build>
<finalName>${appname}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals><goal>repackage</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Controller示例
McpClientController.java
@RestController
@RequestMapping("/service")
publicclassMcpClientController {
privatefinal ChatClient chatClient;
publicMcpClientController(ChatClient.Builder builder, ToolCallbackProvider tools){
this.chatClient = builder.defaultToolCallbacks(tools).build();
}
@GetMapping("/query/currentTime/{country}")
Flux<String> queryCurrentTime(@PathVariable String country){
returnthis.chatClient
.prompt(new PromptTemplate("调用本地工具查询国家{country}当前时间")
.create(Map.of("country", country)))
.stream()
.content();
}
}
3.2 MCP 服务端
工具类实现
DateTimeTool.java
@Service
publicclassDateTimeTool {
privatestaticfinal Map<String, String> COUNTRY_MAP = Map.of(
"c1", "2020-02-01 12:00:00",
"c2", "2020-02-01 13:00:00"
);
@Tool(description = "国家时间查询工具")
public String getCurrentDateTimeByCountry(String country){
return COUNTRY_MAP.getOrDefault(country,
LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}
}
服务配置
McpServerApplication.java
@SpringBootApplication
publicclassMcpServerApplication {
publicstaticvoidmain(String[] args){
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider tools(DateTimeTool tool){
return MethodToolCallbackProvider.builder()
.toolObjects(tool)
.build();
}
}
四、关键配置
4.1 客户端配置(application.properties)
application.properties
# 日志调试
logging.level.org.springframework.ai=DEBUG
logging.level.io.modelcontextprotocol=DEBUG
# OpenAI 配置
spring.ai.openai.base-url=${AI_BASE_URL}
spring.ai.openai.api-key=${API_KEY}
spring.ai.openai.chat.options.model=qwen-plus
# MCP 客户端配置
spring.ai.mcp.client.toolcallback.enabled=true
spring.ai.mcp.client.request-timeout=60s
spring.ai.mcp.client.root-change-notification=true
spring.ai.mcp.client.stdio.servers-configuration=classpath:mcp-service.json
4.2 服务端启动配置(mcp-service.json)
mcp-service.json
{
"mcpServers": {
"my-mcp-service": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dspring.main.banner-mode=off",
"-Dlogging.pattern.console=",
"-jar",
"/home/admin/app/target/my-mcp-service.jar"
]
}
}
}
重要提示:必须禁用控制台输出,避免污染 stdio 输入流!
五、部署方案
5.1 打包配置(assembly.xml)
<assembly>
<id>release</id>
<formats><format>tar.gz</format></formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- Client 打包 -->
<fileSet>
<directory>../mcp-client/target/</directory>
<includes><include>*.jar</include></includes>
</fileSet>
<!-- Server 打包 -->
<fileSet>
<directory>../mcp-service/target/</directory>
<includes><include>*.jar</include></includes>
</fileSet>
</fileSets>
</assembly>
整合 client/server 生成统一部署jar包,支持通过docker进行标准化部署。
六、注意事项
1.构建要求:
- Maven 版本需与构建环境匹配;
- 使用指定 JDK:
baseline.jdk=ajdk-21;
2.协议兼容:
- 确保 stdio 通道纯净,避免日志污染;
- 服务端需禁用 Web 上下文:
-Dspring.main.web-application-type=none;
3.异常处理:
- 关注 stdio 通道的异常日志;
- 建议超时设置 ≥60 秒:
spring.ai.mcp.client.request-timeout=60s。
七、如何系统学习掌握AI大模型?
AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。
学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。
这里给大家精心整理了一份
全面的AI大模型学习资源
,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享
!
1. 成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
2. 大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)
3. 大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
4. 2024行业报告
行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
5. 大模型项目实战
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
6. 大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以
微信扫描下方CSDN官方认证二维码
,免费领取【保证100%免费
】
更多推荐
所有评论(0)