一、产生的原因

为了解决AI 应用(如豆包,元宝等)的模型能够访问外部工具和数据, 进行统一接口而产生的协议。

就比如我们使用某个AI编程工具(Trae)的模型进行对话,有时需要百度地图相关数据,或调用外部的excel工具,这时候就是通过MCP协议将模型与外部进行连接。
各自厂商有各式各样的AI模型,外部的工具和数据也是各式各样,为了能够统一这些不同的接口,MCP协议应运而生。


二、MCP基本概念

MCP(Model Context Protocol)模型上下文协议是Anthropic于2024年11月推出的开放标准协议,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议

MCP作为AI时代的通信标准协议,简单的讲就是制定了一套请求,响应的格式(JSON-RPC 2.0),以及一些通知。也可以类比代码中的接口, 具体的功能的实现各厂商自己去实现


三、MCP在AI应用程序,模型的位置

在这里插入图片描述

AI应用程序从所有连接的MCP服务器获取可用工具,并将其组合到语言模型可以访问的统一工具注册表中。这允许LLM了解它可以执行哪些操作,并在对话期间自动生成适当的工具调用。

阶段 关键操作 主要目的 通信消息
1. 初始化 (Initialization) 能力协商、协议版本确认 建立会话,确定双方能做什么 客户端发送 initialize 请求 → 服务器响应 → 客户端发送
2. 操作 (Operation) 工具调用、资源访问、提示获取 正常的业务交互 tools/list, tools/call, resources/list 等请求/响应和通知
3. 终止 (Shutdown) 关闭连接 结束会话 任何一方可以发起关闭

用户交互模型
工具是由模型控制的,这意味着AI模型可以自动发现和调用它们。然而,MCP强调通过多种机制进行人为监督。

为了信任和安全,应用程序可以通过各种机制实现用户控制
例如:工具在执行前可能需要用户同意,在UI中显示可用工具,使用户能够定义工具是否应在特定交互中可用
单个工具执行的审批对话框;预先批准某些安全操作的权限设置;显示所有工具执行及其结果的活动日志


四、MCP协议具体功能,及json格式

4.1 初始化(生命周期管理)

外部工具是由AI应用客户端(如豆包,元宝等)请求外部服务初始化的。 大模型只负责调用外部工具或数据。

AI应用客户端会管理、建立、配置MCP服务器的连接,并存储其功能以供大模型以后使用。应用程序使用此信息来确定哪些服务器可以提供特定类型的功能(工具、资源、提示),以及它们是否支持实时更新。

1.请求
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "elicitation": {}
    },
    "clientInfo": {
      "name": "example-client",
      "version": "1.0.0"
    }
  }
}
字段 含义
jsonrpc 表示JSON-RPC协议的版本,固定为"2.0"
id 含义请求的标识符,用于匹配请求和响应。这里是一个整数1,但也可以是字符串或null(对于通知)
method 要调用的方法,初始化的固定为"initialize"
params 调用方法时传递的参数,是一个对象。
params.protocolVersion 确保客户端和服务器都使用兼容的协议版本。这可以防止不同版本尝试交互时可能发生的通信错误。如果未协商相互兼容的版本,则应终止连接。
params.capabilities 声明支持的功能,包括他们可以处理哪些原语(工具、资源、提示)以及他们是否支持通知等功能。这通过避免不受支持的操作实现了高效的通信。
clientInfo 客户端的信息,是一个对象
clientInfo.name 客户端名称,例如"谷歌地图"
clientInfo.version 客户端版本,例如"1.0.0"
2.响应
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "tools": {
        "listChanged": true
      },
      "resources": {
        "subscribe": true
      },
      "prompts": {}
    },
    "serverInfo": {
      "name": "example-server",
      "version": "1.0.0"
    }
  }
}

字段 含义
jsonrpc 表示JSON-RPC协议的版本,固定为"2.0"
id 含义请求的标识符,用于匹配请求和响应。这里是一个整数1,但也可以是字符串或null(对于通知)
result 初始化响应的结果对象
result.protocolVersion 确保客户端和服务器都使用兼容的协议版本。这可以防止不同版本尝试交互时可能发生的通信错误。如果未协商相互兼容的版本,则应终止连接。
result.capabilities 允许各方声明他们支持哪些功能,包括他们可以处理哪些原语(工具、资源、提示)以及他们是否支持通知等功能。这通过避免不受支持的操作实现了高效的通信。
result.capabilities.tools 工具能力,如果支持则包含一个对象,其中可以包含listChanged等布尔属性(表示工具列表是否可变)以及其他属性。listChanged: true 表示工具列表可能会动态变化,客户端需要监听变化
result.capabilities.resources 资源能力,如果支持则包含一个对象,其中可以包含各种属性(如subscribe等)。subscribe:true 表示服务器是否支持客户端订阅资源的变化。
serverInfo.name 服务端名称,例如"谷歌地图"
serverInfo.version 服务端版本,例如"1.0.0"
3.初始化成功后,通知

当客户端初始化成功后,AI应用客户端(如豆包,元宝等)会外部服务发送一条通知,表示它已准备就绪。初始化在一个会话中只需要进行一次,需要重新初始化的情况,网络连接中断,会话恢复失败,主动重启

