Zenn
🔌

初心者向け Model Context Protocol(MCP)完全ガイド:LLMと外部ツールを繋ぐ標準プロトコル

2025/03/31に公開
2

初心者向け Model Context Protocol(MCP)完全ガイド:LLMと外部ツールを繋ぐ標準プロトコル

最近のAI開発において、大規模言語モデル(LLM)は驚異的な進化を遂げています。しかし、これらのモデルがどれほど優れていても、外部データソースやツールと効率的に連携できなければ、その能力は制限されてしまいます。

そこで登場したのが Model Context Protocol(MCP) です。この記事では、MCPとは何か、なぜ重要なのか、そしてどのように活用できるのかを初心者向けに解説します。

MCPとは何か

Model Context Protocol(MCP)は、LLMアプリケーションと外部データソースやツールとの間をシームレスに連携させるためのオープンプロトコルです。Anthropicが開発し、現在はオープンソースとして公開されています。

MCPの概念図
出典: Model Context Protocol 公式サイト

MCPは、「AI用のUSB-C」とも表現されています。USBがさまざまなデバイスを標準化された方法でコンピュータに接続できるように、MCPはAIモデルが異なるデータソースやツールと標準化された方法で接続できるようにします。

LLMと外部ツール連携の課題

LLMが外部ツールと連携する際には、いくつかの課題があります:

  1. インターフェースの不一致: 各AIプラットフォームやツールは独自のAPIやインターフェースを持ち、互換性がない
  2. セキュリティリスク: 外部ツールへのアクセス権限管理が難しい
  3. 実装の複雑さ: 異なるシステム間の連携には複雑な実装が必要
  4. 標準化の欠如: 共通のプロトコルが存在しないため、連携のたびに独自の実装が必要

MCPが解決する問題

MCPはこれらの課題に対して、以下のような解決策を提供します:

  • 標準化されたインターフェース: 異なるAIモデルとツール間の共通言語を提供
  • セキュリティの向上: ローカルデータへのアクセスをより安全に管理
  • プラグアンドプレイ: 既存のMCPサーバーを簡単に接続可能
  • ベンダーロックインの回避: 特定のAIプロバイダーに依存しない設計

MCPのアーキテクチャ
出典: Model Context Protocol 公式サイト

MCPの基本概念

クライアント-サーバーアーキテクチャ

MCPは基本的にクライアント-サーバーアーキテクチャを採用しています。このアーキテクチャでは以下の要素が重要です:

  • ホスト: Claude Desktop、IDEなどのLLMアプリケーション
  • クライアント: サーバーとの1:1の接続を維持するプロトコルクライアント
  • サーバー: 標準化されたプロトコルを通じて特定の機能を提供する軽量プログラム

MCPの全体アーキテクチャ
出典: Model Context Protocol ドキュメント

ホスト、クライアント、サーバーの関係

MCPにおける各要素の関係を整理すると:

  1. ホストは、エンドユーザーが直接操作するアプリケーション(例:Claude for Desktop)です
  2. クライアントは、ホスト内に組み込まれ、サーバーとの通信を管理します
  3. サーバーは、外部データやツールへのアクセスを提供します

ユーザーがホストでリクエストを行うと、クライアントを通じてサーバーにリクエストが送信され、サーバーが外部リソースにアクセスして結果を返します。

プロトコルの基本構成

MCPプロトコルは、以下の基本的な要素で構成されています:

  1. トランスポート層: クライアントとサーバー間の通信を処理(stdio、HTTPなど)
  2. プロトコル層: メッセージフレーミング、リクエスト/レスポンスのリンク付けなどを処理
  3. メッセージタイプ: リクエスト、レスポンス、通知などの標準化されたメッセージ形式
// MCPプロトコルの基本的な例
class Protocol<Request, Notification, Result> {
  // 受信リクエストの処理
  setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void
  
  // 受信通知の処理
  setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void
  
  // リクエストを送信し、レスポンスを待機
  request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>
  
  // 一方向の通知を送信
  notification(notification: Notification): Promise<void>
}

MCPの主要機能

MCPサーバーは主に3つの機能を提供します:リソース、ツール、プロンプトです。

リソース

リソースは、サーバーが提供するファイルのようなデータです。クライアントがアクセスして読み取ることができます。

例えば:

  • ドキュメントやテキストファイル
  • APIからのレスポンス
  • データベースクエリの結果

リソースは URI(Uniform Resource Identifier)で識別され、クライアントはこの URI を使用してリソースにアクセスします。

// リソースの例
{
  uri: "example://documents/report.md",
  name: "四半期レポート",
  contentType: "text/markdown"
}

ツール

ツールは、LLMがユーザーの許可を得て呼び出すことができる実行可能な関数です。ツールを使用することで、LLMは外部システムとのインタラクションや計算、実世界でのアクションを実行できます。

// ツールの定義例
{
  name: "calculate_sum",
  description: "2つの数値を足し合わせる",
  inputSchema: {
    type: "object",
    properties: {
      a: { type: "number" },
      b: { type: "number" }
    },
    required: ["a", "b"]
  }
}

ツールの実装例:

@mcp.tool()
async def get_weather(city: str) -> str:
    """指定された都市の天気を取得します。
    
    Args:
        city: 都市名(例:東京、ニューヨーク)
    """
    weather_data = await fetch_weather_api(city)
    return format_weather_data(weather_data)

プロンプト

プロンプトは、ユーザーが特定のタスクを達成するのに役立つ事前に作成されたテンプレートです。これにより、LLMに対する効果的な指示を簡単に提供できます。

