LLMエージェントの新常識「MCP」とは?開発者必見の徹底解説!

LLMs
Agent
Published

March 7, 2025

TL;DL

  • MCP (Model Context Protocol) は、LLMエージェントが様々なデータソース (コンテンツ、ツールなど) に接続するためのプロトコルです。
  • 目的: 接続の標準化と、AIシステムの管理の簡素化。
  • ツールとの違い: MCP はプロトコルであり、ツールは MCP を通じて公開される機能の一つ。
  • 従来の問題: LLM と異なるデータソースを繋ぐには、カスタム実装が必要だった。
  • MCP の利点: 標準化されたプロトコルのため、カスタム実装なしで様々なデータソースに接続可能 (REST API に類似)。
  • 構成:
    • MCP クライアント: LLMエージェントやアプリケーション (例: Claude Desktop、IDE)。
    • MCP サーバー: 特定のデータソースやツールに接続し、機能を公開する軽量プログラム。
  • MCP サーバーでできること:
    • ツール: 実行可能な機能をクライアントに公開 (例: 計算、検索)。
    • リソース: データやコンテンツを公開。
    • プロンプト、サンプリング、ルート (現状ではツールとリソースが主に利用)。
  • 現状: 2024年11月発表の新しい技術で、発展途上。ツールとリソースアクセスが主な用途。
  • 将来性: エージェントの流行に伴い、飛躍的に発展するになる可能性が高い。

MCPとは?

MCP(Model Context Protocol)とは、LLMエージェントがコンテンツ、ツールなど、様々なデータソースに接続できるようにするためのプロトコルです。 単一のプロトコルで接続を標準化することで、AIシステムの管理を容易にすることを目指しています。2024年11月にAnthropicが発表して以来、MCPはCursorなどのLLMベースのアプリケーションで利用されており、LLMエージェントの発展において重要な役割を果たしています。

MCPが解決する問題(ツールとの違い)

筆者はCline(オープンソース版Cursor)でMCPのことを知りました。当初は、「わざわざ難しい名前を付けているが、これは単純にツールではないか?」と感じました。しかし、詳細に調べていくうちに、MCPはプロトコルであり、ツールとは異なることがわかりました。

例として、二つのシナリオを考えてみましょう。

  1. AさんはLlamaIndexでLLMエージェントアプリケーションを開発しています。LangChainにあるツールを利用したいのですが、それが可能かどうか不明なため、調査が必要です。

  2. BさんはTypeScriptでLLMエージェントアプリケーションを開発しています。エージェント用の検索ツールが必要ですが、LangChainのPythonライブラリにはduckduckgoの検索ツールがあるものの、言語が異なるため利用できません。

従来、このようにLLMと異なるデータソースに接続するには、それぞれカスタム実装が必要でした。しかし、MCPという標準化されたプロトコルがあれば、カスタム実装なしで、様々なデータソースに容易に接続できます(REST APIとよく似ています)。

MCPの構成

MCPはクライアント-サーバーアーキテクチャを採用しています:

  • MCPクライアント: LLMエージェントやアプリケーションで、データにアクセスするためにMCPを使用します(例: Claude Desktop、IDE、AIツール)。

  • MCPサーバー: 特定のデータソースやツールに接続し、その機能をMCPを通じて公開する軽量プログラムです(例: ファイルシステム、データベース、Webサービス)。

General architecture

ホストは複数のサーバーに接続でき、各サーバーが異なるデータソースへのアクセスを提供します。この設計により、AIはカスタム統合なしで多様なデータにアクセスできます。プロトコルはJSON-RPCに基づいており、多くのプログラミング言語と互換性があります。

MCPサーバーを実際に作ってみる

MCPはあくまでもプロトコルなので、プログラミング言語に関わらずサーバーを構築/アクセスすることができます。ただし、まだ発展途上であり、現在サポートされている(SDKが提供されている)言語はPython, TypeScript, Java, Kotlinです。今回はPythonで実装してみます。

