一、MCP 的由来
在当今快速发展的 AI 应用生态中,有越来越多这样的应用场景:
- 某智能助手需要调用高德地图获取位置信息
- 用户提问时,系统要通过进行联网搜索
- 企业内部多个 AI 应用都依赖同一个用户权限校验服务、知识库查询工具或者审批流程接口
这个时候问题就来了,Tool Calling (工具调用) 可以使大模型能够突破语言生成的局限,主动调用外部系统完成实际任务。然而,随着工具数量增长和应用场景复杂化,传统的 Tool Calling 实现方式逐渐暴露出一系列工程挑战:
- 工具接口格式不统一,需为每个服务定制解析逻辑;
- 模型侧需硬编码工具定义 (如函数名、参数 schema),缺乏动态发现能力;
- 多平台兼容性差;
为了解决这个问题,一个名为模型上下文协议 (Model Context Protocol, MCP) 的标准应运而生。MCP 并不替代 Tool Calling,而是为其提供一个统一、可扩展、跨平台的连接基础设施。
MCP 是 Tool Calling 的 "标准化运行时",可以把两者的关系理解为:
Tool Calling是 "决策行为":模型决定 "要不要调用工具"、"调哪个工具"、"传什么参数"MCP是 "通信协议":规定 "如何描述工具"、"如何发起调用"、"如何传递结果"、"如何管理会话状态"
这就像 Web 应用中的浏览器与 HTTP 协议的关系:
- 浏览器决定要访问哪个页面 (相当于模型发起 Tool Calling)
- 而真正完成数据传输的是底层的 HTTP 协议 (相当于 MCP 承载调用过程)
假设你要做一个旅游推荐机器人,它可以:
- 查天气
- 查景点信息
- 预定酒店
这些功能分别由三个不同的团队提供服务。如果每个服务都自己定义一套交互方式 —— 有的用 REST API,有的用 gRPC,有的返回 XML,有的要求特定 Header 认证…… 如果没有 MCP,你的 AI 应用程序就要写三套调用逻辑,维护三种错误处理机制,非常麻烦。
更糟糕的是,AI 本身并不直接理解 HTTP 请求怎么发、JSON 怎么构造。它只能告诉你:"我想查某个用户的地址。" 至于怎么调用接口、传什么参数、如何解析结果,必须有人帮它完成。于是,我们需要一个 "翻译官"+"中介平台"—— 这就是 MCP 诞生的意义。
接下来我们就来聊聊什么是 MCP,它为什么重要,以及它是如何工作的。
二、MCP 是什么?
MCP (Model Context Protocol) 是一个开放标准协议,它的目标是让大模型驱动的 AI 应用(比如 Claude、ChatGPT 等)能够像 "插上 USB-C 接口" 一样,轻松连接到外部系统 —— 包括数据库、文件、工具、软件甚至物理设备。
你可以把它想象成:AI 的 "万能插座" 或 "通用接口"。
以前每个 AI 工具要接入某个服务(如日历、邮箱),都得单独开发一套对接逻辑;现在有了 MCP,就像所有设备都统一用 USB-C 充电一样,只要遵循这个标准,就能即插即用。

三、MCP 能做什么
MCP 让 AI 模型不再只是 "聊天机器人",而是可以:
- 获取你的私人数据 (在授权前提下)
- 使用专业工具执行任务
- 自动完成复杂工作流
案例 1: 企业级数据分析助手
销售经理问:"为什么上个月华南区销量下降了?"
- AI 通过 MCP 同时访问:
- CRM 系统 (客户跟进记录)
- ERP 系统 (库存与发货数据)
- 邮件系统 (内部沟通异常报告)
- 分析发现:某关键供应商延迟交货导致缺货
- 自动生成可视化图表 + 改进建议文档
不同角色的核心价值
- 对于开发者而言,可以不再为每个 AI 应用重复开发插件,只需做一个 MCP Server,多个 AI 都能调用。
- 对于 AI 应用商而言,可以快速集成海量工具,增强产品竞争力(比如让 ChatGPT 能控制微信)。
- 对于普通用户而言,可以获得更聪明、更懂你、能办事的 AI 助手,而不是只会回答问题的 "百科机器人"。
四、MCP Java SDK 架构

