原文(日本語に翻訳)
MCP並行呼び出しのタイムアウトハンドリングの問題を修正しました。あるツール呼び出しへのメッセージが、別の呼び出しのウォッチドッグタイマーをサイレントに解除してしまう問題でした。
原文(英語)
Fixed MCP concurrent-call timeout handling where a message for one tool call could silently disarm another call's watchdog
概要
複数のMCPツールを並行して呼び出す際に、あるツール呼び出しへの応答メッセージが誤って別のツール呼び出しのウォッチドッグタイマーをリセットしてしまうバグが修正されました。これにより、本来タイムアウトすべきツール呼び出しが無期限に待ち続けるケースがあり、セッションがハングしたように見える問題が発生していました。この修正により、各MCP呼び出しが独立したタイムアウト管理を持つようになります。
基本的な使い方
この修正はMCPの内部動作に関するものであり、ユーザーが特別な設定をする必要はありません。複数のMCPツールを同時に使用する場合に自動的に恩恵を受けます。
javascript
// MCPツールを複数並行して使用する例(Claude Codeが内部で処理)
// 例えば以下のような並行ツール呼び出し:
// - データベース検索ツール(応答が遅い場合あり)
// - ファイルシステムツール(即座に応答)
// - APIコールツール(ネットワーク遅延あり)
// 修正前: データベース検索の応答がAPIコールのタイマーをリセットする場合があった
// 修正後: 各ツール呼び出しが独自のタイムアウトタイマーを保持する実践例
複数のMCPツールを並行使用するシナリオ
# ユーザーの指示例
「GitHubのIssue一覧を取得して、同時にデータベースから関連するプロジェクト情報も検索してください」
# 内部動作(修正後):
# 1. GitHub MCPツール呼び出し開始 → タイムアウトタイマーA開始
# 2. データベースMCPツール呼び出し開始 → タイムアウトタイマーB開始
# 3. データベースから応答 → タイマーBをリセット(タイマーAには影響なし)
# 4. GitHubから応答 → タイマーAをリセット
# → 両方のツールが独立して正しくタイムアウト管理されるハングしていたセッションの症状と改善
# 修正前の問題のあるシナリオ:
# 1. ツールA(遅い)とツールB(速い)を並行呼び出し
# 2. ツールBが応答 → 誤ってツールAのタイマーをリセット
# 3. ツールAが実際には失敗しているのに、タイムアウトが発生しない
# 4. セッションが無期限に待ち続ける(ハングに見える)
# 修正後:
# 各ツール呼び出しのタイマーは独立して動作
# ツールAが設定時間内に応答しなければ、適切にタイムアウト処理されるMCPの設定確認
json
// ~/.claude/settings.json での MCP設定例
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your-token"
}
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
}
}
}タイムアウトが関係するシナリオの確認
bash
# MCPサーバーが応答しない場合のデバッグ
# Claude Codeのデバッグログを有効化
export CLAUDE_CODE_DEBUG=1
claude
# ログでMCPタイムアウトに関する情報を確認できる
# 修正後は各ツール呼び出しが独立してタイムアウトする注意点
- この修正はMCPツールを複数同時に使用する場合にのみ影響します
- 単一のMCPツール呼び出しには影響しません
- タイムアウト値自体の変更はありません。タイマーの管理ロジックが修正されました
- MCPツールが実際に遅い場合(大量データ処理など)は、引き続き適切な時間がかかります
- この修正により、以前ハングしていたセッションが適切にエラー処理されるようになります