/ ディレクトリ / プレイグラウンド / FastAPI MCP
● コミュニティ tadata-org ⚡ 即起動

FastAPI MCP

作者 tadata-org · tadata-org/fastapi_mcp

1行マウントするだけで、すべてのFastAPIルートをMCPツールに変換 — スキーマはPydanticモデルから、認証はミドルウェアからそのまま引き継ぎます。

fastapi-mcpは既存のFastAPIアプリをラップし、そのルートをMCPツールとして公開します。ツールスキーマはPydanticのリクエスト/レスポンスモデルから自動生成されます。既存の認証ミドルウェアはそのまま動作します。「Python APIがある」状態から「エージェントがそれを呼べる」状態への最短パスです。

なぜ使うのか

主な機能

ライブデモ

実際の動作

fastapi-mcp.replay ▶ 準備完了
0/0

インストール

クライアントを選択

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "fastapi-mcp": {
      "command": "uvx",
      "args": [
        "fastapi-mcp"
      ]
    }
  }
}

Claude Desktop → Settings → Developer → Edit Config を開く。保存後、アプリを再起動。

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "fastapi-mcp": {
      "command": "uvx",
      "args": [
        "fastapi-mcp"
      ]
    }
  }
}

Cursor は Claude Desktop と同じ mcpServers スキーマを使用。プロジェクト設定はグローバルより優先。

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "fastapi-mcp": {
      "command": "uvx",
      "args": [
        "fastapi-mcp"
      ]
    }
  }
}

Cline サイドバーの MCP Servers アイコンをクリックし、"Edit Configuration" を選択。

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "fastapi-mcp": {
      "command": "uvx",
      "args": [
        "fastapi-mcp"
      ]
    }
  }
}

Claude Desktop と同じ形式。Windsurf を再起動して反映。

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "fastapi-mcp",
      "command": "uvx",
      "args": [
        "fastapi-mcp"
      ]
    }
  ]
}

Continue はマップではなくサーバーオブジェクトの配列を使用。

~/.config/zed/settings.json
{
  "context_servers": {
    "fastapi-mcp": {
      "command": {
        "path": "uvx",
        "args": [
          "fastapi-mcp"
        ]
      }
    }
  }
}

context_servers に追加。保存時に Zed がホットリロード。

claude mcp add fastapi-mcp -- uvx fastapi-mcp

ワンライナー。claude mcp list で確認、claude mcp remove で削除。

ユースケース

実用的な使い方: FastAPI MCP

既存のFastAPIアプリをリファクタリングなしでMCPとして公開する

👤 稼働中のFastAPIサービスを持つバックエンド開発者 ⏱ ~30 min intermediate

使うタイミング: すでにFastAPI APIを運用している。エージェントにそれを使わせたい。並行してコードベースを二重管理したくない。

前提条件
  • リクエスト/レスポンスにPydanticモデルを使用した動作中のFastAPIアプリ — ルートがdictを返している場合は、まずPydantic BaseModelにリファクタリングしてください。そうしないとツールスキーマがobjectになります
フロー
  1. インストールとマウント
    Add fastapi-mcp to my project. In my main.py, after app = FastAPI(), add FastApiMCP(app).mount(). Show the diff.✓ コピーしました
    → 差分は最小限。サーバーは引き続き動作する
  2. ツールの出現を確認
    Run the server. Connect with npx -y mcp-remote http://localhost:8000/mcp. List tools — do all my GET/POST routes show up?✓ コピーしました
    → ツールが一覧に表示され、名前がルートのoperation_idと一致する
  3. 公開範囲のフィルタリング
    I don't want /admin/* routes exposed. Reconfigure with include_operations or exclude by tag.✓ コピーしました
    → 管理ルートがツール一覧から消える

結果: 既存のAPIが、スキーマやロジックの重複なしにMCPアドレス可能になります。

注意点
  • すべてのルートがツールになる — 公開するつもりのない内部ルートも含めて — 本番公開前にinclude_tags=['public']またはexclude_operations=[...]を明示的に設定する
  • operation_idのないルートはread_item_items__item_id__getのような見苦しい名前が自動生成される — ルートには必ず明示的なoperation_idを設定する: @app.get('/items/{id}', operation_id='get_item')
組み合わせ: fastmcp

認証付きFastAPIアプリの認証を壊さずにMCPとして公開する

👤 FastAPIでBearer/OAuth2認証を使用しているバックエンド開発者 ⏱ ~30 min intermediate

使うタイミング: FastAPIルートでDepends(get_current_user)を使用している。MCP経由で呼ばれた際にもそれが引き続き実行される必要がある。

前提条件
  • 既存の認証依存関係Depends(oauth2_scheme)または同等のもの
フロー
  1. Authorizationヘッダーのパススルー
    Configure fastapi-mcp to forward the Authorization header from MCP context to the underlying route. Point me at the settings.✓ コピーしました
    → 設定変更完了。ルートがヘッダーを受け取るようになる
  2. 認証付き呼び出しのテスト
    Call the protected endpoint via MCP. First with no token (expect 401), then with a valid one (expect 200).✓ コピーしました
    → 401 未認証、200 認証済み — 直接HTTPと同じ挙動
  3. クライアント側セットアップのドキュメント作成
    Write the mcp-remote config users need so their Claude Desktop passes an Authorization header.✓ コピーしました
    → コピー&ペースト可能なクライアントコンフィグスニペット

