Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

ファストMCPの使い方入門ガイド

中村 拓也

中村 拓也

Updated on 4月 19, 2025

大型言語モデル(LLM)の風景は急速に進化しており、単純なテキスト生成を超えて、外部システムやデータソースとの複雑な相互作用に向かっています。この相互作用を促進するためには、情報をリクエストし、アクションをトリガーするための標準化されたアプローチ、共通の言語が必要です。ここで登場するのがモデルコンテキストプロトコル(MCP)で、これはAIのための「USB-Cポート」とよく比較される普遍的な標準として設計され、LLMと必要なリソース間のシームレスなコミュニケーションを可能にします。

MCPが仕様を提供する一方で、それに従ったサーバーやクライアントを構築することは、かなりのボイラープレートコードとプロトコル管理を伴う可能性があります。ここでFastMCPが光ります。FastMCPは、MCPサーバーとクライアントの作成を劇的に簡素化するために設計された高レベルのPythonicフレームワークです。プロトコルの基礎となる複雑さを処理し、開発者がLLMに対して公開したい貴重なツール、データリソース、インタラクションパターンを定義することに集中できるようにします。

💡
美しいAPIドキュメントを生成する素晴らしいAPIテストツールが欲しいですか?

開発チームが最大の生産性で一緒に作業できる統合型のオールインワンプラットフォームが欲しいですか?

Apidogはあなたの要求をすべて満たし、Postmanをより手頃な価格で置き換えます
button

モデルコンテキストプロトコル(MCP)とは何ですか?

FastMCPの詳細に入る前に、MCP自体の基本的な概念を理解することが重要です。MCPは、LLMアプリケーション(クライアント)が外部システム(サーバー)と相互作用するための標準化された方法を定義します。MCPサーバーは、いくつかの重要なコンポーネントを公開できます:

  1. ツール:これらは基本的に、LLMがサーバーに実行を要求できる関数です。従来のAPIにおけるPOSTエンドポイントのようなものと考えてください。それらはアクションを実行し、他のシステム(データベース、API、ハードウェア)と相互作用し、結果を返します。例えば、ツールはメールを送信したり、データベースをクエリしたり、計算を実行したりすることができます。
  2. リソース:これらはLLMが読み取ったり取得したりできるデータを公開します。GETエンドポイントに似て、リソースはLLMのコンテキストを豊かにするための情報を提供します。これには、設定ファイルやユーザープロファイルからリアルタイムデータストリームまで、何でも含まれます。
  3. プロンプト:これらはLLMとのインタラクションを構成するための再利用可能なテンプレートです。会話を導き、特定のタスクに対して一貫した出力を保証するのに役立ちます。
  4. コンテキスト:サーバーは、利用可能なツールやリソースとの最良のインタラクション方法に関する指示を含むコンテキスト情報を提供できます。

MCPは、LLMが外部機能に確実にアクセスし利用できる堅牢で安全なエコシステムを作成することを目指しています。

なぜFastMCPを選ぶのか?

MCP仕様を直接低レベルのSDKを使用して実装することもできますが、FastMCPは特にPython開発者にとって魅力的な利点を提供します:

  • 🚀 迅速な開発:その高レベルのインターフェースは必要なコードの量を大幅に削減し、開発プロセスを加速します。ツールやリソースを定義するのは、標準的なPython関数にデコレーターを付けるだけで済むことがよくあります。
  • 🍀 シンプルさ:FastMCPはサーバーセットアップ、プロトコル処理、コンテンツタイプ、エラーマネジメントの複雑な詳細を抽象化し、ボイラープレートを最小限に抑えます。
  • 🐍 Pythonic:Pythonのベストプラクティスを考慮して設計されており、言語に慣れた開発者にとって自然で直感的に感じられ、型ヒントやデコレーターなどの機能を利用できます。
  • 🔍 完全:FastMCPはコアMCP仕様の包括的な実装を提供することを目指しており、互換性を確保し、プロトコルの完全な潜在能力へのアクセスを保証します。

FastMCPのバージョン1は非常に成功し、公式MCP Python SDKに統合されています。バージョン2はこの基盤の上に構築され、柔軟なクライアント、サーバープロキシ、および構成パターンなど、サーバーとのインタラクションを簡素化するための高度な機能を導入します。

FastMCPのインストール方法

Python環境にFastMCPを設定するのは簡単です。推奨される方法は、迅速なPythonパッケージインストーラーおよび解決機であるuvを使用します。

1. uvを使用する(推奨):

