分頁

協議版本: 2024-11-05

模型上下文協議(MCP)支持對可能返回大量結果集的列表操作進行分頁。分頁允許服務器以較小的塊而不是一次性返回所有結果。

分頁在通過互聯網連接到外部服務時尤為重要,但對於本地集成也很有用,可以避免大數據集帶來的性能問題。

分頁模型

MCP中的分頁使用不透明的基於遊標的方法,而不是編號頁面。

  • 遊標是一個不透明的字符串令牌,表示結果集中的位置
  • 頁面大小由服務器確定,並且可能不是固定的

響應格式

當服務器發送包含以下內容的響應時,分頁開始:

  • 當前頁面的結果
  • 如果存在更多結果,則包含可選的nextCursor字段
{
  "jsonrpc": "2.0",
  "id": "123",
  "result": {
    "resources": [...],
    "nextCursor": "eyJwYWdlIjogM30="
  }
}

請求格式

收到遊標後,客戶端可以通過發出包含該遊標的請求來_繼續_分頁:

{
  "jsonrpc": "2.0",
  "method": "resources/list",
  "params": {
    "cursor": "eyJwYWdlIjogMn0="
  }
}

分頁流程

  sequenceDiagram
    participant Client
    participant Server

    Client->>Server: 列表請求(無遊標)
    loop 分頁循環
      Server-->>Client: 結果頁面 + nextCursor
      Client->>Server: 列表請求(帶遊標)
    end

支持分頁的操作

以下MCP操作支持分頁:

  • resources/list - 列出可用資源
  • resources/templates/list - 列出資源模板
  • prompts/list - 列出可用提示
  • tools/list - 列出可用工具

實現指南

  1. 服務器應該

    • 提供穩定的遊標
    • 優雅地處理無效遊標
  2. 客戶端應該

    • 將缺失的nextCursor視為結果的結束
    • 支持分頁和非分頁流程
  3. 客戶端必須將遊標視為不透明令牌:

    • 不要對遊標格式做假設
    • 不要嘗試解析或修改遊標
    • 不要在會話之間持久化遊標

錯誤處理

無效遊標應該導致代碼為-32602(無效參數)的錯誤。