Client/Server 层:
McpClient处理客户端操作,McpServer管理服务端协议操作,二者均通过McpSession进行通信管理。Session 层 (McpSession):通过DefaultMcpSession实现管理通信模式及状态。Transport 层 (McpTransport):处理 JSON-RPC 消息的序列化与反序列化,支持多种传输协议实现。
MCP 三层架构与外卖系统类比
| MCP 架构层 | 功能说明 | 比喻 |
|---|---|---|
| Client / Server | 谁发起请求?谁处理任务? | 顾客和餐厅厨师 |
| Session 层 | 管理会话生命周期,确保不丢单、不错乱 | 订单管理系统(订单号、状态跟踪) |
| Transport 层 | 消息怎么传过去?用什么方式送? | 手机消息通道 + 外卖骑手 |
场景示例:用 AI 助手点外卖
假设你在家用「AI 小助手」帮你点一份牛肉汉堡:你对家里的智能语音助手说:"帮我点个麦当劳的牛肉汉堡,加番茄酱,不要洋葱",这个 AI 助手是用 Java 写的,并使用了 MCP Java SDK 来连接一个「餐厅订单服务」。
第一层:Client/Server ——「谁点餐?谁做饭?」
这一层决定:谁发起请求?谁负责执行?
- McpClient(客户端):你是顾客,AI 是你的「点餐代理」
McpClient就像你的私人助理。- 它接收你说的话:"点牛肉汉堡",然后把它转化成标准格式的请求,发给餐厅系统。
- 它不关心怎么送消息、也不管网络细节,只关心:"我要下单"。
- McpServer(服务端) → 麦当劳厨房 + 订单处理系统
McpServer是麦当劳那边提供的「标准化接单服务」。- 它收到请求后,会进行相关处理,比如检查菜单是否存在、库存是否充足、能否定制(比如不要洋葱),然后安排厨师做汉堡。
- 处理完后,返回结果:"订单已创建,预计 25 分钟送达。"
第二层:Session 层 (DefaultMcpSession) ——「订单管理系统」
这一层负责:管理对话过程,确保不丢单、不错乱、能追踪状态。
想象一下,如果你同时点了汉堡、奶茶、薯条,还问了好几次 "做好了吗?"、"骑手出发了吗?",怎么办?这时候就需要一个「订单管家」来管理全过程:
- 当你第一次点餐时,它创建一个「会话」(就像打开一个聊天窗口)。
- 给每个请求分配唯一编号(如
order-1001),防止多个订单混淆。 - 记录当前状态:初始化中 → 下单成功 → 制作中 → 骑手取餐 → 配送中 → 已送达。
- 支持异步通信:你可以继续问「奶茶好了吗?」,而不用等汉堡先送到。
第三层:Transport 层 (McpTransport) ——「外卖骑手 + 通信管道」
这一层解决:消息怎么传过去?用什么方式送?
即使你知道要点啥、厨房也知道怎么做,但如果没人送信,一切白搭。McpTransport → 就是「信息快递员」,它的任务是:
- 把你的点餐请求(Java 对象)变成一串可以传输的数据(JSON-RPC 格式)。
- 通过某种「运输方式」发送给服务器。
- 再把服务器的回复原样带回来,还原成 Java 对象。
五、传输协议
MCP Java SDK 支持的传输协议
MCP Java SDK 提供了多种 "通信方式",让 AI 应用(客户端)能灵活地与各种工具服务(服务器)进行对话。就像你可以用微信、打电话、或者当面喊人来传递消息一样,MCP 支持不同的 "传输方式"—— 这就是所谓的 传输协议 (Transport Protocol)。
目前它支持三种传输方式:
- 基于 Stdio 的进程间通信传输协议
- 通过标准输入 / 输出(stdin 和 stdout)在两个程序之间传消息,高效直接
- 类比:两个人面对面交谈
- 基于 Java HttpClient 的 SSE 客户端传输协议
- 基于 Java HttpClient 发起 HTTP 请求,并接收服务端持续发送的事件流(SSE)
- 类比:两个人使用微信聊天,微信持续发消息更新进度
- WebFlux SSE 客户端传输协议(用于响应式 HTTP 流式通信)
- 基于 WebFlux 的非阻塞、响应式编程模型,处理 SSE 流
响应式系统类比
类似开车上班,导航不只是告诉你一次路线,而是全程动态调整:
- "前方拥堵,建议绕行"
- "还有 2 公里进入高架"
- "预计迟到 5 分钟"
而且它能同时监控多个车辆、自动调节信息频率 —— 这就是 响应式系统 (Reactive System)。
六、MCP 使用
1. MCP Server
市面上有许多开源的 MCP Server 实现,涵盖官方实现及社区贡献,可根据需求选择集成。

