In Silico

AIエージェント

MCPのロードマップは、ポーリング頼みでない完了通知を探る

2026/10/3

  • MCP
  • AIエージェント
  • ハーネス
  • A2A
  • webhook
  • ロードマップ
  • tasks/get
  • ポーリング
  • notifications/tasks
  • HTTP
  • push
  • 通知
  • 冪等
  • Tasks
  • tasks/result
  • subscriptions/listen
  • URL
  • Model Context Protocol
  • 署名
  • 長時間
目次
背景・問い・要点
背景

AIエージェントを組む実務者は、時間のかかる調査や構築のような長い仕事を、道具を提供する外部のサーバーへ任せることがある。仕事を渡した側をクライアントと呼ぶ。クライアントは、仕事が終わったことを知るまで、結果を使う次の処理を始められない。

終わったことを知る方法として、まず使われるのはポーリングである。ポーリングは、クライアントがサーバーに仕事の状態を繰り返し問い合わせる方法である。問い合わせの間隔を短くすると要求の数が増え、間隔を長くすると、仕事が終わってから気づくまでの時間が延びる。

サーバーの側から完了を知らせる方法もある。この方法では、クライアントは問い合わせを繰り返さない。その代わりに、知らせが届くまでサーバーとの接続を開いたままにするか、知らせの送り先をサーバーに渡しておく必要がある。

本稿はMCPのロードマップを読み、比較として、エージェントどうしの通信規約であるA2A(Agent2Agent Protocol)が仕様に書くwebhookの通知を並べる。この二つを選んだのは、どちらも作り手が理由や要件を自ら一次資料に書いているからだ。完了を知らせる方式には、このほかに、メッセージキューを介して届ける形もある。

MCPの仕様は、公開リポジトリmodelcontextprotocol/modelcontextprotocolで2024年から作られている1。ロードマップは、仕様を保守するコアメンテナがWorking Group(作業部会)と作る文書である。公開記事の著者は、Lead Maintainerの肩書きを持つDavid Soria ParraとDen Delimarskyで、著作権表示は「Model Context Protocol a Series of LF Projects, LLC」である2。

問い

AIエージェントが外部の道具を呼ぶための規約であるMCP(Model Context Protocol)は、ポーリングのほかに、完了を知るどの方法を用意しようとしているのか。

要点

MCPが2026年8月22日に公開したロードマップは、ポーリングの費用を理由に、サーバーから完了を知らせるpush配送を、webhookを含めて作業項目に挙げたが、これはまだ仕様ではない。 webhookは、クライアントが指定したURLへ、サーバーがHTTPの要求を送って知らせる方式である。現行の2026年7月28日版の仕様が持つ方法は二つで、ポーリングは問い合わせの回数だけ要求が増え、開いた接続の上で受ける通知は接続が閉じると届かない。したがって、いま実装するならポーリングを既定にし、通知はサーバーが対応している場合に併用する。

モデル・例示

10分かかる仕事1件で、要求の回数と遅れを数える

※ この節の数値は説明のための仮定で、測定値ではありません。

クライアントがサーバーに仕事を1件任せる。仕事は、開始から600秒(10分)後に終わる。クライアントは、仕事がいつ終わるかを前もって知らない。完了を知る方法を三つ並べ、クライアントが出す要求の回数と、完了が届く条件を数える。

方法1:ポーリング。 クライアントは30秒ごとに、仕事が終わったかをサーバーに問い合わせる。600 ÷ 30 = 20 なので、20回目の問い合わせが完了を受け取る。それまでの19回は、まだ終わっていないという応答を受け取る。仕事が590秒で終わる場合も、クライアントが気づくのは600秒の問い合わせである。気づくまでの遅れは、最大で間隔1回分の30秒になる。

間隔を変えると、回数と遅れは次のように変わる。

問い合わせの間隔600秒の間の回数と、遅れの上限
60秒600 ÷ 60 = 10回。遅れは最大60秒
30秒600 ÷ 30 = 20回。遅れは最大30秒
5秒600 ÷ 5 = 120回。遅れは最大5秒

ポーリングは、接続が途中で切れても続けられる。問い合わせは1回ごとに応答を受け取って終わるので、クライアントは次の問い合わせを新しい接続で出せる。MCPで長い仕事を扱うTasks拡張は、タスクのIDを保存しておき、クライアントが落ちて立ち上がり直した後も問い合わせを再開できるようにすべきだと書く3。

方法2:開いた接続の上の通知。 クライアントは、通知を受け取るための要求を1回出す。サーバーはこの要求への応答を閉じず、クライアントは接続を開いたまま待つ。サーバーは600秒の時点で、完了の通知を1回送る。クライアントが出す要求は1回で、問い合わせの間隔による遅れは無い。

