Claude Media
Claude Codeでツール呼び出しが実行されない不具合と回避策

Claude Codeでツール呼び出しが実行されない不具合と回避策

Edit/ReadなどのツールがXML片や「court」という単語のまま出力され実行されない不具合を、GitHub issueの一次データからまとめます。

Claude Code CLIでOpusモデルを使った長時間セッション中に、EditやReadなどのツール呼び出しが実行されず、<invoke>タグを含むXML片がそのままチャット欄に文字として出力される不具合が報告されています。GitHub issue #64108では、出力の直前にcourtという無関係な単語が現れ(環境によってはcountなど別の語)、表示上の崩れではなくモデルが生成するテキスト自体の破損だと確認されています。原因はまだ特定されていません。

症状 — ツール呼び出しがXMLの生テキストとして出力される

最初の報告(2026年5月31日)は、Opus・大コンテキストのCLIセッションで少なくとも6回発生したというものでした。典型的な出力は次の形です。

court
<invoke name="Edit">
<parameter name="file_path">/path/to/file</parameter>
<parameter name="old_string">...</parameter>
<parameter name="new_string">...</parameter>
</invoke>

本来ならEditが実行されるはずの箇所が、そのままテキストとして表示されます。最初の報告では影響がほぼEditとReadに集中し、Bashは無事だったとされていました。ところが別の報告者は逆の傾向を見つけています。53件の発生のうち42件がBashで、Edit・Read・内部のタスク更新呼び出しも巻き込まれていたというものです。影響を受けるツールの種類は環境ごとに一定しません。

単一のinvokeのターンも、複数のinvokeを並べる並列呼び出しのターンも影響を受けます。タグがantml:invokeのように名前空間付きで出た報告もあります。見た目だけで済む報告もあり、ある報告者は裏の呼び出しが大半は問題なく実行されたとしています(Bashへの波及は未検証と本人が注記)。一方、実行は一度も起きなかったという報告もあります。

漏れ出すトークンも一種類ではありません。多くの報告はcourtですが、ある報告者の環境では常にcountが現れ、courtやcallは一度も出ていません。さらに別の報告ではcourtesyやcourthood、courceforgeといった派生語も観測されています。トークンが環境によって変わるという事実は、固定の文字列バグではなく、モデルの出力生成そのものが不安定になっている可能性を示しています。セッションのJSONLを直接調べた複数の報告が、この文字列がモデルの生成テキスト自体に含まれており、描画側の不具合ではないと確かめています。

報告はどう広がったか — 同じ形の報告が複数ある

このissueには、同じ症状形状を報告する6件の関連issueが2026年6月2日までにひも付けられました。下流の見え方はさまざまです。表示上のノイズで終わるものもあれば、courtが50回以上続く無限ループ、「ツール呼び出しをパースできませんでした(再試行も失敗)」というエラーでターンが静かに落ちるもの、生の<invoke>タグがそのまま描画されるものまであります。

経過

コメント欄に現れた報告の流れ

  1. 5月28日Opus 4.7・CLI 2.1.148のセッションで発生が始まる

    後の集計で、この日が最初の発生日と分かっています。

  2. 5月31日issue #64108が起票される

    macOS・Opusのセッションで、EditとReadが中心でした。

  3. 6月1日〜2日Opus 4.8の1Mコンテキストとの組み合わせでも報告が続く

    1セッションで約182回という報告が付き、関連issueが6件ひも付いてWindowsの報告も加わります。

  4. 6月4日〜13日Linuxで初発が出て、6月13日に連続化する

    あるアカウントの記録では、6月4日に初発が出たあと、6月13日に連続して起きました。

  5. 6月12日Windows 11のClaude Cowork(デスクトップアプリ)でも同じ症状

    Opus 4.8・effort highで、courtが数十回続くループにも落ちています。

  6. 6月26日〜30日`count`のほか、`courthood`や`courceforge`が出る

    モデルはclaude-opus-4-8のまま、同じ形が続いたという報告もあります。

  7. 7月20日コメント欄の最後の投稿

    最後のコメントは7月20日で、issueはopenです。付いているラベルはbug・area:model・platform:macos・platform:linuxです。

いつ起きやすいか — 長いコンテキストとOpus系モデル

ある報告は、2026年5月28日から6月2日までの1セッションを対象に、この形状の発生を日別に数えています。

日付発生件数
5/28発生件数6
5/29発生件数21
5/30発生件数143
5/31発生件数134
6/1発生件数143
6/2発生件数44(11:38 UTCまでの集計)

このセッションはOpus 4.7・Claude Code 2.1.148のまま、モデルもクライアントも変えずに走り続けていました。5/30の急増はClaude Code 2.1.158のリリース時期と、5/28の発生開始はOpus 4.8の展開日と重なります。報告者自身が、これを「タイミングが一致しているだけで、因果関係の証明ではない」と明記しています。

別の報告はLinux上のセッション記録を2026年5月19日から6月13日まで走査し、その集計をまとめています。

