Orientation 5
List the WhatsApp numbers this token can access. Returns each account id, display name and phone number. Call this first: every other tool takes an account_id from here.
Needs mcp:read · do not retry automatically.
List conversations, most recently active first. Optionally filter to one account or by name. Conversations outside this token’s scope (e.g. non-business chats on a business-only token) are never returned.
Needs mcp:read · do not retry automatically.
account_id string- Restrict to one account (from list_accounts). Omit for all.
query string- Case-insensitive name filter.
limit integer- Max conversations to return, 1-100. Default 30.
List saved contacts with their names and phone numbers.
Needs mcp:read · do not retry automatically.
account_id string- Restrict to one account. Omit for all.
query string- Case-insensitive name/number filter.
limit integer- Max contacts to return, 1-100. Default 100.
Whether a number is connected, whether WhatsApp has time-limited its outbound reach (and until when), and when it last finished a history import. Check this before concluding that a send failed for any other reason, or that a conversation has no messages.
Needs mcp:read · do not retry automatically.
account_id string, required- The account (from list_accounts).
How much is unread across the complete scope, with exact message and conversation totals. Returns at most the newest 100 unread conversations and says how many were omitted: the quickest way to answer "what needs me?" without listing everything.
Needs mcp:read · do not retry automatically.
account_id string- Restrict to one account. Omit for all in scope.
Reading and search 4
Read the most recent messages of one conversation, oldest first. Text messages carry their body; attachments are described by kind and caption.
Needs mcp:read · do not retry automatically.
account_id string, required- The account the conversation belongs to.
chat_id string, required- The conversation id from list_chats, e.g. 97455512345@c.us.
limit integer- Max messages, 1-100. Default 30.
Literal, case-insensitive substring search across every conversation in scope. Returns matching messages with their conversation and timestamp, newest first.
Needs mcp:read · do not retry automatically.
query string, required- Literal case-insensitive substring (3-160 characters, including a 3-character letter/number run).
account_id string- Restrict to one account. Omit for all.
limit integer- Max results, 1-50. Default 20.
Search everything in scope - conversations and the messages inside them - and return exactly `{results:[{id,title,url}]}` with ids you can pass to `fetch`. Use this to find material before reading it in full.
Needs mcp:read · do not retry automatically.
query string, required- Literal case-insensitive substring (3-160 characters, including a 3-character letter/number run).
Retrieve one item returned by `search`, as `{id,title,text,url,metadata}`. For a conversation the text is its recent history; for a message it is the message with surrounding context. A stale or unavailable id returns a generic error.
Needs mcp:read · do not retry automatically.
id string, required- The id from a `search` result.
context_limit integer- Maximum recent context messages to include, 1-60. Default 20.
Collections 5
Photos and videos exchanged in conversations in scope, newest first. Chain with view_image or video_frames to actually look at one.
Needs mcp:read · do not retry automatically.
query string- Case-insensitive match on caption or conversation name.
account_id string- Restrict to one account. Omit for all in scope.
kind string- 'image' or 'video'. Omit for both.
direction string- 'sent' or 'received'. Omit for both.
days integer- Only media from the last N days.
limit integer- Max results, 1-50. Default 20.
Every document (PDF, Office file, archive, ...) exchanged in conversations in scope, newest first. Filter by text, kind, direction or age.
Needs mcp:read · do not retry automatically.
query string- Case-insensitive match on filename, caption or conversation name.
account_id string- Restrict to one account. Omit for all in scope.
kind string- One of: pdf, doc, sheet, slides, text, archive, other.
direction string- 'sent' or 'received'. Omit for both.
days integer- Only documents from the last N days.
limit integer- Max results, 1-50. Default 20.
Read the linked number’s current public display name from WhatsApp and MobileB’s last-set copy of its About line. WhatsApp has no About read API, so the result explicitly marks that field as a possibly stale local copy.
Needs mcp:read · do not retry automatically.
account_id string, required- The account.
Messages the owner starred, newest first, across conversations in scope.
Needs mcp:read · do not retry automatically.
account_id string- Restrict to one account. Omit for all in scope.
limit integer- Max messages, 1-50. Default 20.
Messages queued to send later in a conversation, soonest first. Use before scheduling another, so the same thing is not queued twice. Returns exact totals when the bounded page omits later entries.
Needs mcp:read · do not retry automatically.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation id (from list_chats).
limit integer- Max entries, 1-100. Default 30.
Seeing and hearing 6
The soundtrack of a video, on its own, as audio you can listen to. Often the fastest way to understand a clip: the words are usually in the audio, and this is a fraction of the size of the video. Pair it with video_frames when you need to see as well as hear.
Needs mcp:read · do not retry automatically.
account_id string, required- The account.
chat_id string, required- The conversation.
message_id string, required- The video message (an id= from read_messages).
A section of a video between two timestamps, returned as an mp4 file. Cut exactly where you ask, re-encoded small. Prefer video_frames or video_audio unless you genuinely need the moving picture: a clip is far larger than either, and most questions about a video are answered by what it shows or what is said. Sections over about 30 seconds are usually too large to return.
Needs mcp:read · do not retry automatically.
account_id string, required- The account.
chat_id string, required- The conversation.
message_id string, required- The video message (an id= from read_messages).
start_sec number, required- Where the section starts, in seconds.
end_sec number, required- Where it ends, in seconds. Must be after start_sec.
max_width integer- WIDTH in pixels, 160-1280. Default 640. Height follows the aspect ratio, so a portrait clip comes back taller than this; small videos are scaled up to it.
What was said in a voice note, audio message or video, as text. Runs on this server - nothing leaves it - understands dialectal Arabic, English and most languages, and detects the language itself. Results are cached: transcribing the same message twice is free. Subject to the owner’s daily transcription quota; a long clip can take a minute or two, and the call waits for it. Prefer this over play_audio when you need the words rather than the sound.
Needs mcp:read · do not retry automatically.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation.
message_id string, required- The voice, audio or video message (an id= from read_messages).
Return a voice note or audio message as audio you can listen to, the same way view_image returns a picture. WhatsApp voice notes are opus in an ogg container. If you cannot interpret audio yourself, the bytes are still returned for a client or another tool that can: this does not transcribe anything on its own.
Needs mcp:read · do not retry automatically.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation.
message_id string, required- The voice or audio message (an id= from read_messages).
Look at a video: returns still frames as images you can analyze, each labeled with the moment it was taken. By default they are spread evenly across the whole clip. Narrow to a section with start_sec/end_sec, and set fps to sample at a rate instead: "2 fps between 10 and 20 seconds" is 21 frames. Ask for more frames for longer or fast-moving clips.
Needs mcp:read · do not retry automatically.
account_id string, required- The account the conversation belongs to.
chat_id string, required- The conversation id from list_chats.
message_id string, required- The video message id, as given by read_messages or search_messages.
count integer- How many frames, 1-48. Default 4. With fps it becomes an upper bound instead of the target.
max_width integer- WIDTH of each frame in pixels, 160-1280. Default 640. Height follows the aspect ratio, so a portrait clip comes back taller than this; small videos are scaled up to it.
start_sec number- Only sample from this many seconds in. Default 0.
end_sec number- Only sample up to this many seconds. Default the end of the video.
fps number- Frames per second across the window, e.g. 2. Omit to spread `count` evenly instead.
Look at a photo or sticker in a conversation: returns the image itself so you can describe or read what is in it. Use it whenever a message is an image and its content matters.
Needs mcp:read · do not retry automatically.
account_id string, required- The account the conversation belongs to.
chat_id string, required- The conversation id from list_chats.
message_id string, required- The image message id, as given by read_messages or search_messages.
Share visibility 2
The owner’s non-revoked offers and grants for individual conversations in this token’s scope: recipient, permission, status, and expiry. A row is current access only when its status and expiry say so. Reports share metadata only: never message content. Access other people granted to the owner is intentionally not inherited by the owner’s agents. Returns newest first, with exact totals when the bounded page omits older shares.
Needs mcp:read · do not retry automatically.
limit integer- Max shares, 1-100. Default 30.
The owner’s audit trail for share lifecycle events (invited, accepted, declined, revoked, left, or permission changed) and scoped access (opened or replied), with actor and time. Never includes message content, the reader’s IP, or their device.
Needs mcp:read · do not retry automatically.
share_id string- Restrict to one share (from list_shares). Omit for all.
limit integer- Max entries, 1-100. Default 30.
Sending 4
Send a file from the owner’s WhatsApp number. Two ways, and prefer the first: give from_message_id to re-send a file that already exists in one of their conversations (a photo they were sent, a document from a thread), or give data as base64 for something you produced: a report, a chart, an export. It cannot be unsent. Photos, video, audio and common documents only; executables and archives are refused.
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation to send it to.
from_message_id string- Re-send the file attached to this message (an id= from read_messages). Its conversation must be in scope. Use this instead of data whenever the file already exists. The stored file is still capped at 4 MiB for this MCP tool.
from_chat_id string- The conversation from_message_id is in. Defaults to chat_id.
data string- Canonical padded RFC 4648 base64 for something you produced. Max 4 MiB decoded. Use from_message_id when the file already exists; use the MobileB app for larger files.
filename string- Filename to show, e.g. "august-report.pdf". Required with data.
caption string- Optional caption sent with it.
as_voice_note boolean- Send audio as a voice note rather than an audio file. Valid only for detected audio, and voice notes cannot carry a caption.
Send a WhatsApp text message into a conversation. Only available when the token grants sending; the message is delivered from the linked number like any other. If its live advanced-security policy requires encrypted egress, the call is refused because agents do not hold the device keys. Use conversation_security to inspect that live policy separately from historical encrypted traffic.
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account to send from.
chat_id string, required- The conversation id from list_chats.
text string, required- The message text.
reply_to_message_id string- Optional message id from read_messages to reply to.
Send a map pin into a conversation. Coordinates only: this tool geocodes nothing, so pass a latitude and longitude you already hold and an optional place name to label it.
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account to send from.
chat_id string, required- The conversation id from list_chats.
latitude number, required- Latitude between -90 and 90.
longitude number, required- Longitude between -180 and 180.
title string- Optional name for the place, shown on the pin.
Send someone’s details as a contact card. Pass the name and number to share; use list_contacts first if you need to look one up.
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account to send from.
chat_id string, required- The conversation id from list_chats.
first_name string, required- First name on the card.
last_name string- Optional last name.
phone_number string, required- The number to share, digits with an optional leading +.
Message actions 6
Star or unstar a message. Private to the owner: nobody else sees it: and synced to their phone.
Needs mcp:read + mcp:send · safe to retry.
account_id string, required- The account.
chat_id string, required- The conversation.
message_id string, required- From the id= field in read_messages output.
starred boolean- True to star, false to unstar. Default true.
Add or clear an emoji reaction. VISIBLE TO EVERYONE in the conversation and attributed to the owner: it is a message from them, not a private note. Pass an empty emoji to clear.
Needs mcp:read + mcp:send · safe to retry.
account_id string, required- The account.
chat_id string, required- The conversation.
message_id string, required- From read_messages.
emoji string, required- A single emoji, or "" to remove the owner’s reaction.
Forward a message into another conversation. The copy leaves the owner’s number and cannot be unsent. Both conversations must be in this token’s scope: check where it is going before you send it.
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account.
chat_id string, required- The conversation the message is in.
message_id string, required- From read_messages.
to_chat_id string, required- The conversation to forward it into.
Replace the text of a message the owner sent. Recipients see it change, marked as edited: the original is not hidden from them. Only the owner’s own messages, and only recent ones (WhatsApp stops allowing edits after about 15 minutes).
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account.
chat_id string, required- The conversation.
message_id string, required- From read_messages. Must be a message the owner sent.
text string, required- The replacement text.
Retract a message the owner sent, for everyone. Recipients see "This message was deleted": they are told something was removed, so this is not a way to make a message never have happened. Irreversible.
Needs mcp:read + mcp:send · safe to retry.
account_id string, required- The account.
chat_id string, required- The conversation.
message_id string, required- From read_messages. Must be a message the owner sent.
Clear a conversation’s unread badge. NOTE: unless the owner has silent reading on for it, this also sends read receipts: the other person sees blue ticks and learns the message was read. Do not call it merely to tidy up; it tells someone something.
Needs mcp:read + mcp:send · safe to retry.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation id (from list_chats).
Organizing and time 4
Give a contact a private display name, visible only to the owner and never sent to WhatsApp. Pass an empty alias to clear it.
Needs mcp:read + mcp:send · safe to retry.
account_id string, required- The account.
contact_id string, required- The contact/conversation id, e.g. 447700900000@c.us.
alias string, required- The private name, or "" to clear.
Tidy the owner’s inbox: pin or unpin, mute or unmute, archive or unarchive, or mark unread. Tags are intentionally owner-only because tag-scoped agent grants depend on them. Pass only the fields to change. Archive state is also synchronized to the owner’s WhatsApp account.
Needs mcp:read + mcp:send · safe to retry.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation id (from list_chats).
pinned boolean- Pin to the top of the list.
muted boolean- Silence notifications.
archived boolean- Move out of the main list.
mark_unread boolean- Flag as unread so the owner comes back to it.
Queue a message to be sent from the owner’s WhatsApp number at a future time. It leaves as an ordinary message from them, with no indication an agent wrote it, and nobody need be present when it goes. Prefer send_message unless a later time was actually asked for. Cancellable with cancel_scheduled only while list_scheduled reports status pending; once delivery is leased, submitting, or unknown it may no longer be stoppable.
Needs mcp:read + mcp:send · do not retry automatically.
account_id string, required- The account (from list_accounts).
chat_id string, required- The conversation id (from list_chats).
text string, required- The message body.
send_at string, required- When to send it, ISO 8601 with a timezone, e.g. 2026-08-17T09:00:00Z. Must be in the future.
Cancel a message by the id from list_scheduled only while its status is pending. A leased, submitting, unknown, or already-sent message cannot be stopped or recalled.
Needs mcp:read + mcp:send · safe to retry.
scheduled_id string, required- From list_scheduled.
Not offered, on purpose: accepting, declining, leaving or upgrading a share, sharing with write access, sharing for more than 30 days, setting tags, and reading conversations that other people shared to the owner. The agent manual explains why, in words written for the agent.