AI
2025/11/14
森野 喬

FastMCP 2.0が実現するLLM連携を解説

大規模言語モデル(LLM)の進化は目覚ましいですが、その真価は外部システムとのシームレスな連携によって発揮されます。この連携をセキュアかつ標準化された方法で実現するのが、Model Context Protocol (MCP) です。

本記事では、MCPの基本的な概念から、Python開発者がプロダクションレベルのAIアプリケーションを最速で構築できるフレームワーク、FastMCP 2.0 の詳細な機能までを解説します。
この記事を通じて、MCPとFastMCP 2.0について体系的に学んでいきましょう。

MCPとは何か?

MCPは、LLMアプリケーションにデータ機能を公開するための、セキュアで標準化されたプロトコルです。


MCPはしばしば「AIのためのUSB-Cポート」として表現されます。これは、LLMが利用できるリソースに接続するための統一的な方法を提供するからです。

MCPは、LLMとの相互作用のために特別に設計されたAPIと考えるとわかりやすいでしょう。


FastMCPは、このMCPアプリケーションを構築するための標準フレームワークであり、複雑なプロトコルの詳細を意識することなく、クリーンでPython的なコードで構築に集中できるのが最大の特長です。FastMCP 1.0は2024年に公式のMCP SDKに組み込まれましたが、FastMCP 2.0は、コアプロトコルを超えたプロダクションレベルの機能を提供するために現在も活発にメンテナンスされているバージョンです。


FastMCP公式サイト:https://gofastmcp.com/getting-started/welcome


 

MCPを構成する3つのコアコンポーネント

FastMCPサーバーは、主に以下の3つのコンポーネントを定義し、LLMに公開します。


ツール (Tools):アクションの実行


リソースとテンプレート (Resources & Templates):データの取得


プロンプト (Prompts):対話パターンの定義


それぞれの詳細を解説していきます。


ツール (Tools):アクションの実行

ツールは、LLMがコードを実行したり、外部システムにアクセスしたりするなど、副作用を生じさせるアクションを可能にする機能です。LLMは、ツールのスキーマ(引数の定義)に基づき、実行に必要なパラメータをFastMCPサーバーに送信します。


イメージコード(概念)



ツールの主要機能


定義のシンプルさ:


Python関数に @mcp.tool デコレーターを適用するだけでツールになります。関数名がツール名となり、Docstringが説明として自動的に使用されます。


非同期サポート:


FastMCPは非同期(async def)関数をシームレスにサポートしており、ネットワークアクセスなどのI/Oバウンドな操作でサーバーの応答性を保つのに推奨されます。


引数と検証:



引数にデフォルト値がない場合は必須、ある場合はオプションとして扱われます。


FastMCPはデフォルトでPydanticの柔軟な検証を使用します。これにより、LLMクライアントが送信する「10」のような文字列を自動的に整数に型強制し、互換性を高めます。


高度なバリデーションや説明のために、PydanticのFieldクラスを使用して、制約(例: ge=1, le=2000)や詳細な説明をメタデータとして提供できます。



構造化出力 (Structured Output):



2025年6月18日のMCP仕様更新により導入されました。


FastMCPは、dictやPydanticモデルのようなオブジェクトライクな結果を、従来のコンテンツブロックに加えて、機械が読み取り可能なJSONオブジェクトとして自動的に作成します。


関数に戻り値の型注釈(例: > int> Person)を追加することで、FastMCPは自動的に出力スキーマを生成し、クライアントが構造化データを検証し、Pythonオブジェクトに逆シリアル化できるようにします。



リソースとテンプレート (Resources & Templates):データの取得

リソースは、LLMのコンテキストに情報をロードするために使用される、読み取り専用のデータソースや動的なコンテンツジェネレータです。


イメージコード(概念)



リソースの主要機能


定義とURI:


@mcp.resource デコレーターを使用し、一意のURI(例: "resource://greeting")を指定して定義します。


遅延ロード (Lazy Loading):


リソースを定義した関数は、クライアントがそのURIを要求したときにのみ実行されます。


戻り値の変換:


strtext/plaindictlistはJSON文字列に自動的にシリアル化され、適切なMCPリソースコンテンツとして返されます。bytes型を返す場合は、Base64エンコードされてBlobResourceContentsとして送られます。


リソーステンプレート:


URIに{parameter_name}のようなプレースホルダを含めることで、URIに埋め込まれたパラメータに応じて動的にコンテンツを生成できます。これはRFC 6570 URIテンプレートとして実装されています。



{param*}のようなワイルドカードパラメータを使用すると、複数のパスセグメントを含む階層的なファイルパスなどを取得できます。


{?param1,param2}構文のクエリパラメータもサポートされており、これらはパスの必須パラメータとは異なり、デフォルト値を持つオプションの関数パラメータにマッピングされます。



プロンプト (Prompts):対話パターンの定義

