MCP 赋能 Agent

MCP 全称是 Model Context Protocol(模型上下文协议),通过提供结构化的上下文管理来增强大模型与应用程序之间的交互。MCP 的核心目标很明确:让大模型安全、可控、结构化地访问外部信息和能力。

官方把 MCP 称为 AI 的 USB-C,可以把它理解为大模型的“通用接口”,也有点像 HTTP 协议。MCP 协议通过标准化模型与外部资源的交互方式,提升大模型应用的功能性、灵活性和可扩展性。

MCP

MCP 的核心是模型上下文,也就是大模型在运行过程中所需的所有外部信息和工具。MCP 通过定义标准化的接口和协议,使大模型能够动态访问和集成外部数据源、工具和服务、上下文管理。

架构

MCP 遵循 CS 架构:

  • 宿主:期望从服务器获取数据的 AI 应用。
  • 服务器:提供外部数据和工具,通过工具、资源和提示模板为大模型提供额外的上下文和功能。
  • 客户端:与服务器保持一对一的连接,负责消息路由、能力管理、协议协商和订阅管理等。

传输

MCP 使用 JSON-RPC 2.0 传输格式。传输层负责将 MCP 协议消息转换为 JSON-RPC 格式进行传输,并将接收到的 JSON-RPC 消息转换回 MCP 协议消息。

{
  jsonrpc: "2.0",
  id: number | string,
  method: string,
  params?: object
}

MCP 包含两种标准传输实现:

  • 标准输入/输出 (stdio):通过标准输入和输出流实现通信,如本地集成、命令行工具、脚本等。
  • 服务器发送事件 (SSE) :支持服务器到客户端的流式传输,同时使用 POST 请求实现客户端到服务器的通信。
  • 也可以自定义,只需要符合 Transport 接口即可。

客户端

客户端使用根(Roots)来告知服务器相关资源及位置。根定义了服务器操作边界,可以是任何有效的 URI。

{
  "roots": [
    {
      "uri": "https://api.example.com/v1",
      "name": "API 端点"
    }
  ]
}

客户端向服务器提供采样(Sampling)能力,服务器可以通过客户端请求大模型补全,从而实现复杂的代理行为,同时保持安全性和隐私性。客户端审查并可以修改服务器发送的补全请求,然后提交给大模型处理,再审查补全结果,最后发送给服务器,实现了 human-in-the-loop 确保用户能够控制大模型看到和生成的内容。

{
  messages: [
    {
      role: "user" | "assistant",
      content: {
        type: "text" | "image",
        text?: string,
        data?: string, //base64编码图片
        mimeType?: string
      }
    }
  ],
  modelPreferences?: {
    hints?: [{
      name?: string //建议的模型名称/系列
    }],
    ......
  },
  systemPrompt?: string,
  temperature?: number,
  maxTokens: number,
  ......
}

服务器

服务器向客户端提供工具,客户端可以调用这些工具,使得大模型可以与外部系统交互、获取数据、执行计算、采取行动。客户端可以随时列出可用工具,服务器也可以向客户端发送工具变更通知。

{
  name: string;        
  description?: string;  
  inputSchema: {        
    type: "object",
    properties: { ... }
  }
}

服务器向客户端提供资源,客户端可以读取数据或内容,然后给到大模型。资源可以是文件内容、数据库记录、图片或日志文件等,支持文本格式,二进制的资源使用 base64 进行编码。资源路径使用 URI 标识,格式为 [协议]://[主机]/[路径]

{
  uri: string;  
  name: string;        
  description?: string;  
  mimeType?: string; 
}

服务器向客户端提供提示词,定义可重用的提示词模板和工作流。客户端可以获取提示词后给到用户和大模型。服务器的提示词模板可以接受动态参数。

{
  name: string;              
  description?: string;      
  arguments?: [             
    {
      name: string;          
      description?: string;  
      required?: boolean;  
    }
  ]
}

与 Function Calling 的区别

维度 Function Calling MCP
标准化 各厂商私有实现 开放统一标准
集成 m 个模型 × n 个工具 = m×n 次开发 m 个模型 + n 个工具 = m+n 次实现
上下文 有限,依赖模型自身 支持动态上下文切换
传输协议 通常绑定 API 支持 stdio、HTTP、WebSocket 等
安全控制 依赖平台 双向验证、权限隔离
跨平台 厂商锁定 模型/工具可自由组合
资源访问 主要是函数调用 工具 + 资源 + 提示词

本站简介

聚焦于全栈技术和量化技术的技术博客,分享软件架构、前后端技术、量化技术、人工智能、大模型等相关文章总结。