MCP 3.0プロトコル詳解:AIとツールの架け橋
MCP 3.0プロトコルを深く理解し、Server開発からClient開発、セキュリティプラクティスまで完全にマスターしましょう。本記事ではMCPプロトコルの設計思想と実践的な開発ガイドを提供します。
MCPとは
MCP(Model Context Protocol)はAnthropicが提案したオープンプロトコルで、AIモデルと外部ツール間の標準化された通信方法を定義します。MCPの目標は、AIアプリケーションがデータソースやツールに安全に接続できるようにする「AIのためのUSB-C」になることです。
MCP 3.0はプロトコルの最新メジャーバージョンで、ストリーミングサポート、改善された認証メカニズム、より強力な型システムなど、多くの重要な新機能を導入しています。これにより、より複雑なAIアプリケーションシナリオをサポートできるようになりました。
MCPの核心的価値
MCPは統一されたプロトコルを提供することで、開発者が各ツールのために独自の統合コードを書く必要をなくします。MCP Serverを実装するだけで、Claude、GPT、Geminiなど、MCPをサポートするすべてのAIモデルがあなたのツールを利用できるようになります。
コアコンセプト
MCPのアーキテクチャはクライアント・サーバーモデルに基づいており、以下の核心的な概念が含まれています。
Host
AIモデルを実行するアプリケーション(Claude Desktop、IDEプラグインなど)。ユーザーとの対話を管理し、MCP Clientのライフサイクルを制御します。
Client
Host内でServerとの1対1の接続を維持するコンポーネント。プロトコルのバージョン交渉、機能発見、メッセージルーティングを処理します。
Server
特定機能を提供する軽量プログラム。ツール、リソース、プロンプトの3つのプリミティブを通じてAIに機能を公開します。
3つのプリミティブ
Tools(ツール)
AIが呼び出し可能な関数。例:ファイル読み書き、データベースクエリ、API呼び出し。各ツールは名前、説明、入力スキーマを定義します。
Resources(リソース)
AIが読み取れるデータソース。例:ファイル内容、データベースレコード、API応答。URIで識別され、MIMEタイプを持ちます。
Prompts(プロンプト)
再利用可能なプロンプトテンプレート。パラメータ化をサポートし、ユーザー定義のプロンプトや一般的なタスクテンプレートを含みます。
Server開発
MCP Serverの開発は、公式が提供するSDKを使用することで非常に簡単です。以下はPython SDKを使用した例です。
基本的なServer
from mcp.server import Server
from mcp.types import Tool, TextContent
app = Server("my-mcp-server")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="get_weather",
description="指定された都市の天気情報を取得",
inputSchema={
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "都市名"
}
},
"required": ["city"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "get_weather":
city = arguments["city"]
weather_data = await fetch_weather(city)
return [TextContent(
type="text",
text=f"{city}の天気:{weather_data['temp']}°C、{weather_data['condition']}"
)]
raise ValueError(f"不明なツール: {name}")
async def fetch_weather(city: str) -> dict:
return {"temp": 22, "condition": "晴れ"}
リソースの追加
@app.list_resources()
async def list_resources() -> list[Resource]:
return [
Resource(
uri="file:///project/README.md",
name="プロジェクトREADME",
description="プロジェクトの説明文書",
mimeType="text/markdown"
)
]
@app.read_resource()
async def read_resource(uri: str) -> str:
if uri == "file:///project/README.md":
with open("README.md", "r") as f:
return f.read()
raise ValueError(f"不明なリソース: {uri}")
Client開発
MCP ClientはAIモデルとMCP Server間の橋渡しをします。ClientはServerへの接続、機能の発見、ツール呼び出しの管理を担当します。
from mcp.client import Client
from mcp.client.stdio import stdio_client
async def main():
async with stdio_client("python", ["server.py"]) as (read, write):
async with Client(read, write) as client:
# Serverの機能を初期化して発見
result = await client.initialize()
print(f"Server: {result.serverInfo.name}")
print(f"バージョン: {result.serverInfo.version}")
# 利用可能なツールをリスト
tools = await client.list_tools()
for tool in tools:
print(f"ツール: {tool.name} - {tool.description}")
# ツールを呼び出し
response = await client.call_tool(
"get_weather",
arguments={"city": "東京"}
)
print(f"結果: {response.content[0].text}")
# リソースを読み取り
resources = await client.list_resources()
for resource in resources:
content = await client.read_resource(resource.uri)
print(f"リソース {resource.name}: {content[:100]}...")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
セキュリティプラクティス
MCPアプリケーションのセキュリティは極めて重要です。以下は必須のセキュリティプラクティスです。
入力バリデーション
すべてのツール入力を厳格にバリデーションし、インジェクション攻撃を防止してください。JSON Schemaバリデーションを使用し、入力パラメータの型と範囲を検証しましょう。
権限管理
最小権限の原則に従い、ツールが必要最小限の権限のみを持つようにしてください。ファイルアクセスは特定のディレクトリに制限し、ネットワークアクセスは特定のドメインに制限しましょう。
トランスポートセキュリティ
本番環境では暗号化されたトランスポート(TLS)を使用してください。ローカル開発ではstdioトランスポートを使用できますが、リモート接続では必ずSSEまたはストリーミング可能なHTTPを使用しましょう。
監査ログ
すべてのツール呼び出しを記録し、監査とデバッグを可能にしてください。ログにはタイムスタンプ、呼び出し元、パラメータ、結果を含めましょう。
デプロイガイド
MCP Serverを本番環境にデプロイするための完全なガイドです。
Dockerを使用したデプロイ
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "-m", "mcp_server", "--transport", "sse", "--port", "8080"]
# docker-compose.yml
version: '3.8'
services:
mcp-server:
build: .
ports:
- "8080:8080"
environment:
- MCP_TRANSPORT=sse
- MCP_PORT=8080
- LOG_LEVEL=info
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
Claude Desktopの設定
{
"mcpServers": {
"my-server": {
"command": "python",
"args": ["-m", "mcp_server"],
"env": {
"API_KEY": "your-api-key"
}
},
"remote-server": {
"url": "http://localhost:8080/sse",
"headers": {
"Authorization": "Bearer your-token"
}
}
}
}
まとめ
MCP 3.0はAIとツールの架け橋として、標準化されたプロトコルを提供します。統一されたインターフェースにより、開発者は一度Serverを開発するだけで、すべてのMCP対応AIモデルがツールを利用できるようになります。
MCPの核心的価値は標準化にあります。各AIモデルのために独自の統合コードを書く必要はなく、MCP Serverを実装するだけで、Claude、GPT、Geminiなど、MCPをサポートするすべてのAIモデルがあなたのツールを利用できるようになります。
オープンプロトコルとして、MCPはコミュニティの参加と貢献を歓迎しています。MCPエコシステムの発展に共に貢献しましょう。