数字

Linuxの1アカウントで走査した結果

  • 該当イベント

    56件

    呼び出しが消える2つの形の合計(46件と10件)

  • Opus 4.8の割合

    100%

    Fable 5・Opus 4.7・Haikuは0件

  • 初発までの応答回数

    中央値約100回

    17〜335回、66,000〜476,000トークン

  • モデルを切り替えたセッション

    626回→17回

    Fable 5では0件、Opus 4.8に替えて17回目で初発

報告者による集計。133セッションが対象

コンテキストの大きさだけが条件ではありません。高コンテキストまで進んでも一度も発生しなかったOpusセッションが44件あり、最大で642,000トークンに達していました。長いコンテキストは必要条件ではあっても、それだけでは十分条件にならないというのがこの報告の見立てです。

別のOpus 4.8 1Mの報告では、同じセッションで約94,000トークンのうちは出ず、235,000トークンを超えたあたりから頻発しました。約6時間・約790ターンの長いセッションで初めて出て、その後の数時間で約8回起きたという報告もあります。この報告では有効なtool_useが約40%のターンに残っており、全面的には壊れません。

除外された仮説 — 特定バージョンやプラットフォームに限らない

このクラスタの報告を横断すると、いくつかの仮説が消去法で外れています。Opus 4.8限定という仮説は、Opus 4.7でも同じ形状が確認されたことで外れました。ただしLinuxの1アカウントではOpus 4.7が0件で、約208,000トークンまで使ったOpus 4.7セッションでも0件だった報告があります。モデルへの依存の強さは環境ごとに違い、一枚岩の説明にはなっていません。

特定のCLIバージョン限定という仮説も、2.1.148から2.1.193まで幅広いバージョンで再現が報告されており成立しません。プラットフォーム限定という仮説も、macOS・Windows・Linuxの3系統すべてで再現が出たことで外れています。

プロキシやゲートウェイ経由の通信破損という仮説については、ある報告がANTHROPIC_BASE_URLの上書きなしにAnthropicの一次APIへ直接接続し、レスポンスに正規のリクエストIDが付いていたことを示して否定しています。アカウント全体の問題という仮説も、同じアカウントの並行セッションのうち1本だけに出た例があり、支持されていません。

なぜ厄介なのか — サイレントドロップと虚偽の「完了」報告

この不具合が単なる表示ノイズより深刻なのは、実際のtool_useブロックが1つも含まれないまま、呼び出しが消えるケースがあるためです。Claude Code側からは「ツールを呼び出そうとした形跡はあるが中身がない」状態に見えます。53件を数えた報告では、stop_reasonがtool_useで終わる形が約34%、end_turnで終わる形が約66%でした。tool_useだけを見て探すと取りこぼします。

ある報告では、モデルが架空の完了記録を訂正しようとした呼び出しが、まさにこの不具合で失われました。訂正文の直後にcourtが出て、呼び出し自体が握りつぶされた形です。別の報告(Windows 11・Claude Code 2.1.175)では、同じEditブロックが同一内容のまま連続して二重に出力されました。それでもモデルは「修正を適用しました」と応答を続けており、ファイルを読み直して未反映と分かっています。

エージェントが呼び出し結果を検証せずに次の判断へ進む運用では、この種の取りこぼしが「完了したはずの作業」として静かに積み上がります。

漏れた文字列が増えた末に、別のエラーで止まった例もあります。courtやcourthoodが延々と続いたあと、画面に次のエラーが出たという報告です(Windows、Claude Code 2.1.191)。

API Error: Claude Code is unable to respond to this request, which appears to violate our Usage Policy

報告にはリクエストIDが添えられています。その後モデルは、前の応答が誤動作して意味のない出力を出したと述べて立て直したといいます。

見分け方 — セッションのJSONLを検索する

Claude Codeのセッション記録(~/.claude/projects/<encoded>/<session-id>.jsonl)を直接調べると、該当イベントを特定できます。注意が要るのは、stop_reason: "tool_use"なのにtool_useブロックを持たない行を数える方法です。Linuxの報告では、この数え方で約9,800件が出ましたが、約59%は思考だけの行、約41%はツール呼び出し前の説明文だけの行で、いずれも正常なストリーミングの分割だったと報告されています。

そこで、tool_useブロックを持たない行のうち、本文にinvokeタグが含まれる行(形状B)か、本文の最後の行が漏れ出しトークンだけの行(形状A)に絞ります。

python3 -c "
import json, sys
STRAY = {'court', 'count', 'courtesy'}
for line in open(sys.argv[1], encoding='utf-8', errors='replace'):
    try: o = json.loads(line)
    except ValueError: continue
    m = o.get('message', {})
    if o.get('type') != 'assistant' or not isinstance(m, dict): continue
    c = m.get('content', [])
    if not isinstance(c, list): continue
    if any(b.get('type') == 'tool_use' for b in c if isinstance(b, dict)):
        continue
    t = '\\n'.join(b.get('text', '') for b in c
                  if isinstance(b, dict) and b.get('type') == 'text')
    last = t.strip().splitlines()[-1].strip().lower() if t.strip() else ''
    if 'invoke' in t or last in STRAY:
        print(o.get('timestamp', ''), m.get('model'), m.get('stop_reason'))
