概述
MCP(Model Context Protocol,模型上下文协议)是一种开放标准,目的是增强 AI 与外部系统的交互能力
假设大模型是一台智能手机,但需要耳机、充电器等(外部工具和数据)。如果每个设备都用自己的接口,会非常麻烦。而MCP协议就是给所有设备统一换成USB-C接口,让手机能即插即用任何工具。
- 通过 MCP协议,AI 应用可以轻松接入别人提供的服务,比如搜索网页、查询数据库、调用第方 API、执行计算。
- 其次MCP是个协议,只是定义好了一套规范,让服务提供者和服务使用者去遵守。就像 HTTP 协议一样
MCP 架构
MCP 的核心是“客户端-服务器" 架构,其中 MCP 客户端(指希望访问 MCP 服务的程序)可以连接到多个服务器,比如 Claude、IDEA、部署在服务器上的项目。
SDK 3 层架构
如果要在程序中使用或开发 MCP 服务,可以引入 MCP 官方的 SDK,比如 Java SDK。MCP SDK 的架构主要分为 3 层:
- 客户端/服务器层:
McpClient处理客户端操作,而McpServer管理服务器端协议操作。两者都使用McpSession进行通信管理。 - 会话层(McpSession): 通过
DefaultMcpSession实现管理通信模式和状态。 - 传输层(McpTransport): 处理
JSON-RPC消息序列化和反序列化,支持多种传输实现,比如 lO 流传输和 HTTP SSE 远程传输。

MCP 客户端
主要负责和 MCP 服务器建立连接并进行通信。此外,还能发现和使用各种工具、管理资源、和提示词系统进行交互。为了适应不同场景,它提供了多种数据传输方式,客户端可以通过不同传输方式调用不同的 MCP 服务,可以是本地的、也可以是远程的。
- Stdio 标准输入/输出: 适用于本地调用
- 基于 Java HttpClient 和 WebFlux 的 SSE 传输: 适用于远程调用
MCP 服务端
主要用来为客户端提供各种工具、资源和功能支持,负责处理客户端的请求,包括解析协议、提供工具、管理资源以及处理各种交互信息。同时,还能记录日志、发送通知,并且支持多个客户端同时连接,保证高效的通信和协作。
和客户端一样,它支持多种方式数据传输,这种设计使得服务端完全解耦,任何语言开发的客户端都可以调用 MCP 服务。
核心概念
按照官方的说法,总共有6大核心概念。除了 Tools 工具之外的其他概念都不是很实用,如果要进一步学习可以阅读对应的官方文档。
1.Resources资源: 让服务端向客户端提供各种数据,比如文本、文件、数据库记录、API 响应等,客户端可以决定什么时候使用这些资源。使 AI 能够访问最新信息和外部知识,为模型提供更丰富的上下文。
2.Prompts提示词: 服务端可以定义可复用的提示词模板和工作流,供客户端和用户直接使用从而简化用户与 LLM的交互过程。
3.Tools工具: MCP 中最实用的特性,服务端可以提供给客户端可调用的函数,使 AI 模型能够执行计算、查询信息或者和外部系统交互
4.Sampling采样: 允许服务端通过客户端向大模型发送生成内容的请求(反向请求)。使 MCP 服务能够实现复杂的智能代理行为,同时保持用户对整个过程的控制和数据隐私保护。
5.Roots根目录: MCP 协议的安全机制,定义了服务器可以访问的文件系统位置,限制访问范围,为 MCP 服务提供安全边界,防止恶意文件访问。
6.Transports传输: 定义客户端和服务器间的通信方式,包括 Stdio(本地进程间通信)和 SSE(网络实时通信),确保不同环境下的可靠信息交换
使用MCP
MCP 服务大全
- MCP.so: 较为主流,提供丰富的 MCP 服务目录
- GitHub Awesome MCP Servers: 开源 MCP 服务集合
- 阿里云百炼 MCP 服务市场
- Spring Al Alibaba 的 MCP 服务市场
- Glama.ai MCP 服务
有2种可选的使用模式: 本地下载 MCP 服务端代码并运行(类似引入了一个 SDK),或者 直接使用已部署的 MCP 服务(类似调用了别人的 API)
但其中,绝大多数 MCP 服务市场仅提供本地下载 MCP 服务端代码并运行的使用方式,毕竟部署 MCP 服务也是需要成本的。
有些云服务平台提供了云端部署的 MCP 服务,比如阿里云百炼平台,在线填写配置后就能用,但局限性也大,不太能直接在自己的代码中使用。
云平台使用 MCP
以阿里云百炼为例,参考官方MCP文档,可以直接使用官方预置的 MCP 服务,或者部署自己的 MCP 服务到阿里云平台上。如图

