Claude Code × Slackで業務報告・通知を自動化する方法【実践ガイド】

Claude Code Slack自動通知のイメージ画像

Claude Code × Slack API連携で、メンション送信・スレッド返信・定期通知cronが数十行で実現できます。

  • 要点1: Slack Bot TokenとIncoming Webhookの2方式を使い分けることで、用途に応じた通知が可能
  • 要点2: chat.postMessageにthread_tsを付けるとスレッドへの返信に対応できる
  • 要点3: OpenClawのcronジョブ内でcurl + Slack APIを直接呼び出す方式が最も安定

対象: Claude Codeを使った業務自動化を検討している経営者・DX推進担当者

今日やること: Slack AppのIncoming WebhookをONにして、テスト通知を1件送ってみる

この記事の著者
川島陸

株式会社Nexa 代表取締役川島 陸

一橋大学経済学部卒業後、フォーティエンスコンサルティング株式会社(旧 株式会社クニエ)にて法人向けAI導入支援等を経験。独立後、AI系メディア運営やDify/n8nの導入支援を経て、株式会社Nexaを創業。法人向けAI研修・AI導入支援・AI関連メディア運営を手掛ける。

Claude CodeとSlackを連携させると、クライアントへのメンション付きメッセージ送信や毎朝のカレンダー通知など、これまで手作業で行っていた連絡業務をAIが代わりに実行できます。

「Slackのメッセージ送信を自動化したいが、APIの設定が難しそう」——そう感じている方は少なくありません。しかし実際は、Slack AppとBot Tokenを用意すれば、数十行のコードで実現できます。

この記事では、実際にClaudeエージェントを複数のクライアントSlackチャンネルに常駐させ、日程調整メッセージ送信や毎朝のカレンダー通知を自動化した事例をもとに、具体的な実装手順と運用上のポイントを解説します。

Claude Code × Slack連携で実現できること

Claude CodeとSlack APIを組み合わせると、AIが「Slackの中で働く担当者」として機能するようになります。単純な通知送信にとどまらず、会話のコンテキストを踏まえた対応も可能です。

AIがSlackで「代わりに連絡してくれる」具体的なシーン

実際に自動化できる業務として、以下のようなシーンが挙げられます。

業務 自動化の内容 効果
クライアントへの日程調整 複数チャンネルへのメンション付きメッセージを一括送信 手作業での1件ずつ送信が不要に
毎朝のスケジュール確認 Googleカレンダーの予定をSlack DMに自動通知 予定の見落としを防止
タスク完了報告 cronジョブ完了時に結果をチャンネルに投稿 処理結果の確認が即時化
会議後のアクションアイテム共有 Slackスレッドのサマリーを自動生成 議事録作成の工数を削減

あるAIを活用した事業では、複数のクライアントが参加する各Slackチャンネルに対して、AIエージェントが担当者の名前を@メンションしながら次回セッションの日程調整メッセージを一括送信する仕組みを構築しています。従来は担当者が各チャンネルを開いてコピー&ペーストしていた作業が、コマンド1つで完結するようになりました。

Slack連携の3つの実装方式

Claude CodeからSlackに通知・メッセージを送る方法は、主に3つあります。

1. Incoming Webhook(最もシンプル)URLに対してcurl/POSTするだけでメッセージが送れます。設定が簡単で、通知専用の用途に適しています。ただしメンションやスレッド返信には向きません。

2. Slack Bot API(chat.postMessage)Bot Tokenを使って柔軟なメッセージ送信が可能です。メンション・スレッド返信・DM送信・チャンネル切り替えに対応しており、最も汎用的な方式です。

3. OpenClaw + Slack連携Claude Codeを24時間Slack常駐エージェントとして動かすフレームワークです。Slackからの指示を受け取り、Claude Codeが処理を実行した結果を返信する双方向の連携が可能です。

本記事では主にBot API(chat.postMessage)の使い方とOpenClawのcronジョブへの統合方法を解説します。

関連記事: Claude CodeでGoogleカレンダーの予定を毎朝自動通知する方法

Slack APIの準備 — Bot TokenとWebhook URLの取得

Slack APIを使うには、まず「Slack App」を作成し、必要な権限を付与したBot Tokenを取得する必要があります。

Slack Appの新規作成手順

  1. api.slack.com/apps にアクセスし、「Create New App」をクリック
  2. 「From scratch」を選択し、App名とワークスペースを指定
  3. 「OAuth & Permissions」から権限スコープを設定
  4. 「Install App to Workspace」でAppをインストール
  5. 「Bot User OAuth Token」(xoxb-から始まるトークン)をコピー

必要なOAuth権限スコープ

用途に応じて以下のスコープを付与します。

