CLAUDE LABEN
2.1.278 — auto モードの分類器が Claude API・Enterprise・Bedrock / Vertex / Foundry でサーバー側の既定になりました。分類器の分は課金されず、/status に Auto mode server の行が増えていますTASKOUT — TaskOutput ツールが削除されました。taskOutputMaxChars と TASK_MAX_OUTPUT_LENGTH は無効になり、バックグラウンドの出力は Read で読む形に一本化されています10/07 — 管理構成キーの旧い綴りの受付は10月7日 正午 PT までです。残り17日で、締切を過ぎた設定は書き直すまでそのコネクタが使えなくなりますBUNPANIC — 更新で入った版が、起動しただけで落ちるという報告が出ています。同じ機械で前の版は動くとのことで、環境ではなく版の側が疑われていますNEW — Cowork と Claude Code のどちらに置くかを、承認の境界で決めた記録ですSONNET4.5 — 廃止表に並ぶ日付は「それより前には終わらない下限」です。Sonnet 4.5 は今も有効で、非推奨の告知は出ていません2.1.278 — auto モードの分類器が Claude API・Enterprise・Bedrock / Vertex / Foundry でサーバー側の既定になりました。分類器の分は課金されず、/status に Auto mode server の行が増えていますTASKOUT — TaskOutput ツールが削除されました。taskOutputMaxChars と TASK_MAX_OUTPUT_LENGTH は無効になり、バックグラウンドの出力は Read で読む形に一本化されています10/07 — 管理構成キーの旧い綴りの受付は10月7日 正午 PT までです。残り17日で、締切を過ぎた設定は書き直すまでそのコネクタが使えなくなりますBUNPANIC — 更新で入った版が、起動しただけで落ちるという報告が出ています。同じ機械で前の版は動くとのことで、環境ではなく版の側が疑われていますNEW — Cowork と Claude Code のどちらに置くかを、承認の境界で決めた記録ですSONNET4.5 — 廃止表に並ぶ日付は「それより前には終わらない下限」です。Sonnet 4.5 は今も有効で、非推奨の告知は出ていません
記事一覧/Claude.ai
Claude.ai/2026-04-11上級

MCP エージェントの実装でつまずいた4箇所 — 集計ツール・並列実行・入力検証を実測で見直す

MCP サーバーとエージェントワークフローを個人開発で回す中で見つかった実装上の穴を、手元の実測値つきで整理しました。集計ツールの境界値、見せかけの並列実行、JSON 解析の失敗、ブロックリスト型の入力検証の限界を扱います。

MCP53エージェント14ワークフロー20自動化88Claude Code256API27

プレミアム記事

MCP サーバーを初めて自分の手で書き上げた日のことを、よく覚えています。Claude Desktop を再起動して、自作の集計ツールがツール一覧に現れた瞬間の、静かな高揚。

その高揚は、手元にある本物の CSV を渡した数分後には引いていました。ツールは呼ばれている。なのに、まともな数字が返ってこない。

Model Context Protocol そのものは、驚くほど素直な仕様です。つまずくのは、たいていプロトコルの外側にあります。スキーマの書き方、非同期の扱い方、モデルの出力を受け取る側の想定。

以下では MCP とエージェントワークフローの設計を一通り追いながら、個人開発の環境で私が実際に踏み抜いた4つの穴を、手元で測った数字とともに置いていきます。設計論だけで終わらせないために、壊れる条件のほうを先に共有させてください。


MCP は結局どこまでを引き受けてくれるのか

Model Context Protocol(MCP)は、Anthropicが2024年11月に発表したオープンな標準プロトコルです。AIモデルと外部ツール・データソースをつなぐための共通インターフェースを定義しており、「AIアプリケーションのUSB-C」とも呼ばれます。

MCPが解決する問題

従来のAIシステムでは、外部ツールとの連携のたびに専用のアダプターや統合コードを書く必要がありました。異なるAIモデルに同じツールを接続しようとすると、モデルごとに実装を書き直す必要があり、保守コストが増大していました。

MCPはこの問題を解決します。一度MCPサーバーとしてツールを実装すれば、Claude をはじめとする任意のMCP対応クライアントから利用できます。

MCPの構成要素

MCPは3つの主要コンポーネントで構成されています。

MCPホスト(Host): Claude Desktopや Claude Codeのような、AIモデルを実行する環境。ユーザーとのインターフェースを提供し、MCPクライアントとしてサーバーと通信します。

MCPクライアント(Client): ホスト内でMCPサーバーとの接続を管理するコンポーネント。各サーバーとの接続を確立し、リソース・ツール・プロンプトの一覧を取得します。

MCPサーバー(Server): 実際の機能を提供するプログラム。ファイルシステム操作、データベースアクセス、Web検索など、あらゆる機能をMCPサーバーとして実装できます。

MCPが提供する3つのプリミティブ

MCPサーバーは以下の3種類のプリミティブを提供できます。

ツール(Tools): Claudeが呼び出せる関数。ファイルの読み書き、API呼び出し、計算処理などの「アクション」を定義します。ツールはClaudeが判断して呼び出しを決定します。

リソース(Resources): ファイル、データベースレコード、ドキュメントなど、静的・動的なデータへのアクセスを提供します。URIで識別され、コンテキストウィンドウに読み込まれます。

プロンプト(Prompts): よく使うプロンプトテンプレートを再利用可能な形で定義します。ユーザーがスラッシュコマンドで呼び出せるような用途に最適です。


エージェントアーキテクチャの設計パターン

MCPを活用したシステムを設計する前に、エージェントアーキテクチャの主要なパターンを理解しましょう。

