📝 この記事は forge.workstyle.tech に掲載した記事の転載です。
SQLiteやHacker NewsのMCPサーバーをuvxで起動していました。
再起動後、ImportError: cannot import name 'eval_type_backport'が出て起動しなくなりました。
原因は、古いmcp<1.10とPydantic 2.14の組み合わせです。
先に結論
uvxで起動する古いmcp<1.10のMCPサーバーは、Pydantic 2.14でImportError: cannot import name 'eval_type_backport'が出て起動しません。--with "pydantic<2.14"を加えてPydanticを2.14未満に固定し、再接続後にサーバーごとのinitialize応答を確認します。
なぜPydantic 2.14でImportErrorが出るのか
対象のサーバーは、古いmcpの系列にあたるmcp<1.10に固定されていました。mcp<1.10は、mcpの1.10未満を使う指定です。この系列は、Pydanticというパッケージの内部関数eval_type_backportを読み込みます。ところが、Pydantic 2.14ではその関数がなくなりました。
そのためサーバーが関数を読み込もうとしても見つからず、ImportErrorになります。エラーが出たSQLiteとHacker Newsの設定は、どちらもuvxで起動していました。
回避策は、古いmcpに加えてPydanticも2.14未満に固定することです。設定に次の指定を加えます。
--with "mcp<1.10" --with "pydantic<2.14"
今回追加するのはpydantic<2.14です。mcp<1.10は古いサーバーとの互換性を保つため、記録上すでに使われていた指定です。
uvxの引数にPydantic 2.14未満の指定を加える
設定画面などでコマンドと引数を分けている場合は、uvxの引数に--withとパッケージ指定を追加します。SQLiteサーバーなら、たとえば次の形です。
command: uvx
args: ["--with", "mcp<1.10", "--with", "pydantic<2.14", "mcp-server-sqlite", "--db-path", "<SQLiteのDBパス>"]
<SQLiteのDBパス>は、すでに使っているデータベースの場所に置き換えてください。起動引数では--db-pathの後ろにその値を渡します。
Hacker Newsサーバーにも同じ固定を付けます。起動するパッケージ名はmcp-hnです。
command: uvx
args: ["--with", "mcp<1.10", "--with", "pydantic<2.14", "mcp-hn"]
すでに--with "mcp<1.10"があるなら、その指定は残したまま、--with "pydantic<2.14"を追加します。設定全体を見て、Pydanticの固定が二重に入っていないか確認してください。
再接続後にMCPサーバーのinitialize応答を確認する
設定を保存したら、対象のMCPサーバーを再接続します。接続済みの表示だけでは、接続の初期化要求であるinitializeまで通ったか分かりません。クライアント側でその応答を確認します。
SQLiteとHacker Newsを個別に確認してください。両方を使っている場合、片方の初期化が通っても、もう片方の修正が成功したとは限りません。エラーが消え、どちらも初期化に応答すれば、起動時のImportErrorを回避できています。
手元に取り込み済みの依存関係だけで確認する場合は、uvx --offlineを使う方法もあります。記録では、オフラインでもSQLiteとHacker Newsの両方がMCPの初期化に応答することを確認しました。パッケージが手元に取り込まれていない環境では、この方法をそのまま使えるとは限りません。
どの既存設定にPydanticの指定を加えるか
古い設定には、mcp<1.10だけを固定しているものがありました。その場合はPydanticの指定を足します。一方、利用者が自分でPydanticのバージョンを指定している設定では、その値を変えません。
修正対象は、uvxで起動していて、--with mcp<1.10があり、Pydanticの指定がまだない設定です。この条件に合うサーバーだけに追加します。別の起動コマンドや、すでにPydanticを指定している設定には、同じ変更を機械的に加えないでください。
今回のエラーは、サーバーの起動コマンドそのものより、依存パッケージ間の互換性に関係していました。eval_type_backportが見つからないときは、古いmcpを使っていないか確認します。該当する場合はPydanticを2.14未満に固定し、サーバーごとにinitializeの応答を確かめます。
まとめ
-
uvxで起動し、mcp<1.10が指定された設定を確認する - Pydanticの指定がない対象設定に
--with "pydantic<2.14"を加える - サーバーを再接続する
- SQLiteとHacker Newsそれぞれの
initialize応答を確認する - 必要なら
uvx --offlineで手元の依存関係を使って確認する