Spring AI 已经支持 MCP(Model Context Protocol,模型上下文协议),而且它不只是能够连接 MCP 服务,还提供了客户端、服务端以及与 AI 工具调用的集成能力。
如果你是从 Java 后端开发的角度学习 Spring AI,可以把 MCP 理解成:一套标准化的 AI 应用与外部工具、数据源之间的通信协议。 以前你可能需要为每个 AI 应用单独编写工具接口,现在可以通过 MCP 统一暴露和调用工具。
例如,你正在开发一个 Spring Boot 智慧英语学习平台,可以让 AI 通过 MCP 查询学生成绩、获取学习计划、查询课程信息,而不必把这些业务逻辑全部写进提示词中。
一、Spring AI 的 MCP 具体体现在哪里?
截至 2026 年 10 月,Spring AI 官方文档已提供完整的 MCP 集成能力。当前官方文档版本为 Spring AI 2.0.1,Spring AI 2.0 GA 也已发布。
Home
+1
MCP 不只是一个工具调用注解,而是包含了多个层面的能力。
AI 应用 / ChatClient
接收用户问题,结合模型判断需要调用什么能力
MCP Client:发现工具、发送调用请求
MCP 协议通信
JSON-RPC 消息 + STDIO / Streamable HTTP 等传输方式
MCP Server:暴露工具、资源和提示模板
Resources
上下文数据
Tools
可执行操作
Prompts
提示模板
官方集成主要体现在以下四个方面。
Home
+2
能力
Spring AI 的实现
作用
MCP Server
服务端 Starter、@McpTool 等注解
将 Java 业务能力暴露给外部 AI 客户端
MCP Client
客户端 Starter、MCP 客户端连接
连接其他 MCP 服务并发现其工具
AI 工具调用集成
ToolCallbackProvider、ChatClient
将 MCP 工具提供给大模型调用
Resources / Prompts
@McpResource、@McpPrompt 等
向客户端提供上下文资源和可复用提示模板
需要注意:MCP Server 负责提供能力,MCP Client 负责连接服务,而大模型负责根据用户问题决定是否调用某个工具。三者不是同一个概念。
二、实际案例:智慧英语学习平台
假设你正在开发一个 Spring Boot 智慧英语学习平台。学生问 AI:
帮我查询自己的雅思口语成绩,并根据当前成绩推荐下一步学习重点。
传统做法是把查询成绩、查询计划等 Java 方法逐个注册为当前 AI 应用的工具。
采用 MCP 后,可以把这些能力做成独立的 MCP Server,让不同 AI 客户端通过标准协议访问。
- 学习平台 MCP Server
暴露 getSpeakingScore、getStudyPlan 等工具,内部调用已有的 Spring Service、数据库和业务接口。
- AI 应用 MCP Client
发现服务提供的工具,将工具描述提供给模型,并将模型提出的工具调用请求交给 MCP Client 执行。
- 返回学习建议
工具返回真实业务数据后,模型结合成绩、学习目标生成自然语言建议。
这个案例的核心价值是:业务能力可以独立部署和复用,AI 应用不需要了解每个业务系统内部的 Java 实现。 但 MCP 本身不会自动提供学生成绩、身份认证或学习算法,这些仍需要你实现。
三、实际代码:如何把 Java 方法变成 MCP 工具?
下面用一个可落地的简化案例演示。为了让版本和 API 保持一致,以下代码以官方 Spring AI 2.0.1 的注解式 MCP 开发方式为参考。
Home
+1
- 创建 MCP Server
先创建一个独立的 Spring Boot 服务,负责向外提供学习平台的业务能力。
添加依赖:
org.springframework.ai spring-ai-starter-mcp-server-webmvc
这里的版本应由项目使用的 Spring AI BOM 统一管理。
在 application.yml 中配置:
server:
port: 8081
spring:
ai:
mcp:
server:
protocol: STREAMABLE
然后编写工具类:
import org.springframework.stereotype.Component;
import org.springframework.ai.mcp.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpToolParam;
@Component
public class LearningTools {
@McpTool(
name = "getSpeakingScore",
description = "查询学生指定考试的雅思口语成绩"
)
public String getSpeakingScore(
@McpToolParam(
description = "学生ID",
required = true
) Long studentId
) {
// 实际项目中应调用 Service 查询数据库
return "学生ID:" + studentId
+ ",雅思口语成绩:6.0";
}
@McpTool(
name = "getStudyPlan",
description = "查询学生当前的雅思学习计划"
)
public String getStudyPlan(
@McpToolParam(
description = "学生ID",
required = true
) Long studentId
) {
// 实际项目中应调用学习计划 Service
return "每日学习4小时,重点练习口语和听力";
}
}
这段代码的关键是 @McpTool:它将普通 Java 方法声明为 MCP 工具,框架可以生成相应的工具参数 Schema,并将其注册到 MCP Server。
Home
+1
注意,示例中的成绩和学习计划是模拟数据。实际业务中应当注入已有的 SpeakingScoreService、StudyPlanService 等服务,而不是直接把数据写死。
- 创建 MCP Client
现在创建另一个 Spring Boot AI 应用,作为 MCP 客户端。它不直接调用上面两个 Java 方法,而是连接 MCP Server。
添加依赖:
org.springframework.ai spring-ai-starter-mcp-client
配置服务连接:
spring:
ai:
mcp:
client:
streamable-http:
connections:
learning-server:
假设模型的 ChatClient 已经通过项目的模型 Starter 配置完成,就可以编写:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AiChatConfig {
@Bean
CommandLineRunner demo(
ChatClient.Builder chatClientBuilder,
ToolCallbackProvider mcpTools) {
ChatClient chatClient = chatClientBuilder.build();
return args -> {
String answer = chatClient.prompt()
.system("""
你是雅思学习助手。
查询成绩时使用 getSpeakingScore。
查询学习计划时使用 getStudyPlan。
只能根据工具返回的真实数据回答。
""")
.user("帮我查询学生1001的口语成绩,并介绍学习计划")
.toolCallbacks(mcpTools)
.call()
.content();
System.out.println(answer);
};
}
}
这里的 ToolCallbackProvider 是关键:客户端 Starter 可以把已连接 MCP Server 提供的工具接入 Spring AI 的工具调用机制;toolCallbacks(mcpTools) 则将这些工具提供给本次模型交互。
Home
+1
具体的客户端自动配置方式可能随 Spring AI 版本和配置而变化,因此需要确认对应版本的 Starter 已启用 MCP 工具回调集成。
- 运行时究竟发生了什么?
用户提问
用户输入:"帮我查询学生 1001 的口语成绩,并介绍学习计划。"
模型选择工具
模型根据工具名称、描述和参数 Schema,决定调用 getSpeakingScore(1001) 与 getStudyPlan(1001)。
MCP Client 发起调用
客户端通过 MCP 协议把工具调用请求发送到 localhost:8081。
MCP Server 执行业务逻辑
服务端执行对应 Java 方法;真实项目中则由 Service 查询数据库或调用业务接口。
模型组织答案
工具结果返回 AI 应用,模型再将结果组织成自然语言回复。
这是逻辑流程示意。工具的选择由模型决定,具体调用和结果回传由 Spring AI 的工具调用机制与 MCP 客户端完成。
四、MCP 与普通 @Tool 有什么区别?
这是学习 Spring AI 时最值得理解的地方。
对比维度
Spring AI @Tool
MCP
工具定义
将 Java 方法注册为 AI 工具
可以将 Java 方法等能力暴露为标准化工具
调用方式
通常由当前应用中的 Spring AI 工具调用框架执行
客户端通过 MCP 协议访问服务端
是否跨服务
通常是当前应用内部调用
支持跨进程、跨服务调用
工具复用
通常需要在各应用中集成相应代码
不同兼容 MCP 的客户端可以复用同一服务
适合场景
当前应用内部的简单业务工具
多个 AI 应用共享业务能力、统一接入外部服务
举个例子:
使用 @Tool:你在雅思 AI 助手里注册查询成绩的方法,这个助手可以调用它。
使用 MCP:你将查询成绩的能力部署成 MCP Server,雅思助手、内部运营助手以及其他兼容 MCP 的客户端都可以连接它。
两者并不冲突。MCP 是标准化的跨应用集成方式,@Tool 是 Spring AI 提供的工具定义方式。 对于 MCP Server,使用 @McpTool 可以直接面向 MCP 暴露能力。
五、实际开发中还要注意什么?
版本问题: Spring AI 1.x 和 2.x 的依赖、SDK 版本以及部分 API 存在差异。上面的注解式示例按 2.0.1 文档编写,不应直接假设能原样用于旧版本。
身份认证: 示例中的 HTTP MCP 服务不能直接当作已经具备权限控制的生产服务。官方 Server Starter 默认不会自动为所有工具配置身份认证和授权。暴露到外部网络之前,需要配置认证、授权以及网络访问限制。
Home
+1
数据权限: 不能只相信模型传入的 studentId。真实项目应从经过认证的用户身份中确认数据访问权限,防止越权查询其他学生的成绩。
写操作需要保护: 如果工具能够修改学习计划、提交考试或删除数据,应增加权限校验、参数验证、幂等控制,以及必要的人工确认。
MCP 不等于 Agent: MCP 提供标准化的工具和上下文访问机制,但不负责自动完成所有多步骤任务规划。Agent 的任务规划、循环调用和决策仍需要相应的应用逻辑或框架支持。