Skip to main content
Glama
wuapidev

wuapi MCP server

Official
by wuapidev

wuapi MCP server

npm version CI license

A Model Context Protocol server for wuapi, the WhatsApp API for developers. It lets Claude, Cursor, VS Code and other MCP clients use your wuapi account: send messages, link numbers, read conversations, manage groups, communities, channels, labels, profile and privacy, webhooks, projects and invitations.

Every tool is a call to the wuapi REST API with your own API key, through @wuapidev/sdk. The API decides what the key may do, rate limits it (600 requests per minute per key) and logs each call in your dashboard, exactly as for any other client.

Docs: wuapi.dev/docs/mcp.

How it works. wuapi links your own numbers as devices, the same way WhatsApp Web works. It does not use the WhatsApp Business Platform. WhatsApp can restrict numbers that behave like spam: send only to people who expect your messages.

Two ways to connect

Local (stdio)

Hosted (Streamable HTTP)

Runs

on your machine: npx -y @wuapidev/mcp

at https://wuapi.dev/api/mcp

Key

your npx @wuapidev/cli login, or the WUAPI_API_KEY environment variable

Authorization: Bearer wu_live_... header

Needs

Node 20 or later

a client that sends custom headers

The quickest local setup uses the wuapi CLI: it logs you in from the browser, stores a key on your machine (~/.config/wuapi/credentials.json, readable only by you) and registers the server with your client, with no key in the client's config:

npx @wuapidev/cli login
npx @wuapidev/cli mcp add          # Claude Code, Cursor or VS Code

The local server uses WUAPI_API_KEY when the client sets it, and otherwise that stored login: the current profile, or the one WUAPI_PROFILE names (npx @wuapidev/cli profiles lists them). Or create an API key yourself at wuapi.dev/app/api-keys and pass it as below. A project key limits the server to one project.

Claude Code

# Local, with the key from `npx @wuapidev/cli login`
claude mcp add wuapi -- npx -y @wuapidev/mcp

# Local, with a key in the config
claude mcp add wuapi --env WUAPI_API_KEY=wu_live_... -- npx -y @wuapidev/mcp

# Hosted
claude mcp add --transport http wuapi https://wuapi.dev/api/mcp --header "Authorization: Bearer $WUAPI_API_KEY"

Claude Desktop

Settings > Developer > Edit Config, then add to claude_desktop_config.json:

{
  "mcpServers": {
    "wuapi": {
      "command": "npx",
      "args": ["-y", "@wuapidev/mcp"],
      "env": { "WUAPI_API_KEY": "wu_live_..." }
    }
  }
}

Cursor

~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "wuapi": {
      "command": "npx",
      "args": ["-y", "@wuapidev/mcp"],
      "env": { "WUAPI_API_KEY": "wu_live_..." }
    }
  }
}

Or the hosted server:

{
  "mcpServers": {
    "wuapi": {
      "url": "https://wuapi.dev/api/mcp",
      "headers": { "Authorization": "Bearer wu_live_..." }
    }
  }
}

VS Code

.vscode/mcp.json. VS Code asks for the key once and stores it outside the file:

{
  "inputs": [{ "type": "promptString", "id": "wuapi-key", "description": "wuapi API key", "password": true }],
  "servers": {
    "wuapi": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@wuapidev/mcp"],
      "env": { "WUAPI_API_KEY": "${input:wuapi-key}" }
    }
  }
}

For the hosted server use "type": "http", "url": "https://wuapi.dev/api/mcp" and "headers": { "Authorization": "Bearer ${input:wuapi-key}" }.

Other clients

Any client that starts a local command works with npx -y @wuapidev/mcp, with WUAPI_API_KEY in its environment or after npx @wuapidev/cli login. Any client that connects to a remote server with a custom header works with the hosted endpoint. Clients that only connect to remote servers through OAuth, as some chat apps do, cannot use the hosted endpoint yet.

Related MCP server: WhatsApp MCP Stream

Configuration

Variable

WUAPI_API_KEY

Your API key, wu_live_.... When unset, the key npx @wuapidev/cli login stored is used.

WUAPI_PROFILE

Which stored login to use (npx @wuapidev/cli profiles). Default: the current one. Its project and base URL apply unless the two variables below are set.

WUAPI_PROJECT

Act inside one project: its id or ext:<externalId>. Sent as Wuapi-Project.

WUAPI_BASE_URL

API base URL. Default https://api.wuapi.dev. Must be https (or http on localhost).

WUAPI_MCP_READ_ONLY

true registers only the tools that read. Same as the --read-only flag.

The hosted endpoint takes the same options as headers: Wuapi-Project: <id or ext:externalId> and Wuapi-Read-Only: true.

Tools

86 tools reach every operation of the REST API, except the two that return a secret and the two steps of an upload through an upload URL (see below). Tools that read are marked readOnlyHint. Tools that delete, revoke, reset, block or leave are marked destructiveHint and take confirm: true, which the model has to set on purpose and your client shows you before the call.

Area

Tools

Context

get_current_key

Accounts

list_accounts, get_account, get_account_qr_code, create_account, request_pairing_code, reconnect_account, list_proxy_locations, update_account, unlink_account, set_presence, set_disappearing_timer, reject_call

Messages

send_text, send_media, upload_file, send_location, send_contact, send_poll, reply_to_message, react_to_message, get_message, list_messages, edit_message, delete_message, cancel_message, vote_in_poll, forward_message, star_message

Chats

list_chats, get_chat, mark_chat_read, send_read_receipts, archive_chat, pin_chat, mute_chat, delete_chat, manage_labels

Contacts

list_contacts, get_contact, check_numbers, lookup_contacts, save_contacts, lookup_whatsapp_info, manage_block_list

Profile

manage_profile, manage_favorite_stickers, manage_privacy

Groups

list_groups, get_group, create_group, add_group_participants, remove_group_participants, promote_group_participants, demote_group_participants, get_group_invite_link, reset_group_invite_link, leave_group, manage_group_settings, manage_group_joins, manage_community

Channels

manage_channel

Stories

post_story, manage_stories

Webhooks

list_webhooks, get_webhook, create_webhook, update_webhook, delete_webhook

Incoming webhooks

list_incoming_webhooks, get_incoming_webhook, create_incoming_webhook, update_incoming_webhook, delete_incoming_webhook

Projects

list_projects, get_project, create_project, manage_project

Invitations

create_invitation, list_invitations, get_invitation, cancel_invitation, resend_invitation, manage_branding

Usage

get_usage, get_usage_by_project

Resources with many small operations are one tool with an action argument, so the list stays short enough for a model to pick from. The tool's description lists its actions, and each field says which actions use it. Only the destructive actions (marked below) need confirm: true.

Tool

Actions

unlink_account

logout*, delete*

set_presence

online, offline, typing, recording, paused, subscribe

manage_labels

upsert, delete*, label_chat, unlabel_chat, label_message, unlabel_message

save_contacts

one, many, backfill_auto_save

lookup_whatsapp_info

contact_picture, business_profile, resolve_link, bots, sticker_pack, order

manage_block_list

list, block*, unblock

manage_profile

update, set_picture, delete_picture*, get_contact_link, reset_contact_link*

manage_favorite_stickers

list, get_file, add, remove

manage_privacy

get, get_story_privacy, update

manage_group_settings

update, set_picture, delete_picture*

manage_group_joins

preview_invite, join, list_requests, approve_requests, reject_requests

manage_community

create, list_groups, list_members, link_group, unlink_group

manage_channel

list, get, preview_invite, list_messages, create, follow, unfollow, mute, unmute, react, mark_viewed

manage_stories

list, list_own, get, viewers, view, react, reply, delete*

manage_project

update, delete*, list_keys, revoke_key*

manage_branding

get, update

* needs confirm: true.

To post to a channel, use send_text or send_media with to set to the channel id. In read-only mode a tool that mixes reads and writes keeps only its reading actions (manage_channel keeps list, get, preview_invite and list_messages).

get_account_qr_code returns the QR code as an image your client can show. Projects, invitations, branding and usage need an organization key.

Not exposed: creating a project API key, rotating a webhook endpoint's signing secret and rotating an incoming webhook's URL. Both return a secret exactly once, and tool results never carry secrets, so a tool would create a key or secret nobody could read (and a rotation would break your server's signature check at once). Do both in the dashboard or with the SDK. Also not exposed: completing and reading an upload. They belong to the upload-URL flow, where the file's raw bytes are posted to a URL, which a tool cannot do; upload_file takes the bytes in its one call and returns the upload ready to send. Sending a test webhook event and reading request logs have no public API endpoint; they are in the dashboard.

src/operations.ts maps every API operation to the tools that call it; a test keeps it equal to the OpenAPI spec.

Resources and prompts

Resources: https://wuapi.dev/openapi.json (the OpenAPI 3.1 spec), https://wuapi.dev/llms-full.txt (the docs as Markdown), https://wuapi.dev/llms.txt (their index) and wuapi://webhook-events (every event type).

Prompts: send_message (to, message), setup_webhook (url, events), invite_customer (customer, externalId, email) and use_streams (project, language). use_streams helps you receive events with Streams, the live alternative to Webhooks for code with no public endpoint: with the SDK's events.stream in TypeScript and Rust, and the rules of a client in any other language.

Security

  • The key stays where you put it: in the client's configuration, a header, or the CLI's credentials file (mode 0600), which the server only reads. The server never logs it, never returns it, and never includes it in an error.

  • Tool results never contain secrets. A webhook endpoint's signing secret is returned by the API only once, when the endpoint is created; create_webhook drops it and tells you to reveal it in the dashboard instead. An incoming webhook's URL is a credential too: its tools drop it, and the user copies it from the dashboard. There is no tool that creates API keys.

  • Scope the key: a project key reaches one project, and WUAPI_MCP_READ_ONLY=true removes every tool that writes.

  • Media is fetched by the wuapi API, never by this server. The API refuses private and internal addresses.

  • Every argument is validated against the tool's JSON schema before any request. A base URL that is not https is refused, so the key never travels in clear text.

Use it as a library

import { Wuapi } from "@wuapidev/sdk";
import { createWuapiMcpServer } from "@wuapidev/mcp";
import { createWuapiMcpHttpHandler } from "@wuapidev/mcp/http";

// One server per client connection, acting as this key.
const server = createWuapiMcpServer({ client: new Wuapi({ apiKey: process.env.WUAPI_API_KEY }) });

// Or a stateless Streamable HTTP handler: (Request) => Promise<Response>,
// authenticated with each caller's own key as a bearer token.
const handle = createWuapiMcpHttpHandler();

License

MIT

Available Tools

86 tools
add_group_participantsAdd people to a groupA

Add participants to a group the account administers. Each result says whether it worked; someone who cannot be added directly comes back with an invite code.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYesThe group id (`...@g.us`), from list_groups.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
contactIdsYesContact ids: E.164 with + (`+584241112233`) or `lid:<digits>`.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral details beyond the annotations: each result indicates success, and contacts who cannot be added directly yield an invite code. It also highlights an authorization constraint, 'the account administers.' This is useful context that the annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint) do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the core action front-loaded and the behavioral nuance following immediately. Every sentence contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the full schema, annotations, and lack of output schema, the description covers purpose, permission scope, and response behavior enough for an agent to call it correctly. It would be slightly stronger with an explicit note on partial success semantics or already-existing members, but the per-result phrase largely covers partial success.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and each parameter already has a descriptive schema entry (e.g., groupId from list_groups, contactIds E.164 format). The description does not add parameter-level meaning, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action, 'Add participants to a group', with the resource 'group' and a scope qualifier, 'the account administers'. It clearly distinguishes itself from sibling tools like remove_group_participants or promote_group_participants through the verb 'add' and the invite-code fallback behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: the tool is for adding participants to a group, and the prerequisite that the account must administer the group is explicit. However, it does not reference alternatives or state when not to use it, leaving sibling differentiation to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

archive_chatArchive or unarchive a chatB
Idempotent

Archive a chat on the linked devices, or unarchive it with archived: false.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
archivedNoDefault true.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, which covers the mutation and safety profile. The description adds the useful nuance that archiving happens 'on the linked devices' and that unarchiving is achieved with `archived: false`, but it does not describe other behavioral traits such as sync effects, visibility changes, or response behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no filler. It front-loads the primary action and immediately covers the secondary mode, making it easy to parse and act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple toggle tool with a complete parameter schema and idempotent annotations, the description is nearly sufficient. It explains both archive and unarchive modes and references the account context via the schema. The lack of an output schema and any mention of return values is a minor gap, not a critical one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes all three parameters with 100% coverage, so the baseline is 3. The description adds marginal value by showing how the `archived` boolean toggles between archive and unarchive, which reinforces the schema's 'Default true' note but does not provide substantial new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: archive a chat, and explicitly includes the unarchive behavior via `archived: false`. It names the specific resource ('a chat') and the device scope ('on the linked devices'), but it does not explicitly differentiate itself from sibling chat-state tools like pin_chat or mute_chat.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to unarchive by setting `archived: false`, but provides no guidance on when to choose this tool over alternatives such as pin_chat, mute_chat, or mark_chat_read. There is no mention of prerequisites, context, or exclusions, leaving usage inference entirely to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_invitationCancel an invitationA
DestructiveIdempotent

Cancel an invitation: its link stops working. Completed invitations cannot be cancelled.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. The invitation link stops working. Only set it after the user asked for this or agreed to it.
invitationIdYesThe invitation id.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds useful behavioral context by stating that cancellation makes the link stop working and that completed invitations are exempt. This goes beyond what the annotations alone convey, though it does not discuss error behavior or reversibility explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The primary definition is front-loaded, and the completion constraint is stated in one additional sentence that earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Together with the schema and annotations, the description covers purpose, effect, an important constraint, destructiveness, and the required confirmation flag. No output schema exists, but for a simple cancel operation the provided details are sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter semantics are fully documented in the schema itself, including the confirm requirement. The description adds no additional parameter-level detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and resource: "Cancel an invitation", plus the concrete effect "its link stops working". It also distinguishes the tool's scope by noting "Completed invitations cannot be cancelled", which is a meaningful boundary not present in sibling tool names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly gives a when-to-use rule: cancel an invitation by disabling its link, and an explicit when-not-to-use rule: completed invitations cannot be cancelled. It does not name alternatives like reset_group_invite_link, but the object-specific wording makes the intended use reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_messageCancel a queued messageA
DestructiveIdempotent

Stop a message that is still queued from being sent. It ends failed with error code cancelled. Fails with not_queued when the message already left; use delete_message for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. The message will not be sent. Only set it after the user asked for this or agreed to it.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses behavioral outcomes beyond the annotations: the message ends in 'failed' state with error code 'cancelled', and it fails with 'not_queued' if the message is no longer queued. These specifics provide useful context that annotations (destructive, idempotent) do not cover, adding value without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. It front-loads the core purpose, then provides outcome and the alternative, all in a compact, easily scannable structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two parameters, no output schema, and comprehensive annotations, the description covers the essential aspects: what it does, when to use it, what happens on success and failure, and the alternative. Nothing critical is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already well-documented. The description adds contextual information about the messageId parameter requiring a queued state, but does not add new parameter-specific syntax or format details beyond the schema. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action: stopping a message that is still 'queued' from being sent. It also distinguishes itself from the sibling delete_message by specifying that delete_message is for messages that have already left the queue, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use this tool (when the message is still queued) and when not to (when the message already left, use delete_message instead). This direct routing between alternatives is exemplary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_numbersCheck numbers on WhatsAppA
Read-onlyIdempotent

Which of these phone numbers have WhatsApp, with their contact id, business name and username when known. Check before sending to a new number.

ParametersJSON Schema
NameRequiredDescriptionDefault
phonesYes1 to 50 numbers, E.164 (`+584241112233`) or digits.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds value by specifying that it returns contact id, business name, and username when known, and by noting it only reports numbers that have WhatsApp. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. The core purpose is front-loaded, and the usage tip ('Check before sending to a new number') is a valuable addition. Every sentence earns its place; there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description explains the return content: contact id, business name, and username when known. Combined with the schema for inputs and annotations for safety, an agent has everything needed to invoke the tool correctly. The 'when known' phrasing appropriately signals that some fields may be absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides 100% description coverage for both parameters: phones (1-50 numbers, E.164 format) and accountId (the wuapi account id from list_accounts). The description does not add any parameter-specific meaning beyond the schema, so the baseline of 3 applies since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks which phone numbers have WhatsApp and returns contact id, business name, and username when known. The verb 'check' is specific, the resource is 'phone numbers', and the outcome is unambiguous. It distinguishes itself from sibling tools like send_text or lookup_contacts by focusing on WhatsApp presence validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'Check before sending to a new number.' This implies the tool is used as a pre-send validation step, which is clear and actionable. However, it does not explicitly name alternative tools or state when not to use it, so it misses the exclusion clause that would earn a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_accountConnect a new numberA

Start linking a new WhatsApp number. Pick proxyLocation with list_proxy_locations (near where the phone is). Then show the QR code with get_account_qr_code, or pass pairingPhone to link with an 8-character pairing code instead. A linked number is billable; a new organization links its first number with no card. To let someone else link their own number, use create_invitation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA name for the account, such as `Front desk`.
projectIdNoOrganization keys only: the project to create it in (id or `ext:<externalId>`). A project key always uses its own project.
historySyncNo`recent` imports the chats the phone sends right after linking. Default `none`.
pairingPhoneNoLink by pairing code instead of QR code: the number to link, E.164.
proxyLocationYesWhere the number's residential proxy exits: a country and city pair from list_proxy_locations.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide false hints for readonly, idempotent, open-world, and destructive flags. The description adds valuable behavioral context: linking is billed, a new organization's first number is free, and the call 'starts' a linking flow rather than completing it instantly. This goes beyond the structured fields, though it does not describe failure or response behavior in detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: four sentences, all informative. It is front-loaded with the purpose and then gives the workflow, billing caveat, and alternative tool. Slightly longer than necessary, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with a nested object and no output schema, the description covers the key context: how to choose proxyLocation, the two linking paths, billing consequences, and when to use create_invitation. It does not mention what the call returns or failure cases, but the schema fully documents all parameters and the workflow guidance is strong enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter. The description adds extra meaning by tying proxyLocation to list_proxy_locations, explaining the QR-code versus pairingPhone choice, and noting the 8-character pairing code. This is meaningful value beyond the schema, though the schema remains the primary source for exact formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Start linking a new WhatsApp number.' It also distinguishes itself from create_invitation by explicitly saying that tool is for letting someone else link their own number, so an agent can tell them apart without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete workflow: pick proxyLocation via list_proxy_locations, then either show the QR code with get_account_qr_code or pass pairingPhone. It also names create_invitation as the alternative when someone else should link their own number, giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_groupCreate a groupA

Create a WhatsApp group with the account as owner, inside a community when communityId is given. Participants whose privacy settings refuse being added get an invite code instead (see the result).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe group name.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
communityIdNoCreate the group inside this community: its group id (`...@g.us`), from list_groups (`community: true`). The account must administer it.
participantsYesContact ids to add: E.164 with + or `lid:<digits>`.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare this is a non-read-only, open-world, non-idempotent write. The description adds real behavior beyond that: the calling account becomes owner, and participants whose privacy settings block being added receive an invite code instead of being added. This fallback behavior is non-obvious and usefully disclosed, though it does not cover permissions or partial-failure semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler, front-loading the primary action and then the conditional community case and the invite-code fallback. Every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description plus annotations and fully documented parameters give an agent enough to call it correctly, and 'see the result' justifiably defers the invite-code detail to the response. Minor gaps remain around required permissions and whether the call is safe/irreversible.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all five parameters including idempotencyKey and communityId are already documented with strong per-field detail. The description only adds the conditional meaning of communityId ('inside a community when given'), which is marginal beyond the schema's own explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a WhatsApp group') and adds meaningful scope: the account acts as owner, and the group lands inside a community when communityId is passed. It distinguishes itself from community/channel siblings implicitly, though it never names the adjacent tools (e.g. manage_community, manage_group_settings) it should not be confused with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the create semantics plus the conditional 'inside a community when communityId is given'. There is no explicit when-to-use/when-not guidance and no routing to alternatives for existing groups or communities, so an agent must infer the boundaries from the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_incoming_webhookCreate an incoming webhookA

Create a secret URL that sends a WhatsApp message from one of the user's numbers to one fixed contact or group when something POSTs to it (JSON {text} or plain text, no API key). The URL is a credential, so it is not returned through this tool: the user copies it from the wuapi dashboard (Integrations, Incoming webhooks).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesThe fixed destination: a contact (+584121234567 or lid:<digits>) or a group (...@g.us).
nameYesA label, for example the system that will call it.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a critical, non-obvious behavior that annotations cannot convey: the secret URL is a credential and is NOT returned by this tool, so the user must retrieve it from the dashboard. It also documents the accepted payload formats (JSON {text} or plain text, no API key). This is exactly the kind of context annotations (readOnlyHint=false, idempotentHint=false) leave uncovered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both load-bearing, with the core behavior front-loaded and the credential caveat following. No filler or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with no output schema, the description anticipates the most likely agent confusion — expecting the returned URL — and explains where it actually comes from. Combined with the annotations covering the mutation profile, nothing essential to calling this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (accountId, name, to) are already fully documented in the schema, establishing a baseline of 3. The description reinforces the notion of a 'fixed' destination but adds no new syntax or format meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource and explains the mechanism precisely: it creates a secret URL that turns inbound POSTs into a WhatsApp message to one fixed destination. It does not explicitly distinguish itself from the sibling create_webhook (a separate webhook family), so an agent must infer the incoming-vs-other distinction from the tool name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the mechanics of the POST-to-message flow make the use case reasonably clear, but there is no explicit when-to-use guidance and no named alternative among the many webhook siblings (create_webhook, update_incoming_webhook, etc.). No prerequisites beyond the accountId reference are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_invitationInvite someone to link their numberA

Create a branded page (url) where a customer links their own WhatsApp number to your project by QR code or pairing code, without an account on wuapi. Send them the url: it is returned only here. With inviteeEmail, wuapi can email it too.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodsNoHow they may link. Default both.
projectIdNoOrganization keys only: the project to create it in (id or `ext:<externalId>`). A project key always uses its own project.
returnUrlNoWhere the page sends them when done.
accountNameNoName of the account created when they finish.
historySyncNo
inviteeNameNo
inviteeEmailNo
inviteePhoneNoE.164.
expiresInDaysNo1 to 30. Default 7.
proxyLocationNoPreset the proxy location. Without it the invitee picks the country and city.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
suggestedCountryNoISO country preselected on the page.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry no positive hints (all flags false), so the description shoulders the burden. It discloses a non-obvious, critical behavior: the 'url' is returned only here and may be emailed via inviteeEmail. It doesn't cover expiration or cancellation, but it adds meaningful side-effect context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core function. Each sentence adds distinct value: what is created, how to share it, and an optional email side-effect. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 12 optional parameters and no output schema, the description covers the most important output (url) and a side effect, but it does not explain the full response shape, error conditions, or the invitation lifecycle (e.g., later retrieval or cancellation). Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so most parameters are already documented. The description adds useful context for inviteeEmail (wuapi can email the URL) and the returned url. However, three parameters (historySync, inviteeName, inviteeEmail) lack schema descriptions, and the description only partially compensates by explaining inviteeEmail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Create') and resource ('a branded page') and adds a distinctive condition: the customer links their own WhatsApp number without needing a wuapi account. This clearly differentiates it from siblings like get_invitation, cancel_invitation, and create_account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use by explaining what it creates and noting that the 'url' is returned only here, but it never explicitly states when to use this tool versus alternatives, nor does it name any sibling. The phrase 'without an account on wuapi' hints at a contrast with account creation, but no explicit when-to-use or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_projectCreate a projectA

Create a project for one of your customers. Set externalId to your own customer id so you can address it as ext:<externalId>. Then invite the customer to link their number with create_invitation. Organization keys only.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
metadataNoYour own string values, stored with it.
externalIdNoYour id for this customer: letters, digits and `. _ : @ -`.
maxAccountsNoHow many numbers it may link. Omitted: no limit.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are sparse (readOnlyHint=false, destructiveHint=false), so the description carries the disclosure burden. It explains the externalId addressing scheme and the invitation follow-up, but doesn't specify what happens on creation (e.g., response shape, idempotency behavior beyond schema). The description adds some context beyond annotations but leaves behavior on creation largely implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences that front-load purpose, then explain key usage and the next step. No wasted words; every sentence earns its place by conveying critical workflow information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters (one nested object), no output schema, and no detailed annotations, the description covers the core workflow adequately. It omits response format and error handling, but these are less critical for a creation tool whose output can be inferred. The description is sufficient for an agent to correctly invoke the tool in the intended context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so most parameters are documented. The description adds extra meaning for externalId—how to use it for addressing—which goes beyond the schema's pattern description. This elevates parameter understanding beyond what the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb-resource pair: 'create a project' with explicit customer scope. Distinguishes from siblings like create_invitation by describing the workflow and naming the specific follow-up tool. The purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit workflow: create project, set externalId, then invite customer with create_invitation. Names the alternative tool directly and states the constraint 'Organization keys only.' This gives clear when-to-use and next-step guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_webhookCreate a webhook endpointA

Register a public https URL to receive events as signed POST requests. The signing secret is not returned through this tool, to keep it out of the conversation: the user reveals it in the wuapi dashboard (Webhooks, rotate the endpoint's secret) and stores it with their server.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic https URL that answers 2xx within 10 seconds.
eventsYesEvent types to receive, such as `message.received`, `message.sent`, `message.failed`, `account.connected`, `account.disconnected`.
projectIdNoOrganization keys only: the project to create it in (id or `ext:<externalId>`). A project key always uses its own project.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the mutation safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, and the description clears it by disclosing a non-obvious behavior: the signing secret is deliberately withheld from the tool response and must be retrieved out-of-band from the dashboard. That is exactly the kind of consequence an agent must relay to a user. It does not cover retry/delivery semantics or what the call returns, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, and the second sentence carries the critical secret-handling caveat rather than filler. The parenthetical with the dashboard path is slightly dense but each clause is actionable, so no material waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates on the single most dangerous gap — that the secret is not returned — and the schema carries the parameter contract. It omits what the successful response looks like (endpoint id, etc.), which an agent would need to chain into update_webhook or delete_webhook, so it is strong but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (url, events, projectId, idempotencyKey) are already fully documented in the schema, including the https pattern, the 2xx/10s contract, and the idempotency behavior. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Register a public https URL to receive events as signed POST requests." That is unambiguous about what the tool does and what it produces. It does not, however, name or distinguish itself from the sibling mutators update_webhook/delete_webhook/list_webhooks, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — you call this to create a new endpoint — but there is no explicit guidance on when to use create_webhook versus update_webhook for an existing endpoint, nor any precondition stated (e.g. one endpoint per event set). It adds a practical workflow note about the signing secret, which is useful context but not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_chatDelete a chatA
DestructiveIdempotent

Delete a chat from the account's linked devices (the phone and WhatsApp Web). The messages wuapi stores are kept and still readable with list_messages. This cannot be undone on the devices.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
confirmYesMust be true. The chat disappears from the phone. Only set it after the user asked for this or agreed to it.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
deleteMediaNoAlso delete the chat's media files from the devices.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds meaningful behavioral context: it specifies the deletion target (linked devices), clarifies that wuapi-stored messages survive and remain readable via list_messages, and warns that the action cannot be undone on devices. This enriches the safety profile, though auth requirements or error behavior are not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action. The second sentence delivers high-value consequences (stored messages retained, irreversibility) with zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive chat-deletion tool with rich annotations and 100% schema coverage, the description supplies the critical behavioral nuance—device vs stored copy and irreversibility—so an agent can call it correctly. It does not route between siblings like archive_chat, but that is a minor gap given the annotation coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines accountId, chatId, confirm, and deleteMedia. The description adds no parameter-level syntax or constraints beyond what the schema provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'Delete' and resource 'a chat', specifies the scope 'from the account's linked devices (the phone and WhatsApp Web)', and distinguishes the local wuapi copy by noting messages are kept and readable with list_messages. An agent can tell it apart from delete_message or archive_chat without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when/when-not guidance or alternatives are named in the description. It only implies deletion is a device-local operation and that stored messages remain accessible. The schema's confirm parameter carries the consent condition, but the tool description itself lacks usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_incoming_webhookDelete an incoming webhookA
DestructiveIdempotent

Delete an incoming webhook. Its URL stops working at once, for whatever still calls it.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Whatever calls the URL stops sending. Only set it after the user asked for this or agreed to it.
incomingWebhookIdYesThe incoming webhook id, from list_incoming_webhooks.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real context beyond them: the URL stops working immediately ('at once'), clarifying that the effect is instantaneous and affects any caller still using it. It does not address auth/ownership requirements, but that is carried by the schema's confirm field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core action and its immediate consequence front-loaded. Nothing redundant with the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, no-output-schema tool whose annotations already cover safety and idempotency, the description plus schema give an agent what it needs to call correctly. A minor gap is the absence of explicit guidance on when deletion is preferable to updating/disabling the webhook.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the confirm field already documents the mandatory-true confirmation and the incomingWebhookId points to list_incoming_webhooks. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Delete an incoming webhook'), and the resource qualifier 'incoming' distinguishes it from the sibling delete_webhook (outgoing webhook). It stops short of naming any alternative explicitly, so it is clear but not sibling-routing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for whatever still calls it' implies the intent (stop URL traffic), but there is no explicit when-to-use guidance or comparison against update_incoming_webhook (which could disable/rotate without deleting) or list_incoming_webhooks. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_messageDelete a messageA
DestructiveIdempotent

Delete an outbound message for everyone (or only on the linked devices with forEveryone: false). A message still queued is cancelled instead and never sent. This cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Deleting a message cannot be undone. Only set it after the user asked for this or agreed to it.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).
forEveryoneNoDefault true: delete it for every participant.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the description's job is lighter. It adds important context beyond the annotations: deletion cannot be undone, queued messages are cancelled rather than sent, and forEveryone=false restricts deletion to linked devices. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences deliver the essential information without filler. The main action and scope are front-loaded, followed by the queued-message nuance and the irreversible warning. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple destructive tool with three parameters and no output schema, the description covers the key behavioral edge cases: queued messages, device scope, and irreversibility. It does not mention return values or potential errors, but those are not critical for invoking this tool given the schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds value by explaining that forEveryone=false means 'only on the linked devices' — a semantic nuance not present in the schema. Other parameters (messageId, confirm) are already fully documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete'), the resource ('an outbound message'), and the scope ('for everyone' or 'only on linked devices'), making it immediately clear what the tool does. It also distinguishes itself from the sibling cancel_message by clarifying that queued messages are cancelled instead of sent, which helps an agent tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when deletion is appropriate, including the forEveryone modifier and the queued-message cancellation behavior. It does not explicitly name alternatives or say 'use cancel_message when...', but the behavioral distinction is strong enough that an agent can infer the right choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_webhookDelete a webhook endpointA
DestructiveIdempotent

Delete a webhook endpoint. Its events stop at once, including deliveries still retrying.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. The endpoint stops receiving events. Only set it after the user asked for this or agreed to it.
webhookEndpointIdYesThe webhook endpoint id, from list_webhooks.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the description does not need to restate those. It adds valuable context by noting that events stop at once, including deliveries still retrying, which is a behavioral nuance beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The primary action and its immediate consequence are front-loaded, making it easy for an agent to grasp the tool's function quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation with destructive and idempotent annotations, the description covers the essential behavioral impact. No output schema is present, but the response is likely minimal. The only minor gap is the lack of mention of prerequisites or error handling, but that is not critical for this tool type.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with both parameters well-documented (webhookEndpointId sourced from list_webhooks, confirm requiring explicit user consent). The description itself adds no parameter information, so it relies on the schema, which is fully adequate. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete a webhook endpoint') with a specific resource and adds the immediate effect of stopping events, including retrying deliveries. This distinguishes it from sibling tools like create_webhook or update_webhook without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but does not explicitly state when to use it over alternatives like update_webhook or list_webhooks. The context of sibling tools makes it obvious for a delete action, but there is no explicit guidance or exclusion, such as 'use only when the endpoint is no longer needed'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

demote_group_participantsRemove admin rightsA
Idempotent

Turn group admins back into regular members.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYesThe group id (`...@g.us`), from list_groups.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
contactIdsYesContact ids: E.164 with + (`+584241112233`) or `lid:<digits>`.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that the operation mutates, is idempotent, and is non-destructive. The description adds the key behavioral point that affected users remain group members rather than being removed, but it does not discuss partial failures, permissions, or behavior for non-admin contacts. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-formed sentence that front-loads the action and result with no filler or repetition. Every word adds meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation with fully documented parameters, idempotent and non-destructive annotations, and a clear outcome, the description plus schema is largely sufficient. It does not describe return values, but there is no output schema and the state change itself is the main contract; the main gap is the missing explicit usage routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes 100% of the parameters, including accountId, groupId, and contactIds with formats and sources. The description contributes no additional parameter-level meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses an active verb ('Turn ... back') and a precise target state ('regular members'), making clear that this tool removes admin rights while keeping users in the group. This distinguishes it from both promote_group_participants and remove_group_participants without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the usage scenario: use it when group admins should lose admin rights but remain members. However, it does not explicitly say when to prefer this over the sibling promote/remove tools, nor does it state any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_messageEdit a sent text messageA
Idempotent

Change the text of an outbound text message, within WhatsApp's edit window (about 15 minutes). A message still queued is sent with the new text.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe new text.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as mutating, non-destructive, and idempotent. The description adds the two most operationally important traits beyond those annotations: the edit window and the distinct queued-message behavior, both of which are absent from the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with the action and key constraint front-loaded, followed by the queued-message nuance. No filler and no repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation with a complete schema and no output schema, the description supplies the necessary timing and queued-behavior context. It is sufficient for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters fully (100% coverage), so the baseline is 3. The description adds a useful eligibility cue—the messageId must refer to an outbound text message—which the schema's messageId description does not explicitly state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action: changing the text of an outbound text message, and delimits scope with the WhatsApp edit window. This clearly separates it from send_text, delete_message, cancel_message, and reply_to_message in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: use this when an outbound text message's content must change, but only within the ~15 minute edit window, and queued messages will get the replacement text. It does not explicitly name alternatives or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forward_messageForward a messageA

Forward a stored message (received or sent) to up to 5 chats of the same account, the way WhatsApp forwards: the recipients see it as forwarded and no file is uploaded again. Works for text, images, videos, audio, voice notes, documents, stickers, locations and contact cards; polls, calendar events, reactions, view-once and deleted messages answer not_forwardable, and so does a contact's story (only a story the account posted, which is a message, can be forwarded). A message that is forwardedManyTimes goes to one chat per call. Returns a list with one queued message per chat, in the order of to; check each with get_message. To label new content as forwarded, use a send tool with forwarded: true instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesThe chats to forward to, each once: contact ids (E.164 or `lid:<digits>`) or group ids. At most 5; exactly 1 when the message is `forwardedManyTimes`.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: no file re-upload, recipients see it as forwarded, not_forwardable responses for polls/events/reactions/view-once/deleted and contact stories, and a returned list of queued messages to verify with get_message. Annotations cover mutation/open-world, so the bar is lower, but the failure-mode disclosure is genuinely valuable. Slightly short of 5 only because error/permission context outside the not_forwardable cases is not addressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, then tapers into edge cases; every sentence carries a distinct constraint. It is dense and long, but nothing is redundant enough to cut meaningfully.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description explains the return shape (one queued message per chat in the order of `to`) and how to verify it. Content-type boundaries, dedup behavior, and the sibling alternative are all covered, leaving no gap an agent needs before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents messageId, to, and idempotencyKey including formats and the 5-item/forwardedManyTimes limits. The description reinforces the 'up to 5 chats' and forwardedManyTimes constraints but adds no syntax or meaning beyond the schema, so the baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Forward) and resource (a stored message, received or sent) with scope ('to up to 5 chats of the same account'). It explicitly distinguishes itself from the send tools, so an agent can route between forwarding existing content and sending new content without inspecting siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative explicitly ('To label new content as forwarded, use a send tool with `forwarded: true` instead') and enumerates which content types are non-forwardable, giving the agent clear when/when-not boundaries. The forwardedManyTimes one-chat-per-call constraint further clarifies selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_accountGet an accountA
Read-onlyIdempotent

One account: status, linked phone number, profile name, proxy location, disconnect reason and last error. hasQrCode says a QR code is waiting to be scanned (get it with get_account_qr_code).

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior, so the description is free to add value. It does by enumerating the returned fields and explaining the hasQrCode flag, which tells the agent what to expect in the response. No side effects or hidden behavior are omitted beyond what annotations already cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two terse sentences with zero filler. The first front-loads the core purpose and return fields; the second clarifies a subtle field and routes to a sibling. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only getter with no output schema, the description is complete: it lists all key return fields and explains hasQrCode. It doesn't mention error cases or pagination, but those are unlikely to be needed for a single-account fetch, and annotations cover safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter accountId is fully described in the schema (100% coverage) with a clear source reference. The tool description adds no additional parameter detail, but the schema carries the burden, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool returns: one account's status, linked phone number, profile name, proxy location, disconnect reason, last error, and QR-code readiness flag. This clearly distinguishes it from list_accounts (list all) and get_account_qr_code (retrieve QR code), so an agent can pick the right tool without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a single-account lookup and explicitly points to get_account_qr_code for retrieving the QR code. It also benefits from the schema's accountId description ('from list_accounts'), which orients the agent on where the ID comes from. It lacks an explicit 'when not to use' but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_qr_codeGet the QR code to link a numberA
Read-onlyIdempotent

The QR code to scan in WhatsApp (Settings > Linked devices > Link a device), as an image. Waits a few seconds for one when the account is still starting. QR codes rotate about every 20 seconds: call again if it expired. Returns the status instead when the account is already linked, and the pairing code when it links by phone number.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
waitSecondsNoHow long to wait for a QR code to appear. Default 15.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable behavior beyond annotations: QR codes rotate every 20 seconds, it waits during account startup, and returns status or pairing code depending on link state. This is helpful context that annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences that are front-loaded with the purpose and then behavioral notes. It is concise and well-structured, though the second sentence packs multiple facts that could be slightly reorganized for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with annotations covering safety and schema covering parameters, the description explains all key runtime behaviors: waiting, rotation, and conditional return values. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters, so the schema already documents them. The description adds context about waiting behavior and rotation that relates to waitSeconds and the overall operation, enriching the meaning beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a QR code for linking a device in WhatsApp, with specific context (Settings > Linked devices). It distinguishes its purpose from a generic 'get' but does not explicitly differentiate it from sibling tools like request_pairing_code, though it mentions pairing code behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. It gives retry advice (call again if expired) but does not mention any sibling tools or conditions that would make another tool more appropriate, such as using request_pairing_code for phone-number linking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_chatGet a chatA
Read-onlyIdempotent

