imsg

Use a CLI do OpenClaw agents para agir via iMessage/SMS: DMs, grupos, respostas, reações, enquetes, monitoramento e ações de API privada no macOS.

O que é imsg?

A skill imsg permite que agentes OpenClaw controlem o aplicativo Mensagens do macOS (iMessage e SMS) por meio de uma interface de linha de comando. Ela suporta inspeção de histórico, envio de mensagens e arquivos, respostas encadeadas, reações (tapbacks), enquetes nativas do Apple Messages e criação/alteração de grupos. A habilidade prioriza comandos públicos de automação sempre que possível, mas oferece uma ponte para API privada para funcionalidades mais avançadas, como respostas ricas, edição de mensagens, indicadores de digitação e exclusão de grupos. É essencial para agentes que precisam interagir com contatos do usuário fora de conversas de agente, como em fluxos de trabalho de assistente pessoal ou automação de comunicação em grupo. O host deve ser macOS 14+ com o Mensagens conectado; usuários Linux podem apenas ler bancos de dados copiados. A skill impõe regras de segurança rigorosas, exigindo confirmação explícita antes de enviar mensagens ou alterar o estado visível.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/skills/imsg

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que imsg faz?

Use imsg quando um agente OpenClaw precisar agir por meio da conta do aplicativo Mensagens do macOS local: inspecione o histórico de iMessage/SMS, escolha o DM ou grupo correto, envie mensagens/arquivos, responda, reaja, vote em enquetes ou use recursos de iMessage de API privada.

Não use esta skill para Telegram, Signal, WhatsApp, Discord, Slack ou para responder dentro da conversa atual do OpenClaw quando o canal configurado já roteia a resposta.

Fluxo do Agente

  1. Primeiro, resolva a conversa.
  2. Escolha DM, grupo existente ou novo grupo.
  3. Escolha o comando de menor capacidade que possa realizar a ação solicitada.
  4. Confirme qualquer envio ou alteração de estado visível, a menos que o usuário já tenha fornecido destinatário, conteúdo e ação exatos.
  5. Execute com identificadores estáveis: prefira --chat-id para envios/monitoramento/histórico normais e --chat GUID do chat para ações de ponte.

Nunca inferir um destinatário a partir de um nome casual sozinho quando vários chats ou handles podem corresponder. Mostre o nome de exibição correspondente, handle(s), participantes do grupo e texto/ação da mensagem antes de enviar.

Requisitos do Host

  • macOS 14+ com o aplicativo Mensagens conectado para ações de envio/reação/ponte.
  • Acesso total ao disco para o contexto de processo que executa imsg ou OpenClaw; leituras falham sem acesso ao banco de dados do Mensagens.
  • Permissão de automação para o aplicativo Mensagens ao usar send público.
  • Permissão de acessibilidade para o contexto de processo que executa imsg react público; ele usa automação de interface do System Events. O tapback da ponte usa API privada em vez disso.
  • Permissão de contatos opcional para resolução de nomes de contato.
  • Envios de SMS exigem Encaminhamento de Mensagens de Texto do iPhone do usuário para este Mac.
  • Linux lê apenas um chat.db copiado; não pode enviar, reagir, iniciar o aplicativo Mensagens, marcar como lido ou digitar.

Resolver Destinos

Use leituras --json. A saída é JSON delimitado por nova linha; use jq -s quando jq estiver disponível, ou consuma um objeto por linha diretamente.

imsg chats --limit 25 --json | jq -s
imsg search --query "jantar" --match contains --json | jq -s
imsg history --chat-id 42 --limit 20 --attachments --json | jq -s
imsg group --chat-id 42 --json

Regras de destino:

  • DM para telefone/email: use imsg send --to quando o usuário forneceu um handle exato, ou após uma correspondência de chat única e inequívoca.
  • Thread de DM existente: imsg send --chat-id <id> é mais seguro do que resolver um nome novamente.
  • Grupo existente: inspecione com imsg group --chat-id <id> --json; envie com --chat-id, use a ponte com o GUID do chat de group.
  • Novo grupo: use chat-create apenas quando o usuário explicitamente pediu para criar um grupo ou nenhum grupo existente corresponde.
  • Nomes de grupo ambíguos: confirme participantes, não apenas o nome de exibição.
  • SMS: use --service sms apenas quando solicitado ou quando o fallback do iMessage não é desejado. O relé SMS exige Encaminhamento de Mensagens de Texto.