{
  "jsonrpc": "2.0",
  "method": "initialized",  // ← 这也是固定写法
}

在这里插入图片描述


4.2 工具发现

1.请求
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/list"
}

“method”: “tools/list”,请求外部服务列出可用的工具
“method”: “resources/list”,请求外部服务列出可用的资源

2.响应
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "tools": [
      {
        "name": "excel处理",
        "title": "excel处理标题",
        "description": "excel处理描述",
        "inputSchema": {
          "type": "object",
          "properties": {
            "expression": {
              "type": "string",
              "description": "expression参数描述"
            }
          },
          "required": ["expression"]
        }
      },
      {
        "name": "谷歌地图",
        "title": "谷歌地图标题",
        "description": "谷歌地图描述信息",
        "inputSchema": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "location参数描述"
            },
            "units": {
              "type": "string",
              "enum": ["metric", "imperial", "kelvin"],
              "description": "units参数描述",
              "default": "metric"
            }
          },
          "required": ["location"]
        }
      }
    ]
  }
}

响应包含一个result.tools的工具数组,该数组提供了每个工具相关数据。这种结构允许服务器同时公开多个工具。

字段 含义
name 服务器命名空间中工具的唯一标识符。这是工具执行的主键,应遵循明确的命名模式
title 客户端可以向用户显示的工具的可读显示名称
description 详细解释工具的功能以及何时使用
inputSchema 一种JSON模式,定义了调用工具时的输入参数,支持类型验证,并提供有关必需和可选参数的清晰文档
inputSchema.type 固定为"object",表示输入是一个对象。
inputSchema.properties 定义各个参数的属性
location 第一次参数名,不固定,根据工具不同而不同
type 参数的类型,值可能是string,number,array (额外参数:items),根据工具不同而不同
description 参数描述
enum 枚举值说明,是其他可能的约束
default 默认值,其他可能的约束
required 必填参数,值是json中声明的参数名如:location,expression

inputSchema 每个可能都不一样,根据工具的不同,可能会有不同的参数。

4.3 工具执行

1.请求
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "谷歌地图",
    "arguments": {
      "location": "Tokyo, Japan",
      "units": "metric"  // 这个参数可选,因为有默认值
    }
  }
}
字段 含义
method 值是"tools/call" , 调用工具声明
params 调用参数
name 工具具体方法的名称,必须与发现响应(tools/list)中的工具名称name完全匹配。
arguments 方法的参数对象
arguments.location 方法的参数对象,必须与发现响应(tools/list)中的工具名称name完全匹配。"location"值不固定,根据工具不同而不同
arguments.units 方法的参数对象,必须与发现响应(tools/list)中的inputSchema.properties完全匹配。"units"值不固定,根据工具不同而不同
2.响应
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Current "
      }
    ]
  }
}
表头 表头
name 必须与发现响应(weather_current)中的工具名称完全匹配。这确保了服务器能够正确识别要执行的工具。
arguments 包含由工具的inputSchema定义的输入参数
content 具响应返回一个内容对象数组,允许丰富的多格式响应(文本、图像、资源等)内容类型:每个内容对象都有一个类型字段。在这个例子中,“type”:“text”表示纯文本内容,但MCP支持不同用例的各种内容类型。
content.type 每个内容对象都有一个类型字段。在这个例子中,“type”:“text”表示纯文本内容,但MCP支持不同用例的各种内容类型。
content.text 实际的字符串数据。

工具调用返回结果中的字段没有在其他接口中预先声明, 只能通过工具的使用说明或文档来了解返回值的具体结构。

contentd对象中的输出key是动态的, MCP协议规定了Content类型的基本结构,它必须包含一个type字段,并且根据不同的类型,有不同的附加字段。例如,对于text类型,会有text字段;对于image类型,会有data和mimeType字段等。这些在协议规范中有定义。

当语言模型决定在对话中使用工具时,AI应用程序会拦截工具调用,将其路由到相应的MCP服务器,执行它,并将结果作为对话流的一部分返回给LLM。这使得LLM能够访问实时数据并在外部世界中执行操作。

3.错误响应

如果是一个错误响应,则不会包含result,而是包含error字段,例如:

{
  "jsonrpc": "2.0",
  "id": 3,
  "error": {
    "code": -32601,
    "message": "Method not found"
  }
}

4.4 实时更新(通知)

MCP支持实时通知,使服务器能够在没有明确请求的情况下通知客户端更改。这是保持MCP连接同步和响应的关键功能。
当服务器的可用工具发生变化时,例如当新功能可用、现有工具被修改或工具暂时不可用时,MCP服务器可以主动通知连接的客户端:

{
  "jsonrpc": "2.0",
  "method": "notifications/tools/list_changed"
}

MCP通知的主要特征
无需响应:通知中没有id字段。这遵循JSON-RPC 2.0通知语义,其中不期望或发送响应。
基于能力:此通知仅由在初始化期间在其工具能力中声明“listChanged”:true的服务器发送。
事件驱动:服务器根据内部状态变化决定何时发送通知,使MCP连接动态且响应迅速。

客户端对通知的响应
在收到此通知后,客户端通常会通过请求更新的工具列表来做出反应。它会刷新工具注册表并更新LLM的可用功能。

参考:https://modelcontextprotocol.io/docs/getting-started/intro


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