One conversation of an account: its name, its latest message in full, and WhatsApp's unread, pinned, archived and muted state (a field that is missing is not known yet, which is not the same as false). A chat wuapi stored no message of answers not_found.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lowered, yet the description adds genuine behavioral semantics beyond them: a missing state field means 'unknown', not `false`, and a chat with no stored message yields a `not_found` result. These are real disclosure points an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the resource and scope, then adds the unknown-vs-false caveat and the not_found behavior in compact form. The final sentence ('A chat wuapi stored no message of answers `not_found`') is grammatically awkward, slightly reducing clarity, but no padding is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so by enumerating the relevant fields, the unknown-field semantics, and the failure case. It is largely complete for a single-item read; pagination/format detail is not applicable here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (accountId, chatId) are richly documented, including chatId formats. The description adds no parameter-level detail beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: retrieves one conversation and enumerates what it returns (name, latest message in full, unread/pinned/archived/muted state). The phrase 'One conversation of an account' distinguishes it from the collection-oriented sibling list_chats, though it does not name the sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it retrieves a single chat, and the note that a chat with no stored message answers `not_found` gives a useful edge-case context. However, there is no explicit when-to-use versus get_message/list_chats/get_group, nor any prerequisite guidance beyond what the schema provides.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactGet a contactA
Read-onlyIdempotent

One contact of an account's address book, by number or lid: id: its saved name, profile name, username and picture id as wuapi stored them. A number that is not saved on the phone answers not_found; lookup_contacts asks WhatsApp about any number.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
contactIdYesA contact: E.164 with + (`+584241112233`) or `lid:<digits>`.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive), so the bar is lower; the description still adds real behavior: it returns the stored fields (saved name, profile name, username, picture id) and returns `not_found` for unsaved numbers. It does not mention auth requirements or rate limits, but for a read tool with full annotations this is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler; the resource identity is front-loaded and the sibling contrast is relegated to the follow-up clause. Dense but each clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should hint at the return shape — it does so by enumerating the returned contact fields. Combined with the not-found failure mode, an agent has enough to call and interpret it, though a fuller return description would be ideal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (accountId, contactId) are already fully documented, including the E.164 and `lid:` forms. The description restates the identifier forms without adding syntax or edge-case detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('One contact of an account's address book') plus the accepted identifier forms, and explicitly contrasts scope with the sibling lookup_contacts. An agent can distinguish this from lookup_contacts without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (lookup_contacts) and the condition that selects it: a number not saved on the phone yields `not_found` here, while lookup_contacts queries WhatsApp for any number. That is an explicit when-not plus alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_current_keyWho am IA
Read-onlyIdempotent

The organization, API key (name and last 4 characters, never the key) and project this server acts as. Call it first when you are unsure whether the key is an organization key or a project key.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds value by disclosing that the full API key is never returned, only its name and last 4 characters—a security-relevant guarantee beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no fluff. The first sentence front-loads the resource and output details, and the second gives a direct usage directive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description still explains what will be returned and when to call it. Nothing essential for selecting or invoking the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero parameters and the schema coverage is trivially 100%, so no parameter documentation is needed. The baseline 4 for a zero-parameter tool is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns the current server's identity context: organization, API key name/last 4 characters, and project. This aligns with the title 'Who am I' and distinguishes it from account/group/chat-oriented sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call it first when unsure whether the current key is an organization key or a project key. It provides a clear usage trigger but does not name alternative tools or exclusion conditions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_groupGet a groupB
Read-onlyIdempotent

A group's name, description, settings and participants with their roles (member, admin, owner).

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYesThe group id (`...@g.us`), from list_groups.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish that this is read-only, idempotent, and non-destructive. The description adds useful output-shape context (participants and roles), but it does not disclose error behavior, data freshness, or any other operational quirks, so its contribution is moderate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no filler and immediately lists the relevant returned fields. It is appropriately sized, though it is a fragment and depends on the title for the verb.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read operation with strong annotations and no output schema, the description provides enough return-value context to call it. It could improve by clarifying what happens if the group does not exist or by pointing to list_groups for enumeration, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters already have helpful descriptions indicating where their values come from (list_groups and list_accounts). The tool description adds no parameter-level meaning beyond the schema, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title supplies the verb 'Get' and the description clearly enumerates what is returned: name, description, settings, and participants with roles. It is clear this is a single-group read, but it does not explicitly differentiate itself from siblings like list_groups or get_group_invite_link.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives. With many group-related siblings (list_groups, create_group, get_group_invite_link), the agent must infer that this tool fetches one group's details; no explicit conditions or exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_incoming_webhookGet an incoming webhookA
Read-onlyIdempotent

One incoming webhook: its number, destination and whether it is enabled. Never its URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
incomingWebhookIdYesThe incoming webhook id, from list_incoming_webhooks.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds a genuinely non-obvious behavioral fact beyond structured data: the URL is deliberately omitted from the response, which prevents a wasted call for an agent seeking the secret endpoint. It stops short of describing not-found behavior or the full field set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight clauses with zero filler; the returned-fields summary comes first and the key exclusion ('Never its URL') is stated bluntly at the end where it will be read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations carrying the safety profile and no output schema, the description carries the return-shape burden and does list the salient fields. It is nearly sufficient; the only real gap is the absence of any contrast with get_webhook, which an agent scanning a large sibling set could confuse it with.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with 100% schema description coverage, so the schema fully documents the id and where to source it. The description adds nothing about the parameter, which is acceptable when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (one incoming webhook) and enumerates the fields returned: number, destination, enabled state. 'One' distinguishes it from list_incoming_webhooks, but it never contrasts itself with the sibling get_webhook, so the reader must infer that 'incoming' is the distinguishing qualifier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use statement and no named alternatives. The closest thing to guidance is the negative constraint 'Never its URL', which implicitly tells the agent not to call this for the webhook URL but never says which tool to use instead. The schema, not the description, is where the link back to list_incoming_webhooks lives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invitationGet an invitationA
Read-onlyIdempotent

One invitation's status, and the linked accountId once completed.

ParametersJSON Schema
NameRequiredDescriptionDefault
invitationIdYesThe invitation id.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description carries a low safety-disclosure burden. It adds useful conditional behavior by noting that accountId is linked only once the invitation is completed, but it does not describe status values, error cases, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence with no filler, and the key output concepts—status and linked accountId—are front-loaded. Every word contributes to understanding the tool's result.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with strong annotations, the description covers the essential return content and the conditional completion behavior. It lacks explicit status vocabulary and usage routing, but an agent has enough information to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single invitationId parameter is already well documented as "The invitation id." The description adds no additional parameter-level meaning, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as returning one invitation's status and the linked accountId once completed, which clearly signals a single-invitation lookup. This distinguishes it from sibling tools like list_invitations or cancel_invitation, though it relies on the title for the explicit retrieval verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The singular phrasing implies use when a specific invitation's status or completed accountId is needed, as opposed to listing all invitations. However, it never explicitly states when to prefer this tool over list_invitations or how it relates to cancel_invitation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_messageGet a messageA
Read-onlyIdempotent

One message with its status (queued, sent, delivered, read, failed, or received for inbound), content, and error when it failed. Received media is on demand by default (media.downloaded: false): pass fetchMedia: true to download it once and get a direct mediaFile.url that needs no API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).
fetchMediaNoAlso download the message's media if needed and return its direct URL as `mediaFile`.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it lists possible status values, explains that failed messages include an error, and describes the media download default and the direct URL behavior. It does not cover auth requirements or error cases beyond status='failed'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core return information and then the media behavior. Every sentence adds useful detail without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return values, and it does so by naming statuses, content, error, and mediaFile. Annotations cover the read-only safety profile. It is nearly complete, though it omits not-found or auth error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema for fetchMedia by saying it downloads media once and returns a direct mediaFile.url that needs no API key. It adds little for messageId beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this returns a single message with its status, content, error, and media details. The singular 'One message' distinguishes it from list_messages, but it does not explicitly name or contrast with any sibling tool. This is clear but lacks explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use get_message instead of list_messages or other retrieval tools. It explains the media fetch behavior but does not provide usage context or alternatives. An agent must infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_projectGet a projectA
Read-onlyIdempotent

One project: name, external id, status, account limit and count. Organization keys only.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe project id or `ext:<externalId>`.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds the requirement of organization keys and specifies the returned fields, which is useful behavioral context beyond annotations. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the purpose and key constraint. Every sentence contributes value: the first states the resource and fields, the second adds the org key restriction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter, the description is sufficient. It specifies the return fields and the auth constraint. Without an output schema, the agent knows what to expect. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes the single parameter projectId, including the format (id or ext:<externalId>), with 100% coverage. The description adds little beyond what the schema provides, only indirectly referencing external id in the output fields, so it meets the baseline but doesn't exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (get) and resource (project), enumerates the specific fields returned (name, external id, status, account limit and count), and adds a scope constraint (Organization keys only). This distinguishes it from list_projects and other project-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context that this tool only works with organization keys, which guides when it's applicable. However, it does not explicitly mention alternatives or when not to use it, so it's clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usageGet this month's usageA
Read-onlyIdempotent

The current month's bill so far: billable numbers, proxy traffic, and the total in cents (USD). Organization keys only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds useful behavioral context by specifying what the bill includes and that the total is in cents (USD), plus the org-key restriction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that communicates the resource, contents, unit, and scope without any wasted words. Every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter read-only tool, the description is largely complete: it states what the result includes and its unit. It does not give the exact response shape or clarify timezone/month-boundary semantics, but these are minor for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there are no parameter semantics to explain. The description's mention of organization keys is a scope/auth note rather than a parameter, and with no parameters a score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as the current month's bill/usage and lists the specific contents (billable numbers, proxy traffic, total in USD cents). It also signals org-level scope with 'Organization keys only,' which differentiates it from the project-level sibling get_usage_by_project, though it does not name that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by stating 'Organization keys only,' which implies the caller must use an organization-scoped key and that project-level usage belongs elsewhere. However, it does not explicitly mention the alternative get_usage_by_project or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usage_by_projectGet usage per projectA
Read-onlyIdempotent

Numbers, proxy traffic and messages sent and received per project for a month, for rebilling your customers. With projectId, that project only. Organization keys only.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNo`YYYY-MM` in UTC. Default: the current month.
projectIdNoOne project: its id or `ext:<externalId>`.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only and idempotent. The description adds valuable context: it returns per-project data, can be filtered by a single project, and is restricted to organization keys. This goes beyond what annotations state, though it does not explain default behavior when no projectId is given.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: it opens with the core output and purpose, then clarifies optional filtering and authorization constraints. Every sentence earns its place without repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two optional parameters and no output schema, the description covers purpose, optional filter behavior, and key restrictions. It does not explicitly state what happens without projectId (likely all projects), but this is reasonably inferable from 'per project' and the optional parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters (month with pattern and default, projectId with format). The description enriches meaning by clarifying that projectId scopes the result to a single project ('that project only'), which is helpful and not redundant with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves usage numbers, proxy traffic, and messages per project for a month, with a specific purpose (rebilling). It distinguishes from the sibling 'get_usage' by explicitly saying 'per project', making its scope clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage guidance: 'With projectId, that project only' tells when to filter, and 'Organization keys only' specifies authorization context. It does not explicitly name alternatives like 'get_usage' for overall usage, but the per-project focus inherently differentiates it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_webhookGet a webhook endpointA
Read-onlyIdempotent

One webhook endpoint: its URL, events and whether it is active. Never its signing secret.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhookEndpointIdYesThe webhook endpoint id, from list_webhooks.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds a genuinely useful behavioral fact beyond those: the signing secret is never returned, which sets expectations about what the response will and won't contain. It stops short of noting error cases like unknown or unauthorized ids.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two terse sentences, front-loaded with what is returned and closed with the key negative constraint. Every clause carries information with zero padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a single documented parameter, the description adequately conveys the returned shape (URL, events, active) and the notable omission (signing secret). It is complete enough to call the tool correctly, though it could mention error behavior for missing endpoints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter already documents its source ('from list_webhooks'). The description adds no additional parameter meaning, so the baseline 3 applies since the schema carries the full burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (one webhook endpoint) and enumerates the salient fields it returns (URL, events, active status), so an agent knows this is a single-endpoint fetch. It does not explicitly name the sibling verbs (list_webhooks vs update_webhook) to distinguish use, but the 'one endpoint' scoping makes the get-vs-list distinction clear enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use or when-not-to-use guidance and does not name alternatives such as list_webhooks for enumeration. The only routing hint is in the schema's parameter text ('from list_webhooks'), which the description itself does not leverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

leave_groupLeave a groupA
DestructiveIdempotent

Make the account leave a group. To come back it has to be added or invited again.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. The account leaves the group. Only set it after the user asked for this or agreed to it.
groupIdYesThe group id (`...@g.us`), from list_groups.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable behavioral context beyond annotations by noting that rejoining requires being added or invited again, which is a meaningful side effect not implied by the annotations alone. It does not contradict any annotations and provides a useful consequence of the action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero redundancy. It states the action upfront and adds the consequence in the second sentence. Every word contributes to the meaning, and the structure is efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has no output schema, and the description covers the core action and its reversibility. The confirm parameter requirement is documented in the schema, so its omission from the description is acceptable. The description is sufficient for an agent to understand what the tool does and its impact, though it could optionally mention the confirm step for extra clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all three parameters (accountId, groupId, confirm) already described in the input schema. The tool description adds no additional parameter-specific information, so it does not exceed the baseline expectation. The description does not compensate for any gaps because there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (make the account leave a group) with a specific verb and resource. It also clarifies the consequence of leaving (must be added or invited again), which differentiates it from tools like remove_group_participants that remove other members. The purpose is unambiguous and easily understood by an agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (when the account should leave a group) but does not explicitly contrast it with alternatives such as remove_group_participants or create_group. It provides no exclusions or conditions that would help an agent decide between this and similar group-management tools. The usage context is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_accountsList accountsA
Read-onlyIdempotent

List the linked WhatsApp numbers (accounts), newest first, with their status: ready can send; qr_ready waits for a QR scan; disconnected or failed need attention.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
projectIdNoOnly this project: its id, `ext:<externalId>`, or `none` for resources in no project. Organization keys only; a project key always sees its own project.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral detail beyond those annotations: the account statuses ('ready', 'qr_ready', 'disconnected', 'failed') and their operational meanings, as well as sort order. This helps the agent know what to expect from the call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, readable sentence that front-loads the core purpose, then packs in the most actionable status meanings. Every part earns its place and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema and fully documented optional parameters, the description covers the essential behavioral facts: what is listed, the ordering, and the meaning of each status. Pagination details are already in the schema. It is complete enough for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents limit, cursor, and projectId. The description does not need to re-explain parameters; it adds value primarily through status semantics. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('linked WhatsApp numbers (accounts)'), and adds ordering ('newest first') plus status semantics. This clearly distinguishes it from sibling tools like get_account or reconnect_account.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the go-to tool for listing linked WhatsApp accounts and interpreting their readiness, but it does not explicitly say when to prefer it over get_account or when not to use it. The status explanations give helpful context for acting on results, but no direct alternative guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_chatsList chatsA
Read-onlyIdempotent

An account's conversations, the one with the newest message first: each chat's name, picture id, latest message and WhatsApp's unread, pinned, archived and muted state. Only chats wuapi stored a message of. A state field that is missing (unread, unreadCount, pinned, pinnedAt, archived, muted) is not known to wuapi yet, which is not the same as false. Filter by archived, unread or type, or search names, numbers and recent text with q. Read a conversation with list_messages and the chat's id as chatId.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch the contact or group name, the number, the username and recent message text. Results come best match first.
typeNoOnly chats with a contact, groups, or channels.
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
unreadNotrue: only chats with unread messages or marked as unread. false: every other chat.
archivedNotrue: only chats WhatsApp reported as archived. false: every other chat, including those whose state is not known yet.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description adds real behavioral context: result ordering, the inclusion scope, and the important caveat that a missing state field means 'unknown to wuapi', not false. It does not cover pagination behavior or result volume limits beyond the schema's cursor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool returns before the filtering and routing guidance, and every sentence carries information. The first sentence is dense and semicolon-packed, which slightly slows parsing, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned fields and the state semantics. It also names the downstream tool for reading a conversation. The only gap is pagination/result-set behavior, which is left to the cursor parameter's schema text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters are already documented with enums, bounds and defaults. The description restates the filter options and the meaning of q, but adds little syntax or semantics the schema does not already carry, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('An account's conversations') plus the ordering ('newest message first') and the exact payload fields returned. It also carves out scope ('Only chats wuapi stored a message of'), which cleanly separates it from get_chat and list_messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit filter guidance (by archived, unread or type, or search with q) and routes the agent onward: 'Read a conversation with list_messages and the chat's id as chatId.' No explicit when-not-to-use statement, but the sibling routing is clear enough to select correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contactsList contactsA
Read-onlyIdempotent

An account's address book as its phone synced it to wuapi, ordered by saved name: each contact's id, number, savedName, WhatsApp profile name, and the username and picture id seen so far. Only contacts the phone saved (or that have a business name); people the account just chatted with are in list_chats. Read from what wuapi stored, so about and deviceCount are not here: lookup_contacts asks WhatsApp for those. Search names, usernames and numbers with q.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSearch the saved name, profile name, business name, username or number. Results come best match first.
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe read profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds real context: results are ordered by saved name and come from stored wuapi data rather than a live lookup, which explains staleness and the absence of `about`/`deviceCount`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core identity, then the return fields, then the sibling routing. Dense but every clause carries information; only minor cost is a somewhat crammed middle colon-list, so not a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description adequately describes the result shape and ordering. Pagination is handled by cursor/nextCursor in the schema. Good coverage for a list tool, though it stops short of stating default/max page behavior explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents q, limit, cursor and accountId thoroughly (the schema's `q` description is actually broader than the summary in the prose). The description adds no new parameter syntax or format detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the account's address book synced to wuapi) and its ordering, and enumerates the returned fields (id, number, savedName, profile name, username, picture id). It explicitly distinguishes itself from list_chats and lookup_contacts, so an agent can identify it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names two alternatives and the exact conditions that select them: chatted-with people live in list_chats, and `about`/`deviceCount` require lookup_contacts which asks WhatsApp live. Includes the when-not ('only contacts the phone saved') and the search entry point via `q`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_groupsList groupsA
Read-onlyIdempotent

Every group the account is in, read live from WhatsApp, with the participant count. A group inside a community has that community's id as communityId (absent when it is in none), and default: true when it is the community's announcement group. Use get_group for the participants.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the safety profile is covered. The description adds genuine value beyond them: 'read live from WhatsApp' signals fresh (not cached) data, and it explains the communityId/default output semantics. It doesn't mention pagination/latency behavior, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the primary purpose front-loaded, then output-field semantics, then the sibling pointer. Every clause earns its place, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must carry return-value meaning; it does cover the notable output fields (participant count, communityId, default). It stops short of describing the paginated envelope (nextCursor), which the cursor param implies but the description never states, leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, cursor, and accountId are already documented in-schema. The description adds no parameter syntax or constraints beyond what the schema provides, which is the correct baseline of 3 here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (groups) with explicit scope: 'Every group the account is in, read live from WhatsApp.' It also distinguishes itself from the sibling get_group, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the sibling alternative and the condition selecting it: 'Use get_group for the participants.' This gives clear routing context, though it doesn't spell out when-not to use list_groups (e.g., cost/latency of listing everything) or broader trade-offs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_incoming_webhooksList incoming webhooksA
Read-onlyIdempotent

The incoming webhooks: secret URLs that send a WhatsApp message from one of your numbers to one fixed contact or group. Shows the name, the number, the destination and whether each is enabled. Never the URLs themselves.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
projectIdNoOnly this project: its id, `ext:<externalId>`, or `none` for resources in no project. Organization keys only; a project key always sees its own project.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-redundant behavior: the URLs themselves are never returned (a secret-redaction guarantee) and it enumerates the returned fields, which matters since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight clauses, front-loaded with the resource definition before the return/redaction facts. No wasted sentences, though the definitional opener takes more space than a bare verb would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully compensates by naming the returned fields and the redaction rule; annotations cover the safety profile and the schema covers parameters. Only pagination/workflow context is thin, but limit/cursor in the schema make that minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; limit, cursor, and projectId are all fully documented in the schema. The description adds no parameter-level detail (e.g., no note on pagination semantics), so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource and defines it precisely ("secret URLs that send a WhatsApp message from one of your numbers to one fixed contact or group"), and states which fields are shown. It doesn't explicitly contrast with list_webhooks (outgoing) or get_incoming_webhook (single), so differentiation is left to the reader, but the resource is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance, and no mention of the sibling alternatives (get_incoming_webhook for one, list_webhooks for outgoing, create/update/delete_incoming_webhook for other operations). The agent must infer that this is the enumeration tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_invitationsList invitationsB
Read-onlyIdempotent

Invitations and their status: pending, in_progress, completed (with the new accountId), failed, cancelled or expired.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
statusNo
projectIdNoOnly this project: its id, `ext:<externalId>`, or `none` for resources in no project. Organization keys only; a project key always sees its own project.

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is safe. The description adds the status lifecycle values including 'completed (with the new accountId)', which reveals what the returned items signal. It does not describe pagination behavior, but annotations cover the safety profile, and the description adds behavioral context around statuses.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence that front-loads the resource and status values. It is compact and informative, though it could be more actionable by adding a usage hint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a listing tool with 4 optional params and no output schema, the description plus schema provide a usable baseline. However, it does not mention that results are paginated via cursor/limit, nor does it clarify whether status='completed' includes the accountId in the response. An agent could miss the pagination workflow without inferring it from the cursor parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75% (3 of 4 params have descriptions; status has only an enum with no description). The description enumerates status values, which complements the enum list but adds no meaning beyond it. It does not clarify pagination fields or filtering semantics beyond what the schema already states. Baseline 3 is appropriate since the schema carries most of the weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description identify a list operation for invitations and enumerate the statuses returned. It is distinct from sibling tools like get_invitation (single retrieval) and create_invitation (creation), but the description does not explicitly name those siblings or scope the listing (e.g., no mention of filtering by account or time).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no context for when to use this tool versus cancel_invitation/get_invitation/create_invitation. The status list implies a filtering use-case, and the schema's projectId param hints at scoping, but the description itself provides no explicit when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_messagesList messagesA
Read-onlyIdempotent

Messages wuapi stored, newest first: sent and received. Filter by account, chat and direction to read a conversation. Use list_chats to see which conversations an account has.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
chatIdNoThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
cursorNo`nextCursor` from the previous page, to get the next one.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts).
directionNo
projectIdNoOnly this project: its id, `ext:<externalId>`, or `none` for resources in no project. Organization keys only; a project key always sees its own project.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds the non-obvious ordering fact ('newest first') and that both sent and received are returned, but says nothing about pagination limits or result volume beyond what the cursor/limit schema already implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with the resource and ordering front-loaded, and the sibling pointer last. Slight awkwardness in the opening ('Messages wuapi stored') but no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated read-only list tool whose annotations carry the safety profile and whose schema covers 83% of parameters, the description says enough to call it correctly. Only return-shape/pagination expectations beyond the cursor field are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83% (above the 80% threshold), so the baseline is 3. The description echoes three filter dimensions (account, chat, direction) that the schema already documents, and adds no syntax or format detail for limit, cursor, or projectId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Messages ... stored') with scope ('newest first: sent and received'), and names a sibling (list_chats) to clarify what it is not. It stops short of distinguishing itself from get_message, but an agent can still tell the general purpose without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Filter by account, chat and direction to read a conversation' gives a clear use context, and 'Use list_chats to see which conversations an account has' points to the prerequisite/alternative source of chat ids. There is no explicit when-not guidance, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList projectsB
Read-onlyIdempotent

Projects: one per customer of a platform, each with its own numbers, keys, webhooks and usage. Organization keys only.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
statusNo
externalIdNoExact match on your own customer id.

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey that this is read-only, idempotent, and non-destructive. The description adds meaningful context beyond annotations: projects are scoped to organization keys, and each project belongs to a customer. This helps the agent understand access boundaries, though it doesn't mention result ordering or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and free of filler, with the key conceptual context packed into two sentences. It is not a full sentence and could be clearer, but it earns its place by defining the resource and scope without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple optional-filter list tool with strong annotations and a fairly descriptive schema. The description supplies domain context and org scoping, but because there is no output schema and no usage guidance, the agent is left to infer the exact return shape and when this endpoint is preferable to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, and the description adds no parameter-level detail. limit, cursor, and externalId are documented in the schema, and status is self-explanatory via its enum, but the description itself contributes nothing about how parameters affect the listing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The tool name and title clearly state the verb and resource: list projects. The description adds useful context about what a project is — one per customer with its own numbers, keys, webhooks and usage — while the phrase 'Organization keys only' clarifies the scope. It does not explicitly say 'returns all projects' but the intent is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use list_projects versus get_project or when to use filters like status or externalId. It provides background context but no usage direction or exclusions, so an agent must infer the appropriate circumstances.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_proxy_locationsList proxy locationsA
Read-onlyIdempotent

Countries and cities a new number's proxy can exit from, for create_account and create_invitation. Search with q (sao finds Sao Paulo) or filter by country.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoCity or country name or code.
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
countryNoISO 3166-1 alpha-2 country code.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only and idempotent, and the description adds behavioral detail beyond them: `q` supports partial search, as shown by 'sao' finding Sao Paulo, and the result set is exit locations for new numbers. It could mention pagination explicitly, but cursor/limit in the schema cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundant phrasing. The most important information (what the tool lists and why it matters) is front-loaded, and the usage example is compact and concrete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup with no required parameters and no output schema, the description conveys the key semantics well: what is returned, for which flows, and how to filter. It leaves response shape implicit, but the purpose is clear enough for an agent to call and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds one layer of meaning by showing that `q` supports partial search and by framing `country` as a filter. Limit and cursor are left to the schema, which documents them sufficiently, so this is a small but real enhancement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (proxy locations) and explains what they are: countries and cities a new number's proxy can exit from. It also ties the tool to create_account and create_invitation, giving it a clear role among the many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the intended context (for create_account and create_invitation) and describes two usage modes: search with `q` or filter by `country`. It doesn't name exclusions or a competing tool, but no comparable alternative appears in the sibling list, so the guidance is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhooksList webhook endpointsA
Read-onlyIdempotent

The webhook endpoints that receive events: URL, events and whether active. Signing secrets are never shown here.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20.
cursorNo`nextCursor` from the previous page, to get the next one.
projectIdNoOnly this project: its id, `ext:<externalId>`, or `none` for resources in no project. Organization keys only; a project key always sees its own project.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare the operation read-only, idempotent, and non-destructive. The description adds meaningful behavior beyond that by explicitly stating the returned fields and, importantly, that signing secrets are never shown. Given no output schema, this is valuable disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences deliver the essential facts with no filler. The first sentence names the resource and fields, and the second adds a key security-relevant exclusion, all front-loaded and structured clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation, the description plus schema covers what the tool returns, the notable absence of signing secrets, and all optional filtering/pagination parameters. It is broadly complete, though it could have briefly noted that pagination is supported via cursor even though the schema already documents it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters already have full descriptions in the schema, including pagination defaults and projectId filtering semantics. The tool description adds no parameter-level meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as webhook endpoints and names the key returned fields: URL, events, and active status. It is not a tautology and is easily distinguished from create/update/delete webhook siblings, though the description itself lacks an explicit action verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives. There is no mention of when to choose list_webhooks over create_webhook, update_webhook, or delete_webhook, nor any prerequisites or context for fetching webhook configurations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_contactsLook up contactsA
Read-onlyIdempotent

About text, picture id, WhatsApp username, business name and device count of 1 to 50 contacts, asked from WhatsApp (the saved names are in list_contacts). Usernames cannot be searched: WhatsApp does not let a linked device resolve an @username, so look contacts up by number or lid: id.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
contactIdsYes1 to 50 contact ids: E.164, digits or `lid:<digits>`.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavioral context not in the structured fields: the 1-to-50 batching limit and the linked-device username-resolution limitation that will silently fail otherwise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the returned-fields summary front-loaded and the key limitation second. The opening clause is grammatically muddy ('About text ... asked from WhatsApp'), which slightly hurts readability, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by naming the returned fields, which is the right move. Combined with 100% schema coverage and complete annotations, an agent has enough to call this correctly; only the relationship to overlapping siblings is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (accountId, contactIds) are fully documented in the schema, including the `lid:<digits>` syntax. The description restates the 1-to-50 range and the number/lid lookup form but adds no new parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (look up) and resource (contacts) and enumerates exactly which fields come back (about text, picture id, WhatsApp username, business name, device count), which goes well beyond the title. It also draws a boundary against one sibling by noting saved names live in list_contacts, though it never addresses get_contact, which overlaps in scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete invocation guidance: contacts must be resolved by number or `lid:` id, usernames cannot be searched because a linked device cannot resolve an @username, and it points to list_contacts for saved names. It stops short of saying when to prefer this over get_contact or check_numbers, so there is still inference left to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_whatsapp_infoLook up WhatsApp detailsA
Read-onlyIdempotent

Read details from WhatsApp through a linked number: a contact's profile picture or business profile, who a contact QR link or business message link points to, WhatsApp's AI bot directory, and the sticker pack or catalog order a message refers to. Nothing is changed.

Actions:

  • contact_picture: The contact's profile picture URL, when the account can see it.

  • business_profile: A business contact's address, email, categories, time zone and opening hours.

  • resolve_link: Who a contact QR link or business message link points to, and its prefilled text. Fails with not_supported when WhatsApp does not offer it to the account.

  • bots: WhatsApp's AI bot directory as the account sees it. Fails with not_supported where WhatsApp does not offer it.

  • sticker_pack: A sticker pack and its stickers.

  • order: The products, quantities and totals of a catalog order received as a message.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe link, or its code. Required for `resolve_link`.
kindNo`contact` for a contact QR link, `business` for a business message link. Required for `resolve_link`.
limitNoPage size, 1 to 100. Default 20. Optional for `bots`.
tokenNoThe order's token, from the same order message. Required for `order`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `bots`.
orderIdNoThe order id, from an order message. Required for `order`.
previewNoA small preview instead of the full picture. Optional for `contact_picture`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
contactIdNoA contact: E.164 with + (`+584241112233`) or `lid:<digits>`. Required for `contact_picture`, `business_profile`.
stickerPackIdNoThe sticker pack id, from a sticker message. Required for `sticker_pack`.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/openWorld/destructive=false, so the bar is lower; the description still adds value with 'Nothing is changed', visibility caveats ('when the account can see it'), and explicit not_supported failure modes for two actions. It leaves pagination behavior for limits/cursors undescribed beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by a scannable action list; every bullet earns its place. The opening sentence is dense and slightly run-on when it crams the sticker pack and catalog order into the same clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema the description carries the return-value burden, and it does describe what each action yields (picture URL, business address/email/categories/hours, prefilled text, directory, sticker pack contents, order products/quantities/totals). Pagination semantics for bots are the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description goes further by tying each action to its relevant inputs (resolve_link's link/kind, order's token/orderId, bots' paging) and explaining what the resulting identifiers refer to. It does not add syntax or format details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb (Read) plus resource (WhatsApp details) and scopes it to a linked number, then enumerates all six actions with a one-line gloss of each. An agent can tell this apart from siblings like lookup_contacts or get_message without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Per-action entries imply when each mode applies and add per-action conditions (e.g. resolve_link 'Fails with not_supported when WhatsApp does not offer it to the account', bots 'as the account sees it'). It does not explicitly name a sibling alternative or state when NOT to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_block_listBlock or unblock contactsA
DestructiveIdempotent

The account's block list on WhatsApp: list blocked contacts, block a contact (it can no longer message or call the account) or unblock it.

Actions:

  • list: Blocked contacts, with their number and lid: id when known.

  • block: Block a contact. Needs confirm: true.

  • unblock: Unblock a contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20. Optional for `list`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list`.
confirmNoMust be true. The contact can no longer message or call the account. Only set it after the user asked for this or agreed to it. Required for `block`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
contactIdNoA contact: E.164 with + (`+584241112233`) or `lid:<digits>`. Required for `block`, `unblock`.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real context by stating the consequence of block (the contact can no longer message or call) and that confirm must be set, which goes beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, followed by a tight action list where each entry earns its place. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description does name the list return shape (number and lid: id), which is useful for a read action. Pagination via limit/cursor is left to the schema, and block/unblock outcome descriptions are minimal, so it is strong but not exhaustive for a 6-parameter multi-action tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (limit, cursor, confirm, accountId, contactId) is already documented. The description only restates the confirm:true requirement and does not add syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the account's WhatsApp block list) plus a clear verb set, and enumerates the three actions (list/block/unblock) with their effects. An agent can distinguish this from siblings like delete_chat or manage_privacy without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action breakdown gives clear context for what each mode does and when it applies (e.g. blocking stops messages/calls, unblocking reverses it). It stops short of naming alternatives or explicit exclusions, but the routing between the three actions is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_brandingManage invitation brandingA
Idempotent

How the invitation page and email look to your customers: display name, logo, accent color, support link, and whether the "Powered by wuapi" footer shows. Organization keys only.

Actions:

  • get: The current branding.

  • update: Change any of the fields. Returns the branding.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do. See the list of actions in the tool description.
logoUrlNohttps URL of your logo. null clears it. Optional for `update`.
supportUrlNohttps URL where customers get help. null clears it. Optional for `update`.
accentColorNo`#RRGGBB`. null uses wuapi's. Optional for `update`.
displayNameNoYour name as customers see it. Required the first time. Optional for `update`.
hideWuapiBrandingNoHide the "Powered by wuapi" footer. `true` needs the White label add-on (`addon_required` otherwise). Optional for `update`.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotent=true, destructive=false, readOnly=false, so safety is covered. The description adds useful context beyond that: org-key scoping and the fact that update returns the resulting branding. It does not flag that the addon_required condition for the footer lives in the schema, but that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose sentence, then a compact two-item action list. Every sentence contributes; only the slightly prose-heavy first line keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly notes that update returns the branding. For a 6-parameter multi-action tool with full schema coverage and annotations covering safety, this is nearly complete; only the addon gate for hideWuapiBranding is left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter is already documented in the schema, including null-clearing semantics and the addon requirement. The description's field list (display name, logo, accent color, support link, footer) merely maps to those params without adding format or behavior detail. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (invitation branding) and enumerates the exact surface it controls — invitation page, email, display name, logo, accent color, support link, footer. An agent can distinguish it from sibling tools like manage_profile or manage_privacy without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list defines when to use get vs update and what each returns. 'Organization keys only' gives the scope prerequisite. It does not name a sibling alternative, but the tool is distinct enough that this is minor.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_channelManage channelsA

WhatsApp channels (one-to-many broadcasts, ids end in @newsletter): list the ones the account follows or owns, read one and its posts, preview an invite, create a channel, follow, unfollow, mute and unmute, react to posts and count as a viewer. To post to a channel the account administers, use send_text or send_media with to set to the channel id.

Actions:

  • list: Channels the account follows or administers, with its role.

  • get: One channel: name, description, subscriber count, the account's role and whether it is muted.

  • preview_invite: The channel behind an invite code or link, without following it.

  • list_messages: The channel's recent posts, newest first, with view and reaction counts.

  • create: Create a channel with the account as owner. Returns it.

  • follow: Follow the channel.

  • unfollow: Stop following the channel.

  • mute: Mute the channel's notifications.

  • unmute: Unmute the channel.

  • react: React to a post with an emoji, or remove the reaction with an empty string.

  • mark_viewed: Count the account as a viewer of these posts.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe invite code, or the full invite link (`https://chat.whatsapp.com/...`, `https://whatsapp.com/channel/...`). Required for `preview_invite`.
nameNoThe channel name. Required for `create`.
emojiNoOne emoji. An empty string removes the reaction. Required for `react`.
limitNoPage size, 1 to 100. Default 20. Optional for `list`, `list_messages`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list`, `list_messages`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
channelIdNoThe channel id (`...@newsletter`), from manage_channel `list`. Required for `get`, `list_messages`, `follow`, `unfollow`, `mute`, `unmute`, `react`, `mark_viewed`.
descriptionNoThe channel description. Optional for `create`.
pictureBase64NoThe channel picture as a base64 JPEG. Optional for `create`.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice. Optional for `create`.
channelMessageIdNoA post's id, from `list_messages`. Required for `react`.
channelMessageIdsNo1 to 100 post ids, from `list_messages`. Required for `mark_viewed`.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is covered. The description adds real behavior beyond that: it distinguishes the follow/unfollow/mute/unmute state changes, notes create returns the channel, clarifies react removes a reaction with an empty string, and explains that mark_viewed merely counts the account as a viewer. Auth requirements are only implied through the schema's accountId note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the resource definition and the sibling hand-off before the action list, and every bullet carries information rather than repeating the enum names verbatim. It is long, but the length is justified by eleven distinct actions; only marginally more verbose than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, multi-action tool with no output schema, the description covers each action's semantics and gives partial return shape for get, list_messages and create (fields, ordering, counts). It stops short of describing list pagination behavior or return shapes for the remaining actions, which is the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter including per-action requirements, pagination and the idempotency contract; baseline 3 applies. The description contributes only a little extra meaning, chiefly the `...@newsletter` id format and the `to`-field routing for posting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise definition of the resource (WhatsApp one-to-many broadcast channels, ids ending in @newsletter) and enumerates every supported action with a verb-plus-resource phrasing. It also draws a sharp boundary against the sibling send_text/send_media tools for posting, so an agent can tell it apart without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the one ambiguous case to alternatives: 'To post to a channel the account administers, use send_text or send_media with `to` set to the channel id.' Each action bullet states its precondition or scope (e.g. preview_invite 'without following it'), leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_communityManage communitiesA

WhatsApp communities: a community is a group with community: true that links other groups. Create one, list its groups and members, and link or unlink groups (the account must admin both). get_group reads the community itself; send to it like a group. To create a new group inside a community, use create_group with communityId; list_groups shows each group's communityId.

Actions:

  • create: Create a community with the account as owner. Returns it.

  • list_groups: The groups linked to the community, marking its default (announcement) group.

  • list_members: Members across the community's linked groups.

  • link_group: Link a group into the community.

  • unlink_group: Unlink a group from the community. The group itself stays.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe community name. Required for `create`.
limitNoPage size, 1 to 100. Default 20. Optional for `list_groups`, `list_members`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list_groups`, `list_members`.
groupIdNoThe group to link or unlink (`...@g.us`). Required for `link_group`, `unlink_group`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
communityIdNoThe community's group id (`...@g.us`), from list_groups (`community: true`). Required for `list_groups`, `list_members`, `link_group`, `unlink_group`.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice. Optional for `create`.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, yet the description adds real behavioral context: create returns the community, unlink leaves the group intact, and admin rights are required for linking. It does not detail error modes or pagination behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The concept explanation is front-loaded before the action list, and each bullet earns its place. Slightly longer than strictly necessary for a single-tool definition, but no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers a five-action mutation tool with no output schema: it explains return shape for create, list semantics, and the persistence guarantee for unlink. Missing only edge-case behavior (what happens to linked groups when a community is deleted), which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-cutting semantics the schema cannot: which params each action needs (name for create, groupId for link/unlink, communityId for the rest) and where communityId comes from.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set and resource: creating, listing, linking, unlinking WhatsApp community groups, with each action enumerated and defined. It explicitly distinguishes itself from siblings by naming get_group and create_group and their respective roles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Routes the agent explicitly: use get_group to read a community, use create_group with `communityId` to make a nested group, list_groups reveals `communityId`. It also states the precondition that the account must admin both groups for link/unlink.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_favorite_stickersManage favorite stickersA
Idempotent

The account's favorite stickers: the star tab of WhatsApp's sticker picker, which WhatsApp keeps in sync with the phone. List them, get one's file, favorite a sticker from a message or an uploaded WebP file, or remove one. Adding and removing change the list on the phone too.

Actions:

  • list: The favorites, newest first, from what wuapi stored (no call to WhatsApp). Each has media.url and media.downloaded; animated and emojis are null until its file was fetched.

  • get_file: A direct URL to one favorite's file that needs no API key. Fetches the file from WhatsApp the first time, which needs the account ready.

  • add: Favorite a sticker: pass messageId or uploadId, one of them. A sticker that is a favorite already is returned as is.

  • remove: Take a sticker out of the favorites. It can be favorited again.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size, 1 to 100. Default 20. Optional for `list`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list`.
uploadIdNoA WebP file uploaded with upload_file (`mimeType: image/webp`, at most 2 MB) to favorite. Optional for `add`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
messageIdNoA sticker message of this account to favorite (from list_messages or a webhook). Optional for `add`.
stickerIdNoA favorite sticker's id, from the `list` action. Required for `get_file`, `remove`.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice. Optional for `add`.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotent, non-destructive, open-world), the description discloses meaningful behavior: add/remove are synced to the phone, list reads stored data without contacting WhatsApp, get_file lazily fetches on first use, and re-adding an existing favorite is a no-op. These are non-obvious operational traits that the structured fields do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary is front-loaded, and the per-action bullet structure makes the variants scannable. It is somewhat long, but nearly every sentence carries operational detail rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, no-output-schema tool, the description covers per-action behavior and even sketches the list return shape (media.url, media.downloaded, animated/emojis null until fetched). It is close to complete, with only minor gaps around error cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 8 parameters in detail. The description adds the useful mutual-exclusion constraint for add (messageId or uploadId, 'one of them'), but otherwise largely restates what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (favorite stickers / the star tab of the sticker picker) and enumerates the exact operations (list, get_file, add, remove). It distinguishes itself from superficially similar siblings like star_message by scoping to favorited stickers specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action carries clear context: list is local-only (no WhatsApp call), get_file needs the account ready, add requires either messageId or uploadId. It clearly routes usage per action, though it does not explicitly compare against siblings such as star_message or send_media.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_group_joinsJoin groups and handle join requestsA

Joining groups: preview the group behind an invite link, join it, and, in a group that needs approval to join, list, approve or reject the pending requests (the account must be an admin).

Actions:

  • preview_invite: The group behind an invite code or link, without joining: name, description, size.

  • join: Join a group with an invite code or link. Returns the group id; a group that needs approval makes it a pending request instead.

  • list_requests: Pending requests to join the group.

  • approve_requests: Let these people in. Each result says whether it worked.

  • reject_requests: Turn these requests down. Each result says whether it worked.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe invite code, or the full invite link (`https://chat.whatsapp.com/...`, `https://whatsapp.com/channel/...`). Required for `preview_invite`, `join`.
limitNoPage size, 1 to 100. Default 20. Optional for `list_requests`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list_requests`.
groupIdNoThe group id (`...@g.us`), from list_groups. Required for `list_requests`, `approve_requests`, `reject_requests`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
contactIdsNo1 to 256 contact ids of people who asked to join. Required for `approve_requests`, `reject_requests`.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice. Optional for `join`.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag it as a write-capable, non-idempotent, open-world tool. The description adds real behavioral context beyond them: the admin prerequisite, the surprise that `join` may silently become a pending request, and per-action result semantics ('Returns the group id', 'Each result says whether it worked').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary sentence followed by a tight action list; each bullet earns its place by naming the action and its outcome. Slightly verbose in the opening clause but no wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter multi-action tool with no output schema, the description covers every action's purpose and the key gating conditions (admin, approval). Return values are only loosely described, but no output schema exists to compensate, so this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter and its required actions. The description adds only marginal meaning (which action maps to which concept) beyond that baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (groups) and enumerates the exact five operations (preview_invite, join, list_requests, approve_requests, reject_requests). An agent can distinguish this from siblings like add_group_participants or get_group_invite_link without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the context for each action, including that joining an approval-gated group becomes a pending request and that list/approve/reject require the account to be an admin. It does not, however, name any alternative tool or give explicit when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_group_settingsChange a group's info and settingsA
DestructiveIdempotent

Change a group the account administers: its name, description and settings (who can send, who can edit the info, whether joining needs approval, who can add members), and its picture.

Actions:

  • update: Change any of name, description, announce, locked, joinApproval and memberAddMode. Returns the group.

  • set_picture: Set the group picture from an https URL or base64 JPEG. Returns the picture.

  • delete_picture: Remove the group picture. Needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe group name. Optional for `update`.
actionYesWhat to do. See the list of actions in the tool description.
lockedNo`true`: only admins can edit the group info. Optional for `update`.
confirmNoMust be true. The group picture is removed. Only set it after the user asked for this or agreed to it. Required for `delete_picture`.
groupIdNoThe group id (`...@g.us`), from list_groups. Required for every action.
announceNo`true`: only admins can send messages. Optional for `update`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
pictureUrlNoThe picture as a public https URL of a JPEG. wuapi downloads it. Pass this or `pictureBase64`. Optional for `set_picture`.
descriptionNoThe group description. An empty string clears it. Optional for `update`.
joinApprovalNo`true`: new members need an admin's approval (see manage_group_joins). Optional for `update`.
memberAddModeNoWho can add members. Optional for `update`.
pictureBase64NoThe picture as a base64 JPEG. Pass this or `pictureUrl`. Optional for `set_picture`.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive and idempotent behavior, but the description adds substantial operational detail: delete_picture removes the picture and needs confirm: true only after user consent; update returns the group; set_picture returns the picture; and set_picture downloads the image from an https URL.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the tool's overall purpose, then uses a concise bulleted action list to separate the three operations. Every sentence carries relevant information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, multi-action, destructive tool, the description covers the actions, their required conditions, return values, and input constraints. With the schema and annotations carrying safety and parameter details, nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 12 parameters individually. The description adds useful action-level grouping of fields but does not introduce much semantic detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: change a group's name, description, settings, and picture, with three explicit actions. It is clear what the tool does, but it does not explicitly distinguish itself from nearby siblings such as manage_group_joins or manage_group_participants beyond a passing reference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action is given clear context: update lists which fields can change, set_picture explains the two image input forms, and delete_picture requires confirm: true and says to use it only after the user asked. It lacks explicit when-not guidance and does not fully clarify the boundary with manage_group_joins.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_labelsManage labelsA
DestructiveIdempotent

WhatsApp Business labels on chats and messages: create or edit a label, delete it, and add it to or remove it from a chat or a message. WhatsApp Business accounts only; others answer not_supported. There is no endpoint that lists labels: they arrive in label.updated webhook events, and upsert creates one under an id you choose.

Actions:

  • upsert: Create the label with this id, or rename or recolor it. Returns the label.

  • delete: Delete the label. Needs confirm: true.

  • label_chat: Add the label to a chat.

  • unlabel_chat: Remove the label from a chat.

  • label_message: Add the label to a message, as the account that sent or received it.

  • unlabel_message: Remove the label from a message.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe label name. Required for `upsert`.
colorNoWhatsApp's label color index, 0 to 19. Default 0. Optional for `upsert`.
actionYesWhat to do. See the list of actions in the tool description.
chatIdNoThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`). Required for `label_chat`, `unlabel_chat`.
confirmNoMust be true. The label is removed from every chat and message. Only set it after the user asked for this or agreed to it. Required for `delete`.
labelIdNoThe label id. `upsert` creates the label under this id when there is none. Required for every action.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for `upsert`, `delete`, `label_chat`, `unlabel_chat`.
messageIdNoA wuapi message id (from list_messages, a send tool, or a webhook). Required for `label_message`, `unlabel_message`.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety bar is partly met structurally. The description adds real value beyond them: non-Business accounts answer `not_supported`, delete requires `confirm: true`, and deletion removes the label from every chat and message.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A front-loaded one-sentence summary is followed by a scannable action list, so an agent can locate the relevant action quickly. It is slightly long, but every line maps to a distinct action or constraint, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter multi-action tool with no output schema, the description covers the key gaps: action-parameter coupling, the confirm requirement, the Business-only limit, and how labels get listed. It even notes that upsert returns the label, partially compensating for the missing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (including action, labelId, confirm, chatId, messageId) is already documented in the schema. The description reinforces the upsert-creates-under-id semantics, but adds no format or validation detail beyond what the schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (WhatsApp Business labels on chats and messages) and enumerates the exact operations via the actions list. There is no sibling label tool, so it is trivially distinguishable, and the WhatsApp Business-only restriction is stated upfront.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action is given a one-line when-to-use gloss (upsert to create/rename/recolor, delete to remove, label/unlabel for chat vs message). It also proactively explains the non-obvious workflow: there is no list endpoint and labels arrive via label.updated webhooks. No explicit alternative-tool comparison, but no sibling overlaps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_privacyManage privacy settingsA
Idempotent

