取消
協議版本: 2024-11-05
模型上下文協議(MCP)通過通知消息支持可選的進行中請求取消。任何一方都可以發送取消通知,表明先前發出的請求應該終止。
取消流程
當一方想要取消進行中的請求時,它發送一個包含以下內容的 notifications/cancelled 通知:
- 要取消的請求的 ID
- 可以記錄或顯示的可選原因字符串
{
"jsonrpc": "2.0",
"method": "notifications/cancelled",
"params": {
"requestId": "123",
"reason": "用戶請求取消"
}
}行為要求
- 取消通知必須只引用以下請求:
- 先前在同一方向上發出的
- 被認為仍在進行中的
- 客戶端不得取消
initialize請求 - 取消通知的接收者應該:
- 停止處理被取消的請求
- 釋放相關資源
- 不為被取消的請求發送響應
- 接收者可以在以下情況下忽略取消通知:
- 引用的請求未知
- 處理已經完成
- 請求無法取消
- 取消通知的發送者應該忽略之後到達的對該請求的任何響應
時間考慮
由於網絡延遲,取消通知可能在請求處理完成後到達,甚至可能在響應已經發送後到達。
雙方必須優雅地處理這些競爭條件:
sequenceDiagram
participant Client
participant Server
Client->>Server: 請求 (ID: 123)
Note over Server: 開始處理
Client--)Server: notifications/cancelled (ID: 123)
alt
Note over Server: 處理可能在<br/>取消到達前<br/>已完成
else 如果未完成
Note over Server: 停止處理
end
實現注意事項
- 雙方應該記錄取消原因以便調試
- 應用程序 UI 應該指示何時請求取消
錯誤處理
無效的取消通知應該被忽略:
- 未知的請求 ID
- 已完成的請求
- 格式錯誤的通知
這保持了通知的"發送後忘記"性質,同時允許異步通信中的競爭條件。