AI 学习与实战系列:Spring AI + MCP 实战------构建下一代智能 Agent 应用
1. AI 应用开发的新纪元:从传统 LLM 到 Agentic Workflow
在人工智能技术飞速发展的今天,我们正经历着从"对话式 AI"向"代理式 AI(Agentic AI)"的重大范式转移。早期的 LLM 应用大多局限于简单的问答(RAG 或直接对话),用户输入 Prompt,模型输出文本。然而,这种模式存在一个致命的弱点:模型被困在了"数字真空"中,无法感知实时数据,也无法对真实世界产生物理影响。
随着 Agent 概念的兴起,我们开始追求让 AI 具备"思考、规划、执行"的能力。Agent 不再仅仅是一个聊天机器人,它是一个能够使用工具(Tools)、访问外部数据、并在多步骤任务中自我修正的实体。在这种背景下,如何标准化 LLM 与外部工具、数据源之间的通信协议,成为了行业关注的焦点。Spring AI 框架的出现,为 Java 开发者提供了一套优雅的抽象层,而 Model Context Protocol(MCP)的诞生,则为 AI 代理生态系统补齐了最后一块拼图------标准化的工具连接协议。
本篇文章将深入探讨如何利用 Spring AI 集成 MCP 协议,构建一个具备强大扩展能力的智能 Agent 系统。我们将不仅仅停留在理论层面,而是通过详尽的代码示例和架构分析,带你领略 Java 在 AI 时代的全新生命力。
2. 深度解析 Spring AI:Java 开发者拥抱大模型的桥头堡
Spring AI 并不是简单地对 OpenAI 或 Anthropic API 进行包装,它是 Spring 生态系统对 AI 领域的深度重构。其核心设计哲学在于"抽象"与"解耦"。通过统一的 ChatModel、EmbeddingModel 和 VectorStore 接口,Spring AI 允许开发者在不同的模型供应商(如 OpenAI、Azure、DeepSeek、Ollama)之间无缝切换,而无需修改核心业务逻辑。
在 Spring AI 的架构中,Advisor(顾问)和 Tool(工具)是实现 Agent 逻辑的关键。Advisor 可以拦截请求和响应,实现记忆管理(Memory)、检索增强(RAG)和日志监控。而 Tool 机制则允许我们将普通的 Java 方法暴露给 LLM,让模型根据上下文决定何时调用这些方法。
Spring AI 的优势在于其与 Spring Boot 的完美融合。利用 Spring 的自动装配(Auto-configuration)和属性配置(Externalized Configuration),开发者可以像配置数据库连接池一样轻松地配置 AI 模型。此外,Spring AI 还引入了结构化输出(Structured Outputs)的支持,这解决了 LLM 输出不可控的痛点,确保 AI 返回的数据可以被 Java 程序直接反序列化为 POJO 对象。
3. Model Context Protocol (MCP) 详解:打破 AI 与工具间的壁垒
MCP 是由 Anthropic 提出的一项开放协议,旨在解决 AI 模型与外部数据/工具集成时的"碎片化"问题。在 MCP 出现之前,如果你想让 AI 访问你的数据库、Google Drive 或 GitHub,你需要为每个模型手动编写特定的 API 调用代码。每个厂商的 Tool Calling 规范略有不同,导致集成工作量巨大且难以复用。
MCP 的核心思想是将"AI 应用"与"数据/工具源"解耦。它引入了两个关键角色:
- MCP Client:即我们的 AI 应用,它负责与 LLM 通信并管理会话。
- MCP Server:一个独立的进程,它负责暴露具体的资源(Resources)、工具(Tools)和提示模板(Prompts)。
通过 MCP 协议,Client 和 Server 之间通过 JSON-RPC 进行通信。这意味着,一旦你实现了一个标准的 MCP Server,任何支持 MCP 协议的 AI 客户端(如 Claude Desktop、Cursor 或基于 Spring AI 的应用)都可以立即使用它提供的功能。这种"即插即用"的特性极大地降低了 AI Agent 的构建成本。MCP 不仅支持本地进程间通信(stdio),还支持远程通信(SSE/HTTP),这为构建分布式的 AI 集成系统奠定了基础。
4. 环境搭建与架构设计:Spring Boot 与 MCP Server 的协作模式
在开始编写代码之前,我们需要设计好系统的整体架构。一个典型的 Spring AI + MCP 应用包含以下组件:
- Spring Boot 后端应用 :作为 MCP Client,集成
spring-ai-mcp依赖。 - LLM 供应商:如 OpenAI 或 Anthropic,负责逻辑推理。
- MCP Server:可以是现成的(如 Filesystem MCP Server、PostgreSQL MCP Server),也可以是自定义开发的。
环境要求:
- JDK 17 或更高版本。
- Spring Boot 3.3+。
- Maven 或 Gradle 环境。
- 必要的 API Key(如 OPENAI_API_KEY)。
在 Maven 中,我们需要引入 spring-ai-openai-spring-boot-starter 和最新的 spring-ai-mcp 模块。Spring AI 团队目前正在积极开发 MCP 的官方集成,通过 McpClient 类,我们可以轻松连接到运行中的 MCP Server。架构设计的关键点在于:Spring AI 应用如何发现并调用 MCP Server 提供的 Tool。当 LLM 发出工具调用请求时,Spring AI 会将该请求转发给 MCP Client,后者通过 JSON-RPC 调用 MCP Server,并将结果返回给模型。
5. 开发实战:使用 Spring AI 构建具备 MCP 能力的智能助手
现在我们进入核心实战阶段。假设我们要构建一个能直接操作系统文件并进行自动化代码审计的 Agent。
首先,配置 MCP Client。在 Spring AI 中,我们可以通过 Bean 的方式定义 McpClient。我们需要指定 MCP Server 的启动命令(如果是本地 stdio 模式):
java
@Bean
public McpClient mcpClient() {
// 启动一个本地的 filesystem MCP server
var serverParams = new McpConfig.ServerParameters(
"npx",
List.of("-y", "@modelcontextprotocol/server-filesystem", "/path/to/workspace"),
Map.of()
);
return McpClient.builder()
.transport(new StdioClientTransport(serverParams))
.build();
}
接下来,我们需要将 MCP Server 提供的工具注入到 Spring AI 的 ChatClient 中。Spring AI 提供了一个转换器,可以将 MCP Tool 映射为 Spring AI 可识别的 FunctionCallback。
java
@RestController
public class AgentController {
private final ChatClient chatClient;
public AgentController(ChatClient.Builder builder, McpClient mcpClient) {
// 将 MCP 工具整合到 ChatClient
var mcpTools = mcpClient.listTools().tools().stream()
.map(tool -> new McpFunctionCallback(mcpClient, tool))
.toArray(McpFunctionCallback[]::new);
this.chatClient = builder
.defaultFunctions(mcpTools)
.build();
}
@GetMapping("/ask")
public String ask(@RequestParam String prompt) {
return chatClient.prompt(prompt).call().content();
}
}
通过这段简短的代码,我们的 AI 助手现在具备了操作本地文件的能力。当你问它"请帮我分析 project 目录下的 pom.xml 文件并给出优化建议"时,LLM 会自动识别出需要调用 read_file 工具,通过 MCP Client 获取文件内容,然后再进行推理分析。
6. 进阶技巧:自定义 MCP Tool 与多模型编排
虽然社区提供了许多现成的 MCP Server,但在企业级实战中,我们往往需要开发自定义的 MCP Server 来连接内部业务系统。使用 Java 开发 MCP Server 同样非常方便。我们可以创建一个独立的 Spring Boot 应用,并利用 spring-ai-mcp-server 模块。
自定义 Tool 的定义: 在 MCP Server 端,你可以定义任何逻辑作为 Tool。例如,一个查询企业内部订单系统的 Tool:
java
@McpTool(name = "queryOrder", description = "根据订单号查询订单详情")
public OrderDetail queryOrder(String orderId) {
return orderService.findById(orderId);
}
多模型编排: 在复杂的 Agent 场景中,一个模型往往不够用。我们可以采用"路由模型 + 专家模型"的架构。路由模型(如 GPT-4o)负责分析任务并决定调用哪个 MCP Server;专家模型(如专为代码优化的模型)负责执行具体任务。Spring AI 的 ChatClient 可以轻松通过配置多个 ChatModel 实例来实现这种编排。此外,结合 McpAdvisor,我们还可以实现对 MCP 通信过程的监控和日志记录,这对于调试 Agent 的行为至关重要。
7. 关键步骤与注意事项:性能、安全与并发控制
在生产环境部署 Spring AI + MCP 应用时,有几个关键问题必须重视:
1. 性能优化: MCP 的通信涉及到跨进程调用(stdio)或网络调用(SSE)。对于高并发应用,频繁的 JSON-RPC 序列化和反序列化会带来开销。建议对常用的静态资源使用 MCP 的 Resource 缓存机制,并合理配置连接池。
2. 安全防范(最重要): 给 AI 提供工具调用权限是非常危险的。例如,一个具备 filesystem 权限的 MCP Server 如果没有严格的路径限制,可能会导致源码泄露或系统配置被改写。原则:最小权限原则。 在启动 MCP Server 时,务必限定其访问范围。此外,对于敏感操作(如删除、转账),应在 MCP Client 层增加 Human-in-the-loop(人工确认)环节。
3. 并发控制: LLM 的响应往往是流式的(Streaming),而 MCP 工具调用可能是阻塞的。在 Spring AI 中,推荐使用 Flux 异步处理。确保 MCP Client 的传输层(Transport)能够处理并发请求,避免因为一个耗时的工具调用阻塞了整个 Agent 的响应。
4. 错误处理: 模型可能会生成错误的工具参数,或者 MCP Server 可能由于网络原因不可用。在 McpFunctionCallback 中应实现健壮的异常捕获,并将友好的错误信息反馈给 LLM,让它尝试重新生成参数或换一种方案。
8. 未来展望:AI Agent 的演进与企业级落地建议
Spring AI 与 MCP 的结合,标志着 Java 生态在 AI Agent 领域迈出了坚实的一步。未来,我们预见会涌现出更多的 MCP Server 仓库,就像 Docker Hub 一样,开发者可以按需下载、一键运行。
学习路线与实践建议:
- 夯实基础:先掌握 Spring Boot 3.x 和响应式编程(Project Reactor),这是理解 Spring AI 异步处理的基础。
- 理解协议:深入阅读 MCP 官方文档,理解 JSON-RPC 通信机制和 Resource/Tool/Prompt 的区别。
- 动手实验:从简单的 Filesystem MCP 开始,尝试让 AI 帮你整理桌面或重构一段代码。
- 进阶实战:尝试编写自己的 MCP Server,连接到一个真实的数据库或第三方 API。
- 关注安全:在设计 Agent 时,始终思考"如果模型失控,最坏的情况是什么",并为此设计防护墙。
AI 的发展日新月异,但核心逻辑始终未变:如何更好地连接人类意图与机器执行力。掌握 Spring AI + MCP,你将拥有构建未来智能应用的核心竞争力。
作者建议: 不要只看文档,去克隆 Spring AI 的官方示例库,跑通第一个 MCP Demo,那种 AI 真正触碰到你本地文件的瞬间,会让你对 Agent 的未来产生全新的认知。