OpenClawSkills
GitHub
Canales • 5 min de lectura

iMessage

Conecta a iMessage via imsg (JSON-RPC sobre stdio): instalación, configuración y enrutamiento chat_id.

Estado: Integración CLI externa. El gateway ejecutará imsg rpc (JSON-RPC sobre stdio).

Tutorial.step

Configuración Rápida

1. Asegúrate de que Messages esté iniciado sesión en este Mac.

2. Instala imsg:

- brew install steipete/tap/imsg

3. Configura channels.imessage.cliPath y channels.imessage.dbPath en OpenClaw.

4. Inicia gateway y aprueba los prompts de macOS (Automation + Full Disk Access).

Configuración mínima:

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

Qué Es

- Proporciona capacidades de canal iMessage via imsg en macOS.

- Enrutamiento determinista: las respuestas siempre retornan a iMessage.

- Los DMs se pliegan en la sesión principal del agente; los grupos están aislados como ''agent:'':imessage:group:''''.

- Si un hilo multi-participante aparece con is_group=false, aún puedes tratarlo como un hilo grupal por chat_id via channels.imessage.groups (ver "Hilos tipo grupo" abajo).

Tutorial.step

Escrituras de Config

Por defecto, permite que iMessage escriba actualizaciones activadas por /config set|unset de vuelta al archivo de configuración (requiere commands.config: true).

Deshabilitar:

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

Dependencias

- macOS con Messages iniciado sesión.

- Otorga Full Disk Access a OpenClaw y imsg (para leer Messages DB).

- Prompt de permiso de Automation requerido al enviar mensajes.

- channels.imessage.cliPath puede apuntar a cualquier "comando proxy stdin/stdout" (ej., script wrapper: ejecuta imsg rpc via SSH en otro Mac).

Tutorial.step

Configuración (Ruta Rápida)

1. Asegúrate de que Messages esté iniciado sesión.

2. Configura iMessage e inicia gateway.

#

Tutorial.step

Usar Usuario macOS de Bot Separado (Aislamiento de Identidad)

Si quieres que el bot envíe con una identidad de iMessage separada (y mantener tu Messages personal limpio), puedes usar un Apple ID separado + usuario macOS separado:

1. Crea un Apple ID separado (ej., [email protected]).

- Apple puede requerir un número de teléfono para verificación/2FA.

2. Crea un usuario macOS (ej., openclawhome) e inicia sesión como ese usuario.

3. Abre Messages bajo ese usuario e inicia sesión en iMessage con el Apple ID del bot.

4. Habilita Remote Login (System Settings → General → Sharing → Remote Login).

5. Instala imsg:

- brew install steipete/tap/imsg

6. Configura SSH para que ''ssh ''@localhost true'' funcione sin contraseña.

7. Apunta channels.imessage.accounts.bot.cliPath a un wrapper SSH que ejecute imsg bajo la identidad del usuario bot.

Consejo de primera ejecución: Enviar/recibir puede requerir aprobar permisos GUI (Automation + Full Disk Access) bajo el usuario bot. Si imsg rpc parece atascado o sale inmediatamente, cambia a ese usuario (puedes usar screen sharing), ejecuta imsg chats --limit 1 / imsg send ... una vez, aprueba los prompts, luego reintenta.

Ejemplo de wrapper (recuerda ''chmod +x'', y reemplaza '''''' con tu nombre de usuario):

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


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

Ejemplo de configuración:

Json5
{
  channels: {
    imessage: {
      enabled: true,
      accounts: {
        bot: {
          name: "Bot",
          enabled: true,
          cliPath: "/ruta/a/imsg-bot",
          dbPath: "/Users/<usuario-mac-bot>/Library/Messages/chat.db",
        },
      },
    },
  },
}

El escenario de cuenta única puede usar campos aplanados (channels.imessage.cliPath, channels.imessage.dbPath), no necesitas escribir accounts.

#

Tutorial.step

Solución Remota/SSH (Opcional)

Si quieres poner iMessage en otro Mac, deja que channels.imessage.cliPath apunte a un wrapper que ejecuta imsg remotamente via SSH. OpenClaw solo necesita stdio.

Ejemplo de wrapper:

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

Adjuntos remotos: Cuando cliPath apunta a un host remoto, las rutas de adjuntos en la base de datos Messages son rutas locales en la máquina remota. Puedes configurar channels.imessage.remoteHost para dejar que OpenClaw obtenga adjuntos automáticamente via SCP:

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

Si remoteHost no está configurado, OpenClaw intentará inferir del comando SSH en tu script wrapper, pero la configuración explícita es recomendada para confiabilidad.

##

Tutorial.step

Conexión Tailscale a Mac Remoto (Ejemplo)

Si el gateway corre en un host/VM Linux pero iMessage debe correr en Mac, Tailscale es el puente más simple: gateway conecta a Mac via tailnet, ejecuta imsg via SSH, y obtiene adjuntos via SCP.

Arquitectura:

Terminal
┌──────────────────────────────┐          SSH (imsg rpc)          ┌──────────────────────────┐
│ Host gateway (Linux/VM)      │──────────────────────────────────▶│ Mac con Messages + imsg │
│ - openclaw gateway           │          SCP (adjuntos)           │ - Messages iniciado     │
│ - channels.imessage.cliPath  │◀──────────────────────────────────│ - Remote Login habilitado│
└──────────────────────────────┘                                   └──────────────────────────┘
              ▲
              │ Tailscale tailnet (hostname o 100.x.y.z)
              ▼
        usuario@gateway-host

Ejemplo de configuración (usando hostname de Tailscale):

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

Ejemplo de wrapper (~/.openclaw/scripts/imsg-ssh):

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

Notas:

- Asegúrate de que Mac esté iniciado en Messages y Remote Login habilitado.

- Usa clave SSH para asegurar que ssh [email protected] funcione sin prompts.

- remoteHost debe coincidir con el objetivo SSH para que SCP obtenga adjuntos.

Multi-cuenta: Usa ''channels.imessage.accounts'' para configurar por cuenta (opcional ''name''). Ver estructura compartida en ''/gateway/configuration''. No comitas ''~/.openclaw/openclaw.json'' (usualmente contiene tokens).

Tutorial.step

Control de Acceso (DM + Grupos)

DMs:

- Por defecto: channels.imessage.dmPolicy = "pairing".

- Los remitentes desconocidos reciben un código de emparejamiento; los mensajes no se procesan antes de la aprobación (expira en 1 hora).

- Aprobar:

- openclaw pairing list imessage

- ''openclaw pairing approve imessage ''''

- El emparejamiento es el intercambio de token predeterminado para DMs de iMessage. Ver ''Emparejamiento''.

Grupos:

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

- Cuando es allowlist, channels.imessage.groupAllowFrom controla qué remitentes pueden activar.

- iMessage no tiene metadatos de mención nativos, así que el bloqueo de mención depende de agents.list[].groupChat.mentionPatterns (o messages.groupChat.mentionPatterns).

- Con múltiples agentes, puedes sobrescribir por agente en agents.list[].groupChat.mentionPatterns.

Tutorial.step

Cómo Funciona (Comportamiento)

- imsg transmite eventos de mensaje; el gateway los normaliza a un sobre de canal común.

- Las respuestas siempre retornan al mismo chat id o handle.

Tutorial.step

Hilos tipo Grupo (`is_group=false`)

Algunos hilos de iMessage pueden tener múltiples participantes pero aún aparecer con is_group=false (dependiendo de cómo Messages almacena identificadores de chat).

Si configuras explícitamente un chat_id en channels.imessage.groups, OpenClaw tratará ese hilo como un "grupo" (aplicando aislamiento de sesión y políticas de grupo).