// プロンプトの例
{
  id: "code-review",
  name: "コードレビュー",
  description: "提出されたコードをレビューし、問題点や改善点を指摘します",
  template: "以下のコードをレビューし、バグ、セキュリティ問題、パフォーマンス上の問題を指摘してください:\n\n{{code}}"
}

MCPの実装方法

サポートされている言語SDK

MCPは現在、以下の言語でSDKを提供しています:

基本的な実装フロー

MCPサーバーの基本的な実装フローは以下の通りです:

  1. 適切なSDKをインストール
  2. サーバーインスタンスを初期化
  3. 機能(リソース、ツール、プロンプト)を定義
  4. トランスポートを設定(stdio、HTTP等)
  5. サーバーを実行

サーバー実装の例

以下は、Python SDKを使用した簡単な天気予報MCPサーバーの実装例です:

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# FastMCPサーバーの初期化
mcp = FastMCP("weather")

# 定数
API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

# ヘルパー関数
async def fetch_api(url: str) -> dict[str, Any] | None:
    """APIリクエストを実行してレスポンスを取得"""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/geo+json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

# ツールの実装
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
    """指定された座標の天気予報を取得します。
    
    Args:
        latitude: 緯度
        longitude: 経度
    """
    # 予報グリッドエンドポイントの取得
    points_url = f"{API_BASE}/points/{latitude},{longitude}"
    points_data = await fetch_api(points_url)
    
    if not points_data:
        return "この場所の予報データを取得できませんでした。"
    
    # ポイントレスポンスから予報URLを取得
    forecast_url = points_data["properties"]["forecast"]
    forecast_data = await fetch_api(forecast_url)
    
    if not forecast_data:
        return "詳細な予報を取得できませんでした。"
    
    # 期間を読みやすい予報にフォーマット
    periods = forecast_data["properties"]["periods"]
    forecasts = []
    
    for period in periods[:5]:  # 次の5期間のみ表示
        forecast = f"""
{period['name']}:
気温: {period['temperature']}°{period['temperatureUnit']}
風: {period['windSpeed']} {period['windDirection']}
予報: {period['detailedForecast']}
"""
        forecasts.append(forecast)
    
    return "\n---\n".join(forecasts)

# サーバーの実行
if __name__ == "__main__":
    mcp.run(transport='stdio')

実際の使用事例

Claude for Desktop

現在、最も一般的なMCPの使用例はClaude for Desktopとの統合です。Claude for Desktopは、MCPサーバーを介して外部ツールやデータにアクセスする機能をサポートしています。

Claude for Desktop MCPツール統合
出典: Model Context Protocol ドキュメント

例えば、天気予報サーバーをClaude for Desktopに接続すると、ユーザーは自然言語で天気について質問することができ、Claudeはバックグラウンドでサーバーを呼び出して最新の天気データを取得します。

開発ツール連携

MCPは開発環境やIDE内でも活用されています。例えば:

  • Replit: MCPを活用したAI開発環境
  • Codeium: コード補完ツールがMCPをサポート
  • GitHub MCP Server: リポジトリ操作をLLMに許可

これらの統合により、開発者はLLMを使用してコードレビュー、バグ修正、コミット作成などのタスクを自然言語で指示できるようになっています。

その他の活用例

MCPの柔軟性により、さまざまな分野での活用が可能です:

  • データ分析: CSVファイルやデータベースへのアクセスとクエリ
  • ドキュメント処理: 社内文書の検索と参照
  • API統合: 外部APIとの安全な連携
  • ローカルアプリケーション制御: ローカルアプリとLLMの連携

MCPの将来性

メリットと可能性

MCPの採用によって得られる主なメリットは:

  1. 相互運用性: 異なるLLMとツールの組み合わせが容易になる
  2. 安全性: ローカルデータへのアクセスをより安全に管理
  3. 拡張性: 新しいツールやリソースを簡単に追加可能
  4. 一貫性: すべてのAIアプリケーションで同じツールセットを使用可能

将来的には、MCPが多くのAIアプリケーションにおける標準的な連携方法となり、AIエコシステム全体の相互運用性が向上することが期待されています。

現状の課題

MCPは有望な技術ですが、いくつかの課題もあります:

  1. 採用状況: まだ比較的新しいプロトコルであり、広範な採用には時間がかかる
  2. セキュリティ考慮事項: 外部ツールへのアクセス許可の管理は慎重に行う必要がある
  3. 実装の複雑さ: 複雑なユースケースでは実装が難しい場合がある
  4. 標準化の継続的発展: プロトコル自体がまだ発展段階にある

今後の展望

MCPの将来に向けた有望な方向性として:

  1. より多くのSDKとツール: さらに多くの言語とプラットフォームへの対応
  2. エコシステムの拡大: より多くのアプリケーションとサービスがMCPをサポート
  3. 標準化の進化: プロトコルの機能と安全性の継続的改善
  4. コミュニティ成長: オープンソースコミュニティの活発な参加

まとめ

Model Context Protocol(MCP)は、LLMと外部ツール・データソースを接続するための標準化されたプロトコルです。「AI用のUSB-C」として機能し、互換性、安全性、拡張性を提供します。

MCPを利用することで:

  • 異なるLLMとツール間の連携が容易になる
  • 安全にローカルリソースへアクセスできる
  • 標準化されたインターフェースで開発効率が向上する
  • ベンダーロックインを避け、柔軟なAIエコシステムを構築できる

AI技術の急速な発展に伴い、MCPのような標準プロトコルの重要性はますます高まっています。MCPは現在も活発に開発が続いており、将来的にはAI連携のデファクトスタンダードとなる可能性を秘めています。

参考リソース

2
Accenture Japan (有志)

Discussion

ログインするとコメントできます