The account's WhatsApp privacy settings: who sees its last seen, profile picture, stories and online status, who may add it to groups or call it, and whether it sends read receipts.

Actions:

  • get: Every privacy setting.

  • get_story_privacy: Who sees the account's stories: its contacts, all but some, or only some.

  • update: Change one or more settings. Each setting is one change on WhatsApp. Returns every setting.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do. See the list of actions in the tool description.
onlineNoWho sees it online. Optional for `update`.
callAddNoWho can call it: everyone, or only known contacts. Optional for `update`.
profileNoWho sees its profile picture. Optional for `update`.
storiesNoWho sees its stories. Optional for `update`.
groupAddNoWho can add the account to groups. Optional for `update`.
lastSeenNoWho sees its last seen. Optional for `update`.
messagesNoWho can message it. Optional for `update`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
readReceiptsNo`none` stops sending read receipts (and seeing others'). Optional for `update`.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnly=false, idempotent=true, destructive=false, and openWorld=true. The description adds useful behavioral detail by noting that each setting is one WhatsApp change and that `update` returns every setting, though it does not discuss permissions, rate limits, or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the resource scope and then structured as a compact action list. Every sentence contributes either purpose or action semantics, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, three-action management tool with no output schema, the description covers the action modes, the privacy surfaces, and the return behavior for `get` and `update`. The remaining parameter details are fully supplied by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so most parameter meaning is already covered. The action parameter explicitly defers to the tool description, and the description fulfills that by defining each action's behavior, adding value beyond the enum values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

It states the resource precisely as WhatsApp privacy settings and enumerates the specific surfaces it controls: last seen, profile picture, stories, online status, group adds, calls, and read receipts. This distinguishes it from generic account/profile-management siblings even without naming an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list clearly explains when to use each mode: `get` for all settings, `get_story_privacy` for story visibility, and `update` for changing one or more settings. It lacks explicit when-not guidance or named sibling alternatives, but the action selection context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_profileManage the account's profileA
Destructive

The linked number's own WhatsApp profile: its display name and About text, its profile picture, and its contact QR link (a https://wa.me/qr/... link that opens a chat with it).

Actions:

  • update: Change the display name, the About text, or both.

  • set_picture: Set the profile picture from an https URL or base64 JPEG. Returns the picture.

  • delete_picture: Remove the profile picture. Needs confirm: true.

  • get_contact_link: The account's contact QR link.

  • reset_contact_link: Revoke the contact QR link and return a new one. The old link stops working. Needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name, up to 25 characters. Optional for `update`.
aboutNoAbout text, up to 139 characters. Optional for `update`.
actionYesWhat to do. See the list of actions in the tool description.
confirmNoMust be true. This cannot be undone. Only set it after the user asked for this or agreed to it. Required for `delete_picture`, `reset_contact_link`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
pictureUrlNoThe picture as a public https URL of a JPEG. wuapi downloads it. Pass this or `pictureBase64`. Optional for `set_picture`.
pictureBase64NoThe picture as a base64 JPEG. Pass this or `pictureUrl`. Optional for `set_picture`.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint, openWorldHint, and non-idempotent, but the description adds real value on top: it discloses that reset_contact_link revokes the old link permanently ('the old link stops working'), that delete_picture is irreversible, that set_picture returns the picture, and that a JPEG is required. It stops short of covering rate limits or auth specifics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line resource definition, then a scannable bulleted action list where each bullet carries an operative constraint. Slightly verbose in re-describing the QR link, but every line earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-action, 7-parameter mutation tool with no output schema, the description covers all branches, required flags, and destructive consequences. It is complete enough to invoke correctly, with only minor gaps around error/response behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so character limits, URL pattern, base64 alternative, and confirm semantics are all documented in the schema. The description reinforces which parameters belong to which action but adds no new syntax or format detail, matching the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the linked number's own WhatsApp profile) with its concrete fields (display name, About, picture, contact QR link) and enumerates every action. The phrase 'the linked number's own WhatsApp profile' cleanly separates it from the similarly-named update_account sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list implies when each operation applies, and destructive actions are gated with 'Needs `confirm: true`'. However, there is no explicit when-to-use/when-not guidance and no routing to alternatives such as update_account or get_account_qr_code, so the agent must infer selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_projectUpdate, delete or audit a projectA
DestructiveIdempotent

Change a project (rename it, set its external id, metadata or account limit, suspend or resume it), delete it, and list or revoke its API keys. Suspending refuses every send and write in the project while reads and inbound messages keep working. Organization keys only. New project keys are created in the wuapi dashboard: no tool returns an API key.

Actions:

  • update: Change any of name, externalId, metadata, maxAccounts and status. Returns the project.

  • delete: Delete the project: its keys stop working at once, and its numbers are logged out and deleted in the background with its webhook endpoints. Needs confirm: true.

  • list_keys: The project's API keys, revoked ones included: name, last 4 characters, last use. Never the key itself.

  • revoke_key: Revoke one of the project's API keys. It stops working at once. Needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe project name. Optional for `update`.
limitNoPage size, 1 to 100. Default 20. Optional for `list_keys`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list_keys`.
statusNo`suspended` refuses sends and writes; `active` resumes. Optional for `update`.
confirmNoMust be true. This cannot be undone. Only set it after the user asked for this or agreed to it. Required for `delete`, `revoke_key`.
apiKeyIdNoThe API key id, from `list_keys`. Required for `revoke_key`.
metadataNoYour own string values. Replaces the whole metadata object. Optional for `update`.
projectIdNoThe project id or `ext:<externalId>`. Required for every action.
externalIdNoYour id for this customer: letters, digits and `. _ : @ -`. null clears it. Optional for `update`.
maxAccountsNoHow many numbers it may link. null removes the limit. Optional for `update`.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructiveHint/readOnlyHint/idempotentHint) by spelling out suspend semantics (sends and writes refused, reads and inbound still work), that delete immediately kills keys and background-deletes numbers and webhooks, and that both destructive actions require confirm: true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation summary and safety-critical constraints, then organized into a scannable per-action list. Every sentence carries information; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, nested-object, multi-action mutation tool with no output schema, the description covers per-action requirements, return value of update, pagination-relevant actions, and irreversible consequences. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter, including the confirm and status semantics the description restates. The description adds little parameter-level detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the exact resource (project) and enumerates the four distinct operations it performs (update, delete, list_keys, revoke_key), which cleanly separates it from create_project, get_project, and list_projects. An agent can predict its behavior without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context per action plus prerequisites ('Organization keys only') and a boundary condition ('New project keys are created in the wuapi dashboard: no tool returns an API key'). It does not, however, explicitly route read-only inspection to get_project/list_projects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_storiesRead and answer storiesA
Destructive

Stories (WhatsApp Status): read the ones the account's contacts posted in the last 24 hours, mark one as viewed, react or reply to it, and see or delete the ones the account posted (post with post_story). Reading stories tells the contact nothing; view does, so call it only when the user wants the contact to know. Contacts' stories arrive only for accounts with stories turned on.

Actions:

  • list: Contacts' stories, grouped by contact, the contact with the newest story first.

  • list_own: The stories the account posted in the last 24 hours, with how many contacts saw each.

  • get: One story. With fetchMedia, also its file's direct URL.

  • viewers: Who saw a story the account posted, with their reactions, the latest viewer first.

  • view: Tell the contact the account saw their story: the account then shows in the story's viewers. Only when the user asked for it. authorNotified: false in the answer means WhatsApp did not tell them (read receipts are off).

  • react: React to a contact's story with an emoji, or remove the reaction with an empty string. Only the story's author sees it.

  • reply: Reply to a contact's story with text: a message in the chat with its author, who sees it as a reply to their story.

  • delete: Delete a story the account posted, for everyone. Needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoThe reply. Required for `reply`.
emojiNoOne emoji, such as a green heart. An empty string removes the reaction. Required for `react`.
limitNoPage size, 1 to 100. Default 20. Optional for `list`, `list_own`, `viewers`.
actionYesWhat to do. See the list of actions in the tool description.
cursorNo`nextCursor` from the previous page, to get the next one. Optional for `list`, `list_own`, `viewers`.
confirmNoMust be true. The story is deleted for every contact and cannot be restored. Only set it after the user asked for this or agreed to it. Required for `delete`.
storyIdNoA story id, from `list`, `list_own` or a webhook. A story the account posted has the id of its message. Required for `get`, `viewers`, `view`, `react`, `reply`, `delete`.
unviewedNo`true`: only the contacts with a story the account has not seen. Optional for `list`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
contactIdNoA contact id (E.164 with + or `lid:<digits>`): only this contact's stories. Optional for `list`.
fetchMediaNoAlso download the story's file if needed and return its direct URL as `mediaFile`. Does not mark the story as viewed. Optional for `get`.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice. Optional for `view`, `reply`.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it explains that reading is silent while `view` notifies the contact (and that `authorNotified: false` means read receipts are off), that reactions are author-only, that `delete` removes the story for everyone and is irreversible, that `fetchMedia` does not mark as viewed, and that idempotencyKey exists for view/reply retries. The described write/delete behavior is consistent with destructiveHint=true and readOnlyHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A tight front-loaded summary sentence establishes scope and the key risk (view vs silent read), followed by a scannable action list. Despite covering twelve parameters and eight actions, every sentence carries behavioral information and none is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an action-dispatch tool, high parameter count, and no output schema, the description supplies what an agent needs: per-action meaning, ordering guarantees (newest story/viewer first), destructive-action prerequisites, and named response fields like mediaFile and authorNotified. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real cross-field meaning: it defines what each `action` enum value does (the schema only says "See the list of actions"), why `confirm` must be true, and the notify/no-notify distinction that `view` and `authorNotified` hinge on. Remaining gaps (cursor/limit paging semantics) are already carried by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource (read/answer WhatsApp stories) and enumerates the eight supported actions with their distinct semantics. It explicitly distinguishes itself from the sibling post_story ("post with post_story"), so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives conditional guidance for the risky actions: `view` is "Only when the user asked for it," `delete` only after user agreement, and stories arrive only for accounts with stories enabled. It names post_story as the alternative for publishing. It does not, however, contrast itself with adjacent read tools like list_messages or chat tools, so routing to this tool vs those is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_chat_readMark a chat read or unreadA
Idempotent

Clear (or set, with unread: true) the chat's unread badge on the linked devices. Sends no read receipts; use send_read_receipts for blue ticks.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
unreadNoMark it unread instead.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the effect is limited to the unread badge on linked devices and that no read receipts are emitted. This is meaningful behavioral context for a mutation that could otherwise be mistaken for a full read-status action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the primary action and the conditional. Every clause carries necessary information, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple idempotent toggle with rich annotations and full schema coverage, the description supplies the one missing behavioral nuance: it does not send read receipts. The agent has enough context to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already well documented. The description adds value by making the default behavior explicit: call without `unread: true` to clear the badge, or pass `unread: true` to set it unread.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact action ('Clear' or 'set') and the resource ('the chat's unread badge'), and it explicitly contrasts itself with send_read_receipts. An agent can immediately distinguish this from the closest sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a clear when-not rule: 'Sends no read receipts; use send_read_receipts for blue ticks.' This is an explicit, actionable alternative that leaves no ambiguity about which sibling to choose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mute_chatMute or unmute a chatA
Idempotent

Mute a chat's notifications for a while or until unmuted, or unmute it with muted: false.

ParametersJSON Schema
NameRequiredDescriptionDefault
mutedNoDefault true.
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
durationSecondsNoHow long to mute. Omitted or 0: until unmuted.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that the operation is mutable, idempotent, and not destructive, so the description does not need to repeat that. It adds the behavioral nuance that muting can be temporary or indefinite until unmuted. It does not disclose additional side effects or permissions, but none are clearly required for this simple setting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the action and includes the key duration and unmute semantics. No words are wasted, and it is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Combined with the rich parameter descriptions and annotations, the description makes the tool fully invokable: the agent knows what account to use, what chat identifier formats are accepted, and how duration and muted interact. There is no output schema, but for a straightforward mutation this is not a critical gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already explains accountId, chatId, durationSeconds, and muted well. The description adds only the explicit `muted: false` unmute hint, which is a minor overlay on the schema rather than substantial new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: muting or unmuting a chat's notifications. This distinguishes it from sibling tools like archive_chat or pin_chat, which affect chat visibility or ordering rather than notification behavior. It does not explicitly name or contrast siblings, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful operational guidance: mute for a duration or until unmuted, and unmute with `muted: false`. However, it does not explicitly say when to choose this tool over alternatives such as archive_chat, pin_chat, or mark_chat_read, so usage context is mostly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pin_chatPin or unpin a chatA
Idempotent

Pin a chat to the top on the linked devices, or unpin it with pinned: false.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
pinnedNoDefault true.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral context by stating that pinning applies 'on the linked devices' and that pinned:false reverses the operation. This supplements annotations like idempotentHint and readOnlyHint without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence contains the core action, the effect on linked devices, and the unpin mechanism. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple toggle operation, the description covers both directions of the action and the schema covers parameter meanings. No output schema is needed for an operation whose success is evident, and annotations already convey safety and idempotency.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all three parameters, so baseline is 3. The description goes beyond by explaining that pinned:false triggers unpinning, which clarifies the toggle semantics beyond the schema's 'Default true'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Pin a chat to the top on the linked devices, or unpin it'. This clearly distinguishes it from sibling chat-related tools like archive_chat or mute_chat by focusing on the pin/unpin action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for use: pin a chat or unpin by setting pinned:false. It doesn't explicitly name alternatives or exclusions, but the toggle behavior is unambiguous and self-contained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_storyPost a storyA

Post a story from the account: text on a colored background, or an image or video with an optional caption, from a public URL (mediaUrl) or a file uploaded with upload_file (uploadId).

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoThe story text (required for `text`), or the caption.
typeNoDefault `text`.
mediaUrlNoImage or video: public http(s) URL of the file.
uploadIdNoThe id of an upload made with upload_file (or `POST /v1/uploads`): a file wuapi already stores. Usable for 24 hours, any number of times.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
backgroundColorNoText stories: `#RRGGBB`.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds that the post acts 'from the account' and that media must come from a public URL or an existing upload, which is modest context. It says nothing about visibility duration, audience, rate limits, or failure behavior, so it remains thin beyond what the annotations carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the action and then enumerates the variants and sources; there is no filler or redundancy. Parentheticals are used to reference the parameter names rather than prose duplication.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters fully documented in the schema and no output schema to explain, the description covers the essential decision surface: which modes exist and where media can come from. It could still be more complete about the resulting story's lifecycle and any permission requirements, but nothing critical for invoking the call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond the per-field schema text by explaining the conditional relationship between parameters: 'text' stories use text plus a colored background, while image/video stories use mediaUrl or uploadId with text acting as an optional caption. That combination logic is genuine added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Post a story') and enumerates the supported story variants: text on a colored background, or image/video with an optional caption. It does not explicitly contrast itself with the nearest siblings (send_text, send_media, reply_to_message), so the line between a story and a message is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when each parameter path applies (public URL vs. a file uploaded via upload_file) and names upload_file as a prerequisite for that path. However, it gives no explicit guidance on when to choose mediaUrl over uploadId, nor any when-not-to-use or alternative-tool routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promote_group_participantsMake participants adminsB
Idempotent

Make participants admins of a group the account administers.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYesThe group id (`...@g.us`), from list_groups.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
contactIdsYesContact ids: E.164 with + (`+584241112233`) or `lid:<digits>`.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint=false, idempotentHint=true, and openWorldHint=true. The description adds no behavioral context beyond the action itself, such as reversible effects, permission requirements, or consequences for already-admin participants. It simply restates the purpose without enriching the agent's understanding of side effects or environment impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence that states the core action and a scope qualifier. There is no filler or repetition; it is optimally concise and immediately communicates the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficient for a straightforward mutation tool with all parameters documented in the schema and annotations covering safety and idempotency. However, it lacks any explanation of the effect on existing admins or the behavior when promoting multiple contacts, and with no output schema, the return value is unstated. It is minimally complete but not rich.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add parameter-specific details beyond what the schema already provides. It does not elaborate on contactIds format or groupId constraints, which are already well-documented in the schema, so no extra semantic value is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Make participants admins' of a group, which is a specific verb+resource. It implicitly distinguishes from sibling tools like add_group_participants and demote_group_participants by the promotion action, though it doesn't name them explicitly. The constraint 'the account administers' adds scope clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that demote_group_participants is the inverse operation, nor does it offer context on when promotion is appropriate. The only hint is the account-administers constraint, but no exclusions or alternative-condition guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

react_to_messageReact to a messageA
Idempotent

React to a message with an emoji, as the account that received or sent it. An empty string removes the reaction.

ParametersJSON Schema
NameRequiredDescriptionDefault
emojiYesOne emoji, such as a thumbs up. Empty removes the reaction.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already supply idempotentHint and non-destructive flags. The description adds genuinely useful behavior beyond them: an empty string removes the reaction, and the reaction is tied to the account identity. This is meaningful context an agent cannot infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact, front-loaded sentence with no filler. It communicates the core action, the identity constraint, and the removal behavior in minimal space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-required-parameter mutation with complete schema descriptions and helpful annotations, the description covers who can react and how to remove a reaction. Nothing essential for correctly invoking the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides 100% coverage of both parameters, including the empty-string removal behavior for emoji and the messageId source. The description reinforces this but does not add significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'React to a message with an emoji'. The account-scoping clause ('as the account that received or sent it') makes the action precise and differentiates it from generic send or reply tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context by explaining that the reaction is made as the account that received or sent the message, which is an implicit eligibility condition. It does not explicitly contrast with alternatives like reply_to_message, but the intended use is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reconnect_accountReconnect an accountA
Idempotent

Restart the account's session. Use it when an account is disconnected; when the link is no longer valid it produces a fresh QR code.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate mutation (readOnlyHint=false), idempotency, and non-destructiveness. The description adds a concrete behavioral detail beyond annotations: it 'produces a fresh QR code' when the existing link is invalid. This is useful context without contradicting the annotation profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences. It front-loads the core action ('Restart the account's session') and then gives the trigger and outcome. Every phrase earns its place with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description provides the essential trigger ('disconnected'), the behavior ('restart session'), and the produced outcome ('fresh QR code'). It could go slightly further by explaining the output format or side effects, but nothing critical is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is fully documented with 100% coverage, including the meaning of accountId: 'The wuapi account id of the linked number to act as (from list_accounts).' The description adds no parameter-specific insight, but the baseline of 3 is appropriate given complete schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Restart the account's session.' It further clarifies the concrete outcome by saying it 'produces a fresh QR code' when the link is no longer valid, which distinguishes it from related tools like get_account_qr_code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit trigger condition: 'Use it when an account is `disconnected`' and 'when the link is no longer valid.' However, it does not explicitly name alternatives or state when not to use it, so it falls short of fully routing the agent away from sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reject_callReject an incoming callA

