Overview
MCP Server

SheetWA MCP

Run your WhatsApp API workspace from an AI assistant. Claude, Cursor, VS Code and any other MCP client can search contacts, send templates, run broadcasts, answer the inbox and manage auto replies for you.

tools
46
URL to connect
1
requests per minute
120
urlMCP server URL
https://backend.sheetwa.com/api/v3/mcp

Prerequisites#

  • A SheetWA workspace with a WhatsApp number connected through the WhatsApp API.
  • Owner or admin access to that workspace. Members cannot create keys.
  • An active WhatsApp API plan for anything that sends messages or switches an auto reply on. Reading data works on any plan.
  • An AI client that supports MCP, such as Claude Code, Claude Desktop, Cursor or VS Code.

Create an API key#

  1. 1

    Open API Keys

    In the SheetWA dashboard, open API Keys in the sidebar (https://app.sheetwa.com/waca-api-keys).

  2. 2

    Create a key

    Click Create API key, give it a name you will recognise later, like "Claude on my laptop", and pick an expiry.

  3. 3

    Copy it now

    The full key starts with sk_live_ and is shown only once. Copy it straight into your client's config.

Treat the key like a password

Anyone holding it can act in your workspace with your role. Keep it out of shared files and screenshots. If it leaks, revoke it on the API Keys page and it stops working on the next request.

Server URL#

Every client connects to the same Streamable HTTP endpoint. Send the key in the Authorization header.

textMCP server URL
https://backend.sheetwa.com/api/v3/mcp
textHeader
Authorization: Bearer sk_live_your_key_here

Keys go in the header only

A key passed in the URL query string is refused, so it never ends up in server logs or browser history.

Connect your client#

Pick your client, paste the snippet and swap in your key. Restart the client if it was already open.

Configure in Terminal

  1. 1Run this once in your terminal.
  2. 2Start Claude Code and type /mcp to check SheetWA shows as connected.
bashTerminal
claude mcp add --transport http sheetwa https://backend.sheetwa.com/api/v3/mcp \
  --header "Authorization: Bearer sk_live_your_key_here"

Try it#

Once connected, ask in plain words. The assistant picks the right tools on its own. A few prompts to start with:

  • "Is my WhatsApp number connected, and what is its quality rating?"
  • "Show my approved templates and the placeholders each one needs."
  • "Find contacts tagged VIP who have not chatted in 30 days."
  • "Summarise unread inbox conversations and draft replies for me to check."
  • "Add an auto reply that answers 'price' with a link to our pricing page, paused for now."

Keep a human in the loop for sends

Tools that reach a customer's phone are marked as outbound, so most clients ask before running them. Leave that confirmation on until you trust the workflow.

Tool reference

Every tool name starts with waca_ and only touches the workspace the key belongs to. Badges show what each one does.

Read onlyWrites dataSends to WhatsAppDestructive

Connection#

Check that the WhatsApp number is live before doing anything else. 1 tools.

waca_connection_status#

WhatsApp connection status

Read only

Shows the WhatsApp Business number connected to this workspace: status, phone number, quality rating, the 24-hour messaging quota and whether sends are currently blocked. Call this first when a send fails or before planning a broadcast. Reads SheetWA's cached state only; it never contacts Meta.

Takes no parameters.

Contacts and tags#

Search, create and update CRM contacts, manage opt-outs and organise people with tags. 12 tools.

waca_contacts_get#

Get one contact

Read only

Full profile of one contact: name, phone, status, opt-out state, tags, custom attributes and chat activity.

Parameters (1)›
  • contact_idrequired

    string

    No extra notes.
waca_contacts_check_phone#

Check whether a phone is already a contact

Read only

Normalises a phone number and reports whether a contact with it already exists. Call before waca_contacts_create to avoid a PHONE_DUPLICATE error.

Parameters (2)›
  • country_coderequired

    string

    Country calling code digits only, e.g. 91 for India.
  • phonerequired

    string

    Local number or full E.164 without the plus sign.
waca_contacts_create#

Create a contact

Writes data

Adds one contact to the CRM. Every contact needs at least one tag: pass existing tag_ids from waca_tags_list or create one with waca_tags_create first. Fails with PHONE_DUPLICATE when the number already exists (the error carries existingId).

Parameters (6)›
  • first_namerequired

    string

    No extra notes.
  • last_name

    string

    No extra notes.
  • country_coderequired

    string

    Country calling code digits only, e.g. 91 for India.
  • phonerequired

    string

    Local number or full E.164 without the plus sign.
  • tag_idsrequired

    string[]

    No extra notes.
  • attributes

    object

    Custom attribute values keyed by attribute key; list valid keys with waca_contact_attributes_list.
waca_contacts_bulk_create#

Create up to 100 contacts

Writes data

Creates many contacts in one call (max 100). Each row is validated on its own; the answer lists what was created and what failed with the reason, so a duplicate does not stop the rest. Same tag rule as waca_contacts_create.

Parameters (2)›
  • tag_idsrequired

    string[]

    Tags applied to every created contact.
  • contactsrequired

    object[]

    Each item: first_name (string), last_name (string), country_code (string), phone (string), attributes (object).
waca_contacts_update#

Update a contact

Writes data

Changes name, phone, tags or custom attributes of one contact. Omitted fields stay as they are. tag_ids, when given, replaces the whole tag set (at least one). Opt-out is not changed here: use waca_contacts_set_opt_out.

Parameters (7)›
  • contact_idrequired

    string

    No extra notes.
  • first_name

    string

    No extra notes.
  • last_name

    string

    No extra notes.
  • country_code

    string

    Country calling code digits only, e.g. 91 for India.
  • phone

    string

    Local number or full E.164 without the plus sign.
  • tag_ids

    string[]

    No extra notes.
  • attributes

    object

    Custom attribute values keyed by attribute key; list valid keys with waca_contact_attributes_list.
waca_contacts_set_opt_out#

Opt a contact out or back in

Writes data

Marks a contact as opted out of messages (opted_out: true) or re-enables them (false). Broadcasts skip opted-out contacts and single sends refuse them. Use this when a customer asks to stop receiving messages. Idempotent.

Parameters (3)›
  • contact_idrequired

    string

    No extra notes.
  • opted_outrequired

    boolean

    No extra notes.
  • reason

    string

    Why they are being re-enabled; kept in the audit trail.
waca_contact_attributes_list#

List custom attribute definitions

Read only

The custom attribute keys this workspace accepts on contacts (key, label, type). Use the key values in the attributes object of create/update.

Takes no parameters.

Read only

Every contact tag in the workspace with its id and how many contacts carry it. Tags group contacts for broadcasts and searches.

Takes no parameters.

waca_tags_create#

Create a tag

Writes data

Creates a contact tag by name. If a tag with that name already exists, its id is returned with already_existed: true.

Parameters (1)›
  • namerequired

    string

    No extra notes.
waca_tags_assign#

Add tags to contacts

Writes data

Adds one or more tags to one or more contacts. Existing tags on those contacts are kept.

Parameters (2)›
  • tag_idsrequired

    string[]

    No extra notes.
  • contact_idsrequired

    string[]

    No extra notes.
waca_tags_unassign#

Remove tags from contacts

Writes data

Removes tags from contacts. A contact always keeps at least one tag; the tool refuses with CANNOT_UNASSIGN_LAST_TAG and lists the contacts that would be left without one.

Parameters (2)›
  • tag_idsrequired

    string[]

    No extra notes.
  • contact_idsrequired

    string[]

    No extra notes.

Templates#

Read Meta-approved templates, save drafts and submit new ones for approval. 6 tools.

waca_templates_list#

List message templates

Read only

Templates registered with Meta for this workspace, with status (APPROVED templates are the only ones that can be sent), body text and the list of placeholders each needs. Use detailed for the raw components and version.

Parameters (5)›
  • status

    "APPROVED" | "PENDING" | "REJECTED" | "PAUSED" | "DISABLED"

    No extra notes.
  • category

    "MARKETING" | "UTILITY" | "AUTHENTICATION"

    No extra notes.
  • query

    string

    Substring of the template name or body.
  • page_size

    integer

    Rows per page, 1-100. Default 20.Default 20
  • response_format

    "concise" | "detailed"

    concise returns the fields a person reads; detailed adds ids and raw fields for follow-up calls.Default "concise"
waca_templates_get#

Get one template

Read only

One template by name and language, with its body, placeholders, buttons, status and rejection reason. Check placeholders before any template send.

Parameters (2)›
  • template_namerequired

    string

    Template name as registered with Meta: lowercase snake case.
  • languagerequired

    string

    Template language code, e.g. en_US, en, hi.
waca_templates_list_drafts#

List template drafts

Read only

Local drafts not yet submitted to Meta. A draft becomes a real template with waca_templates_submit.

Takes no parameters.

waca_templates_save_draft#

Save a template draft

Writes data

Writes a template draft locally without submitting it to Meta, so a person can review it in the dashboard. Pass draft_id to update an existing draft. Body placeholders are positional {{1}}, {{2}}. Nothing is sent to Meta.

Parameters (11)›
  • template_namerequired

    string

    Template name as registered with Meta: lowercase snake case.
  • languagerequired

    string

    Template language code, e.g. en_US, en, hi.
  • categoryrequired

    "MARKETING" | "UTILITY" | "AUTHENTICATION"

    MARKETING for promotions, UTILITY for transactional updates, AUTHENTICATION for codes.
  • bodyrequired

    string

    Message body. Positional placeholders {{1}}, {{2}}… in order; no placeholder at the very start or end.
  • header_text

    string

    Short text header. Mutually exclusive with header_format.
  • header_format

    "IMAGE" | "VIDEO" | "DOCUMENT"

    Media header type; pair with header_asset_id from waca_media_list.
  • header_asset_id

    string

    Media-library asset used as the header sample.
  • footer_text

    string

    No extra notes.
  • quick_reply_buttons

    string[]

    No extra notes.
  • url_button

    object

    No extra notes.
  • draft_id

    string

    No extra notes.
waca_templates_submit#

Submit a template to Meta for approval

Sends to WhatsApp

Submits a template to Meta. Approval usually takes minutes to hours; the template cannot be sent until its status is APPROVED. Either pass draft_id alone to submit an existing draft, or the full fields. Owner/admin only.

Parameters (11)›
  • template_name

    string

    Template name as registered with Meta: lowercase snake case.
  • language

    string

    Template language code, e.g. en_US, en, hi.
  • category

    "MARKETING" | "UTILITY" | "AUTHENTICATION"

    MARKETING for promotions, UTILITY for transactional updates, AUTHENTICATION for codes.
  • body

    string

    Message body. Positional placeholders {{1}}, {{2}}… in order; no placeholder at the very start or end.
  • header_text

    string

    Short text header. Mutually exclusive with header_format.
  • header_format

    "IMAGE" | "VIDEO" | "DOCUMENT"

    Media header type; pair with header_asset_id from waca_media_list.
  • header_asset_id

    string

    Media-library asset used as the header sample.
  • footer_text

    string

    No extra notes.
  • quick_reply_buttons

    string[]

    No extra notes.
  • url_button

    object

    No extra notes.
  • draft_id

    string

    No extra notes.

Media#

Files already in your media library, ready to attach to broadcasts. 1 tools.

waca_media_list#

List media library files

Read only

Images, videos, documents and audio already uploaded to the workspace's media library. Use an asset_id as a template media header (waca_templates_save_draft) or as the file of a media broadcast (waca_broadcasts_create). Uploading new files is done by a person in the dashboard.

Parameters (4)›
  • kind

    "image" | "video" | "document" | "audio"

    No extra notes.
  • query

    string

    Start of the file name.
  • page

    integer

    1-based page number.Default 1
  • page_size

    integer

    Rows per page, 1-100. Default 20.Default 20

Broadcasts#

Create campaigns, follow delivery and pause, resume, cancel or retry them. 9 tools.

waca_broadcasts_list#

List broadcasts

Read only

Campaigns in this workspace, newest first, with status and delivery counts. Filter by status. Use waca_broadcasts_stats for the failure breakdown of one campaign.

Parameters (4)›
  • status

    "queued" | "scheduled" | "running" | "paused" | "completed" | "failed" | "cancelled"

    No extra notes.
  • page

    integer

    1-based page number.Default 1
  • page_size

    integer

    Rows per page, 1-100. Default 20.Default 20
  • response_format

    "concise" | "detailed"

    concise returns the fields a person reads; detailed adds ids and raw fields for follow-up calls.Default "concise"
waca_broadcasts_get#

Get one broadcast

Read only

One campaign with its template or text, schedule, counts, error and retry history.

Parameters (1)›
  • campaign_idrequired

    string

    No extra notes.
waca_broadcasts_stats#

Why did a broadcast fail? Counts and failure breakdown

Read only

Delivery counts of one campaign plus every failure reason grouped by Meta error code, each with a plain-language label, a class (transient / blocked / permanent / unknown) and whether a retry can work. retry_suggestion lists the codes worth passing to waca_broadcasts_retry.

Parameters (1)›
  • campaign_idrequired

    string

    No extra notes.
waca_broadcasts_recipients#

List a broadcast's recipients

Read only

Per-recipient rows of one campaign, filterable by status or error code (use unknown for failures without a code). Each row carries the phone, status, error and timestamps.

Parameters (6)›
  • campaign_idrequired

    string

    No extra notes.
  • status

    "pending" | "sent" | "delivered" | "read" | "failed" | "skipped"

    No extra notes.
  • error_code

    string

    No extra notes.
  • query

    string

    Phone substring.
  • page

    integer

    1-based page number.Default 1
  • page_size

    integer

    Rows per page, 1-100. Default 20.Default 20
waca_broadcasts_create#

Create a broadcast (template, text or media) to many recipients

Sends to WhatsApp

Creates and queues a campaign. Recipients come either from recipients (explicit phones with per-recipient variables) or from tag_ids (every opted-in contact carrying any of those tags, at most 500 per call). For template sends, check placeholders with waca_templates_get; supply variables (same for everyone) or variables_from_contact (per-contact fields such as first_name). Text and media broadcasts only reach people who messaged in the last 24 hours. Pass scheduled_at (ISO) to send later. This reaches real phones and is billed.

Parameters (12)›
  • namerequired

    string

    Campaign name shown in the dashboard.
  • message_kind

    "template" | "text" | "media"

    No extra notes.Default "template"
  • template_name

    string

    No extra notes.
  • language

    string

    No extra notes.
  • text_body

    string

    For message_kind text.
  • media_asset_id

    string

    For message_kind media: an asset from waca_media_list.
  • recipients

    object[]

    Each item: country_code (string), phone (string), variables (string[]).
  • tag_ids

    string[]

    Send to opted-in contacts with any of these tags.
  • variables

    string[]

    Body values used for every recipient.
  • variables_from_contact

    string[]

    Per-contact body values, in placeholder order: first_name, last_name, phone or a custom attribute key. Tag sends only.
  • scheduled_at

    string

    ISO 8601 with offset; omit to send now.
  • rate_per_second

    integer

    No extra notes.
waca_broadcasts_pause#

Pause a broadcast

Writes data

Pauses a running, queued or scheduled campaign. Resume with waca_broadcasts_resume.

Parameters (1)›
  • campaign_idrequired

    string

    No extra notes.
waca_broadcasts_resume#

Resume a paused broadcast

Sends to WhatsApp

Continues a paused campaign from where it stopped.

Parameters (1)›
  • campaign_idrequired

    string

    No extra notes.
waca_broadcasts_cancel#

Cancel a broadcast

Destructive

Stops a campaign for good; pending recipients are closed as cancelled. Cannot be undone. Owner/admin only.

Parameters (1)›
  • campaign_idrequired

    string

    No extra notes.
waca_broadcasts_retry#

Retry failed recipients by error code

Sends to WhatsApp

Re-sends a finished campaign to recipients that failed with the given Meta error codes (use unknown for failures without a code). Get the codes and retry_suggestion from waca_broadcasts_stats; permanent failures such as 131026 (number not on WhatsApp) never succeed. Optionally schedule the retry for later, which is what transient limits need.

Parameters (3)›
  • campaign_idrequired

    string

    No extra notes.
  • error_codesrequired

    string[]

    No extra notes.
  • scheduled_at

    string

    No extra notes.

Inbox#

Read conversations, reply inside the 24-hour window and open or close threads. 7 tools.

waca_inbox_counts#

What is waiting in the inbox

Read only

Counts of unassigned, mine, open, closed and unread conversations. The quickest way to see whether anything needs attention.

Takes no parameters.

waca_inbox_list_conversations#

List inbox conversations

Read only

WhatsApp threads with the contact name, phone, unread count, who holds it, the last message preview and whether the free-text reply window is open. view picks the queue: unassigned, mine (held by this key's owner), all, closed or unread. Page with cursor.

Parameters (7)›
  • view

    "unassigned" | "mine" | "all" | "closed" | "unread"

    No extra notes.Default "all"
  • query

    string

    Contact name or phone.
  • tag_id

    string

    No extra notes.
  • assignee_account_id

    string

    No extra notes.
  • cursor

    string

    No extra notes.
  • page_size

    integer

    Rows per page, 1-100. Default 20.Default 20
  • response_format

    "concise" | "detailed"

    concise returns the fields a person reads; detailed adds ids and raw fields for follow-up calls.Default "concise"
waca_inbox_get_conversation#

Get one conversation

Read only

One thread's header: contact, state, assignee, unread count, tags and reply-window state. Read the messages with waca_inbox_list_messages.

Parameters (1)›
  • conversation_idrequired

    string

    No extra notes.
waca_inbox_list_messages#

Read a conversation's messages

Read only

Messages of one thread, oldest to newest within the page, with direction, text, type, status and who sent it. Page backwards in time with cursor.

Parameters (3)›
  • conversation_idrequired

    string

    No extra notes.
  • cursor

    string

    No extra notes.
  • page_size

    integer

    Rows per page, 1-100. Default 20.Default 20
waca_inbox_set_state#

Assign, claim, release, close, reopen or mark read

Writes data

Changes a thread's state. assign needs assignee_account_id (from waca_workspace_members_list). claim takes the thread for this key's owner; release gives it back to the unassigned queue; close ends it; reopen brings a closed thread back; mark_read clears the unread count.

Parameters (3)›
  • conversation_idrequired

    string

    No extra notes.
  • actionrequired

    "assign" | "claim" | "release" | "close" | "reopen" | "mark_read"

    No extra notes.
  • assignee_account_id

    string

    No extra notes.
waca_inbox_reply#

Reply to a conversation with text

Sends to WhatsApp

Sends a free-text WhatsApp reply on a thread. Only works while the 24-hour reply window is open (reply_window_open on the conversation); otherwise use waca_inbox_reply_template. Claims an unassigned thread for this key's owner. Reaches a real phone.

Parameters (2)›
  • conversation_idrequired

    string

    No extra notes.
  • textrequired

    string

    No extra notes.
waca_inbox_reply_template#

Reply to a conversation with a template

Sends to WhatsApp

Sends an APPROVED template on a thread, which is the only way to reach the customer after the 24-hour window closes. variables fill the body placeholders in order (check with waca_templates_get). Claims an unassigned thread. Reaches a real phone and is billed.

Parameters (4)›
  • conversation_idrequired

    string

    No extra notes.
  • template_namerequired

    string

    No extra notes.
  • languagerequired

    string

    No extra notes.
  • variables

    string[]

    No extra notes.Default []

Single messages#

Send one template message and look up any message's delivery status. 2 tools.

waca_messages_get#

Get delivery status of a sent message

Read only

Status of one outbound message (queued, sent, delivered, read, failed) with Meta's error code and text when it failed. Use the message_id a send tool returned.

Parameters (1)›
  • message_idrequired

    string

    No extra notes.
waca_messages_send_template#

Send a template message to one person

Sends to WhatsApp

Sends one APPROVED template to one recipient, outside or inside the 24-hour window. Give contact_id or a phone with country code. variables fill the body placeholders in order; check the count with waca_templates_get first. Refuses opted-out contacts (CONTACT_OPTED_OUT). For many recipients use waca_broadcasts_create. This reaches a real phone and is billed.

Parameters (6)›
  • contact_id

    string

    No extra notes.
  • country_code

    string

    No extra notes.
  • phone

    string

    No extra notes.
  • template_namerequired

    string

    No extra notes.
  • languagerequired

    string

    No extra notes.
  • variables

    string[]

    No extra notes.Default []

Auto replies#

Create, edit, pause and delete keyword rules that answer incoming messages automatically. 4 tools.

waca_auto_replies_list#

List auto-reply rules

Read only

Every auto-reply rule on the connected number: its trigger words, reply text, and whether it is active. A dormant rule is over the plan's limit and does not fire.

Takes no parameters.

waca_auto_replies_create#

Create an auto-reply rule

Writes data

Adds a rule that answers incoming WhatsApp messages automatically when they match its triggers. Pass active: false to save it paused. Fails with DUPLICATE_RULE when another rule already replies to the same word.

Parameters (4)›
  • triggersrequired

    object[]

    Each item: keyword (string), match_type ("exact" | "contains").
  • match_mode

    "any" | "all"

    any fires when one trigger matches; all needs every trigger.
  • reply_textrequired

    string

    The text sent back automatically.
  • active

    boolean

    No extra notes.
waca_auto_replies_update#

Edit, pause or resume an auto-reply rule

Writes data

Changes a rule's triggers, match mode or reply text, or switches it on or off with active. Only the fields given change. Turning a rule on needs an active plan; pausing never does.

Parameters (5)›
  • rule_idrequired

    string

    No extra notes.
  • triggers

    object[]

    Each item: keyword (string), match_type ("exact" | "contains").
  • match_mode

    "any" | "all"

    any fires when one trigger matches; all needs every trigger.
  • reply_text

    string

    The text sent back automatically.
  • active

    boolean

    No extra notes.
waca_auto_replies_delete#

Delete an auto-reply rule

Destructive

Removes a rule for good. To stop it for now, use waca_auto_replies_update with active: false instead.

Parameters (1)›
  • rule_idrequired

    string

    No extra notes.

Notes#

Private team notes on threads and contacts. Customers never see them. 2 tools.

waca_notes_list#

List internal notes

Read only

Private team notes on an inbox thread or a CRM contact. Notes are never sent to the customer. A thread's list also includes notes written on its contact.

Parameters (2)›
  • conversation_id

    string

    An inbox thread. Give this or contact_id.
  • contact_id

    string

    A CRM contact. Give this or conversation_id.
waca_notes_add#

Add an internal note

Writes data

Writes a private note on an inbox thread or a CRM contact for the team to read. The customer never sees it. Good for summaries, hand-over context and follow-up reminders.

Parameters (3)›
  • conversation_id

    string

    An inbox thread. Give this or contact_id.
  • contact_id

    string

    A CRM contact. Give this or conversation_id.
  • bodyrequired

    string

    No extra notes.

Workspace#

Team members and saved quick replies, so the assistant writes like your team. 2 tools.

Read only

People in this workspace with their role (owner, admin, member) and account_id. Use an account_id to assign an inbox conversation with waca_inbox_set_state.

Takes no parameters.

waca_quick_replies_list#

List saved quick replies

Read only

The team's saved canned replies for the inbox (name and message text). Reuse their wording in waca_inbox_reply so replies match how the team already talks to customers.

Takes no parameters.

Errors#

A refused tool call comes back as a normal result with isError set, a code and a hint, so the assistant can fix its next call on its own.

  • VALIDATION_FAILED

    Status: 400

    What it means: An input failed its schema. The details list each field.

  • API_SUBSCRIPTION_REQUIRED

    Status: 402

    What it means: This action needs an active WhatsApp API plan.

  • PLAN_LIMIT_REACHED

    Status: 402

    What it means: The monthly message allowance or a plan cap is used up.

  • FORBIDDEN

    Status: 403

    What it means: The action needs an owner or admin key.

  • NOT_FOUND, CONTACT_NOT_FOUND, …

    Status: 404

    What it means: Nothing with that id exists in this workspace.

  • PHONE_DUPLICATE

    Status: 409

    What it means: That number is already a contact.

  • DUPLICATE_RULE

    Status: 409

    What it means: Another auto reply already answers that word.

  • WINDOW_CLOSED

    Status: 409

    What it means: Free text is only allowed within 24 hours of the customer's last message. Use a template.

  • NO_CONNECTION

    Status: 409

    What it means: No WhatsApp number is connected.

Limits and security#

  • Requests per key

    Value: 120 per minute, then 429

  • Recipients per tag broadcast call

    Value: 500

  • Page size on list tools

    Value: 20 by default, up to 100

  • Who can create keys

    Value: Owners and admins

  • Workspace scope

    Value: A key only ever sees the workspace it was created in

  • Keys are stored hashed. SheetWA cannot show a key again after it is created.
  • If the person who created a key loses their owner or admin role, the key stops working.
  • Messages sent through MCP are recorded as sent by an agent, so you can tell them apart from your team's.