コンテンツにスキップ

Model Context Protocol(MCP)

MCPはAIモデルと外部ツール・データソースを接続するためのオープンプロトコルです。Anthropicが策定し、業界標準として広がっています。


MCPとは何か

従来、各AIアプリが個別にツール連携を実装していた。MCPはこれを標準化する。

従来:  AIアプリA ──独自実装──→ ツールX
       AIアプリB ──独自実装──→ ツールX  (同じツールなのに2回実装)

MCP:   AIアプリA ─┐
                  ├── MCP ──→ MCPサーバー(ツールX)  (1回の実装で複数アプリが利用)
       AIアプリB ─┘

USBのような「統一インターフェース」をAIツール連携に提供する。


アーキテクチャ

MCPは3つのレイヤーで構成される。

┌──────────┐     ┌──────────┐     ┌──────────┐
│   Host   │────▶│  Client  │────▶│  Server  │
│(Claude等)│     │(SDK内蔵) │     │(ツール)  │
└──────────┘     └──────────┘     └──────────┘
レイヤー 役割
Host ユーザーが操作するアプリ Claude Desktop, IDE
Client MCPプロトコルの通信管理 SDK内のMCPクライアント
Server ツール・データを提供 ファイル操作サーバー、DB検索サーバー

トランスポート

MCPの通信方式は2つ。

stdio(標準入出力)

ローカル実行向け。サーバーを子プロセスとして起動し、stdin/stdoutで通信。

Host ──stdin/stdout──▶ Server(ローカルプロセス)
  • セットアップが簡単
  • セキュリティリスクが低い(ローカル通信)
  • Claude Desktopでの主な方式

Streamable HTTP

リモート実行向け。HTTPでサーバーと通信し、Server-Sent Events(SSE)でストリーミング。

Host ──HTTP POST──▶ Server(リモート)
     ◀──SSE────────
  • リモートサーバーに対応
  • 複数クライアントから共有可能
  • 認証・認可の仕組みを組み込める

3つのプリミティブ

MCPサーバーが提供できる機能は3種類。

1. Tools(ツール)

モデルが呼び出すアクション。API呼び出しやDB操作など。

{
  "name": "search_database",
  "description": "データベースを検索する",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {"type": "string"}
    }
  }
}
  • Claude APIのTool Useと連携
  • モデルが「いつ使うか」を判断

2. Resources(リソース)

アプリが読み取るデータ。ファイルの内容やDB内のレコードなど。

{
  "uri": "file:///path/to/document.md",
  "name": "プロジェクトREADME",
  "mimeType": "text/markdown"
}
  • コンテキストとしてモデルに提供
  • ユーザーやアプリが「何を読むか」を選択

3. Prompts(プロンプト)

ユーザーが選ぶテンプレート。繰り返し使うプロンプトパターンを再利用可能にする。

{
  "name": "code_review",
  "description": "コードレビュー用プロンプト",
  "arguments": [
    {"name": "language", "description": "プログラミング言語"}
  ]
}

使い分け

プリミティブ 誰が制御 用途
Tools モデル アクション実行
Resources アプリ/ユーザー データ読み取り
Prompts ユーザー テンプレート呼び出し

Pythonでのサーバー実装

mcp パッケージを使った最小限のMCPサーバー。

インストール

pip install mcp

基本的なサーバー

from mcp.server.fastmcp import FastMCP

# サーバーを作成
mcp = FastMCP("weather-server")

# ツールを定義
@mcp.tool()
def get_weather(city: str) -> str:
    """指定された都市の天気を取得する"""
    # 実際にはAPIを叩く
    return f"{city}の天気: 晴れ、22°C"

# リソースを定義
@mcp.resource("config://app")
def get_config() -> str:
    """アプリ設定を返す"""
    return '{"theme": "dark", "language": "ja"}'

# サーバー起動
if __name__ == "__main__":
    mcp.run()

実行

# stdioトランスポートで起動(デフォルト)
python weather_server.py

# HTTPトランスポートで起動
python weather_server.py --transport streamable-http --port 8000

Claude Desktopでの設定

claude_desktop_config.json にサーバーを登録する。

設定ファイルの場所

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

設定例

{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["/path/to/weather_server.py"]
    },
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Documents"
      ]
    }
  }
}

公開MCPサーバー

ファイル操作、GitHub、Slack、データベースなど、すぐ使えるMCPサーバーが多数公開されている。 MCP Servers リスト を参照。


参考リンク