Não faça do jq um pré-requisito obrigatório para a skill; é apenas um formatador conveniente para exemplos.

Escolha de Capacidade

Use automação pública do Mensagens quando suficiente:

  • Ler/listar/pesquisar/monitorar: chats, group, history, search, watch
  • Envio básico de texto/arquivo: send
  • Tapback padrão para a mensagem recebida mais recente em um chat: react

Use a ponte de API privada apenas para recursos que a automação pública não pode realizar:

  • Respostas ricas, formatação de texto, efeitos, assuntos, envios em várias partes
  • Enquetes nativas do Apple Messages e votos em enquetes
  • Tapback por GUID de mensagem ou remoção de tapback
  • Editar, desenviar, excluir, notificar mesmo assim
  • Recibos de leitura, indicadores de digitação, monitoramento de eventos de ponte
  • Criar/nomear/foto/membro/sair/excluir/marcar ações de grupo
  • Verificação de conta, whois, apelidos

Antes de ações de ponte, verifique:

imsg status --json

Se o host suporta ações de ponte, mas o Mensagens ainda não foi injetado, pergunte antes de executar imsg launch. Ele mata e reinicia o aplicativo Mensagens para injetar a ponte, então trate isso como uma alteração de estado visível:

imsg launch
imsg status --json

Se SIP, validação de biblioteca, verificações de entitlement privado ou seletores ausentes ainda bloquearem a capacidade, não peça ao usuário para desabilitar o SIP casualmente. Explique que a ação de API privada solicitada não está disponível neste host e ofereça a ação não-ponte mais próxima, se existir.

Cenários de DM

Handle exato, envio básico:

imsg send --to "+14155551212" --text "A caminho" --service auto

Thread de DM conhecida:

imsg send --chat-id 42 --text "A caminho"
imsg send --chat-id 42 --file /caminho/para/foto.jpg

Force canal apenas quando o usuário pedir:

imsg send --to "+14155551212" --text "bolha verde" --service sms
imsg send --to "+14155551212" --text "apenas iMessage" --service imessage --no-sms-fallback

Resposta encadeada, formatação, efeitos ou resposta com anexo:

imsg send-rich --chat 'iMessage;-;+15551234567' \
  --reply-to <message-guid> --text "texto de resposta"
imsg send-rich --chat 'iMessage;-;+15551234567' --text 'olá mundo' \
  --format '[{"start":0,"length":5,"styles":["bold"]}]'
imsg send-rich --chat 'iMessage;-;+15551234567' --text "boom" --effect impact
imsg send-attachment --chat 'iMessage;-;+15551234567' \
  --reply-to <message-guid> --file /caminho/para/arquivo.jpg

As faixas de formatação são posições UTF-16. Os estilos suportados incluem bold, italic, underline e strikethrough; use --format-file para JSON gerado.

Cenários de Grupo

Inspecione antes de agir:

imsg group --chat-id 42 --json
imsg history --chat-id 42 --limit 20 --json | jq -s

Enviar para um grupo existente:

imsg send --chat-id 42 --text "Funciona para mim"

Resposta de ponte ou enquete em um grupo existente:

imsg send-rich --chat 'iMessage;+;chat0000' \
  --reply-to <message-guid> --text "respondendo na thread"
imsg poll send --chat 'iMessage;+;chat0000' \
  --question "Jantar?" --option "Pizza" --option "Sushi"

Criar ou alterar grupos apenas mediante solicitação explícita:

