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

# 取消

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

模型上下文协议（MCP）支持通过通知消息对正在进行中的请求进行可选取消。客户端**应该**发送取消通知，以表明它先前发出的某个请求应被终止。

当服务器拆除某个 `subscriptions/listen` 请求 ID 对应的订阅流时，**必须**发送引用该请求 ID 的 `notifications/cancelled`（请参见 [订阅][subscriptions]）。服务器**不得**出于任何其他目的发送 `notifications/cancelled`。

## 取消流程

当客户端想要取消正在进行中的请求时，它会发送一个 `notifications/cancelled` 通知，其中包含：

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

```json theme={null}
{
  "jsonrpc": "2.0",
  "method": "notifications/cancelled",
  "params": {
    "requestId": "123",
    "reason": "用户请求取消"
  }
}
```

## 特定于传输的取消

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

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

## 超时

实现**应该**为所有已发送的请求设置超时，以防止连接挂起和资源耗尽。当请求在超时时间内未收到成功或错误响应时，发送方**应该**取消该请求并停止等待响应。如[特定于传输的取消](#transport-specific-cancellation)所述，这意味着：

* **Streamable HTTP**：关闭该请求的响应流，这就构成了取消。
* **stdio**：发送一个引用该请求 ID 的 `notifications/cancelled` 通知。

SDK 和其他中间件**应该**允许按请求粒度配置这些超时。

实现**可以**在收到与该请求对应的[进度通知](/specification/draft/basic/patterns/progress)时重置超时计时，因为这意味着工作确实正在进行中。不过，无论是否收到进度通知，实现**应该**始终强制执行一个最大超时，以限制有异常行为的客户端或服务器所造成的影响。

## 行为要求

1. 取消通知**必须**仅引用以下请求：
   * 之前由客户端发出的请求
   * 被认为仍在进行中的请求
2. 服务器发送的取消通知**必须**引用一个 `subscriptions/listen` 请求，以终止该订阅流
3. 接收到取消通知的服务器**应该**：
   * 停止处理已取消的请求
   * 释放相关资源
   * 不要为已取消的请求发送响应
4. 服务器**可以**忽略取消通知，如果：
   * 所引用的请求未知
   * 处理已经完成
   * 该请求无法取消
5. 客户端**应该**忽略之后到达的任何针对已取消请求的响应

## 时序考虑

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

双方**必须**妥善处理这些竞态条件：

```mermaid theme={null}
sequenceDiagram
   participant 客户端
   participant 服务器

   客户端->>服务器：请求 (ID: 123)
   Note over 服务器：处理开始
   客户端--) 服务器：notifications/cancelled (ID: 123)
   alt
      Note over 服务器：处理可能已在<br/>取消到达前<br/>完成
   else 如果未完成
      Note over 服务器：停止处理
   end
```

## 实现说明

* 双方**应该**记录取消原因以便调试
* 应用程序 UI **应该**在请求取消时予以指示

## 错误处理

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

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

这保留了通知“发出即忘记”的特性，同时允许异步通信中的竞态条件。

[subscriptions]: /specification/draft/basic/patterns/subscriptions
