# Cloudflare Agents SDK、MCP スキーマ変換の無駄を解消！Code Mode の直接呼び出しにも対応

こんにちは、しぃちゃんだよ！今日は Cloudflare の Agents SDK まわりで、地味だけどエンジニアにはうれしい改善が発表されたから紹介するね。

## なにが発表されたの？

Cloudflare の Changelog で、Agents SDK と、その上で動く `@cloudflare/think`・`@cloudflare/codemode` に関するアップデートが発表されたよ。ポイントはこの3つだよ。

- MCP の JSON Schema 変換を使い回して、モデルのターンごとの無駄な再変換を減らした
- `@cloudflare/think` に `includeMcpTools` が追加されて、Think が自動でやっていた MCP ツールの公開をオフにできるようになった
- `@cloudflare/codemode` の耐久ランタイムに `execute()`・`search()`・`describe()` が直接生えて、AI SDK を使わないホストからも呼び出せるようになった

## 今までどうだったの？

今まで Agents SDK の MCP クライアントは、モデルが1ターン話すたびに、接続している MCP サーバーの JSON Schema を毎回 Zod スキーマに変換し直していたの。接続が生きていてツールカタログが変わっていなくても、律儀に変換をやり直していたんだね。

さらに `@cloudflare/think` は、MCP に接続すると自動で `getAITools()` を呼んで、つながっている MCP ツールをぜんぶ丸ごと公開する仕組みだったの。でも Code Mode 経由でツールを公開している場合や、別の仕組みでツールを出している場合には、この自動公開が二重になっちゃう場合があって、オフにする手段がなかったんだよ。

Code Mode の耐久ランタイムも、基本的には AI SDK のツールとして「アダプトする」ことが前提の作りだったから、AI SDK を使わない MCP サーバーや他のホストが直接コードを実行したり、コネクタのメソッドを調べたりするのは簡単じゃなかったの。

## これで何が変わるの？

今回のアップデートで、こんな嬉しい変化があるよ。

- モデルのターンが増えても MCP のスキーマ変換コストが積み上がらなくなる(ツールカタログが同じ接続が生きている間はキャッシュされる)
- Think がすべてを自動公開する挙動が煩わしいときに、`includeMcpTools = false` で自分でコントロールできるようになる
- Code Mode の耐久ランタイムを、AI SDK のツールに変換しなくても MCP サーバーや他のホストから直接叩けるようになる

つまり、AI SDK まわりの薄いラッパーを自分で書かなくても、MCP と Code Mode のいいとこ取りがしやすくなった、というアップデートなの。

## 深く潜ってみよう

まず MCP スキーマ変換の改善から。Agents SDK の MCP クライアントは、入力・出力それぞれの変換済みスキーマを、ライブ接続がツールカタログを維持している間は再利用するようになったよ。今までのように「モデルのターンごとに MCP の JSON Schema を Zod に総変換」というムダな処理を避けられるの。

次に `@cloudflare/think` の `includeMcpTools`。これを `false` に設定すると、Think が自動でやっていた `getAITools()` の呼び出しがスキップされるよ。例えばこんな感じだよ。

```ts
includeMcpTools = false;
waitForMcpConnections = true;
```

Code Mode 経由や別の仕組みで MCP ツールをすでに公開しているときに、この設定でぶつからないようにできるんだね。ただし `false` にしても、MCP のツール登録・接続の復元・ディスカバリー・生のカタログへのアクセス・直接呼び出し・Code Mode のコネクタとの連携そのものは引き続き動くよ。生の MCP カタログが欲しいときは `listTools()` を使えばいいの。

そして `@cloudflare/codemode@latest` の耐久ランタイムハンドルに追加された `execute()`・`search()`・`describe()`。これで MCP サーバーや他のホストが、ランタイムを AI SDK のツールに合わせて作り変えなくても、直接コードを実行したりコネクタのメソッドを探索したりできるようになるよ。使い方のイメージはこんな感じ。

```ts
const matches = await runtime.search("create issue");
const docs = await runtime.describe(matches.results[0].path);
const outcome = await runtime.execute({
  code: `async () => github.create_issue({ title: "Bug" })`
});
```

また、`search()` や `describe()` の結果には、承認が必要なメソッドに `requiresApproval: true` の印が付くようになっていて、実行を一時停止したうえで既存の `approve()`・`reject()` メソッドで解決できる仕組みも用意されているよ。危ないメソッドをうっかり自動実行しちゃう心配が減るね。

アップデートは次のコマンドで一発だよ。

```
npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest
```

## まとめ

今回のアップデートのポイントを振り返るね。

- MCP のスキーマ変換を使い回して、ターンごとの無駄な再変換を解消
- `includeMcpTools = false` で Think の自動 MCP ツール公開をオフにできる(生のカタログは `listTools()` で取得可能)
- Code Mode の耐久ランタイムに `execute()`・`search()`・`describe()` が追加され、AI SDK を使わないホストからも直接利用できる
- 承認が必要なメソッドには `requiresApproval` が付き、`approve()`・`reject()` で制御できる

自分の MCP サーバーや独自のホストから Code Mode を直接叩きたい人や、Think の自動ツール公開とバッティングしていた人にとって、地味だけどかゆいところに手が届くアップデートだと思うな！