imsg chat-create --addresses '+15551111111,+15552222222' --name 'Equipe' --text 'bom dia'
imsg chat-name --chat 'iMessage;+;chat0000' --name 'Renomeado'
imsg chat-photo --chat 'iMessage;+;chat0000' --file /caminho/para/grupo.jpg
imsg chat-add-member --chat 'iMessage;+;chat0000' --address +15553333333
imsg chat-remove-member --chat 'iMessage;+;chat0000' --address +15553333333
imsg chat-leave --chat 'iMessage;+;chat0000'
imsg chat-delete --chat 'iMessage;+;chat0000'
imsg chat-mark --chat 'iMessage;+;chat0000' --read

Mutações de grupo são altamente visíveis. Confirme o grupo exato e a lista de participantes antes de alterar associação, nome, foto, estado de leitura, sair ou excluir.

Reações e Respostas

O react público é limitado: reage apenas à mensagem recebida mais recente no chat.

imsg react --chat-id 42 --reaction like
imsg react --chat-id 42 --reaction love
imsg react --chat-id 42 --reaction dislike
imsg react --chat-id 42 --reaction laugh
imsg react --chat-id 42 --reaction emphasis
imsg react --chat-id 42 --reaction question

Para um GUID de mensagem específico ou remoção, use tapback da ponte:

imsg tapback --chat 'iMessage;-;+15551234567' --message <message-guid> --kind love
imsg tapback --chat 'iMessage;-;+15551234567' --message <message-guid> --kind love --remove

Use send-rich --reply-to <message-guid> para respostas encadeadas. Confirme a mensagem referenciada se o usuário disser "aquela" ou "a anterior".

Enquetes

As enquetes nativas do Apple Messages exigem a ponte. A criação precisa de pelo menos dois valores --option. A votação requer um de --option-id, --option-index ou --option.

O Mensagens renderiza apenas as opções em um balão de enquete; o título --question não é mostrado aos destinatários. Defina --question (obrigatório) mais pelo menos dois valores --option.

imsg poll send --chat 'iMessage;-;+15551234567' \
  --question "Jantar?" --option "Pizza" --option "Sushi"
imsg poll send --chat 'iMessage;+;chat0000' --reply-to <message-guid> \
  --question "Aprovar?" --option "Sim" --option "Não"
imsg poll vote --chat 'iMessage;+;chat0000' \
  --poll <poll-message-guid> --option-id <option-id>

Encontre IDs e opções de enquete com:

imsg history --chat-id 42 --limit 20 --json | jq -s '.[] | select(.poll != null) | {guid, poll}'

As linhas de voto em enquete são eventos poll, não tapbacks; watch --reactions não é necessário para vê-los.

Monitoramento e Agentes de Longa Duração

Para uma espera única curta, use watch:

imsg watch --chat-id 42 --since-rowid 9000 --json
imsg watch --chat-id 42 --attachments --convert-attachments --json
imsg watch --chat-id 42 --reactions --json
imsg watch --chat-id 42 --bb-events --json

--since-rowid é exclusivo. Sem ele, watch começa na linha mais recente. watch usa eventos do sistema de arquivos mais um fallback de polling de baixa frequência, então pode recuperar após eventos sidecar do SQLite perdidos. Objetos de polling aparecem sem --reactions.

Para um daemon ou integração multi-chat, use imsg rpc. Ele fala JSON-RPC 2.0 sobre stdin/stdout. Inspecione imsg status --json para rpc_methods antes de usar métodos de ponte ou enquete mais recentes.

Regras de Segurança

  • Confirme destinatário, chat e conteúdo antes de cada envio, a menos que a solicitação do usuário já contenha valores exatos.
  • Confirme alterações de estado visíveis: recibos de leitura, indicadores de digitação, edições, desenvios, exclusões, votos em enquetes, tapbacks, associação de grupo, nome/foto do grupo, sair/excluir chats.
  • Nunca envie para números desconhecidos ou correspondências de nome de contato ambíguas sem aprovação.
  • Confirme que os anexos existem e são os arquivos pretendidos.
  • Prefira números de telefone no formato E.164; use --region US ou outra região apenas quando necessário para formatos locais.
  • Não use ações de ponte só porque estão disponíveis; use-as apenas quando o comportamento solicitado precisar delas.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills when explicitly requested; install, verify, update, uninstall, publish, or sync skills.

Habilidades Relacionadas