取消
協議版本: 草案
模型上下文協議(MCP)通過通知消息支持對正在進行的請求的可選取消。雙方都可以發送取消通知,表明之前發出的請求應該終止。
取消流程
當一方想要取消正在進行的請求時,它會發送一個 notifications/cancelled 通知,其中包含:
- 要取消的請求的 ID
- 一個可選的原因字符串,可以被記錄或顯示
{
"jsonrpc": "2.0",
"method": "notifications/cancelled",
"params": {
"requestId": "123",
"reason": "用戶請求取消"
}
}行為要求
- 取消通知必須只引用以下請求:
- 之前在同一方向上發出的
- 被認為仍在進行中的
- 客戶端不得取消
initialize請求 - 取消通知的接收者應該:
- 停止處理被取消的請求
- 釋放關聯的資源
- 不為被取消的請求發送響應
- 接收者可以忽略取消通知,如果:
- 引用的請求未知
- 處理已經完成
- 請求無法取消
- 取消通知的發送者應該忽略之後到達的對請求的任何響應
時間考慮
由於網絡延遲,取消通知可能在請求處理完成後到達,可能在響應已經發送之後。
雙方必須優雅地處理這些競爭條件:
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
- 已完成的請求
- 格式錯誤的通知
這保持了通知的"發送即忘"性質,同時允許異步通信中的競爭條件。