結果: curlからの呼び出しでもエージェントからの呼び出しでも、認証が同一に適用されます。

注意点
  • エージェントが長寿命のルートトークンを誤って使用する — ユーザーごとに短寿命のスコープ付きトークンを発行し、積極的にローテーションする — MCPも他のAPIクライアントと同様に扱う

既存APIと並行してMCPエンドポイントをデプロイする

👤 プラットフォームエンジニア ⏱ ~45 min advanced

使うタイミング: Cloud Run / Fly / Render上でFastAPIを運用している。MCPも同じデプロイに相乗りさせたい。

フロー
  1. 安定したパスにマウント
    Mount fastapi-mcp at /mcp. Confirm /docs (Swagger) and /mcp both work from the same process.✓ コピーしました
    → 両方のパスがレスポンスを返す
  2. 既存のイングレス経由で公開
    Update my Cloud Run / nginx / API gateway config to route /mcp to this service with SSE-compatible timeouts (no buffering, long idle).✓ コピーしました
    → リモートのmcp-remoteが正常に接続される
  3. クライアントセットアップのドキュメント作成
    Write the team-facing README: how to add this MCP to Claude Desktop + Cursor.✓ コピーしました
    → クライアントごとのコピー&ペースト可能なコンフィグ

結果: 1つのデプロイで2つのプロトコル(REST + MCP)、追加インフラゼロ。

注意点
  • プロキシがSSEレスポンスをバッファリングし、接続がハングしたように見える — プロキシバッファリングを無効にする — nginx: proxy_buffering off、Cloud Run: デフォルトで問題なし、Cloudflare: ストリーミングを有効化
組み合わせ: cloud-run · vercel

組み合わせ

他のMCPと組み合わせて10倍の力を

fastapi-mcp + fastmcp

レガシールートにはfastapi-mcpを、同一プロセス内のグリーンフィールドなエージェント専用ツールにはFastMCPを使う

Mount fastapi-mcp for my existing /api/* routes and register 3 new FastMCP tools for agent-only operations like bulk_sync.✓ コピーしました
fastapi-mcp + cloud-run

RESTとMCPをCloud Runにまとめてデプロイ

Take my FastAPI service, add fastapi-mcp, containerize, and deploy to Cloud Run with IAM auth on /mcp.✓ コピーしました

ツール

このMCPが提供する機能

ツール入力呼び出すタイミングコスト
FastApiMCP(app, **options) app: FastAPI, include_operations?, exclude_operations?, include_tags?, exclude_tags?, name?, description? ビルド時のワイヤリング — 起動時に一度だけ作成 free
.mount(path='/mcp') path? インスタンス生成直後に呼び出す free
Auto-generated tools derived from each FastAPI route's request/response models 操作不要 — マウントすると自動的に出現する same as your route

コストと制限

運用コスト

APIクォータ
既存APIのクォータを継承
呼び出しあたりのトークン
直接HTTPコールと同じ — オーバーヘッドなし
金額
無料、オープンソース
ヒント
冗長な管理/デバッグルートはMCPから除外する — エージェントのツール一覧を汚染し、list_toolsのたびにトークンを消費する

セキュリティ

権限、シークレット、影響範囲

認証情報の保管: FastAPIで使用しているものをそのまま利用 — fastapi-mcpが新たな認証レイヤーを追加することはありません
データ送信先: 既存ルートのデータ送信先と同じ

トラブルシューティング

よくあるエラーと対処法

ツールは表示されるが、呼び出すと422 validation errorsが返る

ルートがPydantic BaseModelではなくdictを使用しています。MCPは型付きJSONを送信するため、ルートがパースできません。BaseModelにリファクタリングしてください。

/itemsにルートが存在するが対応するツールがない

fastapi-mcpは一部のケースでresponse_modelまたはoperation_idがないルートをスキップします。response_model=ItemOutoperation_id='get_item'を追加してください。

確認: curl http://localhost:8000/openapi.json | jq '.paths'
MCP経由の呼び出しで認証依存関係が実行されない

FastApiMCPオプションでヘッダーフォワーディングを設定してください。依存関係がヘッダーではなくCookieを読み取っている場合は、ヘッダーベース認証に切り替えてください — MCPにはCookie jarがありません。

nginx経由でSSEがハングする

/mcpロケーションブロックにproxy_buffering off; proxy_cache off; proxy_read_timeout 3600s;を追加してください。

代替案

FastAPI MCP 他との比較

代替案代わりに使う場面トレードオフ
FastMCPグリーンフィールド — 既存のFastAPIアプリがなく、MCPサーバーを新規作成する場合新規プロジェクトではよりクリーンなDX。既存アプリへの後付けではfastapi-mcpが有利
Hand-written SDK serverツール名、説明、スキーマをきめ細かく制御する必要がある場合コード量・メンテナンスコストが増大 — 通常は割に合わない

その他

リソース

📖 GitHub の公式 README を読む

🐙 オープンな issue を見る

🔍 400以上のMCPサーバーとSkillsを見る