Search the alley

記事を検索

2文字以上でタイトル・カテゴリ・タグを検索できます。

MCP Tasksとは?tasks/get・update・cancelと旧API移行の確認順

MCP Tasks extensionを、長時間処理、durable task handle、tasks/get・tasks/update・tasks/cancel、input_required、旧experimental APIからの移行、安全なTask ID管理まで整理します。

公開 2026.08.09 / 更新 2026.08.09

この記事のポイント

  • Tasksは、長時間のtools/callをblockせず、serverがdurableなtask handleを返すopt-in extension
  • clientはtasks/getで状態と結果を取得し、input_requiredならtasks/update、停止要求はtasks/cancelで伝える
  • serverはclient capabilityを確認してからtaskを作り、CreateTaskResultを返す前にTask Storeへ永続化する
  • 2025-11-25系のexperimental Tasks APIとはwire互換ではなく、tasks/listや旧task/resultの扱いを移行前に確認する

結論:Tasksは長い処理を待つ仕組みではなく、状態を後から取りに行く仕組み

MCP Tasks extensionは、serverが時間のかかる処理を開始したとき、最終結果が出るまで接続を占有する代わりに、durableなtask handleをclientへ返すための仕組みです。clientはtaskIdを使って状態をpollし、完了後の結果を取得します。切断や再起動が起きてもtaskIdで再開できるため、CI pipeline、batch処理、外部job、human approvalを含む長いworkflowに向きます。

重要なのは、clientがTasksを知っているだけでは足りないことです。clientはrequest単位のcapabilityでextensionへの対応を示し、serverもserver/discoverで対応を示します。両端が対応している場合でも、毎回taskになるとは限らず、taskを作るかはserverがrequestごとに判断します。

観点Tasks extension通常のtool call
返すものtask handleと初期状態を含むCreateTaskResultになり得る処理結果を含む通常のCallToolResult
接続長時間処理中もclientが接続を保持する必要はない処理が終わるまで待つ設計になりやすい
進捗tasks/get、状態、statusMessage、poll間隔で追跡する通常のレスポンスや別の進捗設計に依存する
途中入力input_requiredからtasks/updateで回答する別の対話フローを設計する
向く仕事CI、batch、approval、外部job、切断しやすい処理短時間で完了し、再取得が不要な処理

Tasksが向く5つの検索意図・実装シナリオ

  • CI/CDやbatch処理:数分から数時間かかるjobを、workerとclientの接続時間から切り離す
  • human-in-the-loop:承認や不足情報で停止し、input_requiredとしてclientへ戻す
  • 外部job system:cloud deploymentやqueued APIが返すjob IDをMCP taskへ対応させる
  • 不安定な通信:mobileやintermittent networkで切断しても、taskIdから再開する
  • 大量処理:部分的な進捗、statusMessage、TTL、最終result/errorを追跡する

逆に、短い読み取り、失敗時に再実行すれば済む処理、taskの永続化や認可を管理できない小さな処理では、通常のtool callの方が単純です。Tasksを入れること自体が信頼性を保証するわけではなく、task store、worker、認証、期限、再試行の設計が必要になります。

最初に読む構成:client・server・Task Store・worker

担当最低限の責務止めずに確認すること
clientcapability宣言、結果形状の判定、poll、途中入力、再起動後の再開taskIdを保存し、権限を確認してget/update/cancelを送る
serverrequestごとのtask作成判断、状態更新、最終result/errorの返却未対応clientへtaskを返さず、client capabilityを確認する
Task StoretaskIdから状態を取得できるdurableな保存CreateTaskResultを返す前に読み出せる状態にする
worker実処理、進捗、入力待ち、成功・失敗・取消の更新再実行時の重複処理、外部side effect、期限切れを管理する
host・運用者UI表示、承認、ログ、監査、停止条件inputRequestsを未確認のまま自動承認しない

capability negotiation:serverが勝手にtaskを返さない

Tasksの識別子は、client側のio.modelcontextprotocol/clientCapabilities.extensionsに入ります。server側はserver/discoverのcapabilities.extensionsで対応を示します。公式ガイドの要点は、clientがextensionを宣言していないときに、serverがCreateTaskResultを返さないことです。通常結果を返すか、処理に必須ならcapability errorとして扱います。

