mcp 2.x で「No module named ‘mcp.server.fastmcp’」になるときの対処:1.x に固定するか、MCPServer に移る

mcp 2.x で「No module named 'mcp.server.fastmcp'」になるときの対処:1.x に固定するか、MCPServer に移る

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 とツールの説明文)は、こちらに書いています。

参考

mcp 2.x で「No module named 'mcp.server.fastmcp'」になるときの対処:1.x に固定するか、MCPServer に移る

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

プログラミング、ゲーム、ガジェットが好き。ブログを書くことは自分の役に立つのか?を検証中。まったり情報発信しながら、少しでも誰かの役に立てれば幸いです。

目次