Model Context Protocol 介绍
深入了解 Model Context Protocol (MCP)
协议概述
Model Context Protocol (MCP) 是一个开放标准,用于标准化应用程序向大型语言模型 (LLM) 提供上下文的方式。可以将 MCP 想象成 AI 应用程序的 USB-C 端口——提供标准化的方式将 AI 模型连接到不同的数据源和工具。
核心优势
- 标准化的通信接口
- 安全的数据传输
- 可扩展的架构设计
- 跨平台兼容性
- 实时上下文同步
- 基于插件的扩展支持
应用场景
- 代码分析和理解
- 文档生成和维护
- 项目管理集成
- 数据库查询和操作
- API 服务集成
- 工作流自动化
架构设计
MCP 协议分层架构和组件概述
MCP 主机
AI 应用程序
协调和管理一个或多个 MCP 客户端的 AI 应用程序
主要职责:
- 协调多个 MCP 客户端
- 管理 AI 模型交互
- 处理服务器响应
- 处理会话状态
MCP 客户端
连接管理器
维护与 MCP 服务器连接并为 MCP 主机获取上下文的组件
主要职责:
- 维护一对一服务器连接
- 发送上下文查询
- 处理服务器响应
- 管理连接生命周期
MCP 服务器
上下文提供者
通过工具、资源和提示向 MCP 客户端提供上下文的程序
主要职责:
- 接受客户端连接
- 处理上下文请求
- 返回结构化数据
- 维护资源状态
传输层
通信通道
管理客户端和服务器之间的通信通道和身份验证
主要职责:
- 本地进程的 STDIO 传输
- 远程服务器的 HTTP 传输
- 消息帧和序列化
- 身份验证和安全
数据层
协议定义
定义基于 JSON-RPC 的客户端-服务器通信协议
主要职责:
- JSON-RPC 2.0 消息格式
- 生命周期管理
- 原语定义(工具、资源、提示)
- 通知系统
MCP 原语
定义客户端和服务器可以相互提供的核心原语
工具
AI 应用程序可以调用来执行操作的可执行函数
示例:
- 文件操作(读取、写入、创建)
- 调用外部服务的 API
- 数据库查询和操作
- 代码分析和编译
- 系统命令执行
可用方法:
tools/list
tools/call
资源
为 AI 应用程序提供上下文信息的数据源
示例:
- 文件内容和元数据
- 数据库记录和模式
- API 响应和文档
- Git 仓库信息
- 配置文件
可用方法:
resources/list
resources/read
提示
帮助构建与语言模型交互的可重用模板
示例:
- 特定任务的系统提示
- 学习的少样本示例
- 代码审查模板
- 文档生成提示
- 分析和摘要模板
可用方法:
prompts/list
prompts/get
传输层
实现客户端和服务器之间数据交换的通信机制
STDIO 传输
使用标准输入/输出流进行直接进程通信
使用场景:
- 同一台机器上的本地 MCP 服务器
- 直接进程通信
- 无网络开销的最佳性能
- 简单的设置和配置
示例:
npx @modelcontextprotocol/server-filesystem /path/to/files
通过 STDIO 启动文件系统服务器
HTTP 传输
使用 HTTP POST 进行客户端到服务器的消息传递,可选择服务器发送事件
使用场景:
- 远程 MCP 服务器
- 基于云的服务
- 使用 bearer token 的身份验证
- 可扩展的服务器部署
示例:
https://api.example.com/mcp
通过 HTTP 连接到远程 MCP 服务器
消息类型
MCP 协议支持的基于 JSON-RPC 2.0 的消息类型
initialize
初始化连接并协商协议版本和能力
消息示例:
{ "method": "initialize", "params": { "protocolVersion": "2025-06-18", "capabilities": { "tools": {}, "resources": {} }, "clientInfo": { "name": "gemini-cli", "version": "1.0.0" } } }
tools/list
发现服务器上的可用工具
消息示例:
{ "method": "tools/list", "params": {} }
tools/call
使用提供的参数执行特定工具
消息示例:
{ "method": "tools/call", "params": { "name": "com.example.weather/current", "arguments": { "location": "San Francisco", "units": "imperial" } } }
resources/list
获取可用资源列表
消息示例:
{ "method": "resources/list", "params": {} }
resources/read
读取特定资源内容
消息示例:
{ "method": "resources/read", "params": { "uri": "file:///path/to/file.ts" } }
prompts/list
获取可用的提示模板
消息示例:
{ "method": "prompts/list", "params": {} }
notifications/tools/list_changed
当可用工具发生变化时通知客户端
消息示例:
{ "method": "notifications/tools/list_changed" }
工具定义示例
MCP 协议中工具定义方式的示例
天气工具定义
此示例展示了如何定义一个天气工具,包含适当的输入模式验证和文档。
// MCP 工具定义示例 { "name": "com.example.weather/current", "title": "获取当前天气", "description": "获取指定位置的当前天气信息", "inputSchema": { "type": "object", "properties": { "location": { "type": "string", "description": "要获取天气的位置" }, "units": { "type": "string", "enum": ["metric", "imperial"], "description": "温度单位", "default": "metric" }, "include_forecast": { "type": "boolean", "description": "是否包含预报数据", "default": false } }, "required": ["location"] } }
关键组件:
- name: 工具的唯一标识符
- title: 人类可读的显示名称
- description: 功能的详细说明
- inputSchema: 用于输入验证的 JSON Schema
最佳实践:
- 使用命名空间工具名称(例如,com.example.weather/current)
- 提供清晰、描述性的文档
- 定义全面的输入模式
- 在适当的地方包含默认值
通信流程
MCP 客户端和服务器之间的完整通信流程
初始化连接
客户端建立连接并与服务器协商能力
详细步骤:
- 客户端发送带有协议版本的初始化请求
- 服务器响应支持的能力
- 双方协商通信参数
- 使用约定的协议版本建立连接
能力发现
客户端发现可用的工具、资源和提示
详细步骤:
- 请求可用工具列表 (tools/list)
- 请求可用资源 (resources/list)
- 请求可用提示 (prompts/list)
- 缓存能力信息以便高效访问
上下文交换
客户端从资源请求并接收上下文数据
详细步骤:
- 发送资源读取请求 (resources/read)
- 接收各种格式的结构化数据
- 根据需要处理数据格式转换
- 使用接收到的信息更新本地上下文
工具执行
客户端调用服务器工具执行操作
详细步骤:
- 构造工具调用请求 (tools/call)
- 传递带有适当验证的必需参数
- 等待服务器的执行结果
- 处理返回的数据并处理错误
实时更新
通过通知维护同步
详细步骤:
- 监听资源变化通知
- 动态处理工具列表更新
- 优雅地处理连接中断
- 在需要时重新建立连接
安全特性
MCP 协议中的安全机制和保护措施
身份验证
支持多种身份验证机制
支持方法:
- API 密钥身份验证
- OAuth 2.0 流程
- Bearer token
- 自定义身份验证头
授权
细粒度的权限管理
支持方法:
- 资源级权限
- 操作类型限制
- 基于时间的访问控制
- 速率限制和配额
数据保护
端到端数据安全
支持方法:
- TLS/SSL 传输加密
- 消息内容加密
- 敏感数据掩码
- 安全密钥管理
审计和监控
全面的操作跟踪
支持方法:
- 请求/响应日志记录
- 权限检查记录
- 错误和异常跟踪
- 性能指标收集