{
  "io.modelcontextprotocol/clientCapabilities": {
    "extensions": {
      "io.modelcontextprotocol/tasks": {}
    }
  }
}

実装時は、上の識別子を知っていること、capabilityをrequestへ正しく入れること、serverがserver/discoverで宣言すること、対応なしの場合のfallbackを分けてテストします。対応宣言を見ずにtask前提でpollを始めると、通常resultとの判定を誤ります。

結果はpolymorphic:通常resultとtask resultの両方を受ける

Tasks対応clientは、tools/callの結果が常にtaskになると決めつけません。serverが短いと判断したrequestでは通常のresultを返し、長いと判断したrequestではresultTypeがtaskのCreateTaskResultを返します。clientはまず結果の形を確認し、taskならtaskId、初期status、ttlMs、pollIntervalMsを保存してから次の処理へ進めます。

確認項目意味実装上の注意
resultType: task最終結果ではなくtask handleが返った通常resultのschemaと分岐する
taskId後続のget/update/cancelで使う識別子推測困難にし、ログやURLへ無制限に出さない
ttlMstask状態を保持できる目安期限切れ後の再取得と再実行を分ける
pollIntervalMs次のtasks/getまでの推奨間隔固定間隔で過剰pollしない
statusMessage現在の状態を人へ説明する補助情報内容を信頼境界の外から来た入力として扱う

タスクのライフサイクル:workingからterminal statusまで

status意味clientの確認
workingworkerが処理中poll間隔とTTLを守り、同じtaskIdを使う
input_requiredserverからの入力を待っているinputRequestsを表示し、ユーザーやモデルの回答を検証する
completed処理が完了しresultを返せるresultを一度だけ取り込み、外部side effectを重複適用しない
failed処理が失敗しerrorを返す再試行可能性、外部状態、認証期限を分ける
cancelled取消状態へ遷移した取消が常に即時停止を意味しないことを表示する

completed、failed、cancelledはterminal statusです。input_requiredではtasks/getのinputRequestsを読み、tasks/updateで回答します。tasks/cancelは取消の意思を伝える操作であり、serverが受け付けてもworkerが即時に止まるとは限りません。決済、deploy、削除など取り消せないside effectをtaskへ入れる場合は、実行前の承認、idempotency、rollback、期限を別に設計します。

旧experimental Tasks APIからの移行:名前だけ変えない

MCP 2025-11-25系で実験的に使われたTasksの機能と、2026-07-28系のTasks extensionはwire互換ではありません。旧clientが動くから新extensionも動く、またはtasksという名前が同じだから置換できる、と判断しないでください。公式のSEP-2663では、旧tasks/result、task parameter、legacy tasks.requests.*、tasks/listやcancelのcapability表現を新extensionの前提から分けています。

移行点旧experimental APIの確認新Tasks extensionでの確認
宣言初期化時のlegacy tasks capabilityrequest metadataのextensionsにio.modelcontextprotocol/tasks
結果取得旧tasks/resultに依存していないかtasks/getで状態とterminal result/errorを取得
作成判断request側のtask parameterに依存していないかclientは対応を宣言し、serverがrequestごとにtask化を判断
列挙tasks/listを前提にしていないかtaskIdを権限付きで保存し、列挙しない設計へ寄せる
SDK旧versionのTasks APIを呼んでいないか2026-07-28以降のextension実装とserver/clientを組み合わせる

Task IDと入力待ちの安全設計

  • taskIdを連番や推測しやすい値にせず、別ユーザーのtaskをgetできない認可を毎回確認する
  • 新Tasks extensionではtasks/listによる全task列挙を前提にせず、所有者・tenant・jobの境界をTask Store側で持つ
  • inputRequestsはserverから届くelicitationやsamplingの内容なので、表示・承認・自動回答を分離する
  • tasks/updateで回答したあとも、同じ回答を再送してside effectが重複しないか確認する
  • TTL、削除、監査ログ、失敗時のerrorを決め、taskIdやstatusMessageへ機密情報を入れない
  • tasks/cancelのackだけを成功とみなさず、実際のworker停止と外部side effectの状態を確認する