シングルエージェントパターン

最もシンプルな構成は、1つのClaudeインスタンスが複数のMCPツールを使いながらタスクを完遂するパターンです。

ユーザー
  ↓
Claude(オーケストレーター)
  ├── MCP: ファイルシステム
  ├── MCP: データベース
  ├── MCP: Web検索
  └── MCP: メール送信

このパターンは、タスクが明確に定義されており、ツール間の調整が比較的単純な場合に適しています。Claude Desktopの通常の使い方が、このシングルエージェントパターンに相当します。

オーケストレーター + サブエージェントパターン

より複雑なタスクでは、親エージェント(オーケストレーター)がタスクを分割し、複数のサブエージェントに割り当てるパターンが効果的です。

ユーザー
  ↓
オーケストレーター(Claude)
  ├── サブエージェント1(調査担当)
  │     └── MCP: Web検索、Wikipedia
  ├── サブエージェント2(分析担当)
  │     └── MCP: データベース、計算ツール
  └── サブエージェント3(出力担当)
        └── MCP: ファイル生成、メール送信

Anthropicが2025年に公開した Claude Agent SDK では、このパターンがネイティブにサポートされています。Agent クラスを使って各役割のエージェントを定義し、オーケストレーターが orchestrate() メソッドで全体を制御します。

並列エージェントパターン

独立したタスクを複数のエージェントが同時に処理するパターンです。ここで私は、いちばん気づきにくい失敗をしました。

async def で包み、asyncio.gather に渡す。形は完全に並列です。ところが中で呼んでいるのが同期クライアントだと、待っている間イベントループが丸ごと止まります。並列に見えて、実際には順番待ちのままです。

手元で確かめました。0.5 秒かかる同期処理を4つ、asyncio.gather に渡すだけの検証です(Python 3.10.12)。

書き方4タスク(各0.5秒)の実測
async def の中で同期呼び出し2.00 秒
asyncio.to_thread 経由0.50 秒

きれいに4倍。並列化したつもりのコードが、直列のまま動いていたわけです。しかも例外は一つも出ません。エージェントを8体に増やせば、素直に8倍待たされます。

直し方は二つあります。素直なのは非同期クライアントを使うこと。既存の同期処理を活かすなら asyncio.to_thread で別スレッドに逃がします。

import asyncio
from anthropic import AsyncAnthropic
 
client = AsyncAnthropic()
 
def first_text(response) -> str:
    """content[0] がツール使用ブロックのことがあるため、テキストを探して取り出す"""
    for block in response.content:
        if getattr(block, "type", None) == "text":
            return block.text
    return ""
 
async def run_agent(task: str, tools: list) -> str:
    """個別エージェントの実行(await できるクライアントを使う)"""
    response = await client.messages.create(
        model="claude-opus-4-6",
        max_tokens=4096,
        tools=tools,
        messages=[{"role": "user", "content": task}],
    )
    return first_text(response)
 
async def parallel_workflow(tasks: list[dict]) -> list[str | BaseException]:
    """複数タスクを並列実行。1体の失敗で全体を落とさない"""
    coroutines = [run_agent(t["task"], t["tools"]) for t in tasks]
    return await asyncio.gather(*coroutines, return_exceptions=True)

first_text を挟んだのにも理由があります。tools を渡した応答では content[0] がツール使用ブロックになることがあり、.text を直に読むと AttributeError で落ちます。ツールを使わせたい呼び出しほど、この形で落ちます。

return_exceptions=True も実運用では効きます。既定のままだと、1体が例外を投げた時点で gather 全体が中断し、成功していた他のエージェントの結果まで捨てられます。

並列パターンを使う際は、各エージェントが互いに独立していることも確認してください。共有リソースへの競合書き込みは、データ整合性の問題を引き起こします。

チェックポイント付きシーケンシャルパターン

長時間かかるワークフローでは、各ステップの完了後に状態を保存するチェックポイント機構が重要です。途中で失敗しても、最初からやり直す必要がなくなります。


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

この記事の続きを読む

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

この記事で得られること
MCP ツールが実データを丸ごと拒否する原因になる zod スキーマの書き方と、その直し方
async def の中で同期 SDK を呼ぶと並列実行が直列に戻る — 2.00 秒対 0.50 秒の実測
空配列で -Infinity や NaN を返したツールが、Claude 側で「結果なし」と区別できなくなる仕組み
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Claude Code2026-03-20
Claude Code カスタムスキル開発の実装パターン — SKILL.md 設計とテスト・配布
Claude Code のカスタムスキルをゼロから設計・実装する実践チュートリアル。SKILL.md の構造、エージェントタイプ、コンテキスト注入、テスト手法まで、3つの実用スキルを作りながら学びます。
Claude.ai2026-06-12
今週のClaude Lab: エラーを出さずに壊れる自動化と、壊れる前に止める仕組み
固定名の一時ファイルに残る残骸、git add -Aが拾ってしまう.bak、PreToolUseフックによる事前検査——エラーを出さずに静かに壊れる自動化と向き合った今週の5本を、編集後記つきで振り返ります。記録から予防へ移る仕組みづくりと、アプリの出口設計の話題も添えました。
Claude.ai2026-04-05
Claude AIコンテンツ制作:ブログ・動画・SNS・電子書籍を自動化する実践ワークフロー
ブログ記事・SNS投稿・YouTube台本・電子書籍までを一貫した品質で制作するための、Claudeを軸にしたワークフローを公開します。リサーチから公開までの手順、コンテンツカレンダーの自動設計、Claudeに編集長役を任せる品質管理、システムプロンプトで自分らしさを固定する方法まで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます