shiichan

Cloudflare Agents SDK が MCP 新仕様に対応!Durable Object 無しでサーバーが作れるようになったよ!

やっほー、しぃちゃんだよ!

Cloudflare Changelog developers.cloudflare.com

今日は Cloudflare の Agents SDK に大きめのアップデートが来たから、さっそく紹介するね!

なにが発表されたの?

Cloudflare の Changelog によると、Agents SDK v0.20.0(2026 年 7 月 27 日リリース)で、MCP(Model Context Protocol)2026-07-28 リリース候補仕様のクライアント・サーバー両対応が入ったの。これによって Workers は MCP のトランスポートセッションや Durable Object を使わずに、ツール・プロンプト・リソース・elicitation を提供できるようになったよ。しかも Agents は MCP 2026-07-28 対応サーバーと、これまでの旧仕様(レガシー)サーバーの両方に接続できるの。

今までどうだったの?

これまで Workers 上で MCP サーバーを立てるときは、McpAgent を使って Durable Object でセッションを維持するのが基本のやり方だったの。サーバー側の createMcpHandler も v1 サーバーをそのまま受け取る形で、セッションを前提とした作りになっていたんだ。クライアント側も、接続先がどの世代の MCP プロトコルを話すか気にしながら設定する必要があったみたい。

これで何が変わるの?

一番の変化は、createMcpHandler がサーバーの「ファクトリ関数」を受け取れるようになったこと! リクエストごとに独立したサーバーインスタンスを作るから、Durable Object を用意しなくてもステートレスな MCP サーバーを Workers で動かせるの。

しかもこの agents/mcp/server エントリーは McpAgentWorkerTransport、MCP クライアントのトランスポート、SDK v1 のモジュールをステートレスサーバーのバンドルから締め出す作りになっていて、バンドルサイズも小さく済むよ。

加えて、同じ createMcpHandler(createServer)(request, env, ctx) の 1 ルートだけで、MCP 2026-07-28 対応クライアントと、ステートレスなリクエストを送ってくる旧仕様クライアントの両方をさばけるの。普通のツール・プロンプト・リソースなら、ルートやツール定義を新旧で分ける必要はないんだって。

深く潜ってみよう

クライアント側の仕組み

MCP クライアントマネージャーは @modelcontextprotocol/client を使うようになったの。接続ごとに server/discover で MCP 2026-07-28 対応かどうかを確認して、対応していなければ同じ接続のまま旧来の initialize ハンドシェイクにフォールバックするよ。既存の addMcpServer の呼び出し側は、プロトコルバージョンの設定や世代ごとのクライアント分けをしなくてよいみたい。

elicitation(追加入力の要求)は、ステートレスな通信では input_required を使ったマルチラウンドトリップリクエスト(MRTR)で行われるの。旧仕様の経路は、これまで通りのフォームと URL ハンドラーでプッシュされたリクエストを扱うよ。SDK が入力を集めて元の処理をリトライし、callToolgetPromptreadResource の Promise を最終結果で解決してくれるんだって。

OAuth のコールバックも v2 SDK 経由で issuer のメタデータを検証するようになったよ。ディスカバリーの状態や issuer に紐づく認証情報は、ブラウザのリダイレクトや Durable Object の休止(hibernation)をまたいでも保持されるの。

ステートレスサーバーの書き方

こんな感じでファクトリ関数を渡すだけでステートレスサーバーが作れるよ。

import { McpServer } from "@modelcontextprotocol/server";
import { createMcpHandler } from "agents/mcp/server";

function createServer() {
  return new McpServer({ name: "example", version: "1.0.0" });
}

export default {
  fetch(request, env, ctx) {
    return createMcpHandler(createServer)(request, env, ctx);
  },
};

Workers 向けのラッパーは、送られてきた Origin の検証や、信頼できる Origin ミドルウェアへの明示的な委譲、リクエスト処理や型付きの変更通知もサポートしているよ。

移行の仕方

既存の McpAgent サーバーがセッション付きの機能(プロトコルセッション・RPC・サーバーからのプッシュ・単独ストリーム・リプレイなど)に依存している場合は、ステートレスな経路をこれまでの経路と並べて動かせるの。isLegacyRequest() で旧仕様のトラフィックだけを既存ルートに振り分けられるよ。

import { isLegacyRequest } from "@modelcontextprotocol/server";
import { createMcpHandler } from "agents/mcp/server";
import { MyMcpAgent } from "./legacy-server";
import { createServer } from "./server";

const stateless = createMcpHandler(createServer, {
  route: "/mcp",
  legacy: "reject",
});
const legacy = MyMcpAgent.serve("/mcp");

export default {
  async fetch(request, env, ctx) {
    if (await isLegacyRequest(request)) {
      return legacy.fetch(request, env, ctx);
    }
    return stateless(request, env, ctx);
  },
};

残りのセッション付き機能を移行して、既存セッションを自然に終わらせたら、旧仕様ルートを削除する流れだよ。アップグレードは npm i agents@latest(yarn / pnpm / bun でも同様)でできるの。

v0.20.0 での非推奨

今回のリリースで非推奨になった API はこれだよ!

  • McpAgent — SDK v2 のファクトリと createMcpHandler に置き換え。機能凍結されていて、削除バージョンは未発表
  • createMcpHandler(v1Server, options) — サーバーを SDK v2 ファクトリに移して createMcpHandler(factory, options) を呼ぶ形に。次のメジャーバージョンでの削除が予定されている
  • MCPClientManager.callTool(params, resultSchema, options)withX402Client の対応オーバーロード — callTool(params, options)callTool(confirm, params, options) に置き換え。互換用のオーバーロードで、削除バージョンは未発表

ちなみに MCP 2026-07-28 の草案では、Roots・Sampling・Logging・従来の HTTP+SSE トランスポート・Dynamic Client Registration も別途非推奨になっているんだって。

まとめ

  • Agents SDK v0.20.0 が MCP 2026-07-28 リリース候補仕様のクライアント・サーバー両対応を追加
  • createMcpHandler がファクトリ関数を受け取れるようになり、Durable Object 無しのステートレス MCP サーバーが作れる
  • 同じルートで MCP 2026-07-28 クライアントと旧仕様クライアントの両方をさばける
  • McpAgent は機能凍結・非推奨に。セッション付き機能がある場合は isLegacyRequest() で新旧ルートを併走させながら移行できる

Workers で MCP サーバーを運用しているエンジニアさんや、これから軽量な MCP サーバーを立てたい人にとっては、要チェックのアップデートだよ!