取消

協議版本: 草案

模型上下文協議(MCP)通過通知消息支持對正在進行的請求的可選取消。雙方都可以發送取消通知,表明之前發出的請求應該終止。

取消流程

當一方想要取消正在進行的請求時,它會發送一個 notifications/cancelled 通知,其中包含:

  • 要取消的請求的 ID
  • 一個可選的原因字符串,可以被記錄或顯示
{
  "jsonrpc": "2.0",
  "method": "notifications/cancelled",
  "params": {
    "requestId": "123",
    "reason": "用戶請求取消"
  }
}

行為要求

  1. 取消通知必須只引用以下請求:
    • 之前在同一方向上發出的
    • 被認為仍在進行中的
  2. 客戶端不得取消 initialize 請求
  3. 取消通知的接收者應該
    • 停止處理被取消的請求
    • 釋放關聯的資源
    • 不為被取消的請求發送響應
  4. 接收者可以忽略取消通知,如果:
    • 引用的請求未知
    • 處理已經完成
    • 請求無法取消
  5. 取消通知的發送者應該忽略之後到達的對請求的任何響應

時間考慮

由於網絡延遲,取消通知可能在請求處理完成後到達,可能在響應已經發送之後。

雙方必須優雅地處理這些競爭條件:

  sequenceDiagram
   participant Client as 客戶端
   participant Server as 服務器

   Client->>Server: 請求 (ID: 123)
   Note over Server: 開始處理
   Client--)Server: notifications/cancelled (ID: 123)
   alt
      Note over Server: 處理可能在<br/>取消到達前<br/>已經完成
   else 如果未完成
      Note over Server: 停止處理
   end

實施說明

  • 雙方應該記錄取消原因以便調試
  • 應用程序界面應該指示何時請求取消

錯誤處理

無效的取消通知應該被忽略:

  • 未知的請求 ID
  • 已完成的請求
  • 格式錯誤的通知

這保持了通知的"發送即忘"性質,同時允許異步通信中的競爭條件。