MCP协议实战接入:Java AI Agent的“万能插座”,一套规范打通所有工具
AI想调用你的订单系统?只需统一接口,不用再为每个模型写适配
最近几个月,AI Agent 的热度持续攀升。我身边的 Java 后端朋友,或多或少都在尝试给项目接入 AI 能力——比如用 AI 查天气、查订单、帮用户处理问题。
但很快大家就会遇到一个共同的困惑:明明只是一个简单的“查天气”,却因为要对接 OpenAI、通义千问、Claude 等多个模型,写了一堆 if-else 和适配代码。更麻烦的是,当 AI 需要同时访问数据库、调用第三方 API、读取内部文件系统时,工具的接入方式五花八门,每个工具都要单独写一套调用逻辑。
几个月前,我在调研 AI 工具调用方案时偶然看到了 MCP(Model Context Protocol)。当时的第一反应是:这不就是 AI 界的“USB 接口标准”吗?如果每个工具都按统一规范实现一次 MCP 服务,那么任何支持 MCP 的 AI 应用都能直接调用——不用为每个模型重写适配,不用为每个工具单独对接,一套规范打通所有。
本文就从 Java 后端的视角,聊聊 MCP 协议到底是什么,以及如何在实际项目中真正用起来。
一、为什么你的 AI 项目需要 MCP?
在之前的文章中,我们聊过 Spring AI Alibaba 的 Function Calling 能力——通过 @Tool 注解,可以让 AI 自动调用 Java 方法。这个功能确实很强大,但落地过程中,你会发现一个深层问题:虽然 Function Calling 解决了“让 Agent 能调用工具”的问题,但始终没有解决“工具如何标准化”的问题。
举个例子。项目初期用 OpenAI 的 Function Calling,实现了一个天气查询工具和一个订单查询工具。半年后业务扩张,团队决定接入通义千问,结果发现两个模型的工具调用协议完全是两套——参数格式不同、返回值结构不同、错误处理方式也不同。于是你不得不重写一遍工具适配代码。这种重复劳动,会随着工具的增多和模型的切换不断增加。
MCP 就是为了解决这个“工具标准化”问题而生的。 MCP(Model Context Protocol)是由 Anthropic(Claude 的母公司)提出的开放协议,专门用于规范 AI 应用与外部工具之间的标准化交互。它定义了一套与模型无关的通信标准,让任意 AI 模型可以通过统一接口调用任意工具。
这里用“USB-C 接口”来类比可能更容易理解:以前每个设备都有自己的充电头,出门得带一堆线。USB-C 统一了标准后,一根线能充所有设备。
MCP 给 Java AI 开发带来的核心价值有三点:工具提供方一次开发 MCP Server,所有支持 MCP 的 AI 应用都能直接调用,无需定制开发,这就是标准化层面的价值;工具的开发与使用完全解耦,Agent 团队只需引入 MCP Client,无需关心工具的具体实现细节,这就是解耦层面的优势;更关键的是,MCP Client 可以动态发现 Server 提供的工具列表、工具描述和参数 schema,无需在代码中预先硬编码——新增工具时业务代码零改动。
二、MCP 协议架构:Client-Server 三层模型
理解 MCP 的架构,有助于更好地使用它。MCP 基于 JSON-RPC 2.0 构建,采用标准的 Client/Server 架构,并分层设计。
顶层是 Client/Server 层,McpClient 管理客户端操作和服务端连接,负责工具发现和调用执行;McpServer 处理服务端协议操作和客户端请求,负责向外暴露工具和资源。
中间是 Session 会话层,McpSession 作为核心会话管理接口,McpClientSession 和 McpServerSession 分别负责客户端和服务端的会话状态维护。
底层是 Transport 传输层,McpTransport 负责处理 JSON-RPC 消息的序列化和反序列化,支持 STDIO(进程间通信,适用于本地命令行工具)、SSE(基于 HTTP 长连接的事件流,适用于网络通信)和 Streamable-HTTP 等多种传输方式。
在设计理念上,MCP 定义了三种基本元素:Tools(可调用函数,AI 可调用执行查询数据库、调用 API 等操作)、Resources(只读数据源,供 AI 获取上下文信息)、Prompts(可复用的提示词模板)。一个典型的 MCP 交互流程是:Client 启动时从 Server 获取工具列表;用户提问后,Client 发送包含上下文和参数的结构化请求;Server 路由到对应工具执行,并通过 Server-Sent Events 流式返回结果。
三、实战一:用 Spring AI Alibaba 快速接入 MCP 服务
理论知识说再多,不如直接动手。下面我们以一个最典型的场景—— “用 AI 查询天气和路线规划” 为例,演示如何作为 MCP Client 接入第三方 MCP 服务。
3.1 添加依赖
在 Spring Boot 项目的 pom.xml 中添加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.1.2.0</version>
</dependency>
<!-- MCP Client 核心启动器 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
其中 spring-ai-starter-mcp-client 是关键,它提供 MCP Client 的自动配置,包括按配置创建 MCP Client、初始化连接、发现远端工具以及把远端工具整合为 ChatClient 可直接调用的工具回调。
3.2 配置 MCP Client
创建 application.yml 配置文件:
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
mcp:
client:
request-timeout: 20s
toolcallback:
enabled: true
stdio:
servers-configuration: classpath:/mcp-server.json5
toolcallback.enabled: true 表示自动把 MCP Server 提供的工具注册到 AI Agent 中。
3.3 配置文件:告诉客户端如何启动第三方 MCP Server
MCP Client 需要知道如何启动远端的 MCP Server 进程。在 src/main/resources 目录下创建 mcp-server.json5:
{
"mcpServers": {
"baidu-map": {
"command": "npx",
"args": ["-y", "@baidumap/mcp-server-baidu-map"],
"env": {
"BAIDU_MAP_API_KEY": "${BAIDU_MAP_API_KEY}"
}
}
}
}
安全提示:建议将 API Key 配置成环境变量占位符 "${BAIDU_MAP_API_KEY}",避免在配置文件中以明文形式出现。
3.4 注入配置并获取 ChatClient
package cn.edu.nnu.opengms.config;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AiConfig {
@Bean
public ChatClient chatClient(ChatModel chatModel,
ToolCallbackProvider toolCallbackProvider) {
return ChatClient.builder(chatModel)
.defaultSystem("你是一个智能助手,可以查询天气、规划路线。")
.defaultTools(toolCallbackProvider) // 自动注册 MCP 工具
.build();
}
}
3.5 测试效果
编写一个简单的 Controller,启动 Spring Boot 应用后发送请求测试:
curl -X POST http://localhost:8080/chat \
-H "Content-Type: application/json" \
-d '{"message": "从北京南站到颐和园怎么走,今天天气怎么样"}'
返回示例:
从北京南站到颐和园建议乘坐地铁4号线至北宫门站,全程约50分钟。今天北京天气晴,气温25°C,湿度40%,适合出行。
这个过程中,你一行工具实现的代码都没有写,完全靠 MCP Client 自动发现并注册了百度地图服务提供的工具。
四、实战二:用 MCP Java SDK 实现自己的工具服务端
调用第三方 MCP 服务能让你的应用快速拥有外部能力,但更常见的场景是——把自己的业务系统(订单查询、库存管理、数据处理等)暴露为 MCP 工具,让 AI Agent 能够调用你的 Java 方法。
这一节演示如何用原生 MCP Java SDK,创建一个纯 Java MCP Server。
4.1 环境与依赖
使用纯 Java 原生 MCP SDK,只需引入一个核心依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-bom</artifactId>
<version>1.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
</dependency>
</dependencies>
Java 版本的 MCP SDK 经过一年多的发展,已经趋于稳定。2026 年 2 月发布了 1.0.0 正式版本,同年 3 月发布了 1.1.0 版本。
4.2 定义工具 Schema 并实现 Server
import io.modelcontextprotocol.spec.McpSchema;
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.McpServerFeatures;
public class MyMCPServer {
public static void main(String[] args) {
// 1. 定义工具的参数 Schema(JSON Schema 格式)
var schema = new McpSchema.JsonSchema("object",
Map.of("orderId", Map.of("type", "string", "description", "订单号")),
List.of("orderId"), false, null, null);
// 2. 创建同步工具规范
var syncToolSpec = new McpServerFeatures.SyncToolSpecification(
new McpSchema.Tool("queryOrder", "根据订单ID查询订单状态", schema),
(exchange, arguments) -> {
String orderId = (String) arguments.get("orderId");
// 3. 业务逻辑(实际场景改为查询数据库)
String result = String.format("订单 %s 状态:已发货,预计明天送达", orderId);
// 4. 返回工具执行结果
return new McpSchema.CallToolResult(result, false);
}
);
// 5. 构建 MCP Server(使用 STDIO 传输)
var server = McpServer.sync(McpServer.STDLIB_SERVER_TRANSPORT_PROVIDER);
server.addTool(syncToolSpec);
server.startAndWait(); // 阻塞等待,处理请求
System.out.println("MCP Server started.");
}
}
代码流程说明:
- 第 1-2 步:用 JSON Schema 定义工具的输入参数,描述参数名称、类型和约束
- 第 3-4 步:实现真正的业务逻辑,处理传入的参数并返回结果
- 第 5 步:选择 STDIO 传输方式,构建 MCP Server 并启动
这个 Server 启动后,任何 MCP Client(包括 Claude Desktop、Cursor、你自己写的 Spring AI 应用等)都可以通过 STDIO 方式连接它,并调用其中的 queryOrder 工具。
4.3 用 MCP Inspector 验证
MCP 社区提供了官方的调试工具 MCP Inspector,可以像 Postman 调试 HTTP API 一样调试 MCP Server:
npx @modelcontextprotocol/inspector java -cp target/classes MyMCPServer
Inspector 会列出 Server 暴露的所有工具,并允许你手动发起调用,非常适合开发和调试阶段。
五、进阶特性:Spring AI Alibaba MCP Gateway
以上实战基于 MCP Java SDK 本身,展示了 Java MCP Server 的实现方式。但如果你想让现有业务系统无缝接入 AI 生态,Spring AI Alibaba 的 MCP Gateway 提供了更便捷的思路。
MCP Gateway 的核心价值在于:基于 Nacos 的服务注册发现能力,将现有的 HTTP、Dubbo 等存量服务自动包装为 MCP 协议的工具。这意味着几十上百个现有接口,可以在几乎不改动代码的情况下,全部“AI 化”。
六、避坑指南:MCP 实战中的常见问题
6.1 SSE 的支持时限
MCP 最初主要支持 STDIO 和 SSE(Server-Sent Events)两种传输方式。随着 Streamable HTTP 的推出,多个主流的 MCP Client 已经宣布将在 2026 年中陆续停用 SSE 支持。如果你在搭建新的 MCP 服务端,建议优先考察 Streamable HTTP 方案。
6.2 网络超时配置
MCP Client 在接入远程工具时,建议根据工具的执行耗时设置合理的超时时间,避免长时间等待拖垮整个应用。本文案例中使用的是 20 秒,可根据业务场景调整。
6.3 API Key 安全
无论是接入第三方 MCP 服务还是自己开发 MCP Server,API Key 和敏感信息都应该通过环境变量注入,严禁写在配置文件中。
6.6 传输方式选择
- STDIO(标准输入输出) :最轻量,通过进程间通信交互,适用于本地命令行工具、脚本工具、快速原型验证等。本文的两个实战示例都采用了 STDIO 方式。
- SSE(Server-Sent Events) :基于 HTTP,支持服务端推送,适用于分布式部署场景。但如前文所述,需关注其支持时间线。
- Streamable HTTP:HTTP 流式传输,是最新的趋势,适合实时性和数据量要求较高的场景。
七、工程建议
-
从接入第三方 MCP 服务开始:先通过接入现成的 MCP 服务(如本文的百度地图示例)跑通链路,再考虑自己开发工具服务端,逐步进阶。
-
优选 Spring AI 方案:Spring AI 提供了一流的 MCP 集成支持,而且 MCP 的官方 Java SDK 是由 Spring 团队主导开发的,在 Spring Boot 生态中使用 MCP 将获得最好的兼容性。
-
区分两端的适用场景:
- 如果你的 AI 应用需要调用外部能力(比如让 AI 查天气、查地图),那么你的任务是搭建 MCP Client,接入第三方 MCP 服务。
- 如果你的业务系统有内部能力希望开放给 AI 调用(比如订单查询、库存管理),那么你需要搭建 MCP Server,把业务能力包装成标准协议。
-
用好动态发现能力:充分利用 MCP Client 自动发现工具的能力,新增工具时让 AI Agent 零改代码就能感知到新能力。
-
监控与调试:开发阶段使用 MCP Inspector 验证服务端是否正确暴露工具;生产阶段为每个工具调用增加日志和监控。
八、总结
MCP 给 Java AI 生态带来的是一个标准化的“AI 接口层”——技术团队不必再为每个模型重写适配,不必担心工具越加越多导致系统失控。用 MCP Java SDK 开发服务端,让通用工具接入 AI 生态;用 Spring AI Alibaba 构建客户端,让 AI Agent 快速具备丰富的工具能力。 两者结合,共同构成了 Java 后端驾驭 AI 工具调用的完整拼图。
下一步,建议团队可以尝试一个小的内部项目:选择两三个你最常用的业务工具(比如订单查询、商品搜索、库存检查),将它们包装成 MCP Server,然后在一个 Spring AI 项目中同时接入它们,体验 AI 自动调用多个工具的完整流程。
如果你在搭建过程中遇到任何具体问题,欢迎在评论区和 Java 社区的大家一起探讨。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)