🦔
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 どちらでも問題なくキャンセルできました。
Discussion