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

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

執筆・編集:株式会社Nexa 編集部(下書きと機械検査はAI、公開前に人が確認)/約18分で読めます。公式ドキュメント・公式発表などの一次情報を確認したうえで執筆・更新しています。AIツールの仕様や料金は変わることがあるため、導入判断の前に各公式サイトの最新情報もご確認ください。記事の作り方と検査の方針

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件送ってみる

確認日: 2026年10月2日に各社公式ページで記載内容を確認

この記事の著者
株式会社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 チャンネル一覧の取得

Incoming WebhookとBot Tokenの使い分け

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

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

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

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://example.com/booking"
  }'

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

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

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

import subprocess
import json

# チャンネルIDとメンション先ユーザーIDの対応
targets = [
    {"channel": "C0AAAAAAAAA", "user": "U0AAAAAAAAA", "name": "A社担当者"},
    {"channel": "C0BBBBBBBBB", "user": "U0BBBBBBBBB", "name": "B社担当者"},
    {"channel": "C0CCCCCCCCC", "user": "U0CCCCCCCCC", "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つのクライアントチャンネルへの送信が数秒で完了します。

—
AI導入に関するお困りごとは、株式会社NexaのAI顧問がサポートします。「何から始めればいいか分からない」という段階からご相談いただけます。

[AI顧問の無料相談はこちら →](https://nexa-corp.jp/ai-consultation/)
—

スレッド返信・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」エラーが発生します。conversations.open はAPIメソッド名で、呼び出しには先ほどの im:write スコープを使います(スコープ名ではない点に注意)。

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

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

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

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

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

  1. DM送信時にユーザーIDを直接指定した場合(例: "channel": "U0DDDDDDDDD") → 正しくは 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)が正しいかを検証するとスムーズです。

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

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

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

OpenClawのcronジョブは、CLIコマンド(openclaw automations addなど)やGatewayの管理画面から登録・管理します。設定項目の詳細は公式ドキュメント(github.com/openclaw/openclaw)で確認してください。ジョブの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": ["U0EEEEEEEEE"]
    }
  }
}

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

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

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

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

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

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

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

AI顧問の無料相談はこちら

よくある質問

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

Anthropicは2025年12月に「Claude Code in Slack」をリサーチプレビューとして公開し、2026年6月には後継となる「Claude Tag」を発表しました(Claude Enterprise・Teamプラン向けベータ)。Claude Tagはチャンネル内の会話からコンテキストを学習し、複数人が同じスレッドで同時に連携できるほか、未解決のタスクを自発的にフォローアップする機能を持つクラウド上のエージェントです。一方、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別のレートリミットを確認してください。

Q. 結局、Incoming WebhookとBot Tokenのどちらを使えばいいですか?

固定チャンネルへの単純な通知だけなら、設定が1分で終わるIncoming Webhookで十分です。@メンション付きの送信、DM、スレッド返信など柔軟な使い方をしたい場合はBot Token(chat.postMessage)を選びます。迷ったら、まずIncoming Webhookで通知を1件送って動作確認し、必要になった時点でBot Tokenに切り替えるとスムーズです。

Q. 複数のSlackチャンネルに同時に通知を送るには?

チャンネルIDとメンション先ユーザーIDの対応表を作っておき、chat.postMessage をループで呼び出します。本記事の「複数チャンネルへ一斉送信するパターン」で示したPythonの実装例のように、チャンネルごとに subprocess でcurlを呼び出せば、数チャンネル程度であれば数秒で送信が完了します。

まとめ

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ステップ


法人向けAI導入・活用の月額伴走サービス

AI導入の疑問を、週1回のMTGで相談できる「AI顧問」

株式会社Nexaでは、ChatGPT・Claude・Claude CodeなどのAI導入に関する質問や、社内活用・業務自動化の進め方を週1回相談できる 月額7万円(毎月3社限定で月額5万円)のAI顧問サービス を提供しています。

「自社では何から始めるべきか」「この業務はAI化できるか」「どのツールを選ぶべきか」を、無料相談で整理します。

AI顧問の無料相談はこちら →





この記事で参照した外部情報

  1. api.slack.com/appsapi.slack.com
  2. github.com/openclaw/openclawgithub.com

本文中でリンクしている外部ページの一覧です(自動生成)。最終確認日は本記事の最終更新日 2026-10-02 で、リンク先の内容はその後変わることがあります。

AI導入を検討中の方へ

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

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