🦔

MCP サーバーへのリクエストをキャンセルする

に公開

MCP サーバーへのリクエストをクライアント側からキャンセルする場合の
実装方法について残します。

前提

クライアント側の実装には TypeScript, @modelcontextprotocol/sdk を使用。

キャンセルのフロー

Model Context Protocol の公式ドキュメントのフロー図から
クライアント側はリクエストIDを保持して、
リクエストIDを使用して notification/cancelled
送信する必要があることがわかります。

実装方針

リクエスト ID を自前で保持して notifications/cancelled を送信しようとしていましたが
それらをよしなにやってくれる AbortController が存在することに気づきました。
今回 AbortController を使用して実装します。

実装例

AbortController の使い方はとても簡単です。
リクエストのオプションにインスタンスを渡してあげて
キャンセル時に abort() 関数を呼んであげるだけです。

リクエスト送信部分

abortController = new AbortController();
const result = await client.callTool(
    {
        name: 'example_tool',
        arguments: {
            param: "example param"
        },

    },
    CallToolResultSchema,
    { signal: abortController.signal, timeout: 120000 }
);

キャンセル処理部分

abortController.abort();

補足

  • @modelcontextprotocol/sdk: 1.21.0 を使用。
  • トランスポートは stdio, SEE どちらでも問題なくキャンセルできました。
Aprender Tech Blog

Discussion