> ## Documentation Index
> Fetch the complete documentation index at: https://mcp.developerdoc.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 取消

<div id="enable-section-numbers" />

Model Context Protocol (MCP) 支持通过通知消息对进行中的请求进行可选取消。
任一方都可以发送取消通知，表示应终止先前发出的请求。

## 取消流程

当一方想要取消进行中的请求时，会发送 `notifications/cancelled` 通知，其中包含：

* 要取消的请求 ID
* 可选的原因字符串，可用于记录日志或显示

```json theme={null}
{
  "jsonrpc": "2.0",
  "method": "notifications/cancelled",
  "params": {
    "requestId": "123",
    "reason": "User requested cancellation"
  }
}
```

## 特定于传输的取消

客户端如何发出取消信号取决于传输：

* **Streamable HTTP**：关闭 SSE 响应流就是取消信号。
  服务器 **MUST** 将客户端断开连接视为取消该请求。不需要也不期望 `notifications/cancelled` 消息。
* **stdio**：没有可关闭的按请求流。客户端 **MUST** 发送引用请求 ID 的
  `notifications/cancelled` 通知。

## 行为要求

1. 取消通知 **MUST** 只引用满足以下条件的请求：
   * 先前沿同一方向发出
   * 被认为仍在进行中
2. 取消通知的接收方 **SHOULD**：
   * 停止处理被取消的请求
   * 释放关联资源
   * 不为被取消的请求发送响应
3. 接收方在以下情况下 **MAY** 忽略取消通知：
   * 引用的请求未知
   * 处理已经完成
   * 请求无法取消
4. 取消通知的发送方 **SHOULD** 忽略之后到达的该请求任何响应

## 时序考量

由于网络延迟，取消通知可能在请求处理完成后到达，甚至可能在响应已经发送之后到达。

双方 **MUST** 优雅处理这些竞态条件：

```mermaid theme={null}
sequenceDiagram
   participant Client
   participant Server

   Client->>Server: Request (ID: 123)
   Note over Server: Processing starts
   Client--)Server: notifications/cancelled (ID: 123)
   alt
      Note over Server: Processing may have<br/>completed before<br/>cancellation arrives
   else If not completed
      Note over Server: Stop processing
   end
```

## 实现说明

* 双方 **SHOULD** 记录取消原因以便调试
* 应用 UI **SHOULD** 指示取消何时被请求

## 错误处理

无效的取消通知 **SHOULD** 被忽略：

* 未知请求 ID
* 已完成的请求
* 格式错误的通知

这保持了通知“发后即忘”的性质，同时允许异步通信中出现竞态条件。