プロジェクトの依存関係を管理している場合は、次のコマンドを使用してFastMCPを追加します:

uv add fastmcp

もしくは、環境に直接インストールします:

uv pip install fastmcp

2. pipを使用する:

pipを使用したい場合は、次のコマンドでFastMCPをインストールできます:

pip install fastmcp

3. インストール確認:

インストール後、FastMCPが正しくインストールされているか、バージョン、基盤のMCP SDKバージョン、およびPython環境の詳細を確認するには、次のコマンドを実行します:

fastmcp version

次のような出力が表示されるはずです:

$ fastmcp version

FastMCP version:   0.4.2.dev41+ga077727.d20250410
MCP version:                                1.6.0
Python version:                            3.12.2
Platform:            macOS-15.3.1-arm64-arm-64bit
FastMCP root path:            ~/Developer/fastmcp

4. 開発用のインストール:

FastMCPプロジェクトに貢献する意図がある場合は、開発環境を設定する必要があります:

git clone https://github.com/jlowin/fastmcp.git
cd fastmcp
uv sync

これによりリポジトリがクローンされ、ディレクトリに移動し、uv syncを使用して、開発ツールを含むすべての必要な依存関係が仮想環境内にインストールされます。その後、pytestを使用してテストを実行できます。

FastMCPの使用方法:最初のサーバーを構築する

さて、FastMCPの実践的な使い方に入ってみましょう。

1. 基本的なサーバーインスタンスの作成:

FastMCPアプリケーションの核心はFastMCPクラスです。このクラスのインスタンスを作成することから始めます。

my_server.pyというファイルを作成します:

# my_server.py
from fastmcp import FastMCP
import asyncio # 後でクライアント用に必要になります

# サーバーをインスタンス化し、名前を付けます
mcp = FastMCP(name="私の最初のMCPサーバー")

print("FastMCPサーバーオブジェクトが作成されました。")

FastMCPコンストラクタは、いくつかの便利な引数を受け取ります:

  • name(str、オプション):サーバーの人間が読める名前(デフォルトは「FastMCP」)。ログやクライアントアプリケーションでの識別に便利です。
  • instructions(str、オプション):クライアントがサーバーとインタラクトする方法を導く説明、その目的を説明するか、主要な機能を強調します。
  • lifespan(callable、オプション):サーバーの起動とシャットダウンロジックを処理するための非同期コンテキストマネージャー(例:データベース接続の初期化)。
  • tags(set[str]、オプション):サーバー自体をカテゴライズするためのタグ。
  • **settingsServerSettingsに対応するキーワード引数(porthostlog_levelなど)を直接コンストラクタに渡して構成できます。

2. コンポーネントの追加:

空のサーバーはあまり役に立ちません。MCPのコアコンポーネントを追加しましょう。

ツールの追加:ツールはクライアントに公開される関数です。@mcp.tool()デコレーターを使用します。FastMCPは、期待される入力パラメータとクライアントの戻り値の型を定義するためにPythonの型ヒントを使用します。

# my_server.py(続き)
@mcp.tool()
def greet(name: str) -> str:
    """シンプルな挨拶を返します。"""
    return f"こんにちは、{name}さん!"

@mcp.tool()
def add(a: int, b: int) -> int:
    """二つの数を足し合わせます。"""
    return a + b

print("ツール'greet'と'add'が追加されました。")

リソースの追加:リソースはURIを介してデータを公開します。@mcp.resource()デコレーターを使用し、URI文字列を提供します。

# my_server.py(続き)
APP_CONFIG = {"theme": "dark", "version": "1.1", "feature_flags": ["new_dashboard"]}

@mcp.resource("data://config")
def get_config() -> dict:
    """アプリケーションの設定を提供します。"""
    return APP_CONFIG

print("リソース'data://config'が追加されました。")

リソーステンプレートの追加:URIの一部がパラメータとして機能する動的リソースのようなものです。

# my_server.py(続き)
USER_PROFILES = {
    101: {"name": "アリス", "status": "active"},
    102: {"name": "ボブ", "status": "inactive"},
}

@mcp.resource("users://{user_id}/profile")
def get_user_profile(user_id: int) -> dict:
    """ユーザーIDによってユーザープロフィールを取得します。"""
    # URIの{user_id}は自動的に引数として渡されます
    return USER_PROFILES.get(user_id, {"error": "ユーザーが見つかりません"})
    
print("リソーステンプレート'users://{user_id}/profile'が追加されました。")

プロンプトの追加:プロンプトは再利用可能なインタラクションパターンを定義します。