" ~/.claude/projects/<encoded>/<session-id>.jsonl

思考のみの行、前置きだけの行、正常なtool_useの行、形状B、形状Aを1行ずつ並べた5行のJSONLで試すと、tool_useの有無だけを見る方式は正常な2行を含む3行を出しました。上のスクリプトは形状AとBの2行だけを出します。

2026-06-13T10:05:00Z claude-opus-4-8 end_turn
2026-06-13T10:06:00Z claude-opus-4-8 tool_use

漏れ出すトークンがcourt・count・courtesyと変わるため、STRAYの集合は自分の環境で見えた語に合わせて足します。形状Aは本文の最後の行だけで判定するので、ヒットした行は前後の文脈を目で見て確かめます。

対処法 — フックやリトライでは捕まえられない

Claude CodeのPreToolUseフックは、モデルがツール呼び出しのパラメーターを組み立てたあと、処理に入る前に発火します。この不具合ではtool_useブロック自体が生成されないため、そもそもフックの発火対象になりません。PostToolUseフックも同様で、ツールが実行された後にだけ動くため、実行されなかった呼び出しには反応しません。

エラーリファレンスの自動リトライも対象外です。自動リトライの対象は、応答が流れ始める前の失敗と、応答のどの部分も完成する前の接続断です。テキストやツール呼び出しを1つ完成させた後の中断は再試行されず、完成した分が保持されます。正常に完結した応答の中身が崩れるケースは載っていません。今回のケースではテキストブロックが最後まで届いており、この経路に乗りません。エラーリファレンスの近い項目も、この症状とは別の話です。The response stream was malformedは、JSONとして不正なデータなど、壊れたイベントを受け取った場合のエラーです。今回の報告は、正常なテキストブロックの中身が崩れる形で、エラーとして表面化しません。

「Tool use or thinking block mismatch」は、履歴のtool_useとtool_resultの並びが食い違って起きる400エラーで、/rewindかEsc2回で戻せます。Opus 4.7・4.8を使っていてこのエラーが出る場合は、v2.1.156より前のバージョンが通常のツール使用中にも起こすため、先にclaude updateで更新するよう案内されています。

報告されている回避策は次のとおりです。

回避策

不具合が出たときと出る前の手当て

  1. 1

    始まったらセッションを作り直す

    壊れたブロックが履歴に残り、自己強化するからだと、報告者の1人は推測しています。引き継ぎ用のメモを持って新しいセッションに移した例があります。

  2. 2

    大きなツール出力をためない

    ある報告では、幅の広いターミナルをtmux capture-paneで丸ごと取り込む運用から、grepで状態を示す1行だけを取る運用に変えたところ、失敗が大きく減りました。大量のスクリーンショットも同じ方向で避けます。

  3. 3

    エスケープの濃い一行コマンドを分ける

    \$や\"、f-string、入れ子の引用符を含むpython3 -c "..."の生成に集中して出たという報告があります。単純なBashコマンド(bc・awk・単一引用符)では再現しなかったとのことです。この報告者自身が、作業内容の偏りかもしれないと添えています。

  4. 4

    変更後にファイルを読み直す

    Editの「適用しました」を信じず、差分やファイルの中身を直接確かめます。

いずれも利用者の経験則で、Anthropicからの対処の案内ではありません。issueのコメントは、利用者の投稿と、重複候補を知らせる自動botだけです。code executionツールとBashツールの混同のように、ツール呼び出しが期待どおりに動かないほかのケースでも、呼び出し後の結果を自分で確かめる習慣は共通して役に立ちます。

早見表 — 状況ごとの深刻度

状況深刻度理由
ツールは実行されたがcourtなどの余分な文字列が混じる深刻度低理由処理自体は完了しており、表示上のノイズにとどまる報告がある(実行されなかったという報告もある)
tool_useブロックが無く呼び出しが消える深刻度中〜高理由ターンが無駄になり手動での再実行が必要
courtが数百行連続するループに陥る深刻度高理由コンテキストを浪費し、使用ポリシーに触れたとするAPI Errorで止まった例もある
モデルが「完了しました」と応答するが実際は未反映深刻度高理由検証しない限り気づけず、後続作業が誤った前提の上に積み上がる

まとめ

原因が特定されていないため、「このバージョンに更新すれば直る」という判断はできません。長時間・大コンテキストのセッションでは、症状が出る前提で結果を検証し、出たらセッションを作り直す運用が現実的です。同じようにエラーは出ずに挙動だけがずれる例として、CLAUDE.mdで日本語を指定していても返信が英語化するドリフトも報告されています。詳細はClaude Codeの返信が英語化するドリフトの原因と回避策にまとめています。

この記事を共有:XはてブLinkedIn