Skill Hub
チュートリアル 2026年6月 読了時間 25 分

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エコシステムの発展に共に貢献しましょう。

このチュートリアルは役に立ちましたか?

新しい知識を得られたなら、ぜひ他の人と共有したり、あなたの経験を投稿してください。

今すぐ投稿