/ ディレクトリ / プレイグラウンド / FastMCP
● 公式 PrefectHQ ⚡ 即起動

FastMCP

作者 PrefectHQ · PrefectHQ/fastmcp

Pythonらしい方法でMCPサーバーを構築 — 関数にデコレータを付けるだけでツールが完成。わずか20行でMCPをリリースできます。

FastMCPは、MCPサーバーを構築するためのPythonフレームワークです(インストールして使うサーバーではありません)。@mcp.toolデコレータ1つで、型付き関数をMCPツールに変換し、アノテーションからスキーマを自動生成します。stdio/SSEトランスポート、ライフサイクル管理、プロトコルの詳細をすべて処理するため、ビジネスロジックの記述に集中できます。

なぜ使うのか

主な機能

ライブデモ

実際の動作

fastmcp.replay ▶ 準備完了
0/0

インストール

クライアントを選択

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

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

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

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

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

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

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

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

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

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

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

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

claude mcp add fastmcp -- uvx fastmcp

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

ユースケース

実用的な使い方: FastMCP

社内REST APIを1時間以内にMCPとして公開する

👤 既存のPythonサービスを持つバックエンドエンジニア ⏱ ~45 min intermediate

使うタイミング: エージェントから呼び出せるようにしたい社内APIがあり、クライアント仕様をゼロから書きたくない場合。

前提条件
  • Python 3.10+python --version
  • uvがインストール済みcurl -LsSf https://astral.sh/uv/install.sh | sh
フロー
  1. プロジェクトの雛形を作成
    Scaffold a FastMCP server project called 'acme-api-mcp' with one starter tool. Use uv for dependency management.✓ コピーしました
    → pyproject.toml + server.pyに動作する@mcp.toolのサンプルが含まれている
  2. 最も価値の高い3つのエンドポイントをラップ
    My internal API has endpoints /orders/{id}, /customers/search, /invoices/{id}/pdf. Write a FastMCP tool for each, using httpx.AsyncClient and reading AUTH_TOKEN from env.✓ コピーしました
    → 型ヒントとdocstringを持つデコレータ付き関数が3つ作成され、docstringがツール説明として機能する
  3. MCP Inspectorでローカルテスト
    Run the server with uv run mcp dev server.py. Open the inspector and call each tool with a realistic input.✓ コピーしました
    → ツールが期待通りのJSONを返し、スタックトレースが出ない

結果: Claude Desktopや任意のMCPクライアントから接続できる、動作するMCPサーバーが完成します。

注意点
  • docstringに実際のトークンを含む例を書いてしまい、シークレットがツール説明に漏洩する — docstringには動作の説明のみを記述し、実トークンの例は含めない。シークレットはos.environで読み込み、エラーメッセージにも絶対に出力しない
  • 非同期と同期の混在によりイベントループエラーが発生する — どちらか一方に統一する — HTTPクライアントがasyncならツール全体をasyncにし、ツール内でasyncio.runを呼ばない

社内ドキュメントをRAG用MCPリソースとして公開する

👤 エージェント基盤を構築するプラットフォームエンジニア ⏱ ~30 min intermediate

使うタイミング: ファイルごとにツール呼び出しをせず、エージェントが自動的に社内ナレッジを検出・取得できるようにしたい場合。

フロー
  1. リソース一覧を定義
    Define a FastMCP resource at URI docs://{path} that lists all markdown files under ./docs/ and returns their content on read.✓ コピーしました
    → リソースが登録され、Inspectorに一覧が表示される
  2. テンプレートリソースを追加
    Add a resource template docs://{category}/{slug} that returns the matching file. Document valid {category} values.✓ コピーしました
    → テンプレートが登録され、パラメータ付きの取得が動作する
  3. 実際のクライアントでテスト
    Connect Claude Desktop to the server. Verify the Resources menu lists all docs and content loads.✓ コピーしました
    → リソースがアタッチ可能なコンテキストとして表示される

結果: エージェントがネイティブに参照できるリソースベースのナレッジ基盤が完成します。静的コンテンツにはツール呼び出しより効率的です。

注意点
  • リソース一覧が多すぎてクライアントのUIが圧迫される — 一覧エンドポイントでページネーションまたはフィルタリングを行う。すべてのファイルを表示する必要はない

FastMCPサーバーをリモートSSEエンドポイントとしてデプロイする

👤 複数チームにサービスを提供するプラットフォームエンジニア ⏱ ~60 min advanced

使うタイミング: 複数の開発者が同じMCPを必要としている場合 — 一度ホストすれば、全員がローカルでstdioを実行する必要がなくなります。

前提条件
  • コンテナホスト(Cloud Run、Fly、Railway) — Docker対応の任意のランタイムで動作
