FastMCP(fast mcp)は、MCP(Model Context Protocol)のサーバーとクライアントをPythonで作るためのフレームワークです。Pythonの関数に@mcp.toolを付けると、Claude CodeなどのAIエージェントから呼べるツールになります。この記事では、2026年10月17日にfastmcp 4.1.0/mcp 2.3.0/Python 3.12.13で実際に動かした結果をもとに、インストール、最小コード、動作確認、Claude Codeへの接続、FastAPI連携、認証、例外の扱いまでを説明します。一次情報は公式リポジトリPrefectHQ/fastmcpと公式ドキュメントgofastmcp.comです。
まとめ:FastMCPの用途・導入手順・選定条件
- 何をするものか:MCPサーバー・クライアント・会話内UI(Apps)をPythonで作るフレームワーク。「APIモックを生成するツール」という説明は誤りです。
- 現行版:最新は4.1.0(PyPI公開 2026-10-08)。3系も3.4.9(2026-10-16)まで保守版が出ています。必要なPythonは3.10以上です。
- 最小実装:
uv add fastmcpのあと、FastMCP("Demo")→@mcp.tool→mcp.run()の数行で動きます。型ヒントとdocstringから入力スキーマと説明文が作られます。 - 確認と接続:
Client(mcp)でプロセス内から呼んで試し、fastmcp install claude-code server.pyでClaude Codeに登録します。 - 本番で外せない設定:HTTP公開では
JWTVerifierで認証し、mask_error_details=Trueで例外の中身を隠します。既定のままだと素の例外メッセージがクライアントへ届きます。 - 選び方:既存のFastAPIやOpenAPIをMCP化する、複数サーバーを束ねる、クライアントも書くならFastMCP。サーバー1本を最小構成で出すだけなら公式SDKでも足ります。
FastMCPとは:MCPサーバー・クライアント・Appsを作るPythonフレームワーク
公式ドキュメントはFastMCPを「MCPのサーバー、クライアント、対話型アプリケーションを作るための標準フレームワーク」と定義しています。開発者は処理を書いた関数を渡すだけで、スキーマ生成・入力検証・トランスポート・認証・プロトコルの版の交渉はFastMCPが受け持ちます。柱は3つあります。関数やデータをツール・リソース・プロンプトとして公開するServers、任意のMCPサーバーへPython・CLIから接続するClients、ツールの結果を会話の中に表やグラフのUIとして出すApps(3.0.0で追加、pip install "fastmcp[apps]")です。
リポジトリはPrefectHQ/fastmcp(旧jlowin/fastmcp)で、ライセンスはApache-2.0、GitHubのスター表示は2026年10月17日時点で28.1kです。READMEは「全言語のMCPサーバーの70%を何らかの版のFastMCPが動かしている」「1日100万回以上ダウンロードされている」と書いていますが、どちらも出典の示されていない自称値です。MCPそのものの仕組みはMCP(Model Context Protocol)とは?AIと外部ツールをつなぐ標準規格の仕組みをわかりやすく解説で扱っています。
FastMCPの用途:APIモック生成とMCPツール公開の違い
日本語の解説には、FastMCPを「APIのモックを生成するツール」と紹介するものがあります。公式リポジトリにもドキュメントにも、モック生成を目的とする記述はありません。FastMCPの役割は、LLMやAIエージェントが呼び出す本物のツールを公開することです。FastAPIやOpenAPI仕様からMCPサーバーを作る機能(後述)と、APIの応答を模擬するモック生成は別の機能です。前者は実在するAPIをエージェントから呼べるようにするもので、偽の応答は作りません。
2026年10月時点の版:4.1.0と保守が続く3.4系
| パッケージ | 版 | PyPI公開日(UTC) |
|---|---|---|
| fastmcp | 4.1.0(最新) | 2026-10-08 |
| fastmcp | 4.0.0(4系の初の正式版) | 2026-08-31 |
| fastmcp | 3.4.9(3系の保守版) | 2026-10-16 |
| mcp(公式Python SDK) | 2.3.0 | 2026-10-02 |
4系は内部の土台を公式MCP Python SDKの2系に移し、MCP仕様の2026-07-28版(ステートレス化)と従来の2025-11-25版の両方に応答します。4.1.0のリリースノートは保守中心の内容で、HTTPセッションが無期限保持からSDK既定の30分アイドルタイムアウトに変わった点が破壊的変更に入っています。3系からの移行で何が壊れるかはFastMCP 4とは?sessionless対応と廃止APIから読む3系からの移行判断で詳しく扱います。
FastMCPのインストール手順:pip・uvでの導入と版の確認
FastMCPはPyPIで配布されています。公式はuvを推奨しています。uvを初めて使う場合は、インストール後にuv init fastmcp-demo、cd fastmcp-demoでプロジェクトを作成してください。以下のuvとpipはどちらかを選び、uvを選んだ場合は、この後のPython・FastMCPコマンドにもuv runを付けて実行します。
# uv の場合(公式推奨)
uv add fastmcp
# pip の場合
pip install fastmcp
# 本番は版を固定する
pip install "fastmcp==4.1.0"
# 版の確認
fastmcp version
fastmcp versionを実行すると、手元では「FastMCP version: 4.1.0」「MCP version: 2.3.0」「Python version: 3.12.13」とプラットフォームが表示されました。pip install fastmcpで入るのはfastmcpと、実装本体のfastmcp-slimの2つで、依存としてmcp(公式SDK)とhttpx2も入ります。3.2以前から上げてModuleNotFoundErrorが出たときは、pip install --force-reinstall fastmcpで入れ直します。4系はpydantic 2.12以上とStarlette 1.0.1以上を要求するので、古い版を固定しているプロジェクトでは依存の解決で止まります。公式の移行ガイドによると、Starlette 1系を受け入れる最初のFastAPIは0.133.0なので、同じ環境でFastAPIを使っている場合は先にFastAPIを0.133.0以上へ上げます。
MCPサーバーの作り方:@mcp.toolで関数を公開する最小コード
サーバーは、関数を書いてデコレータを付けるだけで作れます。次のコードをserver.pyとして保存しました。ツール・リソース・プロンプトを1つずつ持つ構成です。
from fastmcp import FastMCP
mcp = FastMCP("Demo")
@mcp.tool
def add(a: int, b: int) -> int:
"""2つの数値を加算する"""
return a + b
@mcp.resource("config://version")
def version() -> str:
return "1.0.0"
@mcp.prompt
def review(code: str) -> str:
"""コードレビューを依頼する定型プロンプト"""
return f"次のコードをレビューしてください:\n{code}"
if __name__ == "__main__":
mcp.run()
python server.pyまたはfastmcp run server.pyで起動します。run()を引数なしで呼ぶとstdio(標準入出力)で待ち受けるので、ポートは開きません。
型ヒントとdocstringから生成されるスキーマ
このサーバーにクライアントからtools/listを送ると、addの入力スキーマは{"type": "object", "additionalProperties": false, "properties": {"a": {"type": "integer"}, "b": {"type": "integer"}}, "required": ["a", "b"]}、説明文はdocstringの「2つの数値を加算する」になりました。JSON Schemaを手で書く必要はありません。
見落としやすいのは出力側です。戻り値がintのように辞書でない型だと、出力スキーマは{"result": ...}で包まれ、fastmcp listの表示もadd(a: int, b: int) -> dictになります。PythonのClientで受け取る.dataは元の5に戻るので、包みを意識するのは他言語のクライアントから構造化出力を読むときです。文字列"x"をaに渡すと、サーバーはpydanticの検証で弾き、クライアント側にはToolErrorとして「Input should be a valid integer」が返りました。
ツール・リソース・プロンプトの使い分け
| デコレータ | 公開するもの | 呼ぶ主体 | 用途の例 |
|---|---|---|---|
@mcp.tool |
実行できる関数 | LLMが判断して呼ぶ | 計算・検索・外部API呼び出し |
@mcp.resource |
読み取り専用のデータ | ホストのアプリ | 設定値・ファイル内容 |
@mcp.prompt |
指示のテンプレート | 利用者が選ぶ | 定型のレビュー依頼 |
最初は@mcp.toolだけで十分です。LLMに実行させたい処理はツールにし、ホストに読ませたいデータが出てきたらリソースを足します。リソースはクライアントによって扱いが違い、ツールほど確実には使われません。
作ったサーバーの動作確認:Client・CLI・pytestで試す
Claude Codeなどにつなぐ前に、Pythonから呼んで動くことを確かめます。手段は3つあり、目的で選びます。
Clientで呼ぶ:in-memory接続とプロトコル版
import asyncio
from fastmcp import Client
from server import mcp
async def main():
async with Client(mcp) as client:
tools = await client.list_tools()
print([t.name for t in tools]) # ['add']
result = await client.call_tool("add", {"a": 2, "b": 3})
print(result.data) # 5
print(client.protocol_version) # 2026-07-28
asyncio.run(main())
サーバーのインスタンスをClientへ直接渡すと、ネットワークもサブプロセスも使わずに同じプロセス内でつながります。交渉されたプロトコル版は2026-07-28で、Client(mcp, mode="legacy")にすると2025-11-25でつながりました。4系で変わった点が2つあります。Client("server.py")のように文字列でスクリプトを渡すと「FastMCP 5で削除予定」の警告が出るため、Client(Path("server.py"))と書きます。ツール定義のinputSchema属性も非推奨になり、input_schemaで読むよう警告されます。
CLIで呼ぶ:fastmcp list・call・inspect
fastmcp list server.py # ツール一覧と引数の型
fastmcp call server.py add a=2 b=3 # {"result": 5}
fastmcp inspect server.py # ツール・プロンプト・リソースの数と版
コードを書かずに確かめるならCLIが速い方法です。fastmcp callはa=2 b=3の形でも'{"a":2,"b":3}'のJSONでも引数を渡せました。注意点として、fastmcp listとcallは内部でもう一度fastmcp runを起動します。そのため、仮想環境を有効にせず.venv/bin/fastmcp list server.pyのようにフルパスで実行すると、「Client failed to connect: [Errno 2] No such file or directory: ‘fastmcp’」で失敗しました。source .venv/bin/activateかuv run経由で実行すれば通ります。
pytestによるツール呼び出しと一覧取得のテスト
# test_server.py として server.py と同じディレクトリに保存
# pytest と pytest-asyncio をインストールしてから実行:
# uv run pytest -o asyncio_mode=auto test_server.py
import pytest
from fastmcp import Client
from server import mcp
@pytest.fixture
async def client():
async with Client(mcp) as c:
yield c
async def test_add(client):
result = await client.call_tool("add", {"a": 2, "b": 3})
assert result.data == 5
async def test_tool_listed(client):
tools = await client.list_tools()
assert [t.name for t in tools] == ["add"]
公式のテストガイドどおりpytest-asyncioを入れ、asyncio_mode = "auto"にすると、上の2本は「2 passed in 2.21s」で通りました。in-memory接続なのでポートの競合もなく、CIにそのまま載せられます。
Claude Code・Claude Desktop・Cursorへの接続手順
手元で動いたサーバーをエージェントに使わせるには、ホスト側に登録します。FastMCPには登録用のfastmcp installがあり、4.1.0ではclaude-code・claude-desktop・cursor・gemini-cli・goose・mcp-json・stdioを選べます。
# Claude Code に登録(内部で claude mcp add を使う)
fastmcp install claude-code server.py --env API_KEY=xxx
# 手動で登録する場合(公式ドキュメントの例と同じ形)
claude mcp add my-server -- uv run --with fastmcp fastmcp run server.py
# HTTP で公開しているサーバーを登録する
claude mcp add --transport http my-server http://127.0.0.1:8000/mcp
# Claude Desktop・Cursor
fastmcp install claude-desktop server.py
fastmcp install cursor server.py
fastmcp install mcp-json server.pyは、MCPサーバーの起動設定JSONを出力します。貼り付け先と設定形式は、利用するホストの仕様に合わせてください。手元では"command": "uv"、"args": ["run", "--with", "fastmcp", "fastmcp", "run", "(server.pyの絶対パス)"]が出ました。uvが依存を用意してから起動する形なので、ホスト側の環境にFastMCPを入れておく必要はありません。HTTPの登録例はClaude Code 2.1.299のclaude mcp add --helpに載っている書式です。Claude Desktopの導入と設定ファイルの場所はClaude Desktopとは?できること・料金・インストール・MCP連携を解説【2026年】で扱っています。
FastAPI・OpenAPIからMCPサーバーを自動生成する手順
既存のREST APIをMCP化できる点は、公式SDKに無いFastMCPの機能です。稼働中のFastAPIアプリやOpenAPI仕様から、エンドポイントをツールとして公開できます。以下のFastAPI例には、追加でuv add fastapi uvicornまたはpip install fastapi uvicornを実行してください。
FastAPIアプリをMCP化する:FastMCP.from_fastapi()
from fastapi import FastAPI
from fastmcp import FastMCP
app = FastAPI()
@app.get("/items/{item_id}")
def get_item(item_id: int):
return {"id": item_id}
@app.post("/items")
def create_item(name: str):
return {"name": name}
mcp = FastMCP.from_fastapi(app=app)
if __name__ == "__main__":
mcp.run()
4.1.0で変換すると、ツール名はget_item_itemsとcreate_item_items_postになり、POSTのエンドポイントも既定でツールとして公開されました。つまり、更新系のAPIもLLMが呼べる状態になります。読み取りだけを渡したいなら、route_mapsで除外するか、MCP用に読み取り専用のエンドポイントだけを持つアプリを分けます。ツール名はoperationIdの付け方で変わるので、公開前にfastmcp listで確かめてください。FastAPIの基礎はFastAPIとは|最短で動かす手順とasync/defの使い分け【2026年版】、構成の設計はFastAPIのベストプラクティス|ディレクトリ構成・SQLAlchemy 2.1の設計・テストを実測で解説で扱っています。
既存FastAPIにMCPを同居させる:http_app()とlifespan
from fastapi import FastAPI
from fastmcp import FastMCP
mcp = FastMCP("Orders")
@mcp.tool
def order_status(order_id: int) -> str:
"""注文IDから配送状況を返す"""
return "shipped"
mcp_app = mcp.http_app(path="/")
app = FastAPI(lifespan=mcp_app.lifespan)
app.mount("/mcp", mcp_app)
# 起動: uvicorn main:app --port 8000
FastAPIはそのまま残し、同じプロセスの/mcpにMCPサーバーを載せる構成です。uvicornで起動し、Client("http://127.0.0.1:8000/mcp/")からorder_statusを呼ぶと「shipped」が返り、プロトコル版は2026-07-28でした。lifespanをFastAPIへ渡し忘れると、MCP側のセッション管理が初期化されません。既存のlifespanがある場合はfastmcp.utilities.lifespanのcombine_lifespansで束ねます。app.mount("/mcp", ...)のときにhttp_app(path="/")にしておくと、パスが/mcp/mcpと二重になりません。
OpenAPI仕様からMCP化する:from_openapi()とhttpx2
import json
import httpx2
from fastmcp import FastMCP
with open("openapi.json", encoding="utf-8") as f:
spec = json.load(f)
client = httpx2.AsyncClient(base_url="https://api.example.com")
mcp = FastMCP.from_openapi(openapi_spec=spec, client=client, name="My API Server")
FastAPI以外のフレームワークで作ったAPIでも、OpenAPI仕様があれば変換できます。4系ではHTTPクライアントがhttpxからhttpx2に変わりました。4.1.0ではOpenAPIのパスパラメータに単独の.や..のセグメントを含む値を拒否する修正も入っています。OpenAPI仕様の出し方はFastAPIのSwagger UI(/docs)の使い方|表示・設定・本番で隠す手順【2026年版】が参考になります。
認証の設定:JWTVerifierでHTTP公開のサーバーを保護する
認証はHTTPで公開するときに必要になります。stdioで手元のホストから起動する場合は使いません。JWTを検証するJWTVerifierに、発行者の公開鍵の取得先(JWKS)、issuer、audienceを渡します。
from fastmcp import FastMCP
from fastmcp.server.auth.providers.jwt import JWTVerifier
verifier = JWTVerifier(
jwks_uri="https://auth.example.com/.well-known/jwks.json",
issuer="https://auth.example.com",
audience="mcp-production-api",
required_scopes=["read"],
)
mcp = FastMCP(name="Protected API", auth=verifier)
if __name__ == "__main__":
mcp.run(transport="http", host="127.0.0.1", port=8000)
手元ではRSAKeyPair.generate()でテスト用の鍵とトークンを作り、public_keyで同じ設定を組んで試しました。結果は次のとおりです。
| 送ったもの | 応答 |
|---|---|
| トークンなし | 401(WWW-Authenticate: Bearer scope="read") |
| audienceが違うトークン | 401(error="invalid_token") |
| scopeにreadが無いトークン | 401(error="invalid_token") |
| 正しいトークン | ツールの結果が返る |
スコープ不足も403ではなく401のinvalid_tokenで返るため、ログだけでは「トークンが壊れている」のか「権限が足りない」のか区別できません。調べるときはトークンのaudとscopeを先に確かめます。クライアントからはClient("http://127.0.0.1:8000/mcp", auth="トークン文字列")と渡せば、FastMCPがAuthorization: Bearerヘッダーを付けます。ヘッダーの仕様はBearer Token(ベアラートークン)とは?読み方・Authorization: Bearerの書き方とJWTとの違いで説明しています。
固定のトークンで試すStaticTokenVerifierもありますが、トークンを平文で持つため公式は開発・テスト専用としています。外部のIDプロバイダーとOAuth 2.1でつなぐ場合はOAuthProxyを使い、ここではクライアント登録の新方式であるCIMDが既定で有効です。CIMDの仕組みはCIMD(Client ID Metadata Documents)とは?MCPでDCRに代わるOAuthクライアント登録の仕組みと実装【2026年10月】で扱っています。
例外の扱い:ToolErrorの使い分けとmask_error_detailsによる情報の非表示
ツールの中で例外が起きたとき、FastMCPの既定の挙動は、メッセージをそのままクライアントへ返すことです。検証用にraise ValueError("secret db password=xyz")だけを実行するツールboomを作って呼ぶと、クライアントには「Error calling tool ‘boom’: secret db password=xyz」が届きました。接続文字列や内部のパスを含む例外がLLMの文脈に入り、会話ログにも残ります。
from fastmcp import FastMCP
from fastmcp.exceptions import ToolError
mcp = FastMCP("Orders", mask_error_details=True)
@mcp.tool
def find_order(order_id: int) -> str:
"""注文を検索する"""
if order_id <= 0:
raise ToolError("注文IDが見つかりません") # この文言は利用者へ届く
raise ValueError("db timeout at 10.0.0.5") # この文言は隠される
同じboomをmask_error_details=Trueのサーバーで呼ぶと、返るのは「Error calling tool ‘boom’」だけになり、中身は届きませんでした。ToolErrorで投げたメッセージは、設定に関係なくそのまま届きます。本番ではmask_error_details=Trueにし、LLMに伝えたい理由(「注文IDが見つかりません」など)だけをToolErrorで返すのが安全です。
依存の注入とContext:Depends()とCurrentContext()の書き方
FastAPIと同じ考え方のDepends()で、設定値やDB接続をツールへ渡せます。リクエスト単位の機能を持つContextはCurrentContext()で受け取ります。
from fastmcp import Context, FastMCP
from fastmcp.dependencies import CurrentContext, Depends
mcp = FastMCP("Deps")
def get_config() -> dict:
return {"region": "ap-northeast-1"}
@mcp.tool
async def show_region(
config: dict = Depends(get_config),
ctx: Context = CurrentContext(),
) -> str:
"""設定からリージョン名を返す"""
return config["region"]
このツールの入力スキーマはpropertiesが空になり、注入する引数はLLMから見えませんでした。呼び出しの結果は「ap-northeast-1」です。4系で使えなくなったものもあります。クライアント側のLLMに生成を頼むctx.sample()とctx.list_roots()は削除され、ctx.elicit()は2026-07-28版の接続では使えません。ctx.info()によるログ送信は動きますが、「The logging capability is deprecated as of 2026-07-28 (SEP-2577)」の非推奨警告が出ました。
トランスポートと公開先:stdio・Streamable HTTP・Horizonの選び方
| 方式 | 起動の書き方 | 向く場面 |
|---|---|---|
| stdio(既定) | mcp.run() |
手元のClaude Code・Desktop |
| Streamable HTTP | mcp.run(transport="http") |
複数人・リモートからの利用 |
| in-memory | Client(mcp) |
テスト・開発 |
判断は単純で、自分のPCのホストから使うだけならstdio、ほかの人やサーバーから呼ばせるならStreamable HTTPです。HTTPの既定のエンドポイントは/mcpで、CLIならfastmcp run server.py --transport http --port 8000で起動できます。SSEは古いクライアント向けに残っているだけなので、新しく選ぶ理由はありません。仕様の違いはStreamable HTTPとは?MCPのトランスポートとSSEの違い、2026-07-28仕様の変更点で扱っています。
公開先にはFastMCPの開発元PrefectのPrefect Horizonもあり、公式のデプロイガイドによれば、GitHubのリポジトリを選ぶだけでURLが発行され、個人プロジェクトは無料です。起動時のバナーにも「Deploy free」という文言とHorizonのURLが表示されます。自社のクラウドで動かすならDockerなどでHTTPサーバーとして立て、前段で認証を掛けます。Python以外の基盤で公開する例はCloudflareでMCPサーバーを構築・公開する方法|Workersリモートデプロイと認証・ポータルにあります。
プロキシとサーバー合成:create_proxy()とmount()による複数サーバーの統合
from fastmcp import FastMCP
from fastmcp.server import create_proxy
weather = FastMCP("Weather")
@weather.tool
def get_forecast(city: str) -> str:
"""都市名から天気予報を返す"""
return f"{city}: 晴れ"
main = FastMCP("Gateway")
main.mount(weather, namespace="weather") # weather_get_forecast
main.mount(create_proxy("http://127.0.0.1:8000/mcp/"), namespace="orders")
mount()は別のサーバーを名前空間付きで取り込み、ツール名はweather_get_forecastになりました。create_proxy()はFastMCP製でないサーバーやリモートのサーバーも取り込めます。前章のFastAPI同居サーバーをプロキシしてnamespace="orders"で載せると、orders_order_statusとして呼べました。リモートのHTTPサーバーをstdioで再公開できるので、HTTPに対応していないホストからリモートのツールを使う橋渡しにもなります。3系の書き方は4系で通りません。mount(prefix=...)は「unexpected keyword argument ‘prefix’」のTypeErrorになり、as_proxy()とimport_server()は削除されています。
FastMCPと公式MCP Python SDK・TypeScript版の違いと選び方
公式SDK同梱のFastMCP 1.0と独立版の関係
FastMCP 1.0は2024年に公式MCP Python SDKへ取り込まれ、SDKの1系ではfrom mcp.server.fastmcp import FastMCPで使えました。SDKの2系(2026-07-28公開の2.0.0以降)では、この高レベルAPIがMCPServerに改名され、旧importはModuleNotFoundErrorになります。公式SDK側の書き換えはMCP Python SDK v2 移行:FastMCPからMCPServerへの書き換え手順と据え置き判断で扱っています。一方、pip install fastmcpで入る独立版は2.0以降も開発が続く別の系統で、FastAPI・OpenAPIからの生成、プロキシ、サーバー合成、クライアント、Appsを持ちます。サーバー1本を最小構成で出すだけなら公式SDKで足ります。その手順はMCPサーバーの作り方とAIエージェントへの接続手順|Python SDK 2.3でツール定義・認可を実装にまとめています。既存APIのMCP化や複数サーバーの統合まで進めるなら、独立版を選びます。
TypeScript版 punkpeye/fastmcp との違い
FastMCPという名前のTypeScript実装punkpeye/fastmcpもあり、npmの最新は2026年10月14日(UTC)公開のv4.22.10、GitHubのスター表示は3.3kです。名前は同じですが別の開発者による別リポジトリで、APIに互換性はありません。選定ではランタイムに加えて対応するMCP仕様を確認します。punkpeye/fastmcpは2025-11-25以前の仕様に対応し、2026-07-28仕様には未対応です。READMEは2026-07-28仕様向けの別フレームワークとしてViteMCPを案内しています。Node.jsで新仕様に対応させたいなら、2026-07-28仕様を実装した公式TypeScript SDKの2系(@modelcontextprotocol/server)も候補です。GoならMCPの公式Go SDKが出発点になり、MCP Go SDKの使い方|v1.8.0でサーバーを作る手順とmcp-goとの違いで扱っています。
FastMCPを採用すべきでない場面
自社アプリの中で関数を呼ぶだけで、外部のAIエージェントに機能を渡す必要がないなら、MCP自体が要りません。普通のライブラリ呼び出しで足ります。プロトコルの挙動を細部まで自分で制御したい場合も、抽象化の厚いFastMCPより公式SDKが向きます。もう1つは更新の速さです。4.0.0から4.1.0までの約5週間にパッチ版が11本出ており、版を固定せずに運用すると挙動が変わります。fastmcp==4.1.0のように固定し、上げる前にpytestを回す運用が組めないチームには勧めません。社内システムを生成AIから安全に呼べるようにしたいものの設計・認証・運用まで手が回らない場合は、一創のAIエージェント開発でMCPサーバーを含む構成をご相談いただけます。
よくある質問:FastMCPの使い方と最新版
FastMCPとは何ですか?
MCPのサーバーとクライアントをPythonで作るためのフレームワークです。関数に@mcp.toolを付けるとAIエージェントから呼べるツールになり、スキーマ生成・入力検証・トランスポート・認証はFastMCPが受け持ちます。リポジトリはPrefectHQ/fastmcpで、APIモックを生成するツールではありません。
FastMCPと公式MCP Python SDKは何が違いますか?
公式SDKに取り込まれたのはFastMCP 1.0で、SDK 2系ではMCPServerに改名されています。pip install fastmcpで入るのは独立して開発が続く系統で、FastAPI・OpenAPIからの自動生成、プロキシ、サーバー合成、クライアント、Appsを持ちます。最小構成のサーバーなら公式SDK、既存APIのMCP化や複数サーバーの統合ならFastMCPが向きます。
既存のFastAPIアプリをMCP化できますか?
できます。FastMCP.from_fastapi(app=app)に渡すと、各エンドポイントがツールになります。ただしPOSTなど更新系も既定でツールになるため、LLMに呼ばせたくないものはroute_mapsで除外してください。FastAPIを残して同じプロセスに載せるなら、mcp.http_app()をマウントし、lifespanをFastAPIへ渡します。
FastMCPでBearer Token認証はどう設定しますか?
サーバーはJWTVerifierにJWKSのURI・issuer・audienceを渡し、FastMCP(auth=verifier)に設定します。クライアントはClient(url, auth="トークン")で送るとAuthorization: Bearerが付きます。4.1.0ではトークンなし・audience違い・スコープ不足のいずれも401で返りました。認証はHTTPで公開するときだけ効き、stdioでは使いません。
FastMCPの最新バージョンとPythonの要件は?
2026年10月17日時点の最新は4.1.0(2026-10-08公開)で、3系も3.4.9(2026-10-16)まで保守版が出ています。Pythonは3.10以上が必要です。3系から上げるときはctx.sample()・as_proxy()・mount(prefix=...)を使っていないかを先に検索してください。本番ではfastmcp==4.1.0のように版を固定します。