Contents
1️⃣ MCP(Model Context Protocol)とは?
| 項目 | 内容 |
|---|---|
| 目的 | Claude Code が外部ツール・サービスと安全かつスケーラブルにやり取りするための標準化インターフェース |
| コア概念 | モデル ↔ ツール 間で 型安全な JSON メッセージ を交換し、実行時に自動的にツール呼び出しを生成 |
| 主な利点 | - データフローが一元管理できる - 認証・認可がサーバーレベルで統制可能 - ツールのバージョニングと互換性チェックが組み込み |
結論
MCP は Claude Code の拡張性を根底から支えるプロトコルです。モデル側は「ツール呼び出し」メッセージだけを書けば、MCP が適切な HTTP リクエストへ変換・認証・結果返却まで自動化します。
1.1 実際のデータフロー(イメージ)
|
1 2 3 4 5 6 7 8 9 10 11 |
Claude Code (プロンプト) ──► MCP Server │ │ ▼ ▼ ツール呼び出しメッセージ ツール定義参照 │ │ ▼ ▼ 外部 API / データベース ◄────── HTTP リクエスト (認証済み) │ ▼ JSON レスポンス ──► MCP Server ──► Claude Code |
上図は概念モデルです。実装時には TLS、mTLS、シークレット注入などのセキュリティ層が必ず介在します。
2️⃣ サーバー構築とツール定義の基本要件
2.1 MCP サーバーの起動オプション
| オプション | 推奨設定 | 補足 |
|---|---|---|
| 実行形態 | mcp-server コンテナ(Docker)または単体バイナリ |
CI/CD ではコンテナが最も扱いやすい |
| TLS | TLS 1.3 を必須化、自己署名証明書でも内部 PKI に登録 | 外部からの直接アクセスは許可しない |
| 認証プラグイン | mTLS + API キー(Vault/Secrets Manager) または OAuth2.0 | 後述の代替案も併記 |
Docker Compose 例(簡易構成)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
version: "3.9" services: mcp-server: image: ghcr.io/example/mcp-server:latest ports: - "8443:8443" environment: - MCP_TLS_CERT=/run/secrets/tls_cert - MCP_TLS_KEY=/run/secrets/tls_key secrets: - tls_cert - tls_key secrets: tls_cert: file: ./certs/server.crt tls_key: file: ./certs/server.key |
2.2 ツール定義ファイルの必須項目
| フィールド | 型 / 例 | 説明 |
|---|---|---|
name |
string(例:get_sales) |
ツール呼び出し時に使用する識別子 |
version |
semver(例:1.2.0) |
バージョニングは後方互換性の判定基準 |
description |
string |
人間が読める概要。CLI のヘルプに利用 |
endpoint |
url(例:https://api.example.com/v1/sales/aggregate) |
実際にリクエストを送る先 |
method |
GET|POST|PUT|DELETE |
HTTP メソッド |
input_schema |
JSON Schema | Claude Code が生成するペイロードの型検証 |
auth |
オブジェクト(例:apiKey, oauth2) |
認証方式と必要情報 |
ポイント
名前空間(例:org.example.sales) と バージョンタグ を組み合わせて管理すると、ツールが増えても衝突を防げます。
完全サンプル(YAML)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
name: get_sales version: "1.2.0" description: 社内売上データベースから期間指定で集計取得 namespace: org.example.sales endpoint: https://api.example.com/v1/sales/aggregate method: POST input_schema: type: object properties: start_date: type: string format: date end_date: type: string format: date region: type: string enum: [APAC, EMEA, AMER] required: [start_date, end_date] auth: type: apiKey in: header name: X-API-Key |
2.3 バリデーションと CI 連携
- スキーマ検証:
ajv-cli,jsonschema-cli等で CI 時に自動実行。 - コメント活用:YAML の
#コメントはコードレビューの補足情報として有効です。 - 失敗時の挙動:バリデーションエラーが出たらビルドを即座に停止し、プルリクエストで修正を要求。
3️⃣ ツール登録フロー(CLI + REST API)
3.1 手順概要
| ステップ | 実行例 | 補足 |
|---|---|---|
| ① サーバー起動 | docker compose up -d mcp-server |
ローカル開発は Docker が便利 |
| ② 定義ファイルの検証 | mcp-cli validate ./tools/get_sales.yaml |
スキーマエラーは早期に捕捉 |
| ③ ツール登録(REST) | curl -X POST https://localhost:8443/api/v1/tools \ <br> -H "Content-Type: application/json" \ <br> --cert client.crt --key client.key \ <br> -d @./tools/get_sales.yaml |
本番は 相互TLS(mTLS) を必須化 |
| ④ デプロイ確認 | curl https://localhost:8443/healthz |
200 が返れば正常稼働 |
3.2 IaC での自動化例(GitHub Actions)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
name: MCP CI/CD on: push: branches: [ main ] jobs: build-test-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # 1️⃣ ツール定義のバリデーション - name: Validate tool definitions run: | for f in tools/*.yaml; do mcp-cli validate "$f"; done # 2️⃣ テスト実行(ユニット+統合) - name: Run tests run: pytest tests/ # 3️⃣ Docker イメージビルド & レジストリへプッシュ - name: Build and push image uses: docker/build-push-action@v5 with: context: . tags: ghcr.io/${{ github.repository }}/mcp-server:${{ github.sha }} push: true # 4️⃣ Kubernetes (Helm) デプロイ - name: Deploy to K8s uses: azure/k8s-deploy@v4 with: manifests: | helm/chart/ images: ghcr.io/${{ github.repository }}/mcp-server:${{ github.sha }} |
ポイント
- シークレット注入は GitHub Secrets → Kubernetes Secret のパイプラインで自動化。
- デプロイ後に curl https://<svc>/healthz && mcp-cli test-compatibility を走らせ、失敗したら自動ロールバック。
4️⃣ Tool Search(遅延読み込み)とパフォーマンス最適化
4.1 遅延ロードのメリット
| 項目 | 従来設定 | Lazy‑load 設定 |
|---|---|---|
| 起動時メモリ使用量 | 高(全ツールを事前ロード) | 低(必要なツールだけ) |
| 応答時間 | 約 420 ms(社内ベンチマーク) | 約 260 ms(30%〜45% 短縮) |
| CPU 使用率 | 約 23 % | 約 15 % |
⚠️ 注記:上記数値は当社内部環境で取得したベンチマークです。外部環境やツール構成により変動します。
4.2 設定例(mcp-config.yaml)
|
1 2 3 4 5 |
search: enabled: true # Tool Search 機能全体を有効化 lazy_load: true # 遅延読み込みモード cache_ttl_seconds: 300 # 5 分間キャッシュ保持(業務フローに合わせて調整) |
調整ポイント
- キャッシュ TTL
- 業務上「同一ツールを連続呼び出す」ケースが多い場合は
300秒程度が安全。 -
変更頻度が高く、最新定義が必須の場合は
30〜60秒に短縮。 -
検索スロットリング
-
ツール数が 500 件以上 のときは
max_concurrent_searches: 5以下に抑える。 -
プロファイリング
- Linux
perf,bpftrace等でsearch_handlerのシステムコールをモニタし、異常があればログレベルをdebugに切り替えて原因追求。
5️⃣ セキュリティ・運用ベストプラクティス
5.1 認証情報の管理(Vault 以外の代替案)
| 方法 | 主な利用シーン | 設定例 |
|---|---|---|
| HashiCorp Vault | 大規模オンプレ/ハイブリッド環境 | VAULT_ADDR, VAULT_TOKEN をコンテナのシークレットとして注入 |
| AWS Secrets Manager | 完全 AWS 上で運用 | IAM ロールに secretsmanager:GetSecretValue 権限付与、aws secretsmanager get-secret-value --secret-id mcp/api-key で取得 |
| GCP Secret Manager | GCP 主導プロジェクト | Service Account に roles/secretmanager.secretAccessor を付与し、環境変数 GOOGLE_APPLICATION_CREDENTIALS 経由でアクセス |
| Kubernetes Secrets + SealedSecrets | K8s‑ネイティブな小規模構成 | kubectl create secret generic mcp-api-key --from-literal=key=xxxx → sealed-secrets で暗号化保存 |
実装例(環境変数方式)
|
1 2 3 4 |
export MCP_API_KEY_SALES=$(aws secretsmanager get-secret-value \ --secret-id prod/mcp/sales/api-key \ --query SecretString --output text) |
5.2 最小権限の原則
- ツール定義に
auth.required_scopesを必ず記載し、不要な管理者権限を除外。 - OAuth2.0 の Client Credentials フローではスコープを
sales:read,inventory:writeなど細分化。
5.3 TLS・ネットワーク制御
| 項目 | 推奨設定 |
|---|---|
| TLS バージョン | TLS 1.3(以下は無効) |
| 証明書管理 | 社内 PKI で自動ローテーション、期限切れ前に更新 |
| IP 制限 | 管理 UI は社内 VPN のサブネットのみ許可(例:10.0.0.0/16) |
| ヘッダー保護 | Strict-Transport-Security, X-Content-Type-Options などを必ず付与 |
6️⃣ バージョニング戦略と互換性チェック
6.1 SemVer に基づく運用フロー
| バージョン変更 | 意味 |
|---|---|
MAJOR (例: 2.0.0) |
エンドポイントや必須パラメータが破壊的に変わる |
MINOR (例: 1.3.0) |
後方互換性のある新機能追加 |
PATCH (例: 1.2.1) |
バグ修正や軽微な改善 |
6.2 CI パイプラインでの互換性テスト
|
1 2 3 |
# 古い定義と新しい定義を比較し、破壊的変更が無いか検証 mcp-cli test-compatibility --old v1.2.0 --new v2.0.0 |
- 失敗時はリリースがブロックされ、開発者に PR コメントで詳細が提示されます。
- ブルー/グリーンデプロイ:新バージョンは
org.example.sales.v2の名前空間で登録し、トラフィックシフトを段階的に実施。
7️⃣ エラーハンドリングとフォールトトレランス
| パターン | 実装例 |
|---|---|
| リトライ | exponential_backoff(initial=200ms, max=5s, attempts=3) |
| サーキットブレーカー | エラー率 5 分間で 20% 超過 → オープン、クールダウン後ハーフオープン |
| タイムアウト | 外部 API 呼び出しは 2s 以内に完了させる設定 |
| 標準エラーコード | MCPError:Timeout, MCPError:AuthFailure, MCPError:InvalidPayload |
ロギング方針
- INFO:リトライ成功、正常なツール呼び出し
- WARN:リトライ失敗、期限切れのトークン
- ERROR:サーキットブレーカー発動、致命的認証エラー
ログは OpenTelemetry 形式で出力し、後段の Loki / Elasticsearch に集約します。
8️⃣ テスト・モニタリング設計
8.1 ユニットテストとモックサーバー活用
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# tests/test_sales_tool.py (pytest + requests-mock) def test_schema_validation(client): # 必須フィールドが欠如した場合は 422 を返す payload = {"start_date": "2024-01-01"} resp = client.post("/tools/get_sales", json=payload) assert resp.status_code == 422 def test_successful_call(requests_mock, client): # 外部 API のモックレスポンスを定義 requests_mock.post( "https://api.example.com/v1/sales/aggregate", json={"total": 12345}, status_code=200, ) payload = { "start_date": "2024-01-01", "end_date": "2024-01-31", "region": "APAC" } resp = client.post("/tools/get_sales", json=payload) assert resp.json() == {"total": 12345} |
- モックサーバーは
wiremock、MockServer、あるいは単純な Python HTTP サーバで代用可能。 - CI ジョブでは Docker コンテナとして自動起動し、テスト開始前にヘルスチェックを実施。
8.2 統合テスト(E2E)
- MCP サーバーとツール定義をロード
- Claude Code のプロンプトシミュレーションを実行(
claude-cli simulate ...) - 期待する自然言語出力が得られるか検証
8.3 可観測性:Prometheus / Grafana
Prometheus スクレイプ設定例
|
1 2 3 4 5 6 |
scrape_configs: - job_name: 'mcp_server' static_configs: - targets: ['mcp-server:9090'] metrics_path: '/metrics' # OpenTelemetry エクスポート先 |
| メトリクス名 | タイプ | 説明 |
|---|---|---|
mcp_tool_requests_total |
Counter | 受信したツール呼び出しの総数 |
mcp_tool_success_total |
Counter | 正常に完了した呼び出し |
mcp_tool_latency_seconds_bucket |
Histogram | レイテンシ分布 |
mcp_search_cache_hits_total |
Counter | Tool Search のキャッシュヒット回数 |
Grafana ダッシュボード例
- Tool Call Overview:成功率、失敗率、1 分あたりのリクエスト数をパネルで表示。
- Latency Heatmap:5 分ごとのレイテンシ分布をカラーで示し、閾値 2 s 超過時にアラート。
アラート例(Prometheus Alertmanager)
- alert: MCPHighErrorRate
expr: rate(mcp_tool_requests_total[5m]) > 0 and (rate(mcp_tool_success_total[5m]) / rate(mcp_tool_requests_total[5m])) < 0.9
for: 2m
labels:
severity: critical
annotations:
summary: "MCP の成功率が 90% を下回っています"
9️⃣ トラブルシューティング FAQ
| 質問 | 解決策 |
|---|---|
ツール呼び出しで 401 Unauthorized が返る |
- API キー/トークンが正しいシークレットに保存されているか確認 - Vault のポリシーや AWS IAM ロールの権限を再チェック |
| MCP 起動時に「schema validation failed」エラー | mcp-cli validate で対象ファイルを個別に検証し、input_schema の必須フィールド・型が正しいか確認 |
| 遅延ロード後のレイテンシが増える | - cache_ttl_seconds が短すぎないか確認- ツール数が非常に多い場合は max_concurrent_searches を下げる |
| サーキットブレーカーが頻繁にオープン | 外部 API の安定性を外部モニタリングで測定し、必要ならリトライ回数・バックオフ時間を調整 |
🔚 まとめ
- MCP は Claude Code と外部ツールの橋渡し を行う安全なプロトコルです。
- サーバー構築とツール定義は JSON/YAML スキーマで厳格に管理 し、CI にバリデーションを組み込むことでヒューマンエラーを最小化できます。
- Tool Search の遅延ロード を有効にすれば、起動時のメモリ使用量とレイテンシが大幅に削減されます(社内ベンチマークで約30%〜45% 改善)。
- 認証情報は Vault・Secrets Manager 等の外部シークレット管理サービス か、環境変数・K8s Secrets のいずれかで安全に保管し、最小権限を徹底します。
- バージョニングと互換性テスト を自動化し、破壊的変更が本番に流入するリスクを排除します。
- フォールトトレランス(リトライ・サーキットブレーカー)と統一エラーハンドリング により外部障害の影響範囲を限定。
- テスト戦略はユニット+モック+E2E の三層構成、CI で自動実行し 95% 以上のカバレッジを目指す。
- 可観測性は OpenTelemetry → Prometheus/Grafana で実装し、リアルタイムに SLO を監視・アラート化。
これらのベストプラクティスを段階的に導入することで、Claude Code + MCP 環境は 高信頼性・高拡張性・高度なセキュリティ を同時に実現できます。ぜひチェックリスト化し、プロジェクトの CI/CD パイプラインへ組み込んでください。