Model Context Protocol
Give your agent 139 messaging tools
Point Claude Code or Cursor at one URL and sign in — no token to copy, no credential in a config file. Codex and ChatGPT connect with the same bearer token the REST API uses. No wrapper functions to write, no tool schemas to maintain, no per-message billing to model.
Terminal
$ claude mcp add --transport http waapi \ https://waapi.app/mcp/waapi \ --header "Authorization: Bearer $WAAPI_TOKEN"
Terminal — no token to copy
$ claude mcp add --transport http waapi https://waapi.app/mcp/waapi
No --header needed. The first connection attempt opens your browser to sign in and grant access; after that, Claude Code reconnects on its own.
~/.codex/config.toml
[mcp_servers.waapi] url = "https://waapi.app/mcp/waapi" headers = { Authorization = "Bearer $WAAPI_TOKEN" }
ChatGPT (Team / Enterprise)
Settings → Connectors → Add custom connector Name WaAPI URL https://waapi.app/mcp/waapi Auth Bearer token: $WAAPI_TOKEN
~/.cursor/mcp.json
{
"mcpServers": {
"waapi": {
"url": "https://waapi.app/mcp/waapi",
"headers": {
"Authorization": "Bearer $WAAPI_TOKEN"
}
}
}
}
~/.cursor/mcp.json — no token to copy
{
"mcpServers": {
"waapi": {
"url": "https://waapi.app/mcp/waapi"
}
}
}
No headers block needed. Cursor opens your browser to sign in and grant access on first connect.
Listed in the official Model Context Protocol registry as app.waapi/waapi — a domain-verified name, granted only after the registry checked a signature against this domain.
What the agent can actually reach
Not a send-message wrapper. The full surface of the API is exposed as individual tools, so an agent can read a conversation, decide, and act without you writing the intermediate steps.
25 Messages
- waapi_create_poll
- Create poll message
- waapi_delete_message_by_id
- Delete message by id
- waapi_download_media
- Download media from message
- waapi_edit_message
- Edit a message
- waapi_edit_scheduled_event
- Edit a scheduled event message
- waapi_fetch_messages
- Fetch messages from a chat
- waapi_forward_message
- Forward a message
- waapi_get_message_by_id
- Get message by ID
- waapi_get_message_info_by_id
- Get message info by id
- waapi_get_message_mentions
- Get message mentions
- waapi_get_pinned_messages
- Get all pinned messages in a chat
- waapi_get_poll_votes
- Get poll votes
- waapi_get_reactions
- Get message reactions
- waapi_pin_message
- Pin message
- waapi_react_to_message
- React to message
- waapi_search_messages
- Search messages
- waapi_send_event
- Send a scheduled event message to a chat
- waapi_send_location
- Send location
- waapi_send_media_message
- Send a media message (image, video, audio, document)
- waapi_send_text_message_to_chat
- Send a text message to a chat
- waapi_send_vcard
- Send vCard
- waapi_star_message
- Star message
- waapi_unpin_message
- Unpin message
- waapi_unstar_message
- Unstar message
- waapi_vote_on_poll
- Cast votes on a poll message
23 Client
- waapi_accept_call
- Accept call
- waapi_client_status_of_instance
- Get the current client status of an instance (booting, qr, authenticated, ready, disconnected, etc.)
- waapi_create_call_link
- Generate a video or voice call link
- waapi_end_call
- End call
- waapi_get_privacy_settings
- [BETA] Get the current account privacy settings (last seen, online, profile picture, about, group add, read receipts, call add, messages).
- waapi_logout
- Logout
- waapi_play_call_audio
- Play call audio
- waapi_play_call_video
- Play call video
- waapi_reboot
- Reboot instance
- waapi_reject_call
- Reject call
- waapi_request_pairing_code
- Request pairing code
- waapi_retrieve_basic_client_information
- Retrieve basic client information (display name, phone number, profile picture) of the authenticated user
- waapi_retrieve_qr_code
- Retrieve the QR code for authenticating an instance. The instance must be in "qr" status.
- waapi_revoke_status_message
- Revoke (delete) your own status/story message
- waapi_send_event_response
- Send an RSVP response to a scheduled event (going, not going, maybe)
- waapi_send_presence_available
- Send presence available
- waapi_send_presence_unavailable
- Send presence unavailable
- waapi_set_device_name
- Set the device name and/or browser name for the connection
- waapi_set_display_name
- Set display name
- waapi_set_privacy_setting
- [BETA] Set a single privacy category for the account. Categories: readReceipts, lastSeen, online, profilePicture, about, groupAdd, callAdd, messages. Allowed values depend on the category (all, contacts, contact_blacklist, none, known, match_last_seen).
- waapi_set_status
- Set status
- waapi_show_call_image
- Show call image
- waapi_start_call
- Start call
22 Chats
- waapi_add_customer_note
- Add or edit a customer note on a contact (Business feature)
- waapi_archive_chat
- Archive chat
- waapi_clear_chat_messages
- Clear chat messages
- waapi_delete_chat_by_id
- Delete chat by id
- waapi_get_chat_by_id
- Get chat by id
- waapi_get_chat_labels
- Get chat labels
- waapi_get_chats
- Get all chats
- waapi_get_chats_by_label_id
- Get chats by labelId
- waapi_get_customer_note
- Get a customer note for a contact (Business feature)
- waapi_get_disappearing_durations
- [BETA] Get the list of allowed disappearing-messages durations (in seconds) for the current account. Durations are server-controlled and may vary per account/region.
- waapi_get_disappearing_messages
- [BETA] Get the current disappearing-messages timer for a chat. Returns duration (seconds) and the setting timestamp.
- waapi_mark_chat_unread
- Mark chat as unread
- waapi_mute_chat
- Mute chat
- waapi_pin_chat
- Pin chat
- waapi_send_seen
- Mark chat messages as seen (blue ticks)
- waapi_send_stop_typing
- Stop typing indicator
- waapi_send_typing
- Send typing state
- waapi_set_disappearing_messages
- [BETA] Set the disappearing-messages timer for a chat. Works for private chats and groups (groups require admin). Common values in seconds: 0 (off), 86400 (24 hours), 604800 (7 days), 7776000 (90 days).
- waapi_sync_chat_history
- Sync chat history
- waapi_unarchive_chat
- Unarchive chat
- waapi_unmute_chat
- Unmute chat
- waapi_unpin_chat
- Unpin chat
16 Contacts
- waapi_block_contact
- Block a contact
- waapi_delete_contact
- Delete contact
- waapi_get_blocked_contacts
- Get blocked contacts
- waapi_get_broadcast
- Get status broadcast details for a contact
- waapi_get_common_groups
- Get common groups with contact
- waapi_get_contact_about_info
- Get contact about info
- waapi_get_contact_by_id
- Get contact details by ID
- waapi_get_contacts
- Get all contacts
- waapi_get_country_code
- Get country code
- waapi_get_formatted_number
- Get formatted number
- waapi_get_lid
- Resolve a contact's Linked ID (LID) and phone number in either direction: pass phone-number IDs (number@c.us) to get their LID, or pass Linked IDs (number@lid) to get the phone number.
- waapi_get_number_id
- Get chat ID from phone number
- waapi_get_profile_pic_url
- Get profile picture URL
- waapi_is_registered_user
- Is registered user
- waapi_unblock_contact
- Unblock a contact
- waapi_upsert_contact
- [BETA] add and update contact
15 Groups
- waapi_accept_group_invite
- Accept group invite
- waapi_accept_group_member_requests
- Approve group membership requests
- waapi_accept_invite
- Accept group invite
- waapi_add_group_participant
- Add group participant
- waapi_create_group
- Create group
- waapi_demote_group_participant
- Demote group participant
- waapi_deny_group_member_requests
- Deny group membership requests
- waapi_get_group_info
- Get group info
- waapi_get_group_member_requests
- Get group membership requests
- waapi_get_group_participants
- Get group participants
- waapi_get_invite_info
- Get group invite info
- waapi_promote_group_participant
- Promote group participant
- waapi_remove_group_participant
- Remove group participant
- waapi_update_group_info
- Update group info
- waapi_update_group_settings
- Update group settings
8 Communities
- waapi_create_community
- [BETA] Create a new Community (parent group containing subgroups). When createGeneralChat is true (default), the service also provisions a default "General" announcement subgroup.
- waapi_get_communities
- [BETA] Get all Communities the instance is a member of.
- waapi_get_community_by_id
- [BETA] Get a specific Community by its ID.
- waapi_get_community_subgroups
- [BETA] Get all joined subgroups of a Community as full chat instances. Avoids N+1 roundtrips.
- waapi_leave_community
- [BETA] Leave a Community as the current user.
- waapi_link_community_subgroup
- [BETA] Link one or more existing standalone groups to a Community as subgroups.
- waapi_send_community_announcement
- [BETA] Post an announcement to a Community. Supports text (message), URL-based media (mediaUrl with optional mediaCaption/mediaName), and broadcast targeting. target="general" (default) posts only to the default announcement subgroup (reaches every member) and returns the message result synchronously. target="all" broadcasts sequentially to every linked subgroup and is ALWAYS dispatched asynchronously — the response contains a reference you can poll via the request endpoint, not the message payload. If both message and mediaUrl are provided (without mediaCaption), message is used as the media caption.
- waapi_unlink_community_subgroup
- [BETA] Unlink one or more subgroups from a Community. They become standalone groups again.
7 Business profile
- waapi_create_quick_reply
- [BETA] Create a new quick reply for the business account. Returns the created quick reply with its generated id.
- waapi_delete_quick_reply
- [BETA] Delete a quick reply by id.
- waapi_get_business_categories
- [BETA] List the available business categories. Pass a parent category id to drill down into sub-categories, or omit it to get the top level.
- waapi_get_business_profile
- [BETA] Retrieve a business profile. Defaults to the authenticated account. Only WhatsApp Business accounts expose a profile (description, email, website, address, categories, business hours).
- waapi_get_quick_replies
- [BETA] List all quick replies configured on the business account. Returns id, shortcut, message, usage count and keywords. Only Business accounts have meaningful quick replies.
- waapi_set_business_profile
- [BETA] Update the authenticated business account's profile. Only fields that are provided will be changed. Requires a WhatsApp Business account. Note: the profile picture is managed separately via the profile picture endpoints.
- waapi_update_quick_reply
- [BETA] Update an existing quick reply by id. Only provided fields are changed; omitted fields keep their current value.
6 Instances
- waapi_create_instance
- Create a new instance
- waapi_delete_instance
- Delete an instance permanently
- waapi_get_request_status
- Get the status of an async request by its reference UUID (from fire-and-forget requests)
- waapi_list_instances
- List all your instances
- waapi_retrieve_instance
- Retrieve details of a specific instance
- waapi_update_instance
- Update an instance (name, webhook settings)
6 Channels
- waapi_create_channel
- Create a channel
- waapi_get_channel_by_id
- Get channel by id
- waapi_get_channels
- Get channels
- waapi_search_channels
- Search channels
- waapi_subscribe_to_channel
- Subscribe to channel
- waapi_unsubscribe_from_channel
- Unsubscribe from channel
5 Stories
- waapi_get_status_privacy
- [BETA] Get the current Status privacy setting for this instance. Returns the audience type ("contact", "allow-list", or "deny-list") and the list of configured contacts (when applicable).
- waapi_get_stories
- [BETA] get stories — returns both media stories (key: stories) and text/bio statuses (key: textStatuses)
- waapi_post_status
- [BETA] Post a text or media status/story. Provide `content` for a text status (with optional `backgroundColor` ARGB integer and `fontStyle` 0-7), or `mediaUrl` (publicly reachable URL) plus optional `mediaCaption` for a media status. Optional `audience` restricts who can see this status — note that this changes the persistent account-level privacy setting and is synchronized to all linked devices.
- waapi_revoke_status
- Revoke (delete) your own status/story message
- waapi_set_status_privacy
- [BETA] Configure who can see Status posts from this instance. Set `type` to "all" for all contacts, "allow" to restrict visibility to a specific list of contacts, or "deny" to exclude specific contacts. ⚠️ This is a persistent account-level setting and is synchronized to all linked devices.
3 Labels
- waapi_change_chat_labels
- Change chat labels
- waapi_get_label_by_id
- Get label by id
- waapi_get_labels
- Get all labels
3 Webhooks
- waapi_create_webhook_subscription
- Subscribe a URL to receive instance events. Subscribing an already-registered URL again returns that existing subscription instead of creating a duplicate.
- waapi_delete_webhook_subscription
- Remove a webhook subscription from an instance
- waapi_list_webhook_subscriptions
- List the webhook subscriptions registered on an instance
139 tools in total, counted from the server definition rather than estimated. Open a group to see every tool it contains.
Why this beats a function wrapper
The schema is the contract
Each tool declares its own parameters, so the agent gets a typed description instead of guessing at an HTTP body. Mis-shaped calls fail at the boundary, not three steps later.
Read, then act
Fetching chats, contacts and group members are tools in their own right. An agent can look up who it is talking to before replying, in one session, without a retrieval layer you maintain.
Agents are chatty; billing is not
An agent loop can fire dozens of calls to resolve one question. Billing is a flat rate per connected account, so exploratory tool use does not turn into a line item.
MCP questions
Setup, transport and what an agent is allowed to do.
-
Anything that speaks the Model Context Protocol over HTTP — Claude Code, Codex, Cursor and ChatGPT are the ones we document. The server is a standard remote MCP endpoint, so a client we have not listed will still connect.
-
Two ways, and neither is deprecated. Paste the same bearer token used by the REST API — one token covers the MCP server, the n8n node and both PHP packages, so nothing extra is issued or rotated separately. Or, if your client supports OAuth (Claude and others do), connect by signing in instead: the client discovers the authorization flow automatically and no token ever needs copying into its config.
-
Scope it with the token you hand over, and point the agent at a dedicated connected account rather than your main one. An agent with a token can use every tool that token permits.
-
Not on our side. Pricing is per connected account per month with unlimited messages, so the number of tool calls an agent makes while reasoning does not change the bill.
-
Yes. The tools act on a real linked account, so connect one in the dashboard and scan the code before pointing an agent at it. The free trial is enough to try the whole flow.
Point an agent at it
Connect an account, copy one line of config, and your agent has 139 tools.