让我们进入一个智能体应用,在左侧可以点击添加 MCP 服务,然后选择想要使用的 MCP 服务即可,比如使用高德地图 MCP 服务,提供地理信息查询等 15 个工具。


AI会根据需要调用不同的工具,比如将地点转为坐标、查找某坐标附近的地点,调用工具完成后,AI 会利用工具的输出结果进一步分析并生成回复。这个流程很像工具调用(Tool )
软件客户端使用 MCP
不同的客户端软件对 MCP 支持程度不同,可以在官方文档中查看各客户端支持的特性。下面以主流 AI 客户端Cursor为例,演示如何使用 MCP 服务。由于没有现成的部署了 MCP 的服务器,我们采用本地运行的方式。
环境准备
- 首先安装本地运行 MCP 服务需要用到的工具,具体安装什么工具取决于 MCP 服务的配置要求。
- 比如我们到 MCP 市场 找到 高德地图 MCP,发现 Server config 中定义了使用 npx 命令行工具来安装和运行服务端代码
- 大多数 MCP 服务都支持基于 NPX 工具运行,所以推荐安装
Node.js和 NPX,去官网安装即可 - 从配置中我们发现,使用地图 MCP 需要 API Key,我们可以到高德地图开放平台创建应用并添加 API Key

cursor接入mcp
打开cursor右上角设置,选择MCP,添加全局MCP
{
"mcpServers": {
"amap-amap-sse": {
"url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key"
}
}
}
测试
接下来就可以使用 MCP 服务了,选择配置 Cursor 大模型让你拥有更好的服务体验,建议选择 claude-3.7-sonnet
观察效果,发现 AI 可能会多次调用 MCP:

程序中使用 MCP
核心:客户端基于本地mcp启动配置==>起一个子进程启动mcp服务
利用 Spring AI 框架,在程序中使用 MCP 并完成我们的需求,实现一个能够根据另一半的位置推荐约会地点的 Al 助手。
建议参考Spring Al Alibaba的文档,因为 Spring Al 官方文档更新的太快了,包的路径可能会变动。
- 在 Maven 中央仓库 中可以找到正确的依赖,引入到项目中:
<!-- 添加Spring AI MCP starter依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
- 在resources 目录下新建
mcp-servers.json配置,定义需要用到的 MCP 服务
{
"mcpServers": {
"amap-maps": {
"command": "npx", //如果是windows,要加个.cmd
"args": [
"-y",
"@amap/amap-maps-mcp-server"
],
"env": {
"AMAP_MAPS_API_KEY": "改成你的 API Key"
}
}
}
}
- 在
application.yml中配置MCP服务器:
spring:
ai:
mcp:
client:
stdio:
servers-configuration: classpath:mcp-servers.json
这样一来,MCP客户端程序启动时,会额外启动一个子进程来运行 MCP 服务,从而能够实现调用。
- 修改
HealthApp的代码,新增一个利用 MCP 完成对话的方法。
@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)
.call()
.chatResponse();
String content = response.getResult().getOutput().getText();
log.info("content: {}", content);
return content;
}
从代码能够看出,MCP 调用的本质就是类似工具调用,并不是让 AI 服务器主动去调用 MCP 服务,而是
告诉 AI“MCP 服务提供了哪些工具”>如果 AI 想要使用这些工具完成任务> 告诉我们的后端程序,后端程序在执行工具后将结果返回给 AI==>最后由 AI 总结并回复。
测试
@Test
void doChatWithMcp() {
String chatId = UUID.randomUUID().toString();
// 测试地图 MCP
String message = "帮我找到上海浦东新区比较知名的医院";
String answer = healthApp.doChatWithMcp(message, chatId);
}
可以在高德流量控制台查看调用情况 https://console.amap.com/dev/flow/detail

