Codex の承認待ちと完了を Mac の通知で確認する。

Codex は、作業の完了も承認待ちも通知できます。ただし、notify 設定で届くのは完了通知だけです。このガイドでは、Mac で使える Codex の各通知設定の役割を説明します。掲載するコード例は OpenAI のドキュメントと照合しています。

Codex の notify 設定は、ターンが完了したときだけ指定のプログラムを実行します。承認待ちでは実行しません(2026年10月時点)。承認待ちを知るには、Codex 内蔵のターミナル通知([tui] notifications)か、~/.codex/hooks.json の PermissionRequest フックを使います。内蔵の通知はデフォルトでオンになっており、ターミナルがバックグラウンドにあるときに届きます。バナーが表示されるのは一部のターミナルだけです。ChatGPT デスクトップアプリでは、Settings > Notifications で権限リクエストの通知をオンにしてください。

最終更新:

Cowork Island

macOS 14 以降。
Appleシリコンと Intel に対応。
無料プランはアカウント不要。

無料でダウンロード

Codex の各通知設定の役割を知る。

Mac で Codex の通知を受け取る方法は、次の4つです。ターンとは、1回分の作業のことです。あなたがメッセージを送り、Codex が作業を進め、止まってあなたの応答を待つまでを指します。フックとは、承認を求める直前など、決まったタイミングで Codex が実行するコマンドです。

Mac で使える Codex の通知設定。OpenAI のドキュメントに基づく(2026年10月18日確認)
設定設定場所ターン完了承認待ち補足
notify~/.codex/config.toml対応非対応設定するまでオフです。指定したプログラムを1つ実行します。
[tui] notifications~/.codex/config.toml対応対応デフォルトでオンです。ターミナルが前面にないときに通知します。バナーが表示されるのは、対応するターミナルだけです。
フック(Stop、PermissionRequest)~/.codex/hooks.json対応対応デフォルトでオンです。新しいフックは、実行前にそれぞれ /hooks で信頼する必要があります。
ChatGPT デスクトップアプリSettings > Notifications対応対応ターン完了、権限リクエスト、質問の通知には、それぞれ個別のスイッチがあります。

よくあるのが、notify を設定すれば承認待ちの通知も届くと思い、そのまま待ってしまうケースです。OpenAI の設定ドキュメントによると、現時点で notify が実行されるのは agent-turn-complete だけです。承認待ちの通知には、表のほかの3つの方法のいずれかを使ってください。

まずは Codex 内蔵の通知を使う。

Codex のターミナル通知はデフォルトでオンなので、すでに届いているかもしれません。通知されるのは、ターミナル(Terminal や iTerm2 など、Codex を実行しているアプリ)が前面にないときだけです。通知するイベントを自分で選ぶには、設定ファイルで指定します。

~/.codex/config.toml に追加してください。すでに [tui] セクションがある場合は、その下に各キーを置きます。[tui] の見出しをもう1つ追加しないでください。コメント内のターミナル一覧は、Codex のドキュメントではなく、ソースコードに基づいています(後述)。

[tui]
notifications = ["agent-turn-complete", "approval-requested"]
notification_method = "auto"        # osc9 in iTerm2/Ghostty/Kitty/Warp/WezTerm; bel elsewhere
notification_condition = "unfocused" # or "always"

notification_method を auto にすると、Codex が通知方法を選びます。osc9 は特殊なコード(エスケープシーケンス)を送り、一部のターミナルがそれをデスクトップ通知として表示します。bel はターミナルのベルを鳴らします。ターミナルを見ている間も通知を受け取りたい場合は、notification_condition を "always" にしてください。

Terminal でベルしか鳴らない理由を知る。

OpenAI のドキュメントには、バナーを表示できるターミナルの名前は記載されていません。Codex の公開ソースコードでは、Ghostty、iTerm2、Kitty、Warp、WezTerm にはバナー用のシーケンスを送り、macOS に付属する Terminal を含め、それ以外のターミナルには通常のベルを送ります。この動作は今後変わる可能性があります。ベルだけではバナーは表示されません。Terminal の Settings > Profiles > Advanced > Bell では、ビジュアルベル、Dock のバッジ、ウインドウがバックグラウンドにある間の Dock アイコンのバウンドを設定できます。Terminal で実際にバナーを表示するには、後述のフックを使ってください。

