wwebjs-mcp
Provides tools for interacting with WhatsApp Web, enabling AI agents to send and receive messages, manage chats, groups, contacts, and more via the wwebjs-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., "@wwebjs-mcp send a WhatsApp message to +1234567890 saying 'Hello'"
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.
wwebjs-mcp
MCP server that exposes the wwebjs-api
(WhatsApp Web REST API) as Model Context Protocol tools. It runs as a Docker
container, is configured entirely through .env, and all ~149 API endpoints
are exposed automatically — the tools are generated at startup from the
upstream swagger.json, so new endpoints appear with no code changes.
How it works
MCP client ──MCP (stdio | HTTP/SSE)──▶ wwebjs-mcp ──REST (x-api-key)──▶ wwebjs-api ──▶ WhatsApp WebOn startup the server reads
swagger.jsonand turns every operation into an MCP tool (session_start,client_sendMessage,message_react,groupChat_addParticipants, …).Path parameters (
{sessionId}), query params, and JSON body fields are all derived from the spec and validated via each tool's JSON Schema.The
x-api-keyheader is injected on every call fromWWEBJS_API_KEY.Binary responses (QR image, page screenshot) are returned as MCP image content.
Related MCP server: WA MCP
Prerequisites
Docker Engine and Docker Compose v2 (
docker compose versionshould print something; if you only have the olddocker-composebinary, upgrade Docker Desktop/Engine).Either an existing wwebjs-api instance you can reach (→ Scenario A), or none at all — this repo can run one for you too (→ Scenario B).
Get the code
git clone https://github.com/victor-halla/wwebjs-mcp.git
cd wwebjs-mcp(SSH clone: git clone git@github.com:victor-halla/wwebjs-mcp.git, if you
have a deploy key or your own key registered on GitHub.)
Then continue with whichever scenario matches your setup below. Both end with the same two commands:
docker compose up --build -d # builds the image and starts the container(s)
curl http://localhost:8080/health # -> {"status":"ok"} once it's upScenario A — connect to an existing wwebjs-api container
Use this when you already run wwebjs-api, with its API_KEY set and a
session (a logged-in WhatsApp number) already created.
You need three things from the running instance:
Base URL — how this MCP container reaches the wwebjs-api container.
API key — the value of
API_KEYon the wwebjs-api server.Session ID — the id of the already-configured session. Confirm it with:
curl -H "x-api-key: <API_KEY>" http://<host>:3000/session/getSessions curl -H "x-api-key: <API_KEY>" http://<host>:3000/session/status/<sessionId>A ready session returns a connected/authenticated state — no QR needed.
1. Pick the right WWEBJS_API_URL (container networking)
How wwebjs-api runs |
|
Its own container on a shared Docker network |
|
A container publishing port 3000 on the host |
|
A remote server |
|
To share a network with an existing container, find/create the network and attach this service to it:
docker network ls # find the existing network name
docker inspect <wwebjs-container> --format '{{json .NetworkSettings.Networks}}'Then in docker-compose.yml add (external = the network already created by your
wwebjs-api stack):
services:
wwebjs-mcp:
networks: [wa-net]
networks:
wa-net:
external: true
name: <existing-network-name>…and set WWEBJS_API_URL=http://<wwebjs-container-name>:3000 in .env.
2. Configure .env and start
cp .env.example .envWWEBJS_API_URL=http://wwebjs-api:3000 # or host.docker.internal:3000
WWEBJS_API_KEY=<the API_KEY of your wwebjs-api>
MCP_TRANSPORT=http
MCP_HTTP_PORT=8080
MCP_AUTH_TOKEN=<optional token AI clients must present>docker compose up --build -d
curl http://localhost:8080/health # -> {"status":"ok"}The MCP endpoint is now at http://localhost:8080/mcp (Streamable HTTP).
The session id is not an env var — it is passed as the
sessionIdargument on each tool call by the AI client (e.g.session_status,client_sendMessage). Just tell your AI agent whichsessionIdto use.
Scenario B — set up everything from scratch
Use this when you have no wwebjs-api yet. Run both containers together.
In
docker-compose.yml, uncomment thewwebjs-apiservice at the bottom and set in.env:WWEBJS_API_URL=http://wwebjs-api:3000 WWEBJS_API_KEY=<choose-a-strong-key> MCP_TRANSPORT=httpStart the stack:
docker compose up --build -dCreate and log in a session (pick any id, e.g.
main). Either drive it via your AI client's tools (session_start→session_qr_image→ scan), or by curl directly against wwebjs-api:curl -H "x-api-key: $WWEBJS_API_KEY" http://localhost:3000/session/start/main # open the QR image in a browser and scan it with WhatsApp > Linked devices: # http://localhost:3000/session/qr/main/image (send x-api-key header) curl -H "x-api-key: $WWEBJS_API_KEY" http://localhost:3000/session/status/mainAlternatively use phone pairing via the
session_requestPairingCodetool.Once
statusreports connected, the session persists on disk (thesessionsvolume) and is reused on restart. From then on it behaves like Scenario A.
Authentication
The HTTP transport supports an optional bearer token: set MCP_AUTH_TOKEN in
.env and every client must send Authorization: Bearer <token> on /mcp,
or the server replies 401. Generate a strong token with:
openssl rand -hex 32Leave MCP_AUTH_TOKEN empty only for local, loopback-only testing. Always
set it before exposing the server outside localhost (e.g. via the
Cloudflare Tunnel below) — without it, anyone who can reach the URL gets full
access to every WhatsApp session.
Connecting an AI client (OpenClaw, Claude Code, VS Code, etc.)
The container speaks Streamable HTTP MCP at POST/GET /mcp. Point any
MCP-capable client at it.
Claude Code
Project-scoped, via .mcp.json in the repo root of the project you want the
tools available in:
{
"mcpServers": {
"whatsapp": {
"type": "http",
"url": "http://<mcp-host>:8080/mcp",
"headers": { "Authorization": "Bearer <MCP_AUTH_TOKEN>" }
}
}
}Or register it with the CLI instead of hand-editing JSON:
claude mcp add --transport http whatsapp http://<mcp-host>:8080/mcp \
--header "Authorization: Bearer <MCP_AUTH_TOKEN>"VS Code
Create .vscode/mcp.json in the workspace (note: VS Code uses a top-level
servers key, not mcpServers):
{
"servers": {
"whatsapp": {
"type": "http",
"url": "http://<mcp-host>:8080/mcp",
"headers": { "Authorization": "Bearer <MCP_AUTH_TOKEN>" }
}
}
}Then enable it from the Command Palette (MCP: List Servers / MCP: Add Server) if it isn't picked up automatically. Check your VS Code version's MCP docs if the schema has moved since this was written.
Generic / any other MCP client
Most clients follow the same shape as Claude Code above (mcpServers map with
type: "http", url, optional headers). Point url at /mcp and, if
MCP_AUTH_TOKEN is set, include the Authorization: Bearer header.
Omit the
headersblock ifMCP_AUTH_TOKENis empty.If the AI tool runs in its own container, use a URL it can reach the MCP container by (shared Docker network name, or
host.docker.internal:8080).Tell the agent which session id to operate on; it passes
sessionIdon every tool call. See thewwebjs-mcpskill for the usage playbook.
stdio transport (local process instead of HTTP) — set MCP_TRANSPORT=stdio
and have the client launch node dist/index.js with the same env vars.
Using the included Claude Code skill
This repo ships a Claude Code skill at
.claude/skills/wwebjs-mcp/SKILL.md.
It's a task-oriented playbook for the agent using the tools (not for
building this server): connecting a session (QR/pairing code), sending
text/media/location/poll messages, resolving chatId/messageId correctly,
managing chats/groups/contacts/labels/channels, and which actions to confirm
with the user before calling (session_terminateAll, chat_delete, …).
Skills are project-scoped, and you'll normally be using the WhatsApp tools from a different project than this one (this repo's job is just to run the server). Copy the skill folder wherever you need it:
# Available only in one project:
mkdir -p /path/to/your-project/.claude/skills
cp -r .claude/skills/wwebjs-mcp /path/to/your-project/.claude/skills/
# Or available to Claude Code in every project on this machine:
mkdir -p ~/.claude/skills
cp -r .claude/skills/wwebjs-mcp ~/.claude/skills/Once the skill is in place and the MCP server is connected (previous
section), Claude Code loads it automatically — no manual setup beyond
copying the folder. It triggers on its own whenever you ask for something
WhatsApp-related ("send a WhatsApp message to...", "list my WhatsApp
chats..."), or you can invoke it explicitly with /wwebjs-mcp.
Exposing over HTTPS (Cloudflare Tunnel)
To reach this server from outside your network (e.g. a hosted AI client that can't reach your LAN) without opening an inbound port, run it behind a Cloudflare Tunnel:
In the Cloudflare Zero Trust dashboard, create a tunnel and add a public hostname pointing at service
http://wwebjs-mcp:8080(the Docker service name —cloudflaredreaches it over the compose network, no host port needed).Copy the tunnel token into
.env:CLOUDFLARE_TUNNEL_TOKEN=<token from the dashboard>Set
MCP_AUTH_TOKEN(see Authentication above) — the tunnel makes/mcpreachable from the public internet.Uncomment the
cloudflaredservice at the bottom ofdocker-compose.ymland start it:docker compose up -d cloudflaredPoint your MCP client's
urlathttps://<your-tunnel-hostname>/mcpinstead of the local address.
No other code changes are needed — the server already sets Express's
trust proxy, so it correctly reads the original client's protocol/IP from
the X-Forwarded-* headers Cloudflare adds. /health stays reachable without
the bearer token (used by the container's own Docker healthcheck); every
/mcp call still requires it.
Configuration (.env)
Variable | Default | Purpose |
|
| Base URL of the wwebjs-api server |
| – | Sent as |
|
| Per-request timeout |
|
|
|
|
| HTTP bind address |
| – | Optional bearer token for MCP clients |
| – | Only expose these tools (comma sep.) |
| – | Hide these tools (e.g. |
|
|
|
| – | Token for the optional |
Development
npm install
npm run build
MCP_TRANSPORT=stdio WWEBJS_API_URL=http://localhost:3000 WWEBJS_API_KEY=... npm startRefresh the endpoint list from upstream at any time:
npm run fetch-swagger # re-downloads swagger.jsonTool naming
Tools are named <segments> joined by _, dropping path params:
Endpoint | Tool |
|
|
|
|
|
|
|
|
When two methods share a path (e.g. GET/POST /client/getChats), the second
is prefixed with its method (post_client_getChats).
Available Tools
149 toolschannel_acceptChannelAdminInviteC
[Channel Chat] Accept channel admin invite
Inputs: sessionId (required), chatId.
channel_deleteChannelB
[Channel Chat] Delete a channel you created
Inputs: sessionId (required), chatId.
channel_demoteChannelAdminA
[Channel Chat] Demotes a channel admin to a regular subscriber
Inputs: sessionId (required), chatId, userId.
channel_fetchMessagesA
[Channel Chat] Load channel messages. Messages sorted from earliest to latest
Inputs: sessionId (required), chatId, searchOptions.
channel_getClassInfoC
[Channel Chat] Get the channel
Inputs: sessionId (required), chatId.
channel_getSubscribersA
[Channel Chat] Gets the subscribers of the channel (only those who are in your contact list)
Inputs: sessionId (required), limit, chatId.
channel_muteB
[Channel Chat] Mute the channel
Inputs: sessionId (required), chatId.
channel_revokeChannelAdminInviteA
[Channel Chat] Revokes a channel admin invitation sent to a user by a channel owner
Inputs: sessionId (required), chatId, userId.
channel_sendChannelAdminInviteB
[Channel Chat] Sends a channel admin invitation to a user
Inputs: sessionId (required), chatId, userId, options.
channel_sendMessageC
[Channel Chat] Sends a message to this channel
Inputs: sessionId (required), chatId, content, options, +1 more.
channel_sendSeenC
[Channel Chat] Send seen status to the channel
Inputs: sessionId (required), chatId.
channel_setDescriptionB
[Channel Chat] Update a channel description
Inputs: sessionId (required), chatId, newDescription.
channel_setProfilePictureC
[Channel Chat] Update a channel profile picture
Inputs: sessionId (required), chatId, newProfilePictureUrl, newProfilePictureMedia.
channel_setReactionSettingA
[Channel Chat] Updates available reactions to use in the channel. Valid values for passing to the method are: 0 for NONE reactions to be available 1 for BASIC reactions to be available: 👍, ❤️, 😂, 😮, 😢, 🙏 2 for ALL reactions to be available
Inputs: sessionId (required), chatId, reactionCode.
channel_setSubjectC
[Channel Chat] Set the subject of the channel
Inputs: sessionId (required), chatId, newSubject.
channel_transferChannelOwnershipA
[Channel Chat] Transfers a channel ownership to another user. Note: the user you are transferring the channel ownership to must be a channel admin
Inputs: sessionId (required), chatId, options, newOwnerId.
channel_unmuteB
[Channel Chat] Unmute the channel
Inputs: sessionId (required), chatId.
chat_changeLabelsC
[Chat] Add or remove labels
Inputs: sessionId (required), chatId, labelIds.
chat_clearMessagesB
[Chat] Clear all messages from the chat
Inputs: sessionId (required), chatId.
chat_clearStateA
[Chat] Stop typing or recording in chat immediately
Inputs: sessionId (required), chatId.
chat_deleteC
[Chat] Delete the chat
Inputs: sessionId (required), chatId.
chat_fetchMessagesC
[Chat] Load chat messages. Messages sorted from earliest to latest
Inputs: sessionId (required), chatId, searchOptions.
chat_getClassInfoD
[Chat] Get the chat
Inputs: sessionId (required), chatId.
chat_getContactC
[Chat] Get the contact
Inputs: sessionId (required), chatId.
chat_getLabelsA
[Chat] Return all labels. Return array of all labels assigned to this chat
Inputs: sessionId (required), chatId.
chat_markUnreadC
[Chat] Mark this chat as unread
Inputs: sessionId (required), chatId.
chat_runMethodC
[Chat] Execute a method on the chat. Execute a method on the chat and return the result
Inputs: sessionId (required), chatId, method, options.
chat_sendSeenC
[Chat] Set the message as seen
Inputs: sessionId (required), chatId.
chat_sendStateRecordingA
[Chat] Simulate recording audio. Simulate recording audio in chat. This will last for 25 seconds
Inputs: sessionId (required), chatId.
chat_sendStateTypingC
[Chat] Simulate typing in chat. Simulate typing in chat. This will last for 25 seconds.
Inputs: sessionId (required), chatId.
chat_syncHistoryC
[Chat] Sync chat history
Inputs: sessionId (required), chatId.
client_acceptInviteB
[Client] Accept an invitation to join a group
Inputs: sessionId (required), inviteCode.
client_addOrRemoveLabelsC
[Client] Change labels in chats
Inputs: sessionId (required), chatIds, labelIds.
client_archiveChatC
[Client] Archive the chat
Inputs: sessionId (required), chatId.
client_createChannelB
[Client] Create a new channel
Inputs: sessionId (required), title, options.
client_createGroupC
[Client] Create a new group
Inputs: sessionId (required), title, options, participants.
client_deleteProfilePictureB
[Client] Delete the current user's profile picture
Inputs: sessionId (required).
client_getBlockedContactsA
[Client] Get all blocked contacts by host account
Inputs: sessionId (required).
client_getChannelByInviteCodeC
[Client] Get channel by invite code
Inputs: sessionId (required), inviteCode.
client_getChannelsC
[Client] Get channels from the client. Retrieve a list of channels from the client
Inputs: sessionId (required).
client_getChatByIdD
[Client] Get the chat
Inputs: sessionId (required), chatId.
client_getChatLabelsC
[Client] Get all labels assigned to the chat
Inputs: sessionId (required), chatId.
client_getChatsB
[Client] Get all current chats. Retrieve all chats for the given session ID.
Inputs: sessionId (required).
client_getChatsByLabelIdA
[Client] Get all chats for a specific label
Inputs: sessionId (required), labelId.
client_getClassInfoC
[Client] Get current connection information
Inputs: sessionId (required).
client_getCommonGroupsB
[Client] Get the contact's common groups. Get the contact's common groups with you. Returns empty array if you don't have any common group.
Inputs: sessionId (required), contactId.
client_getContactByIdD
[Client] Get the contact
Inputs: sessionId (required), contactId.
client_getContactDeviceCountA
[Client] Get user device count. Each WaWeb Connection counts as one device, and the phone (if exists) counts as one device. So for a non-enterprise user with one WaWeb connection it should return "2"
Inputs: sessionId (required), userId.
client_getContactLidAndPhoneB
[Client] Get contact lid and phone. Retrieve the contact lid and phone number for a specific chat
Inputs: sessionId (required), userIds.
client_getContactsB
[Client] Get all current contacts
Inputs: sessionId (required).
client_getCountryCodeC
[Client] Get the country code
Inputs: sessionId (required), number.
client_getFormattedNumberC
[Client] Get the formatted number
Inputs: sessionId (required), number.
client_getInviteInfoC
[Client] Return invite information. Return an object with information about the invite code
Inputs: sessionId (required), displayName.
client_getLabelByIdC
[Client] Get the label
Inputs: sessionId (required), labelId.
client_getLabelsB
[Client] Get all current labels
Inputs: sessionId (required).
client_getNumberIdA
[Client] Get the registered WhatsApp ID for a number. Return null if the number is not registered on WhatsApp
Inputs: sessionId (required), number.
client_getProfilePicUrlB
[Client] Return the contact ID's profile picture URL
Inputs: sessionId (required), contactId.
client_getStateC
[Client] Get the current connection state for the client
Inputs: sessionId (required).
client_getWWebVersionA
[Client] Return the version of WhatsApp Web currently being run
Inputs: sessionId (required).
client_isRegisteredUserB
[Client] Check if a given ID is registered in WhatsApp
Inputs: sessionId (required), number.
client_markChatUnreadC
[Client] Mark the chat as unread
Inputs: sessionId (required), chatId.
client_muteChatA
[Client] Mute the chat. Mute this chat forever, unless a date is specified
Inputs: sessionId (required), chatId, unmuteDate.
client_openChatWindowC
[Client] Open the chat window
Inputs: sessionId (required), chatId.
client_openChatWindowAtB
[Client] Open the chat window to the position of the message
Inputs: sessionId (required), messageId.
client_pinChatB
[Client] Pin the chat
Inputs: sessionId (required), chatId.
client_resetStateB
[Client] Force reset of connection state for the client
Inputs: sessionId (required).
client_runMethodC
[Client] Execute a method on the client. Execute a method on the client and return the result
Inputs: sessionId (required), method, options.
client_searchChannelsC
[Client] Search channels
Inputs: sessionId (required), searchOptions.
client_searchMessagesC
[Client] Search for messages
Inputs: sessionId (required), query, options.
client_sendMessageC
[Client] Send a message to a specific chatId
Inputs: sessionId (required), chatId, content, options, +1 more.
client_sendPresenceAvailableA
[Client] Mark the client as online
Inputs: sessionId (required).
client_sendSeenC
[Client] Mark the chat as seen
Inputs: sessionId (required), chatId.
client_setAutoDownloadAudioC
[Client] Set auto load download audio flag
Inputs: sessionId (required), flag.
client_setAutoDownloadDocumentsC
[Client] Set auto load download documents flag
Inputs: sessionId (required), flag.
client_setAutoDownloadPhotosC
[Client] Set auto load download photos flag
Inputs: sessionId (required), flag.
client_setAutoDownloadVideosB
[Client] Set auto load download videos flag
Inputs: sessionId (required), flag.
client_setBackgroundSyncA
[Client] Change the background synchronization setting. NOTE: This action will take effect after you restart the client
Inputs: sessionId (required), flag.
client_setDisplayNameD
[Client] Set the current user. This is the name shown to WhatsApp users that have not added you as a contact beside your number in groups and in your profile.
Inputs: sessionId (required), pictureData, pictureMimetype.
client_setProfilePictureA
[Client] Set the current user's profile picture
Inputs: sessionId (required), pictureData, pictureMimetype.
client_setStatusB
[Client] Set the current user's status message
Inputs: sessionId (required), status.
client_subscribeToChannelC
[Client] Subscribe to a channel
Inputs: sessionId (required), channelId.
client_syncHistoryD
[Client] Sync chat history
Inputs: sessionId (required), chatId.
client_unarchiveChatC
[Client] Changes archive state of the chat
Inputs: sessionId (required), chatId.
client_unmuteChatB
[Client] Unmute the chat
Inputs: sessionId (required), chatId.
client_unpinChatC
[Client] Unpin the chat
Inputs: sessionId (required), chatId.
client_unsubscribeFromChannelC
[Client] Unsubscribe from channel
Inputs: sessionId (required), options, channelId.
contact_blockC
[Contact] Block contact
Inputs: sessionId (required), contactId.
contact_getAboutB
[Contact] Get the contact's current info. Get the Contact's current 'about' info. Returns null if you don't have permission to read their status.
Inputs: sessionId (required), contactId.
contact_getChatB
[Contact] Get the chat. Get the chat that corresponds to the contact. Will return null when getting chat for currently logged in user.
Inputs: sessionId (required), contactId.
contact_getClassInfoD
[Contact] Get the contact
Inputs: sessionId (required), contactId.
contact_getCommonGroupsA
[Contact] Get the contact's common groups. Get the contact's common groups with you. Returns empty array if you don't have any common group.
Inputs: sessionId (required), contactId.
contact_getCountryCodeA
[Contact] Get the country code. Returns the contact's country code, (1541859685@c.us) => (1).
Inputs: sessionId (required), contactId.
contact_getFormattedNumberA
[Contact] Get the formatted phone number. Returns the contact's formatted phone number, (12345678901@c.us) => (+1 (234) 5678-901).
Inputs: sessionId (required), contactId.
contact_getProfilePicUrlB
[Contact] Get the profile picture URL. Get the contact's profile picture URL, if privacy settings allow it.
Inputs: sessionId (required), contactId.
contact_unblockB
[Contact] Unblock the contact. Unblock the contact from WhatsApp.
Inputs: sessionId (required), contactId.
groupChat_addParticipantsB
[Group Chat] Add the participants. Add a list of participants by ID to the group
Inputs: sessionId (required), chatId, options, participantIds.
groupChat_approveGroupMembershipRequestsC
[Group Chat] Approve membership request
Inputs: sessionId (required), chatId, options.
groupChat_deletePictureB
[Group Chat] Delete the group picture
Inputs: sessionId (required), chatId.
groupChat_demoteParticipantsB
[Group Chat] Demote the participants. Demote participants by ID to regular users
Inputs: sessionId (required), chatId, participantIds.
groupChat_getClassInfoC
[Group Chat] Get the group
Inputs: sessionId (required), chatId.
groupChat_getGroupMembershipRequestsB
[Group Chat] Get the membership requests
Inputs: sessionId (required), chatId.
groupChat_getInviteCodeC
[Group Chat] Get the invite code. Get the invite code for a specific group
Inputs: sessionId (required), chatId.
groupChat_leaveB
[Group Chat] Leave the group
Inputs: sessionId (required), chatId.
groupChat_promoteParticipantsB
[Group Chat] Promote the participants. Promote participants by ID to admins
Inputs: sessionId (required), chatId, participantIds.
groupChat_rejectGroupMembershipRequestsC
[Group Chat] Reject membership request
Inputs: sessionId (required), chatId, options.
groupChat_removeParticipantsC
[Group Chat] Remove the participants. Remove a list of participants by ID to the group
Inputs: sessionId (required), chatId, participantIds.
groupChat_revokeInviteA
[Group Chat] Invalidate the invite code. Invalidate the current group invite code and generates a new one
Inputs: sessionId (required), chatId.
groupChat_runMethodC
[Group Chat] Execute a method on the group. Execute a method on the group and return the result
Inputs: sessionId (required), chatId, method, options.
groupChat_setDescriptionB
[Group Chat] Update the group description
Inputs: sessionId (required), chatId, description.
groupChat_setInfoAdminsOnlyC
[Group Chat] Update the info group settings
Inputs: sessionId (required), chatId, adminsOnly.
groupChat_setMessagesAdminsOnlyC
[Group Chat] Update the message group settings
Inputs: sessionId (required), chatId, adminsOnly.
groupChat_setPictureB
[Group Chat] Set the group picture
Inputs: sessionId (required), chatId, pictureData, pictureMimeType.
groupChat_setSubjectC
[Group Chat] Update the group subject
Inputs: sessionId (required), chatId, subject.
localCallbackExampleA
[Various] Local callback. Used to generate a QR code and writes a log file. ONLY FOR DEVELOPMENT/TEST PURPOSES.
Inputs: no named parameters.
message_deleteC
[Message] Delete a message from the chat
Inputs: sessionId (required), chatId, everyone, messageId, +1 more.
message_downloadMediaC
[Message] Download attached message media
Inputs: sessionId (required), chatId, messageId.
message_downloadMediaAsDataB
[Message] Download attached message media as binary data
Inputs: sessionId (required), chatId, messageId.
message_editC
[Message] Edit the message
Inputs: sessionId (required), chatId, content, options, +1 more.
message_forwardD
[Message] Delete a message from the chat
Inputs: sessionId (required), chatId, messageId, destinationChatId.
message_getClassInfoD
[Message] Get message
Inputs: sessionId (required), chatId, messageId.
message_getContactC
[Message] Get the contact
Inputs: sessionId (required), chatId, messageId.
message_getGroupMentionsB
[Message] Get groups mentioned in this message
Inputs: sessionId (required), chatId, messageId.
message_getInfoA
[Message] Get information about message delivery status. May return null if the message does not exist or is not sent by you.
Inputs: sessionId (required), chatId, messageId.
message_getMentionsC
[Message] Get the contacts mentioned
Inputs: sessionId (required), chatId, messageId.
message_getOrderC
[Message] Get the order details
Inputs: sessionId (required), chatId, messageId.
message_getPaymentC
[Message] Get the payment details
Inputs: sessionId (required), chatId, messageId.
message_getPollVotesA
[Message] Get poll vote results for a message with a poll. May return null if the message does not exist or is not a poll.
Inputs: sessionId (required), chatId, messageId.
message_getQuotedMessageC
[Message] Get the quoted message
Inputs: sessionId (required), chatId, messageId.
message_getReactionsC
[Message] Get the reactions associated
Inputs: sessionId (required), chatId, messageId.
message_reactC
[Message] React with an emoji
Inputs: sessionId (required), chatId, reaction, messageId.
message_replyC
[Message] Send a message as a reply
Inputs: sessionId (required), chatId, content, options, +2 more.
message_runMethodC
[Message] Execute a method on the message. Execute a method on the message and return the result
Inputs: sessionId (required), chatId, method, options, +1 more.
message_starC
[Message] Star the message
Inputs: sessionId (required), chatId, messageId.
message_unstarB
[Message] Unstar the message
Inputs: sessionId (required), chatId, messageId.
pingA
[Various] Health check. Responds to request with "pong" message
Inputs: no named parameters.
post_client_getChatsB
[Client] Get all current chats with optional search parameters. Retrieve all chats for the given session ID with optional search parameters.
Inputs: sessionId (required), searchOptions.
session_getPageScreenshotC
[Session] Get page screenshot. Screenshot of the client with the given session ID.
Inputs: sessionId (required).
session_getSessionsC
[Session] Get all sessions. Get all sessions.
Inputs: no named parameters.
session_qrC
[Session] Get session QR code. QR code of the session with the given session ID.
Inputs: sessionId (required).
session_qr_imageB
[Session] Get session QR code as image. QR code as image of the session with the given session ID.
Inputs: sessionId (required).
session_requestPairingCodeC
[Session] Request authentication via pairing code
Inputs: sessionId (required), phoneNumber, showNotification.
session_restartC
[Session] Restart session. Restarts the session with the given session ID.
Inputs: sessionId (required).
session_startC
[Session] Start new session. Starts a session for the given session ID.
Inputs: sessionId (required).
session_statusB
[Session] Get session status. Status of the session with the given session ID.
Inputs: sessionId (required).
session_stopC
[Session] Stop session. Stops a session for the given session ID.
Inputs: sessionId (required).
session_terminateB
[Session] Terminate session. Terminates the session with the given session ID.
Inputs: sessionId (required).
session_terminateAllC
[Session] Terminate all sessions. Terminates all sessions.
Inputs: no named parameters.
session_terminateInactiveB
[Session] Terminate inactive sessions. Terminates all inactive sessions.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 149 tools
Many tools have overlapping or ambiguous purposes. For example, client_markChatUnread and chat_markUnread appear to do the same thing, as do client_sendSeen and chat_sendSeen. client_getChats and post_client_getChats are nearly identical except for HTTP method, and message_forward's description incorrectly says 'Delete a message from the chat', which is a copy-paste error that causes severe confusion.
The naming mostly follows an entity_verb pattern (e.g., client_getChats, message_react, groupChat_addParticipants), but there are notable exceptions. post_client_getChats uses a non-standard 'post_' prefix, groupChat uses camelCase while other entities are lowercase, and ping and localCallbackExample lack any entity prefix. These inconsistencies break the otherwise predictable pattern.
With 149 tools, this server has an extreme number of operations. While it reflects a comprehensive WhatsApp Web API, it is far beyond the typical well-scoped range (3-15) and even beyond 25+, making it overwhelming and difficult for an agent to navigate. The sheer volume suggests a lack of curation.
The tool surface is remarkably comprehensive, covering client management, chats, messages, contacts, groups, channels, and sessions. It includes lifecycle operations for most entities (create, get, update, delete) and even provides catch-all runMethod tools to execute arbitrary methods. There are few if any significant gaps in the WhatsApp Web API coverage.
Maintenance
Related MCP Connectors
Free WhatsApp MCP server for ChatGPT and Claude: read and search chats, every send you approve.
WhatsMCP connects Claude and other MCP-compatible AI agents directly to WhatsApp. Send and receive text, images, documents, and voice notes; manage groups (create, add/remove members, promote admins); look up contacts and profiles; follow channels; and read call and message history — all through a standard MCP interface. For voice use cases, WhatsMCP offers SIP-based calling plans (inbound-only, or full inbound/outbound) so AI voice agents can answer and place WhatsApp calls, plus low-latency WebSocket integrations with voice agent providers like ElevenLabs. Multiple WhatsApp accounts can be paired and managed per workspace, with webhook support for real-time inbound message delivery to your own infrastructure.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Read-only WhatsApp MCP for your AI agent: it reads the chats you choose. Try the public demo.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP (Multi-Agent Conversation Protocol) Server that enables interaction with the WhatsApp Business API, allowing agents to send messages, manage media, and perform other WhatsApp business operations through natural language.1-
- AlicenseNot gradedqualityBmaintenanceWhatsApp MCP server that exposes messaging, groups, contacts, and profile management as tools and resources for AI agents, supporting Baileys and Meta Cloud API.272 npm28MIT
- AlicenseNot gradedqualityBmaintenanceMCP server exposing WhatsApp Cloud API operations as tools for AI agents like Claude Code, Cursor, and Codex.MIT
- FlicenseNot gradedqualityDmaintenanceRemote MCP server for Leporis WhatsApp Business platform, enabling AI agents to send and read WhatsApp messages through exposed REST API tools.-