Connect a personal/Business WhatsApp account via QR pairing (multi-device, like WhatsApp Web). Send
Connect it
Settings → Connectors → Add custom connector
URL: https://api.mcp.ai/p_whatsappSettings → Apps & Connectors → Advanced → Developer mode
Create connector with URL: https://api.mcp.ai/p_whatsapp{
"mcpServers": {
"whatsapp-mcp": {
"url": "https://api.mcp.ai/p_whatsapp"
}
}
}claude mcp add --transport http whatsapp-mcp https://api.mcp.ai/p_whatsapp{
"servers": {
"whatsapp-mcp": {
"type": "http",
"url": "https://api.mcp.ai/p_whatsapp"
}
}
}47 tools, verified live
whatsapp_list_accountsread-onlyList WhatsApp accounts paired to this install â wa_jid, phone, label, proxy on/off, status.
whatsapp_syncread-onlyRefresh this account's local data from WhatsApp â pulls recent messages and refreshes the groups/contacts lists into the local store. Call it BEFORE reading (chats/groups/messages/contacts/search) when results look stale or empty (e.g. right after connecting, or an account that hasn't synced recently). Connects live, so it may take ~20â60s. Returns { messages_stored }.
whatsapp_send_textSend a WhatsApp message (text or media). Actions: - text: { to, text, reply_to? } - media: { to, type ('image'|'video'|'audio'|'document'|'sticker'), media_url | media_base64, caption?, filename?, mimetype? } `to` accepts either a JID ('5511999999999@s.whatsapp.net', '<id>@g.us') or a plain phone (digits, country code included). For groups always use the '<id>@g.us' JID â get it fro
whatsapp_send_mediaSend a WhatsApp message (text or media). Actions: - text: { to, text, reply_to? } - media: { to, type ('image'|'video'|'audio'|'document'|'sticker'), media_url | media_base64, caption?, filename?, mimetype? } `to` accepts either a JID ('5511999999999@s.whatsapp.net', '<id>@g.us') or a plain phone (digits, country code included). For groups always use the '<id>@g.us' JID â get it fro
whatsapp_chatsread-onlyList WhatsApp chats (individual + group). Sorted by most recent activity.
whatsapp_messagesread-onlyList messages in a chat from LOCAL history. Requires chat_jid (from whatsapp_chats). Paginate backwards by passing the oldest message's timestamp as `before` (ISO 8601); `after` pages forward; `order` sorts. NOTE: only messages already synced locally are returned â to see how far back the archive goes use whatsapp_history_coverage, and to pull OLDER messages from your phone use whatsapp_history_
whatsapp_messages_writeMark messages as read in a chat. Requires chat_jid. Optional message_id (marks up to this message; omit to mark all unread). Bulk support: accepts message_ids for batched execution.
whatsapp_contacts_listread-onlyRead WhatsApp contacts. Actions: - list: search across contacts (query optional â substring on name/phone). Default limit 50. - get: full contact info by JID. [Flattened action: list]
whatsapp_contacts_getread-onlyRead WhatsApp contacts. Actions: - list: search across contacts (query optional â substring on name/phone). Default limit 50. - get: full contact info by JID. [Flattened action: get]
whatsapp_groupsread-onlyList WhatsApp groups the account belongs to â subject, jid, participants count, owner.
whatsapp_group_membersread-onlyList the members of a WhatsApp group (live). Returns each participant's JID, phone, and admin/super-admin flag. Requires group_jid (â¦@g.us, from whatsapp_groups).
whatsapp_group_participants_addManage participants of a WhatsApp group (the connected account must be a group admin). action: 'remove' kicks members, 'promote' makes them admin, 'demote' removes admin, 'add' invites. Pass 1â50 phone numbers (+E164) or JIDs in `users`. [Flattened action: add]
whatsapp_group_participants_removeManage participants of a WhatsApp group (the connected account must be a group admin). action: 'remove' kicks members, 'promote' makes them admin, 'demote' removes admin, 'add' invites. Pass 1â50 phone numbers (+E164) or JIDs in `users`. [Flattened action: remove]
whatsapp_group_participants_promoteManage participants of a WhatsApp group (the connected account must be a group admin). action: 'remove' kicks members, 'promote' makes them admin, 'demote' removes admin, 'add' invites. Pass 1â50 phone numbers (+E164) or JIDs in `users`. [Flattened action: promote]
whatsapp_group_participants_demoteManage participants of a WhatsApp group (the connected account must be a group admin). action: 'remove' kicks members, 'promote' makes them admin, 'demote' removes admin, 'add' invites. Pass 1â50 phone numbers (+E164) or JIDs in `users`. [Flattened action: demote]
whatsapp_reactReact to a message with an emoji (or remove your reaction by passing an empty emoji). Requires chat_jid + message_id. Bulk support: accepts message_ids for batched execution.
whatsapp_poll_createSend a poll or vote on one. Actions: - create: { to, name, options[] (2â12), selectable_count? } - vote: { chat_jid, message_id, options[] (the option texts to select) } [Flattened action: create] Bulk support: accepts message_ids for batched execution.
whatsapp_poll_voteSend a poll or vote on one. Actions: - create: { to, name, options[] (2â12), selectable_count? } - vote: { chat_jid, message_id, options[] (the option texts to select) } [Flattened action: vote] Bulk support: accepts message_ids for batched execution.
whatsapp_message_deleteManage a message you can act on. Actions: - delete: { chat_jid, message_id, for_everyone? (default true) } â delete for everyone (your msg) or just for you - forward: { chat_jid, message_id, to } â forward a stored message to another chat - edit: { chat_jid, message_id, text } â edit one of your recent text messages [Flattened action: delete] Bulk support: accepts message_ids for batch
whatsapp_message_forwardManage a message you can act on. Actions: - delete: { chat_jid, message_id, for_everyone? (default true) } â delete for everyone (your msg) or just for you - forward: { chat_jid, message_id, to } â forward a stored message to another chat - edit: { chat_jid, message_id, text } â edit one of your recent text messages [Flattened action: forward] Bulk support: accepts message_ids for batc
whatsapp_message_editManage a message you can act on. Actions: - delete: { chat_jid, message_id, for_everyone? (default true) } â delete for everyone (your msg) or just for you - forward: { chat_jid, message_id, to } â forward a stored message to another chat - edit: { chat_jid, message_id, text } â edit one of your recent text messages [Flattened action: edit] Bulk support: accepts message_ids for batched
whatsapp_chat_metadataread-onlyGet metadata for a single chat (subject/name, archived/pinned/muted state, unread count, timestamps). Requires chat_jid.
whatsapp_chat_archiveChange a chat's state. action: archive/unarchive, pin/unpin, mute/unmute. Requires chat_jid. [Flattened action: archive]
whatsapp_chat_unarchiveChange a chat's state. action: archive/unarchive, pin/unpin, mute/unmute. Requires chat_jid. [Flattened action: unarchive]
whatsapp_chat_pinChange a chat's state. action: archive/unarchive, pin/unpin, mute/unmute. Requires chat_jid. [Flattened action: pin]
whatsapp_chat_unpinChange a chat's state. action: archive/unarchive, pin/unpin, mute/unmute. Requires chat_jid. [Flattened action: unpin]
whatsapp_chat_muteChange a chat's state. action: archive/unarchive, pin/unpin, mute/unmute. Requires chat_jid. [Flattened action: mute]
whatsapp_chat_unmuteChange a chat's state. action: archive/unarchive, pin/unpin, mute/unmute. Requires chat_jid. [Flattened action: unmute]
whatsapp_group_manage_createGroup lifecycle/admin (the connected account must be a group admin for most actions). Actions: - create: { name, participants[] } - leave: { group_jid } - update: { group_jid, name?, description? } - invite_link: { group_jid, link_action: 'get'|'revoke' } - join: { invite } (invite code or full invite link) - requests: { group_jid, req_action: 'list'|'approve'|'reject',
whatsapp_group_manage_leaveGroup lifecycle/admin (the connected account must be a group admin for most actions). Actions: - create: { name, participants[] } - leave: { group_jid } - update: { group_jid, name?, description? } - invite_link: { group_jid, link_action: 'get'|'revoke' } - join: { invite } (invite code or full invite link) - requests: { group_jid, req_action: 'list'|'approve'|'reject',
whatsapp_group_manage_updateGroup lifecycle/admin (the connected account must be a group admin for most actions). Actions: - create: { name, participants[] } - leave: { group_jid } - update: { group_jid, name?, description? } - invite_link: { group_jid, link_action: 'get'|'revoke' } - join: { invite } (invite code or full invite link) - requests: { group_jid, req_action: 'list'|'approve'|'reject',
whatsapp_group_manage_invite_linkGroup lifecycle/admin (the connected account must be a group admin for most actions). Actions: - create: { name, participants[] } - leave: { group_jid } - update: { group_jid, name?, description? } - invite_link: { group_jid, link_action: 'get'|'revoke' } - join: { invite } (invite code or full invite link) - requests: { group_jid, req_action: 'list'|'approve'|'reject',
whatsapp_group_manage_joinGroup lifecycle/admin (the connected account must be a group admin for most actions). Actions: - create: { name, participants[] } - leave: { group_jid } - update: { group_jid, name?, description? } - invite_link: { group_jid, link_action: 'get'|'revoke' } - join: { invite } (invite code or full invite link) - requests: { group_jid, req_action: 'list'|'approve'|'reject',
whatsapp_group_manage_requestsGroup lifecycle/admin (the connected account must be a group admin for most actions). Actions: - create: { name, participants[] } - leave: { group_jid } - update: { group_jid, name?, description? } - invite_link: { group_jid, link_action: 'get'|'revoke' } - join: { invite } (invite code or full invite link) - requests: { group_jid, req_action: 'list'|'approve'|'reject',
whatsapp_searchread-onlyFull-text search across all stored messages (SQLite FTS5). Optional chat_jid to scope. Returns matches with context.
whatsapp_history_coverageread-onlyShow how far back the LOCAL message archive reaches per chat (oldest_ts, newest_ts, message_count, status). Use it to find pagination boundaries for whatsapp_messages and to decide whether to pull more with whatsapp_history_backfill. Optional query (filter by name/JID), kind, limit, or a single chat_jid.
whatsapp_history_backfillRequest OLDER messages for a chat from your phone (on-demand history sync), extending what whatsapp_messages can read. Returns { status, messages_added }: - "done"/"partial": it pulled messages_added new messages â read them via whatsapp_messages (paginate with `before`). "partial" means WhatsApp stopped early; wait and retry for more. - "cooldown": you requested this chat <60s ago (retry_after_
whatsapp_webhook_getread-onlyShow this WhatsApp install's outbound webhook: the current URL, the subscribed events (empty = all), include_result, and the catalog of subscribable events (available_events â e.g. whatsapp.message, whatsapp.reaction, and the whatsapp.* wildcard). Owner/admin only.
whatsapp_webhook_setSet (or remove) this WhatsApp install's outbound webhook. Owner/admin only. - To set: pass `url` (https only, not localhost). `events` is the list of subscribed events ("permissions") â e.g. ["whatsapp.message"], or ["whatsapp.*"] for every WhatsApp event, or [] / omit for ALL events. See available_events from whatsapp_webhook_get. `include_result` (default true) controls whether the tool result
whatsapp_config_getread-onlyShow this install's editable-after-connect settings per connected number â currently the proxy (proxy_url): whether it's set and a masked preview (the raw value is never returned). Owner/admin or the connection owner.
whatsapp_config_setChange an editable-after-connect setting on a connected number WITHOUT re-pairing. Today the only field is `proxy_url` â the SOCKS5/HTTPS proxy WhatsApp connects through (recommended to avoid IP bans). Owner/admin or the connection owner. - `account`: which number (id/wa_jid, phone, or label; omit if only one is connected). - `values`: e.g. { "proxy_url": "socks5://user:pass@host:port" }. An emp
show_versionread-onlyShow the current MCP platform and adapter versions.
report_bugReport a bug, missing feature, or send feedback. Include the conversation array with recent messages for reproduction.
connectread-onlyReturns connection status and URLs. When all providers are connected, returns authenticated:true and empty pending[]. When credentials are missing, returns connect_url for the toolkit and per-install URLs.
toolkit_inforead-onlyReturns the current toolkit state: installed MCPs, their connection status, the accounts connected to each one, and how many catalog tools each exposes.
marketplaceThe official mcp.ai marketplace â the in-platform catalog of every MCP/tool, AND the way to run them. Covers capability requests like "find an MCP that does X", "consulta um CPF", "is there a tool for Y". Core flow: action=search discovers MCPs by intent â describe returns one MCP's full profile (every tool with its id + params, pricing, auth) so you pick the right tool_id â invoke RUNS that
authenticateMCP.AI for IDE agents (Cursor, etc.): log in in the browser, copy the access token. Best: add it to this server's config as a header `Authorization: Bearer <token>` for a permanent, non-expiring connection. Or paste it here for a session-only login: call with { token: "<jwt>" } after the user pastes, or with no args to get the link.
Alternatives in Developer Tools
Compare →ZDZoom DocsOfficialA
Zoom Docs server for creating and retrieving Zoom documents and notes in Markdown.
ZWZoom WhiteboardOfficialA
Zoom Whiteboard server for creating boards and diagrams and locating existing boards.
ZWZoom WorkspaceOfficialA
Zoom workspace server for meetings, chat, docs, recordings, and AI-generated collaboration content.
KeployA
End-to-end API testing — generate and run tests from OpenAPI, curl, Postman, or real user traffic.
ShipStaticA
Deploy static websites, landing pages, and prototypes instantly from AI agents.
RNRelease Notes IndexA
Release notes and changelogs from across the web, indexed for agents. Also via CLI and REST API.