wazap-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WAZAP_HOST | No | HTTP bind address. | 127.0.0.1 |
| WAZAP_PORT | No | HTTP bind port. | 8766 |
| OPENAI_API_KEY | No | Fallback API key for OpenAI-compatible transcription when WAZAP_TRANSCRIBE_API_KEY is not set. | |
| WAZAP_DATA_DIR | No | Where everything is stored. | ~/.wazap |
| WAZAP_NO_SHARE | No | Set to 1 to opt out of sharing a WhatsApp session between multiple wazap processes. | 0 |
| WAZAP_READ_ONLY | No | Do not register the write tools. Set to 1 to enable read-only mode. | 0 |
| WAZAP_TRANSPORT | No | stdio or http. | stdio |
| WAZAP_PUBLIC_URL | No | The https address agents reach the server at. Must be a bare origin with no path. With WAZAP_OAUTH_PASSWORD, turns OAuth on. | |
| WAZAP_RATE_LIMIT | No | Write tool calls per minute; 0 disables. | 20 |
| WAZAP_READ_TOKEN | No | HTTP bearer token that grants read-only access. Required to bind a non-loopback address without OAuth. | |
| WAZAP_TRANSCRIBE | No | local, openai or off. | off |
| WAZAP_WHISPER_BIN | No | Path to a whisper.cpp binary that is not on PATH. | |
| WAZAP_WRITE_TOKEN | No | HTTP bearer token that also unlocks write tools. | |
| WAZAP_WHISPER_MODEL | No | turbo, large-v3 or medium. | turbo |
| WAZAP_OAUTH_PASSWORD | No | What the consent page asks for. At least 8 characters. With WAZAP_PUBLIC_URL, turns OAuth on. | |
| WAZAP_TRANSCRIBE_URL | No | OpenAI-compatible base URL. | https://api.openai.com/v1 |
| WAZAP_NO_UPDATE_CHECK | No | Set to 1 to stop status asking npm for a newer version. | 0 |
| WAZAP_PERSIST_HISTORY | No | Keep chats and messages across restarts. | 1 |
| WAZAP_TRANSCRIBE_AUTO | No | Transcribe incoming voice notes in the background. Set to 0 to keep the tool and stop background work. | 1 |
| WAZAP_TRANSCRIBE_MODEL | No | Model at that URL. | gpt-4o-mini-transcribe |
| WAZAP_SYNC_FULL_HISTORY | No | Ask WhatsApp for a fuller history sync. | 0 |
| WAZAP_TRANSCRIBE_API_KEY | No | API key for OpenAI-compatible transcription. Never a flag; stored in .env. OPENAI_API_KEY is the fallback. | |
| WAZAP_TRANSCRIBE_LANGUAGE | No | Spoken language, e.g. ro. | auto |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| learnA | The guide to these tools: ids, account_id with several accounts, the workflows, the message shape and what to do about each error code. Read it once, before the other tools; it never touches WhatsApp. |
| get_statusA | Whether the account works: status (connected, not_linked, linking with its pairing code…), sync, how fresh the history is, webhook delivery, versions. accounts lists every account, with default. Call it on NOT_CONNECTED, NOT_LINKED or SYNC_IN_PROGRESS. |
| link_accountA | Pair wazap with the user's WhatsApp when get_status says not_linked, logged_out, session_corrupt or auth_failure. Show the user the code it returns: WhatsApp → Settings → Linked devices → Link a device → Link with phone number instead. Then poll get_status every 10 s until connected. |
| list_chatsA | Conversations, most recently active first: chat_id, name, type, unread count, last message, and whether archived, pinned, muted or left. Use it to find a chat_id. |
| read_messagesA | Read one chat, oldest to newest: the latest messages, or older ones with before (wazap asks the phone when the local history runs out). chat_id "status" reads the stories people posted, newest first, from the last hours (at most a day); they show nowhere else. |
| catch_upA | What the user missed, all accounts, within budget_tokens: waiting (every open ask of 14 days, whatever the window), mentions, calls, people, groups, stories. account_id narrows it to one account; get_status names them. The mark moves first; a lost answer is since: "previous". more.cursor: the rest. |
| rememberA | Keep what the user says about someone, locally, never on WhatsApp: a note, tags, details find_contact matches ({"relatie": "mama"}), or handled: true for an ask dealt with elsewhere. #private keeps their words out of what you did not ask about them by name; #no-catchup keeps them out of catch_up. |
| wait_for_messagesA | Wait for messages from other people, up to timeout_seconds, and return them with a cursor: pass it to the next call so nothing that lands between calls is missed. addressed_to_me wakes only for direct messages, mentions and replies to the user. For agents that stay on the line. |
| searchA | Find messages by meaning and by words at once, in every chat or one: a paraphrase or another language still hits. match: "words" for exact words (a number, a URL). since, until and from narrow it; coverage and freshness say how much history was searched. |
| get_messageA | One message in full: the message it quotes, each reaction with who left it, poll votes and event answers by person, its media, and on the user's own messages who it reached and who read it. Without account_id the id is looked for on every account. |
| find_contactA | Who a name, nickname, relationship ("mama"), group, number or id means, before drafting. resolved: contact.chat_id, with number, note, tags, details and, in a write session, context. ambiguous or not_found: ask the user; never send to a guess. A name on several accounts: see fix. tag: its people. |
| get_group_infoA | A group's name, description, owner and participants (up to 500), whether the account is admin, its settings (info_locked, member_add_mode, join_approval, disappearing_seconds), its community, and the invite link for an admin. Call it before manage_group. |
| get_mediaB | What a message's media holds: a voice note or audio as its transcript (kept once made; an API provider bills it), or with save_to its file; a photo attached as an image; any file saved at path on the machine running wazap. MEDIA_UNAVAILABLE: WhatsApp no longer has it. |
| send_messageA | Drafts text, media, polls, locations, forwards; sends nothing. Call it as soon as you have recipient and text: it returns draft_id and preview (recipient, number, exact text). Show that preview; confirm_send only on a yes to this text and recipient — a send in the same request is that yes. |
| edit_messageA | Replace the text of a message the linked account sent. WhatsApp allows it for 15 minutes after sending; later, send a correction instead. |
| react_to_messageA | React to a message with one emoji, or pass "" to take your reaction off. |
| confirm_sendA | Send a draft the user approved — this text, this recipient: the only call that sends, once per draft. A yes about something else: show the preview again and ask. Expired, missing or stale: draft again, show the new preview, ask again. SEND_OUTCOME_UNKNOWN: read_messages, never redo it unasked. |
| delete_messageA | Delete a message; confirm with the user first. for_everyone: true retracts it for everyone within 2 days: the account's own message, or anyone's in a group where it is admin. for_everyone: false removes any message from the linked account's devices only. |
| manage_chatA | Change a chat on WhatsApp at once, with no draft: archive, pin, mute, mark_read or mark_unread; pin_message (for everyone) or star_message on a message_id; clear or delete it for the linked account; block a person. Say what will change and wait for a yes. |
| manage_groupA | Create a group, join one from an invite (preview first, then confirm: true), or administer one: members, name, description, photo, invite link, join requests, settings, leave. Most actions need admin. Every change shows to all members at once: say what will change, wait for a yes. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| wazap-setup | Install, link or repair the WhatsApp connection. Use when the user wants to connect WhatsApp to Claude, when a WhatsApp tool returns NOT_LINKED, SESSION_EXPIRED or SESSION_CORRUPT, when `get_status` is anything but connected, or when the user asks how wazap works with Claude Desktop, Claude Code or HTTP. |
| whatsapp-groups | Catch up on a busy WhatsApp group. Use when the user asks what happened in a group, what was decided, what they are being asked to do there, or for a summary of a thread with many messages. Read-only. |
| whatsapp-inbox | Triage the user's WhatsApp. Use when they ask what they missed, what's unread, who is waiting on a reply, what needs attention today, or whom they forgot to answer. Read-only; it sends nothing and marks nothing read. |
| whatsapp-recall | Find something in the user's WhatsApp history. Use when they ask for an address, invoice, photo, document, link, phone number, date or a thing someone said or sent, or "what did X say about Y". Read-only. |
| whatsapp-send | Send, reply, forward, share a file or a location, react, create a poll, or change a group's photo on WhatsApp on the user's behalf. Use for any request that results in an outgoing WhatsApp message or a change others see. Find who the user means with find_contact first; messages draft first, and a group photo has no draft. Show the image, wait for a yes, then call manage_group set_picture. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Most tools have clearly distinct purposes (e.g., send_message vs. confirm_send vs. edit_message vs. delete_message are well-separated by lifecycle stage). However, manage_chat and manage_group both handle 'manage' actions across different resources, and get_message vs. read_messages could cause minor confusion despite different scopes.
The naming is predominantly verb_noun (get_status, list_chats, read_messages, send_message, edit_message, delete_message, find_contact, get_group_info, get_media). Minor deviations: 'learn', 'catch_up', 'remember', 'wait_for_messages' are less pattern-consistent but still readable and purposeful.
20 tools is on the higher end but justified for a WhatsApp integration covering accounts, chats, groups, messages, media, contacts, and search. Each tool addresses a distinct operation, though a few could potentially be consolidated (e.g., manage_chat and manage_group are broad).
The tool surface covers the full messaging lifecycle: linking accounts, listing/reading/searching messages, drafting/sending/editing/reacting/deleting, chat and group management, contact resolution, media retrieval, and catch-up. The inclusion of learn, get_status, and wait_for_messages fills operational gaps that agents would otherwise hit.