環境準備

Pythonでサーバーを構築する際にはuvというパッケージ管理ツールを利用しているので、まずそれをインストールします。

curl -LsSf https://astral.sh/uv/install.sh | sh

次に再起動し、Python環境をインストールします。

# 新しいプロジェクトディレクトリを作成
uv init calculator
cd calculator

# 仮想環境を作成し、アクティベート
uv venv
source .venv/bin/activate

# 依存関係をインストール
uv add "mcp[cli]"

# サーバーファイルを作成
touch calculator.py

サーバーロジックの実装

以下のスクリプトをcalculator.pyに記述すれば完了です。これにより、入力された数式を計算し、結果を返すツールを持つMCPサーバーが作成されます。

from typing import Any

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("calculator")


@mcp.tool()
def calculator(expression: str) -> Any:
    """Calculate a mathematical expression.

    Args:
        expression: Mathematical expression to evaluate
    """
    result = eval(expression)
    return result


if __name__ == "__main__":
    # サーバーを初期化し、実行
    mcp.run(transport="stdio")

いかがでしょうか。PythonのLangchainでツールを作理、FastAPIでサービングすることとよく似ていませんか。

MCPサーバーにアクセスする

接続

次に以下のコードを実行すれば、サーバーに接続できます。環境は任意なので、Jupyterで接続してみました。

from contextlib import AsyncExitStack

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

exit_stack = AsyncExitStack()

command = "python" # 今回はPythonでサーバーコードを記述したため
server_script_path = "calculator.py" # サーバーコードのパス
server_params = StdioServerParameters(
    command=command, args=[server_script_path], env=None
)
stdio, write = await exit_stack.enter_async_context(stdio_client(server_params))
session = await exit_stack.enter_async_context(ClientSession(stdio, write))
await session.initialize()

上記のコードにはStdioServerParametersなどの見慣れない要素がありますが、利用する上で特に理解する必要はないので、そのまま書けば良いです。

ちなみに、接続情報としてスクリプトの言語とserver_script_pathが必要なのは、現時点ではネットワークを介したMCPサーバーへの接続がまだ開発中であり、MCPサーバーがまだローカルでしか動作しないためです。ローカルでサーバーを動作させるために、内部で言語によってサーバースクリプトを実行する方法を変えています。Pythonの場合はuvx、TypeScriptの場合はnpxでサーバースクリプトを実行しています。

リクエスト

次にリクエストを実行してみましょう。まず、サーバー側でどのようなツールが利用可能かを確認します。

response = await session.list_tools()
tools = response.tools
print(tools[0].model_dump_json(indent=4))
{
    "name": "calculator",
    "description": "Calculate a mathematical expression.\n\n    Args:\n        expression: Mathematical expression to evaluate\n    ",
    "inputSchema": {
        "properties": {
            "expression": {
                "title": "Expression",
                "type": "string"
            }
        },
        "required": [
            "expression"
        ],
        "title": "calculatorArguments",
        "type": "object"
    }
}

先ほど定義したcalculatorツールの詳細が表示されました。

ツールの情報をLLMに送信すれば、LLMはユーザーのリクエストに応じてツールを呼び出し、利用することができます。例えば、LLMがユーザーから4**2の結果は?という質問を受け、それをツールで計算するとしましょう(今回は説明を簡潔にするためLLMの部分は省略します)。その場合、以下のようにMCPサーバーへリクエストし、結果を得ることができます。

tool_name = "calculator"
tool_args = {"expression": "4**2"}
result = await session.call_tool(tool_name, tool_args)
result
CallToolResult(meta=None, content=[TextContent(type='text', text='16', annotations=None)], isError=False)

このように、利用したいツールとパラメータをサーバーに渡せば、結果が返ってきます。LLMはその結果を用いてユーザーに応答することができます。

ツール以外の機能

