What's new
Multi-device support
Each install now identifies itself to WhatsApp with a unique linked-device name (default: WhatsAppMCP @ <hostname>, override via WHATSAPP_MCP_DEVICE_NAME). You can now keep the Mac DMG and the CLI/Pi daemon paired against the same WhatsApp account simultaneously — they show up as separate entries in WhatsApp → Settings → Linked Devices rather than booting each other out.
Group sender resolution (`@lid` → contact name)
Group messages from WhatsApp's newer privacy mode arrived as raw 228230418170085@lid IDs with no name attached. Now resolves to a human-readable sender_name field on every message:
- Schema:
contacts.lidcolumn + index; one-shot v1→v2 migration on first launch. - Capture:
mapContactreadscontact.lid+contact.jid;persistGroupsupserts every participant from group metadata;messages.upsertupserts the sender withmsg.pushName;chats.phoneNumberSharebridges `@lid`↔`@s.whatsapp.net` to copy address-book names across. - Backfill on startup: walks group chats and pulls metadata via Baileys so existing rows resolve too. Idempotent.
- Read path: every
get_chat_messages/search_messages/get_messageresponse now includessender_name— null only when the sender isn't in your address book and we haven't yet caught a live event carrying their pushName.
Installer hardening
postinstallskipselectron-builder install-app-depson Linux so headless Pi installs don't accidentally rebuildbetter-sqlite3against Electron's ABI. Override withWHATSAPP_MCP_FORCE_ELECTRON_REBUILD=1when developing the GUI on Linux.
Same caveats as v0.0.1/0.0.2
- macOS arm64, unsigned. First launch: right-click → Open to bypass Gatekeeper.
- Drag
WhatsAppMCP.appto /Applications, pair with your phone, click "Configurar Claude". - Local-only — no cloud, no telemetry, no third-party servers.