🍺

最速でSlackとCodex CLIを接続する:Boltで作るAI Slack Bot

に公開
2026/01/13

個人開発で、AI Agent を使った軽量な Slack bot を作りました。せっかくなので、そのまま公開してみます。Bolt と Codex CLI を使うと、想像以上に手軽に Slack で AI bot を動かすことができました。
本記事は、自分自身の備忘録であると同時に、同じ構成で試してみたい方に向けたまとめでもあります。実装の紹介に加えて、「どのように動かすか」「どのように運用するか」といった点についても、やや厚めに書いています。
いわゆるバイブコーディングによる拙作ではありますが、改善点などあればぜひ PR をお寄せください。

https://github.com/usuginus/slack-codex-bridge


できること

  • メンションに簡潔に返す

  • カスタムスラッシュコマンドの例(このリポジトリは /hangout をサンプルとして同梱)

サンプルスラッシュコマンドの例(/hangout)

  • Slack の文脈(最近の会話/チャンネルメンバー/スレッド)を必要に応じて渡せる

構成


Bolt って何?

Bolt は Slack が提供する公式 SDK で、イベント(app_mention) と スラッシュコマンド を簡単に扱えます。HTTP サーバーで受ける方式もありますが、今回は Socket Mode を使う構成です(後述)。

https://docs.slack.dev/tools/bolt-js/ja-jp/getting-started/


Codex CLI って何?

Codex CLI は Terminal で動作する Coding Agent で、ローカルから OpenAI のモデルを呼び出せます。WebSearch 等の機能が提供されるので、調べ物をお願いするのにも使えます。

https://developers.openai.com/codex/cli/


使い方

1) Slack App を作る

Slack の管理画面で App を作り、以下を有効化します。

  • Socket Mode を有効化
  • Slash Commands: 自分で定義(例: /hangout をサンプル実装)
  • Event Subscriptions: app_mention
  • Bot Token Scopes:
    • chat:write
    • conversations:read
    • channels:history
    • users:read

また、App の SLACK_BOT_TOKEN, SLACK_APP_TOKEN, SLACK_SIGNING_SECRET を取得しておいてください。


2) 環境変数を設定

.env を作成し、環境変数に作成した Slack App の token 等を設定してください。

SLACK_BOT_TOKEN=...
SLACK_APP_TOKEN=...
SLACK_SIGNING_SECRET=...
OPENAI_API_KEY=...

任意設定(必要なら):

CODEX_MODEL=gpt-5.2
CODEX_REASONING_EFFORT=low
CODEX_WEB_SEARCH=1
PLANNER_DEBUG=1

3) ローカルで起動

npm install
npm run dev

起動すると Socket Mode が有効になり、Slack からのイベントを Webhook 不要で受け取れる状態になります。


4) 使ってみる

メンション

@App 〇〇ってどういう意味?

→ Codex が返答し、Slack にリプライ。

スラッシュコマンド(サンプル)

/hangout Shibuya 40 4 19:00

→ サンプル実装として、3 つの候補+メッセージ案を返す。


Socket Mode のポイント

なぜ Socket Mode?

  • 外部公開の HTTP が不要
  • 開発環境で完結
  • 企業の Internal なネットワークでも動かしやすい

注意点

  • 常時起動が必要
  • トークン管理が重要(App Token を必ず安全に)
  • 返信遅延対策(Codex が重いとタイムアウトしやすい)

拡張の余地

Codex は CLI 経由で使えるので、拡張さえすれば MCP のような外部ツール連携にも繋げられます。「Slack → Codex → 追加ツール」という流れにすると、社内のデータソースや業務システムを呼び出す設計にも発展しやすく、単なるチャット用途以上の価値が作れます。


新しいコマンドを増やす方法

新しいスラッシュコマンドを増やすのもシンプルです。ざっくり言うと「入口」「プロンプト」「出力整形」の 3 点を増やせば OK。

  1. 入口を足す
    app.command("/newcmd", ...) を追加して、受け取った入力をサービス層へ渡すだけ。
  2. プロンプトを用意する
    「何を返してほしいか」を短く明確に書く。曖昧さはモデルの想像力に吸われるので、形式(箇条書き/JSON/1 行など)を指定すると安定します。
  3. 出力を Slack 向けに整形
    Markdown → Slack 変換や、箇条書きの行頭調整をしておくと読みやすくなります。

ポイントは 「モデルの出力形式を先に決める」 こと。人間が読みやすい形式と、Slack に載せたときの見え方は微妙に違うので、最後の整形で吸収するのがコツです。


Codex の調整ポイント