フロー
  1. トランスポートをSSEに切り替え
    Modify server.py to run mcp.run(transport='sse', host='0.0.0.0', port=8080). Add a minimal Dockerfile.✓ コピーしました
    → ローカルでcurl localhost:8080/sseを実行するとSSEハンドシェイクが表示される
  2. 認証付きでデプロイ
    Deploy to Cloud Run with IAM auth. Front the /sse endpoint with a header-based auth check in a FastAPI middleware.✓ コピーしました
    → 公開URLで、未認証リクエストに401が返される
  3. クライアントを接続
    Share the connection command with teammates: npx -y mcp-remote https://mcp.acme.com/sse. Verify their Claude Desktop picks up the tools.✓ コピーしました
    → チームメンバーのクライアントに同じツールが表示される

結果: 共有リモートMCPの完成 — コードベースは1つ、ユーザーは多数、更新も簡単です。

注意点
  • 一部の企業プロキシ経由でSSE接続が切断される — 代わりにstreamable HTTPトランスポート(新しい仕様)を使用するか、VPN/直接接続の要件をドキュメント化する
組み合わせ: cloud-run

組み合わせ

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

fastmcp + cloud-run

一度ビルドしてCloud Runにデプロイし、チーム全体で共有する

Wrap my internal pricing API as a FastMCP server, containerize it, and deploy to Cloud Run with IAM auth.✓ コピーしました
fastmcp + fastapi-mcp

アプローチの比較 — 新規開発にはFastMCP、既存のFastAPIアプリにはfastapi-mcp

I have an existing FastAPI service. Should I add fastapi-mcp to expose it or rewrite in FastMCP? Compare based on my routes.✓ コピーしました

ツール

このMCPが提供する機能

ツール入力呼び出すタイミングコスト
@mcp.tool decorated function with typed signature エージェントに呼び出させたい任意の関数をラップする free
@mcp.resource URI template + function 読み取り可能なコンテンツ(ドキュメント、コンフィグ、データスナップショット)を公開する free
@mcp.prompt decorated function returning Message[] 再利用可能なマルチターンプロンプトのテンプレートをクライアントに提供する free
mcp.run transport: 'stdio'|'sse'|'streamable-http', host?, port? エントリポイント — メインスクリプトの末尾で呼び出す free
Context (ctx) parameter inject ctx: Context into any tool 進捗のストリーミングやログ出力が必要な長時間実行ツール free

コストと制限

運用コスト

APIクォータ
なし — これはフレームワークであり、サービスではありません
呼び出しあたりのトークン
LLM呼び出しはサーバー側で実行されます。フレームワーク自体のオーバーヘッドは無視できる程度です
金額
無料、オープンソース
ヒント
静的コンテンツにはツールではなくリソースを使用してください — リソースは事前宣言されるため、トークン消費が少なく済みます

セキュリティ

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

認証情報の保管: 任意の方法で管理可能 — 環境変数が一般的。シークレットはプロセス起動時に読み込み、呼び出しごとには読み込まない
データ送信先: ツール関数がアクセスする外部サービスに依存します

トラブルシューティング

よくあるエラーと対処法

クライアントでツールスキーマの必須フィールドが欠落している

関数パラメータに型ヒントが必要です。def foo(x)のような書き方では有用なスキーマが生成されません — docstring付きでdef foo(x: str)のように記述してください。

確認: Run `uv run mcp dev server.py` and check the Inspector's tool schema
サーバーは起動するがクライアントにツールが0件と表示される

stdioとSSEのコンフィグが混在しています。Claude Desktopにはtransport='stdio'を、mcp-remoteには'sse'を使用してください。

`ImportError: No module named 'fastmcp'`

uv pip install fastmcpでインストールするか、pyproject.tomlのdependenciesに追加してください。サーバーを同じvenvから実行しているか確認してください。

確認: uv pip show fastmcp
非同期ツールが最初の呼び出しでハングする

asyncツール内で同期版のhttpxをインポートしています。httpx.AsyncClientasync withで使用してください — 同期と非同期を混在させないでください。

代替案

FastMCP 他との比較

代替案代わりに使う場面トレードオフ
TypeScript MCP SDKTypeScript/Nodeの技術スタックで統一したい場合公式かつメンテナンスが良好で、同様の開発体験 — 言語が異なるだけ
fastapi-mcp既存のFastAPIアプリがあり、ルートをツールとして公開したい場合MCP側の制御は少ないが、既存サービスのリファクタリングが不要
csharp-sdk.NETの技術スタックを使用している場合ファーストパーティだが、サンプルのエコシステムは小規模

その他

リソース

📖 GitHub の公式 README を読む

🐙 オープンな issue を見る

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