Skip to main content
Glama
wuapidev

wuapi MCP server

Official
by wuapidev

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
WUAPI_API_KEYYesYour wuapi API key, e.g. wu_live_... Required for authentication.
WUAPI_PROJECTNoAct inside one project: its id or ext:<externalId>. Sent as Wuapi-Project.
WUAPI_BASE_URLNoAPI base URL. Must be https (or http on localhost).https://api.wuapi.dev
WUAPI_MCP_READ_ONLYNoSet 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

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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: ready can send; qr_ready waits for a QR scan; disconnected or failed need attention.

get_accountA

One account: status, linked phone number, profile name, proxy location, disconnect reason and last error. hasQrCode says a QR code is waiting to be scanned (get it with get_account_qr_code).

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 proxyLocation with list_proxy_locations (near where the phone is). Then show the QR code with get_account_qr_code, or pass pairingPhone to link with an 8-character pairing code instead. A linked number is billable; a new organization links its first number with no card. To let someone else link their own number, use create_invitation.

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 already_linked when the account is ready.

reconnect_accountA

Restart the account's session. Use it when an account is disconnected; when the link is no longer valid it produces a fresh QR code.

list_proxy_locationsA

Countries and cities a new number's proxy can exit from, for create_account and create_invitation. Search with q (sao finds Sao Paulo) or filter by country.

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 (contactAutoSave), or move its proxy location. Pacing applies from the next send. A proxy location change gives the number a new exit IP and reconnects it; it is refused within 10 minutes of the previous change. Returns the updated account with its pacing.

unlink_accountA

Unlink a WhatsApp number from wuapi. Both actions log the number out on WhatsApp and stop billing for it. Use logout to keep the account and its stored messages (reconnect_account then shows a new QR code to link again); use delete to remove the account for good.

Actions:

  • logout: Unlink the phone and stop billing, keeping the account and its messages. Returns the account. Needs confirm: true.

  • delete: Log out, delete the account and stop billing for it. Cannot be undone; fires no event. Needs confirm: true.

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 paused or the next message. With typing turned on in the account's pacing (update_account), sends show it on their own.

Actions:

  • online: Show the account as online to contacts.

  • offline: Show the account as offline.

  • typing: Show typing in a chat.

  • recording: Show recording audio in a chat.

  • paused: Clear the typing or recording indicator in a chat.

  • subscribe: Receive contact.presence_updated webhook events when the contact comes online, goes offline or types. Fails with not_supported when the account cannot receive presence events.

set_disappearing_timerA

Turn disappearing messages on or off: for one chat with chatId, or without it the account's default timer, which new chats start with. Messages already stored in wuapi are kept.

reject_callA

Reject a WhatsApp call ringing on the account, with the id and from of its call.received webhook event. To reject every call automatically, set rejectCalls with update_account.

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 queued status. Send only to people who expect it.

send_mediaA

Send a file: an image, video, audio, voice note (ogg/opus), document or sticker, with an optional caption. Give exactly one of url (a public URL wuapi downloads itself) or uploadId (a file uploaded before with upload_file). Images go out at the account's image quality (standard by default, as WhatsApp sends a photo); pass quality to change it for one image, or send the file as a document to deliver it untouched.

upload_fileA

Upload a file whose bytes you have (not a URL) so it can be sent: returns an upload whose id goes in uploadId of send_media or post_story. The file can be sent for 24 hours, to any number of chats. Up to 5 MB; the hosted server takes requests up to 1 MB, so about 700 KB of file there. For a file that is already at a public URL, skip this and pass the URL to send_media.

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 poll.voted webhooks and in the message's poll tally (get_message).

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 (queued, sent, delivered, read, failed, or received for inbound), content, and error when it failed. Received media is on demand by default (media.downloaded: false): pass fetchMedia: true to download it once and get a direct mediaFile.url that needs no API key.

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 forEveryone: false). A message still queued is cancelled instead and never sent. This cannot be undone.

cancel_messageA

Stop a message that is still queued from being sent. It ends failed with error code cancelled. Fails with not_queued when the message already left; use delete_message for those.

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 not_forwardable, and so does a contact's story (only a story the account posted, which is a message, can be forwarded). A message that is forwardedManyTimes goes to one chat per call. Returns a list with one queued message per chat, in the order of to; check each with get_message. To label new content as forwarded, use a send tool with forwarded: true instead.

star_messageA

Star a message on the phone and the other linked devices, or unstar it with starred: false. Returns the message.

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 (unread, unreadCount, pinned, pinnedAt, archived, muted) is not known to wuapi yet, which is not the same as false. Filter by archived, unread or type, or search names, numbers and recent text with q. Read a conversation with list_messages and the chat's id as chatId.

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 false). A chat wuapi stored no message of answers not_found.

