Contents
LLM と外部システムを安全に結ぶ新しい標準
1. 背景と目的
大規模言語モデル(LLM)は「テキストを生成する」ことが得意ですが、実務で求められるのは リアルタイムに外部データやサービスへアクセスできる ことです。従来は以下のような課題がありました。
| 課題 | 従来の対応例 |
|---|---|
| データ取得が手動またはバッチ中心 | スクリプトで定期的に DB を呼び出す |
| 外部 API 呼び出しがモデル内部にハードコーディングされる | 特定ベンダーの SDK に依存 |
| セキュリティや認証情報がコードに埋め込まれやすい | 環境変数だけで管理できず漏洩リスク |
MCP は 「LLM ↔ コンテキスト提供者(システム)」 の双方向インターフェースを標準化し、ベンダーロックインを防ぎながら安全にデータや機能を呼び出せるよう設計されたオープンプロトコルです。
ポイント
- プロトコル自体はオープンで、Google Cloud の公式ページでも概要が公開されています(※2024年10月時点)。
- 既存のクラウドベンダーやオンプレミス環境に対しても同一インターフェースで利用可能です。
2. 基本構造とメッセージ形式
2‑1. 三層アーキテクチャ
MCP の通信は次の 3 つの層 に分かれます。
- ヘッダー
- プロトコルバージョン(例:
1.2) - 認証情報(API キー、JWT など)
-
メッセージ種別 (
request/response) -
ペイロード
- 呼び出す関数名と引数を JSON または MessagePack で記述
-
スキーマは OpenAPI 互換で定義でき、型安全性が確保されます
-
シリアライズ方式
- 人が読む必要がある場面は JSON(可読性重視)
- バイナリ転送や高速化が求められる場合は MessagePack を推奨
2‑2. メッセージ例(JSON)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "header": { "version": "1.2", "auth": "Bearer <YOUR_TOKEN>", "type": "request" }, "payload": { "function": "fetch_customer_data", "args": { "customer_id": "C12345" } } } |
- ヘッダー と ペイロード が明確に分離されているため、認証ロジックだけを別モジュールで実装できます。
- MessagePack バージョンは同構造のバイト列にエンコードしただけなので、クライアント/サーバー間の差し替えが容易です。
3. クライアント/サーバーロールと実装例(BlastEngine)
3‑1. ロールモデル
| ロール | 主な役割 |
|---|---|
| クライアント (LLM 側) | プロンプトや関数呼び出しシンタックスで 指示 を生成。認証情報をヘッダーに添付してサーバーへ送信。 |
| サーバー (リソース提供側) | 受信したリクエストを解析・認可し、内部ジョブキューや外部 API にディスパッチ。結果を response メッセージで返却。 |
3‑2. BlastEngine における具体フロー(Python クライアント)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# blastengine_client.py import os from mcp_sdk import Client # 公式 SDK(仮称) client = Client( api_key=os.getenv("MCP_API_KEY"), endpoint="https://api.blastengine.com/mcp" ) def send_email(to, subject, body): resp = client.invoke( function="send_email", args={"to": to, "subject": subject, "body": body} ) return resp["result"] if __name__ == "__main__": print(send_email("user@example.com", "ご挨拶", "こんにちは!")) |
client.invokeが内部で ヘッダー+ペイロード を組み立て、TLS 経由でサーバーに送信します。- サーバー側は認証トークンを検証し、メール配信ジョブをキックした後に結果 (
sent,failedなど) を JSON で返却。
3‑3. サーバー実装(Node.js + Express)
|
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 38 39 40 41 42 |
// blastengine_server.mjs import express from "express"; import jwt from "jsonwebtoken"; const app = express(); app.use(express.json()); // JWT 認証ミドルウェア function verifyToken(req, res, next) { const auth = req.headers["authorization"]; if (!auth) return res.status(401).json({ error: "Missing token" }); const token = auth.split(" ")[1]; try { req.user = jwt.verify(token, process.env.JWT_SECRET); next(); } catch (e) { res.status(403).json({ error: "Invalid token" }); } } // エンドポイント app.post("/mcp", verifyToken, (req, res) => { const { function: fn, args } = req.body.payload; // 簡易ディスパッチ例 let result; if (fn === "send_email") { // 本来はメール配信サービスへ委譲する result = { status: "sent", to: args.to }; } else { result = { error: "unknown function" }; } res.json({ header: { version: "1.2", type: "response" }, payload: { result } }); }); app.listen(443, () => console.log("MCP server listening on TLS")); |
- TLS は外部のリバースプロキシ(例: Nginx)で終端させることが一般的です。
verifyTokenによって 最小権限の原則 が担保され、認可ロジックは関数ごとに細かく設定できます。
4. ハンズオン:環境構築から「Hello MCP」まで
4‑1. 前提条件
| 項目 | 推奨バージョン / 設定 |
|---|---|
| OS | Linux/macOS/Windows (WSL 推奨) |
| Python | 3.11 以上 (pip install mcp-sdk) |
| Node.js | 18.x 以上 (npm i @mcp/sdk) |
| TLS | サーバーは必ず TLS 1.2+ を有効化 |
| 認証 | API キーまたは JWT(管理コンソールで取得) |
4‑2. SDK の取得
|
1 2 3 4 5 6 |
# Python pip install mcp-sdk # PyPI に公開中 # Node.js npm i @mcp/sdk # npm registry に掲載 |
注:公式ページは Google Cloud の MCP ドキュメントに最新リンクが掲載されています(2024 年 10 月版)。
4‑3. クライアント側サンプルコード
Python(hello_mcp.py)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import os from mcp_sdk import Client client = Client( api_key=os.getenv("MCP_API_KEY"), endpoint="https://api.blastengine.com/mcp" ) def hello(): resp = client.invoke( function="echo", args={"message": "Hello MCP"} ) print("サーバー応答:", resp["result"]) if __name__ == "__main__": hello() |
Node.js(hello_mcp.mjs)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import { Client } from "@mcp/sdk"; import dotenv from "dotenv"; dotenv.config(); const client = new Client({ apiKey: process.env.MCP_API_KEY, endpoint: "https://api.blastengine.com/mcp" }); async function hello() { const resp = await client.invoke("echo", { message: "Hello MCP" }); console.log("サーバー応答:", resp.result); } hello().catch(console.error); |
- ポイント
- 認証情報は環境変数で管理し、コードにハードコーディングしない。
invokeが内部的に JSON シリアライズと TLS 接続を行うので、開発者は関数名と引数だけを書けば OK。
4‑4. サーバー側の最小構築手順(Express + JWT)
- TLS 終端
-
Nginx/Apache に
ssl_certificateとssl_certificate_keyを設定し、ssl_protocols TLSv1.2 TLSv1.3;を有効化。 -
認証ミドルウェア(上記コード参照)
-
関数ディスパッチ
handleFunction(fn, args)の形でプラグイン方式にすれば、後から機能追加が容易です。
5. 主なユースケースとベストプラクティス
5‑1. ユースケース例
| カテゴリ | 具体シナリオ |
|---|---|
| マーケティング自動化 | LLM が「今月のキャンペーンレポート」を生成し、同時にメール配信ジョブを BlastEngine に委託。 |
| データ取得・加工 | 外部 DB へクエリを投げ、取得した CSV を要約・可視化してレポートを作成。 |
| 外部 AI モデル呼び出し | SIGNATE の機械学習モデルを MCP 経由で実行し、予測結果を自然言語で説明。 |
5‑2. セキュリティベストプラクティス
- TLS 強制:全通信は HTTPS(TLS 1.2 以上)に限定。
- 認証情報の管理:環境変数、または GCP Secret Manager・AWS Secrets Manager 等の外部シークレットサービスを使用。
- 最小権限:クライアントごとに許可された関数リストやデータセットをポリシーで制御。
- 監査ログ:サーバーはリクエスト/レスポンスの JSON ログを永続化し、異常検知やコンプライアンス対応に利用。
5‑3. トラブルシューティング・チェックリスト
| エラー | 主な原因 | 確認ポイント |
|---|---|---|
401 Unauthorized |
API キー未設定、期限切れ | .env の MCP_API_KEY が正しいか、管理コンソールで新規キーを発行。 |
403 Forbidden |
JWT 署名不一致 | サーバーとクライアントの JWT_SECRET が同一か確認。 |
400 Bad Request (payload invalid) |
必須フィールド欠落・型不整合 | スキーマ (OpenAPI) に沿った JSON/MessagePack を送信しているか。 |
500 Internal Server Error |
サーバー側ロジック例外 | /var/log/mcp_server.log でスタックトレースを確認し、関数実装をデバッグ。 |
6. 情報源とコミュニティ
| 種別 | URL / リソース |
|---|---|
| 公式ドキュメント | Google Cloud の MCP ページ(2024 10 版) |
| SDK リポジトリ | GitHub: github.com/model-context-protocol/sdk |
| フォーラム | MCP Forum – https://forum.mcp.dev |
| 実装サンプル | BlastEngine 公式ブログ(英語)・GitHub の blastengine/mcp-demo |
- 定期的にリリースノートが更新されるので、バージョンアップ時は必ず CHANGELOG を確認してください。
7. 最後に
MCP は「LLM が外部システムを安全かつ標準化された形で呼び出す」ためのインフラストラクチャーです。
- クライアントは 指示生成 に専念し、サーバーは リソース提供・認可 を担うことで責務が明確化されます。
- メッセージ構造はシンプルな「ヘッダー+ペイロード」=JSON/MessagePack で実装でき、言語やフレームワークに依存しません。
- 前提条件を揃えて公式 SDK をインストールすれば、数行のコードで Hello MCP が動作します。
本稿の手順とベストプラクティスに従って環境構築すれば、マーケティング自動化やデータ分析、外部 AI 呼び出しといったさまざまなユースケースを迅速にプロトタイプできます。ぜひ実際に試してみてください。