🔨

FastAPIで始めるMCPサーバー

2025/04/16に公開

MCPが話題ですよね。最近でこそいろんな企業がMCPを提供する事例が増えて来ました。

そんな中、TLを眺めていたらFastAPIで構築したアプリケーションをMCPサーバー化させるライブラリを見つけました。

https://x.com/k_miura_io/status/1910479926341624311

FastAPI-MCPというそのままのネーミングですが、READMEに書いてある内容的には、FastAPIで構築したエンドポイントをMCPに変換してくれるというツールみたいです。

というわけで、今回はFastAPIを使って初めてのMCPサーバーを構築してみます。

なお、MCPサーバーとは何かという話はしません(他の人の解説のほうがわかりやすいと思うので…)

今回のソースコードは以下のGithubのリポジトリに置いてあります。

https://github.com/Miura55/fastapi-mcp-workshop?tab=readme-ov-file

環境構築

まずは、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