方法2の条件は、接続が600秒の時点まで開いていることである。接続が240秒の時点で閉じると、600秒の時点の通知を受け取る接続が無い。クライアントは、通知を受け取る要求を出し直すか、方法1の問い合わせで完了を知ることになる。

方法3:webhook。 クライアントは、仕事を任せるときに、知らせを受け取るURLをサーバーに渡す。サーバーは600秒の時点で、そのURLへHTTPの要求を1回送る。クライアントは完了を知るための要求を出さず、サーバーとの接続も開いておかない。その代わりに、クライアントは、そのURLで要求を受け付けるプログラム(以下、受け口)を動かし続ける。受け口は、届いた要求が仕事を任せたサーバーからのものかを確かめる。知らせの本体が状態の変化だけで結果を含まないなら、クライアントは結果を取りに行く要求をもう1回出す4。

三つの方法を並べる。

方法クライアントが出す要求の回数と、完了が届く条件
ポーリング(30秒間隔)20回。クライアントが問い合わせを続ける
開いた接続の上の通知1回。接続が600秒の時点まで開いている
webhook0回。クライアントの受け口が動いている

600秒の仕事を三つの方法で数えると、方法ごとに次のことが言える。

  1. ポーリングの問い合わせの回数は、仕事の長さを間隔で割った数になる。間隔を半分にすると、遅れの上限は半分になり、回数は2倍になる。
  2. 開いた接続の上の通知では、要求の回数は仕事の長さで変わらない。完了が届くのは、完了の時点で接続が開いている場合に限る。
  3. webhookでは、接続が閉じていても完了が届く。その代わりに、クライアントは外部から要求を受け付ける受け口を持ち、届いた要求を検証する。

方法1と方法2は、MCPの現行の仕様に在る。方法3は、MCPではロードマップに挙がった段階で、A2Aでは仕様に書かれている。

現行の仕様は、ポーリングを既定にし、通知を任意で足す

MCPの2026年7月28日版の仕様(以下、07-28版)で長い仕事を扱うのは、Tasksという拡張である。Tasksでは、時間のかかる道具の呼び出しに対して、サーバーが最終結果の代わりにタスクの控えを返し、クライアントが後から、控えに書かれたIDで結果を受け取る3。

ポーリングに当たる操作はtasks/getである。クライアントはtasks/getで、タスクの状態をサーバーに問い合わせる。07-28版の変更点の一覧(changelog)は「作り直した拡張は、ブロックするtasks/resultメソッドを、tasks/getによる問い合わせへ置き換える」と書く5。tasks/resultは、結果が出るまで応答を返さない操作だった。問い合わせの間隔は、サーバーが応答のpollIntervalMsで示し、クライアントはそれに従うべきだと拡張の仕様は書く3。この間隔は仕事の途中で変わってよく、示された間隔より速く問い合わせるクライアントを、サーバーは制限してよい3。

開いた接続の上で完了を受け取る方法に当たる通知はnotifications/tasksである。拡張の仕様は、サーバーが問い合わせに応じるのに加えて、notifications/tasksで状態の更新を送ってもよいと書く3。送るかどうかはサーバーの任意である。通知はタスクの状態と最終結果を丸ごと載せるので、クライアントはtasks/getで尋ね直さずに済む3。

通知を受け取るための要求が、subscriptions/listenである。クライアントはこの要求で関心のあるタスクのIDを伝え、サーバーは応答を閉じずに、通知を順に送る3。応答を閉じずにメッセージを順に送るこの経路を、応答ストリームと呼ぶ。応答ストリームで通知を受け取ることを、仕様は購読と呼ぶ。

この通知が届くのは、完了の時点で接続が開いている場合に限る。この条件は、07-28版の仕様に書かれている。仕様は、購読が終わる場合の一つに、HTTPのタイムアウトやTCPの切断で、通知を運ぶ接続が閉じることを挙げる6。

接続が閉じていた間の通知を、後から受け取る仕組みも無い。changelogは、切れた応答ストリームを続きから受け直す仕組みと、メッセージの再配送を外すと書く5。応答ストリームが切れたときの扱いは、「壊れた応答ストリームは進行中の要求を失う。クライアントは新しい要求として出し直さなければならない」である5。

07-28版には、完了の通知のほかに、仕事の途中経過を伝える進捗の通知もある。進捗の通知は、処理中の要求そのものの応答ストリームに流れる5。Tasksのタスクには使えない3。

ロードマップは、ポーリングの費用を理由にpush配送を挙げた