tmux 内では、allow-passthrough をオンにした場合だけ、Codex のバナー用シーケンスが通ります。on では表示中のペインからのみ、all では非表示のペインからも通ります(tmux マニュアル)。次の行を ~/.tmux.conf に追加してください。非表示のペインからも通知を受け取るには、on の代わりに all と記述します。

set -g allow-passthrough on

notify でターン完了時に Mac のバナーを表示する。

notify はターンが完了すると1つのプログラムを実行し、詳細を1つの JSON 引数として渡します。どのターミナルでも同じように動作します。OpenAI の例では、macOS に付属しないサードパーティー製の Homebrew ツール、terminal-notifier を使っています。以下のスクリプトは macOS に付属するものだけを使います。Codex の最後の返信の冒頭とプロジェクトフォルダを表示し、通知音 Glass を鳴らします。

手順1.次の内容を新しいファイル ~/.codex/notify-macos.js として保存してください。

// Codex notify -> macOS banner + sound. Codex appends one JSON argument.
function run(argv) {
  var n = {};
  try { n = JSON.parse(argv[argv.length - 1] || "{}"); } catch (e) {}
  if (n.type && n.type !== "agent-turn-complete") return;
  var app = Application.currentApplication();
  app.includeStandardAdditions = true;
  var msg = String(n["last-assistant-message"] || "Turn complete").slice(0, 180);
  var folder = String(n.cwd || "").split("/").pop();
  app.displayNotification(msg, { withTitle: "Codex finished", subtitle: folder, soundName: "Glass" });
}

手順2.既存の ~/.codex/config.toml の、最初の [section] 見出しより上に次の行を追加してください。YOUR_NAME は自分のホームフォルダ名に置き換えます。Codex はこのリストを記述どおりに実行するため、~ は展開されません(ドキュメントではなく、Codex のソースコードに基づく情報です)。

notify = ["/usr/bin/osascript", "-l", "JavaScript", "/Users/YOUR_NAME/.codex/notify-macos.js"]

notify が動かなくなる3つの原因:

  • notify の行が2つある。設定ファイルに記述できるのは1つだけで、キーが重複するとファイルを読み込めなくなります。別のツールがすでに使っている場合は、両方のプログラムを実行する短いスクリプトを指定するか、代わりに Stop フックを使ってください。フックは、どのファイルにあるものも並行して実行されます。
  • ファイル内の位置が違う。[section] 見出しより下のファイル末尾に貼り付けると、その行はそのセクションに属するため、Codex は notify 設定として読み取りません。
  • プロジェクトの設定ファイルに書いている。Codex はプロジェクト固有の .codex/config.toml にある notify を無視します。機能するのは ~/.codex/config.toml に記述した場合だけです。

バナーが表示されない場合は、「システム設定」>「通知」を開いてください。Anthropic のフックガイドによると、osascript で送ったバナーは、そこに Script Editor として表示されるため、通知を許可する必要があります。macOS が事前に許可を求めることはないとも説明されています。お使いの Mac では、表示名が異なる場合があります。

Codex のフックで承認待ちのバナーを表示する。

フックを使うと、Terminal を含むどのターミナルでも、承認待ちを実際のバナーで知らせることができます。Codex は、承認を求める直前に PermissionRequest フックを、ターン完了時に Stop フックを実行します。承認が不要なコマンドでは、PermissionRequest は実行されません。

次の内容を ~/.codex/hooks.json に組み込んでください。ファイルがすでにある場合は、丸ごと置き換えないでください。ほかのツールのエントリが保存されている場合があります(Cowork Island も、アプリ内で Codex をオンにすると、このファイルにエントリを保存します)。以下の各エントリを、"hooks" 内の対応するリストに追加してください。リストがなければ作成し、各エントリはそれぞれ個別の波括弧で囲んでください。