client・server別の導入チェックリスト

立場導入前に確認すること失敗したときの止め方
clientcapability、通常resultとの分岐、poll、input_required、再起動復帰未対応なら通常resultへ戻し、task前提で処理しない
serverserver/discover、client capability、durable store、TTL、terminal state宣言なしclientへCreateTaskResultを返さない
worker重複実行、retry、外部job、cancel、失敗時のcleanup認証・権限・状態が不明なら新しいside effectを開始しない
運用監査、アラート、保持期間、手動停止、復旧手順taskIdだけで本人確認せず、所有者と対象resourceを照合する

よくある誤解

誤解実際の読み方
Tasksを宣言すれば毎回非同期になるserverがrequestごとにtask化を判断し、通常resultも返り得る
taskIdを持っていれば誰でもgetできるtaskIdは認可されたclientだけが使える識別子として扱う
cancelの応答が返れば処理は必ず止まった取消はcooperativeで、非cancelledのterminal statusへ到達することもある
input_requiredは自動で承認してよい入力内容と外部side effectを確認し、ユーザー承認の境界を残す
2025-11-25のTasksを名前だけ置換すればよいwire非互換のため、capability・method・結果形状・SDKを一緒に検証する

導入前の最小チェックリスト

  • 長時間化する理由があり、通常の短いtool callよりTasksの再取得が役に立つ処理を選んだ
  • client capabilityとserver/discoverのextension宣言を確認した
  • 通常resultとCreateTaskResultを分け、taskId・TTL・pollIntervalを保存できる
  • Task StoreがCreateTaskResultの返却前に状態を読めるようになっている
  • working・input_required・completed・failed・cancelledを表示と監査へ反映できる
  • 切断・再起動・期限切れ・二重poll・二重update・二重side effectをテストした
  • 旧experimental APIのtasks/result、task parameter、tasks/listへの依存を洗い出した
  • taskId、inputRequests、statusMessage、errorにsecretや個人情報を残さない設計にした

MCP TasksのFAQ

MCP Tasksは何を解決しますか?

長いtool callを接続待ちにせず、serverがdurableなtask handleを返し、clientがtasks/getで状態と最終結果を取得する仕組みです。CI、batch、approval、外部job、不安定な接続が候補です。

Tasksを宣言したらserverは必ずtaskを返しますか?

必ずではありません。clientはextension対応を宣言しますが、serverがrequestごとにtask化を判断します。通常のresultとCreateTaskResultの両方を処理できるclientが必要です。

input_requiredでは何をしますか?

tasks/getでinputRequestsを読み、必要な承認や入力をユーザーまたはモデルへ提示し、検証した回答をtasks/updateで返します。自動承認や未確認の内容の転送は避けます。

tasks/cancelで処理は完全に止まりますか?

完全停止とは限りません。cancelはcooperativeな取消要求で、serverはackを返してもworkerや外部jobがすぐ止まらない場合があります。実際の状態と外部side effectを別に確認します。

2025-11-25のTasks APIからすぐ移行できますか?

wire互換ではないため、すぐ置き換えられるとは限りません。legacy capability、tasks/result、task parameter、tasks/listへの依存と、client・server・SDKのversionを洗い出してから移行します。

Task IDはURLやログに出しても安全ですか?

Task IDが状態の参照権限を兼ねる設計では、推測困難性や認可が重要です。URLや広いログへ露出させず、所有者・tenant・resourceを照合し、TTLと保持期間も設計します。

まとめ:Tasksは非同期化より、状態・権限・停止条件の明示が本体

MCP Tasks extensionは、長時間処理をtaskIdへ分け、clientが状態・途中入力・最終結果を再取得するための設計です。導入では、capability negotiation、通常resultとの分岐、Task Store、TTL、input_required、cooperative cancel、Task ID認可を一つの表で確認します。2025-11-25系のexperimental APIとは互換性がないため、read-onlyの小さな処理から旧client・新server・SDKの組み合わせを検証し、外部side effectを伴う自動化は最後に広げてください。

関連記事