这些 MCP Server 有官方实现也有个体实现,可以集成的。
2. MCP Client
有了 MCP 服务器之后,如何在实际开发或使用中调用这些服务?这就需要借助 MCP 客户端(MCP Client)。
MCP 客户端是连接本地开发环境或应用与远程 MCP 服务器之间的桥梁。不同的客户端对 MCP 协议的支持程度各不相同,有的仅支持基础功能,有的则实现了完整的多模态集成能力,比如资源访问、工具调用、提示工程(Prompts)、采样生成(Sampling)等。
现在市面上有很多类型的 MCP 客户端,比如电脑软件、代码编辑器插件、智能自动化框架等。它们各有侧重:有些适合程序员辅助写代码,有些功能更全面,适合处理复杂任务流程,用户可以根据自己的需求选择合适的客户端。
客户端集成功能有:Resources Prompts Tools Sampling Roots
可能全集成也可能部分集成
客户端:Client Application / Tool,也就是用来连接和使用 MCP 服务器的 "软件" 或 "工具",比如一个编辑器插件、桌面应用或者开发软件。
核心功能项解释
- Resources:资源访问能力,指能否读取或列出远程 MCP 服务器提供的文件、数据集、知识库等资源。核心是能不能 "看到" 并使用服务器上的资料,比如项目文档、API 文档,类比为连上一个网盘后,能否浏览里面的文件夹和文件。
- Prompts:提示工程支持。允许客户端发送预定义或动态构造的 Prompt 模板给 MCP 服务器,用于引导 AI 输出特定内容,区别于普通的聊天式提示词。例如
/test自动生成测试代码,这是由 MCP 协议标准化支持的结构化、可复用的提示模板系统。 - Tools:工具调用能力。表示客户端是否支持调用 MCP 服务器暴露的功能接口。核心是能不能让 AI"动手做事",不只是回答问题,还能执行操作,比如运行一段代码、搜索网络、调用某个 API 发消息。
- Sampling:采样生成能力。支持生成多个候选结果(多轮采样),并进行对比、排序或选择最优输出的能力,通常用于提高生成质量或探索多种可能性。核心是能不能让 AI"多想几个答案" 再挑最优解,比如生成 5 种不同的代码实现方式。
- Roots:权限边界控制能力。定义客户端可访问的资源根目录范围,是一种安全隔离机制,比如限制 AI 只能访问当前项目目录,不能越权读取其他隐私文件。
下面以常见 AI IDE 工具中使用为例,其他的 IDE 也是类似比如 Cursor、Qoder、Trae 等等
3. 环境准备
在使用 MCP Client 之前,通常需要先运行一个或多个 MCP Server 实例。而许多 MCP Server 是通过 npx(TS/JS 相关)或 uv(Python 相关)命令启动的,在开始使用前,必须正确配置相应的运行环境。
在 MCP 生态中,部分 MCP Server 实现是用 TypeScript 或 JavaScript 编写的,需依赖 Node.js 来运行。
npm 与 npx 的区别
npm(Node Package Manager)是 Node.js 自带的包管理工具,用于安装和管理 JavaScript 包。npx 是随 npm 5.2.0 及以上版本附带的工具,用于执行 npm 包中的可执行命令,支持临时下载并运行远程包。
Python 与现代包管理工具 uv
许多 MCP Server 使用 Python 编写,在 MCP 生态中,uv 被推荐作为首选工具来运行基于 Python 的 MCP Server。
安装必要的软件
| 组件 | 用途 |
|---|---|
| Node.js(含 npm 和 npx) | 运行基于 JavaScript/TypeScript 的 MCP Server |
| Python 3.8+ | 运行基于 Python 的 MCP Server |
| uv | 高效管理 Python 包与虚拟环境 |
验证安装结果
打开终端(Terminal)或命令提示符(Command Prompt),依次输入以下命令:

Python 安装验证
打开终端(Terminal)或命令提示符(Command Prompt),依次运行以下命令:

4. 在 AI IDE 中使用 MCP
在常见的 AI IDE 工具中配置 MCP。
登录之后聊天框右上角有个 mcp servers。
点击之后 再点击 Manage Mcp Servers。
在弹出来的页面中点击 view raw config。
有一个 mcp_config.json 文件,在这个文件中就可以配置各种 MCP Server。
先去申请一个 API key。
点击创建应用就可以创建了。
在 MCP 社区中找到百度地图相关的 MCP Server
选择 node.js 环境集成。
配置 mcp_config.json 文件 填入 API-KEY。
{
"mcpServers": {
"baidu-map": {
"command": "npx",
"args": [
"-y",
"@baidumap/mcp-server-baidu-map"
],
"env": {
"BAIDU_MAP_API_KEY": "<YOUR_API_KEY>"
}
}
}
}
配置好之后保存并且刷新。
出现这个代表成功。
效果演示
根据查询天气的这个 Tool 来演示。
提示词
查询当前北京的天气以及未来三天的天气情况
可以看到会调用 baidu-map 来查询。
5. Spring AI 接入 MCP 服务
5.1. 搭建项目
a) 先创建 maven 项目。

b) 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflux</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
com.alibaba.cloud.ai
spring-ai-alibaba-bom
1.0.0.2
pom
import
未接入 MCP 结果

5.2. 以百度地图为例 接入 MCP Server
a) 添加依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
b) 添加 yml 文件配置
spring:
ai:
dashscope:
api-key: ${DASH_SCOPE_API_KEY}
mcp:
client:
request-timeout: 60000
stdio:
servers-configuration: classpath:/mcp/mcp-servers-config.json
c) 根据路径创建 json 文件

d) 添加 MCP 配置
{
"mcpServers": {
"baidu-map": {
"command": "npx.cmd",
"args": [
"-y",
"@baidumap/mcp-server-baidu-map"
],
"env": {
"BAIDU_MAP_API_KEY": "在百度地图申请的 AK"
}
}
}
}
e) 工具绑定到 ChatClient 上
public ChatController(DashScopeChatModel dashScopeChatModel, ToolCallbackProvider toolCallbackProvider) {
this.client = ChatClient.builder(dashScopeChatModel)
.defaultToolCallbacks(toolCallbackProvider)
.build();
}
Spring 会自动的将 json 文件配置的 mcp server 中的工具绑定到 ChatClient 上。
f) 重启测试

以下浏览器天气搜索出来的 可以看到可以正确调用百度地图的 weather tool 工具 结果正确



