前言
你有没有想过,为什么现在的AI助手只能回答一些通用问题,却无法帮你查快递、订外卖、或者根据你的位置推荐约会地点?
答案很简单:AI模型被"关在笼子里"了。它们虽然有强大的推理能力,但无法直接访问外部数据源和API。
MCP(Model Context Protocol,模型上下文协议)的出现,就是为了解决这个问题。它就像是AI应用的USB接口,为AI模型连接不同的数据源和工具提供了标准化的方法。
什么是MCP?
根据官方定义,MCP是一种开放协议,它标准化了应用程序如何向大模型提供上下文的方式。
可以把MCP想象成AI应用的USB接口------就像USB为设备连接各种外设和配件提供了标准化方式一样,MCP为AI模型连接不同的数据源和工具提供了标准化的方法。
MCP本身不是一种技术,而是一种开放标准。它的目标是增强AI与外部系统的交互能力,让AI能够:
- 访问最新数据
- 执行复杂操作
- 与现有系统集成

为什么要用MCP?
1. 轻松增强AI的能力
通过MCP协议,AI应用可以轻松接入别人提供的服务来实现更多功能,比如:
- 搜索网页
- 查询数据库
- 调用第三方API
- 执行计算任务
2. 统一标准,降低使用和理解成本
MCP定义好了一套规范,让服务提供者和服务使用者去遵守。就像HTTP协议一样,它定义好了请求和响应的格式,让不同的服务可以方便地交互。
3. 打造服务生态,造福开发者
以前,如果你想给AI增加查询地图的能力,需要自己开发工具来调用第三方地图API。如果有多个项目,或者其他开发者也需要同样的能力,大家就要重复开发。
而现在,如果有人把查询地图的能力直接做成一个MCP服务,谁要用谁接入,省去了开发成本,还能保证效果一致。当大家都陆续开放自己的服务,就相当于打造了一个服务市场,造福广大开发者!
MCP架构详解
宏观架构:客户端-服务器模式
MCP的核心是 "客户端-服务器"架构,一个MCP客户端主机可以连接到多个MCP服务器。

从上图可以看出:
-
MCP客户端主机(如Claude、IDE、AI工具)作为中心节点
-
MCP服务A/B/C分别连接不同的数据源:
- 本地数据源
- 文件系统
- 第三方API(通过远程调用)
SDK三层架构
如果要在程序中使用MCP或开发MCP服务,可以引入MCP官方的SDK。MCP SDK主要分为三层:

| 层级 | 组件 | 职责 |
|---|---|---|
| 客户端/服务器端 | McpClient / McpServer | 处理客户端/服务器端的协议操作 |
| 会话层 | McpSession | 通过DefaultMcpSession管理通信模式和状态 |
| 传输层 | McpTransport | 处理JSON-RPC消息序列化和反序列化 |
传输层支持多种实现方式:
- Stdio(标准输入/输出流):适用于本地调用
- SSE(Server-Sent Events):基于HTTP,适用于远程调用
SSE是基于HTTP协议实现的技术,允许服务器持续向客户端推送消息。
MCP核心概念
很多人以为MCP协议只能提供工具给别人调用,但按照官方的说法,总共有6大核心概念:
| 概念 | 说明 | 开发关注度 |
|---|---|---|
| Tools(工具) | 让AI执行特定操作 | ⭐⭐⭐ 重中之重 |
| Resources(资源) | 提供数据和上下文 | ⭐⭐ |
| Prompts(提示词) | 预定义的提示模板 | ⭐⭐ |
| Sampling(采样) | AI生成回复 | ⭐ |
| Roots(根目录) | 文件系统根路径 | ⭐ |
| Transports(传输) | 通信方式 | ⭐ |
对于大多数MCP服务开发,重点关注Tools即可。
MCP客户端与服务端
MCP客户端
MCP Client是MCP架构中的关键组件,主要负责:
- 与MCP服务器建立连接并进行通信
- 自动匹配服务器的协议版本
- 确认可用功能
- 负责数据传输和JSON-RPC交互
- 发现和使用各种工具、管理资源
支持的传输方式:
- Stdio标准输入/输出(本地调用)
- 基于Java HttpClient和WebFlux的SSE传输(远程调用)
MCP服务器
MCP Server负责为客户端提供各种工具、资源和功能支持:
- 处理客户端的请求
- 解析协议、提供工具
- 管理资源、处理交互信息
- 记录日志、发送通知
- 支持多客户端同时连接
关键优势: 客户端和服务端完全解耦,任何语言开发的客户端都可以调用MCP服务。
实战:在程序中使用MCP
让我们通过一个实际案例,了解如何在Spring AI框架中使用MCP。
场景需求
实现一个能够根据另一半的位置推荐约会地点的AI助手。
实现步骤
1. 引入依赖
在项目中添加Spring AI框架的MCP客户端依赖。
2. 配置MCP服务
在MCP服务市场中搜索地图服务,创建MCP Server的配置文件 mcp-servers.json:
perl
{
"mcpServers": {
"amap-maps": {
"command": "npx",
"args": [
"-y",
"@amap/amap-maps-mcp-server"
],
"env": {
"AMAP_MAPS_API_KEY": "改成你的 API Key"
}
}
}
}
3. 配置Spring
修改Spring配置文件,由于是本地运行MCP服务,使用Stdio传输方式:
yaml
spring:
ai:
mcp:
client:
request-timeout: 30s
stdio:
servers-configuration: classpath:mcp-servers.json
MCP客户端程序启动时,会额外启动一个子进程来运行MCP服务。
4. 编写业务代码
通过自动注入的ToolCallbackProvider获取MCP服务提供的所有工具,并提供给ChatClient:
scss
@Resource
private ToolCallbackProvider toolCallbackProvider;
public String doChatWithMcp(String message, String chatId) {
ChatResponse response = chatClient
.prompt()
.user(message)
.advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
.advisors(new MyLoggerAdvisor())
.tools(toolCallbackProvider) // 注册MCP工具
.call()
.chatResponse();
String content = response.getResult().getOutput().getText();
log.info("content: {}", content);
return content;
}
调试效果

从上图可以看到,MCP客户端成功识别到了地图服务提供的工具,比如 maps_regeocode(将高德经纬度坐标转换为行政区划地址信息)。
核心原理
从代码可以看出,MCP调用的本质就是工具调用:
- 并不是让AI服务器主动去调用MCP服务
- 而是告诉AI "MCP服务提供了哪些工具"
- 如果AI想要使用这些工具完成任务,就会告诉后端程序
- 后端程序执行工具后将结果返回给AI
- 最后由AI总结并回复
总结
MCP协议为AI应用打开了一扇通往外部世界的大门:
| 特性 | 价值 |
|---|---|
| 标准化 | 统一的接入方式,降低学习和开发成本 |
| 解耦 | 客户端和服务端可用不同语言开发 |
| 生态化 | 可复用的服务市场,避免重复造轮子 |
| 灵活性 | 支持本地(Stdio)和远程(SSE)两种传输方式 |
随着MCP生态的不断发展,我们可能会看到:
- 更多的MCP服务被开放出来
- AI应用的能力边界被极大扩展
- 开发者可以像搭积木一样组合各种MCP服务
MCP,正在让AI从"大脑"变成真正能"动手"的智能体。
📌 参考资料