在 Spring AI 框架中如何集成 MCP?
- 标签:大模型、AI、MCP、Spring、Spring AI、Java
🏛 业务架构师
Spring AI 对 MCP 的集成走的是标准 Java 生态路线,我在企业 Java 团队推广时主要讲三块:
作为 MCP Client(消费工具):Spring AI 提供 McpClient starter,配置 Server 地址即可自动发现工具,并把 MCP 工具适配为 Spring AI 的 FunctionCallback/ToolCallback,ChatClient 调用模型时自动注册——Java 团队不用写协议代码,像声明一个 Bean 一样接入工具生态。
作为 MCP Server(暴露能力):用 spring-ai-starter-mcp-server 注解 @Tool 把现有 Service 方法发布成 MCP 工具,定义名称、描述、参数 Schema;可配 stdio 或 WebMVC/WebFlux 传输。这意味着存量 Spring 微服务只要加依赖加注解,就能升级为 AI 可调用的服务——这是 Java 企业最平滑的 AI 化路径。
生产化配套:结合 Spring Security 做 OAuth2 鉴权、Actuator 做健康监控、注册中心做服务发现(社区已有 MCP Registry 方案)。
业务价值判断:对以 Java 为技术栈的企业,Spring AI + MCP 让 AI 能力建设复用既有微服务资产和中台治理体系(网关、鉴权、审计),学习成本最低、合规路径最顺——不需要团队转 Python 生态就能把 Agent 落地,这是技术栈连续性带来的真实降本。
🏗 系统架构师
Spring AI 从 1.0 起对 MCP 有一等公民支持,集成方式我按角色分:
作为 MCP Client(应用调外部工具):
- 引入
spring-ai-starter-mcp-client依赖,配置 MCP Server 端点(stdio 或 Streamable HTTP); - Spring Boot 自动配置生成
McpSyncClient/McpAsyncClient,启动时完成 initialize 握手与 tools/list 发现; - 发现到的 MCP 工具自动映射为 Spring AI 的
ToolCallback,注册进 ChatClient 的 tool 列表,模型决策调用后由框架经 MCP Client 转发给 Server 执行。
作为 MCP Server(把自家能力暴露给 AI 生态):
- 引入
spring-ai-starter-mcp-server-webmvc/webflux; - 用
@Tool注解声明方法(name/description/inputSchema 自动生成),或编程式注册ToolCallbackProvider; - 自动暴露 MCP 端点,Claude Desktop、IDE 等任何 MCP Host 都能接入。
架构师视角的落地要点:一是把 Spring 生态红利带进 MCP——已有的 Service、权限注解、配置中心可以直接包装成 MCP Server,企业数据接入 AI 的改造成本极低;二是治理——生产环境 MCP Server 前置网关做鉴权(OAuth2)、限流、审计;三是生命周期——Client 连接池、断线重连、Server 版本升级时的能力变更监控(tools/list diff 告警),这些 Spring AI 提供了钩子但策略要自己定。
💻 全栈开发专家
Spring AI(1.0 起)对 MCP 支持已经产品化,客户端、服务端都有 starter。
作为 MCP Client(让应用连接 MCP Server 用工具):
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>yaml
spring:
ai:
mcp:
client:
stdio:
connections:
weather:
command: uvx
args: ["mcp-server-weather"]
enabled: true注入 McpSyncClient 列表后,Spring AI 会自动把 MCP 工具桥接成 ToolCallback,ChatClient 直接可用,SyncMcpToolCallbackProvider 一行接入。
作为 MCP Server(把自己的服务暴露成 MCP 工具):
java
@Service
public class OrderTools {
@Tool(description = "根据订单号查询订单状态")
public OrderStatus queryOrder(@ToolParam(description = "订单号") String orderId) {
return orderService.status(orderId);
}
}配 spring-ai-starter-mcp-server-webmvc,@Tool 方法自动发布为 MCP tools,Streamable HTTP 端点开箱即用。
踩坑:stdio 连接的进程随 JVM 生命周期管理,本地调试看日志要分开打;生产对外暴露 MCP Server 记得套 Spring Security + OAuth2 资源服务器,默认端点是无鉴权的。