MCP-WHATSAPP-EVO
Provides tools for managing WhatsApp instances, including sending messages, reading chat history, managing contacts, groups, profiles, labels, templates, and calls via the Evolution API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP-WHATSAPP-EVO send "Hello!" to +1234567890"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP-WHATSAPP-EVO
A Model Context Protocol (MCP) server that exposes the full WhatsApp surface of the Evolution API to MCP clients such as Claude Code, Claude Desktop and Cursor.
Unlike most Evolution MCP servers, this one can read message history (find_messages) and covers ~69 tools across instances, messaging, chats, profile, groups, labels, templates and calls.
Transport: stdio
Runtime: Node.js ≥ 18 (no Bun required)
Auth: the global Evolution API key, sent as the
apikeyheader
Tools
Category | Tools |
Instances (9) |
|
Send messages (13) |
|
Chat & history (15) |
|
Profile (8) |
|
Groups (16) |
|
Settings & webhook (4) |
|
Labels / Templates / Calls (5) |
|
*_templateandsend_templateonly work onWHATSAPP-BUSINESS(Cloud API) instances, not Baileys.
Related MCP server: mcp-evolution-api
Setup
git clone https://github.com/your-username/MCP-WHATSAPP-EVO.git
cd MCP-WHATSAPP-EVO
npm install
npm run build # produces dist/main.cjsConfiguration is done with two environment variables (see .env.example):
Variable | Description |
| Base URL of your Evolution API (no trailing slash) |
| The global |
Use with Claude Code
claude mcp add evolution-whatsapp -s user \
-e EVOLUTION_API_URL=https://evo.example.com \
-e EVOLUTION_API_KEY=your-key \
-- node /absolute/path/to/MCP-WHATSAPP-EVO/dist/main.cjsOn Windows, point at node.exe and the .cjs explicitly:
claude mcp add evolution-whatsapp -s user \
-e EVOLUTION_API_URL=https://evo.example.com \
-e EVOLUTION_API_KEY=your-key \
-- "C:\Program Files\nodejs\node.exe" "C:\path\to\MCP-WHATSAPP-EVO\dist\main.cjs"Then claude mcp list should show it as ✔ Connected. Restart the client to load the tools.
Use with other MCP clients
This is a standard MCP server over stdio, so it works with any MCP-compatible client. They all use the same configuration shape — only the file/UI where you put it changes:
{
"mcpServers": {
"evolution-whatsapp": {
"command": "node",
"args": ["/absolute/path/to/MCP-WHATSAPP-EVO/dist/main.cjs"],
"env": {
"EVOLUTION_API_URL": "https://evo.example.com",
"EVOLUTION_API_KEY": "your-key"
}
}
}
}On Windows, use the full path to node.exe as command and double-escape
backslashes in the path ("C:\\path\\to\\MCP-WHATSAPP-EVO\\dist\\main.cjs").
Where to put that config, per client:
Client | Where |
Claude Desktop |
|
Cursor |
|
Windsurf |
|
VS Code (Copilot/Agent) |
|
Cline / Roo Code (VS Code ext.) | the extension's MCP Servers → Configure panel (same JSON) |
Continue |
|
Zed |
|
Any other MCP client | point it at |
After editing the config, restart the client so it spawns the server and loads the tools. The only requirements are Node.js ≥ 18 on the machine and the two environment variables.
Notes on phone numbers & JIDs
Numbers use the international format without
+, e.g.5491112345678.JIDs are
<number>@s.whatsapp.netfor users and<id>@g.usfor groups.find_messagesis paginated: usepageandoffset(messages per page).
Security
The Evolution API key grants full control over every instance on the server (including personal numbers). Treat it as a secret, scope a dedicated instance/key for automation when possible, and never commit your .env.
Architecture
src/
lib/
client.ts # generic Evolution HTTP client (apikey header, error mapping)
defineTool.ts # helper: Zod schema -> MCP tool with parsing + error handling
tools/
instances.ts messages.ts chat.ts profile.ts groups.ts settings.ts extras.ts
index.ts # aggregates every category into createTools()
main.ts # MCP server bootstrap (stdio)Adding a new endpoint is one defineTool({ name, description, schema, run }) block that calls getClient().request(method, path, { data, params }).
License
MIT — see LICENSE.
Available Tools
70 toolsaccept_invite_codeB
Join a group using an invite code.
Inputs: inviteCode (required), instanceName (required).
archive_chatC
Archive or unarchive a chat.
Inputs: chat (required), archive (required), instanceName (required), lastMessage.
check_whatsapp_numbersA
Check whether one or more phone numbers are registered on WhatsApp.
Inputs: numbers (required), instanceName (required).
connect_evolution_instanceB
Connect a WhatsApp instance and get the pairing code / QR code base64.
Inputs: instanceName (required), number.
create_evolution_instanceB
Create a new WhatsApp instance. Returns the instance hash/apikey and (for Baileys) a QR code to connect.
Inputs: instanceName (required), number, qrcode, msgCall, +7 more.
create_groupC
Create a new group with a subject and participants.
Inputs: subject (required), instanceName (required), participants (required), description.
create_templateB
Create a message template (WHATSAPP-BUSINESS / Cloud API only).
Inputs: name (required), language (required), instanceName (required), category, +1 more.
delete_evolution_instanceB
Permanently delete a WhatsApp instance.
Inputs: instanceName (required).
delete_message_for_everyoneC
Delete a message for everyone in the chat.
Inputs: id (required), fromMe (required), remoteJid (required), instanceName (required), +1 more.
fetch_all_groupsB
List all groups the instance belongs to.
Inputs: instanceName (required), getParticipants.
fetch_business_profileB
Fetch the WhatsApp Business profile of a number.
Inputs: number (required), instanceName (required).
fetch_evolution_instancesA
List all WhatsApp instances (or a specific one by name) with their connection status, owner and counts.
Inputs: instanceName.
fetch_invite_codeB
Get the invite link/code of a group.
Inputs: groupJid (required), instanceName (required).
fetch_invite_infoA
Get group info from an invite code (without joining).
Inputs: inviteCode (required), instanceName (required).
fetch_privacy_settingsB
Fetch the privacy settings of the instance.
Inputs: instanceName (required).
fetch_profileB
Fetch the profile (name, status, picture) of a number.
Inputs: number (required), instanceName (required).
fetch_profile_picture_urlC
Get the profile picture URL of a contact.
Inputs: number (required), instanceName (required).
find_chat_by_remote_jidB
Find a single chat by its remoteJid.
Inputs: remoteJid (required), instanceName (required).
find_chatsB
List WhatsApp chats with their metadata (name, last message timestamp, unread count).
Inputs: instanceName (required), where.
find_contactsB
Search contacts by id (phone/JID) or name.
Inputs: instanceName (required), where.
find_group_by_jidA
Get the info of a group by its JID.
Inputs: groupJid (required), instanceName (required).
find_group_membersB
List the participants of a group.
Inputs: groupJid (required), instanceName (required).
find_labelsA
List the chat labels of an instance.
Inputs: instanceName (required).
find_messagesA
Read the message history of a chat. Filter by the contact's remoteJid (e.g. 5491112345678@s.whatsapp.net or a group ...@g.us). Results are paginated.
Inputs: remoteJid (required), instanceName (required), page, offset.
find_status_messageC
Retrieve status (story) messages.
Inputs: instanceName (required), where.
find_templateA
List the message templates of an instance (WHATSAPP-BUSINESS only).
Inputs: instanceName (required).
get_base64_from_media_messageC
Download a media message and return it as base64.
Inputs: message (required), instanceName (required), convertToMp4.
get_connection_stateA
Check the connection state of a WhatsApp instance (open = connected, close/connecting otherwise).
Inputs: instanceName (required).
get_evolution_infoA
Get basic information about the Evolution API server (version, status).
Inputs: no named parameters.
get_evolution_settingsB
Get the current behaviour settings of an instance.
Inputs: instanceName (required).
get_evolution_webhookC
Get the current webhook configuration of an instance.
Inputs: instanceName (required).
handle_labelB
Add or remove a label from a chat.
Inputs: action (required), number (required), labelId (required), instanceName (required).
leave_groupC
Leave a group.
Inputs: groupJid (required), instanceName (required).
logout_evolution_instanceA
Log out a WhatsApp instance (disconnects the device without deleting the instance).
Inputs: instanceName (required).
mark_chat_unreadC
Mark a chat as unread.
Inputs: chat (required), instanceName (required), lastMessage.
mark_message_as_readC
Mark one or more messages as read.
Inputs: instanceName (required), readMessages (required).
offer_callA
Offer a (fake) WhatsApp call to a number — rings the recipient without a real call.
Inputs: number (required), instanceName (required), isVideo, callDuration.
remove_profile_pictureC
Remove the profile picture of the instance.
Inputs: instanceName (required).
restart_evolution_instanceB
Restart a WhatsApp instance.
Inputs: instanceName (required).
revoke_invite_codeB
Revoke and regenerate a group's invite code.
Inputs: groupJid (required), instanceName (required).
send_buttonsC
Send a message with interactive buttons.
Inputs: title (required), number (required), buttons (required), description (required), +6 more.
send_chat_presenceB
Send a typing/recording presence to a chat (composing, recording or paused).
Inputs: number (required), presence (required), instanceName (required), delay.
send_contactC
Send one or more contact cards (vCards).
Inputs: number (required), contact (required), instanceName (required), delay, +3 more.
send_group_inviteC
Send a group invite to one or more numbers.
Inputs: numbers (required), groupJid (required), description (required), instanceName (required).
send_listC
Send an interactive list message.
Inputs: title (required), number (required), sections (required), buttonText (required), +7 more.
send_locationC
Send a location message.
Inputs: name (required), number (required), address (required), latitude (required), +6 more.
send_mediaB
Send a media message (image, video, audio or document) by URL or base64.
Inputs: media (required), number (required), mediatype (required), instanceName (required), +7 more.
send_plain_textC
Send a plain text message to a WhatsApp number.
Inputs: text (required), number (required), instanceName (required), delay, +4 more.
send_pollC
Send a poll message.
Inputs: name (required), number (required), values (required), instanceName (required), +5 more.
send_ptvB
Send a PTV (round video note) by URL or base64.
Inputs: video (required), number (required), instanceName (required), delay, +3 more.
send_reactionC
React to a message with an emoji.
Inputs: instanceName (required), reactionMessage (required).
send_statusC
Post a WhatsApp status/story (text, image or audio).
Inputs: instanceName (required), statusMessage (required).
send_stickerB
Send a sticker by URL or base64.
Inputs: number (required), sticker (required), instanceName (required), delay, +3 more.
send_templateA
Send an approved WhatsApp Business template message. Only works on WHATSAPP-BUSINESS (Cloud API) instances.
Inputs: name (required), number (required), language (required), instanceName (required), +1 more.
send_whatsapp_audioC
Send a WhatsApp voice note (PTT) by URL or base64.
Inputs: audio (required), number (required), instanceName (required), delay, +4 more.
set_evolution_presenceB
Set the global presence of an instance (available or unavailable).
Inputs: presence (required), instanceName (required).
set_evolution_settingsC
Update the behaviour settings of an instance.
Inputs: instanceName (required), msgCall, readStatus, rejectCall, +4 more.
set_evolution_webhookB
Configure the webhook of an instance (where Evolution POSTs events).
Inputs: url (required), enabled (required), instanceName (required), events, +2 more.
toggle_ephemeralB
Set disappearing messages for a group (expiration in seconds: 0, 86400, 604800 or 7776000).
Inputs: groupJid (required), expiration (required), instanceName (required).
update_block_statusC
Block or unblock a contact.
Inputs: number (required), status (required), instanceName (required).
update_group_descriptionC
Change a group's description.
Inputs: groupJid (required), description (required), instanceName (required).
update_group_pictureB
Change a group's picture (URL or base64).
Inputs: image (required), groupJid (required), instanceName (required).
update_group_settingA
Change group settings: who can send messages (announcement) or edit group info (locked).
Inputs: action (required), groupJid (required), instanceName (required).
update_group_subjectC
Change a group's subject (name).
Inputs: subject (required), groupJid (required), instanceName (required).
update_messageB
Edit a previously sent text message.
Inputs: key (required), text (required), number (required), instanceName (required).
update_participantA
Add, remove, promote (to admin) or demote participants in a group.
Inputs: action (required), groupJid (required), instanceName (required), participants (required).
update_privacy_settingsB
Update the privacy settings of the instance (read receipts, profile, status, online, last seen, group add).
Inputs: instanceName (required), last, online, status, +3 more.
update_profile_nameA
Update the display name of the instance's own profile.
Inputs: name (required), instanceName (required).
update_profile_pictureA
Update the profile picture of the instance (URL or base64).
Inputs: picture (required), instanceName (required).
update_profile_statusB
Update the 'about'/status text of the instance's own profile.
Inputs: status (required), instanceName (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 70 tools
Each tool targets a distinct action, but there is some overlap between send_media (which can send audio) and send_whatsapp_audio (voice note), and between send_media and send_ptv (round video). Agents may occasionally misselect between these. Overall, most tools have clear boundaries.
Naming follows snake_case but uses a mix of verbs: get, fetch, find for retrieval; send, update, set for actions. Inconsistencies like get_connection_state vs fetch_profile, and send_chat_presence vs set_evolution_presence reduce predictability.
70 tools is excessive for a typical MCP server. While each tool serves a specific purpose, the high number makes the surface unwieldy and increases selection difficulty. A consolidated API with fewer but more flexible tools would improve coherence.
The tool set covers nearly all WhatsApp operations: instance lifecycle, messaging (text, media, reactions, polls, templates, status), group management (create, update, invite, participants), profile, privacy, and webhooks. Only minor gaps like deleting a chat or forwarding messages exist, making it very complete for its domain.
Maintenance
Related MCP Connectors
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Your own WhatsApp as an MCP server: read, search and send from any MCP client.
WhatsApp MCP on your own number: read chats, search contacts, send messages.
WhatsApp (Web + Business API), SMS, contacts, and call records via 2Chat's MCP server.
Related MCP Servers
- AlicenseBqualityCmaintenanceMCP server that integrates Evolution API to enable WhatsApp messaging, chat management, group operations, and instance control through natural language tools.5441 npm1MIT
- AlicenseAqualityDmaintenanceMCP server that wraps the Evolution API (WhatsApp) as semantic tools for LLM agents, enabling messaging, chat management, group operations, and instance control via natural language.32MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for managing WhatsApp instances and sending messages through Evolution API.1-
- AlicenseBqualityDmaintenanceEnables WhatsApp messaging and management through the Evolution API, supporting sending texts, checking numbers, listing contacts and groups, and more.25MIT