wuapi MCP server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WUAPI_API_KEY | Yes | Your wuapi API key, e.g. wu_live_... Required for authentication. | |
| WUAPI_PROJECT | No | Act inside one project: its id or ext:<externalId>. Sent as Wuapi-Project. | |
| WUAPI_BASE_URL | No | API base URL. Must be https (or http on localhost). | https://api.wuapi.dev |
| WUAPI_MCP_READ_ONLY | No | Set to true to register only read-only tools. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_current_keyA | The organization, API key (name and last 4 characters, never the key) and project this server acts as. Call it first when you are unsure whether the key is an organization key or a project key. |
| list_accountsA | List the linked WhatsApp numbers (accounts), newest first, with their status: |
| get_accountA | One account: status, linked phone number, profile name, proxy location, disconnect reason and last error. |
| get_account_qr_codeA | The QR code to scan in WhatsApp (Settings > Linked devices > Link a device), as an image. Waits a few seconds for one when the account is still starting. QR codes rotate about every 20 seconds: call again if it expired. Returns the status instead when the account is already linked, and the pairing code when it links by phone number. |
| create_accountA | Start linking a new WhatsApp number. Pick |
| request_pairing_codeA | Link by phone number instead of QR code: returns an 8-character code the owner types in WhatsApp. It lives about 160 seconds. Fails with |
| reconnect_accountA | Restart the account's session. Use it when an account is |
| list_proxy_locationsA | Countries and cities a new number's proxy can exit from, for create_account and create_invitation. Search with |
| update_accountA | Change an account's settings: rename it, reject incoming calls automatically, turn on and tune its pacing (the anti-ban protections, off by default), choose whether the next link imports recent chats, choose which received media is downloaded right away (the rest on demand), choose the quality its images are sent at, save the contacts of new chats on the phone automatically ( |
| unlink_accountA | Unlink a WhatsApp number from wuapi. Both actions log the number out on WhatsApp and stop billing for it. Use Actions:
|
| set_presenceA | Presence as contacts see it: the account online or offline, typing or recording in a chat, and presence events from a contact. Typing shows until Actions:
|
| set_disappearing_timerA | Turn disappearing messages on or off: for one chat with |
| reject_callA | Reject a WhatsApp call ringing on the account, with the |
| send_textA | Send a text message from a linked number to a contact, group or channel. The message is queued and sent at the account's pace; the result has its id and |
| send_mediaA | Send a file: an image, video, audio, voice note (ogg/opus), document or sticker, with an optional caption. Give exactly one of |
| upload_fileA | Upload a file whose bytes you have (not a URL) so it can be sent: returns an upload whose |
| send_locationC | Send a map pin, with an optional place name and address. |
| send_contactC | Send one contact card, or up to 20 in one message. |
| send_pollA | Send a poll with 2 to 12 options. Votes arrive as |
| reply_to_messageA | Reply with text to a message, quoting it, in the same chat and from the same account. Works for messages in direct chats and groups. |
| react_to_messageA | React to a message with an emoji, as the account that received or sent it. An empty string removes the reaction. |
| get_messageA | One message with its status ( |
| list_messagesA | Messages wuapi stored, newest first: sent and received. Filter by account, chat and direction to read a conversation. Use list_chats to see which conversations an account has. |
| edit_messageA | Change the text of an outbound text message, within WhatsApp's edit window (about 15 minutes). A message still queued is sent with the new text. |
| delete_messageA | Delete an outbound message for everyone (or only on the linked devices with |
| cancel_messageA | Stop a message that is still |
| vote_in_pollA | Vote in a poll message as the account that received or sent it, with the names of its options (get_message shows them). An empty list retracts the vote. Returns the poll with its tally. |
| forward_messageA | Forward a stored message (received or sent) to up to 5 chats of the same account, the way WhatsApp forwards: the recipients see it as forwarded and no file is uploaded again. Works for text, images, videos, audio, voice notes, documents, stickers, locations and contact cards; polls, calendar events, reactions, view-once and deleted messages answer |
| star_messageA | Star a message on the phone and the other linked devices, or unstar it with |
| list_chatsA | An account's conversations, the one with the newest message first: each chat's name, picture id, latest message and WhatsApp's unread, pinned, archived and muted state. Only chats wuapi stored a message of. A state field that is missing ( |
| get_chatA | One conversation of an account: its name, its latest message in full, and WhatsApp's unread, pinned, archived and muted state (a field that is missing is not known yet, which is not the same as |
| mark_chat_readA | Clear (or set, with |
| send_read_receiptsA | Send read receipts (blue ticks) for inbound messages in a chat: the given ids, or every unread inbound message wuapi stores for it. |
| archive_chatB | Archive a chat on the linked devices, or unarchive it with |
| pin_chatA | Pin a chat to the top on the linked devices, or unpin it with |
| mute_chatA | Mute a chat's notifications for a while or until unmuted, or unmute it with |
| delete_chatA | Delete a chat from the account's linked devices (the phone and WhatsApp Web). The messages wuapi stores are kept and still readable with list_messages. This cannot be undone on the devices. |
| manage_labelsA | WhatsApp Business labels on chats and messages: create or edit a label, delete it, and add it to or remove it from a chat or a message. WhatsApp Business accounts only; others answer Actions:
|
| list_contactsA | An account's address book as its phone synced it to wuapi, ordered by saved name: each contact's id, number, |
| get_contactA | One contact of an account's address book, by number or |
| check_numbersA | Which of these phone numbers have WhatsApp, with their contact id, business name and username when known. Check before sending to a new number. |
| lookup_contactsA | About text, picture id, WhatsApp username, business name and device count of 1 to 50 contacts, asked from WhatsApp (the saved names are in list_contacts). Usernames cannot be searched: WhatsApp does not let a linked device resolve an @username, so look contacts up by number or |
| save_contactsA | Save contacts on the linked phone, in WhatsApp and in the phone's own address book, as if they were saved on the phone. Any number can be saved. Saves are queued (also while the account reconnects): each contact's Actions:
|
| lookup_whatsapp_infoA | Read details from WhatsApp through a linked number: a contact's profile picture or business profile, who a contact QR link or business message link points to, WhatsApp's AI bot directory, and the sticker pack or catalog order a message refers to. Nothing is changed. Actions:
|
| manage_block_listA | The account's block list on WhatsApp: list blocked contacts, block a contact (it can no longer message or call the account) or unblock it. Actions:
|
| manage_profileA | The linked number's own WhatsApp profile: its display name and About text, its profile picture, and its contact QR link (a Actions:
|
| manage_favorite_stickersA | The account's favorite stickers: the star tab of WhatsApp's sticker picker, which WhatsApp keeps in sync with the phone. List them, get one's file, favorite a sticker from a message or an uploaded WebP file, or remove one. Adding and removing change the list on the phone too. Actions:
|
| manage_privacyA | The account's WhatsApp privacy settings: who sees its last seen, profile picture, stories and online status, who may add it to groups or call it, and whether it sends read receipts. Actions:
|
| list_groupsA | Every group the account is in, read live from WhatsApp, with the participant count. A group inside a community has that community's id as |
| get_groupB | A group's name, description, settings and participants with their roles (member, admin, owner). |
| create_groupA | Create a WhatsApp group with the account as owner, inside a community when |
| add_group_participantsA | Add participants to a group the account administers. Each result says whether it worked; someone who cannot be added directly comes back with an invite code. |
| remove_group_participantsA | Remove participants from a group the account administers. |
| promote_group_participantsB | Make participants admins of a group the account administers. |
| demote_group_participantsA | Turn group admins back into regular members. |
| get_group_invite_linkA | The group's |
| reset_group_invite_linkA | Revoke the group's invite link and return a new one. Anyone holding the old link can no longer join with it. |
| leave_groupA | Make the account leave a group. To come back it has to be added or invited again. |
| manage_group_settingsA | Change a group the account administers: its name, description and settings (who can send, who can edit the info, whether joining needs approval, who can add members), and its picture. Actions:
|
| manage_group_joinsA | Joining groups: preview the group behind an invite link, join it, and, in a group that needs approval to join, list, approve or reject the pending requests (the account must be an admin). Actions:
|
| manage_communityA | WhatsApp communities: a community is a group with Actions:
|
| manage_channelA | WhatsApp channels (one-to-many broadcasts, ids end in Actions:
|
| post_storyA | Post a story from the account: text on a colored background, or an image or video with an optional caption, from a public URL ( |
| manage_storiesA | Stories (WhatsApp Status): read the ones the account's contacts posted in the last 24 hours, mark one as viewed, react or reply to it, and see or delete the ones the account posted (post with post_story). Reading stories tells the contact nothing; Actions:
|
| list_webhooksA | The webhook endpoints that receive events: URL, events and whether active. Signing secrets are never shown here. |
| create_webhookA | Register a public https URL to receive events as signed POST requests. The signing secret is not returned through this tool, to keep it out of the conversation: the user reveals it in the wuapi dashboard (Webhooks, rotate the endpoint's secret) and stores it with their server. |
| update_webhookA | Change a webhook endpoint's URL or events, or pause it ( |
| delete_webhookA | Delete a webhook endpoint. Its events stop at once, including deliveries still retrying. |
| get_webhookA | One webhook endpoint: its URL, events and whether it is active. Never its signing secret. |
| list_incoming_webhooksA | The incoming webhooks: secret URLs that send a WhatsApp message from one of your numbers to one fixed contact or group. Shows the name, the number, the destination and whether each is enabled. Never the URLs themselves. |
| get_incoming_webhookA | One incoming webhook: its number, destination and whether it is enabled. Never its URL. |
| create_incoming_webhookA | Create a secret URL that sends a WhatsApp message from one of the user's numbers to one fixed contact or group when something POSTs to it (JSON |
| update_incoming_webhookA | Rename an incoming webhook, or pause it ( |
| delete_incoming_webhookA | Delete an incoming webhook. Its URL stops working at once, for whatever still calls it. |
| list_projectsB | Projects: one per customer of a platform, each with its own numbers, keys, webhooks and usage. Organization keys only. |
| get_projectA | One project: name, external id, status, account limit and count. Organization keys only. |
| create_projectA | Create a project for one of your customers. Set |
| manage_projectA | Change a project (rename it, set its external id, metadata or account limit, suspend or resume it), delete it, and list or revoke its API keys. Suspending refuses every send and write in the project while reads and inbound messages keep working. Organization keys only. New project keys are created in the wuapi dashboard: no tool returns an API key. Actions:
|
| create_invitationA | Create a branded page ( |
| list_invitationsB | Invitations and their status: |
| get_invitationA | One invitation's status, and the linked |
| cancel_invitationA | Cancel an invitation: its link stops working. Completed invitations cannot be cancelled. |
| resend_invitationA | Give an invitation a new link and expiry and email it again when it has an |
| manage_brandingA | How the invitation page and email look to your customers: display name, logo, accent color, support link, and whether the "Powered by wuapi" footer shows. Organization keys only. Actions:
|
| get_usageA | The current month's bill so far: billable numbers, proxy traffic, and the total in cents (USD). Organization keys only. |
| get_usage_by_projectA | Numbers, proxy traffic and messages sent and received per project for a month, for rebilling your customers. With |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| send_message | Send a message to a number or group from one of your linked numbers. |
| setup_webhook | Register an https endpoint to receive incoming messages and delivery updates. |
| invite_customer | Create a project for a customer (if needed) and an invitation link they open to connect their own WhatsApp. |
| use_streams | Receive wuapi events live over Streams (no public endpoint needed), or choose Webhooks when the server has one. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| openapi | Every endpoint of the wuapi REST API with its parameters, bodies, responses and error codes. |
| docs | The complete wuapi docs as one Markdown file: conventions, every endpoint, webhook events and signature verification. |
| docs-index | A short index of the wuapi docs with links to each section. |
| webhook-events | Every event type a webhook endpoint can subscribe to. |
TDQS
Scored across 86 tools
Most tools target distinct resources or actions and the descriptions help distinguish them, but there are several overlapping contact-related tools (list_contacts, get_contact, lookup_contacts, check_numbers, lookup_whatsapp_info) and multiple management bundles that an agent could confuse without careful reading.
All tool names follow a consistent snake_case pattern, using either verb_noun (e.g. list_accounts, send_text, get_message) or manage_noun for multi-action bundles (e.g. manage_labels, manage_privacy). There is no mixing of conventions like camelCase or inconsistent verb styles.
86 tools far exceeds the recommended 3-15 range and even the 25+ 'too many' threshold. This enormous surface would overwhelm an agent's tool selection and routing, despite the domain being broad.
The server covers a wide range of WhatsApp API operations including accounts, messaging, groups, communities, channels, stories, webhooks, projects, and invitations, with near-complete lifecycle coverage for those areas. However, it lacks tools for message templates, interactive messages, and some business features, leaving minor gaps.