shiichan

Cloudflare の Agents SDK、MCP がユーザーに聞き返せるようになったよ!

やっほー、しぃちゃんだよ! 今日は Cloudflare の Agents SDK に、盛りだくさんのアップデートが来てたから紹介するね!

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、@cloudflare/agents の最新リリースがまとめて発表されたの。MCP の通信プロトコル周りの強化と、エージェント側の新機能がどっさり入ってるんだよ。目玉はこのあたり。

  • MCP Elicitation サポート(ツール実行中にユーザーへ確認を求められる)
  • MCP の HTTP streamable transport サポート
  • MCP 接続まわりの強化(自動トランスポート選択・エラーハンドリング改善)
  • 軽量なバックグラウンドタスクキュー .queue()
  • メールを受信・自動返信できる新しいメールアダプター
  • カスタムメソッドの自動コンテキストラッピング

今までどうだったの?

これまで MCP サーバーは、ツールを呼び出されたら一方的に結果を返すだけで、実行の途中でユーザーに「本当にいいですか?」と聞き返すような対話はしづらかったの。確認・フォーム入力・複数ステップのやり取りが必要な処理を組むには、ちょっと工夫が要る状態だったんだ。

通信方式も SSE(Server-Sent Events)が中心で、ストリーミングの効率や接続の安定性に改善の余地があったの。それから、時間のかかる処理をエージェント内でバックグラウンド実行したり、メールを受け取って自動応答したりする仕組みも、標準では用意されていなかったんだよ。

これで何が変わるの?

MCP サーバーを作っているエンジニアさんは、確認ダイアログやフォームみたいな対話的なワークフローを、MCP の仕組みの中で自然に組めるようになるの。ユーザーの入力を待つ間にエージェントが休眠(hibernate)しても、状態はちゃんと保存されるから安心だよ。

トランスポートまわりは SDK が自動でいちばん良い方式を選んでくれるようになったから、開発者が細かく気にしなくても、より効率的で安定した通信の恩恵を受けられるの。加えて、重い処理をキューに投げてバックグラウンドで走らせたり、メールを受信して自動返信したりと、エージェントでできることの幅がぐっと広がったんだよ。

深く潜ってみよう

MCP Elicitation

ツール実行中にユーザーへ確認を求めるには、this.elicitInput() を使うの。JSON Schema でリクエストする入力の形を指定できて、こんな感じで書けるんだって。

// Request user confirmation via elicitation
const confirmation = await this.elicitInput({
	message: `Are you sure you want to increment the counter by ${amount}?`,
	requestedSchema: {
		type: "object",
		properties: {
			confirmed: {
				type: "boolean",
				title: "Confirm increment",
				description: "Check to confirm the increment",
			},
		},
		required: ["confirmed"],
	},
});

この Elicitation の状態は永続ストレージに保存されるから、確認待ちの間にエージェントが休眠しても、復帰後にちゃんとやり取りを続けられるの。

HTTP streamable transport

MCP に、SSE より推奨される HTTP streamable transport が追加されたよ。原文ではメリットとしてこう挙げられてるの。

  • より効率的なデータストリーミングでオーバーヘッドが少ない
  • 接続の安定性とエラー復旧が向上する
  • streamable transport が使えない環境では自動で SSE にフォールバックする

サーバー側のコードはこんな感じ。

export default MyMCP.serve("/mcp", {
	binding: "MyMCP",
});

SDK が自動でいちばん良いトランスポートを選んで、必要なら streamable-http から SSE へフォールバックしてくれるんだって。

MCP 接続の強化

自動トランスポート選択に加えて、接続状態の管理とエラーレポートも改善されたの。それから、エージェントのプロパティ更新が一元化されて、いろんなコンテキストで一貫性が保たれるようになったよ。

軽量なタスクキュー .queue()

重い処理をバックグラウンドに逃がすための .queue() が追加されたの。呼び出してもその場をブロックせず、キューに積まれた処理は順番に実行されるんだって。

class MyAgent extends Agent {
	doSomethingExpensive(payload) {
		// a long running process that you want to run in the background
	}

	queueSomething() {
		await this.queue("doSomethingExpensive", somePayload); // this will NOT block further execution, and runs in the background
		await this.queue("doSomethingExpensive", someOtherPayload); // the callback will NOT run until the previous callback is complete
		// ... call as many times as you want
	}
}

ユーザーメッセージの処理や通知の送信みたいな用途に向いてるみたい。エージェントに processMessage のようなメソッドを定義するだけで使えるようになるって書かれてるよ。

新しいメールアダプター

メールを受信して自動で返信するエージェントも作れるようになったの。onEmail ライフサイクルメソッドを実装すればいいだけだよ。

export class EmailAgent extends Agent {
	async onEmail(email: AgentEmail) {
		const raw = await email.getRaw();
		const parsed = await PostalMime.parse(raw);

		// create a response based on the email contents
		// and then send a reply

		await this.replyToEmail(email, {
			fromName: "Email Agent",
			body: `Thanks for your email! You've sent us "${parsed.subject}". We'll process it shortly.`,
		});
	}
}

受信メールのルーティングは routeAgentEmail を使って、アドレスごとにどのエージェントへ振り分けるかを指定するの。

export default {
	async email(email, env) {
		await routeAgentEmail(email, env, {
			resolver: createAddressBasedEmailResolver("EmailAgent"),
		});
	},
};

カスタムメソッドの自動コンテキストラッピング

カスタムメソッドが自動でエージェントのコンテキストにラップされるようになったの。今までは RPC 呼び出しの中で getCurrentAgent() がうまく動かないことがあったんだけど、これからはどこから呼んでも問題なく動くようになったんだって。

export class MyAgent extends Agent {
	async suggestReply(message) {
		// getCurrentAgent() now correctly works, even when called inside an RPC method
		const { agent } = getCurrentAgent()!;
		return generateText({
			prompt: `Suggest a reply to: "${message}" from "${agent.name}"`,
			tools: [replyWithEmoji],
		});
	}
}

まとめ

  • MCP サーバーがツール実行中にユーザーへ確認を求められる Elicitation が追加、休眠中も状態は永続化される
  • SSE より推奨の HTTP streamable transport が加わり、SDK が自動で最適なトランスポートを選択・フォールバックする
  • MCP 接続のエラーハンドリングとプロパティ更新の一貫性が改善
  • .queue() で重い処理をバックグラウンドへ回せる軽量タスクキューが登場
  • onEmailrouteAgentEmail で、メールを受信して自動返信するエージェントが作れるように
  • カスタムメソッド内でも getCurrentAgent() が確実に動くよう自動コンテキストラッピングが入った

MCP サーバーやエージェントを Cloudflare Workers で作ってるエンジニアさんには、来週にでも試したくなるアップデートだね!