プロンプトは、LLMとの相互作用のために、再利用可能でパラメータ化されたメッセージテンプレートを提供します。これにより、異なるクライアントやコンテキスト間で一貫したテンプレートを定義し、LLMに構造化された、意図を持った応答を生成させるのを助けます。


イメージコード(概念)



プロンプトの主要機能


定義:


@mcp.prompt デコレーターをPython関数に適用します。関数名がプロンプトの識別子となります。


パラメータの検証と実行:


クライアントがプロンプトをリクエストし、パラメータが検証されると、定義された関数が実行され、生成されたメッセージがLLMに返されます。


戻り値の多様性:



単純なstrを返すと、自動的に単一のユーザーメッセージ(PromptMessage)に変換されます。


list[PromptMessage | str]を返すことで、初期メッセージのシーケンス(会話のシーケンス)として使用できます。



型付き引数のサポート:


MCP仕様ではプロンプト引数は文字列として渡す必要がありますが、FastMCPは型注釈(例: list[int], dict[str, str])を使用できるようにします。FastMCPは、クライアントからの文字列引数を自動的に予期される型に変換します。また、LLMに対して必要なJSON文字列フォーマットを示す説明も自動で生成します。


FastMCP 2.0のプロダクションレベル機能

FastMCP 2.0は、基本的なプロトコル実装を超えて、本番環境で必要とされる高度な機能を提供します。


1.サーバーの構成と高度なパターン


FastMCPサーバー(FastMCPクラス)は、アプリケーションのメインコンテナとして機能し、サーバー名やクライアントへの指示(instructions)を設定できます。


タグベースのフィルタリング:


include_tagsexclude_tagsを設定することで、環境やユーザーに応じて公開するコンポーネント(ツール、リソース、プロンプト)を選択的にフィルタリングできます。


サーバーの構成:


複数のサーバーを組み合わせる(import_servermount)ことで、大規模なアプリケーションをモジュール化できます。


プロキシ機能:


FastMCPは、ローカルまたはリモートのあらゆるMCPサーバーのプロキシとして機能でき、トランスポートの橋渡しをしたり、既存サーバーにフロントエンドを追加したりできます。


既存APIからの生成:


FastMCP.from_openapi()FastMCP.from_fastapi() を使用して、既存のOpenAPI仕様やFastAPIアプリケーションから即座にMCPサーバーを生成できます。


重複登録の制御:


ツール、リソース、プロンプトの重複登録時に、警告を出す(warn、デフォルト)、エラーを出す(error)、上書きする(replace)、無視する(ignore)といった動作をサーバー初期化時に設定できます。


2.運用と安全性への配慮


Contextオブジェクトによる機能アクセス:


ツールやリソースの実行中に、Contextオブジェクトを引数に追加することで、ロギング(ctx.info())、リソースの読み取り(ctx.read_resource(uri))、進捗報告(ctx.report_progress())、さらにはLLMのサンプリング(ctx.sample(...))といったMCP機能を活用できます。


エラー処理とセキュリティ:



通常、Pythonの例外はLLMに返送され、LLMはそれに応じて対応できます。


FastMCPインスタンス作成時にmask_error_details=Trueを設定すると、セキュリティ上の理由から、内部の機密性の高いエラー詳細をクライアントに公開しないようにできます。


ただし、ToolErrorResourceErrorを意図的に送出すれば、mask_error_details=Trueの状態でも、そのエラーメッセージだけはクライアントに確実に送られます。



アノテーション (Annotations):



readOnlyHintidempotentHintdestructiveHintなどのアノテーションをツールやリソースに追加できます。


これらは、LLMのプロンプトコンテキストを消費することなく、クライアントアプリケーションに対して、その機能が読み取り専用か、副作用があるか、冪等性があるかなどの助言的な情報を伝えるために使用されます。



3.クライアント通知とダイナミズム


FastMCP 2.0では、コンポーネントの状態が変化した際に、接続されているクライアントに通知を送る仕組みがあります。


自動通知:


ツールやリソースが追加、有効化、無効化されると、notifications/tools/list_changednotifications/resources/list_changedといった通知が自動的にクライアントに送信されます。


動的な変更:


この通知機能により、クライアントはポーリングなしで利用可能なツールセットを自動的に更新し、動的なインターフェースや機能提供を実現できます。




まとめ:FastMCPでAI開発を加速する

FastMCPは、「Fast」「Simple」「Pythonic」「Complete」を兼ね備え、LLM開発におけるプロトコルの複雑さを解消しています。


FastMCP 2.0の導入は、LLMにデータと実行能力を与える標準化された未来への最短パスです。高度な検証、柔軟な設定、そして本番環境に耐えうるセキュリティと通知機能を備えたFastMCPを使って、あなたのAIアプリケーションの可能性を最大限に引き出しましょう。


FastMCP公式サイト:https://gofastmcp.com/getting-started/welcome

New call-to-action