WhatsApp MCP server - Connect Claude to WhatsApp for reading and sending messages
# Add to your Claude Code skills
git clone https://github.com/verygoodplugins/whatsapp-mcpGuides for using mcp servers skills like whatsapp-mcp.
Last scanned: 7/26/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-07-26T06:35:31.470Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}whatsapp-mcp is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by verygoodplugins. WhatsApp MCP server - Connect Claude to WhatsApp for reading and sending messages. It has 132 GitHub stars.
Yes. whatsapp-mcp passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/verygoodplugins/whatsapp-mcp" and add it to your Claude Code skills directory (see the Installation section above).
whatsapp-mcp is primarily written in Go. It is open-source under verygoodplugins on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh whatsapp-mcp against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
A Model Context Protocol (MCP) server for WhatsApp, enabling Claude to read and send WhatsApp messages.
Originally created by Luke Harries. Maintained by Very Good Plugins.
sender_display format ("Name (phone)")Clone the repository
git clone https://github.com/verygoodplugins/whatsapp-mcp.git
cd whatsapp-mcp
Start the WhatsApp bridge
cd whatsapp-bridge
go run .
On first start, the bridge prints and stores a local REST API token at
whatsapp-bridge/store/.bridge-token. Scan the QR code with WhatsApp on
your phone to authenticate.
Configure Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"whatsapp": {
"command": "uv",
"args": [
"--directory",
"/path/to/whatsapp-mcp/whatsapp-mcp-server",
"run",
"main.py"
]
}
}
}
Replace /path/to/whatsapp-mcp with your actual path.
Restart Claude Desktop
Pull the latest changes, then refresh whichever components moved:
git pull
| You changed | What to do |
|---|---|
Bridge code (whatsapp-bridge/*.go) and you run go run . |
Nothing — go run recompiles each launch. Just restart the bridge. |
| Bridge code and you run a built binary | cd whatsapp-bridge && go build -o whatsapp-bridge && ./whatsapp-bridge |
MCP server (whatsapp-mcp-server/*.py, pyproject.toml, uv.lock) |
Restart Claude Desktop / Cursor — uv re-resolves from the lockfile on next launch. Force a sync with cd whatsapp-mcp-server && uv sync if needed. |
Updates do not require re-pairing or deleting whatsapp.db — your session and message history are preserved. Re-pairing is only needed when explicitly requesting full history (see Requesting full history).
For v0.2.1 and later, restart both the bridge and MCP server after updating
so the MCP server can read the bridge token. If the two components do not share
the same checkout, set the same WHATSAPP_BRIDGE_TOKEN value in both
environments.
Add to your Cursor MCP settings (~/.cursor/mcp.json):
{
"mcp": {
"servers": {
"whatsapp": {
"command": "uv",
"args": [
"--directory",
"/path/to/whatsapp-mcp/whatsapp-mcp-server",
"run",
"main.py"
]
}
}
}
}
Messages include sender_display showing "Name (phone)" format for easy identification by agents.
search_contactsSearch contacts by name or phone number.
Parameters:
query (required): Name or phone number to searchNatural Language Examples:
get_contactResolve a WhatsApp contact name from a phone number, LID, or full JID.
Parameters:
identifier (required): Phone number, LID, or full JID (aliases: phone_number, phone)
12025551234, 184125298348272, 12025551234@s.whatsapp.net, 184125298348272@lidNatural Language Examples:
list_messagesGet messages with filters, date ranges, and sorting.
Parameters:
chat_jid (optional): Filter by specific chat JIDlimit (optional): Number of messages (default 50, max 500)before_date (optional): Messages before this date (YYYY-MM-DD)after_date (optional): Messages after this date (YYYY-MM-DD)sort_by (optional): "newest" or "oldest" (default "newest")Natural Language Examples:
send_messageSend a text message to a contact or group, optionally as a quoted reply.
Parameters:
recipient (required): Phone number or group JIDmessage (required): Text content to sendquoted_message_id (optional): ID of the message to reply to. When provided, the sent message appears as a quoted reply in WhatsApp.quoted_sender_jid (optional): Full JID of the author of the quoted message. Required for group replies so WhatsApp renders the correct attribution header.quoted_content (optional): Text content of the quoted message, used for the reply preview. Only plain text is supported.Inbound quoted replies are stored automatically. The quoted_message_id field in each message returned by list_messages indicates which message it is replying to (or null for non-replies).
Natural Language Examples:
send_reactionSend (or remove) an emoji reaction to a message.
Parameters:
recipient (required): Chat JID the message belongs to (phone JID or group JID)message_id (required): ID of the message to react toemoji (required): Reaction emoji (e.g. "👍"). Pass an empty string "" to remove an existing reaction.from_me (optional, default false): Whether the original message was sent by the current usersender_jid (optional): Full JID of the original message sender — required for group messages when from_me is false so the correct WhatsApp key is builtInbound reactions received from others are stored automatically as messages with media_type = "reaction". The reaction_to_message_id field in each reaction message indicates which message was reacted to.
When webhook forwarding is enabled, inbound reactions are also posted to WEBHOOK_URL as typed events. Reaction removals use an empty content/reactionEmoji and reactionRemoved: true.
{
"eventType": "reaction",
"sender": "15551234567",
"chatJID": "15551234567@s.whatsapp.net",
"isFromMe": true,
"content": "👍",
"messageId": "reaction-stanza-id",
"mediaType": "reaction",
"reactionToMessageId": "target-message-id",
"reactionEmoji": "👍",
"reactionRemoved": false
}
Natural Language Examples:
send_fileSend a media file (image, video, document).
Parameters:
recipient (required): Phone number or group JIDfile_path (required): Path to the filecaption (optional): Caption for the mediaThe bridge only reads files inside configured media roots. By default this is
~/.local/share/whatsapp-mcp/outbox; set WHATSAPP_MEDIA_ROOTS to allow
additional absolute directories.
send_audio_messageSend a voice message (automatically converts to Opus .ogg format).
Parameters:
recipient (required): Phone number or group JIDfile_path (required): Path to audio fileConverted audio is sent through the same media-path confinement as
send_file.
download_mediaDownload media from a received message.
Parameters:
message_id (required): ID of the message with mediachat_jid (required): JID of the chat containing the messagelist_chatsList all chats with metadata.
Parameters:
limit (optional): Number of chats (default 50, max 200)get_chatGet specific chat metadata by JID.
Parameters:
jid (required): Chat JIDget_direct_chat_by_contactFind a direct message chat with a contact.
Parameters:
phone (required): Phone numb