はじめに
Clawdbot、使ってますか?
*導入に関しては他の方が書かれてるのでそちらをどうぞ…
Claude CodeをDiscordやSlackから呼び出せるGateway型のAIアシスタント基盤、便利ですよね。ただ、使っていて一つ気になることがありました。
「寝てる間にDiscordでメモ送っておいて、朝起きたら処理されてたら最高じゃない?」
Clawdbotはリアルタイム処理が前提の設計なので、Gatewayが止まっている間のメッセージは拾ってくれません。でも調べてみたら、BOOT.md を使えば実現できることがわかりました。
この記事では、オフライン中に溜まったメッセージを起動時に処理する機能の実装方法を紹介します。
こんな人向け
この記事は、以下のような状況の人に向けて書いています。
🖥️ ローカルPCでClawdbotを動かしている人
AWSなどでの常時稼働ではなく、自分のPCでClawdbotを動かしている場合、PCをシャットダウンするとGatewayも止まります。寝ている間や外出中にふと「あ、これやっておいてほしい」と思いついても、Discordにメモを送るだけでは処理されません。
⏳ レートリミットで待ち時間が発生する人
Claude APIにはレートリミットがあります。連続してタスクを投げたいけど、リミットに引っかかって待たされる…そんなとき、「とりあえずメッセージを送っておいて、後でまとめて処理」ができたら便利ですよね。
📝 思いついたときにメモだけ投げておきたい人
「明日これ調べて」「この記事読んでまとめて」「このコードレビューして」——思いついたタイミングでメモを投げておいて、次にClawdbotが起動したときに順番に処理してもらう。そんな非同期的な使い方ができるようになります。
課題:Clawdbotはリアルタイム処理前提
まず、Clawdbotのメッセージ処理の仕組みを確認しましょう。
Inbound message
-> routing/bindings -> session key
-> queue (if a run is active)
-> agent run (streaming + tools)
-> outbound replies
ポイントは以下の通り:
- メッセージは「届いた瞬間」に処理される
- Gateway停止中に届いたメッセージは自動的には処理されない
- Queue機能は「同時に複数メッセージが来た場合」の調整用
つまり、PCの電源を落としている間に送ったメッセージは、起動しても無視されます。
解決策:BOOT.md + 状態ファイル
調査の結果、以下の方針で実装できることがわかりました。
- 状態ファイルで「最後に処理したメッセージID」を記録
- BOOT.md(起動時に実行されるファイル)で未読メッセージを取得
- 取得したメッセージを順番に処理
- 最新のIDを状態ファイルに保存
なぜBOOT.mdなのか
Clawdbotには起動時のフックがいくつかあります。
| フック | タイミング | 特徴 |
|---|---|---|
gateway:startup |
Gateway起動完了後 | カスタムHook実装が必要 |
boot-md |
Gateway起動後 | BOOT.mdを書くだけ |
| Heartbeat | 定期実行 | 起動時専用ではない |
boot-md が最もシンプルです。設定で有効にするだけで、ワークスペースの BOOT.md が起動時に実行されます。
実装
Step 1: boot-md を有効化
~/.clawdbot/clawdbot.json に以下を追加(または確認):
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"boot-md": { "enabled": true }
}
}
}
}
Step 2: 状態ファイルを作成
ワークスペースに state/ ディレクトリを作り、状態ファイルを配置します。
// ~/clawd/state/discord-last-processed.json
{
"channels": {
"1234567890123456789": null
}
}
- キー:監視したいチャンネルID
- 値:最後に処理したメッセージID(初回は
null)
Step 3: BOOT.md を作成
ワークスペースのルートに BOOT.md を作成します。
# 起動時タスク
## 溜まったメッセージ処理
起動時に、オフライン中に送られたメッセージを処理する。
### 手順
1. **状態ファイルを読む**: `state/discord-last-processed.json`
2. **監視チャンネルごとに処理**:
- `message read` で `after: lastId` 以降のメッセージを取得(limit: 20)
- 自分以外のユーザーからのメッセージをフィルタ
- 古い順に処理
3. **初回起動時(lastId が null)**:
- 過去メッセージは処理しない
- 現在の最新メッセージIDを保存するだけ
4. **処理完了後**:
- 最新のメッセージIDを状態ファイルに保存
- 処理件数を報告
BOOT.mdは自然言語で書けます。Clawdbotがこれを読んで、適切にツールを呼び出してくれます。
動作確認
- Gatewayを起動した状態で、テストメッセージを送る
- Gatewayを停止
- Discordにメッセージを送る(「明日これやっておいて」など)
- Gatewayを再起動
- 起動時に溜まったメッセージが処理されることを確認
ポイント・注意点
フィルタ条件を設定しよう
すべてのメッセージを処理すると、自分の発言まで拾ってしまいます。以下のようなフィルタを設定しましょう:
- 特定ユーザーのメッセージのみ
- Bot(自分自身)のメッセージは除外
- メンション付きのみ(必要に応じて)
初回起動の挙動
lastId が null の場合(初回起動時)は、過去のメッセージを全部処理するのではなく、「ここから監視開始」として現在の最新IDを保存するだけにしています。
過去のメッセージを遡って処理したい場合は、この挙動を変更してください。
Rate Limit に注意
チャンネル数が多いと、起動時に大量のAPIリクエストが発生します。Discord APIのRate Limitに引っかかる可能性があるので、必要に応じて遅延を入れましょう。
まとめ
Clawdbotの BOOT.md と状態ファイルを組み合わせることで、オフライン中のメッセージを起動時に処理する機能を実装できました。
- BOOT.md: 起動時に実行される自然言語の指示書
- 状態ファイル: 最後に処理したメッセージIDを永続化
- message read: Discord APIでメッセージ履歴を取得
「寝る前にタスクをメモしておいて、朝PCを起動したら処理されてる」という運用ができるようになります。
Clawdbotを常時稼働させていない環境(ローカルPCで動かしているなど)では、特に便利な機能だと思います。ぜひ試してみてください。