Reject a WhatsApp call ringing on the account, with the id and from of its call.received webhook event. To reject every call automatically, set rejectCalls with update_account.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromYesThe caller: `data.object.from` of the same event.
callIdYesThe call id: `data.object.id` of the `call.received` event.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, so the safety profile is covered structurally. The description adds real behavioral context beyond that: this act is bound to a live ringing call and to the identifiers carried by a specific webhook event, which tells the agent the operation is time-sensitive and event-driven.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, and the core action plus its required input source are front-loaded before the alternative branch is mentioned. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with rich annotations and a fully documented schema, so the description need not explain return values (none exist). It covers the action, the input source, and the auto-reject alternative, though it says nothing about failure modes such as the call no longer ringing or an expired call id. That gap is minor given annotation and schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (accountId, callId, from, idempotencyKey) is already documented in the schema, including the idempotency retry semantics. The description's reference to '`id` and `from`' loosely restates two of them and adds no format or constraint detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Reject a WhatsApp call ringing on the account') and pins the input to a specific source ('the `id` and `from` of its `call.received` webhook event'). No sibling tool handles call rejection, and the webhook-event framing makes the tool unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the triggering condition (a call currently ringing, surfaced via a `call.received` event) and names an alternative path for a different goal: 'To reject every call automatically, set `rejectCalls` with update_account.' The agent can choose between one-off rejection and blanket auto-rejection without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_group_participantsRemove people from a groupA
DestructiveIdempotent

Remove participants from a group the account administers.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Removed participants have to be added or invited again. Only set it after the user asked for this or agreed to it.
groupIdYesThe group id (`...@g.us`), from list_groups.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
contactIdsYesContact ids: E.164 with + (`+584241112233`) or `lid:<digits>`.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true and readOnlyHint=false. The description adds an authorization constraint (administrator scope) but does not disclose irreversibility or the confirmation requirement; however, the schema's confirm parameter covers that. This is acceptable given annotation coverage, but the description contributes only modest behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no wasted words. It states the action, resource, and scope efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with four required parameters, the description is minimal. It relies on schema descriptions for parameter details and annotations for destructive behavior. It could mention the required confirmation, though that is already present in the schema. Overall, adequate but not rich.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters (accountId, groupId, contactIds, confirm) are fully documented in the schema. The description adds no parameter-level semantics beyond naming the action, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Remove') and resource ('participants from a group'), and constrains to groups the account administers. This makes it easy to distinguish from sibling tools like add_group_participants, leave_group, or promote_group_participants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a prerequisite condition ('a group the account administers') but does not explicitly state when to use this tool versus alternatives. It does not mention that self-removal should use leave_group, or that demotion should use demote_group_participants.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_messageReply to a messageA

Reply with text to a message, quoting it, in the same chat and from the same account. Works for messages in direct chats and groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe reply.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false (write) and destructiveHint=false (non-destructive). The description adds the quoting behavior and the same-account/same-chat constraint, which are not in annotations. But it doesn't disclose other behavioral aspects like auth requirements, side effects beyond sending, or what happens to the original message. With annotations covering the safety profile, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence that front-loads the core action and constraint. No filler words; every phrase adds information (reply, quote, same chat, same account, works in direct chats and groups). It is an example of concise, efficient writing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple reply tool, the description covers the essential use case and scope. It does not mention the return value (no output schema exists) or any edge cases, but given the schema covers all parameters and the annotations cover safety, an agent has enough to call it correctly. A small gap is the lack of any note about the response, but this is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all three parameters including the optional idempotencyKey semantics. The description does not add any additional meaning about parameters, such as format hints or relationships. Since the schema carries the full burden, the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Reply') with a resource ('a message'), and adds the distinguishing feature of quoting the original message. It also specifies scope: 'in the same chat and from the same account' and 'direct chats and groups', which clearly separates it from siblings like send_text (which sends without quoting) and edit_message (which modifies).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: use this when you need to reply with a quoted message. It specifies the chat/account scope and that it works in both direct chats and groups. However, it does not explicitly name alternatives or state when NOT to use it (e.g., for a plain message without quoting, send_text would be appropriate). The guidance is clear but lacks explicit exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_pairing_codeGet a pairing codeA

Link by phone number instead of QR code: returns an 8-character code the owner types in WhatsApp. It lives about 160 seconds. Fails with already_linked when the account is ready.

ParametersJSON Schema
NameRequiredDescriptionDefault
phoneYesThe number to link, E.164 (`+584121234567`) or digits.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it reveals the code's TTL ('lives about 160 seconds') and a specific failure mode (`already_linked`). The open-world, non-idempotent nature is consistent with the description, though other potential side effects are not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences each deliver distinct, useful information: purpose, code lifetime, and error condition. There is no filler, repetition, or extraneous detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description adequately explains the return value, the code lifespan, and the error behavior. It could be slightly more explicit about prerequisites or side effects, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both `phone` and `accountId` with 100% coverage. The description does not add significant parameter-specific meaning beyond the phone-based linking context, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource (a pairing code) and the action: it links by phone number instead of QR code and returns an 8-character code. The contrast with QR code also distinguishes it from the sibling get_account_qr_code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear usage context: use this tool when linking via phone number instead of a QR code. It does not explicitly name the alternative tool or list exclusions, but the 'instead of QR code' framing gives enough guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resend_invitationResend an invitationA
Destructive

Give an invitation a new link and expiry and email it again when it has an inviteeEmail. The previous url stops working; send the new one from the result. An account the invitee already started is kept, so they resume where they left off.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. The current invitation link stops working. Only set it after the user asked for this or agreed to it.
invitationIdYesThe invitation id.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and non-idempotency, but the description adds genuinely new context: the old `url` stops working, the new one must be taken from the result, and the invitee's partially started account is preserved so they resume. That is exactly the behavioral detail an agent needs before a destructive resend.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then the destructive consequence, then the state-preservation nuance. No filler and nothing repeated from title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by telling the agent to read the new link from the result. Combined with the schema's full parameter coverage and the annotations' safety profile, very little is left unstated; only auth/permission requirements are not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so invitationId, confirm and idempotencyKey are fully documented in the schema itself, including the consent constraint and the 24-hour retry behavior. The description adds only the outcome semantics of the new link, not parameter-level detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: give an invitation a new link and expiry and email it again. It is clearly distinguishable from siblings like create_invitation, cancel_invitation and get_invitation, since the action is a resend of an existing invitation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The clause 'when it has an inviteeEmail' implies a precondition for use, and the schema's confirm parameter carries the user-consent requirement. However, the description never names alternatives (e.g. cancel_invitation, create_invitation) or states a when-not condition, so routing guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_contactsSave contacts on the phoneA
Idempotent

Save contacts on the linked phone, in WhatsApp and in the phone's own address book, as if they were saved on the phone. Any number can be saved. Saves are queued (also while the account reconnects): each contact's phoneSync says pending, then synced or failed (not_on_whatsapp, account_offline), and contact.updated fires; the phone shows the name about a minute later. Removing a contact is not supported. backfill_auto_save queues the contacts of the account's existing direct chats, named with its auto-save templates (update_account contactAutoSave), at most 200 a day.

Actions:

  • one: Save one contact under savedName. Returns the contact with its phoneSync.

  • many: Save up to 500 contacts at once. Returns the batch id and each contact's status.

  • backfill_auto_save: Queue the auto-save of the contacts of the account's existing direct chats.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do. See the list of actions in the tool description.
contactsNo1 to 500 contacts to save. Required for `many`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
contactIdNoA contact: E.164 with + (`+584241112233`) or `lid:<digits>`. Required for `one`.
firstNameNoThe short name the phone shows. Defaults to the first word of `savedName`. Optional for `one`.
savedNameNoThe name to save the contact under. Required for `one`.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond annotations: the queued async model, the phoneSync lifecycle (pending → synced/failed with not_on_whatsapp / account_offline reasons), the contact.updated event, the ~1 minute propagation delay, and the 200/day backfill cap. This is exactly the context an agent needs to avoid assuming synchronous completion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core behavior before the action list, and the bulleted actions are easy to scan. The prose paragraph is dense with parentheticals and could be trimmed slightly, but every sentence carries real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly steps in to describe return values (contact with phoneSync, batch id and per-contact status), plus the async lifecycle and limits. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents contactId formats, required/optional fields, and per-action requirements. The description reinforces a few of these (savedName for `one`, batch semantics for `many`, auto-save templates for backfill) but adds little the schema doesn't already say, so the baseline 3 holds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (save contacts) and precisely where they land: the linked phone, WhatsApp, and the phone's address book. This clearly separates it from siblings like lookup_contacts, get_contact, and send_contact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context (any number can be saved, saves are queued even while reconnecting, removal is not supported) and enumerates the three actions with their intent. It doesn't explicitly route to an alternative sibling tool for deletion or verification, but the 'removing is not supported' exclusion covers the main boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_contactSend contact cardsC

Send one contact card, or up to 20 in one message.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient: a phone number in E.164 with + (`+584241112233`), `lid:<digits>`, the `@username` of a contact the account already chats with, a group id (`...@g.us`), or a channel id (`...@newsletter`) the account administers.
contactsYes
mentionsNoContact ids to @mention (E.164 or `lid:<digits>`).
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
replyToMessageIdNoA wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`).

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is covered. The description adds only the 'up to 20' cardinality, which merely restates the schema's maxItems; it says nothing about delivery failure behavior, permission requirements, or that sends are outward-facing to arbitrary recipients.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler, and the cardinality constraint arrives immediately. It is efficient, though its brevity also reflects sparseness rather than deliberate polish.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is an outward-facing, irreversible send with 6 parameters and no output schema; the description covers only cardinality. Nothing tells the agent about failure modes, retry/idempotency strategy in prose, or recipient validation requirements, which is inadequate for a messaging tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, with recipient formats, phone format, idempotency reuse semantics and replyToMessageId quirks all documented in the schema itself. The description contributes no additional parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Send) and resource (contact card) plus the cardinality limit, which separates it from send_text, send_media, send_location and send_poll by payload type. It does not explicitly name a sibling or state how it differs beyond the resource noun, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites (e.g. account must already chat with the recipient), and no alternatives named against the crowded sibling set of send_* tools. Usage is only inferable from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_locationSend a locationC

Send a map pin, with an optional place name and address.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient: a phone number in E.164 with + (`+584241112233`), `lid:<digits>`, the `@username` of a contact the account already chats with, a group id (`...@g.us`), or a channel id (`...@newsletter`) the account administers.
nameNoPlace name.
addressNo
latitudeYes
mentionsNoContact ids to @mention (E.164 or `lid:<digits>`).
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
longitudeYes
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
replyToMessageIdNoA wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`).

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the description adds no safety or mutability context beyond them. It says nothing about delivery behavior, rate limits, permissions, or the idempotency/quoting capabilities that the schema parameters imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no waste, but its brevity comes at the cost of omitting information rather than being crisply informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with three undocumented params (latitude, longitude, address have no schema descriptions) and no output schema, the description does far too little to fill the gaps. An agent must fall back entirely on structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the description only echoes the schema's own wording for name and address ('optional place name and address'), adding no format, constraint, or coordinate-range meaning. Latitude/longitude are only implied by the word 'map pin'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (send) and resource (a map pin / location), plus the payload fields it carries. It is clearly distinguishable from send_text, send_media, send_contact and send_poll, though it never names a sibling to sharpen that distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use, when-not-to-use, or alternative-tool guidance. An agent must infer from the name alone that this is the location-sharing tool rather than, say, send_contact or send_text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_mediaSend an image, video, audio or documentA

Send a file: an image, video, audio, voice note (ogg/opus), document or sticker, with an optional caption. Give exactly one of url (a public URL wuapi downloads itself) or uploadId (a file uploaded before with upload_file). Images go out at the account's image quality (standard by default, as WhatsApp sends a photo); pass quality to change it for one image, or send the file as a document to deliver it untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient: a phone number in E.164 with + (`+584241112233`), `lid:<digits>`, the `@username` of a contact the account already chats with, a group id (`...@g.us`), or a channel id (`...@newsletter`) the account administers.
urlNoPublic http(s) URL of the file. wuapi downloads it (up to 100 MB); private and internal addresses are refused.
typeYesWhat kind of file it is.
captionNoText shown with the file.
qualityNoImages only: the quality of this image instead of the account's. `hd` is WhatsApp's HD photo; `original` sends the file without re-encoding it.
filenameNoDocuments: the file name the recipient sees.
mentionsNoContact ids to @mention (E.164 or `lid:<digits>`).
mimeTypeNoGuessed from the URL, or the upload's own type, when omitted.
uploadIdNoThe id of an upload made with upload_file (or `POST /v1/uploads`): a file wuapi already stores. Usable for 24 hours, any number of times.
viewOnceNoImages, videos, audio and voice: can be opened once.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
replyToMessageIdNoA wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the bar is lower, and the description still adds behavioral context the schema only partly covers: images are re-encoded at the account's quality by default ('as WhatsApp sends a photo'), and the document path avoids that. It does not discuss the non-idempotent nature versus the idempotencyKey escape hatch, rate limits, or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences: purpose and file kinds, then the source constraint, then the image-quality behavior. No filler, no restatement of the title, and every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 13 parameters at 100% schema coverage and no output schema, the structured data carries most of the load; the description covers purpose, the url/uploadId exclusivity, and image-quality defaults. It is complete enough to call correctly, though it omits retry/idempotency guidance that matters for a non-idempotent send.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds a genuine cross-parameter constraint the schema does not express: 'Give exactly one of `url` ... or `uploadId`'. That is the kind of relational rule an agent cannot infer from per-field descriptions alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Send a file: an image, video, audio, voice note, document or sticker') and enumerates the supported media kinds, distinguishing it from send_text, send_location, send_poll and upload_file. An agent can identify the tool's job without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real routing conditions: exactly one of `url` or `uploadId`, with uploadId explicitly tied to the upload_file sibling. It also tells the agent when to switch modes ('send the file as a `document` to deliver it untouched'). It does not, however, contrast itself with sibling senders like send_text or explain when a reply is preferable (reply_to_message vs the replyToMessageId parameter).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_pollSend a pollA

Send a poll with 2 to 12 options. Votes arrive as poll.voted webhooks and in the message's poll tally (get_message).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient: a phone number in E.164 with + (`+584241112233`), `lid:<digits>`, the `@username` of a contact the account already chats with, a group id (`...@g.us`), or a channel id (`...@newsletter`) the account administers.
optionsYes2 to 12 unique options.
mentionsNoContact ids to @mention (E.164 or `lid:<digits>`).
questionYesThe poll question.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
selectableCountNoHow many options a voter may pick. 0 (default) means any number; 1 makes it single choice.
replyToMessageIdNoA wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it a non-read-only, open-world, non-idempotent, non-destructive write. The description adds real value beyond that by disclosing the async result channel: votes arrive as `poll.voted` webhooks and in the message poll tally. It does not mention idempotencyKey behavior or rate limits, so it is short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and constraint, and the second sentence carries the result-delivery information an agent needs. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly fills the biggest gap by explaining how poll results manifest (webhooks plus tally). Combined with full schema coverage and annotations covering the safety profile, it is nearly complete, though preconditions for `to` (channel administration) are left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all eight parameters (recipient formats, mentions, selectableCount, idempotencyKey, replyToMessageId) are already fully documented in the schema. The description only restates the 2-12 options constraint, adding no syntax or semantics beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Send a poll') plus a concrete constraint (2 to 12 options), and it names the complementary read path (get_message poll tally), which separates it from the sibling vote_in_poll.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies when this is used (creating a poll whose votes come back asynchronously) and points to get_message for tallies, but it never explicitly contrasts with vote_in_poll or states preconditions such as needing an administered channel or group.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_read_receiptsSend read receiptsA
Idempotent

