Backend for Agent:MCPをスケールさせるアーキテクチャパターン
はじめに:MCPブームの次のステップ
2024年11月にAnthropicがModel Context Protocol(MCP)を発表して以来、AIエージェントの世界は大きく変わりました。2025年にはOpenAI、Google DeepMindも採用を表明し、MCPは事実上の業界標準となりつつあります。
「MCPサーバーを繋げば、AIはなんでもできるようになる」
そんな期待のもと、多くの開発者が複数のMCPサーバーを組み合わせたエージェント構築に取り組んでいます。しかし、実際に複数のMCPサーバーを接続してみると、新たな課題が見えてきます。
本記事では、複数MCPサーバー環境で発生する課題を分析し、マイクロサービス時代に生まれたBFF(Backend For Frontend)の考え方を援用した**BFA(Backend For Agent)**というアーキテクチャパターンを提案します。
問題提起:複数MCPサーバー直接接続の課題
よくあるアプローチ
MCPの導入において、最もよく見られるアプローチは以下のような「直接接続」です。
Agent ──┬── MCP Server A(Notion)
├── MCP Server B(Slack)
└── MCP Server C(Google Drive)
各MCPサーバーを直接Agentに接続する構成。シンプルで、MCPの恩恵をすぐに受けられます。
発生する課題:精度低下の負のサイクルに陥るリスク
しかし、この構成には構造的な落とし穴があります。一見独立した課題が、実は連鎖する負のサイクルに陥る可能性があります。
- 横断検索が困難で精度が出ない — 複数ソースを跨いだ操作がAgent任せになり、結果が安定しない
- 決定論的ツールで個別対応→精度は安定 — 固定クエリ等でシナリオごとに安定させるが、体系的な設計なしではツールが増殖する
- ツール爆発→精度低下 — ツール定義がコンテキストを圧迫し、利用ツール数のハードリミットにも到達。必要なツールが使えなくなり、再び精度問題に戻る
このサイクルの核心は、汎用MCPツールの精度不足を「安易な固定化」で補おうとすると、Agentの柔軟性を犠牲にし、結果としてツール爆発と精度低下を招きやすいという点にあります。
| アプローチ | 精度 | 柔軟性 | 本質的な問題 |
|---|---|---|---|
| 決定論的(固定クエリ等) | ○ 安定 | × 固定シナリオのみ | Agentの柔軟性が大幅に制限される |
| 非決定論的(LLM任せ) | △ 不安定 | ○ 任意の要求に対応 | 精度が担保できない |
この二択を超える方法はないか?——ここでBFAパターンが解を提示します。
ツール爆発問題:業界での認識
「ツール爆発」は単なる理論上の懸念ではありません。業界でも広く認識され、対策が講じられています。
ハードリミットの存在
主要なAI開発ツールは、MCPツール数に明示的な制限を設けています[1]:
- Cursor: 40ツールのハードリミット
- GitHub Copilot: 128ツールのハードリミット
これを超えると、先頭のツールのみがAgentに公開され、残りはアクセス不能になります。
コンテキスト消費の実態
ツール定義自体がコンテキストウィンドウを圧迫します。Anthropicが公開した事例では、50以上のMCPツール定義だけで約72Kトークンを消費[2]。これは200Kトークンのコンテキストウィンドウの36%に相当します。ツール定義を読み込んだ時点で、推論に使える領域が大幅に制限されるのです。
根本原因の指摘
Tool calling doesn't usually fail because "LLMs are bad at handling tools." It fails because we overload the model with too many tools or badly designed tools.[3]
(ツール呼び出しの失敗原因はLLMの能力不足ではなく、ツール過多や設計不良である)
つまり、MCPサーバーを「繋げば繋ぐほど便利になる」という期待は、一定のスケールを超えると逆効果になり得ます。
具体例:横断検索の問題
例えば、こんなリクエストを考えてみましょう。
「NotionとSlackとGoogle Driveから "プロジェクトX" に関する情報を集めて」
直接接続の場合、Agentは以下のように動作します:
Agent → Notion MCP(検索) → Agent
Agent → Slack MCP(検索) → Agent
Agent → Drive MCP(検索) → Agent
Agent → (自分で結果を統合)
問題点:
- Agentが3つのMCPサーバーを順に呼び出す
- 各結果をAgentのコンテキストに展開
- Agentが自分で結果を統合・要約
- コンテキスト消費大、精度不安定、非効率
提案:Backend for Agent(BFA)パターン
BFFからBFAへ
マイクロサービス時代に生まれた**BFF(Backend For Frontend)**パターンは、クライアント特性(Web/Mobile/Desktop)ごとに最適化されたAPIを提供します。
同じ発想を適用します。**BFA(Backend For Agent)**は、MCPサーバー群の上に位置し、Agent向けに最適化されたオーケストレーションとツールを提供する抽象化レイヤーです。
| パターン | 展開 | 役割 |
|---|---|---|
| BFF | Backend For Frontend | フロントエンドのためのバックエンド |
| BFA | Backend For Agent | エージェントのためのバックエンド |
アーキテクチャ
ポイント:
- MCPサーバーはデータソース接続として維持
- BFAが横断的なオーケストレーションを担う
- BFA自体がMCPツールとしてAgentに公開
- 非MCPバックエンド統合はオプション
BFAの核心的価値:オーケストレーション
先ほどの横断検索をBFA導入後で見てみましょう。
Before: Agent → MCP_A → Agent → MCP_B → Agent → MCP_C → Agent(統合)
After: Agent → BFA.unified_search("プロジェクトX") → 統合済み結果
ただし、本質は呼び出し回数の削減ではありません。BFAの真価は、ドメイン知識を使って複数データソースの結果を意味的に統合できる点にあります。
具体例で見てみましょう。Agentが「プロジェクトXの今週の進捗」を把握したいとき、Slack・Notion・GitHubの3つのデータソースに散らばった情報を相関付ける必要があります。
// Agentから見えるのはシンプルな1呼び出し
Agent → BFA.get_project_progress("project-x", period="this_week")
// BFA内部の処理フロー(Agentからは隠蔽)
1. プロジェクトマッピング解決
"project-x" → Slack: #proj-x-dev, #proj-x-design
→ Notion: database PX
→ GitHub: org/project-x
2. 各データソースへクエリ発行(並列)
Slack: #proj-x-dev, #proj-x-design の今週の議論を要約取得
Notion: database PX のステータス変更・完了タスクを取得
GitHub: org/project-x の今週のPR・レビューを取得
3. 相関付け
Notion PX-142 ←→ GitHub PR #387 ←→ Slack "PX-142の設計レビュー完了"
→ 同一作業項目として紐付け
4. 統合結果を構造化して返却
// Agentが受け取る統合済み結果
{
"project": "project-x",
"period": "2025-W20",
"completed_items": [
{
"id": "PX-142",
"title": "認証フロー再設計",
"notion_status": "Done",
"pr": "#387 (merged)",
"discussion_summary": "設計レビュー完了、パフォーマンス懸念なし"
}
],
"in_progress_items": [...],
"blockers": [...]
}
これがBFAのSubAgent的振る舞いです。BFA内部でドメイン知識(プロジェクトとチャンネル・データベース・リポジトリの対応関係、タスクIDとPRの紐付けルールなど)を使い、データソース間の相関を解決する。Agentはこの処理フローを知る必要がありません。
この設計により、Agentは推論トークンをデータの突き合わせに消費せず、本来の判断—優先度の評価、リスクの指摘、次のアクションの提案—に集中できます。
責務分解:Agent向けツール最適化
BFAのもう一つの価値は責務分解です。各MCPサーバーの汎用ツールを、Agent向けに最適化します。
MCPサーバー側(汎用):
notion.search(query, filters, ...) # 汎用検索、フィルタ自由
slack.search(query, filters, ...) # パラメータ多い
BFA側(Agent最適化):
search_recent_discussions(topic, days=7) # 直近の議論を検索
get_project_context(project_id) # プロジェクト文脈を取得
find_related_documents(keyword) # 関連ドキュメント検索
責務を分解した小ぶりなツールにより:
- LLMが「今必要な操作」を的確に選択できる
- パラメータ数が少なく、誤用リスクが低下
- 意図通りの挙動を実現しやすい
MCP Gatewayとの違い
「それ、MCP Gatewayでできるのでは?」という疑問があるかもしれません。
確かにMCP Gatewayも中間層として機能しますが、責務の焦点が異なります:
| 観点 | MCP Gateway | BFA |
|---|---|---|
| ツールのフィルタリング・集約 | ○ | - |
| ルーティング・認証 | ○ | - |
| 複数サーバーの応答集約 | △(一部対応) | ○ |
| ドメイン知識に基づくオーケストレーション | × | ○ 核心 |
| Agent向けツール再設計(責務分解) | × | ○ 核心 |
| コンテキスト最適化(圧縮・整形) | × | ○ 核心 |
MCP GatewayとBFAは排他的ではなく、共存可能です。Gatewayがインフラ層の関心事(ルーティング、認証、集約)を、BFAがアプリケーション層の関心事(ドメイン知識に基づくオーケストレーション、ツール再設計)を担当する。これはAPI GatewayとBFFが共存するのと同じ構図です。
BFAの責務と設計原則
BFAの責務
| 責務 | 説明 |
|---|---|
| 1. 横断的オーケストレーション | 複数MCPサーバーを跨いだ操作の実行 |
| 2. 責務分解 | Agent向けに最適化されたツール設計 |
| 3. 結果の統合・圧縮 | 複数ソースの結果を整形(TOON等) |
| 4. コンテキスト整形 | エージェント特性に応じた情報の取捨選択 |
設計原則
- BFAはビジネスロジックを持たない(薄いオーケストレーション層)
- One BFA per Agent Type(エージェント種別ごとに分離も可能)
- MCPサーバーの汎用性は維持(BFAがAgent特化を担う)
比較:直接接続 vs BFA設計
| 観点 | MCPサーバー直接接続 | BFA設計 |
|---|---|---|
| 横断的操作 | Agent任せ(非効率) | BFAがオーケストレーション |
| ツール数 | 全ツールがコンテキストに | 必要なツールのみ公開 |
| 責務分解 | 各MCPサーバーの設計次第 | Agent向けに最適化 |
| 結果の統合 | Agentが都度実施 | BFAが事前に統合 |
| 運用複雑性 | 低い | 中程度(レイヤー追加) |
シナリオ別の判断基準
| シナリオ | 推奨 |
|---|---|
| 単一MCPサーバー | 直接接続でOK |
| 複数MCPサーバー、横断操作少ない | 直接接続でOK |
| 複数MCPサーバー、横断操作多い | BFA導入を検討 |
| 複数種類のエージェント | BFA導入を推奨 |
実践への道筋
段階的導入アプローチ
- Phase 0: 直接接続でPoC実施、横断操作の課題を可視化
- Phase 1: 最も頻出する横断操作からBFAツール化
- Phase 2: 責務分解によるツール最適化
- Phase 3: 結果の圧縮・最適化(TOON等)
評価指標
- 横断操作の成功率
- コンテキストウィンドウ使用率
- ツール選択の精度
- レイテンシー
批判的検討:BFAの弱点
公平を期すため、BFAパターンの弱点も明示しておきます。
追加レイヤーの複雑性
もう1つレイヤーが増えることで、デプロイ・運用・デバッグの複雑性が増します。小規模なプロジェクトや横断操作が少ない場合は、直接接続の方がシンプルで適切です。
責務境界の曖昧さ
「この操作はMCPサーバー側か、BFA側か」の判断が曖昧になることがあります。明確な設計指針を持つことが重要です。
標準化の不在
現時点でBFAは概念提案に過ぎず、標準化されたインターフェースやSDKは存在しません。
まとめ
- 複数MCPサーバーを直接接続すると、横断操作がAgent任せになり非効率
- BFA(Backend For Agent)はオーケストレーション層として機能
- MCPサーバーはデータソース接続として維持、BFAがAgent向け最適化を担う
- MCP Gatewayは「フィルタリング・ルーティング」、BFAは「オーケストレーション・責務分解」
- BFFの教訓をAIエージェント時代に活かす
「MCPサーバーを繋ぐ」前に「オーケストレーションを設計する」
過去の知見を、AIエージェント時代に活かしていきましょう。
Discussion