スコープ 用途
chat:write メッセージの送信(必須)
chat:write.public Botが参加していないパブリックチャンネルへの送信
users:read ユーザーIDからプロフィール取得(@メンション用)
im:write DM(ダイレクトメッセージ)の送信
channels:read チャンネル一覧の取得
conversations.open DMチャンネルIDの取得

Incoming WebhookとBot Tokenの使い分け

方式 セットアップ 用途
Incoming Webhook 1分(URLを取得するだけ) 固定チャンネルへの通知専用
Bot Token 5〜10分(権限設定が必要) メンション・DM・スレッド返信など柔軟な用途

単純な通知であればIncoming Webhookで十分ですが、クライアント別チャンネルへのメンション付き送信や、ユーザーへのDM通知を行う場合はBot Tokenが必要です。

\ Claude Codeの導入、何から始めればいいかわかります /

法人向けClaude Code個別指導の無料相談はこちら

メンション付きメッセージを送信する

Bot Tokenを取得したら、chat.postMessage APIでメッセージを送信できます。@メンションは <@ユーザーID> の形式で埋め込みます。

SlackユーザーIDの調べ方

@メンションを付けるには、相手のSlackユーザーIDが必要です。

方法1: Slack APIで検索する

curl -s "https://slack.com/api/users.list" \  -H "Authorization: Bearer xoxb-YOUR-BOT-TOKEN" | \  python3 -c "import json,sys; [print(u['name'],u['id']) for u in json.load(sys.stdin)['members'] if not u.get('is_bot')]"

方法2: Slackのプロフィールから確認する対象ユーザーのプロフィールを開き、「…」(その他)→「メンバーIDをコピー」を選択します。

方法3: Claude Codeに探させる「Slack APIで〇〇さんのユーザーIDを探してください」と指示すると、Bot Tokenを使って自動的に検索してくれます。

実際の活用例として、あるメディアサイトでは複数チャンネルに参加している外部クライアントのユーザーIDをClaude Codeが自動取得し、次のメンション付きメッセージ送信に活用しています。

chat.postMessageの基本構文

curl -s https://slack.com/api/chat.postMessage \  -H "Authorization: Bearer xoxb-YOUR-BOT-TOKEN" \  -H "Content-Type: application/json" \  -d '{    "channel": "C0XXXXXXXXX",    "text": "<@U0XXXXXXXXX> 来週のご都合はいかがでしょうか?\n日程調整はこちらからお選びください: https://timerex.net/s/example"  }'

channel にはチャンネルID(Cから始まる)を、text<@U0XXXXXXXXX> の部分にユーザーIDを入れます。

複数チャンネルへ一斉送信するパターン

複数のクライアントチャンネルへ同じ趣旨のメッセージを送る場合、チャンネルIDとメンション先ユーザーIDをまとめておき、ループで送信します。

import subprocessimport json# チャンネルIDとメンション先ユーザーIDの対応targets = [    {"channel": "C0AET5HC73L", "user": "U0843B22X6F", "name": "A社担当者"},    {"channel": "C0AFGLT12S0", "user": "U0779RN6XFW", "name": "B社担当者"},    {"channel": "C0AEKGQQD5G", "user": "U02CQFX523U", "name": "C社担当者"},]for t in targets:    message = f"<@{t['user']}> お世話になっております。来週のAI個別指導の日程調整をお願いいたします。\n下記リンクよりご都合の良い時間をお選びください。"    payload = {"channel": t["channel"], "text": message}    result = subprocess.run(        ["curl", "-s", "https://slack.com/api/chat.postMessage",         "-H", "Authorization: Bearer xoxb-YOUR-BOT-TOKEN",         "-H", "Content-Type: application/json",         "-d", json.dumps(payload)],        capture_output=True, text=True    )    response = json.loads(result.stdout)    print(f"{t['name']}: {'送信成功' if response.get('ok') else '送信失敗'}")

このパターンにより、3つのクライアントチャンネルへの送信が数秒で完了します。


Claude Codeを使ったSlack自動化の設計・実装について、個別にご相談いただけます。「どの業務を自動化すべきか」「自社のSlack運用に合わせた実装方法を知りたい」といった段階から対応しています。

法人向けClaude Code個別指導の無料相談はこちら|まずはお困りごとをプロに相談


スレッド返信・DM送信を実装する

チャンネルへの投稿だけでなく、特定のメッセージへのスレッド返信やDMが必要な場面もあります。

thread_tsでスレッドに返信する

スレッド返信には thread_ts(親メッセージのタイムスタンプ)が必要です。

curl -s https://slack.com/api/chat.postMessage \  -H "Authorization: Bearer xoxb-YOUR-BOT-TOKEN" \  -H "Content-Type: application/json" \  -d '{    "channel": "C0XXXXXXXXX",    "thread_ts": "1234567890.123456",    "text": "こちらがご依頼の件の処理結果です。"  }'

thread_ts は、親メッセージの送信時のAPI応答から取得できます(response.get('ts'))。

