Contents
― LLM と外部リソースを「USB‑C」のように統一的に接続するプロトコル
1. 背景と必要性
近年、ChatGPT・Claude などの大規模言語モデル(LLM)は 単体で完結した生成エンジン に留まらず、検索結果や社内データベース、CLI ツールといった外部リソースを組み合わせた AI アプリケーション が主流になっています。
従来は以下のような課題がありました。
| 課題 | 具体例 |
|---|---|
| API 呼び出しごとの実装差分 | REST API、GraphQL、gRPC それぞれでクライアントコードを別途用意 |
| 認証・エラーハンドリングの一貫性欠如 | トークン管理やリトライロジックがプロジェクトごとにバラバラ |
| スキーマ変換の手間 | JSON ↔︎ Protobuf ↔︎ YAML といった形式統一が必要 |
| 保守コスト | 新しい外部サービスを追加するたびにコードベースが肥大化 |
MCP はこれらの問題点を 「メッセージ構造・認証方式・データ型変換」を標準化」 することで、「何を接続したいかだけを書けばよい」 開発体験を提供します。
ポイント
- LLM と外部リソースの接続点が一本化される → 実装・保守コストが大幅に削減
- 標準化されたスキーマはチーム間・プロジェクト間で再利用可能
2. Anthropic によるオープンソース化
Anthropic は 2024 年、社内で実証済みの Model Context Protocol を MIT / Apache‑2.0 デュアルライセンス で公開しました(公式リポジトリ: https://github.com/anthropic/mcp)。
- オープンソース化の狙い
- エコシステムを拡大し、サードパーティが独自プラグインや Connector を自由に開発できる基盤を提供
-
標準化によって安全性・透明性を担保しつつ、商用・非商用問わず利用可能
-
ライセンスのポイント
- MIT ライセンスは「ほぼ制限なし」だが、Apache‑2.0 の特許条項も同時に提供することで企業導入障壁を低減
LICENSEファイルとNOTICEに詳細が記載されているため、利用前に必ず確認してください
参考情報(信頼できる出典)
- Anthropic の公式ブログ記事「Introducing Model Context Protocol」https://www.anthropic.com/blog/mcp
- GitHub リポジトリのREADME.mdに実装例と設計方針が詳述されています
3. 公式リポジトリ取得から開発環境構築まで
3‑1. リポジトリ取得
|
1 2 3 4 5 |
git clone https://github.com/anthropic/mcp.git cd mcp # 必要に応じてサブモジュール(example‑providers 等)を初期化 git submodule update --init --recursive |
3‑2. 推奨環境
| 項目 | 推奨ツール・バージョン |
|---|---|
| コンテナランタイム | Docker Desktop ≥ 24.0、docker‑compose v2 |
| 言語 | Python ≥ 3.10(仮想環境推奨) |
| IDE | VS Code + Python / Docker 拡張 |
3‑3. Docker コンテナ起動
|
1 2 3 |
docker compose build # Dockerfile と compose がリポジトリに同梱済み docker compose up -d # バックグラウンドでローカルサーバー起動 |
起動後、http://localhost:8000/healthz にアクセスすると {"status":"ok"} が返ります。
3‑4. Python SDK のインストール
|
1 2 3 4 5 |
python -m venv .venv source .venv/bin/activate pip install --upgrade pip setuptools wheel pip install anthropic-mcp-sdk |
SDK は型安全なクライアント実装を提供し、非同期 I/O(asyncio) にも対応しています。
まとめ
GitHub からコードベースを取得し、Docker と Python SDK を整えるだけで、MCP のローカル開発環境が即座に利用可能です。
4. MCP の基本コンポーネントと設定例
MCP は大きく 3 つの要素 から構成されます。
| コンポーネント | 主な役割 |
|---|---|
| Connector | 外部リソース(REST API、DB、CLI 等)への入出力を抽象化 |
| Context Provider | LLM に渡すコンテキストデータの生成・変換ロジック |
| Message Envelope | リクエスト/レスポンスのペイロード形式とメタ情報(バージョン、Content‑Type 等) |
4‑1. YAML 設定ファイル例 mcp_config.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
server: host: "0.0.0.0" port: 8000 connectors: - name: "search_api" type: "rest" endpoint: "https://api.example.com/search" method: "GET" providers: - name: "keyword_extractor" type: "python" script_path: "./providers/keyword_extractor.py" envelope: version: "1.0" content_type: "application/json" |
4‑2. docker‑compose.yml の抜粋
|
1 2 3 4 5 6 7 8 9 10 |
services: mcp-server: image: anthropic/mcp:latest volumes: - ./mcp_config.yaml:/app/config.yaml:ro ports: - "8000:8000" environment: - LOG_LEVEL=info |
設定ファイルを変更すれば Connector や Provider の増減が即座に反映され、プロトタイプ段階でも柔軟に実験できます。
ポイント
設定はコードを書かずに済むため、インフラエンジニアとデータサイエンティストの協働がスムーズになります。
5. Claude(Anthropic LLM)への接続例 & 外部データ連携パターン
5‑1. 基本的な呼び出し(非同期)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import asyncio from anthropic_mcp_sdk import MCPClient async def call_claude(): client = MCPClient( base_url="http://localhost:8000", api_key="YOUR_MCP_API_KEY" ) request = { "model": "claude-3-opus-20240229", "messages": [ {"role": "user", "content": "最新の売上データを教えて"} ], "context": {"provider": "keyword_extractor"} # Provider 名 } response = await client.chat(request) print(response["choices"][0]["message"]["content"]) asyncio.run(call_claude()) |
5‑2. REST API 結果を注入するパターン
providers/search_provider.py
|
1 2 3 4 5 6 7 8 9 10 11 |
import requests def provide_context(query: str) -> dict: resp = requests.get( "https://api.example.com/search", params={"q": query, "limit": 5} ) data = resp.json() # 必要な情報だけ抽出して返す return {"search_results": [item["title"] for item in data["items"]]} |
mcp_config.yaml に search_provider を登録し、上記スクリプトを呼び出すだけで Claude のプロンプトに検索結果が自動付与 されます。
5‑3. データベース(PostgreSQL)連携例(非同期)
|
1 2 3 4 5 6 7 8 9 10 11 |
import asyncpg async def provide_context(query: str) -> dict: conn = await asyncpg.connect(dsn="postgresql://user:pwd@db:5432/app") rows = await conn.fetch( "SELECT title FROM articles WHERE ts_vector @@ plainto_tsquery($1) LIMIT 5", query ) await conn.close() return {"article_titles": [r["title"] for r in rows]} |
5‑4. CLI ツール出力の注入
|
1 2 3 4 5 6 7 8 9 10 |
import subprocess def provide_context(_: str) -> dict: result = subprocess.run( ["git", "log", "-1", "--pretty=%B"], capture_output=True, text=True ) return {"latest_commit_message": result.stdout.strip()} |
まとめ
SDK と Provider スクリプトさえ用意すれば、外部 API・DB・CLI の結果を シームレスに Claude へ注入 でき、実務レベルの AI アプリケーションが数行のコードで構築可能です。
6. 認証・安全性ベストプラクティスとトラブルシューティング
6‑1. 認証情報の管理
| 方法 | メリット |
|---|---|
環境変数(.env) |
コンテナ起動時に自動注入、コードベースから除外できる |
| シークレットマネージャー(AWS Secrets Manager・GCP Secret Manager) | ローテーションやアクセス監査が容易 |
| Vault 等のハードウェアキーモジュール | 高度な暗号化と多要素認証を提供 |
.env の例:
|
1 2 3 |
MCP_API_KEY=sk-xxxxxxxxxxxxxxxx MCP_RBAC_ROLE=developer |
docker‑compose.yml で環境変数を参照:
|
1 2 3 4 |
environment: - MCP_API_KEY=${MCP_API_KEY} - MCP_RBAC_ROLE=${MCP_RBAC_ROLE} |
6‑2. RBAC(ロールベースアクセス制御)の実装例
|
1 2 3 4 5 6 |
def check_role(client, required: str): if client.role != required: raise PermissionError(f"Role '{client.role}' lacks '{required}' permission") # 使用例 check_role(client, "admin") |
6‑3. よくあるエラーと対処法
| エラーコード | 想定シナリオ | 解決策 |
|---|---|---|
E001: Port conflict |
Docker が使用する 8000 ポートが他プロセスで占有 | docker compose down → lsof -i :8000 で確認、docker-compose.yml の ports を別ポートに変更 |
E010: Serialization mismatch |
Connector と Provider 間の JSON/YAML スキーマ不一致 | 両者のスキーマを schemas/ ディレクトリに保存し CI で自動バリデーション実施 |
E020: Authentication failed |
API キーが無効、または環境変数未設定 | .env に正しいキーを書き、docker compose up --env-file .env で再起動 |
6‑4. ロギングとモニタリング
- ログレベルは
LOG_LEVEL=info(デフォルト)かdebugに切り替えることで詳細情報を取得 - 分散トレーシングは OpenTelemetry 対応のコンテナイメージで有効化可能(設定は
envelope.trace_idフィールドに自動付与)
ポイント
認証・RBAC を徹底し、エラー対応表とロギングを整備すれば、本番環境でも安定的に MCP を運用できます。
7. まとめ
| 項目 | 内容 |
|---|---|
| MCP の意義 | LLM と外部リソースの接続点を一本化し、開発・保守コストを大幅削減 |
| オープンソース化 | Anthropic が 2024 年に MIT/Apache デュアルライセンスで公開。公式 GitHub にサンプルとドキュメントが整備 |
| 取得 & 環境構築手順 | git clone → Docker Compose 起動 → Python SDK インストール のシンプルフロー |
| 基本コンポーネント | Connector・Context Provider・Message Envelope の 3 要素で構成。設定ファイルだけで柔軟に拡張可能 |
| Claude への接続例 | 非同期 SDK と Python スクリプトで、REST API/DB/CLI の結果をシームレスに注入 |
| 安全性ベストプラクティス | 環境変数・シークレットマネージャーで認証情報管理、RBAC による権限分離、エラー対応表とロギングで障害復旧を迅速化 |
MCP は「AI 用 USB‑C」と呼ばれるだけの 概念実装ではなく、既に 公式リポジトリと安定版 SDK が提供された実用的なプロトコルです。この記事の手順に沿ってローカル環境を構築し、まずは簡単な Connector と Provider を作成してみましょう。その先には、社内データベースや外部検索エンジンと統合した本格的な AI アプリケーションが待っています。
次のステップ
1. git clone でリポジトリを取得
2. Docker と Python SDK をセットアップし、ヘルスチェックが通ることを確認
3. 自分のプロジェクトに合わせた Connector / Provider を実装してみる
MCP が提供する統一インターフェイスは、今後ますます多様化する LLM 活用シーンで 「接続=コードを書く」 のハードルを下げ、開発スピードと品質の両立を実現します。ぜひハンズオンで体感してください。