FastAPIで始めるMCPサーバー
MCPが話題ですよね。最近でこそいろんな企業がMCPを提供する事例が増えて来ました。
そんな中、TLを眺めていたらFastAPIで構築したアプリケーションをMCPサーバー化させるライブラリを見つけました。
FastAPI-MCPというそのままのネーミングですが、READMEに書いてある内容的には、FastAPIで構築したエンドポイントをMCPに変換してくれるというツールみたいです。
というわけで、今回はFastAPIを使って初めてのMCPサーバーを構築してみます。
なお、MCPサーバーとは何かという話はしません(他の人の解説のほうがわかりやすいと思うので…)
今回のソースコードは以下のGithubのリポジトリに置いてあります。
環境構築
まずは、MCPサーバーの実行環境を構築します。
FastAPI-MCPのREADMEでは、uvというRust製のPythonのパッケージ管理ツールを使って構築する方法が推奨されているので、今回はuvを使って環境構築を行います。
まずは、お使いのOSに合わせて以下のコマンドでuvをインストールします。
- Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- Mac/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
次に、uvを使ってFastAPI-MCPのプロジェクトを作成します。
uv init fastapi-mcp-workshop
プロジェクトが作成されたら、以下のコマンドで今回使用するライブラリをインストールします。この1行だけでFastAPIとFastAPI-MCPがインストールされます。
cd fastapi-mcp-workshop
uv add fastapi-mcp
今回はアプリケーションのDBとして簡易的なドキュメントDBであるTinyDBを使用します。
TinyDBも以下のコマンドでインストールします。
uv add tinydb
アプリケーションの実装
次に、アプリケーションの実装を行います。
今回はシンプルなデータを貯めて参照するだけのアプリケーションを作成します。
まずは、FastAPIのアプリケーションを作成します。
プロジェクトのディレクトリ内に api.py
というファイルを作成し、以下のコードを記述します。
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Optional
from tinydb import TinyDB
# FastAPIアプリケーションの初期化
app = FastAPI(
title="MCP API",
description="API for managing the MCP system",
version="0.1.0",
)
# TinyDBの初期化
db = TinyDB("db.json")
class Item(BaseModel):
"""
アイテムのモデル
"""
id: int
name: str
description: Optional[str] = None
price: float
tags: List[str] = []
@app.get("/items", response_model=List[Item], tags=["items"], operation_id="list_items")
async def list_items():
"""
アイテムの一覧を取得する
"""
items = db.all()
return [Item(**item) for item in items]
@app.post("/items", response_model=Item, tags=["items"], operation_id="create_item")
async def create_item(item: Item):
"""
アイテムを作成する
"""
db.insert(item.model_dump())
return item
保存したら、以下のコマンドでアプリケーションを起動します。
uv run uvicorn api:app --reload --port 8080
後はブラウザで http://localhost:8080/docs
にアクセスすると、FastAPIのOpenAPIのドキュメントが表示されます。
ここから、APIのエンドポイントを叩いてみると問題なく動くことがわかります。
動くことが確認できたら、アプリケーションは停止しても大丈夫です。
MCPサーバーの実装
ここまでは単純にFastAPIでアプリケーションを作成しただけですが、今度はこのアプリケーションをMCPサーバーとして動作するように拡張していきます。
プロジェクト作成時に作成された main.py
というファイルを開き、中身を削除したら以下のコードに書き換えます。
from fastapi_mcp import FastApiMCP
import api
mcp = FastApiMCP(
api.app,
name="My API MCP",
description="My API description",
base_url="http://localhost:8000",
)
# Mount the MCP server directly to your FastAPI app
mcp.mount()
if __name__ == "__main__":
import uvicorn
uvicorn.run(api.app, host="0.0.0.0", port=8000)
たったこれだけで、FastAPIのアプリケーションをMCPサーバー化することができました。
動かしてみる
それでは実際に動かしてみます。
今回はClaude Desktopを使って動かしてみます。
まずは、以下のコマンドでMCPサーバーを起動します。
uv run main.py
ClaudeでMCPサーバーを動かすために、以下のコマンドでmcp-proxyをインストールします。
uv tool install mcp-proxy
Claude Desktopの 設定 -> 開発者
から、 構成を編集
をクリックして claude_desktop_config.json
を開きます。
お使いのOSに合わせて以下のように設定を変更します。
- Windows
{
"mcpServers":{
"my-api-mcp-proxy":{
"command":"mcp-proxy",
"args":[
"http://localhost:8000/mcp"
]
}
}
}
- MacOS
Macの場合、mcp-proxyのパスをフルパスで指定する必要があります。which mcp-proxy
でフルパスを確認できます。
{
"mcpServers":{
"my-api-mcp-proxy":{
"command":"path/to/mcp-proxy",
"args":[
"http://localhost:8000/mcp"
]
}
}
}
保存したら、Claude Desktopを再起動します。
再起動後、チャット画面の中にある🔨のアイコンをクリックして、以下の通り2つのMCPツールが表示されたらMCPサーバーは正常に接続できています
実際にチャットで適当にアイテムを追加したり、一覧を取得したりすることができれば、MCPサーバーは正常に動作しています。
まとめ
今回はFastAPIを使ってMCPサーバーを構築してみました。
MCPサーバーは独自のSDKで記述する方法もありますが、FastAPIで書いたアプリケーションをそのままMCPサーバー化できるのは、FastAPIを使い慣れている人間からすると学習コストが低くて良いですね。
執筆時点(2024年4月)では、リリースしたてのライブラリなのでこれからどこまでアップデートされるのか注目したいところです!
Discussion