⚡ 3秒でわかる!この記事のポイント
- OpenClawはSlack・Discord・メールなど複数チャネルへの一元通知配信が可能
- 条件分岐・フィルタリング・エスカレーションで賢い通知設計ができる
- cronジョブ連携で監視・レポート通知を完全自動化
「Slackに通知を飛ばしたいけど、毎回スクリプトを書くのが面倒…」「重要な通知とそうでない通知を分けたい」「複数チャネルへの同時配信を自動化したい」
OpenClawの通知パイプライン機能を使えば、監視アラート・定期レポート・タスク完了通知などを、条件に応じて適切なチャネルに自動配信できます。
この記事では、OpenClaw完全攻略シリーズのEp.17として、通知パイプラインの設計から実装まで実践的に解説します。
この記事でわかること
- OpenClawの通知配信アーキテクチャ
- Slack・Discord・メール連携の設定方法
- 条件付き通知のルーティング設計
- エスカレーションの実装パターン
- 通知テンプレートの管理と活用
OpenClawの通知パイプライン全体像

OpenClawの通知パイプラインは、トリガー → フィルタリング → テンプレート適用 → チャネル配信の4段階で構成されます。各段階をカスタマイズすることで、状況に応じた最適な通知を実現できます。
通知パイプラインの基本構成
┌──────────┐ ┌───────────┐ ┌──────────┐ ┌──────────┐
│ トリガー │ → │ フィルタ │ → │ テンプレ │ → │ 配信先 │
│ │ │ │ │ ート適用 │ │ │
│ - cron │ │ - 重要度 │ │ - Slack形 │ │ - Slack │
│ - webhook│ │ - 時間帯 │ │ 式 │ │ - Discord│
│ - event │ │ - 条件式 │ │ - Discord │ │ - Email │
│ - watch │ │ │ │ 形式 │ │ - SMS │
└──────────┘ └───────────┘ └──────────┘ └──────────┘
Slack通知の設定
基本的なSlack通知
OpenClawからSlackへの通知は、messageツールを使用します:
# openclaw.json の channels 設定
{
"channels": {
"slack": {
"type": "slack",
"token": "${SLACK_BOT_TOKEN}",
"defaultChannel": "#notifications"
}
}
}
通知の送信例:
// ワークスペースのスクリプトから通知送信
message({
action: "send",
target: "C0AF55LV0B0", // #ses-base チャネルID
message: "📊 日次レポートが完了しました\n\n" +
"• PV数: 1,234 (+12%)\n" +
"• ユニークユーザー: 856\n" +
"• 直帰率: 42.3%"
});
Rich Format通知
Block Kit形式でリッチな通知を送信:
// 構造化されたレポート通知
message({
action: "send",
target: "#ses-base",
message: "🚨 *サーバーアラート*\n\n" +
"```\n" +
"サーバー: production-web-01\n" +
"CPU使用率: 95.2%\n" +
"メモリ: 87.4%\n" +
"ディスク: 72.1%\n" +
"```\n\n" +
"⏰ 検知時刻: 2026-03-11 14:23 JST\n" +
"🔗 <https://grafana.example.com/d/abc|Grafanaダッシュボード>"
});
チャネル別の通知ルーティング
重要度に応じて通知先を変える設計:
function routeNotification(event) {
const { severity, category, message } = event;
// CRITICAL: 緊急チャネル + DM
if (severity === 'critical') {
message({
action: "send",
target: "#alerts-critical",
message: `🔴 CRITICAL: ${message}`
});
message({
action: "send",
target: "@oncall-engineer",
message: `🚨 緊急対応が必要です: ${message}`
});
return;
}
// WARNING: アラートチャネル
if (severity === 'warning') {
message({
action: "send",
target: "#alerts-warning",
message: `🟡 WARNING: ${message}`
});
return;
}
// INFO: 一般通知チャネル
message({
action: "send",
target: "#notifications",
message: `ℹ️ ${message}`
});
}
Discord通知の設定
Discord連携の基本
# openclaw.json でDiscord設定
{
"channels": {
"discord": {
"type": "discord",
"token": "${DISCORD_BOT_TOKEN}",
"guildId": "1234567890"
}
}
}
Discord固有のフォーマット
Discordではマークダウンテーブルが使えないため、フォーマットを工夫します:
// Discord向けの日次レポート
function sendDiscordReport(data) {
const report = [
"📊 **日次レポート** — " + new Date().toLocaleDateString('ja-JP'),
"",
"**📈 アクセス指標**",
`• PV数: **${data.pv.toLocaleString()}** (${data.pvChange})`,
`• ユーザー数: **${data.users.toLocaleString()}** (${data.usersChange})`,
`• セッション: **${data.sessions.toLocaleString()}**`,
"",
"**🔥 人気記事TOP3**",
...data.topArticles.map((a, i) => `${i + 1}. ${a.title} (${a.pv} PV)`),
"",
"**💡 注目ポイント**",
data.highlight
].join('\n');
message({
action: "send",
target: "discord-channel-id",
message: report
});
}
cronジョブとの連携
定期通知の設定
OpenClawのcronジョブ機能と組み合わせて定期通知を自動化:
// openclaw.json のcronジョブ設定
{
"cron": [
{
"name": "daily-report",
"schedule": "0 9 * * *",
"prompt": "GA4のデータを取得して日次レポートをSlack #ses-baseに投稿してください",
"channel": "slack:C0AF55LV0B0"
},
{
"name": "weekly-summary",
"schedule": "0 10 * * 1",
"prompt": "先週のGA4データをまとめて週次サマリーを作成し、Slackに投稿してください",
"channel": "slack:C0AF55LV0B0"
},
{
"name": "server-health-check",
"schedule": "*/30 * * * *",
"prompt": "サーバーのヘルスチェックを実行し、異常があればアラートを送信してください",
"channel": "slack:C0AF55LV0B0"
}
]
}
イベント駆動通知
特定のイベントをトリガーにした通知:
// Git push時の自動通知
async function onGitPush(event) {
const { branch, commits, author } = event;
if (branch === 'main') {
message({
action: "send",
target: "#deployments",
message: [
`🚀 **${author}** が main にプッシュしました`,
"",
`コミット数: ${commits.length}`,
...commits.slice(0, 5).map(c => `• \`${c.hash.slice(0,7)}\` ${c.message}`),
commits.length > 5 ? `...他 ${commits.length - 5} コミット` : ""
].join('\n')
});
}
}
// GitHub Actionsの結果通知
async function onCIComplete(event) {
const { status, workflow, duration, url } = event;
const emoji = status === 'success' ? '✅' : '❌';
message({
action: "send",
target: "#ci-cd",
message: `${emoji} **${workflow}** — ${status}\n⏱️ ${duration}s\n🔗 <${url}|詳細>`
});
}
エスカレーション設計
段階的エスカレーション
未対応の通知を段階的にエスカレートする設計:
class EscalationPipeline {
constructor() {
this.levels = [
{ delay: 0, target: '#alerts', mention: '' },
{ delay: 300, target: '#alerts', mention: '@channel' },
{ delay: 900, target: '#alerts-urgent', mention: '@oncall' },
{ delay: 1800, target: 'dm', mention: 'manager' },
];
}
async escalate(alert) {
for (const level of this.levels) {
if (alert.acknowledged) break;
await sleep(level.delay * 1000);
message({
action: "send",
target: level.target,
message: [
`🚨 ${level.mention} **エスカレーション Lv.${this.levels.indexOf(level) + 1}**`,
"",
`アラート: ${alert.title}`,
`発生時刻: ${alert.timestamp}`,
`未対応時間: ${Math.round(level.delay / 60)}分`,
"",
`⚡ \`/ack ${alert.id}\` で対応開始を宣言`
].join('\n')
});
}
}
}
時間帯による通知制御
深夜の非緊急通知を抑制する設計:
function shouldNotify(severity, hour) {
// 深夜帯(23:00-07:00)はCRITICALのみ通知
if (hour >= 23 || hour < 7) {
return severity === 'critical';
}
// 営業時間外(19:00-23:00)はWARNING以上
if (hour >= 19) {
return severity === 'critical' || severity === 'warning';
}
// 営業時間内は全て通知
return true;
}
function sendNotification(event) {
const hour = new Date().getHours();
if (!shouldNotify(event.severity, hour)) {
// 翌朝まとめて送信するキューに追加
addToPendingQueue(event);
return;
}
routeNotification(event);
}
通知テンプレートの管理
テンプレートファイルの構成
workspace/
templates/
notifications/
daily-report.md # 日次レポート
weekly-summary.md # 週次サマリー
alert-critical.md # 緊急アラート
deploy-success.md # デプロイ成功
deploy-failure.md # デプロイ失敗
テンプレート例
<!-- templates/notifications/daily-report.md -->
📊 **日次レポート** — {{date}}
**アクセス概要**
• PV: **{{pv}}** ({{pvChange}})
• UU: **{{uu}}** ({{uuChange}})
• 平均滞在: {{avgDuration}}
**人気記事TOP5**
{{#each topArticles}}
{{@index + 1}}. {{title}} — {{pv}} PV
{{/each}}
**流入元**
{{#each sources}}
• {{name}}: {{sessions}} ({{percentage}}%)
{{/each}}
{{#if alerts}}
⚠️ **注意事項**
{{#each alerts}}
• {{message}}
{{/each}}
{{/if}}
テンプレートの動的適用
async function sendDailyReport() {
// GA4データ取得
const data = await fetchGA4Data();
// テンプレート読み込み
const template = await readFile('templates/notifications/daily-report.md');
// テンプレート変数を置換
const rendered = template
.replace('{{date}}', new Date().toLocaleDateString('ja-JP'))
.replace('{{pv}}', data.pv.toLocaleString())
.replace('{{pvChange}}', formatChange(data.pvChange))
.replace('{{uu}}', data.uu.toLocaleString());
// 複数チャネルに配信
message({ action: "send", target: "#ses-base", message: rendered });
}
実践: SES現場での活用パターン
パターン1: プロジェクト進捗自動報告
// 毎日17:00にプロジェクト進捗を自動集計・報告
async function dailyProjectUpdate() {
// GitHub Issues/PRの状態を集計
const openIssues = await exec('gh issue list --state open --json number | jq length');
const closedToday = await exec('gh issue list --state closed --json closedAt | jq "[.[] | select(.closedAt > \\"$(date -v-1d +%Y-%m-%d)\\")] | length"');
const openPRs = await exec('gh pr list --state open --json number | jq length');
message({
action: "send",
target: "#project-updates",
message: [
"📋 **プロジェクト進捗レポート**",
"",
`• オープンIssue: ${openIssues}件`,
`• 本日クローズ: ${closedToday}件`,
`• レビュー待ちPR: ${openPRs}件`,
].join('\n')
});
}
パターン2: SLAモニタリング通知
// SLA違反の検知と通知
async function checkSLA() {
const metrics = await fetchMetrics();
if (metrics.responseTime > 3000) { // 3秒超
message({
action: "send",
target: "#sla-alerts",
message: `⚠️ SLA違反リスク: レスポンスタイム ${metrics.responseTime}ms (閾値: 3000ms)`
});
}
if (metrics.availability < 99.9) {
message({
action: "send",
target: "#sla-alerts",
message: `🔴 可用性SLA違反: ${metrics.availability}% (目標: 99.9%)`
});
}
}
パターン3: コスト最適化アラート
// クラウドコストの急増検知
async function checkCostAnomaly() {
const todayCost = await fetchTodayCost();
const avgCost = await fetchAverageDailyCost(30); // 30日平均
if (todayCost > avgCost * 1.5) { // 50%超過
message({
action: "send",
target: "#cost-alerts",
message: [
"💸 **コスト異常検知**",
"",
`本日のコスト: ¥${todayCost.toLocaleString()}`,
`30日平均: ¥${avgCost.toLocaleString()}`,
`超過率: +${Math.round((todayCost / avgCost - 1) * 100)}%`,
"",
"👉 コスト詳細を確認してください"
].join('\n')
});
}
}
よくある質問
Q: 通知が多すぎて見逃しが発生しない?
通知疲れを防ぐための対策:
- 重要度フィルタリングで不要な通知を抑制
- バッチ配信で低優先度の通知をまとめる
- 時間帯制御で深夜の非緊急通知を翌朝に
- ダイジェスト機能で1日の通知をサマリー化
Q: OpenClawの通知とSlackBotの違いは?
| 比較項目 | OpenClaw通知 | SlackBot単体 |
|---|---|---|
| AI処理 | 通知内容をAIが生成 | 固定テンプレート |
| マルチチャネル | Slack + Discord + メール | Slackのみ |
| 条件分岐 | AI判断による動的ルーティング | ルールベース |
| コスト | OpenClaw利用料に含む | Slack API無料枠 |
Q: 通知パイプラインのスキルは案件に活かせる?
通知・監視の自動化スキルは以下の案件で需要があります:
- SRE/DevOps案件: 月額70〜95万円
- 監視基盤構築: 月額65〜85万円
- ChatOps導入: 月額60〜80万円
まとめ
OpenClawの通知パイプラインを活用すれば、監視・レポート・アラートの自動配信を一元管理できます。
この記事のまとめ
- Slack・Discord・メールへの一元通知配信が可能
- 条件分岐とフィルタリングで賢い通知ルーティング
- エスカレーション設計で重要アラートの見逃し防止
- cronジョブ連携で定期レポートを完全自動化
- 通知テンプレートで品質と一貫性を維持
OpenClaw完全攻略シリーズの他の記事も合わせてご覧ください: