MCP
Connect Claude, Cursor or any MCP client to the remote WASync server. Six tools, no code on your side.
WASync runs a remote MCP server over Streamable HTTP. Add it to an MCP client and the agent gets WhatsApp tools with no code on your side.
https://cloudapi.wasync.app/api/mcpThat host is deliberate. The REST base URL and every human-facing link use
developers.wasync.app, but the MCP server URL, the OAuth endpoints and the
/.well-known/… documents are protocol identifiers clients have already
registered — they stay on cloudapi.wasync.app and must match byte-for-byte.
Do not "normalise" them.
Connect a client
For clients that read a config file (Claude Desktop, Cursor, …):
{
"mcpServers": {
"wasync": {
"url": "https://cloudapi.wasync.app/api/mcp"
}
}
}Authentication is OAuth 2.0 with PKCE, handled by the client: the first call opens a browser, you approve, and the client stores the tokens. There is no key to paste.
A client without native remote-MCP support can bridge over stdio:
npx mcp-remote https://cloudapi.wasync.app/api/mcpFind it in the registry
WASync is listed in the official MCP Registry as:
app.wasync/whatsappClients and directories that read the registry can find the server by name instead of pasting the URL.
The tools
| Tool | What it does | Needs |
|---|---|---|
list_whatsapp_connections | Lists the connections the grant may use, with status and licence state. Every other tool takes a connection id from here. | read |
get_whatsapp_connection | The current state of one connection: online or not, licence status and expiry. Read-only. | read |
read_whatsapp_messages | Stored messages, newest first, across every shared connection or one of them; paged with nextCursor. Nothing is sent and no read receipt is shown. | read |
send_whatsapp_message | Sends a text message from one connection to one recipient. The tool's description tells the model to confirm recipient and wording first: a WhatsApp message cannot be recalled. | send |
send_whatsapp_file | Sends a file (document, image, audio or video, up to 5 MB) with an optional caption. Give a direct https link in url (preferred) or base64 in data. Same confirm-first rule: it cannot be recalled. | send |
mark_whatsapp_messages_read | Marks one customer's inbound messages as read (blue ticks), by phone number or by a message id. | send |
They map onto GET /connections, GET /connections/{id}, GET /messages,
POST /messages (text and media) and POST /messages/read, and they obey the
same scopes — an agent can only do what the grant
allows.
Sending a file
send_whatsapp_file takes exactly one of url or data:
{
"connectionId": "conn_123",
"to": "40700000000",
"url": "https://files.example.com/offers/offer-2026.pdf",
"filename": "offer-2026.pdf",
"caption": "Here is the offer we discussed."
}urlmust be a directhttps://link to a file that anyone on the internet can open without logging in. WASync downloads it (up to 5 MB, 20 seconds) and takes themimetypefrom the file server's answer unless you pass one. Links that point at private networks, at WASync itself, or at a web page instead of a file are refused.datais the file as plain base64 (nodata:prefix), at most 5 MB decoded, and thenmimetypeis required. Preferurl: moving file bytes through a model's conversation is slow and costly.filenameis what the recipient sees (no slashes);captionis optional, up to 1024 characters.
Failures come back as tool errors with a stable code at the start of the
message: invalid_url, url_not_allowed, download_failed, file_too_large,
invalid_media, or send_failed: <reason> when WASync refused the send.
MCP or the REST API?
Use MCP when a human-supervised agent should be able to reach WhatsApp: answering from a chat client, drafting replies, looking things up. Use the REST API when your own software owns the behaviour and needs webhooks, idempotency keys, files larger than 5 MB or provisioning — none of which MCP exposes.
An OAuth grant is only ever issued over connections that already exist, so MCP cannot create a workspace's first connection. Create it with an API key first: Quickstart.