作者:房杰
官方文档:modelcontextprotocol.io/introductio… ! MCP 协议规范也是在不断的发展,目前最新版本 2025-06-18 版本,较之前版本有很大的变动。
一、MCP 是什么?
2024年11月底,Anthropic公司发布了全新的MCP(Model Context Protocol)协议,即模型上下文协议 。该协议是一种开放协议,支持大模型应用程序与外部数据源和工具之间的无缝集成。无论您是构建 AI 驱动的 IDE、增强聊天界面,还是创建自定义 AI 工作流,MCP 都提供了一种标准化的方式来连接 LLMs 需要的上下文。
虽然大模型日新月异,但是AI应用层开发没有多少新的内容,基本上都是 Prompt、RAG、Agent。也并没有一个主流的杀手级的 AI 应用出现。那问题出在哪里了呢?
其中最重要的一个原因在于大模型与现有应用和数据的集成度比较低,无法获取多种数据,形成数据孤岛。真是应了那句 “巧妇难为无米之炊”。即使你大模型在强大,没有数据集成、工具的调用,大模型的能力无用武之地。
在 Anthropic 发布 MCP 之后将会将 AI 应用开发推向一个高度。许多大模型开发框架 Spring AI、 LangChain4j 都已经集成,包括 OpenAI 也宣布支持 MCP。
二、MCP 核心内容
该专栏主要专注于 Java-SDK 源码解析、代码级的实践案例,并通过代码来理解如何使用 MCP 的能力。由于作者水平有限,难免在理解上存在偏差或者会有一些遗漏,建议大家参考 MCP 官方的规范标准。
三、核心概念
3.1、架构模式
MCP 遵循客户端服务器(Client-Server)架构,如下图所示:
架构中每个组件的作用;
| 架构组件 | 描述 |
|---|---|
| MCP Host | 协调和管理一个或多个 MCP 客户端的 AI 应用程序 |
| MCP Client | 维护与 MCP 服务器的连接并从 MCP 服务器获取上下文供 MCP 主机使用的组件 ,与 MCP Server 建立 1 对 1 连接。 |
| MCP Server | 向 MCP 客户端提供上下文的程序,提供 Tools、Resources、Templates 等能力 |
在了解完整体架构之后,你有没有有疑问 Mcp client 如何与 Mcp Server 进行通信的呢?底层使用的什么协议呢?
在 MCP 官方标准中提到,Mcp client 与 Mcp Server 通过传输层(Transport Layer)和数据层(Data Layer)两层完成通信的。
3.1.1、传输层
传输层:定义支持客户端和服务器之间数据交换的通信机制和通道,包括特定于传输的连接建立、消息成帧和授权。
传输层管理客户端和服务器之间的通信通道和身份验证。它处理 MCP 参与者之间的连接建立、消息成帧和安全通信。
对于传输层有一个演进过程,从最初版本的支持 STDIO 和 HTTP-SSE 方式演化到支持 STDIO 和 StreamableHTTP 方式,使用 StreamableHTTP 替代 HTTP-SSE 方式,最终将 SSE 方式废弃。
对于为什么会将 HTTP-SSE 废弃,在 modelcontextprotocol 中可以看到这个 PR, 大概原因如下;
- 废弃原因1: HTTP-SSE 不支持断连恢复
- 废弃原因2: HTTP-SSE 需要服务端长时间维护高可用的连接
- 废弃原因3: 仅仅可以通过 SSE 返回服务端消息
| 通信方式 | 说明 |
|---|---|
| STDIO | 标准输入/输出,本地集成和命令行工具特别有用, - 构建命令行工具; - 本地集成; - 简单的通信; -使用 shell 脚本 |
| Streamable HTTP | 将 HTTP POST 用于客户端到服务器消息,并使用可选的服务器发送事件来实现流式处理功能,支持远程服务器通信,并支持标准 HTTP 身份验证方法,高效灵活,支持更大模块的分布式部署 |
3.1.2、数据层
数据层基于 JSON-RPC 2.0 实现的,该协议定义了消息结构和语义。数据层包括;
- 生命周期管理:处理客户端和服务器之间的连接初始化、功能协商和连接终止。
- 服务器功能:使服务器能够提供核心功能,包括 AI 作工具、上下文数据资源以及与客户端之间的交互模板提示。
- 客户端功能:使服务器能够要求客户端从主机 LLM 中采样,从用户中获取输入,并将消息记录到客户端。
- 实用程序功能:支持附加功能,例如实时更新通知和长时间运行作的进度跟踪。
具体内容参考 MCP 规范,比如 生命周管理规范,大家自行研究吧,这里不再赘述。
思考一下 “传输层” 和 “数据层” 之间关系???
传输层为外层,数据层为内层,当输出层接收到数据,通过数据层发送给服务端。
3.2、MCP 客户端
MCP 客户端由主机应用程序实例化,与特定的 MCP 服务器进行通信。除了利用服务器提供的上下文外,客户端还可以为服务器提供多种功能。这些客户端功能允许服务器作者构建更丰富的交互。
官方文档总结如下;
| 能力 | 说明 | 示例场景 |
|---|---|---|
| Sampling | 采样允许服务器通过客户端请求 LLM 完成任务 | 预订旅行的服务器可能会向 LLM 发送航班列表,并请求 LLM 为用户选择最佳航班。 |
| Roots | 客户端指定服务器可以访问的文件目录 | 用于预订旅行的服务器可以访问特定目录,从中读取用户的日历。 |
| Elicitation | 服务器能够在交互过程中向用户请求特定信息,从而为服务器提供一种按需收集信息的结构化方式 | 服务器预订旅行可能会询问用户对飞机座位、房间类型或联系电话的偏好,以完成预订 |
3.2.1、Roots
Roots 是 Mcp client 定义的允许 Mcp server 可访问文件系统目录的边界。
Roots 是客户端将文件系统访问边界传达给服务器的一种机制。它们由文件 URI 组成,指示服务器可以运行的目录,帮助服务器了解可用文件和文件夹的范围。虽然根传达了预期的边界,但它们不会强制实施安全限制。
Roots 的定义结构:
{
"uri": "file:///Users/agent/travel-planning",
"name": "Travel Planning Workspace"
}
要求: uri 以 file:// 开头定义。
另外 Mcp Server 可以订阅 Roots 的变化,当 Mcp client 定义的 Roots 发生变化时,Mcp Server 可以通过root/list_changed 接收通知。
3.2.2、Sampling
Sampling 允许服务器通过客户端请求语言模型完成,从而实现代理行为,同时保持安全性和用户控制。
举个具体示例:
有一个 “航班智能体” 提供了为用户推荐合适的航班行程,并且提供 findBestFlight 的工具。
- 访问
findBestFlight的工具获取最佳航班时,在方法内部查询多条航班信息; - 因为存在多条航班信息,此时在
findBestFlight内部需要发起一个 Sampling 请求到 Mcp client - Mcp client 接收到 sampling 请求后并发送给大模型 【这个阶段用户可以介入】。
- Mcp client 将结果给 Mcp Server,然后 Mcp Server 在通过
findBestFlight结果发送给用户。
3.2.3、Elicitation
Elicitation 在这里我们就翻译为 “征询”,意思就是征求、询问之意。Mcp client 为 Mcp Server 提供了一种按需收集必要信息的结构化方法。
Mcp Server 可以暂停其作以请求用户的特定输入,而不是预先要求所有信息或在数据丢失时失败。这创造了更灵活的交互,服务器适应用户需求,而不是遵循僵化的模式。
3.4、MCP 服务端
Mcp server 支持的特性(翻译于官方文档):
| Feature | 说明 | 示例 | 谁控制它 |
|---|---|---|---|
| Tools 工具 | 可以供大模型调用的函数,并根据用户的请求决定何时使用它。工具可以调用数据库、调用外部 API、修改文件或者触发其它逻辑 | 搜索航班、发送消息等 | 大模型 |
| Resources 资源 | 提供只读访问上下文信息的被动数据源,例如文件内容、数据库模式或 API 文档 | 文件、文档、知识库等 | 应用 |
| Prompts 提示词 | 预构建的指令模板,告诉模型使用特定的工具和资源 | 总结我的会议、计划假期 | 用户 |
除了以上三个特性外,Mcp server 支持几个非常实用的功能,
- Completion: 输入补全功能
- Logging: 将日志发送给客户端能力,方便用户排查问题
- Progress: 将处理进度信息发送给客户端,提升用户使用体验
3.4.1、工具(Tools)
模型上下文协议 (MCP) 允许服务器公开可由语言模型调用的工具。工具使模型能够与外部系统交互,例如查询数据库、调用 API 或执行计算。每个工具都由名称唯一标识,并包含描述其架构的元数据。
工具设为为 model-controlled,这意味着工具从服务器公开给客户端,然后由 AI 模型决策调用哪个工具(在循环任务中需要授权批准)。
特别说明:
在开发 Mcp server时,支持工具的服务端必须声明“工具” 功能
{
"capabilities": {
"tools": {
"listChanged": true
}
}
}
- listChanged:该字段说明当工具发生变更时,服务器是否会发出通知。
协议操作
| 操作 | 说明 | 协议(请求/响应) |
|---|---|---|
| tools/list | 发现可用工具 | modelcontextprotocol.io/specificati… |
| tools/call | 执行特定的工具 | 同上 |
| tools/list_changed | 工具变更通知 | 同上 |
时序图
- 工具发现:Mcp client 启动时,通过 tools/list 发现可用的工具列表,
- 工具调用:大模型会根据用户的请求,决定调用哪个工具。Mcp client 此时通过 tools/call 发起工具调用,Mcp server 收到工具调用请求后,执行工具并返回工具执行的结果发送给 Mcp client 客户端。
- 工具更新:当工具更新时, Mcp server 会通过 tools/list_changed 请求,Mcp client接收到请求后,通过 tools/list 重新发现可用工具。
大家先思考如何在 Mcp server 中实现一个工具??? 后面示例会详细说明
3.4.2、资源(Resources)
模型上下文协议 (MCP) 为服务器提供了一种标准化的方式来公开 资源给客户。资源允许服务器共享数据,这些数据向 语言模型,例如文件、数据库Schema 或特定于应用程序的信息。 每个资源都由URI
资源被设计为 application-controlled。这就意味着客户端应用程序可以决定如何以及何时使用它们。不同的客户端对资源的处理采用不同的方式。
特别说明:
对于支持资源的服务器必须声明资源功能:资源订阅 和 变更通知 但是两个能力是可选的,可以同时支持,支持其中之一或者都不支持,但必须声明。
在开发 Mcp Server 时需要指定 Mcp server 的能力
{
"capabilities": {
"resources": {
"subscribe": true,
"listChanged": true
}
}
}
- subscribe:告知 Mcp client 是否可以订阅 Mcp server 单个资源变更通知
- listChanged:可用资源列表发生变更时,Mcp server 是否会发出通知。
协议操作
| 操作 | 说明 | 协议(请求/响应) |
|---|---|---|
| resources/list | 发现可用资源 | modelcontextprotocol.io/specificati… |
| resources/read | 检索资源内容 | 同上 |
| resources/templates/list | 发现资源模型 | 同上 |
| resources/list_changed | 当可用资源列表发生更改时,声明 listChanged 的服务器 功能应该发送通知 | 同上 |
特别想说的是:”资源模版“ 即通过使用 URI 模板 ,参数可以通过补全自动完成。
举个例子:/users/{id} 其中 id 可替换为确定的值。
时序图
- 发现可用资源:Mcp client -> Mcp server
- 检索资源内容:Mcp client -> Mcp server
- 资源订阅:Mcp client -> Mcp server
- 资源更新:Mcp server -> Mcp client
3.4.3、 提示词(Prompts)
模型上下文协议 (MCP) 为服务器提供了一种向客户端公开提示模板的标准化方法。提示允许服务器提供结构化消息和与语言模型交互的指令。客户端可以发现可用的提示,检索其内容,并提供参数来自定义它们。
提示词被设计为 user-controlled,这意味着它们从服务器公开到客户端,目的是用户能够显式选择它们以供使用。
通常,提示词将通过用户界面中的用户启动的命令触发,这允许用户自然地发现和调用可用的提示。
在开发 Mcp Server 必须在初始化时指定;
{
"capabilities": {
"prompts": {
"listChanged": true
}
}
}
- listChanged:用来说明,当提示词发生变化时,服务器是否会发出通知。
协议操作
| 操作 | 说明 | 协议(请求/响应) | |
|---|---|---|---|
| prompts/list | 发现可用提示词模版 | modelcontextprotocol.io/specificati… | |
| prompts/get | 检索特定提示 | 同上 | |
| prompts/list_changed | 当可用提示列表更改时,声明 listChanged 的服务器 功能应该发送通知 | 同上 |
时序图
提示词消息
对于提示词消息分类;
- Text Content 文本内容
- Image Content 图片内容
- Audio Content 音频内容
- Embedded Resources 嵌入式资源
四、总结
本文主要根据官方文档进行了 MCP 相关概念进行了讲解,可能还有有些晦涩难懂,后续会进行实战项目亲身体会每个概念的使用场景。另外还有一部分内容本文并未涉及,比如连接的生命周期、消息格式等等,在官方文档中都有详细说明,并不要过多的解释说明,大家自行学习!希望对你有帮助~~~~