Codex が安定して動くことが大事なので、設定を深掘りする価値があります。ここでは「どこを触ると挙動が変わるか」を整理しておきます。

  • モデル指定:CODEX_MODEL で利用モデルを制御(gpt-5.2 等)
  • 推論量:CODEX_REASONING_EFFORT の設定で速さとクオリティを制御(low / high 等)
  • Web 検索:CODEX_WEB_SEARCH で Web 検索の可否を制御(0 or 1)

このプロジェクトだと codex exec を直接呼び出していて、-c フラグでモデルや推論量を指定しています。CLI 側の設定 → プロンプト → 出力整形の順でチューニングすると、効き目が分かりやすいです。

個人的には、**「出力形式を固定する」→「速度設定を決める」→「コンテキスト量を調整」**の順が一番効果的でした。

※ 実行する環境で任意のコードを実行されたり、環境変数を窃取されたりする懸念があります。お使いの環境のセキュリティ要求に合わせて、厳しく slack-codex-bridge や Codex CLI を設定してください


プロンプトの紹介

この構成の核はプロンプトです。入力を「それっぽく」整えるだけで、返答の質が一気に上がります。

たとえば、こんな一文を足すだけでかなり変わります。

You are a helpful assistant responding in a Slack channel.
Respond naturally in English. Be concise and friendly.

例えばサンプルの /hangout コマンドの prompt はここに記述されていますので、お好みのスタイルに修正してください。特に、日本語で返信して欲しい時にはここにその旨を書いてあげましょう。

https://github.com/usuginus/slack-codex-bridge/blob/main/src/services/hangout.ts#L12-L34


VM(Ubuntu)に置くときのメモ

実際に Google Compute Engine の Ubuntu で動かしたときの流れを、要点だけ残しておきます。

1) Requirement の install

sudo apt update
sudo apt -y upgrade
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt -y install nodejs git build-essential

2) リポジトリと環境変数

git clone https://github.com/usuginus/slack-codex-bridge
cd slack-codex-bridge
npm install
cp .env.sample .env

そして .env には Slack App の token 等を設定します。

3) ビルド & 起動

npm run build
npm start

4) Codex CLI のインストール(ユーザー領域)

mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.profile
source ~/.profile
npm i -g @openai/codex

5) Codex のログイン

お好きな方法で認証してください。terminal で codex が動作すればどんな方法でも問題ないです。
デバイスコードでログインする場合は、次のコマンドを使います。

codex login --device-auth

ブラウザでコード入力 → 認証する方式なので、CLI 側の操作は最小限で済みます。

6) systemd で常駐

sudo nano /etc/systemd/system/slack-codex-bridge.service
[Service]
Type=simple
User={your-user-name}
WorkingDirectory=/home/{your-user-name}/slack-codex-bridge
EnvironmentFile=/home/{your-user-name}/slack-codex-bridge/.env
Environment=PATH=/home/{your-user-name}/.npm-global/bin:/usr/bin:/bin
ExecStart=/usr/bin/node /home/{your-user-name}/slack-codex-bridge/dist/app/index.js
Restart=always
RestartSec=5
sudo systemctl daemon-reload
sudo systemctl enable slack-codex-bridge
sudo systemctl start slack-codex-bridge
journalctl -u slack-codex-bridge -f

ハマりポイント
codex not found が出たら、だいたい systemd の PATH に codex が入っていないのが原因です。which codex の結果を Environment=PATH=... に足すと解決します。


再起動したときの確認

VM が再起動しても、systemd が有効なら基本的に自動起動されます。とはいえ「動いてるか」を確認するのが一番早いです。

systemctl status slack-codex-bridge

動いていなければ起動します。

sudo systemctl start slack-codex-bridge

起動失敗時はログを見ると原因が分かります。

journalctl -u slack-codex-bridge -b

再起動後によくある原因

  • PATH が効いていない(Environment=PATH=... を見直す)
  • .env のパスが間違っている(EnvironmentFile=... を確認)
  • Node のパスがずれている(which node で ExecStart を合わせる)

改修したときの再起動(デプロイ更新)

コードを更新したら、ビルド → 再起動の順で反映します。

cd /home/{your-user-name}/slack-codex-bridge
git pull
npm install
npm run build
sudo systemctl restart slack-codex-bridge

反映確認:

journalctl -u slack-codex-bridge -f

git pull が不要な場合は、その手順だけ飛ばせば OK です。


まとめ

Bolt + Codex CLI の組み合わせは、「将来の拡張を見据えつつ軽量に Slack 連携を動かしたい人」 に向いています。軽量構成なので、他のコマンド追加もエージェントに丸投げでサクッと完成…するはずです(期待)。

Discussion