conversations.openでDMチャンネルIDを取得する

DM送信には、まず対象ユーザーとのDMチャンネルIDを取得する必要があります。これを忘れると「channel_not_found」エラーが発生します。

# DM チャンネルIDの取得curl -s https://slack.com/api/conversations.open \  -H "Authorization: Bearer xoxb-YOUR-BOT-TOKEN" \  -H "Content-Type: application/json" \  -d '{"users": "U09XXXXXXXXX"}' | python3 -c "import json,sys; print(json.load(sys.stdin)['channel']['id'])"

取得したチャンネルID(Dから始まる)を chat.postMessagechannel に指定することで、DM送信が可能になります。

DM送信でハマる「channel_not_found」エラーの解決策

Slack通知を自動化した際に最も頻繁に遭遇するエラーの一つが channel_not_found です。

このエラーは、以下の2つの場合に発生します。

  1. DM送信時にユーザーIDを直接指定した場合(例: "channel": "U09XXXXXXXXX") → 正しくは conversations.open でDMチャンネルID(D始まり)を取得してから指定する

  2. Botが対象チャンネルに参加していない場合 → Slackのチャンネル設定から「インテグレーション」→「アプリを追加する」でBotを招待する

あるサービスで毎朝のカレンダー通知cronを実装した際、announce配信メカニズムのバグにより not-delivered が続きました。調査の結果、OpenClawの内部配信方式に問題があることが判明し、cronジョブのプロンプト内でcurl + Slack API直接呼び出し方式に切り替えることで解決しています。announce配信に依存せず、エージェント自身がAPIを呼び出す設計が最も安定します。

ポイントSlack連携の配信問題をデバッグする際は、まず curl -s https://slack.com/api/auth.test -H "Authorization: Bearer xoxb-..." でBot Tokenの有効性を確認し、次にチャンネルIDの形式(C/D/U)が正しいかを検証するとスムーズです。

\ 業務自動化のお悩み、プロが30分で整理します /

法人向けClaude Code個別指導の無料相談はこちら

cronジョブで定期通知を自動化する

定期的な通知(毎朝のスケジュール確認、週次レポートなど)は、cronジョブとSlack APIを組み合わせることで完全自動化できます。

OpenClawのcronジョブにSlack通知を組み込む

OpenClawのcronジョブは ~/.openclaw/cron/jobs.json で管理します。ジョブのpromptの中でcurlコマンドを直接呼び出すことで、安定した通知配信が可能です。

cronジョブの基本構成:

{  "id": "daily-calendar-notify",  "name": "毎朝カレンダー通知",  "schedule": "0 9 * * *",  "enabled": true,  "prompt": "gogcliで今日のカレンダー予定を取得して、Slack DMに送信してください。...",  "delivery": {    "mode": "none"  },  "options": {    "model": "claude-haiku-4-5",    "maxTurns": 10,    "timeout": 120000  }}

delivery.mode: "none" を指定することで、OpenClaw内部の配信メカニズムを使わず、プロンプト内の処理(curl直接呼び出し)だけで通知を完結させます。

毎朝9時にカレンダー情報をSlack DMに送信するcron設定例

以下は、Googleカレンダーの今日の予定を取得してSlack DMに送信するcronジョブの実装例です。

{  "id": "daily-calendar-notify",  "name": "毎日朝9時カレンダー通知",  "schedule": "0 9 * * *",  "enabled": true,  "prompt": "以下の手順を実行してください:\n1. `gog calendar events --today --all` で今日の予定を取得する\n2. 予定を時系列に整理し、Slackに送信するメッセージを作成する\n3. 以下のcurlコマンドでSlack DMに送信する:\n```\ncurl -s https://slack.com/api/chat.postMessage \\\n  -H \"Authorization: Bearer xoxb-YOUR-BOT-TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"channel\": \"D0XXXXXXXXX\", \"text\": \"[メッセージ内容]\"}'\n```",  "delivery": {    "mode": "none"  },  "options": {    "model": "claude-haiku-4-5",    "maxTurns": 8,    "timeout": 120000  }}

このcronジョブが実際に動作すると、毎朝9時にSlack DMへ以下のような通知が届きます。

📅 今日の予定(2026年3月26日 木曜日)- 10:00〜11:00  AI個別指導セッション (Meet付き)- 14:00〜14:30  社内定例ミーティング- 16:00〜17:00  【新規相談】AI活用支援 (Meet付き)

cronからの通知がdeliveredにならない場合のデバッグ方法

cronジョブの実行ステータスは ~/.openclaw/cron/runs/ 配下のログファイルで確認できます。

not-delivered の主な原因と対処法:

