

























@@ -0,0 +1,69 @@
1+import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2+import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
3+import { describe, expect, it } from "vitest";
4+import type { AnyAgentTool } from "../agents/tools/common.js";
5+import { createToolsMcpServer } from "./tools-stdio-server.js";
6+7+describe("plugin tools MCP cancellation", () => {
8+it("forwards host cancellation to tool.execute", async () => {
9+let resolveObservedSignal: (signal: AbortSignal | undefined) => void;
10+const observedSignal = new Promise<AbortSignal | undefined>((resolve) => {
11+resolveObservedSignal = resolve;
12+});
13+let abortObserved = false;
14+15+const tool = {
16+name: "probe_cancel",
17+description: "Probe cancellation forwarding",
18+parameters: { type: "object", properties: {} },
19+execute: async (_toolCallId: string, _params: unknown, signal?: AbortSignal) => {
20+resolveObservedSignal(signal);
21+await new Promise<void>((resolve, reject) => {
22+if (!signal) {
23+reject(new Error("tool.execute did not receive AbortSignal"));
24+return;
25+}
26+if (signal.aborted) {
27+abortObserved = true;
28+resolve();
29+return;
30+}
31+signal.addEventListener(
32+"abort",
33+() => {
34+abortObserved = true;
35+resolve();
36+},
37+{ once: true },
38+);
39+});
40+return { content: [{ type: "text", text: "done" }] };
41+},
42+} as unknown as AnyAgentTool;
43+44+const server = createToolsMcpServer({ name: "test", tools: [tool] });
45+const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
46+const client = new Client({ name: "test-client", version: "0.0.0" }, { capabilities: {} });
47+48+await Promise.all([server.connect(serverTransport), client.connect(clientTransport)]);
49+50+try {
51+const controller = new AbortController();
52+const callPromise = client.callTool({ name: "probe_cancel", arguments: {} }, undefined, {
53+signal: controller.signal,
54+});
55+const signal = await observedSignal;
56+57+expect(signal).toBeInstanceOf(AbortSignal);
58+expect(signal?.aborted).toBe(false);
59+60+controller.abort();
61+62+await expect(callPromise).rejects.toBeDefined();
63+expect(abortObserved).toBe(true);
64+} finally {
65+await client.close();
66+await server.close();
67+}
68+});
69+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。