mark_chat_readA

Clear (or set, with unread: true) the chat's unread badge on the linked devices. Sends no read receipts; use send_read_receipts for blue ticks.

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 archived: false.

pin_chatA

Pin a chat to the top on the linked devices, or unpin it with pinned: false.

mute_chatA

Mute a chat's notifications for a while or until unmuted, or unmute it with muted: false.

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 not_supported. There is no endpoint that lists labels: they arrive in label.updated webhook events, and upsert creates one under an id you choose.

Actions:

  • upsert: Create the label with this id, or rename or recolor it. Returns the label.

  • delete: Delete the label. Needs confirm: true.

  • label_chat: Add the label to a chat.

  • unlabel_chat: Remove the label from a chat.

  • label_message: Add the label to a message, as the account that sent or received it.

  • unlabel_message: Remove the label from a message.

list_contactsA

An account's address book as its phone synced it to wuapi, ordered by saved name: each contact's id, number, savedName, WhatsApp profile name, and the username and picture id seen so far. Only contacts the phone saved (or that have a business name); people the account just chatted with are in list_chats. Read from what wuapi stored, so about and deviceCount are not here: lookup_contacts asks WhatsApp for those. Search names, usernames and numbers with q.

get_contactA

One contact of an account's address book, by number or lid: id: its saved name, profile name, username and picture id as wuapi stored them. A number that is not saved on the phone answers not_found; lookup_contacts asks WhatsApp about any number.

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 lid: id.

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 phoneSync says pending, then synced or failed (not_on_whatsapp, account_offline), and contact.updated fires; the phone shows the name about a minute later. Removing a contact is not supported. backfill_auto_save queues the contacts of the account's existing direct chats, named with its auto-save templates (update_account contactAutoSave), at most 200 a day.

Actions:

  • one: Save one contact under savedName. Returns the contact with its phoneSync.

  • many: Save up to 500 contacts at once. Returns the batch id and each contact's status.

  • backfill_auto_save: Queue the auto-save of the contacts of the account's existing direct chats.

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:

  • contact_picture: The contact's profile picture URL, when the account can see it.

  • business_profile: A business contact's address, email, categories, time zone and opening hours.

  • resolve_link: Who a contact QR link or business message link points to, and its prefilled text. Fails with not_supported when WhatsApp does not offer it to the account.

  • bots: WhatsApp's AI bot directory as the account sees it. Fails with not_supported where WhatsApp does not offer it.

  • sticker_pack: A sticker pack and its stickers.

  • order: The products, quantities and totals of a catalog order received as a message.

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:

  • list: Blocked contacts, with their number and lid: id when known.

  • block: Block a contact. Needs confirm: true.

  • unblock: Unblock a contact.

manage_profileA

The linked number's own WhatsApp profile: its display name and About text, its profile picture, and its contact QR link (a https://wa.me/qr/... link that opens a chat with it).

Actions:

  • update: Change the display name, the About text, or both.

  • set_picture: Set the profile picture from an https URL or base64 JPEG. Returns the picture.

  • delete_picture: Remove the profile picture. Needs confirm: true.

  • get_contact_link: The account's contact QR link.

  • reset_contact_link: Revoke the contact QR link and return a new one. The old link stops working. Needs confirm: true.

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:

  • list: The favorites, newest first, from what wuapi stored (no call to WhatsApp). Each has media.url and media.downloaded; animated and emojis are null until its file was fetched.

  • get_file: A direct URL to one favorite's file that needs no API key. Fetches the file from WhatsApp the first time, which needs the account ready.

  • add: Favorite a sticker: pass messageId or uploadId, one of them. A sticker that is a favorite already is returned as is.

  • remove: Take a sticker out of the favorites. It can be favorited again.

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:

  • get: Every privacy setting.

  • get_story_privacy: Who sees the account's stories: its contacts, all but some, or only some.

  • update: Change one or more settings. Each setting is one change on WhatsApp. Returns every setting.

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 communityId (absent when it is in none), and default: true when it is the community's announcement group. Use get_group for the participants.

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 communityId is given. Participants whose privacy settings refuse being added get an invite code instead (see the result).

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 https://chat.whatsapp.com/... invite link. The account must be an admin.

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:

  • update: Change any of name, description, announce, locked, joinApproval and memberAddMode. Returns the group.

  • set_picture: Set the group picture from an https URL or base64 JPEG. Returns the picture.

  • delete_picture: Remove the group picture. Needs confirm: true.

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:

  • preview_invite: The group behind an invite code or link, without joining: name, description, size.

  • join: Join a group with an invite code or link. Returns the group id; a group that needs approval makes it a pending request instead.

  • list_requests: Pending requests to join the group.

  • approve_requests: Let these people in. Each result says whether it worked.

  • reject_requests: Turn these requests down. Each result says whether it worked.

