powered by TechFeed
表示モード
Deep Dive

AIエージェントとツール連携の「M×N問題」を解決するMCP — OpenAIとGoogleも採用、月間9700万ダウンロードの標準プロトコルをコード付きで解説

7月29日、Towards Data Scienceが「MCP Explained: How Modern AI Agents Connect to the Real World」と題した記事を公開した。この記事では、AIエージェントが外部ツールと連携する際の統一プロトコル「Model Context Protocol(MCP)」の仕組みと実装方法について詳しく紹介されている。

7月29日、Towards Data Scienceが「MCP Explained: How Modern AI Agents Connect to the Real World」と題した記事を公開した。この記事では、AIエージェントが外部ツールと連携する際の統一プロトコル「Model Context Protocol(MCP)」の仕組みと実装方法について詳しく紹介されている。


「M×N問題」:カスタム統合が抱える根本的なスケール問題

AIエージェントに外部ツールを接続する際、従来はモデルとツールの組み合わせごとにカスタム統合コードを書く必要があった。モデルが3つ、ツールが10種類あれば、最大で30本の統合コードが必要になる計算だ。どれか1つの仕様が変われば、関連する統合コードがすべて壊れるリスクがある。

これは「M×N問題」と呼ばれる。M個のモデルとN個のツールが存在する場合、M×N本のカスタム統合が必要になるという構造的な問題だ。

記事ではこれをUSBの普及前のコンピュータ周辺機器に例えている。プリンタや鍵盤がそれぞれ独自のコネクタを持ち、特定のコンピュータにしか繋がらなかった時代と同じ状況だ。USBという統一規格が登場して初めて「どのデバイスでも、どのPCでも繋がる」世界になった。MCPはAIエージェントにおけるそのUSBに相当する。


MCPの基本構造:Host・Client・Server

Model Context Protocol(MCP)はAnthropicが開発し、2024年11月にオープンソースとして公開したプロトコルだ。アーキテクチャは以下の3要素で構成される。

  • Host:ユーザーが直接操作するAIアプリケーション(Claude Desktop、VS Code拡張など)。モデルのコンテキストウィンドウを管理し、ツール呼び出しのタイミングを制御する。
  • Client:Host内部に存在し、MCPサーバーとの接続を管理するコンポーネント。MCPプロトコルの実装部分にあたる。
  • Server:実際のツールやデータが置かれる場所。LLMとは直接通信せず、必ずClientを介して通信する。

MCPサーバーが公開できる「ケイパビリティ」は3種類ある。

  1. Tools:データベースへのクエリ、メール送信、API呼び出しなど、実行可能な操作。結果をモデルに返す。セキュリティ上の考慮が最も必要な要素でもある。
  2. Resources:ファイル内容やDBレコードなど、読み取り専用のデータアクセス。状態を変更しない。
  3. Prompts:コードレビューの多ステップワークフローのように、複数のステップや条件分岐を含む処理を1つのテンプレートとして定義し、繰り返し呼び出せる再利用可能なプロンプトテンプレート。ホストやクライアントがユーザーにサジェストする用途でも使われる。

PythonでのMCPサーバー実装:これだけでいい

記事では、公式MCP SDKを使った最小構成のサーバー実装が紹介されている。天気情報を返すツールを例に、実際のコードを見てみよう。

from mcp.server.fastmcp import FastMCP
import requests

mcp = FastMCP("weather-server")

@mcp.tool()
def get_current_weather(city: str, unit: str = "celsius") -> dict:
    """Get the current weather for a given city using Open-Meteo."""
    geo = requests.get(
        "https://geocoding-api.open-meteo.com/v1/search",
        params={"name": city, "count": 1}
    ).json()
    lat = geo["results"][0]["latitude"]
    lon = geo["results"][0]["longitude"]

    weather = requests.get(
        "https://api.open-meteo.com/v1/forecast",
        params={
            "latitude": lat,
            "longitude": lon,
            "current": "temperature_2m,weather_code",
            "temperature_unit": unit
        }
    ).json()
    return {
        "city": city,
        "temperature": weather["current"]["temperature_2m"],
        "unit": unit
    }

if __name__ == "__main__":
    mcp.run()

ポイントは@mcp.tool()デコレータだ。型ヒントからJSONスキーマを自動生成し、MCP対応のホストからディスカバリー可能な状態にする。モデル固有のアダプタコードは一切不要だ。

クライアント側は以下のように実装する。実行時にサーバーが公開しているツール一覧を動的に取得できる点が重要だ。

from anthropic import Anthropic
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def run_agent_with_mcp():
    server_params = StdioServerParameters(
        command="python",
        args=["weather_server.py"]
    )
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            tools = await session.list_tools()
            print(f"Available tools: {[t.name for t in tools.tools]}")
            # Available tools: ['get_current_weather']

            result = await session.call_tool(
                "get_current_weather",
                arguments={"city": "Athens", "unit": "celsius"}
            )
            print(result.content)
            # {'city': 'Athens', 'temperature': 29.0, 'unit': 'celsius'}

ハードコードされた統合コードから、動的にディスカバリー可能なケイパビリティへ——これがMCPがもたらす本質的な変化だ。


急速な普及と標準化の流れ

MCPの採用状況は数字が示している。2024年11月のローンチ時は月間SDKダウンロード数が約10万件だったが、2025年3月にOpenAIが公式採用、同年4月にはGoogleがGeminiへのMCPサポートを表明し「AIエージェント時代のオープンスタンダードになりつつある」と述べた。2025年3月時点でPythonとTypeScriptのSDKの合計月間ダウンロード数は9,700万件に達している。

2025年12月にはAnthropicがMCPをAgentic AI Foundation(AAIF)に寄贈した。AAIFはLinux Foundationの傘下に設立された組織だ。KubernetesやPyTorchと同じLinux Foundationのポートフォリオに加わったことで、単一ベンダーのプロジェクトではなくなった。

現在はMCP Registryを通じてGitHubSlackPostgreSQLDockerKubernetesなど数百のMCPサーバーが公開されており、既存のものを使う場合は「エンジニアリングの問題」ではなく「設定の問題」になりつつある。


セキュリティ:見落としてはいけない3つのリスク

MCPがツールへのアクセスを広げる分、セキュリティリスクも伴う。記事が挙げる主な懸念点は以下の3つだ。

  • プロンプトインジェクション:悪意のあるデータソースがモデルを操作するコンテンツを返し、意図しないツール呼び出しを誘発するリスク。サポートチケットやCRMノートのようなユーザー生成コンテンツを扱う場合に特に注意が必要だ。
  • ツールポイズニング:不正なMCPサーバーが信頼されたツール名に似た名前でツールを登録し、モデルが誤ったツールを選択するリスク。
  • 過剰な権限付与:読み取りしか必要ないエージェントに読み書き両方のツールを公開することで生じる不要なリスク。

MCPの公式仕様では、HostはツールをInvokeする前に必ずユーザーの明示的な同意を得ることが求められている。本番環境では、外部APIと同等の厳格さ——最小権限の原則、入力検証、ツール出力のサニタイズ——を適用することが推奨されている。


MCPが解いたのは「どうやってエージェントをツールに接続するか」という配管の問題だ。記事の著者が指摘するように、これからの問いは「エージェントに何をさせるべきか」「エージェントの動作をどう評価するか」「人間の監督をどう維持するか」に移っていくとされている。

詳細はMCP Explained: How Modern AI Agents Connect to the Real Worldを参照していただきたい。