CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-06-02上級

MCP の tools 以外の3つの能力を使い分ける:resources・prompts・sampling の設計

MCP サーバーで何でも tools にしてしまう設計の限界を、resources・prompts・sampling という3つの primitive で解きほぐします。壁紙アプリのアセット管理サーバーを題材に、判断基準と実装、クライアント対応の現実的な制約までまとめました。

MCP45Claude API115TypeScript24サーバー設計個人開発110

プレミアム記事

アーティスト・クリエイターの廣川政樹です。壁紙アプリのアセットを Claude から直接扱えるようにしたくて、MCP サーバーを書き始めたときのことを振り返ります。最初に作ったサーバーは、機能をすべて tool として実装していました。アセット一覧の取得も、メタデータの読み取りも、定型のレビュー手順も、キャプション生成も、全部 tool です。動きはしたのですが、tool の数が14個まで膨らんだあたりで、Claude がどれを呼べばよいか迷い始め、私自身もどこに何があるのか把握しきれなくなりました。

このとき気づいたのは、MCP には tool のほかに resourcepromptsampling という能力が用意されていて、本来そちらで表現すべきものまで tool に押し込んでいた、ということでした。14個あった tool を5個まで減らした実際のリファクタを下敷きに、3つの primitive をどう使い分けるかを順に整理します。題材は私が2014年から個人開発を続けている壁紙アプリ群(iOS / Android 合わせて累計5,000万ダウンロードを超えました)のアセット管理サーバーです。

tool に何でも詰め込むと何が起きるか

MCP を学び始めると、最初に手に取るのはほぼ確実に tool です。server.tool() で関数を登録すれば Claude がそれを呼べる、という分かりやすさがあるからです。私もそうでした。ただ、tool だけで全部を表現しようとすると、いくつかの具体的な問題が出てきます。

ひとつ目は、Claude の選択精度が落ちることです。tool は「副作用のある操作」としてモデルに提示されます。読み取り専用のデータ取得まで tool にすると、モデルは「これは呼んでも安全なのか」を毎回判断する必要が生まれ、似た名前の tool が増えるほど取り違えが起きます。実際、私のサーバーでは get_wallpaper_metaget_wallpaper_info という似た tool を両方残してしまい、Claude がしばしば逆を呼ぶ事故が起きていました。

ふたつ目は、定型ワークフローが再利用できないことです。「この壁紙のメタデータを App Store 向けにレビューして」という作業は、毎回ほぼ同じ手順を踏みます。これを tool にすると、手順そのものはプロンプトとして私が毎回書き直すことになり、サーバー側に蓄積されません。

みっつ目は、サーバー側で軽い推論をしたいときに行き場がないことです。たとえば壁紙のファイル名から人間向けのキャプションを生成したい場合、サーバー自身が API キーを持って Claude を呼ぶ実装も可能ですが、それだとサーバーが課金主体になり、個人開発のコスト管理が一気に複雑になります。

下記は、リファクタ前の「何でも tool」状態を簡略化したものです。

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
 
const server = new McpServer({ name: "wallpaper-assets", version: "1.0.0" });
 
// 読み取り専用のはずなのに、すべて tool
server.tool("list_wallpapers", {}, async () => ({
  content: [{ type: "text", text: JSON.stringify(await db.listAll()) }],
}));
 
server.tool("get_wallpaper_meta", { id: z.string() }, async ({ id }) => ({
  content: [{ type: "text", text: JSON.stringify(await db.meta(id)) }],
}));
 
// 定型レビュー手順も tool(毎回プロンプトを呼び出し側で書くことになる)
server.tool("review_metadata", { id: z.string() }, async ({ id }) => ({
  content: [{ type: "text", text: `次のメタデータをレビュー: ${JSON.stringify(await db.meta(id))}` }],
}));
 
// ……このあと 11 個の tool が続く

この review_metadata が象徴的です。やっていることは「レビュー用のプロンプトを組み立てて返す」だけで、実体は操作ではなくテンプレートです。本来これは prompt として表現すべきものでした。

resources:読み取り専用のデータは「アドレス」で渡す

resource は、サーバーが持つ読み取り可能なデータに URI を与えて公開する仕組みです。wallpaper://1024 のようなアドレスでアクセスでき、副作用がないことが型として表現されます。Claude から見ると「呼ぶかどうか判断する操作」ではなく「参照できる素材」になるため、tool の選択ノイズから切り離せます。

壁紙アセットの一覧と個別メタデータは、まさに読み取り専用データです。これを resource に移します。

import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
 
// 一覧は固定 URI の resource
server.resource("wallpaper-list", "wallpaper://list", async (uri) => ({
  contents: [{
    uri: uri.href,
    mimeType: "application/json",
    text: JSON.stringify(await db.listAll()),
  }],
}));
 
// 個別メタデータはテンプレート URI で動的に
server.resource(
  "wallpaper",
  new ResourceTemplate("wallpaper://{id}", { list: undefined }),
  async (uri, { id }) => ({
    contents: [{
      uri: uri.href,
      mimeType: "application/json",
      text: JSON.stringify(await db.meta(String(id))),
    }],
  })
);

この変更だけで list_wallpapersget_wallpaper_metaget_wallpaper_info の3つの tool が消えました。データの取得は resource に一本化され、似た名前の tool による取り違えも自然に解消しました。私はこの「読み取りは resource、書き込み・操作は tool」という線引きを設計の最初の分岐点として置くことを強く推奨します。tool に残すべきは、分類の再実行やサムネイルの再生成のように、状態を変える操作だけです。

ひとつ注意点があります。resource は「クライアントが明示的に読みに来る」モデルです。Claude が会話の流れで勝手に全 resource を読むわけではありません。会話の中で特定の壁紙を扱わせたいときは、クライアント側でその resource を文脈に添付するか、resource を参照するよう促す必要があります。ここを誤解すると「resource にしたのに Claude が見てくれない」と感じますが、それは設計通りの挙動です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
resources・prompts・sampling をいつ使い分けるかの具体的な判断基準(読み取りは resource、定型操作は prompt、サーバー内推論は sampling)
壁紙アプリ6本のアセット管理サーバーで tools 14個を5個まで減らした実際のリファクタ手順とコード
sampling のクライアント対応状況という落とし穴と、未対応クライアントでも壊れないフォールバック設計
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-07-08
MCP コネクタを申請・無人運用に回す前に、各ツールを契約テストで確かめる
手元で動いた MCP コネクタをそのまま無人ジョブに繋ぐと、応答形状の誤読や書き込みの二重発火で静かに壊れます。ツール記述・応答契約・冪等性・レイテンシを機械検証する小さなハーネスの作り方を、実測値とともにまとめました。
API & SDK2026-06-25
API リクエスト1本でリモート MCP サーバーに直接つなぐ — Messages API の MCP コネクタ実装メモ
ローカルに MCP クライアントを立てずに、Messages API の mcp_servers と mcp_toolset だけでリモート MCP サーバーのツールを呼ぶ実装をまとめました。allowlist/denylist 設計、レスポンス処理、無人運用での落とし穴まで。
API & SDK2026-07-13
画像を原寸で送るか縮小するか — Opus 4.7 の高解像度ビジョンで1枚ごとに解像度を決めるコスト設計
Opus 4.7 の高解像度ビジョンで壁紙の細部分類は上がったのに、全部を原寸で送ったら週のトークンが跳ねました。1枚ごとに解像度と使うモデルを決める preflight を設計し、精度を保ったままコストを下げた実測を残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →