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.