manage_communityA

WhatsApp communities: a community is a group with community: true that links other groups. Create one, list its groups and members, and link or unlink groups (the account must admin both). get_group reads the community itself; send to it like a group. To create a new group inside a community, use create_group with communityId; list_groups shows each group's communityId.

Actions:

  • create: Create a community with the account as owner. Returns it.

  • list_groups: The groups linked to the community, marking its default (announcement) group.

  • list_members: Members across the community's linked groups.

  • link_group: Link a group into the community.

  • unlink_group: Unlink a group from the community. The group itself stays.

manage_channelA

WhatsApp channels (one-to-many broadcasts, ids end in @newsletter): list the ones the account follows or owns, read one and its posts, preview an invite, create a channel, follow, unfollow, mute and unmute, react to posts and count as a viewer. To post to a channel the account administers, use send_text or send_media with to set to the channel id.

Actions:

  • list: Channels the account follows or administers, with its role.

  • get: One channel: name, description, subscriber count, the account's role and whether it is muted.

  • preview_invite: The channel behind an invite code or link, without following it.

  • list_messages: The channel's recent posts, newest first, with view and reaction counts.

  • create: Create a channel with the account as owner. Returns it.

  • follow: Follow the channel.

  • unfollow: Stop following the channel.

  • mute: Mute the channel's notifications.

  • unmute: Unmute the channel.

  • react: React to a post with an emoji, or remove the reaction with an empty string.

  • mark_viewed: Count the account as a viewer of these posts.

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 (mediaUrl) or a file uploaded with upload_file (uploadId).

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; view does, so call it only when the user wants the contact to know. Contacts' stories arrive only for accounts with stories turned on.

Actions:

  • list: Contacts' stories, grouped by contact, the contact with the newest story first.

  • list_own: The stories the account posted in the last 24 hours, with how many contacts saw each.

  • get: One story. With fetchMedia, also its file's direct URL.

  • viewers: Who saw a story the account posted, with their reactions, the latest viewer first.

  • view: Tell the contact the account saw their story: the account then shows in the story's viewers. Only when the user asked for it. authorNotified: false in the answer means WhatsApp did not tell them (read receipts are off).

  • react: React to a contact's story with an emoji, or remove the reaction with an empty string. Only the story's author sees it.

  • reply: Reply to a contact's story with text: a message in the chat with its author, who sees it as a reply to their story.

  • delete: Delete a story the account posted, for everyone. Needs confirm: true.

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 (active: false) and resume 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 {text} or plain text, no API key). The URL is a credential, so it is not returned through this tool: the user copies it from the wuapi dashboard (Integrations, Incoming webhooks).

update_incoming_webhookA

Rename an incoming webhook, or pause it (enabled: false) and resume it. The destination cannot change: create another one.

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 externalId to your own customer id so you can address it as ext:<externalId>. Then invite the customer to link their number with create_invitation. Organization keys only.

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:

  • update: Change any of name, externalId, metadata, maxAccounts and status. Returns the project.

  • delete: Delete the project: its keys stop working at once, and its numbers are logged out and deleted in the background with its webhook endpoints. Needs confirm: true.

  • list_keys: The project's API keys, revoked ones included: name, last 4 characters, last use. Never the key itself.

  • revoke_key: Revoke one of the project's API keys. It stops working at once. Needs confirm: true.

create_invitationA

Create a branded page (url) where a customer links their own WhatsApp number to your project by QR code or pairing code, without an account on wuapi. Send them the url: it is returned only here. With inviteeEmail, wuapi can email it too.

list_invitationsB

Invitations and their status: pending, in_progress, completed (with the new accountId), failed, cancelled or expired.

get_invitationA

One invitation's status, and the linked accountId once completed.

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 inviteeEmail. The previous url stops working; send the new one from the result. An account the invitee already started is kept, so they resume where they left off.

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: The current branding.

  • update: Change any of the fields. Returns the branding.

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 projectId, that project only. Organization keys only.

Prompts

Interactive templates invoked by user choice

NameDescription
send_messageSend a message to a number or group from one of your linked numbers.
setup_webhookRegister an https endpoint to receive incoming messages and delivery updates.
invite_customerCreate a project for a customer (if needed) and an invitation link they open to connect their own WhatsApp.
use_streamsReceive 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

NameDescription
openapiEvery endpoint of the wuapi REST API with its parameters, bodies, responses and error codes.
docsThe complete wuapi docs as one Markdown file: conventions, every endpoint, webhook events and signature verification.
docs-indexA short index of the wuapi docs with links to each section.
webhook-eventsEvery event type a webhook endpoint can subscribe to.

TDQS

B3.4/5.0

Scored across 86 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count1/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues