EndConversationツールの挙動 — Claude Codeが会話を終了する条件
EndConversationツールはClaude Codeのセッションを強制終了する数少ない仕組みです。発火条件、終了後のロック、権限やフックで止められない理由を解説します。
EndConversationツールは、Claude Codeが会話そのものを終わらせる数少ない仕組みです。Claudeが自分の判断でセッションをロックするため、発火は繰り返しの迷惑行為への最後の手段に限られます。ただし条件も終了後の挙動も、Claude Codeの他の安全策とは大きく違います。
どんなときにClaudeは会話を終了するのか
EndConversationツールは現在のセッションを終了します。Claudeがこれを使うのは、次の2つの場面だけです。
発火する場面としない場面
発火する
- 持続的な迷惑行為への最後の手段として。会話をそらす試みが失敗し、前のメッセージで明確な警告を出したあとに使う
- ユーザーが明示的にこのツールのデモを見たいと頼み、セッションを終えてよいと確認した場合
発火しない
- 単なる苛立ちや暴言
- 作業がうまく進まないこと
- 有害なコンテンツの要求(Claudeは会話を終えず、その要求自体を断る)
この振る舞いはclaude.aiが一部の会話を終了できる仕組みと同じ方針に沿っています。研究背景と発動条件はClaudeが会話を終了できる機能はなぜ生まれたかにあります。
終了されたセッションはどうなるのか
会話が終了すると、セッションはロックされます。新しいプロンプトも、ほとんどのコマンドも「Claude ended this conversation. Start a new session (or /clear) to continue.」という一文を返すだけになります。動くのは/clear・/resume・/help・/exit・/feedbackの5つです。
Claude Codeは終了した事実をセッションのトランスクリプトに記録します。ロックされたセッションを/resumeで開き直しても、ロックはそのまま復元されます。履歴は削除されず、ロックされた状態で残ります。
ロックされたときの抜け方は次のとおりです。
ロックされたセッションから作業に戻る
- 1
履歴を読みたいだけなら
/resumeで開き直せます。ただしロックは復元されるので、新しいプロンプトは通りません。 - 2
作業を続けたいなら
/clearか/exitで抜け、新しいセッションを始めます。/clearは同じセッションの文脈をリセットする操作ですが、メッセージが案内しているとおり、ロックから出る手段としても使えます。 - 3
何が起きたか伝えたいなら
/feedbackはロック後も実行できます。終了の経緯を伝える窓口として使えます。
非対話モード(-pモード)で終了済みセッションを再開すると、エラーになって終了コード1で終わります。スクリプトが失敗を成功と取り違えないための仕様です。パイプラインでこの終了コードを握りつぶすと、止まるべき処理が先へ進みます。
権限設定でもフックでも止められない理由
EndConversationツールは承認を求めません。フックにとってもこのツールは例外で、PreToolUseフックもPostToolUseフックもPermissionRequestフックも、EndConversationの呼び出しでは発火しません。呼び出しの前にも後にも、フックで挟む手段が用意されていないということです。
権限ルールにも同じ例外があります。通常、Bashのような裸のツール名を指定したdenyルールは、そのツールをClaudeの視界から取り除きます。EndConversationは、ほかのツールが1つでも残っている間はこの除去の対象外です。名指ししたdenyルールは効かず、askルールでも確認プロンプトは出ません。--disallowedToolsや--toolsのリストからも外せません。
この扱いは意図的なものです。このツールは会話を終えること以外に何もせず、ファイルもデータも読み書きしません。止められる側が無効化できてしまえば、この種の安全策は成り立たないからです。
「無効にしたい」という要望は出ている
この仕様に対し、GitHubのissueには無効化を求める要望があります。anthropics/claude-codeのissue #80307(2026年7月22日起票、オープン中)は、EndConversationを無効にするオプションを求めています。報告者は、理由の分からない終了が起きるセッションがあると書いています。ツール単体のオフスイッチは見当たらず、外れるのは後述の登場条件を満たさないときか、全ツールを取り除くdenyルールを置いたときだけです。
サブエージェントとバックグラウンドタスクでの扱い
サブエージェントにこのツールは渡されません。サブエージェントのツールから常に外される短いリストに、AskUserQuestionやExitPlanModeと並んでEndConversationが入っているためです。サブエージェントのtoolsフィールドに書いても同じです。理由は、このツールが終了できるのはメインの会話だけだから、というものです。ただしフォークは親と同じツールプールを受け取るため、この除外リストの対象外です。
メインの会話とツールリストを共有するバックグラウンドタスクには、ツールとして見えます。ただしそこから呼んでも何も終了しません。
自分の環境でこのツールは出るのか
EndConversationツールは、次の5つをすべて満たすときだけ登場します。1つでも外れるとツールリストに載りません。
登場の5条件
バージョン
Claude Code v2.1.213以降。
モデル
Opus 4.8、Sonnet 5、Fable 5、またはこれらのファミリーの後継モデル。
実行面
対話的なターミナルセッション。JetBrainsプラグインのようにIDE統合ターミナルで
claudeを動かす場合も含みます。起動モード
--bareでないこと。bareモードはシェルとファイル系のツールしか読み込みません。プロバイダー
Amazon Bedrock、Claude Platform on AWS、Google Cloud's Agent Platform、Microsoft Foundryでは使えません。クラウドゲートウェイ経由のサインインも対象外です。
実行面の条件から外れるものは、非対話の-p実行、Agent SDK(TypeScript/Python)経由のセッション、独自のCLIを同梱するVS Code拡張のパネル、GitHub Actions、Claude Code on the webです。モデルの条件も狭く、Opus 4.8・Sonnet 5・Fable 5より前の世代では、ほかの条件を満たしていてもツールは現れません。
手元のv2.1.287で確認できること
手元のClaude Code v2.1.287でclaude --helpを見ると、起動オプションの説明を確認できます。ツールの発火そのものはモデルを呼ぶ操作が要るため、実機では試していません。
claude --version
claude --help | grep -A3 -E "^ --(disallowedTools|tools|bare)"出力は次のとおりです(抜粋、折り返し位置は端末幅で変わります)。
2.1.287 (Claude Code)
--bare Minimal mode: skip hooks (those defined
in settings and by installed plugins;
features built into Claude Code are
--disallowedTools, --disallowed-tools <tools...>
Comma or space-separated list of tool names to deny (e.g. "Bash(git *)
Edit")
--tools <tools...> Specify the list of available tools from
the built-in set. Use "" to disable all
tools, "default" to use all tools, or--disallowedToolsと--toolsの説明は、どちらも「ツール名のリスト」を受け取るとしか言っていません。EndConversationだけがこのリストを素通りする扱いは、--helpには出てこず、tools-referenceかCLIリファレンスのフラグ表まで読まないと分からない例外です。--bareの説明にある「フックを飛ばす」は、設定やプラグインで定義したフックを指しています。Claude Code自体に組み込まれた機能は影響を受けないと明記されています。
公式ページ同士で食い違う点
EndConversationの導入バージョンは、ドキュメントのページ間で揃っていません。tools-referenceは「v2.1.213以降」と書いています。一方、changelogでこのツールの追加が書かれているのはv2.1.214(2026年7月18日)の項目です。changelogにはv2.1.213の項目自体がありません。この記事では動作条件をtools-referenceの記述に合わせていますが、v2.1.213で実際に現れるかは資料からは分かりません。
追加時の説明にも違いがあります。changelogは、ひどい迷惑行為をするユーザーやジェイルブレイク(制限回避の試み)にセッションを終えられると書いています。tools-referenceが挙げるのは、持続的な迷惑行為への最後の手段と、ユーザーが頼んだデモの2つです。ジェイルブレイクへの言及は、changelogにだけあります。発火条件はtools-referenceのほうが詳しいので、こちらを基準にするのが無難です。
もう1つ、利用者の報告から分かる点があります。issue #94400(2026年9月14日起票、オープン)は、claude --bg --resumeで再開したセッションの最初のリクエストがプロンプトキャッシュを外れるという報告です。報告者は、EndConversationがサーバー側で制御されていて、有効になるセッションとならないセッションがあると書いています。親セッションにあったこのツールが再開後の最初のリクエストに入らず、数秒後に追加されることが原因だという分析です。これは利用者の観察で、仕様ではありません。ただ、モデルとバージョンの条件を満たしても、常にツールが見えるとは限らない可能性を示す材料です。
この設計は何を守ろうとしているか
制約を並べると、これはClaudeが会話を終えられる汎用機能ではなく、迷惑行為への対応に絞った狭い安全弁です。多くの機能がフックや設定でユーザーに制御を返す方向に進む中、このツールは制御を意図的に手放しています。
ほかのツール呼び出しは、PreToolUseやPostToolUseで拾って自前のロジックを挟めるのが前提です。EndConversationだけがその前提の外にあるのは、tools-referenceの説明どおり、止められる側が自分で切れる安全策は安全策にならないからでしょう。デモを頼める経路があるのも、仕組みを確認できる状態を保っておくためだと読めます。
フック、権限ルール、サブエージェントの3つの経路すべてで、同じ種類の例外が置かれています。会話を終える力は、外側からの介入でも、権限設定の書き換えでも、派生した実行コンテキストへの伝播でも、一貫して閉じられています。ただし、#80307の報告者が困っているのはこの閉じ方のほうです。呼び出しがあった事実を後から追うなら、PostToolUseフックではなく、終了が記録されるセッションのトランスクリプトを見ることになります。
まとめ
自動化にClaude Codeを組み込んでいるなら、見るべきは終了コード1と、対話セッションでのロックだけです。発火の条件は迷惑行為とデモの2場面に絞られ、権限ルールやフックで止められない点は、設定で調整する余地がないものとして割り切る必要があります。