Send read receipts (blue ticks) for inbound messages in a chat: the given ids, or every unread inbound message wuapi stores for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYesThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`).
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
messageIdsNowuapi ids of inbound messages in this chat. Default: every unread one.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover idempotency and non-destructiveness, so the description only needs to add context. It adds the default behavior ('every unread inbound message wuapi stores'), the blue-tick effect, and the inbound-message constraint, which go beyond the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise, front-loaded sentence with no filler. It communicates purpose, scope, and default behavior efficiently, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with the complete parameter schema and annotations, provides enough information for an agent to invoke the tool correctly. It does not describe return values, but no output schema exists and the lack of return-value detail is not critical here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining that messageIds is optional and defaults to every unread inbound message, clarifying the relationship between the parameter and the tool's behavior beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: send read receipts (blue ticks) for inbound messages in a chat. It clearly distinguishes from sibling mark_chat_read by focusing on receipts rather than chat read state, and the 'given ids or every unread' scope makes the behavior unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use when you want to send blue ticks for inbound messages, optionally for specific ids or for all unread ones. It does not explicitly name alternatives or exclusions, so it misses the top score, but the intended use case is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_textSend a text messageA

Send a text message from a linked number to a contact, group or channel. The message is queued and sent at the account's pace; the result has its id and queued status. Send only to people who expect it.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient: a phone number in E.164 with + (`+584241112233`), `lid:<digits>`, the `@username` of a contact the account already chats with, a group id (`...@g.us`), or a channel id (`...@newsletter`) the account administers.
textYesThe message, up to 4096 characters. WhatsApp formatting works: *bold*, _italic_.
mentionsNoContact ids to @mention (E.164 or `lid:<digits>`).
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.
replyToMessageIdNoA wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the mutation profile is covered. The description still adds real value beyond that: delivery is asynchronous ('queued and sent at the account's pace') and the result carries 'id' and 'queued' status, which is the key operational trait for a fire-and-forget send. It stops short of stating auth requirements or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the purpose, then delivery semantics and return fields, then the consent caveat. No filler, and each sentence carries information the agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With six parameters, three required, no enum values and no output schema, the description compensates by describing the return fields (id, queued) and the async delivery model, which the schema does not cover. Parameter-level detail is delegated to a fully described schema, so the only remaining gap is permission/account prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains to, text, mentions, accountId, idempotencyKey and replyToMessageId in detail. The description adds nothing about any individual parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Send a text message') plus the destination scope ('from a linked number to a contact, group or channel'), which cleanly separates it from siblings like send_media, send_location, send_poll, and reply_to_message. An agent can pick this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies the context (linked number, contact/group/channel recipient) and adds a consent caveat ('Send only to people who expect it'), but it never names alternatives such as reply_to_message, send_media, or send_poll, nor states when this tool is the wrong choice. Usage is inferable but not explicitly routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_disappearing_timerSet disappearing messagesA
Idempotent

Turn disappearing messages on or off: for one chat with chatId, or without it the account's default timer, which new chats start with. Messages already stored in wuapi are kept.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdNoThe chat (a contact or group id). Omit it to set the account's default for new chats.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
durationSecondsYesHow long messages last: 86400 (24 hours), 604800 (7 days) or 7776000 (90 days). 0 turns disappearing messages off.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description's contribution is the added behavioral note that 'Messages already stored in wuapi are kept' — a genuinely useful disclosure about scope of effect. It's consistent with the annotations and doesn't need to restate them, though it says nothing about permissions or how existing chats are affected by a default change.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence that front-loads the on/off action and then resolves the two scopes; the retention caveat is appended without padding. Minor awkwardness from packing three clauses with commas, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and annotations covering safety, the description addresses the key ambiguities an agent needs: what the two modes mean, which parameter selects them, and that stored messages persist. Only the effect of changing the account default on existing chats is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter including the durationSeconds enum and its meaning is already documented in the schema. The description restates the chatId-optional behavior that the schema already explains, adding little beyond the baseline. It does not clarify the duration values or account resolution, so 3 is the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: turns disappearing messages on or off, and it clearly distinguishes the two scopes (per-chat with chatId vs. account default). It doesn't explicitly name or contrast a sibling, but the scope qualifier makes the purpose unambiguous against neighbors like mute_chat or archive_chat.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the condition that selects each mode: pass `chatId` for one chat, omit it to set the account default that new chats inherit. Clear context for when to use which variant, though it offers no exclusions or prerequisites and no alternative tool routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_presenceSet presence or typingA
Idempotent

Presence as contacts see it: the account online or offline, typing or recording in a chat, and presence events from a contact. Typing shows until paused or the next message. With typing turned on in the account's pacing (update_account), sends show it on their own.

Actions:

  • online: Show the account as online to contacts.

  • offline: Show the account as offline.

  • typing: Show typing in a chat.

  • recording: Show recording audio in a chat.

  • paused: Clear the typing or recording indicator in a chat.

  • subscribe: Receive contact.presence_updated webhook events when the contact comes online, goes offline or types. Fails with not_supported when the account cannot receive presence events.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do. See the list of actions in the tool description.
chatIdNoThe chat: a contact as E.164 with + (`+584241112233`) or `lid:<digits>`, or a group id (`...@g.us`). Required for `typing`, `recording`, `paused`.
accountIdNoThe wuapi account id of the linked number to act as (from list_accounts). Required for every action.
contactIdNoA contact: E.164 with + (`+584241112233`) or `lid:<digits>`. Required for `subscribe`.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare openWorldHint=true, idempotentHint=true, destructiveHint=false, so safety/idempotency is covered. The description adds behavior beyond them: the lifespan of the typing/recording indicator, the interaction with update_account pacing, and a concrete failure mode ('Fails with not_supported when the account cannot receive presence events'). It stops short of stating whether subscribe persists or how it is undone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded framing sentence, then a scannable Actions list where each bullet is one clause. Nothing is redundant against the schema, and the most decision-relevant information (the action meanings) comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-action, 4-param tool with no output schema, the description covers what each action does, which parameters each action requires, and the key failure case. It leaves open whether a subscribe is permanent or reversible and what the returned presence event contains, but the annotations and 100%-covered schema close most remaining gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema explicitly defers action semantics to the description ('See the list of actions in the tool description'). The description therefore carries real added meaning for the enum values and cross-references which params each action needs, going beyond the baseline 3 for full-coverage schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb+resource framing ('Presence as contacts see it') and then enumerates every action, so an agent knows exactly what the tool covers: outbound presence (online/offline), in-chat typing/recording state, and inbound presence subscriptions. No sibling tool overlaps with presence, so the scope is unambiguous without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action is described with its effect, and the description gives real operating context: typing 'shows until `paused` or the next message,' and if typing is enabled in the account's pacing the indicator is shown automatically on sends. It does not state explicit exclusions or name a preferred alternative, but there is no competing sibling for presence, so guidance is effectively complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

star_messageStar or unstar a messageA
Idempotent

Star a message on the phone and the other linked devices, or unstar it with starred: false. Returns the message.

ParametersJSON Schema
NameRequiredDescriptionDefault
starredNoDefault true.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it as a non-read-only, idempotent, non-destructive write with open-world reach, so the safety profile is covered. The description adds valuable context beyond that: the star state propagates across the phone and linked devices, and the tool returns the affected message.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler, plus a brief note on the return value. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with full schema coverage and annotations covering the safety profile, the description is nearly complete. It even notes the return value in absence of an output schema, though it omits error or failure behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, giving a baseline of 3. The description goes one step further by defining the semantic effect of the `starred` boolean (false = unstar), which the schema's terse 'Default true.' does not make explicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (star/unstar) and resource (a message), and explains the dual behavior via the `starred: false` switch. It is clearly distinguishable from siblings like react_to_message or pin_chat, which are separate operations on the same domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent how to trigger the inverse operation (unstar with `starred: false`), which implies the usage. However, it gives no explicit when-to-use guidance versus alternatives (e.g., react_to_message, pin_chat) and no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_accountUpdate an accountA
Idempotent

Change an account's settings: rename it, reject incoming calls automatically, turn on and tune its pacing (the anti-ban protections, off by default), choose whether the next link imports recent chats, choose which received media is downloaded right away (the rest on demand), choose the quality its images are sent at, save the contacts of new chats on the phone automatically (contactAutoSave), or move its proxy location. Pacing applies from the next send. A proxy location change gives the number a new exit IP and reconnects it; it is refused within 10 minutes of the previous change. Returns the updated account with its pacing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA name for the account, such as `Front desk`.
pacingNoAnti-ban pacing, merged over the stored values: omitted fields keep theirs, null resets the whole pacing to the defaults (every protection off). Recommended for bulk, cold or marketing sends: `{"messagesPerMinute": 12, "firstContactPerMinute": 5, "typing": {"enabled": true}}`.
accountIdYesThe wuapi account id of the linked number to act as (from list_accounts).
historySyncNo`recent` imports the chats the phone sends at the next link. A number that is already linked gets no new history.
rejectCallsNoReject incoming calls automatically.
imageQualityNoWhat the account's images are re-encoded to before their upload through the number's proxy (proxy traffic). `standard` (default): longest side 1600 px, JPEG, as WhatsApp sends a photo. `hd`: up to 4096 px. `original`: the file as it is.
proxyLocationNoMove the number (`country` and `city` together), switch whether its city is exact (`strictCity`), or both. The session reconnects on a new exit IP.
contactAutoSaveNoContact auto-save: only direct chats with a number, never renaming a contact the phone already holds, each contact at most once, at most 200 a day. The given fields change.
mediaAutoDownloadNoWhich received media is downloaded right away through the number's proxy (proxy traffic). `none` (default for new accounts): on demand, when its media URL is first requested. `all`: every file. `{maxBytes, types}`: only those.
rejectCallsMessageNoText sent to the caller after an automatic reject (not for group calls).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (not read-only, idempotent, non-destructive), yet the description still adds real side-effect context: pacing takes effect from the next send, a proxy change forces a reconnect on a new exit IP, that change is refused within 10 minutes of the prior one, and pacing protections default to off. It omits permission/auth requirements and error behavior, but the timing and rate-limit disclosures are genuinely beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and resource, and the behavioral constraints are grouped at the end where they are easy to scan. The long inline enumeration of ~8 settings is only partially wasteful given how dense the schema is, but it repeats content the agent can already read in the properties.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully states that it returns the updated account with its pacing, and it explains the merge/reset semantics at a high level via 'off by default' and the pacing note. For a 10-parameter mutation over nested objects this is close to complete, missing only auth/prerequisite and failure-mode detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and nested objects are fully documented, so the baseline is 3. The description largely paraphrases what the schema already states (media download modes, contact auto-save, image quality) rather than adding syntax or format detail beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb plus resource ('Change an account's settings') followed by an explicit inventory of every mutable field, so an agent immediately knows the scope. It reads as a superset of get_account/create_account/reconnect_account but never names or excludes those siblings, so it falls short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the enumeration of settings; there is no explicit 'use this when / use X instead' routing despite close neighbors such as set_presence, reconnect_account, manage_privacy and list_proxy_locations. The pacing recommendation ('Recommended for bulk, cold or marketing sends') lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_incoming_webhookUpdate an incoming webhookA
Idempotent

Rename an incoming webhook, or pause it (enabled: false) and resume it. The destination cannot change: create another one.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
enabledNo
incomingWebhookIdYesThe incoming webhook id, from list_incoming_webhooks.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety profile is largely covered. The description adds genuine mutation-scope context: what can be changed (name, pause/resume via enabled) and what cannot (the destination), which is not in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the primary operations front-loaded and the immutability constraint immediately followed by the remedy. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param idempotent mutation with no output schema and covering annotations, the description supplies the key mutation semantics and constraint. Minor gaps remain (no explicit sibling routing, no confirmation of return behavior) but nothing critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% (only incomingWebhookId is documented in-schema), so the description carries the load for the other two. It explains name as rename and gives concrete semantics for enabled (`enabled: false` = pause, resume), adding meaning beyond the bare boolean type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: rename, pause, or resume an incoming webhook. It is clearly scoped to incoming webhooks, but it never names the sibling update_webhook (for regular webhooks), so an agent must infer the distinction from the tool name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear when-not condition (the destination cannot change; create another one), implicitly routing to create_incoming_webhook. It does not explicitly name alternatives or note that only name/enabled may be modified versus other webhook properties.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_webhookUpdate a webhook endpointA
Idempotent

Change a webhook endpoint's URL or events, or pause it (active: false) and resume it.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
activeNo
eventsNoEvent types to receive, such as `message.received`, `message.sent`, `message.failed`, `account.connected`, `account.disconnected`.
webhookEndpointIdYesThe webhook endpoint id, from list_webhooks.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds real behavioral context beyond that: that setting `active: false` pauses the endpoint and it can be resumed, which is not derivable from the annotation set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence that front-loads the primary action and folds the pause/resume nuance into the same clause. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter mutation tool with annotations covering safety and no output schema, the description is largely sufficient. It leaves minor gaps: it doesn't state whether unmentioned fields are left untouched (partial update semantics) or what authorization is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: `events` and `webhookEndpointId` are documented in the schema, but `url` and `active` have no schema descriptions. The description partly compensates by clarifying `active: false` means pause and naming URL/events as the changeable fields, but it adds no format detail (e.g., HTTPS-only URL) beyond what the pattern already implies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change/update) and resource (webhook endpoint) and enumerates the mutable fields (URL, events) plus the pause/resume capability. The 'update' verb clearly separates it from create_webhook/delete_webhook/get_webhook siblings, though it doesn't name them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to reach for it (to modify or pause/resume an existing endpoint) and the schema references list_webhooks for obtaining the id, but there is no explicit when-to-use-vs-alternatives guidance or statement of prerequisites such as required permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_fileUpload a file to sendA

Upload a file whose bytes you have (not a URL) so it can be sent: returns an upload whose id goes in uploadId of send_media or post_story. The file can be sent for 24 hours, to any number of chats. Up to 5 MB; the hosted server takes requests up to 1 MB, so about 700 KB of file there. For a file that is already at a public URL, skip this and pass the URL to send_media.

ParametersJSON Schema
NameRequiredDescriptionDefault
base64YesThe file's bytes in base64.
filenameNoDocuments: the file name the recipient sees.
mimeTypeYesThe file's MIME type: `image/jpeg`, `application/pdf`, `audio/ogg; codecs=opus` for a voice note.
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false), while the description adds practical behavior: the upload is valid for 24 hours, can be sent to any number of chats, and has tiered size limits (5 MB overall, about 700 KB via the hosted server). It could go further on auth requirements, but the added constraints are meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then return usage, duration/size constraints, and the URL alternative. Every sentence carries actionable information, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a prerequisite upload tool with no output schema, the description explains what is returned (an upload id), how to use it downstream, validity duration, size limits, and the alternative path. Together with the rich input schema, an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description still adds useful parameter context by clarifying that base64 must be actual bytes rather than a URL and by explaining the effective size ceiling, which maps directly to the base64 input limit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Upload a file') and immediately clarifies the input form ('whose bytes you have, not a URL'). It also names the downstream tools that consume the returned upload id, so an agent can distinguish it from send_media's URL-based path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool and when not to: use it for file bytes, and for an already-public URL 'skip this and pass the URL to send_media.' It also ties the result to send_media and post_story, giving the agent a clear routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vote_in_pollVote in a pollA
Idempotent

Vote in a poll message as the account that received or sent it, with the names of its options (get_message shows them). An empty list retracts the vote. Returns the poll with its tally.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsYesOption names exactly as in the poll. `[]` retracts the vote.
messageIdYesA wuapi message id (from list_messages, a send tool, or a webhook).
idempotencyKeyNoOptional. Reuse the same key when retrying this exact call: within 24 hours wuapi returns the first result instead of doing it twice.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds important behavior beyond annotations: voting as the receiving/sending account, retraction via an empty list, and returning the poll with its tally.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences with no wasted words. The core action is front-loaded, followed by retraction behavior and return value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With rich annotations, a fully documented schema, and no output schema, the description supplies the needed missing details: account scope, option source, retraction semantics, and return content. Nothing critical for invoking the tool correctly is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents messageId, options, and idempotencyKey. The description reinforces option names and retraction but adds little beyond the schema's own parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Vote in a poll message'. It also clarifies the acting account and the expected option names, which distinguishes it from siblings like send_poll and get_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for obtaining option names via get_message and states that an empty list retracts the vote. It does not explicitly state when not to use this tool or name a direct voting alternative, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.14.0
    • Addedsave_contacts
    • Changedupdate_account1 field changed
      • addedInput schema / properties / contactAutoSave
        Added value: +{
        +  "description": "Contact auto-save: only direct chats with a number, never renaming a contact the phone already holds, each contact at most once, at most 200 a day. The given fields change.",
        +  "properties": {
        +    "enabled": {
        +      "description": "Save the contacts of new direct chats on the phone automatically.",
        +      "type": "boolean"
        +    },
        +    "fallbackName": {
        +      "description": "Used when the template needs a profile name the contact has not set.",
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "nameTemplate": {
        +      "description": "The saved name: `{profileName}` (WhatsApp profile name) and `{phone}` (E.164).",
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "trigger": {
        +      "description": "`first_inbound`: the contact's first message in a new chat. `any_chat`: any new chat, whoever writes first.",
        +      "enum": [
        +        "first_inbound",
        +        "any_chat"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  2. 10 tool updatesv0.13.1
    • Addedcreate_incoming_webhook
    • Addeddelete_incoming_webhook
    • Addedget_incoming_webhook
    • Addedlist_incoming_webhooks
    • Changedsend_contact1 field changed
      • changedInput schema / properties / replyToMessageId / description
        Previous value: -"A wuapi message id in the same chat to quote (reply to)."New value: +"A wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`)."
    • Changedsend_location1 field changed
      • changedInput schema / properties / replyToMessageId / description
        Previous value: -"A wuapi message id in the same chat to quote (reply to)."New value: +"A wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`)."
    • Changedsend_media1 field changed
      • changedInput schema / properties / replyToMessageId / description
        Previous value: -"A wuapi message id in the same chat to quote (reply to)."New value: +"A wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`)."
    • Changedsend_poll1 field changed
      • changedInput schema / properties / replyToMessageId / description
        Previous value: -"A wuapi message id in the same chat to quote (reply to)."New value: +"A wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`)."
    • Changedsend_text1 field changed
      • changedInput schema / properties / replyToMessageId / description
        Previous value: -"A wuapi message id in the same chat to quote (reply to)."New value: +"A wuapi message id in the same chat to quote (reply to). One exception, a private reply: a message someone else wrote in a group can be quoted in the direct chat with its author (`to` is that message's `from`)."
    • Addedupdate_incoming_webhook
  3. 1 tool updatev0.12.0
    • Changedcreate_group1 field changed
      • addedInput schema / properties / communityId
        Added value: +{
        +  "description": "Create the group inside this community: its group id (`...@g.us`), from list_groups (`community: true`). The account must administer it.",
        +  "maxLength": 200,
        +  "minLength": 1,
        +  "type": "string"
        +}
  4. 5 tool updatesv0.10.0
    • Changedcreate_webhook1 field changed
      • changedInput schema / properties / events / items / enum
        Previous value: -[
        -  "account.qr_code_issued",
        -  "account.pairing_code_issued",
        -  "account.connected",
        -  "account.disconnected",
        -  "account.failed",
        -  "message.received",
        -  "message.sent",
        -  "message.delivered",
        -  "message.read",
        -  "message.failed",
        -  "message.edited",
        -  "message.deleted",
        -  "message.media_downloaded",
        -  "poll.voted",
        -  "group.joined",
        -  "group.updated",
        -  "group.join_requested",
        -  "group.join_request_revoked",
        -  "chat.updated",
        -  "chat.presence_updated",
        -  "contact.presence_updated",
        -  "contact.picture_updated",
        -  "contact.updated",
        -  "blocklist.updated",
        -  "label.updated",
        -  "call.received",
        -  "call.ended",
        -  "channel.message_received",
        -  "channel.message_updated",
        -  "channel.updated",
        -  "history.synced",
        -  "project.created",
        -  "project.updated",
        -  "project.deleted",
        -  "invitation.status_changed"
        -]New value: +[
        +  "account.qr_code_issued",
        +  "account.pairing_code_issued",
        +  "account.connected",
        +  "account.disconnected",
        +  "account.failed",
        +  "message.received",
        +  "message.sent",
        +  "message.delivered",
        +  "message.read",
        +  "message.failed",
        +  "message.edited",
        +  "message.deleted",
        +  "message.media_downloaded",
        +  "story.received",
        +  "story.deleted",
        +  "story.viewed",
        +  "story.reacted",
        +  "poll.voted",
        +  "group.joined",
        +  "group.updated",
        +  "group.join_requested",
        +  "group.join_request_revoked",
        +  "chat.updated",
        +  "chat.presence_updated",
        +  "contact.presence_updated",
        +  "contact.picture_updated",
        +  "contact.updated",
        +  "blocklist.updated",
        +  "sticker.favorites_updated",
        +  "label.updated",
        +  "call.received",
        +  "call.ended",
        +  "channel.message_received",
        +  "channel.message_updated",
        +  "channel.updated",
        +  "history.synced",
        +  "project.created",
        +  "project.updated",
        +  "project.deleted",
        +  "invitation.status_changed"
        +]
    • Addedforward_message
    • Addedmanage_favorite_stickers
    • Addedmanage_stories
    • Changedupdate_webhook1 field changed
      • changedInput schema / properties / events / items / enum
        Previous value: -[
        -  "account.qr_code_issued",
        -  "account.pairing_code_issued",
        -  "account.connected",
        -  "account.disconnected",
        -  "account.failed",
        -  "message.received",
        -  "message.sent",
        -  "message.delivered",
        -  "message.read",
        -  "message.failed",
        -  "message.edited",
        -  "message.deleted",
        -  "message.media_downloaded",
        -  "poll.voted",
        -  "group.joined",
        -  "group.updated",
        -  "group.join_requested",
        -  "group.join_request_revoked",
        -  "chat.updated",
        -  "chat.presence_updated",
        -  "contact.presence_updated",
        -  "contact.picture_updated",
        -  "contact.updated",
        -  "blocklist.updated",
        -  "label.updated",
        -  "call.received",
        -  "call.ended",
        -  "channel.message_received",
        -  "channel.message_updated",
        -  "channel.updated",
        -  "history.synced",
        -  "project.created",
        -  "project.updated",
        -  "project.deleted",
        -  "invitation.status_changed"
        -]New value: +[
        +  "account.qr_code_issued",
        +  "account.pairing_code_issued",
        +  "account.connected",
        +  "account.disconnected",
        +  "account.failed",
        +  "message.received",
        +  "message.sent",
        +  "message.delivered",
        +  "message.read",
        +  "message.failed",
        +  "message.edited",
        +  "message.deleted",
        +  "message.media_downloaded",
        +  "story.received",
        +  "story.deleted",
        +  "story.viewed",
        +  "story.reacted",
        +  "poll.voted",
        +  "group.joined",
        +  "group.updated",
        +  "group.join_requested",
        +  "group.join_request_revoked",
        +  "chat.updated",
        +  "chat.presence_updated",
        +  "contact.presence_updated",
        +  "contact.picture_updated",
        +  "contact.updated",
        +  "blocklist.updated",
        +  "sticker.favorites_updated",
        +  "label.updated",
        +  "call.received",
        +  "call.ended",
        +  "channel.message_received",
        +  "channel.message_updated",
        +  "channel.updated",
        +  "history.synced",
        +  "project.created",
        +  "project.updated",
        +  "project.deleted",
        +  "invitation.status_changed"
        +]
  5. 11 tool updatesv0.9.0
    • Changedcreate_webhook1 field changed
      • changedInput schema / properties / events / items / enum
        Previous value: -[
        -  "account.qr_code_issued",
        -  "account.pairing_code_issued",
        -  "account.connected",
        -  "account.disconnected",
        -  "account.failed",
        -  "message.received",
        -  "message.sent",
        -  "message.delivered",
        -  "message.read",
        -  "message.failed",
        -  "message.edited",
        -  "message.deleted",
        -  "poll.voted",
        -  "group.joined",
        -  "group.updated",
        -  "group.join_requested",
        -  "group.join_request_revoked",
        -  "chat.updated",
        -  "chat.presence_updated",
        -  "contact.presence_updated",
        -  "contact.picture_updated",
        -  "contact.updated",
        -  "blocklist.updated",
        -  "label.updated",
        -  "call.received",
        -  "call.ended",
        -  "channel.message_received",
        -  "channel.message_updated",
        -  "channel.updated",
        -  "history.synced",
        -  "project.created",
        -  "project.updated",
        -  "project.deleted",
        -  "invitation.status_changed"
        -]New value: +[
        +  "account.qr_code_issued",
        +  "account.pairing_code_issued",
        +  "account.connected",
        +  "account.disconnected",
        +  "account.failed",
        +  "message.received",
        +  "message.sent",
        +  "message.delivered",
        +  "message.read",
        +  "message.failed",
        +  "message.edited",
        +  "message.deleted",
        +  "message.media_downloaded",
        +  "poll.voted",
        +  "group.joined",
        +  "group.updated",
        +  "group.join_requested",
        +  "group.join_request_revoked",
        +  "chat.updated",
        +  "chat.presence_updated",
        +  "contact.presence_updated",
        +  "contact.picture_updated",
        +  "contact.updated",
        +  "blocklist.updated",
        +  "label.updated",
        +  "call.received",
        +  "call.ended",
        +  "channel.message_received",
        +  "channel.message_updated",
        +  "channel.updated",
        +  "history.synced",
        +  "project.created",
        +  "project.updated",
        +  "project.deleted",
        +  "invitation.status_changed"
        +]
    • Addedget_chat
    • Addedget_contact
    • Changedget_message1 field changed
      • addedInput schema / properties / fetchMedia
        Added value: +{
        +  "description": "Also download the message's media if needed and return its direct URL as `mediaFile`.",
        +  "type": "boolean"
        +}
    • Addedlist_chats
    • Addedlist_contacts
    • Changedpost_story1 field changed
      • addedInput schema / properties / uploadId
        Added value: +{
        +  "description": "The id of an upload made with upload_file (or `POST /v1/uploads`): a file wuapi already stores. Usable for 24 hours, any number of times.",
        +  "maxLength": 64,
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedsend_media4 fields changed
      • changedInput schema / properties / mimeType / description
        Previous value: -"Guessed from the URL when omitted."New value: +"Guessed from the URL, or the upload's own type, when omitted."
      • addedInput schema / properties / quality
        Added value: +{
        +  "description": "Images only: the quality of this image instead of the account's. `hd` is WhatsApp's HD photo; `original` sends the file without re-encoding it.",
        +  "enum": [
        +    "standard",
        +    "hd",
        +    "original"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / uploadId
        Added value: +{
        +  "description": "The id of an upload made with upload_file (or `POST /v1/uploads`): a file wuapi already stores. Usable for 24 hours, any number of times.",
        +  "maxLength": 64,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "accountId",
        -  "to",
        -  "type",
        -  "url"
        -]New value: +[
        +  "accountId",
        +  "to",
        +  "type"
        +]
    • Changedupdate_account2 fields changed
      • addedInput schema / properties / imageQuality
        Added value: +{
        +  "description": "What the account's images are re-encoded to before their upload through the number's proxy (proxy traffic). `standard` (default): longest side 1600 px, JPEG, as WhatsApp sends a photo. `hd`: up to 4096 px. `original`: the file as it is.",
        +  "enum": [
        +    "standard",
        +    "hd",
        +    "original"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / mediaAutoDownload
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "none",
        +        "all"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "properties": {
        +        "maxBytes": {
        +          "description": "Largest file downloaded up front, in bytes.",
        +          "maximum": 2000000000,
        +          "minimum": 1,
        +          "type": "integer"
        +        },
        +        "types": {
        +          "description": "Media types downloaded up front.",
        +          "items": {
        +            "enum": [
        +              "image",
        +              "video",
        +              "audio",
        +              "document",
        +              "sticker"
        +            ],
        +            "type": "string"
        +          },
        +          "minItems": 1,
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "maxBytes",
        +        "types"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "description": "Which received media is downloaded right away through the number's proxy (proxy traffic). `none` (default for new accounts): on demand, when its media URL is first requested. `all`: every file. `{maxBytes, types}`: only those."
        +}
    • Changedupdate_webhook1 field changed
      • changedInput schema / properties / events / items / enum
        Previous value: -[
        -  "account.qr_code_issued",
        -  "account.pairing_code_issued",
        -  "account.connected",
        -  "account.disconnected",
        -  "account.failed",
        -  "message.received",
        -  "message.sent",
        -  "message.delivered",
        -  "message.read",
        -  "message.failed",
        -  "message.edited",
        -  "message.deleted",
        -  "poll.voted",
        -  "group.joined",
        -  "group.updated",
        -  "group.join_requested",
        -  "group.join_request_revoked",
        -  "chat.updated",
        -  "chat.presence_updated",
        -  "contact.presence_updated",
        -  "contact.picture_updated",
        -  "contact.updated",
        -  "blocklist.updated",
        -  "label.updated",
        -  "call.received",
        -  "call.ended",
        -  "channel.message_received",
        -  "channel.message_updated",
        -  "channel.updated",
        -  "history.synced",
        -  "project.created",
        -  "project.updated",
        -  "project.deleted",
        -  "invitation.status_changed"
        -]New value: +[
        +  "account.qr_code_issued",
        +  "account.pairing_code_issued",
        +  "account.connected",
        +  "account.disconnected",
        +  "account.failed",
        +  "message.received",
        +  "message.sent",
        +  "message.delivered",
        +  "message.read",
        +  "message.failed",
        +  "message.edited",
        +  "message.deleted",
        +  "message.media_downloaded",
        +  "poll.voted",
        +  "group.joined",
        +  "group.updated",
        +  "group.join_requested",
        +  "group.join_request_revoked",
        +  "chat.updated",
        +  "chat.presence_updated",
        +  "contact.presence_updated",
        +  "contact.picture_updated",
        +  "contact.updated",
        +  "blocklist.updated",
        +  "label.updated",
        +  "call.received",
        +  "call.ended",
        +  "channel.message_received",
        +  "channel.message_updated",
        +  "channel.updated",
        +  "history.synced",
        +  "project.created",
        +  "project.updated",
        +  "project.deleted",
        +  "invitation.status_changed"
        +]
    • Addedupload_file
  6. 21 tool updatesv0.3.0
    • Addeddelete_chat
    • Addedget_webhook
    • Addedlookup_whatsapp_info
    • Addedmanage_block_list
    • Addedmanage_branding
    • Addedmanage_channel
    • Addedmanage_community
    • Addedmanage_group_joins
    • Addedmanage_group_settings
    • Addedmanage_labels
    • Addedmanage_privacy
    • Addedmanage_profile
    • Addedmanage_project
    • Addedreject_call
    • Addedresend_invitation
    • Addedset_disappearing_timer
    • Addedset_presence
    • Addedstar_message
    • Addedunlink_account
    • Addedupdate_account
    • Addedvote_in_poll
  7. 51 tool updatesv0.1.0
    • First observedadd_group_participants
    • First observedarchive_chat
    • First observedcancel_invitation
    • First observedcancel_message
    • First observedcheck_numbers
    • First observedcreate_account
    • First observedcreate_group
    • First observedcreate_invitation
    • First observedcreate_project
    • First observedcreate_webhook
    • First observeddelete_message
    • First observeddelete_webhook
    • First observeddemote_group_participants
    • First observededit_message
    • First observedget_account
    • First observedget_account_qr_code
    • First observedget_current_key
    • First observedget_group
    • First observedget_group_invite_link
    • First observedget_invitation
    • First observedget_message
    • First observedget_project
    • First observedget_usage
    • First observedget_usage_by_project
    • First observedleave_group
    • First observedlist_accounts
    • First observedlist_groups
    • First observedlist_invitations
    • First observedlist_messages
    • First observedlist_projects
    • First observedlist_proxy_locations
    • First observedlist_webhooks
    • First observedlookup_contacts
    • First observedmark_chat_read
    • First observedmute_chat
    • First observedpin_chat
    • First observedpost_story
    • First observedpromote_group_participants
    • First observedreact_to_message
    • First observedreconnect_account
    • First observedremove_group_participants
    • First observedreply_to_message
    • First observedrequest_pairing_code
    • First observedreset_group_invite_link
    • First observedsend_contact
    • First observedsend_location
    • First observedsend_media
    • First observedsend_poll
    • First observedsend_read_receipts
    • First observedsend_text
    • First observedupdate_webhook

TDQS

B3.4/5.0

Scored across 86 tools

Disambiguation3/5

Most tools target distinct resources or actions and the descriptions help distinguish them, but there are several overlapping contact-related tools (list_contacts, get_contact, lookup_contacts, check_numbers, lookup_whatsapp_info) and multiple management bundles that an agent could confuse without careful reading.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern, using either verb_noun (e.g. list_accounts, send_text, get_message) or manage_noun for multi-action bundles (e.g. manage_labels, manage_privacy). There is no mixing of conventions like camelCase or inconsistent verb styles.

Tool Count1/5

86 tools far exceeds the recommended 3-15 range and even the 25+ 'too many' threshold. This enormous surface would overwhelm an agent's tool selection and routing, despite the domain being broad.

Completeness4/5

The server covers a wide range of WhatsApp API operations including accounts, messaging, groups, communities, channels, stories, webhooks, projects, and invitations, with near-complete lifecycle coverage for those areas. However, it lacks tools for message templates, interactive messages, and some business features, leaving minor gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

  • WhatsMCP connects Claude and other MCP-compatible AI agents directly to WhatsApp. Send and receive text, images, documents, and voice notes; manage groups (create, add/remove members, promote admins); look up contacts and profiles; follow channels; and read call and message history — all through a standard MCP interface. For voice use cases, WhatsMCP offers SIP-based calling plans (inbound-only, or full inbound/outbound) so AI voice agents can answer and place WhatsApp calls, plus low-latency WebSocket integrations with voice agent providers like ElevenLabs. Multiple WhatsApp accounts can be paired and managed per workspace, with webhook support for real-time inbound message delivery to your own infrastructure.

  • Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.

  • WhatsApp (Web + Business API), SMS, contacts, and call records via 2Chat's MCP server.

  • Let Claude or ChatGPT search, read and send your WhatsApp messages over MCP. OAuth sign-in.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables programmatic WhatsApp automation through MCP, including sending messages, managing chats and contacts, searching conversation history, and exchanging media files.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables linking a WhatsApp number via QR code and then sending, reading, listing chats, and checking status through MCP tools, with per-account API key authentication.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables connecting a personal or business WhatsApp account via QR pairing and then sending/reading messages, managing chats, contacts, groups, and searching message history through MCP tools.
    MIT