imsg チャンネルより API が充実しており、導入も簡単なため、iMessage 連携にはこちらを推奨します。
概要
- BlueBubbles ヘルパーアプリ (bluebubbles.app) を使って macOS 上で動作します。
- 推奨および検証済みの環境は macOS Sequoia (15) です。macOS Tahoe (26) でも動作しますが、現時点では Tahoe で編集機能が壊れており、グループアイコンの更新は成功と表示されても同期されない場合があります。
- OpenClaw は REST API (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*) を通じて通信します。 - 受信メッセージは webhook 経由で受け取り、返信送信、タイピングインジケーター、既読通知、Tapback は REST 呼び出しで処理します。
- 添付ファイルやステッカーは受信メディアとして取り込まれ、可能であればエージェントにも渡されます。
- ペアリングや許可リストの扱いは他のチャンネル (
/channels/pairingなど) と同様で、channels.bluebubbles.allowFromとペアリングコードを利用します。 - リアクションは Slack や Telegram と同様にシステムイベントとして扱われるため、エージェントは返信前にその内容へ触れられます。
- 高度な機能として、編集、送信取り消し、スレッド返信、メッセージエフェクト、グループ管理を利用できます。
クイックスタート
- Mac に BlueBubbles サーバーをインストールします (bluebubbles.app/install の手順に従ってください)。
- BlueBubbles の設定で、Web API を有効にし、パスワードを設定します。
-
openclaw onboardを実行して BlueBubbles を選択するか、手動で設定します。 -
BlueBubbles の webhook をゲートウェイへ向けます (例:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>)。 - ゲートウェイを起動します。webhook ハンドラーが登録され、ペアリングが始まります。
- webhook 用のパスワードは必ず設定してください。
- webhook 認証は常に必須です。ループバックやプロキシ構成に関係なく、
channels.bluebubbles.passwordと一致するパスワードまたは GUID を含まない BlueBubbles の webhook リクエストは拒否されます (例:?password=<password>またはx-password)。 - パスワード認証は、webhook 本文を最後まで読み込んだり解析したりする前に実行されます。
Messages.app をアクティブに保つ (VM / ヘッドレスセットアップ)
一部の macOS VM や常時稼働の構成では、Messages.app が「アイドル」状態になり、アプリを開くかフォアグラウンドに戻すまで受信イベントが止まることがあります。簡単な回避策として、AppleScript と LaunchAgent を使って 5 分ごとに Messages を刺激する 方法があります。1) AppleScript を保存する
次の場所に保存します。~/Scripts/poke-messages.scpt
2) LaunchAgent をインストールする
次の場所に保存します。~/Library/LaunchAgents/com.user.poke-messages.plist
- この設定は 300 秒ごと と ログイン時 に実行されます。
- 初回実行時には macOS の Automation プロンプト (
osascript→ Messages) が表示されることがあります。LaunchAgent を動かすのと同じユーザーセッションで承認してください。
オンボーディング
BlueBubbles は対話型セットアップウィザードから利用できます。- サーバー URL (必須): BlueBubbles サーバーアドレス (例:
http://192.168.1.100:1234) - パスワード (必須): BlueBubbles サーバー設定からの API パスワード
- webhook パス (オプション): デフォルトは
/bluebubbles-webhook - DM ポリシー: pairing、allowlist、open、または disabled
- 許可リスト: 電話番号、メールアドレス、またはチャットターゲット
アクセス制御 (DM + グループ)
DM:- デフォルト:
channels.bluebubbles.dmPolicy = "pairing"。 - 未知の送信者にはペアリングコードが返され、承認されるまでメッセージは無視されます。コードの有効期限は 1 時間です。
- 承認には次のコマンドを使います。
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- ペアリングが既定のトークン交換手段です。詳細は ペアリング を参照してください。
channels.bluebubbles.groupPolicy = open | allowlist | disabled(デフォルト:allowlist)。allowlistを設定した場合、channels.bluebubbles.groupAllowFromでグループ内の実行許可元を制御します。
メンションゲーティング (グループ)
BlueBubbles は、iMessage や WhatsApp と同じ考え方で、グループチャットのメンション制御をサポートします。- メンションの検出には
agents.list[].groupChat.mentionPatternsまたはmessages.groupChat.mentionPatternsを使います。 - グループで
requireMentionが有効な場合、エージェントはメンションされたときだけ返信します。 - 認可済み送信者からの制御コマンドは、この制約を迂回できます。
コマンドゲーティング
- 制御コマンド (例:
/config,/model) の実行には認可が必要です。 - コマンド実行の可否は
allowFromとgroupAllowFromで判定されます。 - 認可済み送信者は、グループ内でメンションがなくても制御コマンドを実行できます。
タイピング + 既読確認
- タイピングインジケーター: 応答生成の前後および生成中に自動送信されます。
- 既読通知:
channels.bluebubbles.sendReadReceiptsで制御します (デフォルトはtrue)。 - タイピングの終了: OpenClaw はタイピング開始イベントを送信し、BlueBubbles 側で送信時またはタイムアウト時に自動解除されます。DELETE による手動停止は信頼できません。
高度なアクション
設定で有効にすると、BlueBubbles は高度なメッセージ操作をサポートします。- react: Tapback リアクションの追加または削除 (
messageId,emoji,remove) - edit: 送信済みメッセージの編集 (
messageId,text) - unsend: メッセージの送信取り消し (
messageId) - reply: 特定のメッセージへの返信 (
messageId,text,to) - sendWithEffect: iMessage エフェクト付きでの送信 (
text,to,effectId) - renameGroup: グループチャットの名前変更 (
chatGuid,displayName) - setGroupIcon: グループチャットのアイコンや写真を設定 (
chatGuid,media)。macOS 26 Tahoe では不安定で、API が成功を返してもアイコンが同期されない場合があります。 - addParticipant: グループに誰かを追加 (
chatGuid,address) - removeParticipant: グループから誰かを削除 (
chatGuid,address) - leaveGroup: グループチャットからの退出 (
chatGuid) - sendAttachment: メディア/ファイルの送信 (
to,buffer,filename,asVoice)- ボイスメモ: MP3 または CAF の音声を iMessage のボイスメッセージとして送るには
asVoice: trueを設定します。BlueBubbles は送信時に MP3 を CAF へ変換します。
- ボイスメモ: MP3 または CAF の音声を iMessage のボイスメッセージとして送るには
メッセージ ID (短い vs 完全)
OpenClaw はトークン節約のために 短い メッセージ ID (例:1, 2) を表示することがあります。
MessageSidとReplyToIdには短い ID が入ることがあります。MessageSidFull/ReplyToIdFullにはプロバイダーの完全な ID が含まれています。- 短い ID はメモリ上にのみ保持されるため、再起動やキャッシュ削除で失効する可能性があります。
- 各アクションは短い
messageIdと完全なmessageIdの両方を受け付けますが、短い ID が失効している場合はエラーになります。
- テンプレート:
{{MessageSidFull}},{{ReplyToIdFull}} - コンテキスト: 受信ペイロード内の
MessageSidFull/ReplyToIdFull
ブロックストリーミング
応答を 1 件のメッセージとして送るか、複数ブロックに分けてストリーミングするかを制御します。メディア + 制限
- 受信した添付ファイルはダウンロードされ、メディアキャッシュに保存されます。
- 受信と送信のメディア上限は
channels.bluebubbles.mediaMaxMbで指定します (デフォルトは 8 MB)。 - 送信テキストは
channels.bluebubbles.textChunkLimitに従って分割されます (デフォルトは 4000 文字)。
設定リファレンス
完全な設定一覧は 設定 を参照してください。 プロバイダーオプション:channels.bluebubbles.enabled: チャンネルの有効化または無効化。channels.bluebubbles.serverUrl: BlueBubbles REST API ベース URL。channels.bluebubbles.password: API パスワード。channels.bluebubbles.webhookPath: webhook エンドポイントパス (デフォルト:/bluebubbles-webhook)。channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(デフォルト:pairing)。channels.bluebubbles.allowFrom: DM 許可リスト (ハンドル、メールアドレス、E.164 番号、chat_id:*,chat_guid:*)。channels.bluebubbles.groupPolicy:open | allowlist | disabled(デフォルト:allowlist)。channels.bluebubbles.groupAllowFrom: グループ送信者許可リスト。channels.bluebubbles.groups: グループごとの設定 (requireMentionなど)。channels.bluebubbles.sendReadReceipts: 既読通知を送信するかどうか (デフォルトはtrue)。channels.bluebubbles.blockStreaming: ブロックストリーミングを有効にするかどうか (デフォルトはfalse。ストリーミング返信に必要)。channels.bluebubbles.textChunkLimit: 送信時のチャンクサイズ上限。単位は文字数です (デフォルトは 4000)。channels.bluebubbles.chunkMode:length(デフォルト) はtextChunkLimitを超えたときだけ分割します。newlineは文字数ベースの分割前に空行、つまり段落境界で区切ります。channels.bluebubbles.mediaMaxMb: 受信および送信メディアの上限。単位は MB です (デフォルトは 8)。channels.bluebubbles.mediaLocalRoots: 送信時に使えるローカルメディアパスとして許可する絶対ディレクトリの明示的な allowlist です。これを設定しない限り、ローカルパスからの送信は既定で拒否されます。アカウント単位で上書きする場合はchannels.bluebubbles.accounts.<accountId>.mediaLocalRootsを使います。channels.bluebubbles.historyLimit: コンテキストに含めるグループメッセージの最大数 (0で無効化)。channels.bluebubbles.dmHistoryLimit: DM 履歴の制限。channels.bluebubbles.actions: 特定のアクションの有効化/無効化。channels.bluebubbles.accounts: マルチアカウント設定。
agents.list[].groupChat.mentionPatterns(またはmessages.groupChat.mentionPatterns)。messages.responsePrefix。
宛先指定 / 配信ターゲット
安定したルーティングにはchat_guid の使用を推奨します。
chat_guid:iMessage;-;+15555550123(グループに推奨)chat_id:123chat_identifier:...- ダイレクトハンドル:
+15555550123,user@example.com- ダイレクトハンドルに既存の DM チャットがない場合、OpenClaw は
POST /api/v1/chat/newを使って新規作成します。この操作には BlueBubbles Private API を有効にしておく必要があります。
- ダイレクトハンドルに既存の DM チャットがない場合、OpenClaw は
セキュリティ
- webhook リクエストは、クエリパラメーターまたはヘッダーの
guid/passwordをchannels.bluebubbles.passwordと照合して認証します。localhostからのリクエストも受け入れられます。 - API パスワードと webhook エンドポイントは秘密として扱ってください。認証情報と同じ水準で保護する必要があります。
localhostを信頼する構成では、同一ホスト上のリバースプロキシが意図せずパスワードを回避してしまう可能性があります。ゲートウェイをプロキシ越しに公開する場合は、プロキシ側でも認証を必須にし、gateway.trustedProxiesを設定してください。詳細は ゲートウェイのセキュリティ を参照してください。- BlueBubbles サーバーを LAN の外部に公開する場合は、HTTPS + ファイアウォールルールを有効にしてください。
トラブルシューティング
- タイピングや既読イベントが止まった場合は、BlueBubbles の webhook ログを確認し、ゲートウェイのパスが
channels.bluebubbles.webhookPathと一致していることを確認してください。 - ペアリングコードの有効期限は 1 時間です。
openclaw pairing list bluebubblesとopenclaw pairing approve bluebubbles <code>を利用してください。 - リアクションには BlueBubbles Private API (
POST /api/v1/message/react) が必要です。利用中のサーバーバージョンで公開されているか確認してください。 - 編集/送信取り消しには、macOS 13+ および互換性のある BlueBubbles サーバーバージョンが必要です。macOS 26 (Tahoe) では、プライベート API の変更により、編集は現在壊れています。
- macOS 26 (Tahoe) ではグループアイコン更新も不安定で、API が成功を返しても新しいアイコンが同期されないことがあります。
- OpenClaw は BlueBubbles サーバーの macOS バージョンに基づいて、既知の不具合があるアクションを自動的に隠します。macOS 26 (Tahoe) で編集がまだ表示される場合は、
channels.bluebubbles.actions.edit=falseを設定して手動で無効化してください。 - ステータスやヘルス情報は
openclaw status --allまたはopenclaw status --deepで確認できます。