You want to send a broadcast, check a report, or reply to a customer just by chatting with your own AI assistant (Claude, ChatGPT, Cursor), without opening the portal.
MCP (Model Context Protocol) is the standard way AI agents use outside services. WACO runs an MCP
server at https://waco.id/mcp. Install it once in your agent app, then just talk:
"Send to everyone labelled member: Hi {Nama}, weekend promo 20% off until Sunday." The agent
does the rest — and never sends before you have seen a preview and approved it.
What the agent can do
- Broadcast from plain text. Per-person parts go in curly braces such as
{Nama}or{Tagihan}. WACO builds the WhatsApp template, submits it to Meta, and the agent tracks approval (usually minutes to hours). You never need to know what a template, {{1}}, or a category is. - Recipients from a contact label or a list of numbers. Variables are filled from contact data (name and imported columns such as invoice/date); a value shared by everyone is given once.
- Mandatory preview. The agent shows the recipient count, three filled-in sample messages, and the estimated cost. Sending only works with that preview token, valid 30 minutes, and only after you approve.
- Reports: sent, delivered, read, replied, failed — whenever you ask.
- Running the AI Operator by chatting (for AI Operator subscribers): teaching new facts, distilling a website into knowledge, deciding on suggestions from chats the bot handed to a human, setting the tone, and testing answers — see Teaching the AI Operator through the agent.
- Existing approved templates can be reused, and reply to one customer (24-hour window).
- Database from chat. Paste a customer list (number, name, other columns) to the agent — kontak_impor puts it into the Contacts book under one label, ready for a broadcast. Sales just say: "prepare a greeting for these 300 people".
- Per-person report. blast_penerima lists who failed with the reason and its meaning, who was delivered, read, or replied — and who is not yet sent because of Meta's 24-hour quota (queued status; WACO resumes automatically, blast_status shows the quota and resume time).
- Images in broadcasts. Pass a public image URL (JPEG/PNG) to blast_siapkan — it becomes the message header.
- Message suggestions that pass Meta. The agent carries the template rules (utility vs marketing, what Meta rejects, how to write a greeting that gets replies), so it can propose the wording for you.
- Message log: the WhatsApp status of one message (sent, delivered, read, failed with the meaning of the error code) and a 30-day history for one number — incoming messages, outgoing statuses, API sends. The agent can answer "did my message arrive?" by itself.
Tool reference
| Tool | Purpose |
|---|---|
kontak_ringkas | Consenting contact count, labels with counts, data columns that can fill variables. |
kontak_impor | Put a customer list (number, name, other columns) into Contacts under one label. |
template_daftar | Meta-approved templates, for reuse. |
blast_siapkan | Plain text with {Nama} → template built & submitted to Meta; optional image header via URL. |
blast_dari_template | Prepare a broadcast from an existing approved template. |
blast_daftar / blast_status | Broadcast list and approval status; counts of queued, sent, delivered, read, replied, failed. |
blast_pratinjau | Recipients from a label or numbers, three filled-in samples, a 30-minute token. Required before sending. |
blast_kirim | Send, only with a preview token you approved. Max 5 per minute. |
blast_penerima | Per-person list: who failed (reason & meaning), sent, delivered, read, replied. |
kirim_pesan | Reply to one customer with free text (24-hour window). |
pesan_status / pesan_riwayat | WhatsApp status of one message ID; 30-day log for one number (incoming, outgoing statuses, API sends). |
| AI Operator — teach, tidy, and test the bot by chatting (needs the AI Operator subscription; top-ups and new brains stay in the dashboard) | |
asisten_ringkas | Brains you have, on/off, knowledge counts, pending suggestions, remaining quota with a breakdown of what it was spent on, account switches. |
asisten_pengetahuan_daftar / _tambah / _ubah / _hapus | Knowledge cards: list, teach one fact, edit or approve a draft, delete. |
asisten_pengetahuan_dari_sumber | A website URL or pasted text distilled into inactive draft cards — you approve the ones you want. |
asisten_pelajari_riwayat | Reads the team's chat history; the result becomes suggestions, never cards directly. |
asisten_usulan_daftar / asisten_usulan_putuskan | Questions the bot handed to a human and the human's answer; accept as knowledge or reject. |
asisten_atur | Bot name, tone (ramah/formal/santai), custom style guide, on/off. |
asisten_kanal | Which channels (WhatsApp, live chat, Instagram) the bot answers. |
asisten_sakelar_akun | Follow-up for quiet leads and new-customer alerts to the owner. |
asisten_uji | Ask the bot as if you were a customer and see the answer before switching it on. |
REST equivalents for every tool are in the API documentation (Blast & contacts, Messages).
Installing in claude.ai, step by step
- Open Settings → Connectors, press Add custom connector.
- Fill in Name: WACO. Fill in Remote MCP server URL:
https://waco.id/mcp. Claude reads the settings from the WACO server and marks several options "Detected". - Authentication: leave Always required (the one marked Detected). WACO requires sign-in for every tool.
- OAuth client: either option works with WACO — Use Anthropic's hosted client metadata (Anthropic's recommendation, no registration) or No client ID — register one automatically (marked Detected). Do not pick Use your own OAuth client.
- Additional request headers: leave empty. Advanced: leave as is.
- Press Add. WACO appears in the connector list; press Connect.
- A WACO window opens: sign in with your portal account, then press Allow. The window closes itself and the connector shows as connected.
- Try it in a new chat: "How many WACO contacts do I have per label?" — Claude calls kontak_ringkas. The portal's Developer menu now lists a key named "MCP: Claude"; revoke it there to disconnect.
ChatGPT: Settings → Connectors (or Apps) → add an MCP connector with the same URL; the WACO sign-in appears on first use. The remaining steps are alike.
New tools not showing? claude.ai stores the tool list when the connector is connected. Whenever WACO adds a tool, open Settings → Connectors → WACO → Disconnect then Connect again (remove and re-add if needed), then start a new chat.
Installing with an API key
For clients without OAuth sign-in, create an API key in the portal → Developer. Then:
Claude Code (terminal):
claude mcp add --transport http waco https://waco.id/mcp --header "Authorization: Bearer YOUR_API_KEY"
Cursor / Windsurf / JSON-configured clients:
{
"mcpServers": {
"waco": {
"url": "https://waco.id/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}
Claude Desktop (via the mcp-remote bridge):
{
"mcpServers": {
"waco": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://waco.id/mcp",
"--header", "Authorization: Bearer YOUR_API_KEY"]
}
}
}
n8n: the MCP Client node, HTTP Streamable transport, the URL above, an Authorization header.
Example conversation
- "How many contacts are labelled returning-customers?" → the agent calls kontak_ringkas.
- "Send them: Hi {Nama}, your service renews automatically this month. Reply here with any questions." → blast_siapkan; the template is submitted; the agent says it is waiting for Meta.
- A few minutes later: "Approved yet? If so, show me the preview." → blast_status, then blast_pratinjau: 412 recipients, 3 samples, estimated cost.
- "OK, send it." → blast_kirim with the preview token. Done; the report follows via blast_status.
Teaching the AI Operator through the agent
If you subscribe to the AI Operator, the same agent can look after your bot without opening the Assistant page. The daily routine benefits most: questions the bot handed to a human, together with the answer your team gave, wait for your decision one by one. Through the agent that becomes a five-minute conversation.
- "What couldn't the bot answer yesterday?" → the agent calls asisten_usulan_daftar and shows each customer question with the human answer.
- "Turn 1 and 3 into knowledge, drop 2." → asisten_usulan_putuskan three times. Accepted answers become active knowledge cards immediately.
- "Teach the bot: the office is closed on Saturdays and Sundays, chats are answered on Monday." → asisten_pengetahuan_tambah, one fact per card.
- "Read the pricing page on my website and turn it into knowledge." → asisten_pengetahuan_dari_sumber. The cards are created inactive; the agent shows their content and you choose which to activate (asisten_pengetahuan_ubah). Nothing is learned silently.
- "Ask the bot: what time do you open?" → asisten_uji. You see the exact answer a customer would get, or a note that the bot chose to hand over to a human, before anything is switched on.
- "Make the tone more casual and call customers 'Kak'." → asisten_atur. Tone and knowledge are kept apart on purpose: tone is how it answers, knowledge is what it may answer.
What stays in the dashboard: adding another assistant and topping up quota, since both are billing. Switches such as turning the bot on, choosing channels, or quiet-lead follow-up are only changed by the agent when you clearly ask for it.