Python の MCP SDK で作った MCP サーバーが、from mcp.server.fastmcp import FastMCP の行で ModuleNotFoundError になって起動しなくなったときの対処です。
解決方法
mcp 2.x では FastMCP が MCPServer に名前を変え、mcp.server.fastmcp はなくなっています。直し方は2つです。
方法1:2 未満に固定する(今のコードをそのまま動かしたいとき)
依存に <2 を付けます。
"mcp[cli]>=1.2.0,<2"
方法2:2.x の MCPServer に移る(これから新しく作る・2.x を使いたいとき)
import とクラス名を変えます。
from mcp.server.mcpserver import MCPServer
server = MCPServer("demo")
どちらの場合も、依存の範囲には上限を付けておくと、知らないうちに大きな版が入って止まることを防げます。
起きたこと
読み取り専用の BigQuery MCP サーバーを作ったとき、依存を次のように書いていました。
# /// script
# dependencies = [
# "mcp[cli]>=1.2.0",
# ]
# ///
uv run server.py で起動すると、import の時点で止まります。2026-10-12 にもう一度試したところ、mcp 2.3.0 が入り、次のエラーになりました。
ModuleNotFoundError: No module named 'mcp.server.fastmcp'. This is mcp 2.x, where FastMCP was renamed to MCPServer (from mcp.server.mcpserver import MCPServer) and other APIs changed; see the migration guide at https://py.sdk.modelcontextprotocol.io/v2/migration/#fastmcp-renamed-to-mcpserver or pin 'mcp<2' to keep running v1 code.
エラー文の中に、直し方が2つ書かれています。「MCPServer に移る」か「mcp<2 に固定する」です。
原因
>=1.2.0 には上限がないので、uv は入れられる中で一番新しい版(今は 2.x)を選びます。
公式の移行ガイドによると、2.x では FastMCP クラスが MCPServer に名前を変え、import の場所も mcp.server.fastmcp から mcp.server.mcpserver に移りました。古い場所から import すると ModuleNotFoundError になります。
方法1の詳細:2 未満に固定する
依存に上限を付けます。
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "mcp[cli]>=1.2.0,<2",
# ]
# ///
pyproject.toml で管理している場合も、同じように "mcp[cli]>=1.2.0,<2" と書きます。
固定したあとに入った版は 1.30.0 で、from mcp.server.fastmcp import FastMCP から、ツールの登録・一覧の取得までそのまま動きました。私の BigQuery MCP サーバーも、今はこの形で動かしています。
方法2の詳細:2.x の MCPServer に移る
2.x に移る場合、一番小さい形は次のとおりです。mcp 2.3.0 で、ツールを登録して一覧に add が出るところまで確かめました。
from mcp.server.mcpserver import MCPServer
server = MCPServer("demo")
@server.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@server.tool() のようなデコレーターの書き方は、1.x の FastMCP と同じでした。
ただし、変わったのは名前だけではありません。移行ガイドを読む限り、次のような変更もあります(私が確かめたのは、上の import とツールの登録だけです)。
ctx.fastmcpがctx.mcp_serverに変わったMcpErrorがMCPErrorに変わった- プロトコルの型のフィールド名が、camelCase から snake_case に変わった
- 通信方式ごとの設定が、
MCPServerのコンストラクタからrun()などに移った
ある程度の規模のサーバーを移すなら、移行ガイドを先に読んでから進めるのがよいと思います。
入っている版の確かめ方
uv で、実際にどの版が入るかを確かめられます。
uv run --no-project --with "mcp[cli]>=1.2.0" python -c "import importlib.metadata as m; print(m.version('mcp'))"
2026-10-12 の時点では、上限なしだと 2.3.0、<2 を付けると 1.30.0 が表示されました。
確かめた環境
- macOS(Apple Silicon)
- uv 0.11.26、Python 3.14.7
- mcp 2.3.0 と 1.30.0(2026-10-12 時点)
この MCP サーバーを作ったときの経緯や、ほかにハマったところ(戻り値の型と structured_output、docstring とツールの説明文)は、こちらに書いています。
参考