{
  "hooks": {
    "PermissionRequest": [
      { "hooks": [ { "type": "command", "async": true, "timeout": 10,
        "command": "/usr/bin/osascript -e 'display notification \"Codex needs your approval\" with title \"Codex\" sound name \"Funk\"' >/dev/null 2>&1" } ] }
    ],
    "Stop": [
      { "hooks": [ { "type": "command", "async": true, "timeout": 10,
        "command": "/usr/bin/osascript -e 'display notification \"Codex finished\" with title \"Codex\" sound name \"Glass\"' >/dev/null 2>&1" } ] }
    ]
  }
}
  1. ファイルを保存し、Codex を開いて /hooks と入力します。
  2. 新しい2つのエントリを両方とも信頼してください。Codex は、新規または変更されたフックを、信頼されるまでスキップします。そのため、信頼していないフックは動作していないように見えます。
  3. 末尾の >/dev/null 2>&1 は残してください。Stop フックの出力は、JSON か、何も出力しないかのいずれかである必要があります。

代わりに読み上げやスマートフォンへの通知を使うなら、通知設定ジェネレーターがブラウザ内でエントリを作成し、保存先のファイル名も示します。

ChatGPT デスクトップアプリで Codex の通知を使う。

2026年7月9日から、macOS の Codex アプリは ChatGPT デスクトップアプリの一部になりました。通知は設定ファイルではなく、アプリ内で設定します。

  • Settings > Notifications(Cmd+,):ターン完了の通知を、表示しない、ChatGPT がバックグラウンドにあるときだけ表示、常に表示、のいずれかに設定できます。権限リクエストと質問の通知には、それぞれ個別のスイッチがあります。
  • Sound:タスク完了、権限リクエスト、質問に共通の通知音です。Default、Classic、None から選べます。macOS では、システムサウンドやインポートしたファイルも使えます。
  • Activity:利用できる場合は、サイドバーのベル、または Cmd+Option+U で、未読、実行中、応答待ちのチャットを一覧表示できます。

前述の [tui] の各キーは、ターミナル内で動く Codex 用です。OpenAI のドキュメントには、デスクトップアプリ内のチャットで notify や自作のフックが実行されるかどうかは書かれていません。そのため、アプリ内でも動くとは考えないでください。

通知設定の手間を省く。

Cowork Island は macOS 14 以降で使えるアプリです。対応ツールの AI エージェントのセッションをノッチ下のパネルに集め、それぞれの状態を表示します。Codex や Claude Code のどのセッションが実行中で、どれが「要対応」なのかを確認でき、通知もその画面の一部として表示されます。

Codex は、「設定」でオンにしてから Codex 側で Cowork Island のフックを許可するまで、オフのままです。これは前述と同様に、フックを信頼する手順です。その後は、各 Codex セッションの状態が表示されます。デフォルトでは、対応が必要になるとアイランドが自動で開きます。ただし、そのセッションのターミナルがすでに前面にある場合、または ChatGPT 内の Codex チャットで ChatGPT アプリがすでに前面にある場合は開きません。この動作は「設定」の「質問があったとき」でオフにできます。セッションが完了すると、デフォルトではアイランドが5秒間開きます。ChatGPT アプリ内の Codex も「要対応」と表示され、回答は ChatGPT で行います。アイランドでは、対応している Claude Code のリクエストを許可または拒否したり、選択式の質問に回答したりできます。ほかのツールでは、そのツールのアプリやターミナルで応答が必要になる場合があります。

Cowork Island は macOS の通知を送信しません。アイランド自体が開きます。サウンドはオンにするまでオフです。「承認が必要」のサウンドは無料で使え、「セッション完了」の通知音は Pro の機能です。Codex の notify 設定は使わないため、お使いの notify スクリプトは引き続き動作します。Cowork Island は、~/.codex/hooks.json に独自のエントリを追加し、既存のエントリと共存させます。自作のフックは、上のコード例のように個別のエントリにし、Cowork Island の ~/.perch フォルダの外に置いてください。そうすれば、そのまま保持されます。

無料プランでは、一度に1枚のセッションカードが表示されます。Pro ではすべてのセッションが表示され、セッションへジャンプして戻れるようになります。さらに、詳細な使用量メーター、完了時のサウンド、より多くのマスコットの選択肢が加わります。Pro の7日間試用が自動で始まり(Mac 1 台につき1回)、支払い情報は不要です。プランとインストール方法をご覧ください。

無料でダウンロード

情報源。

ダウンロードリンクを自分宛てに送って、あとで開けます。