《MCP从0到1》第2课 通信消息类型、生命周期、与能力协商

0 阅读4分钟

MCP 定义了一种标准化的通信协议,使客户端和服务器能够以一致且可预测的方式交换消息。这种标准化对于社区内部的互操作性至关重要。

注:构建 MCP 服务器时无需掌握所有细节。本文探讨 MCP 协议通信的细节,可作为了解 MCP 运作方式的补充阅读。

1. 消息格式:JSON-RPC
MCP 协议使用 JSON-RPC 2.0 作为客户端和服务器之间所有通信的消息格式。JSON-RPC 是一种基于 JSON 编码的轻量级远程过程调用协议,具有以下特点:
易于阅读和调试
支持在任何编程环境中实现
规格清晰,应用广泛

2. 消息类型
MCP协议定义了三种类型的消息:请求(request)、回复(response)、通知(notification)
1

1)请求(Request)
由 Client 发给 Server,用于发起某个操作。请求消息包含以下字段:
一个唯一的标识符(id)

要调用的方法名(如 "tools/call")

方法所需的参数(params,如果有)

{
"jsonrpc":"2.0",
"id":1,
"method":"tools/call",
"params":{
          "name":"天气",
          "arguments":{
                  "location":"上海"
                }
          }
}

2)响应(Response)
由 Server 回复给 Client,用于响应前面发送的 Request。响应消息包含:

与对应 Request 相同的 id

要么是成功结果(result),要么是错误信息(error)

成功结果

{
"jsonrpc":"2.0",
"id":1,
"result":{
    "temperature":20,
    "conditions":"部分多云"
  }
}

错误信息

{
"jsonrpc": "2.0",
"id": 1,
"error": {
    "code": -32602,
    "message": "Invalid location parameter"
  }
}

3)通知(Notification)
通常由 Server 发送给 Client的单向消息,不需要响应。用于传递事件更新或进度通知等信息。

示例:

{
"jsonrpc":"2.0",
"method":"progress",
"params":{
          "message":"Processing data...",
          "percent":50
          }
}

3. 通信的生命周期
客户端和服务器的通信生命周期包含三个阶段:初始化(Initialisation)、交换消息(Message Exchange)、终止(Termination)
2

1)初始化(Initialisation)
Client 与 Server 建立连接,建立本本兼容性、交换和协商能力,分享实现的细节。
3

客户端发送初始化请求(initialize request),包含:协议版本、客户端功能、客户端实现信息。例如:

{
  "jsonrpc": "2.0",
  "id":1,
  "method":"initialize",
  "params": {
    "protocolVersion":"2025-03-26",
    "capabilities": {
      "roots": {
        "listChanged": true
      },
      "sampling": {}
    },
    "clientInfo": {
      "name":"ExampleClient",
      "version":"1.0.0"
    }
  }
}

服务器回复(initialize response)自身的协议版本和功能信息:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-03-26", 
    "capabilities": {
      "logging": {},
      "prompts": {
        "listChanged": true
      },
      "resources": {
        "subscribe": true,
        "listChanged": true
      },
      "tools": {
        "listChanged": true
      }
    },
    "serverInfo": {
      "name": "ExampleServer",
      "version": "1.0.0"
    },
    "instructions": "Optional instructions for the client"
  }
}

客户端发送初始化通知(initialized notification)作为确认,表示已经准备好开始正常消息交换(connection ready for use)

{
  "jsonrpc": "2.0",
  "method": "notifications/initialized"
}

2)交换消息(Message Exchange)
Client和Server之间进行正常的协议消息交换(请求、响应、通知等)。
客户端或服务端发送请求信息,另一方响应。这个过程可以针对每个工具、资源或提示类型重复进行。

3)终止(Termination)
在终止阶段,客户端通知服务器断开连接,服务器确认关闭请求。客户端发送退出后关闭连接。
4

4. 能力协商
Capability Negotiation
在初始化阶段,客户端和服务器明确声明其支持的功能,决定了在会话期间可用哪些功能。
服务器声明其功能,例如资源订阅、工具支持和提示模板
客户端声明支持采样和通知处理等能力
双方必须在整个会话期间尊重声明的功能
可以通过协议扩展来协商额外的功能

关键能力包括:
5

能力对象可以描述子能力,例如:

  • listChanged :支持列表变更通知(用于提示、资源和工具)
  • subscribe :支持订阅单个项目的变化(仅限资源)

以下是客户端和服务器之间能力协商的一个流程图:
6

每种能力都会在会话期间解锁特定的协议功能。例如:

  • 已实现的服务器功能必须在服务器的能力说明中进行宣传
  • 发出资源订阅通知需要服务器声明支持订阅
  • 工具调用需要服务器声明工具功能
  • 采样需要客户端在其功能中声明支持
    这种能力协商确保客户端和服务器对支持的功能有清晰的理解,同时保持协议的可扩展性。

掌握通信的消息类型和生命周期,将帮助你深入了解 MCP 的通信机制。

下一节,我们将进一步介绍 MCP 的三种通信机制,帮助你全面构建基于 MCP 的 AI 应用生态。

原文地址:https://www.cnblogs.com/mcpmarket/p/18963503