OpenClawSkills
GitHub
チャンネル • 5分で読める

iMessage

imsg(stdio 上の JSON-RPC)で iMessage を接続:導入、設定、chat_id ルーティング。

ステータス:外部 CLI 統合。Gateway は imsg rpc(stdio 上の JSON-RPC)を起動します。

Tutorial.step

クイックセットアップ

1. この Mac の Messages にログインしていることを確認します。

2. imsg をインストールします:

- brew install steipete/tap/imsg

3. OpenClaw で channels.imessage.cliPath と channels.imessage.dbPath を設定します。

4. gateway を起動し、macOS のプロンプト(Automation + Full Disk Access)を承認します。

Minimal configuration:

Json5
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "/usr/local/bin/imsg",
      dbPath: "/Users/<you>/Library/Messages/chat.db",
    },
  },
}
Tutorial.step

What It Is

- macOS 上の imsg を介して iMessage チャンネル機能を提供します。

- 決定論的ルーティング:返信は常に iMessage に戻ります。

- DM はエージェントのメインセッションに折りたたまれます;グループは ''agent:'':imessage:group:'''' として分離されます。

- 複数参加者のスレッドが is_group=false の形式で表示される場合でも、channels.imessage.groups を介して channels.imessage.groups でグループスレッドとして扱うことができます(以下の「グループのようなスレッド」を参照)。

Tutorial.step

設定の書き込み(Config writes)

デフォルトでは、/config set|unset によってトリガーされた更新を設定ファイルに書き戻すことを iMessage に許可します(commands.config: true が必要)。

Disable:

Json5
{
  channels: { imessage: { configWrites: false } },
}
Tutorial.step

Dependencies

- macOS で Messages にログインしていること。

- OpenClaw と imsg に Full Disk Access を付与する(Messages DB を読み取るため)。

- メッセージ送信時に Automation 権限のプロンプトが必要です。

- channels.imessage.cliPath は任意の「stdin/stdout プロキシコマンド」を指すことができます(例:wrapper スクリプト:別の Mac で SSH を介して imsg rpc を実行)。

Tutorial.step

セットアップ(高速パス)

1. Messages にログインしていることを確認します。

2. iMessage を設定し、gateway を起動します。

#

Tutorial.step

別の bot macOS ユーザーを使用する(アイデンティティの分離)

bot が 別の iMessage アイデンティティ で送信したい場合(個人用の Messages をクリーンに保つため)、別の Apple ID + 別の macOS ユーザーを使用できます:

1. 別の Apple ID を作成します(例:[email protected])。

- Apple は検証/2FA のために電話番号を要求する場合があります。

2. macOS ユーザーを作成します(例:openclawhome)し、そのユーザーとしてログインします。

3. そのユーザーで Messages を開き、bot Apple ID で iMessage にログインします。

4. Remote Login を有効にします(System Settings → General → Sharing → Remote Login)。

5. imsg をインストールします:

- brew install steipete/tap/imsg

6. ''ssh ''@localhost true'' がパスワードなしで成功するように SSH を設定します。

7. channels.imessage.accounts.bot.cliPath を SSH wrapper に向け、bot ユーザー ID で imsg を実行します。

初回実行のヒント:送信/受信には bot ユーザー で GUI 権限(Automation + Full Disk Access)を承認する必要がある場合があります。imsg rpc がスタックしているかすぐに終了する場合、そのユーザーに切り替え(画面共有を使用できます)、imsg chats --limit 1 / imsg send ... を一度実行し、プロンプトを承認してから再試してください。

wrapper の例(''chmod +x'' を忘れずに、'''''' をユーザー名に置き換えてください):

Bash
#!/usr/bin/env bash
set -euo pipefail


exec /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=5 -T '<bot-macos-user>'@localhost \
  "/usr/local/bin/imsg" "$@"

設定の例:

Json5
{
  channels: {
    imessage: {
      enabled: true,
      accounts: {
        bot: {
          name: "Bot",
          enabled: true,
          cliPath: "/path/to/imsg-bot",
          dbPath: "/Users/<bot-macos-user>/Library/Messages/chat.db",
        },
      },
    },
  },
}

単一アカウントシナリオではフラット化されたフィールド(channels.imessage.cliPath、channels.imessage.dbPath)を使用でき、accounts を書く必要はありません。

#

Tutorial.step

リモート/SSH ソリューション(オプション)

iMessage を別の Mac に配置したい場合、channels.imessage.cliPath を SSH を介してリモートで imsg を実行する wrapper に向けます。OpenClaw は stdio のみが必要です。

wrapper の例:

Bash
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

リモート添付ファイル: cliPath がリモートホストを指す場合、Messages データベース内の添付ファイルパスはリモートマシン上のローカルパスです。channels.imessage.remoteHost を設定すると、OpenClaw が SCP を介して添付ファイルを自動的に取得できます:

Json5
{
  channels: {
    imessage: {
      cliPath: "~/imsg-ssh",
      remoteHost: "user@gateway-host",
      includeAttachments: true,
    },
  },
}

remoteHost を設定しない場合、OpenClaw は wrapper スクリプト内の SSH コマンドから推測を試みますが、信頼性のために明示的な設定が推奨されます。

##

Tutorial.step

Tailscale でリモート Mac に接続する(例)

gateway が Linux ホスト/VM で実行されているが、iMessage は Mac で実行する必要がある場合、Tailscale が最も単純なブリッジです:gateway は tailnet を介して Mac に接続し、SSH を介して imsg を実行し、SCP を介して添付ファイルを取得します。

アーキテクチャ:

Terminal
┌──────────────────────────────┐          SSH (imsg rpc)          ┌──────────────────────────┐
│ Gateway host (Linux/VM)      │──────────────────────────────────▶│ Mac with Messages + imsg │
│ - openclaw gateway           │          SCP (attachments)        │ - Messages signed in     │
│ - channels.imessage.cliPath  │◀──────────────────────────────────│ - Remote Login enabled   │
└──────────────────────────────┘                                   └──────────────────────────┘
              ▲
              │ Tailscale tailnet (hostname or 100.x.y.z)
              ▼
        user@gateway-host

設定の例(Tailscale hostname を使用):

Json5
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "~/.openclaw/scripts/imsg-ssh",
      remoteHost: "[email protected]",
      includeAttachments: true,
      dbPath: "/Users/bot/Library/Messages/chat.db",
    },
  },
}

wrapper の例(~/.openclaw/scripts/imsg-ssh):

Bash
#!/usr/bin/env bash
exec ssh -T [email protected] imsg "$@"

Notes:

- Mac が Messages にログインしており、Remote Login が有効になっていることを確認してください。

- SSH キーを使用して ssh [email protected] がプロンプトなしで動作することを確認してください。

- remoteHost は SCP で添付ファイルを取得するための SSH ターゲットと一致している必要があります。

複数アカウント:''channels.imessage.accounts'' を使用してアカウントごとに設定します(オプションの ''name'')。共有構造については ''/gateway/configuration'' を参照してください。''~/.openclaw/openclaw.json'' をコミットしないでください(通常、トークンが含まれています)。

Tutorial.step

アクセス制御(DM + グループ)

DM:

- デフォルト:channels.imessage.dmPolicy = "pairing"。

- 不明な送信者はペアリングコードを受け取ります;承認前はメッセージが処理されません(1時間の有効期限)。

- Approve:

- openclaw pairing list imessage

- ''openclaw pairing approve imessage ''''

- ペアリングは iMessage DM のデフォルトのトークン交換です。''Pairing'' を参照してください。

グループ:

- channels.imessage.groupPolicy = open | allowlist | disabled。

- allowlist の場合、channels.imessage.groupAllowFrom がどの送信者がトリガーできるかを制御します。

- iMessage にはネイティブの mention メタデータがないため、mention ゲートは agents.list[].groupChat.mentionPatterns(または messages.groupChat.mentionPatterns)に依存します。

- 複数のエージェントの場合、agents.list[].groupChat.mentionPatterns でエージェントごとのオーバーライドが可能です。

Tutorial.step

How It Works (Behavior)

- imsg はメッセージイベントをストリーミングします;gateway はそれらを共通のチャンネルエンベロープに正規化します。

- 返信は常に同じ chat ID またはハンドルに戻ります。

Tutorial.step

グループのようなスレッド(`is_group=false`)

一部の iMessage スレッドには複数の参加者がいる場合でも、is_group=false の形式で表示される場合があります(Messages がチャット識別子を保存する方法に依存)。

channels.imessage.groups で特定の channels.imessage.groups を明示的に設定すると、OpenClaw はそのスレッドを「グループ」として扱います(セッション分離とグループポリシーが適用されます)。