MCPサーバー選定と最適化 — CLI代替との使い分け
MCP(Model Context Protocol)サーバーとCLIツールのトークンコスト・信頼性を比較し、ハイブリッド戦略による最適な使い分けを解説する
MCPとCLI — 2つのツール統合パターン
AIエージェントが外部ツールと連携する方法は大きく2つある。
- MCP(Model Context Protocol): エージェントが外部サービスのAPIを直接呼び出すプロトコル
- CLI: エージェントが Bash 経由でコマンドラインツールを実行する
MCPはツール接続の共通方式として広がっていますが、「MCPなら常に最適」という意味ではありません。既存CLI、公式SDK、直接API、MCPを、認証、構造化出力、非対話実行、権限、コンテキスト消費で比較します。
トークンコストの現実
MCPの最大の課題はスキーマ注入によるコンテキスト汚染だ。
MCPクライアントの実装によっては、多数のツールスキーマがコンテキストを消費します。一方、ツール検索や動的ツールセットによって必要な定義だけを公開する実装もあります。サーバー名だけで判断せず、実際にモデルへ渡る定義数とトークンを測ります。
CLIとMCPを同じタスクで比較する
公開ベンチマークの数値を自分の環境へ一般化せず、代表タスクで成功率、再試行、入力トークン、待ち時間、権限範囲を測ります。
CLIは短いコマンドとJSON出力がある場合に効率的です。MCPは構造化されたツール発見、セッション、標準化された認証やクライアント統合が必要な場合に有利です。
MCPが有利なケース
CLIが万能ではないケースもある。MCPが真価を発揮する3つのシナリオ。
1. ステートフルな接続が必要な場合
データベース接続、WebSocket、ブラウザセッションなど、状態を維持する必要がある連携。
{
"mcpServers": {
"postgres": {
"command": "mcp-server-postgres",
"args": ["postgresql://localhost:5432/mydb"]
}
}
}
CLIでは毎回接続を確立する必要があり、トランザクション管理も困難。
2. OAuth認証が必要な場合
Slack、Google Calendar、Linear など、OAuth フローを介したAPI連携。
{
"mcpServers": {
"slack": {
"command": "mcp-server-slack",
"env": {
"SLACK_TOKEN": "${SLACK_TOKEN}"
}
}
}
}
CLIツールが存在しない、またはOAuthトークン管理が複雑なサービスではMCPが適している。
3. CLIが存在しないツール
Figma、Notion、社内APIなど、公式CLIが提供されていないサービス。
判定フローチャート
そのツールにCLIはあるか?
├── はい → モデルはCLIの使い方を知っているか?
│ ├── はい → CLI を使う(gh, git, npm, curl 等)
│ └── いいえ → MCP を検討
└── いいえ → ステートフル接続が必要か?
├── はい → MCP を使う
└── いいえ → REST API を curl で叩く
割合を先に決めるのではなく、頻出タスクを記録し、CLI、SDK、API、MCPのどれが最小の権限と入力で成功するかを比較します。
MCP最適化テクニック
MCPを使う場合でも、トークンコストを最小化する手法がある。
Dynamic Toolsets
必要なツールだけを動的に公開します。固定の上限ではなく、選択精度とツール定義のコンテキスト消費を計測します。
{
"mcpServers": {
"github-minimal": {
"command": "mcp-server-github",
"args": ["--tools", "create_pull_request,list_issues,get_file_contents"]
}
}
}
ラッパースクリプトによるCLI代替
MCPサーバーの代わりに、必要な操作をCLIスクリプトでラップする。
#!/bin/bash
# .claude/tools/gh-pr-create.sh
# MCPの代わりにghコマンドでPR作成
gh pr create \
--title "$1" \
--body "$2" \
--base main
CLAUDE.md にスクリプトの存在を記載しておけば、エージェントはMCPなしで同等の操作を実行できる。
## 利用可能なツールスクリプト
- PR作成: .claude/tools/gh-pr-create.sh "タイトル" "本文"
- Issue一覧: .claude/tools/gh-issues.sh [ラベル]
MCPサーバーのセキュリティ
MCPサーバーはローカルファイル、ネットワーク、外部サービスへアクセスできる場合があります。導入前に以下を確認します。
- ソースコードの確認: オープンソースでない MCP サーバーは使わない
- 権限の最小化: 必要最小限のスコープのみ許可する
- ネットワークアクセス: MCP サーバーがどこに通信するか確認する
- 依存関係の監査:
npm audit相当のチェックを行う
実践的な構成例
筆者のプロジェクトでの使い分け。
| ツール | 方式 | 理由 |
|---|---|---|
| Git操作 | CLI (git) | モデルが熟知。MCPは過剰 |
| GitHub PR/Issue | CLI (gh) | 非対話コマンドとJSON出力を利用できる |
| Cloudflare管理 | CLI (wrangler) | 公式CLIが充実 |
| npm操作 | CLI (npm) | 追加説明不要 |
| Figma | MCP | CLIなし。デザイントークン取得に必要 |
| Slack通知 | MCP | OAuth認証。ステートフル |
| DB操作 | MCP | 接続状態の維持が必要 |
ゾンビプロセス対策
MCP サーバーは子プロセスとして起動するため、クラッシュ時にプロセスが残る問題がある。
# MCP関連のゾンビプロセスを確認
ps aux | grep mcp-server
# 定期的なクリーンアップ(Claude Code終了時に実行)
pkill -f "mcp-server"
Claude Code の設定で、セッション終了時にMCPサーバーを確実にシャットダウンする仕組みを入れておくと安全だ。
実践ポイント
- デフォルトはCLI: まずCLIで実現できないか検討する。MCPは最後の手段
- トークンコストを計測する: MCPサーバー追加前後でトークン消費量を比較する
- ツール数を最小化する: MCPサーバーの公開ツール数は10以下を目安にする
- ハイブリッド運用: CLIとMCPを適材適所で組み合わせるのが最適解
- セキュリティファースト: 信頼できるMCPサーバーのみ使用し、権限を最小化する
関連ドキュメント
この記事はどのサーバーを入れるかの選定に絞っている。Claude Code での 具体的な設定手順は Claude Code MCPガイド を参照。