Model Context Protocol (MCP) 通信过程详解
1. MCP 简介
Model Context Protocol (MCP) 是一种开放标准,用于在 AI 应用程序和外部系统之间建立安全的双向连接。它允许 AI 应用(如 Claude 或 ChatGPT)连接到数据源(如本地文件、数据库)、工具(如搜索引擎、计算器)和工作流(如专用提示),使它们能够访问关键信息并执行任务。
可以把 MCP 理解为 AI 应用的"USB-C 接口",就像 USB-C 为电子设备提供标准化连接方式一样,MCP 为 AI 应用提供了一种标准化的方式来连接外部系统。
2. MCP 架构
MCP 采用客户端-服务器架构,其中:
- MCP Host:AI 应用程序,协调和管理一个或多个 MCP 客户端
- MCP Client:维护与 MCP 服务器连接的组件,并从 MCP 服务器获取上下文供 MCP Host 使用
- MCP Server:提供上下文给 MCP 客户端的程序
MCP 架构包含两个层次:
- 数据层:定义基于 JSON-RPC 的客户端-服务器通信协议,包括生命周期管理、核心原语(如工具、资源、提示)等
- 传输层:定义客户端和服务器之间数据交换的通信机制和通道,包括传输特定的连接建立、消息帧和授权
3. MCP 通信流程
MCP 通信遵循严格的生命周期管理,确保正确的功能协商和状态管理。整个通信过程分为三个阶段:
3.1 初始化阶段
初始化阶段是客户端和服务器之间的第一次交互,主要完成协议版本协商和功能能力交换。
初始化过程详细步骤:
- 客户端发送 initialize 请求,包含协议版本、客户端功能和支持的实现信息
- 服务器响应 initialize 请求,返回协议版本、服务器功能和支持的实现信息
- 客户端发送 initialized 通知,表示已准备好开始正常操作
3.2 操作阶段
在操作阶段,客户端和服务器根据协商的功能进行消息交换。
MCP 定义了三种核心原语,服务器可以暴露这些原语供客户端使用:
- 工具 (Tools):AI 应用可以调用的可执行函数(如文件操作、API 调用、数据库查询)
- 资源 (Resources):为 AI 应用提供上下文信息的数据源(如文件内容、数据库记录、API 响应)
- 提示 (Prompts):帮助构建与语言模型交互的可重用模板(如系统提示、少量示例)
3.3 关闭阶段
关闭阶段是一方(通常是客户端)正常终止协议连接的过程。
对于不同的传输机制,关闭方式有所不同:
- Stdio 传输:通过关闭输入/输出流来关闭连接
- HTTP 传输:通过关闭相关 HTTP 连接来关闭连接
4. MCP 核心原语详解
4.1 工具 (Tools) 原语
工具是 AI 应用可以调用的可执行函数,允许模型与外部系统交互。工具通常用于执行操作,如文件操作、API 调用或数据库查询。
示例:
{
"name": "get_weather",
"title": "Weather Information Provider",
"description": "Get current weather information for a location",
"inputSchema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City name or zip code"
}
},
"required": ["location"]
}
}
当 AI 模型需要获取天气信息时,它可以调用这个工具,传入位置参数,服务器会执行相应的操作并返回结果。
4.2 资源 (Resources) 原语
资源是为 AI 应用提供上下文信息的数据源。它们通常是只读的数据,可以是文件内容、数据库记录或 API 响应。资源通过 URI 进行唯一标识,客户端可以列出和读取这些资源。
示例:
{
"uri": "file:///project/src/main.py",
"name": "main.py",
"title": "Python Application Main File",
"description": "Primary application entry point",
"mimeType": "text/x-python"
}
当 AI 模型需要了解项目代码结构时,它可以请求读取这些资源,获取文件内容作为上下文信息。
资源的特点:
- 通过 URI 唯一标识
- 可以是文本或二进制数据
- 支持 MIME 类型标识
- 可以包含元数据(如最后修改时间、重要性等)
4.3 提示 (Prompts) 原语
提示是可重用的模板,有助于构建与语言模型的交互。它们通常由用户主动选择使用,可以是系统提示、少量示例或其他预定义的对话模板。
示例:
{
"name": "code_review",
"title": "Request Code Review",
"description": "Asks the LLM to analyze code quality and suggest improvements",
"arguments": [
{
"name": "code",
"description": "The code to review",
"required": true
}
]
}
当用户想要对代码进行审查时,可以选择这个提示模板,传入需要审查的代码,系统会生成一个结构化的请求发送给 AI 模型。
提示的特点:
- 由用户主动选择使用
- 可以包含参数占位符
- 支持多种内容类型(文本、图像、音频等)
- 可以嵌入资源内容
5. 传输机制
MCP 支持两种标准传输机制:
5.1 Stdio 传输
在 Stdio 传输中:
- 客户端将 MCP 服务器作为子进程启动
- 服务器从标准输入 (stdin) 读取 JSON-RPC 消息,并向标准输出 (stdout) 发送消息
- 消息通过换行符分隔,且不能包含嵌入的换行符
5.2 Streamable HTTP 传输
在 Streamable HTTP 传输中:
- 服务器作为独立进程运行,可以处理多个客户端连接
- 使用 HTTP POST 和 GET 请求进行通信
- 服务器可以使用服务器发送事件 (SSE) 来流式传输多个服务器消息
6. 工具调用示例
工具调用是 MCP 中最重要的功能之一,允许 AI 模型与外部系统交互:
7. 安全考虑
MCP 实现需要考虑以下安全问题:
-
服务器必须:
- 验证所有工具输入
- 实现适当的访问控制
- 限制工具调用频率
- 清理工具输出
-
客户端应该:
- 在敏感操作上提示用户确认
- 在调用服务器前向用户显示工具输入,避免恶意或意外的数据泄露
- 验证工具结果后再传递给 LLM
- 实现工具调用超时机制
- 记录工具使用情况用于审计
8. 错误处理
MCP 使用两种错误报告机制:
- 协议错误:标准 JSON-RPC 错误,用于处理未知工具、无效参数、服务器错误等问题
- 工具执行错误:在工具结果中使用 isError: true 标记,用于报告 API 失败、无效输入数据、业务逻辑错误等
9. 总结
MCP 通过标准化的协议为 AI 应用提供了一种强大的机制来访问外部系统和工具。其基于 JSON-RPC 的通信机制、严格的生命周期管理以及对多种传输方式的支持,使得 AI 应用可以安全、可靠地与各种外部资源进行交互。通过工具、资源和提示三种核心原语,MCP 为构建功能丰富的 AI 应用提供了坚实的基础。
工具、资源和提示这三种原语各有不同的用途和特点:
- 工具:由 AI 模型主动调用,用于执行操作
- 资源:由应用主动提供,作为上下文信息
- 提示:由用户主动选择,用于引导对话流程
这种设计使得 MCP 能够支持各种不同的使用场景,从简单的工具调用到复杂的上下文管理和对话流程控制。

浙公网安备 33010602011771号