Skip to main content
Glama
wwebjs-mcp

wwebjs-mcp

by victor-halla

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 Web
  • On startup the server reads swagger.json and 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-key header is injected on every call from WWEBJS_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 version should print something; if you only have the old docker-compose binary, 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 up

Scenario 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:

  1. Base URL — how this MCP container reaches the wwebjs-api container.

  2. API key — the value of API_KEY on the wwebjs-api server.

  3. 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

WWEBJS_API_URL in .env

Its own container on a shared Docker network

http://<wwebjs-service-or-container-name>:3000

A container publishing port 3000 on the host

http://host.docker.internal:3000 (already wired in docker-compose.yml)

A remote server

http://<remote-host-or-domain>:3000 (or https://…)

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 .env
WWEBJS_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 sessionId argument on each tool call by the AI client (e.g. session_status, client_sendMessage). Just tell your AI agent which sessionId to use.

Scenario B — set up everything from scratch

Use this when you have no wwebjs-api yet. Run both containers together.

  1. In docker-compose.yml, uncomment the wwebjs-api service at the bottom and set in .env:

    WWEBJS_API_URL=http://wwebjs-api:3000
    WWEBJS_API_KEY=<choose-a-strong-key>
    MCP_TRANSPORT=http
  2. Start the stack:

    docker compose up --build -d
  3. Create 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/main

    Alternatively use phone pairing via the session_requestPairingCode tool.

  4. Once status reports connected, the session persists on disk (the sessions volume) 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 32

Leave 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 headers block if MCP_AUTH_TOKEN is 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 sessionId on every tool call. See the wwebjs-mcp skill 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:

  1. 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 — cloudflared reaches it over the compose network, no host port needed).

  2. Copy the tunnel token into .env:

    CLOUDFLARE_TUNNEL_TOKEN=<token from the dashboard>
  3. Set MCP_AUTH_TOKEN (see Authentication above) — the tunnel makes /mcp reachable from the public internet.

  4. Uncomment the cloudflared service at the bottom of docker-compose.yml and start it:

    docker compose up -d cloudflared
  5. Point your MCP client's url at https://<your-tunnel-hostname>/mcp instead 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

WWEBJS_API_URL

http://localhost:3000

Base URL of the wwebjs-api server

WWEBJS_API_KEY

–

Sent as x-api-key on every request

WWEBJS_TIMEOUT_MS

60000

Per-request timeout

MCP_TRANSPORT

stdio (image: http)

http or stdio

MCP_HTTP_HOST / MCP_HTTP_PORT

0.0.0.0 / 8080

HTTP bind address

MCP_AUTH_TOKEN

–

Optional bearer token for MCP clients

MCP_TOOL_ALLOWLIST

–

Only expose these tools (comma sep.)

MCP_TOOL_DENYLIST

–

Hide these tools (e.g. session_terminateAll)

LOG_LEVEL

info

debug/info/warn/error

CLOUDFLARE_TUNNEL_TOKEN

–

Token for the optional cloudflared service (HTTPS exposure)

Development

npm install
npm run build
MCP_TRANSPORT=stdio WWEBJS_API_URL=http://localhost:3000 WWEBJS_API_KEY=... npm start

Refresh the endpoint list from upstream at any time:

npm run fetch-swagger   # re-downloads swagger.json

Tool naming

Tools are named <segments> joined by _, dropping path params:

Endpoint

Tool

GET /session/start/{sessionId}

session_start

POST /client/sendMessage/{sessionId}

client_sendMessage

POST /message/react/{sessionId}

message_react

POST /groupChat/addParticipants/{sessionId}

groupChat_addParticipants

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 tools
channel_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_sendPresenceUnavailableB

[Client] Mark the client as unavailable

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

    C2.4/5.0

    Scored across 149 tools

    Disambiguation2/5

    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.

    Naming Consistency3/5

    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.

    Tool Count1/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      An 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
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      WhatsApp MCP server that exposes messaging, groups, contacts, and profile management as tools and resources for AI agents, supporting Baileys and Meta Cloud API.
      272 npm
      28
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Remote MCP server for Leporis WhatsApp Business platform, enabling AI agents to send and read WhatsApp messages through exposed REST API tools.
      -