ツールを利用する以外に、MCPサーバーでできることを以下にまとめました。

  • リソース (Resources): リソースは、Model Context Protocol (MCP) の中核となるプリミティブ(基本要素)であり、サーバーがデータやコンテンツを公開することを可能にします。クライアントはそれらを読み取り、LLM との対話のコンテキストとして使用できます。

  • プロンプト (Prompts): プロンプトにより、サーバーは再利用可能なプロンプトテンプレートとワークフローを定義できます。クライアントはこれらをユーザーや LLM に容易に提示できます。プロンプトは、一般的な LLM との対話を標準化し、共有するための強力な手段を提供します。

  • ツール (Tools): ツールは MCP の強力なプリミティブであり、サーバーが実行可能な機能をクライアントに公開できるようにします。ツールを通じて、LLM は外部システムと対話し、計算を実行し、現実世界でアクションを起こすことができます。

  • サンプリング (Sampling): サンプリングは強力な MCP 機能であり、サーバーがクライアントを通じて LLM の補完を要求できるようにします。これにより、セキュリティとプライバシーを維持しながら、高度なエージェント的動作が可能になります。

  • ルート (Roots): ルートは MCP の概念であり、サーバーが動作できる境界を定義します。クライアントがサーバーに関連リソースとその場所を通知するための手段を提供します。

5つの機能がありますが、残念ながら、現時点ではツール使用とリソースアクセスとしての利用がほとんどです。以下は各クライアントがサポートする機能をまとめたものです。

Client Resources Prompts Tools Sampling Roots Notes
Claude Desktop App ✅ ✅ ✅ ❌ ❌ Full support for all MCP features
5ire ❌ ❌ ✅ ❌ ❌ Supports tools.
BeeAI Framework ❌ ❌ ✅ ❌ ❌ Supports tools in agentic workflows.
Cline ✅ ❌ ✅ ❌ ❌ Supports tools and resources.
Continue ✅ ✅ ✅ ❌ ❌ Full support for all MCP features
Cursor ❌ ❌ ✅ ❌ ❌ Supports tools.
Emacs Mcp ❌ ❌ ✅ ❌ ❌ Supports tools in Emacs.
Firebase Genkit ⚠️ ✅ ✅ ❌ ❌ Supports resource list and lookup through tools.
GenAIScript ❌ ❌ ✅ ❌ ❌ Supports tools.
Goose ❌ ❌ ✅ ❌ ❌ Supports tools.
LibreChat ❌ ❌ ✅ ❌ ❌ Supports tools for Agents
mcp-agent ❌ ❌ ✅ ⚠️ ❌ Supports tools, server connection management, and agent workflows.
Roo Code ✅ ❌ ✅ ❌ ❌ Supports tools and resources.
Sourcegraph Cody ✅ ❌ ❌ ❌ ❌ Supports resources through OpenCTX
Superinterface ❌ ❌ ✅ ❌ ❌ Supports tools
TheiaAI/TheiaIDE ❌ ❌ ✅ ❌ ❌ Supports tools for Agents in Theia AI and the AI-powered Theia IDE
Windsurf Editor ❌ ❌ ✅ ❌ ❌ Supports tools with AI Flow for collaborative development.
Zed ❌ ✅ ❌ ❌ ❌ Prompts appear as slash commands
[OpenSumi][OpenSumi] ❌ ❌ ✅ ❌ ❌ Supports tools in OpenSumi

まとめ

改めて、MCP(Model Context Protocol)はLLMとリソースのコミュニケーションを円滑にするためのプロトコルです。SNS等で言及されているMCPは、実際にはMCPサーバーを指していることが多いです。2024年の11月に提唱され、まだ4ヶ月しか経っていない、生まれたばかりの技術です。ツール、リソースなどの機能がありますが、まだ発展途上のため、十分に活用されていません。しかし、エージェントが注目され始めている現在の状況から見ると、今できているツールの部分が全部MCPサーバーに代替されるでしょう。

もっと知りたい方へ