
imsg
CLIReads, watches and sends iMessage and SMS on macOS: reads the local Messages database directly, sends through Messages.app, and outputs NDJSON and JSON-RPC for agents. Needs macOS 14+ and Full Disk Access granted to your terminal.
imsg 💬 — Messages, piped.

imsg is a Swift CLI for reading, watching, and sending iMessage and SMS from macOS. It reads the local Messages database, sends through Messages.app automation, and exposes NDJSON and JSON-RPC for scripts and agents.
imsg chats --limit 10 --json | jq -s
imsg history --chat-id 42 --limit 20 --attachments --json | jq -s
imsg watch --chat-id 42 --reactions --json
imsg send --to "+14155551212" --text "on my way"
That's the whole pitch: read directly, stream updates, and ask Messages.app to send.
Install
Homebrew is the smallest path on macOS:
brew install steipete/tap/imsg
imsg --version
imsg requires macOS 14 or newer. Signed macOS builds and Linux x86_64 read-only builds are also available from GitHub Releases. Linux reads a chat.db copied from macOS; it does not connect to iMessage or send messages. See the Linux guide.
Quick start
Grant your terminal Full Disk Access in System Settings → Privacy & Security, then reopen it. imsg needs that permission to read ~/Library/Messages/chat.db.
# Find a chat and note its id.
imsg chats --limit 3
# Read its ten most recent messages.
imsg history --chat-id 42 --limit 10
Use an id from the first command in place of 42. The five-minute quickstart continues with live watching and sending.
Core workflows
| Goal | Start here |
|---|---|
| List chats and inspect their identifiers | Chats and groups |
| Read or search local history | History |
| Stream new messages and tapbacks | Watch |
| Send text, files, and standard tapbacks | Send and attachments |
| Count messages and media | Statistics |
| Consume stable NDJSON or a long-running stdio API | JSON schema and JSON-RPC |
| Generate shell completions or model-ready CLI help | Completions |
Read commands open the database in SQLite read-only mode. watch follows database and WAL filesystem events, with a polling fallback when macOS drops an event or rotates a sidecar file.
Permissions
Full Disk Access is required for local database reads. Sending and standard tapbacks also require Automation → Messages; Contacts access is optional and only adds resolved names. The permissions guide covers parent-process grants and stale TCC entries, while troubleshooting maps common failures to their likely gate.
SSH sessions can also resolve contact names through the Mac’s read-only AddressBook database when the SSH service has Full Disk Access and Contacts.framework is unavailable. See Contacts over SSH.
For SMS, enable Text Message Forwarding on the paired iPhone. imsg send uses Messages.app's AppleScript surface and cannot force a particular outgoing number when several numbers share one Apple ID.
JSON and automation
--json emits one JSON object per line. Human progress and warnings stay on stderr, so stdout remains safe to stream. Pipe finite commands through jq -s when you want one array.
Numeric selectors are validated before work starts: chat IDs, limits, and poll option indices must be positive integers; message-part indices can also be zero. Malformed or overflowing values produce an error instead of selecting a default target. Defaults apply only when an option is omitted.
imsg chats --json | jq -s
imsg rpc
imsg completions llm
The JSON schema documents chats, messages, attachments, reactions, polls, scheduled messages, and statistics. The JSON-RPC reference covers the long-running stdio transport used by agents and gateways.
Advanced IMCore
Normal chats, history, watch, send, react, and read-only RPC workflows do not use private frameworks or process injection.
Read receipts, typing indicators, rich sends, message mutation, stickers, polls, and chat management use an injected helper inside Messages.app. They require SIP to be disabled and may be blocked by library validation or private-entitlement checks on current macOS releases. Start with Advanced IMCore, then use the bridge command reference for the full CLI surface and IPC layout.
imsg chat-create accepts phone numbers and email addresses you have never contacted. It creates missing handles through the active iMessage account and checks every recipient with IDS before creating the chat. You do not need to type recipients into Messages first.
Documentation
The complete guide lives at imsg.sh. Useful entry points include install, permissions, history, watch, send, attachments, Linux, and troubleshooting.
Development
make lint
make test
make build
IMsgCore contains the reusable Swift core, imsg contains the CLI, and IMsgHelper contains the optional injected helper. The package uses Swift 6 and targets macOS 14 or newer.
CI pins Xcode 26.6 on macOS, Swift 6.4.0 on Linux, Node 26.12.0 for docs tests, and SwiftLint 0.65.1. make lint treats formatting and lint findings as errors. scripts/check-linux.sh runs Linux tests and builds in the pinned Swift container, checks the standalone release archive in Ubuntu without Swift, and runs docs tests with the host's Node installation. Crabbox hydration installs the pinned Node version.
License
MIT. See LICENSE. Not affiliated with Apple; iMessage and SMS are trademarks of their respective owners.
Ressources associées

OpenClaw
CLIOpen-source personal AI assistant that runs on your own machine and talks to you over 20+ chat channels such as Telegram, Slack and iMessage. The openclaw CLI manages the gateway, channel pairing and plugins; switch models between Claude, Codex and local ones.
openclaw/openclaw392k
lark-cli (Lark CLI)
CLIOfficial Lark (Feishu) CLI with 200+ commands for messages, docs, Base, Sheets, calendar, mail, approvals, OKRs, meetings and Minutes, plus 20+ bundled lark-* agent skills and structured output. Create a Lark app and sign in first.
larksuite/cli17.7k
Basecamp CLI
CLIBasecamp's official CLI: manage projects, to-dos, card tables, messages and files, post to project chat and search across projects, with JSON output with next-step hints, plus a bundled agent skill and Claude Code and Codex plugins. Needs a Basecamp account; the installer handles browser auth.
basecamp/basecamp-cli290
persona-exec-assistant
SkillExecutive assistant persona skill for the gws CLI: prepares daily briefings, meeting prep and weekly digests, triages the Gmail inbox, checks conflicts before scheduling and drafts replies. Needs gws authorized via your own Google Cloud project, plus the Gmail, Calendar, Drive and Chat skills.
googleworkspace/cli31.6k
Enterprise Search
PluginAnthropic's official knowledge work plugin: one question searches your connected chat, email, cloud docs, wiki and project tools at once and returns a sourced answer; can also produce daily or weekly digests. Preset MCP connectors for Slack, Notion, Atlassian, Asana and more, each needing auth.
anthropics/knowledge-work-plugins29.9k
Activepieces
MCPOpen-source Zapier alternative with a built-in MCP server: agents can build and test automations in plain language, manage tables, or call hundreds of apps like email, spreadsheets and chat. Use the cloud or self-host, enable the MCP server in settings and connect via OAuth.
activepieces/activepieces25.1k