# my_server.py(続き)
@mcp.prompt("summarize")
async def summarize_prompt(text: str) -> list[dict]:
    """提供されたテキストを要約するためのプロンプトを生成します。"""
    return [
        {"role": "system", "content": "あなたは要約に特化した役立つアシスタントです。"},
        {"role": "user", "content": f"次のテキストを要約してください:\n\n{text}"}
    ]

print("プロンプト'summarize'が追加されました。")

3. サーバーのテスト(プロセス内):

サーバーを外部で実行する前に、同じPythonスクリプト内でそのコンポーネントを直接テストできます。これは、迅速なチェックやユニットテストに便利です。

# my_server.py(続き)
from fastmcp import Client # クライアントをインポート

async def test_server_locally():
    print("\n--- ローカルサーバーのテスト ---")
    # クライアントをサーバーオブジェクトに直接ポイントします
    client = Client(mcp)

    # クライアントは非同期なので、非同期コンテキストマネージャーを使用します
    async with client:
        # 'greet'ツールを呼び出します
        greet_result = await client.call_tool("greet", {"name": "FastMCPユーザー"})
        print(f"greet結果: {greet_result}")

        # 'add'ツールを呼び出します
        add_result = await client.call_tool("add", {"a": 5, "b": 7})
        print(f"add結果: {add_result}")

        # 'config'リソースを読み取ります
        config_data = await client.read_resource("data://config")
        print(f"configリソース: {config_data}")

        # テンプレートを使用してユーザープロファイルを読み取ります
        user_profile = await client.read_resource("users://101/profile")
        print(f"ユーザー101プロフィール: {user_profile}")

        # 'summarize'プロンプト構造を取得します(ここでLLM呼び出しは実行されません)
        prompt_messages = await client.get_prompt("summarize", {"text": "これはテキストです。"})
        print(f"要約プロンプト構造: {prompt_messages}")

# ローカルテスト関数を実行
# asyncio.run(test_server_locally())
# 現在はコメントアウトしていますが、次はサーバーの実行に焦点を当てます

asyncawaitの使用に注意してください。FastMCPクライアントは非同期で動作し、非同期関数が必要であり、async with client:を使用してクライアントのライフサイクルを管理します。

4. サーバーを実行する:

MCPサーバーを外部クライアント(LLMアプリケーションなど)にアクセス可能にするためには、サーバーを実行する必要があります。主に二つの方法があります:

標準Python実行(互換のために推奨):
次のif __name__ == "__main__":ブロックをmy_server.pyファイルの最後に追加します。これはスクリプトを実行可能にするための標準的なPythonの手法です。

# my_server.py(ファイルの最後に)

if __name__ == "__main__":
    print("\n--- __main__を介してFastMCPサーバーを開始 ---")
    # これによりサーバーが起動し、通常はデフォルトでstdioトランスポートを使用します
    mcp.run()

サーバーを実行するには、ターミナルからスクリプトを実行します:

python my_server.py

このコマンドにより、MCPサーバーが起動し、デフォルトのstdio(標準入力/出力)トランスポートメカニズムを使用してクライアント接続を待ち受けます。この方法により、スクリプトを実行しようとするさまざまなクライアントに対して、一貫してサーバーが実行されます。

FastMCP CLIを使用する:
FastMCPは、サーバーを実行するためのコマンドラインインターフェースを提供しており、特にトランスポートオプションに関してより柔軟性と制御を提供します。

# stdio(デフォルト)を使用してサーバーを実行
fastmcp run my_server.py:mcp

# ポート8080でサーバー送信イベント(SSE)を使用してサーバーを実行
fastmcp run my_server.py:mcp --transport sse --port 8080 --host 0.0.0.0

# 異なるログレベルで実行
fastmcp run my_server.py:mcp --transport sse --log-level DEBUG

CLIに関する重要なポイント:

  • my_server.py:mcp:ファイル(my_server.py)とそのファイル内のFastMCPサーバーオブジェクト(mcp)を指定します。:mcpを省略すると、FastMCPは自動的にmcpapp、またはserverという名前のオブジェクトを見つけようとします。
  • fastmcp runを使用する際にif __name__ == "__main__":ブロックは不要です。CLIは直接指定されたサーバーオブジェクトを見つけて実行します。
  • --transport:通信プロトコルを選択します(stdiosse)。SSEはWebベースの相互作用で一般的です。
  • --port--host--log-level:トランスポートとロギング設定を構成します。

5. 実行中のサーバーとのインタラクション(クライアント):