MCP最佳实践
- 慎用 MCP: 本质就是工具调用,只不过统一了标准、更容易共享而已。先开发工具调用,之后需要再将工具调用转换成 MCP 服务即可。
- Stdio 模式作为客户端子进程运行,无需网络传输,因此安全性和性能都更高,更适合小型项目
- SSE模式适合作为独立服务部署,可以被多客户端共享调用,更适合模块化的中大型项目团队。
MCP部署
由于 MCP 的传输方式分为 stdio(本地)和 SSE(远程)和 远程部署,因此 MCP 的部署也可以对应分为 本地部署部署过程和部署,一个后端项目的流程基本一致。
本地部署
适用于 stdio 传输方式。跟我们开发 MCP 的流程一致,只需要把 MCP Server 的代码打包( 比如jar包),然后上传到 MCP Client 可访问到的路径下,通过编写对应的 MCP 配置即可启动(上述流程就是这样)
但缺点也很明显,每个 MCP 服务都要单独部署(放到服务器上),如果 MCP 服务多了,可能会让人很崩溃。这时你不禁会想: 我为什么不直接在后端项目中开发工具调用,非要新搞个项目开发 MCP 呢?
远程部署
适用于 SSE 传输方式。远程部署 MCP 服务的流程跟部署一个后端 web 项目是一样的,都需要在服务器上部署服务(比如 jar 包)并运行。
简单来说就是 部署到服务器上两个后端服务
提交至平台
还可以把 MCP 服务提交到各种第三方 MCP 服务市场,类似于发布应用到应用商店,让其他人也能使用你的 MCP 服务。
其实这个做法有点像开源,你就想想开源代码有什么好处就理解了,咱直白地说,至少有一个好处是可以提升技术影响力、收获一波流量。要不然你看大公司为啥那么快就在 MCP 服务市场上占坑呢?
MCP安全问题
需要注意,MCP 不是一个很安全的协议,如果你安装使用了恶意 MCP 服务,可能会导致隐私泄露、服务器权限泄露、服务器被恶意执行脚本等。
举个例子,假如我恶意 开发了个搜索图片服务,正常用户看到的信息可能是“这个工具能够从网络搜索图片”,AI也是这么理解的。可谁知道,我的源码中根本没有搜索图片,而是直接返回了个垃圾图片! AI 也不知道工具的输出是否包含垃圾信息。
其次是 上下文混合与隔离不足,由于所有 MCP 工具的描述都被加载到同一会话上下文中,使得恶意MCP 工具可以影响其他正常工具的行为。
扩展-- A2A 协议
什么是 A2A 协议?
简单来说,A2A 协议 就是为“ 智能体之间如何直接交流和协作 ”制定的一套标准。总结就是 开放互联
核心是让每个智能体都能像“网络节点”" 一样,拥有自己的身份、能力描述和通信接口。
它不仅规定了消息的格式和传递方式,还包括了身份认证、能力发现、任务委托、结果回传等机制。这样一来,智能体之间就可以像人类团队一样,互相打招呼、询问对方能做什么、请求协助。
可以把 A2A 类比为智能体世界里的 HTTP协议
- HTTP 协议让全球不同服务器和电脑之间能够交换数据
- A2A 协议则是让不同厂商、不同平台、不同能力的智能体能够像团队成员一样互相理解、协作和分工。
和 MCP 协议的区别
- MCP 协议是 智能体和外部工具之间的标准
- A2A 协议则是 智能体之间的通信协议让不同 AI 角色之间可以直接对话、协作和分工
2479

被折叠的 条评论
为什么被折叠?