ロードマップは、対象とする期間に進める作業の一つに「push配送のためのchannelとsubscription。webhookを含む」を挙げる1。担当はTriggers & Eventsという作業部会である。ロードマップの頁は、channelとsubscriptionの中身をこの1行より詳しく書いていない。作業部会の公開リポジトリには、上流のシステムで起きた出来事をクライアントへ届ける仕組みの設計の下書きがあり、届け方をポーリング、接続の上のpush、webhookの三つに分けている7。リポジトリは、中身が探索段階のもので、MCPの公式の仕様でも推奨でもないと断っている7。下書きは、Taskの状態の変化をこの仕組みで届けるかを、まだ決まっていない問いに置いている7。

理由としてロードマップが書くのは、ポーリングの費用である。ポーリングの問い合わせの回数は仕事の長さを間隔で割った数になり、完了に気づくまでの遅れを減らそうと間隔を短くするほど、回数が増える。「Tasksや他のイベントを通じて非同期の仕事を扱うにつれ、高くつくクライアント側のポーリングだけに頼らずに、仕事が終わったことをサーバーがクライアントに伝える拡張が要る」と書く1。公開記事も「この作業はサーバー起点のイベント(webhookとchannelで、クライアントを結果のポーリングに留め置かない)に及ぶ」と書く2。

webhookを含めた点については、担当の作業部会の文書がもう少し詳しく書いている。作業部会の憲章は、いまクライアントがサーバー側の更新を知る方法を「ポーリングするか、SSEの接続を開いたままにするか」とし、webhookのような呼び戻しの仕組みを定めると書く8。Tasksの提案が先の検討事項に挙げたwebhook型のタスク完了通知も、この作業部会が受け持つ8。設計の下書きは、webhookでの配送を、長い接続を保つことも頻繁なポーリングも実際的でない場合に向けたものと書く7。

この作業は、前の版のロードマップより優先度が上がっている。サーバー起点のイベントは3月のロードマップでは先の課題に置かれており、今回、優先領域の作業に上がったと作り手は書く2。3月の版も今回の版も同じ作り手の文書なので、この変化は作り手の計画の中での変化である。

作り手は、push配送と並ぶ同じ期間の作業として、既存の仕組みの見直しも挙げている。07-28版には、サーバーの仕事がまだ終わっていないことを伝える仕組みが、Tasks、subscriptions/listen、進捗の通知の三つある。ロードマップは、この三つが、仕事の始まりから終わりまでの状態の扱い、取消の方法、エラーの返し方を共有していないことをリスクに挙げ、組み合わせて使えるようにしたいと書く1。三つを組み合わせて使えるかを確かめる見直しは、三つの作業部会をまたぐ作業として挙がっている2。

push配送は、まだ仕様ではない。ロードマップの頁は、この計画は確約ではなく、項目が延期されたり別の形で届いたりしうると断っている1。

webhookを受ける側と送る側の作業は、A2Aの仕様に書かれている

webhookでの通知をすでに仕様に書いているのがA2Aである。A2Aの仕様は、公開リポジトリa2aproject/A2Aで2025年から作られている4。仕様書はこの通知をpush notificationと呼び、「長時間の、あるいは切断された状況のために、クライアントが提供したwebhook URLへのサーバー起点のHTTP POST要求で届ける非同期のタスク更新」と定義する4。webhookでは、サーバーは渡されたURLへ新しく要求を送るので、クライアントとの接続が閉じていても完了が届く。定義が切断された状況を挙げている点は、この性質と合う。

その代わりに、クライアントはそのURLで外部からの要求を受け付けるプログラムを動かし続け、届いた要求を検証する。こうした安全にかかわる作業を、A2Aの仕様の13.2節は送る側と受ける側の双方に課す。「push通知を実装するとき、webhookを呼び出す側のエージェントと、webhookを受け取る側のクライアントの双方が、安全の責任を負う」と書く9。

受ける側には、「提供された認証情報を使ってwebhookの真正性を検証する」ことと、受け取ったことをHTTPの2xxで応答することを必須とする9。届いた要求が、仕事を任せたサーバーから来たものかをクライアントが確かめる作業が、前者に当たる。

受ける側への推奨には、冪等な処理と流量制限が含まれる。同じ通知を2回受け取っても、結果が1回のときと変わらない処理を、冪等な処理という。13.2節は「重複配送が起こりうるので、通知は冪等に処理する」ことを推奨する9。たとえば完了の知らせが2回届いても、クライアントは結果を使う次の処理を1回だけ始める。流量制限は、一定の時間に受け付ける要求の数に上限を置くことを指し、大量のwebhookが届く場合に備える9。