サーバーが実行中(python my_server.pyまたはfastmcp run経由)になると、別のクライアントスクリプトを作成してそれと対話できます。

my_client.pyという新しいファイルを作成します:

# my_client.py
from fastmcp import Client
import asyncio

async def interact_with_server():
    print("--- クライアントを作成 ---")

    # オプション1:`python my_server.py`経由で実行されるサーバーに接続する(stdioを使用)
    # client = Client("my_server.py")

    # オプション2:`fastmcp run ... --transport sse --port 8080`経由で実行されるサーバーに接続する
    client = Client("http://localhost:8080") # 正しいURL/ポートを使用

    print(f"クライアントは接続するように構成されました: {client.target}")

    try:
        async with client:
            print("--- クライアント接続完了 ---")
            # 'greet'ツールを呼び出します
            greet_result = await client.call_tool("greet", {"name": "リモートクライアント"})
            print(f"greet結果: {greet_result}")

            # 'config'リソースを読み取ります
            config_data = await client.read_resource("data://config")
            print(f"configリソース: {config_data}")

            # ユーザー102のプロファイルを読み取ります
            profile_102 = await client.read_resource("users://102/profile")
            print(f"ユーザー102プロフィール: {profile_102}")

    except Exception as e:
        print(f"エラーが発生しました: {e}")
    finally:
        print("--- クライアントインタラクション終了 ---")

if __name__ == "__main__":
    asyncio.run(interact_with_server())

このクライアントスクリプトを、別のターミナルでサーバーが実行中の間に実行します:

python my_client.py

クライアントは実行中のサーバーに接続し、ツールの呼び出しやリソースの読み取りを実行し、結果を表示します。

6. サーバー設定(ServerSettings):

ServerSettingsを使用してサーバーの動作を微調整できます。設定は優先順位の順序で適用されます:

  1. FastMCP初期化中のキーワード引数(最も高い優先順位)。
  2. FASTMCP_SERVER_で始まる環境変数(例:FASTMCP_SERVER_PORT=8888)。
  3. 作業ディレクトリ内の.envファイルから読み込まれた値。
  4. デフォルト値(最も低い優先順位)。

初期化中の設定の例:

from fastmcp import FastMCP

mcp_configured = FastMCP(
    name="ConfiguredServer",
    port=8080,  # デフォルトのSSEポートを設定
    host="127.0.0.1", # デフォルトのSSEホストを設定
    log_level="DEBUG", # ログレベルを設定
    on_duplicate_tools="warn" # 同名のツールが登録される場合に警告(オプション:'error'、'warn'、'ignore')
)

# .settings属性を介して設定にアクセス
print(f"設定されたポート: {mcp_configured.settings.port}") # 出力: 8080
print(f"重複ツールポリシー: {mcp_configured.settings.on_duplicate_tools}") # 出力: warn

主な構成オプションには、hostportlog_level、および重複コンポーネント名の処理ポリシー(on_duplicate_toolson_duplicate_resourceson_duplicate_prompts)が含まれます。

FastMCPでできるその他のことは?

FastMCPは、より高度なユースケースもサポートしています:

  • 構成:複数のFastMCPサーバーを組み合わせることができます。main.mount("sub", sub_server)はライブリンクを作成し、main.import_server(sub_server)はコンポーネントをコピーします。これによりモジュール性が向上します。
  • プロキシ:FastMCP.from_client(client)を使用して、他のMCPサーバー(ローカルまたはリモート)のプロキシとして機能するFastMCPサーバーインスタンスを作成できます。これは、トランスポートを橋渡しする際に便利です(例:ローカルstdioを介ってリモートSSEサーバーを公開する)や、統一されたフロントエンドを追加するために役立ちます。

結論

FastMCPは、モデルコンテキストプロトコルの実装を簡素化することによって、強力でコンテキストを意識したLLMアプリケーションを構築するための障壁を大幅に低下させます。そのPythonicなデザイン、ボイラープレートを減らすことに焦点を当て、包括的な機能セットは、LLMにカスタムツールやデータアクセスを安全かつ効率的に装備させたい開発者にとって優れた選択肢です。

上記に示した手順に従うことで – FastMCPをインストールし、サーバーインスタンスを作成し、簡単なデコレーターを使用してツールとリソースを追加し、サーバーを実行することで – あなた自身のMCP対応アプリケーションを迅速に構築できます。シンプルなユーティリティツールを作成する場合でも、複雑でデータ集約型の統合を作成する場合でも、FastMCPは堅牢でスケーラブルなLLMインタラクションの基盤を提供します。