FastAPI MCP Server + LangChain Client Example について
FastAPI のルートを MCP ツールとして公開し、LangChain エージェントのクライアントも含むサンプルプロジェクトです。API を MCP クライアントに公開する方法の学習や、ツールの検出・実行のテストに向いています。
主な機能
- 01FastAPI ルートをツールとして公開
- 02HTTP/SSE 経由のツール検出
- 03LangChain エージェントの実行
- 04Cursor を MCP クライアントに設定
活用シーン
- 01MCP 対応 FastAPI アプリの試作
- 02ルート経由のツール検出テスト
- 03LangChain エージェントでのツール実行
MCP 対応
サーバーは `/mcp` で FastAPI のエンドポイントを MCP ツールとして公開します。付属の LangChain クライアントは HTTP/SSE で接続してツールを検出・実行でき、Cursor も MCP クライアントとして接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
FastAPI MCP サーバー + LangChain クライアントの例
fastapi-mcpを使用して FastAPI エンドポイントを Model Context Protocol(MCP)ツールとして公開する方法を示すサンプルプロジェクトです。langchain-mcp-adaptersを使用して、HTTP/SSE 経由でローカルの FastAPI サーバーに接続し、公開されたツールを見つけて利用する基本的な LangChain エージェント(langchain_client.py)も含まれています。
前提条件
始める前に、以下がインストールされていることを確認してください。
- Python: バージョン 3.10 以上を推奨します。
uv: このプロジェクトで使用する Python パッケージマネージャーです。(インストール手順)- Node.js と npm:
npx(オプションの MCP Inspector の実行に使用)に必要です。npm が含まれる Node.js は nodejs.org からダウンロードできます。 - Git: リポジトリのクローンに使用します。
- OpenAI API Key: LangChain クライアントの例に必要です。
.envファイルに設定する必要があります。
このプロジェクトでは、基本的な FastAPI アプリケーションを設定し、fastapi-mcp ライブラリを使用してそのエンドポイントを Model Context Protocol(MCP)ツールとして公開する方法を示します。また、これらのツールに接続して利用する LangChain エージェントクライアントも含まれており、Cursor を接続するための設定方法も説明します。
はじめに/実行方法
-
リポジトリをクローンします:
git clone <your-repo-url> cd <repo-directory> -
uvをインストールします: まだインストールしていない場合は、uvパッケージマネージャーをインストールしてください(コマンドについては、以下のプロジェクトのセットアップを参照してください)。 -
環境を設定し、依存関係をインストールします:
uv init # If pyproject.toml doesn't exist uv venv # Create virtual environment (.venv) # Install all project dependencies uv pip install fastapi "uvicorn[standard]" fastapi-mcp langchain-mcp-adapters langgraph langchain-openai python-dotenv -
.envファイルを作成します: プロジェクトのルートディレクトリに.envという名前のファイルを作成し、OpenAI API キーを追加します。OPENAI_API_KEY=your_openai_api_key_here -
FastAPI MCP サーバーを実行します: ターミナルを開いて、次のコマンドを実行します。
uvicorn main:app --reload --port 8000このターミナルは開いたままにしてください。 (別の方法として、VS Code/Cursor 内の
.vscode/launch.jsonに定義されているPython: FastAPI MCPデバッグ構成を使用すると、デバッガーを接続した状態でサーバーを実行できます。) -
LangChain クライアントを実行します: 2 つ目の ターミナルを開いて、次のコマンドを実行します。
uv run python langchain_client.pyクライアントがサーバーに接続し、ツールを検出して、エージェントを使ったクエリを実行します。
-
(オプション)MCP Inspector でサーバーをテストします: LangChain クライアントを実行する前、またはより直接的にテストする場合は、公式の MCP Inspector ツールを使用できます。
- FastAPI サーバーが実行中であることを確認します(手順 5)。
- 別のターミナルを開いて、
npx @modelcontextprotocol/inspectorを実行します。 (npxは Node.js/npm に付属しています。このコマンドが失敗する場合は、Node.js がインストールされ、PATH からアクセスできることを確認してください。) - Inspector の UI で、サーバー URL
http://127.0.0.1:8000/mcpに接続します。 - 「Tools」に移動し、「List Tools」をクリックして
read_root__getとgreet_user_greet__name__getを確認します。 - ツールを選択し、パラメーター(例:greet_user の
name)を入力して、「Run Tool」をクリックします。
-
(オプション)LangChain クライアントで
greet_userをテストします:greet_userエンドポイントと、langchain_client.py内の対応するテストクエリ(query2)は現在有効です。LangChain クライアントを実行するだけで(手順 6)、実行の後半でユーザー「LangChain」に挨拶しようとする処理を確認できます。- (このテストを無効にする場合は、
main.pyの@app.get("/greet/{name}")エンドポイントと、langchain_client.pyのquery2セクションをコメントアウトしてください。)
- (このテストを無効にする場合は、
目標
学習およびテストを目的として、MCP 機能を備えたシンプルな FastAPI サーバーを構築します。ローカルで実行でき、Cursor エディターのエージェントなどの MCP クライアントから接続できます。
プロジェクトのセットアップ
- パッケージマネージャー: Rust で書かれた高速な Python パッケージインストーラー兼リゾルバーである
uvを使用しました。- インストール(Windows PowerShell):
irm https://astral.sh/uv/install.ps1 | iex - プロジェクトの初期化:
uv init(pyproject.tomlを作成します) - 仮想環境:
uv venv(.venvを作成・管理します)
- インストール(Windows PowerShell):
- 依存関係:
uvを使ってインストールしました。
これにより、FastAPI、Uvicorn ASGI サーバー、# 開発時に使用した個別のコマンド(「はじめに」に記載の一括インストールで実行できます): # uv pip install fastapi "uvicorn[standard]" fastapi-mcp # uv pip install langchain-mcp-adapters langgraph langchain-openai python-dotenvfastapi-mcp、LangChain コンポーネント、およびpython-dotenvが.venv仮想環境にインストールされます。
アプリケーション(main.py)
次のエンドポイントを持つシンプルな FastAPI アプリを作成しました。
/:ウェルカムメッセージを返します。/greet/{name}:個別の挨拶を返します(現在はコメントアウトされています)。
重要なのは、fastapi-mcp の統合を FastAPI のルート定義の後に行うことです。
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
app = FastAPI(...)
# --- Define FastAPI routes (@app.get, @app.post, etc.) ---
@app.get("/")
async def read_root():
# ... endpoint logic ...
# --- Initialize and mount fastapi-mcp AFTER routes ---
mcp = FastApiMCP(app)
mcp.mount() # Exposes tools under /mcp by default
サーバーの実行
- 直接実行:
uvicorn main:app --reload --port 8000 - デバッガーを使用(Cursor/VS Code): デバッガーをアタッチしてアプリを実行するため、
.vscodeにlaunch.jsonファイルを作成しました。
LangChain クライアント(langchain_client.py)
.envファイルからOPENAI_API_KEYを読み込みます。langchain-mcp-adapters(MultiServerMCPClient)を使い、SSE 経由で実行中の FastAPI サーバー(http://127.0.0.1:8000/mcp)に接続します。- MCP サーバーが公開するツールを自動的に検出します。
- 検出したツールと OpenAI LLM を使って、LangGraph ReAct エージェントを作成します。
- エージェントを通してサンプルクエリを実行します。
Cursor との統合(MCP クライアント)
- 設定: プロジェクトのルートに
.cursor/mcp.jsonファイルを作成しました。{ "mcpServers": { "local-fastapi-mcp": { "url": "http://127.0.0.1:8000/mcp" } } } - 有効化: Cursor の設定でサーバーを有効にする必要があります(Ctrl+, を押して「Cursor Settings」を検索し、「MCP」タブを開きます)。
- 使用方法: その後、チャットパネル内の Cursor エージェントに、検出されたツールを使うよう依頼できます。
主な学び
uvの基本:uv init、uv venv、uv pip installを使うと、Python プロジェクト環境をすばやくセットアップできます。fastapi-mcpの初期化順序: ツールとして公開する FastAPI ルート(@app.getなど)を定義した_後_に、FastApiMCP(app)インスタンスを作成し、mcp.mount()を呼び出す必要があります。そうしないと、ツールが検出されません。- ポートの競合: バックグラウンドプロセス(
uvicornなど)がポートを占有することがあります。Windows では、netstat -ano | findstr "<PORT>"でプロセス ID(PID)を特定し、taskkill /F /PID <PID>で終了できます。OS がポートを完全に解放するまで、少し待つか IDE を再起動する必要がある場合もあります。 - Cursor MCP の設定:
.cursor/mcp.jsonでurlキーを使用すると、Cursor を HTTP ベースの MCP サーバー(fastapi-mcpが提供するサーバーなど)に接続できます。 - エージェントによるツールの呼び出し: Cursor の一般的なエージェント環境では設定済みの MCP サーバーが使用されますが、特定のペアプログラミング AI アシスタントは、汎用のツール呼び出し関数ではなく、自動生成された内部名(例:
mcp_local-fastapi-mcp_read_root__get)を使ってツールとやり取りします。接続が確立され、ツールが検出されていれば、チャットでエージェントに「ツールを使って」と明示的に依頼できます。
さらに詳しく調べる機能と特徴(fastapi-mcp のドキュメントより)
このセクションでは、まだ実装していませんが知っておくと便利な、fastapi-mcp のドキュメントに記載された機能や概念をまとめます。
認証と認可
fastapi-mcp は、認証に FastAPI の依存関係を使用できるほか、OAuth 2 にも対応しています。
基本的なトークンの受け渡し:
-
最初に特別なサーバー設定を行う必要はありません。
-
MCP クライアントは
Authorizationヘッダーを送信する必要があります。多くの場合、mcp-remoteなどのブリッジを介して送信できます:{ "mcpServers": { "remote-example": { "command": "npx", "args": [ "mcp-remote", "http://localhost:8000/mcp", "--header", "Authorization:${AUTH_HEADER}" ] }, "env": { "AUTH_HEADER": "Bearer <your-token>" } } } -
MCP サーバー側で認証を_必須にする_には、
AuthConfigに依存関係を追加します:from fastapi import Depends from fastapi_mcp import FastApiMCP, AuthConfig # Assuming verify_auth is your FastAPI dependency that checks the token mcp = FastApiMCP( app, auth_config=AuthConfig( dependencies=[Depends(verify_auth)], ), )
OAuth 2 フロー:
- OAuth 2 を全面的にサポートしています(MCP Spec 2025-03-26)。
- プロバイダーの詳細(発行者、URL、クライアント ID/シークレット)を指定して
AuthConfigを設定する必要があります。 - 標準的な OAuth プロバイダーと MCP クライアントの想定との互換性の問題(動的登録の欠如、スコープの処理など)に対処するため、
setup_proxies=Trueが必要になることがよくあります。mcp = FastApiMCP( app, auth_config=AuthConfig( issuer=f"https://auth.example.com/", authorize_url=f"https://auth.example.com/authorize", oauth_metadata_url=f"https://auth.example.com/.well-known/oauth-authorization-server", audience="my-audience", client_id="my-client-id", client_secret="my-client-secret", dependencies=[Depends(verify_auth)], setup_proxies=True, # Creates compatibility endpoints ), ) mcp-remoteを使用する場合、OAuth プロバイダーでコールバック URL(http://127.0.0.1:8080/oauth/callback)を設定できるよう、固定ポート(mcp-remote ... 8080)の指定が必要になることがよくあります。
ツールの命名
- MCP ツール名は、FastAPI ルートの
operation_idから生成されます。 - 指定されていない場合、FastAPI が自動生成します(例:
read_user_users__user_id__get)。 - MCP ツール名をわかりやすくするため、FastAPI ルートに明示的な
operation_idを設定することを推奨します:@app.get("/users/{user_id}", operation_id="get_user_info") async def read_user(user_id: int): # ...
ツールの更新
-
mcp.mount()の呼び出し後に FastAPI ルートを追加しても、自動的には含まれません。 -
解決方法:新しいルートを定義した後、再度
mcp.setup_server()を呼び出します。app = FastAPI() mcp = FastApiMCP(app) mcp.mount() @app.get("/new/endpoint", operation_id="new_tool") async def new_endpoint(): ... # Refresh the tools mcp.setup_server()
テスト
- MCP サーバーのテストには、
@modelcontextprotocol/inspectorツールを使用できます:# Run the inspector npx @modelcontextprotocol/inspector # Connect to your server URL (e.g., http://127.0.0.1:8000/mcp) # Use the UI to list and run tools.
デプロイ
-
ある FastAPI アプリ(
api_app)から作成した MCP サーバーを、別の FastAPI アプリ(mcp_app)にマウントして、個別にデプロイできます:api_app = FastAPI() # ... define API endpoints ... mcp_app = FastAPI() mcp = FastApiMCP(api_app) # Create from api_app mcp.mount(mcp_app) # Mount onto mcp_app # Run separately: # uvicorn main:api_app --port 8001 # uvicorn main:mcp_app --port 8000
カスタマイズ
- サーバー名と説明は、
FastApiMCPの初期化時に設定できます:mcp = FastApiMCP( app, name="My Custom MCP Name", description="Description for the server." ) - ツールやスキーマの説明はカスタマイズできます(例:考えられるすべてのレスポンスを含める):
mcp = FastApiMCP( app, describe_all_responses=True, describe_full_response_schema=True ) FastApiMCPの初期化時にinclude_operations、exclude_operations、include_tags、exclude_tagsを指定して、公開するエンドポイントを絞り込めます。
謝辞
このプロジェクトは、Cursor に統合された Google の Gemini モデルを含む AI ペアプログラミングツール、および調査とドキュメントの取得における OpenAI の ChatGPT の支援を受けて開発されました。これらの貢献は、開発プロセス全体を通じて非常に貴重なものでした。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
