Skip to content

原文(日本語訳)

キャッシュされた接続Promiseが解決されない場合にMCPサーバーの再接続がハングする問題を修正しました。

原文(英語)

Fixed MCP server reconnection hanging when cached connection promise never resolves

概要

MCPサーバーへの再接続時に、キャッシュされた接続Promiseが永久に解決されず、Claude Codeが応答しなくなる(ハングする)問題が修正されました。この問題は、MCPサーバーが一時的に利用できなくなった後に再接続しようとした際や、ネットワーク問題で接続が中断された場合に発生していました。v2.1.9では、適切なタイムアウト処理とエラーハンドリングが追加され、接続が失敗した場合でもClaude Codeがフリーズせずに適切にエラーを報告するようになりました。

問題の詳細

発生していた症状

  • MCPサーバーへの接続が切れた後、再接続時にClaude Codeが応答しなくなる
  • ローディング表示が永久に続く
  • Ctrl+Cでもキャンセルできない場合がある
  • MCPサーバーを使用しているツールが全く動作しなくなる

発生シナリオ

  1. ネットワークの一時的な切断

    • Wi-Fiの再接続時
    • VPN接続の切り替え時
    • モバイル接続とWi-Fi間の切り替え時
  2. MCPサーバーの再起動

    • サーバープロセスがクラッシュした後
    • 設定変更後にサーバーを再起動した場合
    • サーバーのアップデート時
  3. タイムアウト後の再接続

    • 長時間アイドル後にMCPサーバーが接続を切断した場合
    • サーバー側のタイムアウト設定による切断

根本原因

Claude Codeは効率化のため、MCPサーバーへの接続をキャッシュしていました。接続が失敗した場合、このキャッシュされたPromiseが永久に「保留中」状態のまま残り、再接続試行時に新しい接続を作成せずに古いPromiseを待ち続けていました。

修正内容

v2.1.9での改善点:

  • タイムアウト処理の追加: 接続が一定時間内に確立されない場合、自動的に失敗として処理
  • キャッシュの適切な無効化: 失敗した接続Promiseはキャッシュから削除され、再試行時に新しい接続を作成
  • エラー報告の改善: 接続失敗時に明確なエラーメッセージを表示
  • リトライロジックの強化: 自動的に再接続を試み、ユーザーに状況を通知

影響を受けていたシナリオ

リモートMCPサーバーの使用

HTTPまたはSSE経由でリモートMCPサーバーに接続している場合に影響がありました。

bash
# 以前は再接続時にハングする可能性があった
claude mcp add --transport http github https://api.githubcopilot.com/mcp/

不安定なネットワーク環境

カフェやコワーキングスペースなど、ネットワークが不安定な環境での使用時に問題が発生していました。

開発中のMCPサーバー

開発中のMCPサーバーを頻繁に再起動する場合に影響がありました。

bash
# サーバー開発時の典型的なワークフロー
# 1. MCPサーバーのコードを変更
# 2. サーバーを再起動
# 3. Claude Codeで動作確認
# ← 以前はここでハングする可能性があった

対処方法(v2.1.9以前)

v2.1.9より前のバージョンでこの問題が発生した場合:

  1. Claude Codeを再起動: Ctrl+Cで終了し、claude を再実行
  2. MCPサーバーの状態確認: /mcp コマンドでサーバー状態を確認
  3. 接続のリセット: 必要に応じてMCPサーバーを削除して再追加

注意点

  • この修正により、MCPサーバー接続の信頼性が大幅に向上しました
  • MCPサーバーのタイムアウトは MCP_TIMEOUT 環境変数で設定可能(デフォルト値が使用されます)
  • ネットワークが不安定な環境でも、適切にエラーが報告されるようになりました
  • 既存のMCPサーバー設定に変更は不要です

関連情報