Model Context Protocol 介绍

深入了解 Model Context Protocol (MCP)

协议规范40 分钟阅读

协议概述

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/listtools/call

资源

为 AI 应用程序提供上下文信息的数据源

示例:

  • 文件内容和元数据
  • 数据库记录和模式
  • API 响应和文档
  • Git 仓库信息
  • 配置文件

可用方法:

resources/listresources/read

提示

帮助构建与语言模型交互的可重用模板

示例:

  • 特定任务的系统提示
  • 学习的少样本示例
  • 代码审查模板
  • 文档生成提示
  • 分析和摘要模板

可用方法:

prompts/listprompts/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 客户端和服务器之间的完整通信流程

1

初始化连接

客户端建立连接并与服务器协商能力

详细步骤:

  • 客户端发送带有协议版本的初始化请求
  • 服务器响应支持的能力
  • 双方协商通信参数
  • 使用约定的协议版本建立连接
2

能力发现

客户端发现可用的工具、资源和提示

详细步骤:

  • 请求可用工具列表 (tools/list)
  • 请求可用资源 (resources/list)
  • 请求可用提示 (prompts/list)
  • 缓存能力信息以便高效访问
3

上下文交换

客户端从资源请求并接收上下文数据

详细步骤:

  • 发送资源读取请求 (resources/read)
  • 接收各种格式的结构化数据
  • 根据需要处理数据格式转换
  • 使用接收到的信息更新本地上下文
4

工具执行

客户端调用服务器工具执行操作

详细步骤:

  • 构造工具调用请求 (tools/call)
  • 传递带有适当验证的必需参数
  • 等待服务器的执行结果
  • 处理返回的数据并处理错误
5

实时更新

通过通知维护同步

详细步骤:

  • 监听资源变化通知
  • 动态处理工具列表更新
  • 优雅地处理连接中断
  • 在需要时重新建立连接

安全特性

MCP 协议中的安全机制和保护措施

身份验证

支持多种身份验证机制

支持方法:

  • API 密钥身份验证
  • OAuth 2.0 流程
  • Bearer token
  • 自定义身份验证头

授权

细粒度的权限管理

支持方法:

  • 资源级权限
  • 操作类型限制
  • 基于时间的访问控制
  • 速率限制和配额

数据保护

端到端数据安全

支持方法:

  • TLS/SSL 传输加密
  • 消息内容加密
  • 敏感数据掩码
  • 安全密钥管理

审计和监控

全面的操作跟踪

支持方法:

  • 请求/响应日志记录
  • 权限检查记录
  • 错误和异常跟踪
  • 性能指标收集

开始使用

准备开始在 Gemini CLI 中使用 MCP?探索这些资源