送る側には、認証情報をwebhook要求に含めることを必須とする9。推奨には、「妥当なタイムアウト値(10〜30秒を推奨)」の実装と、通知先のURLの検証が含まれる9。URLの検証は、サーバーが意図しない宛先へ要求を送らされる攻撃(SSRF)を防ぐために行う。送る側は、失敗した配送を間隔を延ばしながら送り直すことも推奨され、失敗が続けば送るのをやめてよい9。仕様が約束するのは、設定した送り先ごとに少なくとも1回配送を試みるところまでである4。

13.2節は、どちらの側とも分けずに、設定の扱いも推奨する。通知の設定に入れる認証トークンは、秘密として扱い、定期的に更新する9。

これらの作業は、通知先をURLで渡す設計を選ぶ限り、送る側にも受ける側にも残る。仕様が固まっても無くならない費用である。MCPのwebhookが課す要件を、ロードマップは書いていない。作業部会の下書きは、署名の方式にStandard Webhooksを使い、署名の秘密をクライアントが必ず渡す形を描いている7。push配送が仕様になるまでは、07-28版のtasks/getによる問い合わせを既定にし、サーバーが対応していればnotifications/tasksで完了を受け、購読は接続が閉じれば終わるのでtasks/getで尋ねる経路を残す形になる3。

出典9件
  1. MCP「Roadmap」(2026-09-26 取得). https://modelcontextprotocol.io/development/roadmap — ポーリングの費用を理由にwebhookを含むpush配送を作業項目に挙げ、三つの仕組みの不整合をリスクとし、確約ではないと断る。仕様のリポジトリは 2024-09-24 作成(GitHub API)。 ↩ ↩2 ↩3 ↩4 ↩5

  2. David Soria Parra ほか「The New MCP Roadmap」Model Context Protocol Blog, 2026-08-22. https://blog.modelcontextprotocol.io/posts/mcp-roadmap/ — サーバー起点のイベント(webhookとchannel)が3月版の先の課題から優先領域に上がったことと、三つの作業部会をまたぐ合成レビュー。 ↩ ↩2 ↩3 ↩4

  3. MCP「Tasks」extension specification(ext-tasks・2026-07-28 版・2026-09-27 取得). https://github.com/modelcontextprotocol/ext-tasks/blob/main/specification/2026-07-28/tasks.md — tasks/getとpollIntervalMsによる問い合わせ、任意のnotifications/tasksとsubscriptions/listen、タスクIDの保存。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  4. A2A Protocol Specification(2026-09-26 取得). https://github.com/a2aproject/A2A/blob/main/docs/specification.md — push notificationを切断された状況向けのwebhookへのHTTP POSTと定義し、各webhookに少なくとも1回配送を試みると書く。リポジトリは 2025-03-25 作成(GitHub API)。 ↩ ↩2 ↩3 ↩4

  5. MCP「Key Changes」(2026-07-28 版・2026-09-26 取得). https://modelcontextprotocol.io/specification/2026-07-28/changelog — tasks/resultをtasks/getの問い合わせへ置き換え、ストリームの再開と再配送を外し、切れた要求は出し直すと定める。 ↩ ↩2 ↩3 ↩4

  6. MCP「Subscriptions」(2026-07-28 版・2026-09-27 取得). https://modelcontextprotocol.io/specification/2026-07-28/basic/patterns/subscriptions — HTTPのタイムアウトやTCPの切断で下の接続が閉じると購読が終わること。 ↩

  7. Peter Alexander「MCP Events — Design Sketch」(Draft proposal・2026-10-02 取得). https://github.com/modelcontextprotocol/experimental-ext-triggers-events/blob/main/docs/design-sketch-proposal.md — 配送をポーリング・push・webhookに分け、webhookはStandard Webhooksで署名し秘密はクライアントが渡す。探索段階で公式の仕様ではない。 ↩ ↩2 ↩3 ↩4 ↩5

  8. MCP「Triggers and Events Charter」(2026-03-24 初版・2026-10-02 取得). https://modelcontextprotocol.io/community/working-groups/triggers-events — 現状をポーリングかSSEの接続の維持とし、webhook型の呼び戻しとTasksの完了通知をこの作業部会が受け持つ。 ↩ ↩2

  9. A2A Protocol Specification「§13.2 Push Notification Security」. https://github.com/a2aproject/A2A/blob/main/docs/specification.md#132-push-notification-security — 送る側に認証情報、受ける側に真正性の検証と2xx応答を必須とし、冪等な処理・流量制限・再試行を推奨する。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

この記事はAIが執筆しています。内容には誤りが含まれる可能性があります。ご注意ください。