エラー 原因 対処法
channel_not_found DM送信時にユーザーIDを指定している conversations.open でDMチャンネルIDを取得する
user_not_found announce配信でチャンネルIDが未登録 delivery.mode: "none" に変更してcurl直接呼び出しに切り替える
not_in_channel Botがチャンネルに未参加 チャンネルの「インテグレーション」からBotを招待する
invalid_auth Bot Tokenが無効 api.slack.comでToken再発行

セキュリティ設定 — 特定ユーザーのみ受け付ける

AIエージェントをSlackに常駐させる場合、不正利用やセキュリティリスクへの対策が重要です。

OpenClawのgroupPolicy / usersフィルタ設定

OpenClawでは、特定のユーザーIDからのメッセージのみ受け付けるよう設定できます。

{  "channels": {    "slack": {      "groupPolicy": "allowlist",      "users": ["U09RSFYN6GH"]    }  }}

この設定により、リスト外のユーザーからのメッセージはすべて無視されます。外部クライアントのSlackチャンネルに常駐させる場合でも、指定した内部ユーザー(管理者)からの指示のみを受け付けることができます。

actions.messages: falseで誤送信を防ぐ

Claude CodeがSlack上でSendMessageツールを使い、想定外のチャンネルに誤ってメッセージを送信するケースがあります。この問題は actions.messages: false の設定で防止できます。

{  "channels": {    "slack": {      "actions": {        "messages": false      }    }  }}

この設定を行うと、エージェントはSendMessageツールを使えなくなり、テキストを直接出力する(=Slackのチャンネルに返信される)方式のみに制限されます。

あるメディアサービスでは、この設定を行う前に「スレッドに送ったよ」というメタ応答だけが届いてしまい、肝心の回答がDMに送られていた問題が発生しました。actions.messages: false を適用した後は、エージェントの回答がチャンネル内に直接返信されるようになり、問題が解消しています。

\ AI活用の「次の一手」を一緒に考えませんか /

法人向けClaude Code個別指導の無料相談はこちら

よくある質問

Q. Claude Code公式のSlack連携とOpenClaw連携の違いは?

Anthropicが2026年3月にリリースした「Claude Code in Slack」はクラウド上でタスクを実行し、完了時にSlackスレッドへ通知するサービスです。一方、OpenClawはローカルのClaude Codeを24時間Slackに常駐させるフレームワークで、自社のデータや社内ツール(Google Workspace・Notion等)との連携が容易です。既存ワークスペースのデータを活用した深い自動化には、OpenClaw連携が適しています。

Q. Slack Botがスレッドではなく、DM等の別の場所に送ってしまう場合は?

エージェントがSendMessageツールを使って別の場所にメッセージを送っている可能性があります。actions.messages: false を設定してSendMessageツールを無効化すると、テキスト出力がそのままSlackチャンネル/スレッドに返信されるようになります。設定変更後はOpenClawのゲートウェイ再起動が必要です。

Q. Slack APIのレートリミットに引っかかった場合は?

Slack APIのchat.postMessageは1秒あたり1リクエストを目安にしています。複数チャンネルへの一括送信の際は、送信間に time.sleep(1) を挟むことでレートリミットを回避できます。大規模な一括送信が必要な場合は、Slackの公式ドキュメントでTier別のレートリミットを確認してください。

まとめ

Claude CodeとSlack APIを組み合わせた業務自動化のポイントをまとめます。

  • 実装方式の選択: 単純な通知はIncoming Webhook、メンション・DM・スレッド返信が必要な場合はBot API(chat.postMessage)を使用する
  • DM送信のポイント: conversations.open でDMチャンネルIDを取得してから送信する。ユーザーIDを直接指定すると channel_not_found エラーになる
  • cronジョブの安定運用: delivery.mode: "none" に設定し、プロンプト内でcurl直接呼び出し方式を採用する。announce配信メカニズムには依存しない
  • セキュリティ設定: groupPolicy: "allowlist"actions.messages: false を設定することで、不正利用と誤送信を防止する

最初のステップとして、Incoming WebhookでカレンダーAPIの通知を1件送ってみることをお勧めします。動作確認ができたら、Bot Tokenに切り替えてメンション付き送信やスレッド返信に対応していきましょう。

関連記事:- Claude Code × Gmailで受信メールを自動チェック・要約する方法SEO記事の完全自動生産ライン — KW選定から公開まで10ステップ

Claude Codeの導入・活用をサポートします

株式会社Nexaでは、Claude Codeを活用した業務自動化の個別指導・企業研修を提供しています。「Slack連携を実装したいが何から始めればいいかわからない」「既存ツールとどう連携するか相談したい」という段階からご支援いたします。

法人向けClaude Code個別指導の無料相談はこちら|まずはお困りごとをプロに相談 →



関連記事

AIの力で、ビジネスを次のステージへ

まずはお気軽にご相談ください。貴社に最適なAI活用プランをご提案します。

Claude Codeのプロに無料相談 30秒で日程調整完了