Claude Codeで通知の在席判定を無効化する方法
CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECKで在席中でもデスクトップ通知を送らせる設定と、モバイルpushとの違いを解説します。
Claude Codeの通知が届かないのは在席判定のせいかもしれない
Claude Codeはタスク完了時などにPushNotificationツールで通知を送ります。ただし既定では、キーボード操作中やターミナルにフォーカスがある間は「見ているはず」と判断し、デスクトップ通知とモバイルpushの両方を止めます。
CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECKを1に設定すると、この在席判定のうちローカル側の判定だけを無効化できます。ターミナルにフォーカスしたままでも、Claudeが通知を送るたびにデスクトップ通知が届くようになります。
環境変数の設定方法
シェルの環境変数として設定します。
export CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK=1
claude毎回の起動時に有効にしたい場合は、シェルの設定ファイル(.zshrcや.bashrc)に追記します。Claude Code v2.1.193以降が必要です。それより前のバージョンでは変数自体が読み込まれません。バージョンはclaude --versionで確認できます。
チーム全体に配るなら、シェルではなくsettings.jsonのenvブロックで指定する方法もあります。
{
"env": {
"CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK": "1"
}
}シェルと設定ファイルの両方で同じ変数を設定した場合は、通常は設定ファイル側の値が優先されます。複数の設定ファイルが同じ変数を設定しているときは、優先順位の最も高いファイルの値が使われます。プロジェクトやローカルの設定ファイルに書いたenvは、変数によってはワークスペースを信頼した後に適用されます。
例外が1つあります。Claude Desktopアプリやセルフホスト環境のランナーがセッションを起動する場合は、起動側が組み立てた環境が優先され、すでに設定済みの変数については設定ファイルのenvが無視されます。Claude Codeをデスクトップアプリ経由で動かしていて値が効かないときは、この優先順位が原因になりえます。
通知が変わらないときの切り分け
「在席判定を無効化したのに通知が来ない」という症状は、原因が3系統に分かれます。どれに当たるかで触る設定が違います。
症状から見る原因の3系統
ターミナルが通知の対象外
お使いのターミナルでデスクトップ通知が出るかどうかは、
preferredNotifChannelの値次第です。詳しくは下の「通知のチャンネルを選ぶ」にあります。見ている画面が違う
数分離席して戻ったときに出る1行のセッション要約は、この変数とは別機能です。下の「セッション要約は別の仕組み」を参照してください。
モバイルpushの前提が欠けている
Remote Controlの接続、スマホ側のアプリ登録、
/configのトグルのどれかが欠けると、在席判定と無関係にpushは届きません。
環境変数を設定した後は、claudeを再起動してから確かめます。シェルでexportした値は、すでに起動しているセッションには渡りません。settings.jsonのenvブロックは、保存した変更でenvの内容が変わると、実行中のセッションにも再適用されます。
セッション要約は別の仕組み
離席から戻ったときの要約は「セッションリキャップ」と呼ばれる機能です。最後のターンから3分以上たち、ターミナルがフォーカスを失っているとバックグラウンドで生成されます。セッションが3ターン以上になってから出るため、短いやり取りでは表示されません。
止めるには/configのSession recapをオフにするか、設定キーawaySummaryEnabledをfalseにします。環境変数CLAUDE_CODE_ENABLE_AWAY_SUMMARYは0で強制オフ、1で強制オンになり、設定キーや/configのトグルより優先されます。CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECKはリキャップに作用しません。
通知のチャンネルを選ぶ
preferredNotifChannelには"auto"と"terminal_bell"のほかに、特定のターミナルを指定する値があります。
| 値 | 動作 |
|---|---|
"auto"(既定) | 動作iTerm2・Ghostty・Kittyでデスクトップ通知。Terminal.appは音声ベルがオフのときだけベル音 |
"terminal_bell" | 動作どのターミナルでもベル文字を鳴らす |
"iterm2" / "kitty" / "ghostty" | 動作各ターミナルのデスクトップ通知 |
"iterm2_with_bell" | 動作iTerm2のデスクトップ通知とベルの両方 |
"notifications_disabled" | 動作通知を送らない |
/configではLocal notificationsとして表示されます。autoの対象外のターミナルで在席判定を無効化しても、通知先がないので何も起きません。先にこの値でチャンネルが動くかを確かめると、原因を切り分けやすくなります。
何が変わり、何が変わらないか
この変数が無効化するのは「ローカル側の在席判定」だけです。
環境変数を設定したときの効き方
デスクトップ通知
既定ではキーボード操作かターミナルのフォーカスを検知すると抑制されます。=1にすると、操作中でもPushNotificationツールのデスクトップ通知が送られます。
モバイルpush
ローカルのチェックは外れますが、サーバー側が「操作中」と判断すれば、サーバーがpushを抑制することがあります。
「ターミナルにフォーカスしているのに通知が来ない」を解消したいだけなら、この変数で足ります。「外出中は確実にモバイルへ届けたい」という目的には、この変数は直接効きません。
モバイルpushにはRemote Controlの接続が前提
在席判定の設定をどういじっても、モバイルpush自体はRemote Controlが接続されていなければ届きません。PushNotificationツールのpush配信は、Anthropicのホスト基盤を通ります。そのためAmazon Bedrock・Claude Platform on AWS・Google CloudのAgent Platform・Microsoft Foundry経由では使えません。Remote Controlの利用条件は次のとおりです。
- プラン: Pro・Max・Team・Enterpriseで利用可能。APIキーでのサインインは対象外
- サインイン:
claude実行後に/loginでclaude.aiにログイン済みであること - APIエンドポイント: 次の構成では利用不可
- Bedrock・Claude Platform on AWS・Agent Platform・Foundry経由
ANTHROPIC_BASE_URLをapi.anthropic.com以外(LLMゲートウェイやプロキシ)に向けている- 企業のClaude appsゲートウェイ経由でサインインしている
- feature-flag評価:
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICかDISABLE_GROWTHBOOKを設定していると使えない。DISABLE_TELEMETRYとDO_NOT_TRACKだけなら使えるが、v2.1.283以降が必要で、組織がTrusted Devicesを必須にしている場合は外す必要がある
Team・Enterpriseでは、オーナーがClaude Code管理設定でRemote Controlのトグルを有効化している必要もあります。
モバイルpushを受け取るための設定と手順
Remote Controlが接続できていても、/config側のトグルをオンにしなければpushは届きません。設定項目は次の2つで、いずれも既定値はfalseです。
- Push when Claude decides(
agentPushNotifEnabled): Claudeが長時間タスクの完了などを判断して自発的にpushを送る - Push when actions required(
inputNeededNotifEnabled): 権限確認や質問への回答待ちのときにpushを送る
イベントごとの細かい設定はなく、この2つのトグルの組み合わせで決まります。テストが終わったら教えてのようにプロンプトで依頼して送らせることもできます。ただしトグルをオンにするだけでは端末が登録されません。
スマホにpushを届ける4段階
- 1
- 2
同じアカウント・組織でサインインする
Claude Codeで使っているのと同じものを選びます。
- 3
OSの通知許可を出す
許可プロンプトが出たら許可します。
- 4
ターミナルで`/config`を開く
Push when Claude decidesかPush when actions required、または両方を有効にします。
それでも届かない場合は、/configの表示とセッション内の/rc activeインジケーター(Remote Controlの接続中に出ます)を見比べます。
- No mobile registeredと出ているときは、スマホ側のClaudeアプリを一度開いてpushトークンを更新します。警告は次にRemote Controlが接続されたときに消えます。
- iOSでは集中モードや通知の要約機能がpushを遅延・抑制することがあります。設定アプリの通知一覧でClaudeの項目を確認します。
- Androidではバッテリー最適化が配信を遅らせることがあるので、Claudeアプリを最適化の対象外にします。
逆方向の制御: CLAUDE_CLIENT_PRESENCE_FILE
在席判定を無効化するのとは逆に、抑制する範囲を広げる環境変数もあります。CLAUDE_CLIENT_PRESENCE_FILEにファイルパスを指定すると、そのファイルが存在する間は、別のウィンドウで作業していてもモバイルpushをスキップします。
画面ロック解除時にファイルを作成し、ロック時に削除するスクリプトと組み合わせる想定です。ファイルが存在しない、または読み取れない場合は通常どおり通知されます。Claude Codeはpushが発生するイベントごとに1回だけファイルの有無を確認し、常時ポーリングはしません。
| 環境変数 | 目的 | 必要バージョン |
|---|---|---|
CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK | 目的デスクトップ通知の抑制を無効化する | 必要バージョンv2.1.193以降 |
CLAUDE_CLIENT_PRESENCE_FILE | 目的画面ロック等と連動してモバイルpushの抑制を強化する | 必要バージョンv2.1.181以降 |
Notificationフックで独自の動作を足す
標準の通知に加えて、Notificationフックで任意のコマンドを走らせる方法があります。フックはpreferredNotifChannelを"notifications_disabled"にしても動きます。通知の見せ方を変えるだけで、フックを走らせるかどうかには影響しないためです。
発火のタイミングは通知の種類ごとに決まっています。
| マッチャー | 発火の条件 |
|---|---|
permission_prompt | 発火の条件ツール実行やネットワークリクエストの承認待ちが約6秒続いたとき |
idle_prompt | 発火の条件Claudeの応答が終わって約60秒たち、その間に入力がないとき |
elicitation_dialog | 発火の条件MCPサーバーのフォームが開き、約6秒入力がないとき |
elicitation_url_dialog | 発火の条件MCPサーバーがブラウザでURLを開くよう求め、約6秒入力がないとき |
この4種はデスクトップ通知と同じタイミング判定を共有しており、ターミナルで離席中と見なされたときだけ届きます。ただしidle_promptは、バックグラウンドのサブエージェントが動作中は発火しません。利用上限の解除待ちの間も送られず、代わりにquota_auto_resume_*の通知が発火します。音を鳴らすなど独自の動作を足したい場合は、このフックが向きます。設定例はClaude Code通知の設定にあります。
まとめ
触る設定は、不満がどちらの通知にあるかで決まります。複数モニターでターミナルを常時フォーカスしたまま別の作業をしていて、デスクトップ通知が抑制されるなら、この変数が対象です。外出中にモバイルへ届かないなら、Remote Controlの接続と/configのトグルが先です。そばにいるときは抑制したまま離席時だけ届けたい場合は、CLAUDE_CLIENT_PRESENCE_FILEと画面ロックの連携が向きます。
Cowork Dispatchでモバイル通知が届かない場合はCowork Dispatchで通知が来ないが参考になります。環境変数で挙動を無効化する他の例はdisableClaudeAiConnectorsでコネクタを一括無効化にあります。
Claude DesktopやVS Code拡張機能のcanUseToolセッションでは、permission_prompt通知だけを個別に止めることもできます。設定方法はCLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKSで通知を止めるの記事にあります。