Skip to main content
Glama
Sealjay

mcp-whatsapp

by Sealjay

WhatsApp MCP Server

License: MIT CI Go Report Card Go 1.25+ MCP 42 tools whatsmeow Sealjay/mcp-whatsapp MCP server GitHub issues

A single-binary Go MCP server that wraps whatsmeow to expose a personal WhatsApp account to LLMs. whatsapp-mcp serve runs as a lightweight HTTP daemon on 127.0.0.1:8765; MCP clients (Claude Desktop, Cursor, Claude Code, etc.) connect to it via HTTP — no process spawning, no stdin/stdout juggling. Messages are cached in local SQLite and only travel to the model when the agent calls a tool.

Unaffiliated. This is an independent open-source project. It is not affiliated with, endorsed by, or otherwise associated with Meta Platforms, Inc., WhatsApp, or whatsmeow. "WhatsApp" is a trademark of Meta Platforms, Inc., used here nominatively to describe interoperability.

This started as a fork of lharries/whatsapp-mcp and has since been rewritten as a single Go binary. What it adds over the original:

  • LID resolution — normalises @lid JIDs to real phone numbers for accurate contact matching.

  • Sent-message storage — outgoing messages are persisted locally so conversation history stays complete.

  • Disappearing-message timers — outgoing messages inherit the group chat's ephemeral timer automatically.

  • Targeted history sync — on-demand per-chat backfill via the request_sync tool.

  • Extended tool surface — 42 tools (see below): reactions, replies, edits, revoke, mark-read, typing, is-on-whatsapp, full group admin, blocklist, polls (create + vote + tally), contact cards, view-once flag, presence, privacy settings, and the profile "About" text.

  • Single-instance enforcement — a flock(2) on store/.lock prevents two serve processes racing on the same SQLite files.

Setup

Prerequisites

  • Go 1.25+ (build-time only; runtime needs just the compiled binary).

  • An MCP client that speaks HTTP (Claude Desktop, Cursor, Claude Code, etc.).

  • FFmpeg (optional) — required only for send_audio_message when the input is not already .ogg Opus. Without it, use send_file to send raw audio.

  • Windows: CGO must be enabled — see docs/windows.md.

Install

git clone https://github.com/Sealjay/mcp-whatsapp.git
cd mcp-whatsapp
make build    # writes ./bin/whatsapp-mcp

Pair your phone (first run only)

Start the daemon, then open the pairing page in a browser:

./bin/whatsapp-mcp serve          # starts on 127.0.0.1:8765
open http://127.0.0.1:8765/pair   # macOS; or visit the URL manually

Scan the QR code with WhatsApp on your phone (Settings → Linked Devices → Link a Device). The pairing persists to ./store/whatsapp.db. When WhatsApp invalidates the session (roughly every 20 days), visit /pair again and re-scan.

Alternative (headless / CI): ./bin/whatsapp-mcp login renders the QR in the terminal. Use this when a browser isn't available.

Connect your MCP client

whatsapp-mcp serve is an HTTP daemon on 127.0.0.1:8765 (or $WHATSAPP_MCP_ADDR). MCP clients connect to it over HTTP:

// Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "whatsapp": { "url": "http://127.0.0.1:8765/mcp" }
  }
}
// Claude Code — .claude/mcp.json (project) or ~/.claude/mcp.json (user)
{
  "mcpServers": {
    "whatsapp": { "type": "http", "url": "http://127.0.0.1:8765/mcp" }
  }
}
// Cursor — ~/.cursor/mcp.json
{
  "mcpServers": {
    "whatsapp": { "type": "http", "url": "http://127.0.0.1:8765/mcp" }
  }
}

Restart the client. WhatsApp appears as an available integration. Closing and reopening the client reconnects to the daemon — no process spawn, no per-session handshake, no stdin/stdout juggling.

Sending and receiving files

WHATSAPP_MCP_MEDIA_ROOT gates both directions of file movement:

  • Sendingsend_file and send_audio_message accept a media_path argument pointing at the file to send. The path must live under the allowed root.

  • Receivingdownload_media writes decrypted media to the daemon cache at <store>/<chat_jid>/. Passing the optional output_path argument additionally places the file at a caller-chosen location, which must also live under the allowed root. If a file already exists at output_path the call is a no-op.

By default the allowed root is ./store/uploads/ (resolved relative to your -store directory). On first run, serve creates it automatically; drop files you intend to send into it and point output_path here if you want to read incoming media from the same place.

To allow a different directory, set WHATSAPP_MCP_MEDIA_ROOT (absolute path) when starting the daemon:

WHATSAPP_MCP_MEDIA_ROOT=/Users/me/whatsapp-shared ./bin/whatsapp-mcp serve

Or add it to your launchd plist / systemd unit / shell profile so it persists across restarts.

Paths outside the allowed root are rejected with a clear error so Claude can ask you to move the file or update the env var. Symlinks inside the root are resolved before the check, so a symlink that points out of the root is also rejected. Do not place secrets inside the allowed root — the allowlist bounds what the tool can read or write, but anything inside is fair game.

Sandboxed clients (Claude.ai with Cowork, etc.)

Sandboxed MCP clients cannot read the daemon's local cache. To make downloaded media visible to them, point WHATSAPP_MCP_MEDIA_ROOT at a directory the client's sandbox can also read (a Cowork workspace mount, a shared volume, etc.), and tell the client to pass output_path on every download_media call into that root. A copy-pasteable system instruction:

When calling the WhatsApp MCP's download_media, always pass output_path set to a path under your shared workspace. Without it the decrypted file lands only in the daemon's local cache, which is outside your sandbox and unreadable. output_path must live under WHATSAPP_MCP_MEDIA_ROOT on the daemon side; the basename is yours to pick.

Related MCP server: Brevo MCP Server

Architecture

One binary, seven internal packages:

cmd/whatsapp-mcp/       login / serve / smoke subcommands
internal/client/        whatsmeow client wrapper (send, download, events, history, features)
internal/daemon/        HTTP server, pairing state machine, /pair endpoint
internal/mcp/           mark3labs/mcp-go server + tool registrations
internal/media/         ogg parsing, waveform synthesis, ffmpeg shell-out
internal/security/      path allowlisting, filename sanitisation, log redaction
internal/store/         SQLite cache, LID resolution, query layer

Process lifecycle

serve runs as a long-lived HTTP daemon. MCP clients connect and disconnect freely; the daemon stays up and continues receiving WhatsApp events. A flock(2) on store/.lock prevents two instances racing on the same store (WhatsApp would kick one of the two linked-device connections anyway).

The trade-off: events are persisted to SQLite only while serve is running. If the daemon stops, the WhatsApp connection closes. On the next start, whatsmeow emits events.HistorySync events that backfill conversations into SQLite, but the recovery window is governed by WhatsApp's server-side retention for multidevice clients — not by this codebase. Messages that arrive during a gap long enough to outlast WhatsApp's retention are not recoverable. For shorter, known gaps, the request_sync tool triggers a per-chat backfill on demand.

Data storage

Everything lives under ./store/ (override with -store DIR):

  • store/messages.db — local chat/message cache, indexed for search.

  • store/whatsapp.db — whatsmeow's own device/session state.

  • store/.lock — ephemeral advisory lock for single-instance serve.

Data flow

  1. The client sends a JSON-RPC tools/call to serve over HTTP.

  2. The MCP layer dispatches to an internal handler.

  3. The handler either queries the local SQLite store or calls whatsmeow directly (send, download, reactions, etc.).

  4. Incoming WhatsApp events are persisted to the store in a background goroutine inside the same process, so query tools always see current state.

Running the daemon

The daemon is designed to run independently of any MCP client. Three supported lifecycle models:

macOS — launchd. Template at docs/launchd/com.sealjay.whatsapp-mcp.plist. Copy to ~/Library/LaunchAgents/, replace {{PATH_TO_REPO}} / {{STORE_DIR}} placeholders, launchctl load. Daemon runs from login onwards.

Linux — systemd user unit. Template at docs/systemd/whatsapp-mcp.service. Copy to ~/.config/systemd/user/, replace placeholders, systemctl --user enable --now whatsapp-mcp.

Claude Code SessionStart hook. For project-scoped lifetimes, drop docs/hooks/setup.sh into your project's .claude/hooks/ and configure settings.json to invoke it. The hook is idempotent — safe to run alongside launchd/systemd.

Manual. ./bin/whatsapp-mcp serve -addr 127.0.0.1:8765 in any terminal. Ctrl-C to stop.

First-time pairing happens in a browser: start the daemon, open http://127.0.0.1:8765/pair, scan the QR with your phone. No terminal required. WhatsApp's multidevice protocol rotates the linked-device session roughly every 20 days; when that happens, the /pair page serves a fresh QR automatically — visit it again and re-pair. The /pair/* endpoints are rate-limited (5 GET/min, 1 POST/min on /pair/reset) and CSRF-protected.

Flags and environment variables for serve:

  • -addr host:port (env WHATSAPP_MCP_ADDR, default 127.0.0.1:8765).

  • -allow-remote (explicit opt-in to bind a non-loopback address; requires WHATSAPP_MCP_TOKEN).

  • WHATSAPP_MCP_TOKEN — bearer token for /mcp and /pair/* when -allow-remote is set. Required; serve exits if missing.

  • WHATSAPP_MCP_MEDIA_ROOT — allowed root for send_file / send_audio_message media_path and download_media output_path.

  • WHATSAPP_MCP_DEBUG=1 — enable verbose logging with partial phone-number redaction (last 5 digits visible).

Tools

42 tools, grouped by purpose.

Read / query

Tool

Purpose

search_contacts

Substring search across cached contact names and phone numbers

list_messages

Query + filter messages; returns formatted text with context windows

list_chats

List chats with last-message preview; sort by activity or name

get_chat

Chat metadata by JID

get_message_context

Before/after window around a specific message

download_media

Download persisted media to a local path

request_sync

Ask WhatsApp to backfill history for a chat

Send

Tool

Purpose

send_message

Send a text message to a phone number or JID

send_file

Send image/video/document/raw audio with optional caption; view_once: bool marks image/video/audio submessages as view-once (ignored for documents)

send_audio_message

Send a voice note (auto-converts via ffmpeg if not .ogg Opus); supports view_once: bool

send_poll

Send a poll with a question and 2+ options; selectable_count controls how many options a voter may pick. Generates the 32-byte MessageSecret required for votes to decrypt

send_poll_vote

Cast a vote on a previously-seen poll; options must match option names exactly

get_poll_results

Return the tally for a poll we have cached (includes 0-vote options)

send_contact_card

Send a contact card; synthesises a vCard 3.0 from name + phone, or pass a raw vcard to skip synthesis

Message actions

Tool

Purpose

mark_read

Mark specific message IDs as read

mark_chat_read

Ack the most recent incoming messages in a chat to clear the unread badge

send_reaction

React to a message (empty emoji clears an existing reaction)

send_reply

Text reply that quotes a prior message

edit_message

Edit a previously-sent message

delete_message

Revoke (delete for everyone) a message

send_typing

Set per-chat composing / recording presence

Groups

Tool

Purpose

create_group

Create a group with a name and initial participants

leave_group

Leave a group

list_groups

List all groups the user is a member of

get_group_info

Full group metadata (participants, settings, invite config)

update_group_participants

Add / remove / promote / demote participants (action: add|remove|promote|demote)

set_group_name

Change the group subject

set_group_topic

Change the group description; empty string clears it

set_group_announce

Toggle announce-only mode (only admins can send)

set_group_locked

Toggle locked mode (only admins can edit group metadata)

get_group_invite_link

Get the invite link; reset: true revokes the previous link first

join_group_with_link

Join a group via a chat.whatsapp.com URL or bare invite code

Blocklist

Tool

Purpose

get_blocklist

Return the current blocklist

block_contact

Block a contact by phone number or JID

unblock_contact

Unblock a contact

Privacy / presence / status

Tool

Purpose

send_presence

Set own availability (available or unavailable) — distinct from per-chat send_typing

get_privacy_settings

Current privacy settings as JSON

set_privacy_setting

Change one privacy setting by name + value (strict enum validation; invalid combinations are rejected)

set_status_message

Update the profile "About" text; empty string clears it

Admin

Tool

Purpose

is_on_whatsapp

Batch-check which phone numbers are registered on WhatsApp

get_status

Report whether the bridge is connected and which account it's paired as

pairing_status

Report the device-pairing state as a structured setup_state envelope (ready / awaiting_qr + qr_payload / error) for programmatic supervisors that surface the linking QR

Deferred

Intentionally not exposed yet:

  • subscribe_presence — no persistence layer for presence events, skipped to avoid a dangling tool.

  • Profile photo setter — upstream whatsmeow doesn't expose a user-level setter.

  • Approval-mode participants, communities, newsletters — low-use surface, deferred.

Limitations

  • Prompt-injection risk: as with many MCP servers, this one is subject to the lethal trifecta. Prompt injection in incoming messages could lead to private data exfiltration — treat the tool surface accordingly.

  • Re-authentication: WhatsApp may invalidate the linked-device session periodically; re-run ./bin/whatsapp-mcp login when that happens.

  • Message gaps when serve isn't running: events only flow into SQLite while the binary is alive. Messages sent during an offline window are recovered on next reconnect only if WhatsApp's multidevice retention still holds them; for longer gaps use request_sync per chat, or accept the loss.

  • Single instance per store: only one whatsapp-mcp serve can hold the store lock. Parallel MCP clients must point at different -store directories (and therefore different paired sessions).

  • Windows: requires CGO and a C compiler — see docs/windows.md.

  • Upstream bounds: message fetch/send is bounded by what whatsmeow supports against the WhatsApp web multidevice API.

  • Log redaction is obfuscation, not anonymisation. Partial knowledge of your contacts allows correlation from the last 5 visible digits. Symlinks inside ./store/uploads/ are resolved before the path check so they cannot escape, but the root itself is a trust boundary — only place files you intend to send inside it.

Development

make test          # unit tests
make test-race     # with -race
make vet           # go vet
make e2e           # build + JSON-RPC smoke over HTTP (requires -tags=e2e)
make smoke         # boot-test the server without connecting to WhatsApp

Upgrading whatsmeow

Weekly CI runs an upstream upgrade probe. To do it manually:

make upgrade-check

This bumps go.mau.fi/whatsmeow@main, re-tidies, builds, and tests. If green, commit the go.mod / go.sum changes.

scripts/mdtest-parity.sh in CI fails the build early if upstream removes or renames any whatsmeow method we call — it's the canary for API drift.

Troubleshooting

  • connect failed … on serve — the daemon is not paired. Open http://127.0.0.1:8765/pair in a browser and scan the QR. Alternatively, run ./bin/whatsapp-mcp login in a terminal.

  • another whatsapp-mcp instance is already running — only one serve can hold the store lock. Check for a stray process (ps aux | grep whatsapp-mcp) or another MCP client pointed at the same -store directory.

  • QR doesn't display — the terminal doesn't render half-block Unicode. Try iTerm2, Windows Terminal, or similar.

  • Device limit reached — WhatsApp caps linked devices. Remove one from Settings → Linked Devices on your phone.

  • No messages loading — after initial auth, it can take several minutes for history to backfill. Use request_sync to target a specific chat.

  • WhatsApp out of sync — delete both database files (store/messages.db and store/whatsapp.db) and re-run login.

  • ffmpeg not foundsend_audio_message needs ffmpeg on PATH to convert non-Opus audio. Use send_file for raw audio instead.

Debug logging

By default, JIDs in stderr logs are redacted to …<last-4-chars-of-user-part> and message bodies are summarised as [<length>B: text|url|command]. Media CDN URLs are collapsed to <scheme>://<host>/…. To see message content while actively debugging:

  • As a flag: ./bin/whatsapp-mcp -debug serve

  • As an env var in your MCP client config:

    "env": { "WHATSAPP_MCP_DEBUG": "1" }

Even with debug mode on, phone-number-shaped digit sequences in bodies and JIDs are partially masked — only the last 5 digits are visible (e.g. +15551234567****34567). This means debug logs are safe to share in bug reports without leaking full phone numbers.

Honesty disclaimer. The partial-redaction scheme is obfuscation for log-reader convenience, not anonymisation. Someone with independent knowledge of your contacts can still correlate the last 5 digits with a specific phone number. Treat redacted logs as "probably safe to paste into a GitHub issue", not "anonymised".

For Claude Desktop integration issues, see the MCP documentation.

Contributing

Contributions welcome via pull request. See CONTRIBUTING.md.

Licence

MIT Licence — see LICENSE.

Available Tools

42 tools
block_contactA
Idempotent

Block a contact so they can no longer send the paired user messages or see your last seen, profile photo, or status; the blocked contact is not explicitly notified but will see undelivered messages on their side. Idempotent if already blocked. Reversible via unblock_contact. Returns the plain-text string Blocked <jid>.

ParametersJSON Schema
NameRequiredDescriptionDefault
jidYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations (idempotentHint, destructiveHint, etc.), the description discloses that the blocked contact is not notified but will see undelivered messages, and specifies the return format. This adds significant 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?

The description is concise with no redundant information. It front-loads the main action and effects, making it efficient for an agent to parse.

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?

Given the tool's simplicity (1 param, no output schema, annotations present), the description adequately covers the effects, return value, idempotency, notification behavior, and reversibility, making it 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?

The sole parameter 'jid' is fully documented in the schema (100% coverage). The tool description does not add any additional parameter semantics beyond what the schema already provides, 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 uses the specific verb 'Block' and identifies the resource 'a contact'. It clearly explains the effects (cannot send messages, hide last seen, etc.) and distinguishes from the sibling tool 'unblock_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?

The description states it is reversible via unblock_contact and idempotent, providing guidance on when to use it (to block a contact) and an alternative. However, it does not explicitly state when not to use it or provide usage scenarios.

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

create_groupA

Create a new WhatsApp group with the given name and initial participants; the paired user becomes admin and listed participants receive a you were added system message in the new chat. Reversible by calling leave_group (irreversible itself) or update_group_participants with remove. Returns a JSON object {jid, info} where jid is the new group's JID and info is the freshly-fetched group metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesgroup display name (subject)
participantsYesinitial members as bare phone digits or individual JIDs (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses behavioral traits beyond annotations: the paired user becomes admin, listed participants receive a system message, and the return format (JSON with jid and info). It also notes reversibility, adding context that annotations do not cover. No contradiction 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 concise, consisting of three sentences that front-load the core purpose, then add side effects, reversibility, and return format. Every sentence contributes meaningful information with 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?

The description covers the main functionality, effects, and reversibility. It details the return value despite no output schema. It lacks mention of prerequisites or error handling, but given the simplicity and annotations, it is adequately 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 coverage is 100% with clear descriptions for both parameters. The description adds minimal semantic value beyond stating 'given name and initial participants', which paraphrases the schema. It does not provide additional constraints or examples.

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 creates a new WhatsApp group with a specific verb and resource. It distinguishes from sibling tools by mentioning the effects (paired user becomes admin, participants receive a system message) and reversibility via leave_group or update_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 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 to use the tool (creating a group) and explicitly mentions how to reverse the action using sibling tools (leave_group, update_group_participants). It does not explicitly state when not to use it, but the purpose is well-defined, making usage guidelines adequate.

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

delete_messageA
DestructiveIdempotent

Revoke (delete-for-everyone) a message; recipients see a message was deleted notice and the local cache row is marked revoked. Permanent — there is no undo, and the original body cannot be restored once revoked. You can only delete your own messages unless you are a group admin. Use edit_message instead when you only want to correct text. Returns the plain-text string Message deleted on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
message_idYesWhatsApp message ID of the message to revoke (use `message_id` from list_messages)
sender_jidNoJID of the original sender; required when deleting someone else's message as a group admin, leave empty when deleting your own (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)

TDQS

A4.9/5.0
Behavior5/5

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

Adds critical beyond-annotation details: permanence ('no undo', 'cannot be restored'), return string ('Message deleted'), and admin privilege nuance. Annotations already indicate destructive and non-read-only, but description enriches with concrete behavioral traits.

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 well-structured sentences front-loading the core action, then detailing effects, restrictions, and alternatives. Every sentence carries necessary information with no waste.

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?

Completely covers what an agent needs: purpose, side effects (permanence), return value, privilege requirements, and sibling differentiation. No output schema exists, but description provides sufficient completion.

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 has 100% coverage with good parameter descriptions. The description adds value by clarifying that sender_jid is required for admin deletion of others' messages and that message_id should come from list_messages, providing additional usage context.

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 clearly states the tool revokes (deletes-for-everyone) a message, with specific verb and resource. It also distinguishes it from edit_message, 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?

Explicitly states when to use this vs edit_message: 'Use edit_message instead when you only want to correct text.' Also notes that only own messages can be deleted unless group admin, providing clear usage boundaries.

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

download_mediaA
Idempotent

Fetch the encrypted media payload (image, video, audio, document) for a previously-cached message, decrypt it, and write it to a local file under the store directory; returns the absolute path. For image and audio downloads at most 5 MiB, the decrypted bytes are ALSO embedded in the tool result as an ImageContent or AudioContent block so remote MCP clients can view or hear the payload without accessing the daemon's filesystem. Videos and documents are not embedded (too large or not renderable inline). Optionally also writes the decrypted file to output_path, which must live under the configured media root (WHATSAPP_MCP_MEDIA_ROOT, default <store>/uploads/). No notification is sent to the sender or chat. Idempotent — repeated calls for the same message return the cached file path. Prerequisite: the message must contain media; use list_messages to find media message IDs. Returns a JSON object {Success, Message, MediaType, Filename, Path} as the first content block, followed by an optional ImageContent/AudioContent block for renderable media.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
message_idYesWhatsApp message ID of a media message (use `message_id` from list_messages)
output_pathNooptional absolute path under the configured media root (`WHATSAPP_MCP_MEDIA_ROOT`, default `<store>/uploads/`); parent directory must exist; calls are skipped if the file already exists; omit to write only to the daemon cache

TDQS

A4.3/5.0
Behavior4/5

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

Discloses key behaviors beyond annotations: idempotency, no notification, embedding for small image/audio, file writing to cache or output_path. No contradiction with annotations; adds value by explaining side effects and return format.

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?

Description is well-structured, starting with main action, then details. At ~200 words, it is comprehensive without being excessively verbose. Each sentence adds value for clarity.

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 complexity and no output schema, description sufficiently covers prerequisites, behavioral nuances, return format (JSON + optional content block), and side effects. Minor gap: could explicitly state that media must be previously cached, but overall complete.

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% but description adds meaning: specifies JID formats for chat_jid, links message_id to list_messages, and clarifies output_path constraints (under media root, parent dir must exist, idempotent on file existence). Enhances understanding beyond 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's action: fetching encrypted media payload, decrypting, writing to a local file, and returning absolute path. It distinguishes from siblings by focusing on downloading media from cached messages, unlike sending or managing 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?

Provides clear context: prerequisite that message must contain media, recommends using list_messages to get media message IDs. Notes that videos/documents are not embedded, guiding users to alternative access. Lacks explicit alternatives but sufficiently contextualizes when to use.

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

edit_messageA
DestructiveIdempotent

Edit a previously-sent text message in place; recipients see the new body with an edited label. Only your own messages can be edited and only within WhatsApp's edit window (~15 minutes). Re-edit by calling again with another new_body; to remove the message entirely use delete_message (revoke). Returns the plain-text string Message edited on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
new_bodyYesreplacement message body text
message_idYesWhatsApp message ID of your own message to edit (use `message_id` from list_messages)

TDQS

A5/5.0
Behavior5/5

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

Discloses behavioral traits beyond annotations: in-place edit with 'edited' label, time constraint, re-edit capability, and success return value. Consistent with all annotation 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?

Two sentences, no wasted words. Functionality first, then constraints and alternatives. Every sentence adds 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?

Given no output schema, description provides return value. Covers all essential aspects: what it does, effect on recipients, limitations, re-edit, removal alternative, and success message. No gaps.

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

Parameters5/5

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

Adds practical meaning beyond schema descriptions: specifies that message_id should come from list_messages and explains chat_jid format with examples. This significantly aids correct invocation despite 100% 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?

Clearly states 'edit a previously-sent text message' with specific verb and resource. Distinguishes from siblings like delete_message and send_message by explaining the in-place edit effect and edited label.

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 states when to use (editing own messages within 15-minute window) and when not (cannot edit others' messages; use delete_message to remove). Provides re-edit guidance and alternative tool name.

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

get_blocklistA
Read-onlyIdempotent

Fetch the paired user's current WhatsApp blocklist from the server. Read-only; blocked contacts are not notified by this call. Use block_contact / unblock_contact to mutate the list. Returns a JSON document with the list of blocked JIDs.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds that blocked contacts are not notified, which is useful behavioral context beyond the annotations. No contradictions.

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 wasted words. The purpose is front-loaded, followed by behavioral guidance and return value. Every sentence adds 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?

The tool is simple with no parameters. The description mentions the return format (JSON list of JIDs), which covers the output sufficiently. No missing context given the tool's simplicity.

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?

Input schema has zero parameters, so description does not need to add parameter info. Baseline for 0 parameters is 4, and the description does not attempt to describe parameters as none exist.

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 verb 'Fetch', the resource 'WhatsApp blocklist', and the scope 'paired user's current'. It also distinguishes from sibling tools like 'block_contact' and 'unblock_contact' which are for mutation, 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?

The description explicitly says it's read-only, that blocked contacts are not notified, and directs users to use 'block_contact' or 'unblock_contact' for mutations. This provides clear when-to-use and 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.

get_chatA
Read-onlyIdempotent

(reads local cache; works while disconnected) Fetch metadata for a single cached chat by JID. Read-only; no side effects. Use list_chats to discover chat JIDs, or get_group_info for live group metadata. Returns a JSON object describing the chat (JID, name, last-message metadata when requested), or the JSON literal null when the chat is not in the cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
include_last_messageNoif true, include the chat's most recent message in the result (defaults to true)

TDQS

A4.7/5.0
Behavior5/5

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

Describes reading from local cache, working while disconnected, and returning null when not found, adding value beyond the annotations that already mark it as readOnly and idempotent.

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 core purpose, no wasted words.

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 adequately explains return format (JSON object or null) and key fields, making the tool behavior complete for agent use.

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 baseline is 3. The description adds minimal extra meaning (return type), but doesn't significantly enhance param understanding.

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 verb 'Fetch', the resource 'metadata for a single cached chat', the method 'by JID', and distinguishes from sibling tools list_chats and get_group_info.

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 states when to use (fetch metadata of cached chat), its read-only nature, and provides alternative tools for discovery and live data.

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

get_group_infoA
Read-onlyIdempotent

Fetch live group metadata (subject, topic, participants with admin flags, announce/locked settings, invite config) for the given group JID. Read-only; no side effects. Use list_groups to discover which groups exist. Returns a JSON object describing the group.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description's statement 'no side effects' adds little. However, it adds useful context about the return format ('Returns a JSON object') which goes beyond 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. The first packs dense information about what is fetched, the second states read-only nature and mentions the sibling tool. No wasted words.

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?

Without an output schema, the description adequately lists the returned fields (subject, topic, participants with admin flags, etc.). Could mention error handling, but openWorldHint suggests graceful handling. Fairly complete for a simple 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 coverage is 100% with a detailed description of the chat_jid parameter. The description only repeats that it's for a 'group JID', adding no new meaning beyond the schema's own description.

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 a specific verb ('Fetch') and resource ('live group metadata'), enumerates the specific fields retrieved, and distinguishes itself from siblings like list_groups by mentioning that discovery 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?

Explicitly states 'Read-only; no side effects' and directs users to use list_groups for discovery, providing clear context for when to use this tool versus alternatives.

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

get_message_contextA
Read-onlyIdempotent

(reads local cache; works while disconnected) Fetch a specific cached message and the surrounding messages in its chat. Read-only; no side effects. Use list_messages for searching across many chats. Returns a JSON object with the target message and arrays of messages before and after it.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNomessages to fetch after the target (default 5; non-positive values fall back to the default)
beforeNomessages to fetch before the target (default 5; non-positive values fall back to the default)
message_idYesWhatsApp message ID of the target message (use `message_id` from list_messages)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations provide readOnlyHint, destructiveHint, idempotentHint. Description adds '(reads local cache; works while disconnected)' and 'Read-only; no side effects,' providing extra behavioral context beyond annotations. No contradictions.

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 concise sentences: purpose and context, side-effect nature, sibling distinction, and return format. No wasted words, front-loaded with key 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?

Despite no output schema, description explains return structure. Covers offline capability and defaults. Missing error handling or missing message case, but overall sufficient for the tool's complexity.

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% with default and descriptions. Description adds value by explaining return structure: 'Returns a JSON object with the target message and arrays of messages before and after it.' Also reiterates default behavior for 'before' and 'after' parameters.

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 clearly states 'Fetch a specific cached message and the surrounding messages in its chat.' Verb 'fetch' and resource identification are specific. Distinguishes from sibling 'list_messages' by noting 'for searching across many chats.'

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?

Explicitly states 'Read-only; no side effects' and recommends 'Use list_messages for searching across many chats.' Also mentions 'works while disconnected' as context. Does not explicitly say when not to use, but provides a clear usage context.

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

get_poll_resultsA
Read-onlyIdempotent

(reads local cache; works while disconnected) Return the current vote tally for a cached poll. Read-only; no side effects. Zero-vote options are included so the response always lists every original option. Returns a JSON object {poll_message_id, chat_jid, tally} where tally is option_label -> vote_count.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
poll_message_idYesWhatsApp message ID of the poll to tally (use `ID` from send_poll, or `message_id` from list_messages)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, non-destructive, and idempotent. The description adds valuable context: zero-vote options are always included, and it works from a local cache while disconnected. 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 extremely concise: two sentences that deliver key behavioral info upfront (cache/offline), then return format. No filler or 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 simple read tool with 2 fully described params, the description covers return shape, zero-vote behavior, and connectivity context. No output schema needed; the description provides sufficient representation.

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 both parameters. The description adds minimal extra meaning beyond specifying that poll_message_id comes from send_poll or list_messages, which is helpful but not essential.

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: 'Return the current vote tally for a cached poll.' It uniquely identifies this as the read operation for poll results, distinguishing it from siblings like 'send_poll' and 'send_poll_vote'.

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 notes it works while disconnected and reads a local cache, implying offline suitability. It explicitly states 'Read-only; no side effects,' which guides safe usage. While it doesn't list when not to use, the purpose is clear enough given the sibling set.

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

get_privacy_settingsA
Read-onlyIdempotent

Fetch the paired user's current WhatsApp privacy settings from the server. Read-only; no side effects. Use set_privacy_setting to change individual values. Returns a JSON document with keys like groupadd, last, status, profile, readreceipts, online, calladd, messages, defense, stickers and their current string values.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. Description adds context about being read-only and returning a JSON document with specific keys, which goes beyond 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 covering purpose, constraints, and return format without unnecessary words.

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?

Completely describes the tool's purpose, side effects, return format, and alternative, making it fully understandable 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.

Parameters4/5

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

Input schema has no parameters, and schema description coverage is 100%. With zero parameters, baseline is 4. Description does not need to add param info but mentions return keys, which is beneficial.

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?

Clearly states it fetches the paired user's WhatsApp privacy settings from the server. Distinguishes from sibling tool set_privacy_setting by mentioning it is read-only and has no side effects.

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 tells when to use this tool (fetching) and when not to (changing), and points to the alternative tool set_privacy_setting for modifications.

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

get_statusA
Read-onlyIdempotent

Report whether the embedded WhatsApp bridge is connected and which account it is paired with. Read-only; no side effects. Call this first when other tools fail with auth or connection errors. Returns a JSON object {connected, paired, own_jid?, own_phone?, hint?}hint includes the URL of the local pairing UI when not yet paired.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds valuable behavioral details: read-only, no side effects, return structure including hint URL. However, it does not specify error conditions (e.g., what happens if bridge is not configured), but this is minor given the 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?

Four sentences, each with purpose: states functionality, behavioral guarantee, usage guidance, and return details. No fluff, information dense and front-loaded.

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?

No output schema exists, but description fully specifies the return JSON fields and their meaning. The tool is simple (no parameters, single purpose), and the description covers all necessary information for an agent to use 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?

No parameters exist, so schema coverage is 100%. Description adds no parameter info, but none is needed. Baseline is 4 because no parameters means no additional semantics required.

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 reports connection status and paired account for the WhatsApp bridge. It uses specific verbs ('Report', 'Call first') and distinguishes this tool from siblings that perform mutations or data retrieval.

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 advises calling this tool first when other tools fail with auth or connection errors, providing a clear usage scenario and diagnostic role.

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

is_on_whatsappA
Read-onlyIdempotent

Query WhatsApp servers to check which of the supplied phone numbers are registered on WhatsApp; the queried users are not notified. Read-only with no chat side effects. Use before send_message when you only have a phone number and need to confirm the contact exists. Returns a JSON object keyed by input phone, each value {is_in: bool, jid: string, verified_name?: string} (or similar).

ParametersJSON Schema
NameRequiredDescriptionDefault
phonesYesphone numbers to check; digits only with no `+` prefix, spaces, or punctuation (e.g. `447700900000`); must be non-empty

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate read-only, non-destructive, idempotent, open world. The description adds value by explicitly stating no notification to queried users and no chat side effects, plus outlining the return format, which is not present in 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?

Three sentences with no redundancy. First sentence states core functionality and side effects, second gives usage recommendation, third describes return format. Information-dense and well-structured.

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 single-parameter read-only tool, the description covers purpose, behavior, usage context, and return format. No output schema exists, but the description compensates by describing the JSON structure.

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

Parameters5/5

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

The schema has 100% coverage for the 'phones' parameter. The description provides essential formatting details (digits only, no + or spaces, example) and validation rule (non-empty), adding significant meaning beyond the schema's basic description.

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 it queries WhatsApp servers to check phone number registration, specifies that users are not notified, and distinguishes itself from sibling tools like send_message by focusing on existence check.

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?

Explicitly recommends use before send_message when only a phone number is available and confirmation of contact existence is needed. However, it does not mention when not to use it, such as when the contact is already known, but the context is largely clear.

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

leave_groupA
DestructiveIdempotent

Leave a WhatsApp group; remaining members see a you left system message and the paired user loses access to all future messages in the chat. Permanent — to rejoin you must be re-added by an admin or invited via a fresh link (join_group_with_link). Prefer setting privacy or muting on the client if you only want silence. Returns the plain-text string Left group <chat_jid>.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already signal destructive and idempotent; description adds concrete details about permanence, user experience, and return value, adding value beyond 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 plus a return note, no fluff, front-loaded with most critical information first.

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?

Covers effects, permanence, return value, and alternatives; no output schema needed as action returns trivial string.

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 covers 100% of the single parameter with detailed JID format; description adds no further semantics, so 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?

Clearly states 'Leave a WhatsApp group' and specifies the effects (system message, loss of access), distinguishing from sibling join_group_with_link.

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 suggests alternatives (privacy/muting) and explains when not to use, along with conditions for rejoining.

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

list_chatsA
Read-onlyIdempotent

(reads local cache; works while disconnected) List cached WhatsApp chats (1:1 and group), optionally filtered by name substring and sorted by recency or alphabetic name. Read-only; no side effects. Use get_chat for a single chat by JID, list_groups for groups only. Returns a JSON array of chat objects (each with JID, name, last-message metadata when requested).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNozero-based page index for paging through results (default 0)
limitNomax chats to return (default 20)
queryNocase-insensitive substring to match against chat name
sort_byNosort order: `last_active` (most-recent first, default) or `name` (alphabetic)last_active
include_last_messageNoif true, include each chat's most recent message in the result (defaults to true)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint. The description adds that it reads local cache, works while disconnected, is read-only with no side effects. This adds value beyond annotations 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 three sentences, front-loaded with the core purpose, and every sentence adds necessary information. No 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?

Given 5 parameters with good schema coverage, no output schema, but description mentions returns JSON array of chat objects with details. It explains offline behavior and side-effect-free nature. Slightly incomplete on return format specifics, but adequate.

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 has 100% coverage with descriptions for all 5 parameters. The description adds context about filtering by name substring and sorting by recency or alphabetic name, and mentions return format. This adds marginal value 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 it lists cached WhatsApp chats (1:1 and group) with optional filtering and sorting. It distinguishes from siblings by mentioning get_chat for a single chat and list_groups for groups only.

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 explicitly says to use get_chat for a single chat by JID and list_groups for groups only. It also mentions it reads local cache and works while disconnected, but does not explicitly state when not to use it. This is clear context.

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

list_groupsA
Read-onlyIdempotent

List every WhatsApp group the paired user is currently a member of, fetched live from WhatsApp. Read-only; no side effects. Use get_group_info for detailed metadata about one specific group. Returns a JSON array of group-info objects (each with JID, subject, participants, settings, and so on).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description adds value beyond annotations by stating data is fetched live from WhatsApp and describing the return structure (JSON array with fields). Annotations already declare readOnly, destructive, and idempotent hints, and the description aligns with 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?

Three concise sentences, each with a clear purpose: main action, side-effect declaration, alternative tool, and return type. No wasted words.

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 tool with no parameters and no output schema, the description adequately explains what it does, its safety, and the return format. No missing information for an AI agent to use it effectively.

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?

No parameters exist (schema coverage 100% with zero params). With no parameters to document, the baseline is 4. The description does not need to add parameter information.

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 lists WhatsApp groups the user is a member of, with a specific verb and resource. It distinguishes from the sibling tool get_group_info by specifying its broader 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?

The description indicates when to use it (live listing of groups) and provides an alternative (get_group_info for detailed metadata). However, it does not explicitly state when not to use it, though the context is clear.

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

list_messagesA
Read-onlyIdempotent

(reads local cache; works while disconnected) Search and page through cached WhatsApp messages, optionally filtering by chat, sender, time range, and substring; can include surrounding context messages. Read-only; no side effects. Use get_message_context to expand around a single known message ID, or request_sync to backfill missing history. Returns a human-readable formatted text block listing matching messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNozero-based page index for paging through results (default 0)
afterNoISO-8601 UTC lower bound on message timestamp (inclusive)
limitNomax messages to return (default 20, capped at 100 server-side)
queryNocase-insensitive substring to match within message body
beforeNoISO-8601 UTC upper bound on message timestamp (inclusive)
chat_jidNofilter to messages in this chat (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)
context_afterNomessages to include after each match (default 1, capped at 20 server-side)
context_beforeNomessages to include before each match (default 1, capped at 20 server-side)
include_contextNoif true, attach a few surrounding messages to each match (defaults to true)
sender_phone_numberNofilter to messages sent by this phone or JID (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds valuable context: 'reads local cache; works while disconnected' and 'returns a human-readable formatted text block', going beyond 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?

Three sentences, front-loaded with key attributes (local cache, offline, search), then filter summary, then alternative tools, then return format. No wasted words.

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 10-parameter tool with no output schema, the description sufficiently explains what the tool does, the filtering capabilities, and return format. Lacks explicit mention of pagination behavior but the schema's page/limit parameters and the phrase 'page through' imply 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?

Input schema covers all 10 parameters with descriptions (100% coverage). The description briefly restates filters ('filtering by chat, sender, time range, and substring; can include surrounding context messages') but adds little new 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 clearly states the tool reads local cached WhatsApp messages, searches and pages through them with various filters, and names sibling tools for alternative use cases (get_message_context, request_sync), distinguishing its purpose.

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 tells when to use this tool (searching/filtering messages) and when to use alternatives: 'Use get_message_context to expand around a single known message ID, or request_sync to backfill missing history.' Also notes it's read-only with no side effects.

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

mark_chat_readA
Idempotent

Ack the most recent incoming messages in a chat to clear its unread badge; senders receive read receipts (subject to their privacy settings). Cannot be unread once acked. Use mark_read for ack-by-message-ID. Returns the plain-text string Acked N message(s) in <chat_jid>.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many of the most recent incoming messages to ack (default 50)
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A4.7/5.0
Behavior4/5

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

The description adds value beyond annotations by noting read receipts are subject to privacy settings, the action is irreversible, and the exact return string format. Annotations already indicate idempotency and non-destructiveness; no contradictions.

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 concise sentences, each essential: purpose, alternative, and return format. No redundant 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?

Given the tool's simplicity (two parameters, no output schema), the description covers all necessary context: action, constraints, sibling differentiation, and return value. No gaps identified.

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 descriptions already cover both parameters fully. The description adds context that 'limit' applies to the most recent incoming messages and defaults to 50, reinforcing the tool's behavior.

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 acks the most recent incoming messages to clear the unread badge, specifies read receipts, and distinguishes itself from the sibling tool 'mark_read' by contrasting ack-by-chat vs ack-by-message-ID.

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 explicitly tells when to use this tool (for acking the most recent incoming messages in a chat) and when to use the alternative 'mark_read' (for ack-by-message-ID). It also warns that the action cannot be undone.

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

mark_readA
Idempotent

Mark specific incoming messages as read; senders receive read receipts (subject to their privacy settings) and the chat's unread badge decrements. Cannot be unread once acked. Use mark_chat_read to clear the unread badge for an entire chat without enumerating message IDs. Returns the plain-text string Marked N message(s) read in <chat_jid>.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
sender_jidNoJID of the original sender; required in group chats, omit in 1:1 chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)
message_idsYeslist of WhatsApp message IDs to ack (use `message_id` values from list_messages); must be non-empty

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations (idempotentHint=true, readOnlyHint=false, destructiveHint=false), the description adds crucial context: senders receive read receipts subject to privacy settings, unread badge decrements, and the action is irreversible. No contradictions.

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 concise sentences: main action and effects, limitation and alternative, return value. Front-loaded with purpose, no wasted words.

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 lacking an output schema, the description includes the return format. It covers behavior, limitations, alternative, and parameter details comprehensively for a tool with three parameters.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds value by clarifying that message_ids must be non-empty and should come from list_messages, and provides JID format examples for chat_jid and sender_jid.

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 verb 'mark' and the resource 'specific incoming messages' with specific effects (read receipts, unread badge decrement). It also implicitly distinguishes from sibling mark_chat_read by mentioning the alternative.

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 states when not to use (cannot be unread once acked) and provides an alternative tool (mark_chat_read) for clearing the entire chat unread badge without enumerating message IDs.

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

pairing_statusA
Read-onlyIdempotent

Report the WhatsApp device-pairing state as a structured setup_state envelope for programmatic supervisors that surface the linking QR to their own clients (e.g. a polling daemon). Read-only; no side effects. Returns a JSON object {type:"setup_state", state, …} where state is ready (paired and connected; adds own_jid/own_phone), awaiting_qr (unpaired; adds qr_payload when a pairing code is cached), or error (pairing cache unavailable).

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 provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by explaining the three possible states (ready, awaiting_qr, error) and the fields included in each, giving behavioral detail beyond what structured annotations convey. No contradictions.

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 paragraph that front-loads the purpose and usage, then details the output structure and states. Every sentence contributes meaningful information with no repetition or fluff.

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?

Given that the tool has no parameters and no output schema, the description fully explains what the tool does, when to use it, and what the return value looks like (including state values and additional fields). It is complete for an agent to select and invoke 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?

Tool has zero parameters, making schema coverage 100% complete. With no parameters, the description does not need to add parameter details. Baseline for zero parameters is 4.

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 explicitly states it reports WhatsApp device-pairing state as a structured `setup_state` envelope. It uses specific verbs ('report the ... state') and clearly identifies the resource. Among siblings, no other tool covers pairing state, so it is well-distinguished.

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 says it is 'for programmatic supervisors that surface the linking QR to their own clients (e.g. a polling daemon)', which gives clear context for when to use. It also notes the tool is read-only with no side effects. It does not explicitly exclude cases or name alternatives, but the context is sufficient.

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

request_syncA
Idempotent

Ask WhatsApp servers to backfill historical messages for a chat into the local cache; messages arrive asynchronously and become queryable via list_messages once delivered. No effect on the chat itself or other users. If from_timestamp is omitted, the request anchors on the newest cached message. Returns a plain-text confirmation describing what was requested.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidNoWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
from_timestampNoISO-8601 UTC timestamp marking the lower bound; if omitted, anchors on the newest cached message in the chat

TDQS

A4.3/5.0
Behavior4/5

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

Adds value beyond annotations by describing the async delivery, lack of side effects on the chat, and the plain-text response. 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?

Two sentences with no wasted words; purpose is front-loaded, followed by key details. Excellent 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?

All relevant aspects covered: purpose, behavior, parameter semantics, output format, and integration with sibling tool list_messages. No gaps given the simple input 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 already covers 100% of parameters, but description adds meaningful behavior for from_timestamp (default behavior when omitted) beyond the schema's syntactic description.

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 clearly states the verb ('Ask to backfill') and resource ('historical messages for a chat'), distinguishes from sibling tools by mentioning that messages become queryable via list_messages. No 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?

Provides context for when to omit from_timestamp, but does not explicitly state when to use this tool versus alternatives like list_messages (which retrieves already synced messages) or any prerequisites.

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

search_contactsA
Read-onlyIdempotent

(reads local cache; works while disconnected) Search the cached WhatsApp contact list by case-insensitive substring of name or phone number. Read-only; no side effects. Use is_on_whatsapp to verify whether an unknown phone number is registered. Returns a JSON array of contact objects (each with JID, push name, full name, and phone).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYescase-insensitive substring to match against name or phone

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare read-only and idempotent behavior. The description adds valuable context: it reads a local cache, works while disconnected, and has no side effects. No contradiction 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 concise, well-structured, and front-loaded with the essential detail about local caching and offline capability. Every sentence is informative 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 simple search tool with one parameter and no output schema, the description adequately covers return format (JSON array of contact objects with fields), search behavior, and operational context (cached, offline-capable).

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% with a single parameter 'query' described as case-insensitive substring. The description restates this without adding new meaning, earning a baseline of 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?

The description clearly states the tool searches the cached WhatsApp contact list by case-insensitive substring of name or phone number. It distinguishes from sibling tool is_on_whatsapp by specifying that is_on_whatsapp should be used for checking unknown numbers.

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 explicitly advises when to use the alternative tool is_on_whatsapp for verifying unknown phone numbers, and notes that search_contacts works while disconnected and reads local cache, guiding appropriate usage.

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

send_audio_messageA

Send an audio file as a WhatsApp voice note (waveform UI, push-to-play); non-ogg inputs are transcoded via ffmpeg before upload. Reversible via delete_message (revoke). Use send_file when you want the audio delivered as a regular attachment instead of a voice note. Prerequisites: ffmpeg must be on PATH for non-ogg inputs. Returns a JSON object {Success, Message, ID} where ID is the WhatsApp message ID on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipientYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`
view_onceNoif true, mark the voice note as view-once (defaults to false)
media_pathYesabsolute path to the audio file; must sit under the configured media root (`WHATSAPP_MCP_MEDIA_ROOT`, default `<store>/uploads/`)
mark_chat_readNoif true, also ack recent incoming messages in the chat to clear the unread badge (defaults to false)

TDQS

A4.6/5.0
Behavior5/5

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

The description adds significant behavioral context beyond annotations: it discloses transcoding behavior for non-ogg inputs, prerequisite (ffmpeg on PATH), the return JSON structure with fields, and that the action is reversible. Annotations are consistent (readOnlyHint false), no contradiction.

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 compact with three sentences covering purpose, alternatives, prerequisites, and return format. No redundant phrases, though the information density is high – each sentence earns its place.

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 fully explains the return format (JSON with Success, Message, ID). It covers prerequisites, reversible nature, and distinguishes from sibling tools. For a tool with 4 parameters, it provides all necessary contextual information.

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 has 100% description coverage, so the schema already fully documents each parameter. The description does not add new semantic details about parameters 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?

The description uses a specific verb ('Send an audio file as a WhatsApp voice note') and clearly identifies the resource and output format (waveform UI, push-to-play). It distinguishes from the sibling tool send_file by stating the alternative use case, making the purpose unmistakable.

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 explicitly states when to use this tool (voice note) versus the alternative send_file (regular attachment). It also mentions reversibility via delete_message, providing clear context for when it's appropriate to invoke.

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

send_contact_cardA

Send a WhatsApp contact card; recipients see a tappable contact entry they can save to their address book and the outgoing message is persisted to the local cache. When vcard is omitted a minimal vCard 3.0 is synthesised from name + phone. Reversible via delete_message (revoke). Returns a JSON object {Success, Message, ID} where ID is the WhatsApp message ID on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescontact display name; also used as the FN in the synthesised vCard
phoneNophone number (digits preferred); embedded in the synthesised vCard when `vcard` is not supplied
vcardNoraw vCard 3.0 string; when set, name+phone synthesis is skipped and this string is sent as-is
recipientYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate a write operation (readOnlyHint=false) but description adds behavioral details: persistence to local cache, revocability via delete_message, and clear return format. No contradictions. However, it does not disclose any side effects or failures.

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 efficiently cover purpose, behavior, parameter interaction, and return value. No fluff; every clause adds 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?

Covers return value, main behavior, and reversibility. Lacks error handling details or rate limits but is adequate for a contact card tool with no output schema. Moderate complexity warrants this score.

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% (all parameters described), description adds key behavior: synthesis of vCard when omitted, recipient format guidance. This enriches understanding beyond schema definitions.

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 sends a WhatsApp contact card, describes the user-facing behavior (tappable, savable), and mentions persistence and reversibility. It distinguishes itself from siblings like send_message or send_file by specifying a contact card format.

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?

Provides implicit guidance by explaining when to omit vcard (synthesis from name+phone) but no explicit comparison to alternative tools for sending contacts (e.g., send_message with vCard text, send_file). Does not state when not to use this tool versus siblings.

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

send_fileA

Upload and send a picture, video, document, or raw audio attachment via WhatsApp; the recipient sees a media message and the outgoing row is persisted to the local cache. Reversible via delete_message (revoke). For voice notes use send_audio_message (which transcodes to ogg/opus); for plain text use send_message. Returns a JSON object {Success, Message, ID} where ID is the WhatsApp message ID on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
captionNooptional caption for image/video/document submessages; ignored for raw audio
recipientYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`
view_onceNoif true, mark image/video/audio submessages as view-once; silently ignored for documents (defaults to false)
media_pathYesabsolute path to the media file; must sit under the configured media root (`WHATSAPP_MCP_MEDIA_ROOT`, default `<store>/uploads/`)
mark_chat_readNoif true, also ack recent incoming messages in the chat to clear the unread badge (defaults to false)

TDQS

A4.5/5.0
Behavior4/5

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

The description adds several behavioral traits beyond annotations: it's reversible via delete_message, persists to local cache, and returns a JSON object with specific fields. Annotations already indicate readOnlyHint=false (write operation) and destructiveHint=false, which the description reinforces. No 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, front-loaded with the main action, and efficiently covers usage guidelines and return value. Every sentence adds value without 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 no output schema, the description explicitly states the return JSON structure. It covers the tool's purpose, parameters (via schema), usage guidelines, and behavioral traits, making it fully informative for an agent to select and 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?

Input schema has 100% coverage with detailed descriptions for all 5 parameters. The description does not add new parameter meaning 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?

The description clearly states it uploads and sends a picture, video, document, or raw audio via WhatsApp, specifying the recipient sees a media message and it's persisted to cache. It distinguishes from sibling tools like send_audio_message and send_message, 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?

The description explicitly tells when to use alternatives: 'For voice notes use send_audio_message; for plain text use send_message.' It also mentions reversibility via delete_message, providing clear context on when 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.

send_messageA

Send a new WhatsApp text message to a person or group; recipients see it as a fresh message from the paired account and the row is also stored in the local cache. Reversible via delete_message (revoke) or edit_message (correct text); to quote a previous message use send_reply, for emoji acknowledgement use send_reaction. Returns a JSON object {Success, Message, ID} where ID is the WhatsApp message ID on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesmessage body text
recipientYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`
mark_chat_readNoif true, also ack recent incoming messages in the chat to clear the unread badge (defaults to false)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, and the description adds meaningful behavioral context: the message appears as a fresh message, is stored locally, is reversible, and returns a specific JSON. This enhances understanding 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?

The description is concise (two sentences plus return format), front-loaded with the core purpose, and efficiently includes alternatives, reversibility, and return structure without any redundant wording.

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?

Given the tool's moderate complexity (3 parameters, no output schema), the description fully covers the effect, behavior, return format, and links to sibling tools. No gaps remain.

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 clear parameter descriptions. The tool description reinforces the recipient format and the mark_chat_read effect, but does not add substantial new meaning beyond the schema. 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 uses a specific verb ('Send') and resource ('new WhatsApp text message'), and clearly distinguishes this tool from siblings like send_reply and send_reaction by stating when to use those alternatives. It also explains the effect (fresh message, local cache storage).

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 directs the agent to use send_reply for quoting, send_reaction for emoji acknowledgement, and mentions reversibility via delete_message or edit_message. This provides clear when-to-use guidance, though it does not explicitly state when not to use this tool (e.g., for replies).

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

send_pollA

Send a new WhatsApp poll message with 2 to 32 options; recipients see a votable poll card and an outgoing row plus poll metadata is persisted locally so votes can be tallied. Reversible via delete_message (revoke). Use send_poll_vote to cast votes and get_poll_results to read tallies. Returns a JSON object {Success, Message, ID} where ID is the poll message ID on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsYespoll option labels; must contain between 2 and 32 entries
questionYespoll question text shown above the options
recipientYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`
selectable_countNohow many options each voter may pick; 1 = single-choice (default), higher = multi-select up to this cap

TDQS

A4.1/5.0
Behavior4/5

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

Discloses that poll metadata is persisted locally, recipients see a votable card, and the message is reversible via delete_message; adds value beyond 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?

Two sentences with all key info, though first sentence is dense; could be slightly more structured but still efficient.

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 behavior, reversibility, return format; no output schema, but description compensates; parameter details are fully in 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%; description adds minimal extra meaning (e.g., recipients see a poll card) but mostly restates schema details.

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 it sends a WhatsApp poll message with 2-32 options, distinguishing it from siblings like send_poll_vote and get_poll_results.

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?

Provides explicit guidance on when to use this tool and mentions alternatives for voting and results; lacks explicit 'when not to use' but context is clear.

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

send_poll_voteA
Idempotent

Cast or re-cast a vote on a previously-seen poll; each call replaces the caller's prior vote on that poll, and the new tally is broadcast to the chat. Reversible by calling again with the desired option set (or an empty list to clear). Prerequisite: the poll must be in the local cache, i.e. send_poll was used or we received the poll via sync. Returns a JSON object {Success, Message, ID} where ID is the vote message ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsYesoption labels to pick; must match the poll's option text exactly, between 1 and 32 entries
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
poll_message_idYesWhatsApp message ID of the poll to vote on (use `ID` returned by send_poll, or `message_id` from list_messages)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations indicate idempotentHint=true and destructiveHint=false. The description adds critical behavioral details: each call replaces prior vote, broadcasts new tally, and is reversible. It also specifies the prerequisite and return format, going 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?

The description is concise with three sentences: main action, behavioral details, prerequisite, and return format. Information is front-loaded and every sentence adds 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?

Given no output schema, the description explains the return object. It covers prerequisites, behavior, and usage. The sibling tools list includes related poll operations (send_poll, get_poll_results), providing sufficient context for selection.

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% with descriptions for each parameter. The description adds context about the 'options' parameter (must match exactly, 1-32 entries) not fully captured in the schema. It also clarifies that poll_message_id should come from send_poll or list_messages.

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 'Cast or re-cast a vote on a previously-seen poll', specifying the action (vote) and resource (poll). It distinguishes from siblings like send_poll (create) and get_poll_results (retrieve results) by focusing on the voting act.

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 explains when to use the tool (to vote on a poll) and includes a prerequisite (poll must be in local cache). It also mentions reversibility. However, it does not explicitly list when not to use it or alternative tools for other actions like viewing results.

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

send_presenceA
Idempotent

Set the paired user's own global online availability; contacts permitted by privacy settings see online or last-seen accordingly. Reversible by calling again with the inverse state. Use send_typing for per-chat composing/recording indicators instead. Returns a JSON object {success, message}.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesavailability to broadcast: `available` (online) or `unavailable` (offline)

TDQS

A4.7/5.0
Behavior5/5

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

Adds behavioral details beyond annotations: reversibility, privacy settings effect on visibility, and return format. No contradiction 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?

Three sentences, no redundancy. Front-loaded with core purpose, efficient and clear.

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?

Complete for a simple tool: schema documents parameter, annotations present, description adds behavior and return info. No 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 coverage is 100% with clear parameter description. Description does not add substantial new meaning beyond 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 sets global online availability ('Set the paired user's own global online availability') and distinguishes from sibling send_typing. It uses specific verb and resource.

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 tells when to use this tool (global availability) and when not (per-chat indicators via send_typing). Also mentions reversibility, providing clear usage context.

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

send_reactionA
Idempotent

Add or replace an emoji reaction on an existing message; recipients see the small emoji badge attached to the original message. Reversible by calling again with an empty emoji string (clears the reaction); for a fresh message use send_message and for a quoted reply use send_reply. Returns the plain-text string Reaction sent on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
emojiNosingle emoji to react with; pass an empty string to clear an existing reaction
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
message_idYesWhatsApp message ID of the target message (use `message_id` from list_messages)
sender_jidNoJID of the original sender; required in group chats, omit in 1:1 chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)

TDQS

A4.7/5.0
Behavior5/5

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

Discloses reversible behavior via empty emoji, return value of 'Reaction sent', and hints that it is idempotent (aligns with annotation). No contradiction 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?

Three concise sentences; first sentence immediately states core purpose. No superfluous 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 4-parameter tool with no output schema, the description covers all: purpose, usage guidance, return value, and parameter hints. Sibling tools are mentioned. Complete given the tool's 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 coverage is 100% and already describes all parameters thoroughly. Description adds no significant new semantics beyond restating the emoji empty string case.

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 verb 'Add or replace an emoji reaction on an existing message' and distinguishes it from siblings by specifying 'for a fresh message use send_message and for a quoted reply use send_reply'.

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 tells when to use (react to existing message) and when not (use send_message for fresh, send_reply for quoted reply), and explains reversibility with empty emoji.

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

send_replyA

Send a text message that visibly quotes a previous message; recipients see the new text with the quoted message attached. Reversible via delete_message (revoke) or edit_message (correct text). Use send_message for a fresh non-quoting message and send_reaction for an emoji acknowledgement. Returns the plain-text string Reply sent on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesreply text body
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
target_message_idYesWhatsApp message ID of the message being quoted (use `message_id` from list_messages)
target_sender_jidNoJID of the quoted message's original sender; required in group chats, omit in 1:1 chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)

TDQS

A4.7/5.0
Behavior5/5

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

Discloses return value ('Reply sent' string) and reversibility, adding context beyond annotations (which already indicate non-destructive). No contradictions.

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?

Four sentences, front-loaded with purpose, each sentence adds value: purpose, reversibility, alternatives, return value. No wasted words.

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 4-parameter tool with no output schema, the description covers purpose, usage, return value, and reversibility, making it fully adequate 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 coverage is 100%, so baseline is 3. The description adds minimal additional meaning beyond schema descriptions; it does not elaborate on parameter formats or constraints.

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 it sends a text message that quotes a previous message, using specific verb 'send' and resource 'reply'. It distinguishes from siblings like send_message (fresh non-quoting) and send_reaction (emoji).

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 tells when to use (to quote a message) and when not (use send_message or send_reaction). Also mentions reversibility via delete_message or edit_message, providing complete guidance.

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

send_typingA
Idempotent

Show or hide the per-chat typing or recording presence indicator; the recipient sees a transient typing... or recording audio... hint that auto-expires after roughly 25 seconds. Reversible by calling again with active=false. Use send_presence to set global online/offline availability instead. Returns the plain-text string Presence active for <chat_jid> or Presence paused for <chat_jid>.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoindicator kind: empty string for text typing (default) or `audio` for voice-note recording
activeYestrue to show the indicator (composing or recording), false to pause it
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A5/5.0
Behavior5/5

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

The description adds behavioral details beyond annotations: the indicator is transient with roughly 25-second auto-expiry, reversible, and returns a specific string. Annotations (idempotentHint=true, etc.) are consistent and description enriches 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?

Three sentences, efficiently front-loaded with the core action. Every sentence provides essential information without redundancy or fluff.

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?

The description covers purpose, usage guidelines, parameter details, behavioral traits, and return value. For a tool with 3 simple parameters and no output schema, it is fully complete.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds meaning for each parameter: active (show/pause), chat_jid (format explanation), kind (default vs audio). It also describes the return value, which is not in the schema, adding valuable context.

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's purpose: 'Show or hide the per-chat typing or recording presence indicator.' It specifies the verb (show/hide), resource (indicator), and scope (per-chat), and distinguishes it from the sibling tool send_presence.

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 explicitly tells when to use an alternative: 'Use send_presence to set global online/offline availability instead.' It also explains the reversible nature by calling again with active=false, providing clear usage context.

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

set_group_announceA
Idempotent

Toggle announce-only mode on a group; when enabled, non-admin send attempts are rejected by WhatsApp servers and members see a system message about the change. Reversible by calling again with the inverse value. Prerequisite: admin. See set_group_locked for restricting metadata edits. Returns the plain-text string Group <chat_jid> announce_only=<bool>.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
announce_onlyYestrue to lock posting to admins only, false to allow all members to post

TDQS

A4.9/5.0
Behavior5/5

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

Despite annotations already covering idempotentHint and destructiveHint, the description adds valuable behavioral details: non-admin attempts are rejected, members see a system message, and the return value string is specified.

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 main action, then elaborates on behavior and alternatives. No wasted words.

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?

Given the simplicity (2 params, no output schema), the description covers behavior, prerequisites, return value, and a sibling, making it fully actionable.

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?

Input schema already describes both parameters well (100% coverage). Description adds context (non-admin rejection) but does not significantly extend semantics beyond 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 toggles announce-only mode on a group, with specifics on behavior (reject non-admin, system message). It distinguishes itself from sibling set_group_locked by mentioning the alternative for restricting metadata edits.

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 (toggle announce-only), lists prerequisite (admin), indicates reversibility, and points to set_group_locked for metadata edits, providing clear alternatives.

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

set_group_lockedA
Idempotent

Toggle locked mode on a group; when enabled, only admins can change name/topic/icon and members see a system message about the change. Reversible by calling again with the inverse value. Prerequisite: admin. See set_group_announce for restricting who can post. Returns the plain-text string Group <chat_jid> locked=<bool>.

ParametersJSON Schema
NameRequiredDescriptionDefault
lockedYestrue to restrict subject/topic/icon edits to admins, false to allow all members
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A4.7/5.0
Behavior5/5

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

Despite annotations already indicating non-readOnly, non-destructive, idempotent, the description adds useful behavioral context: reversibility by calling with inverse value, system message shown, and exact return string. No contradiction 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?

Four sentences, no wasted words, key information front-loaded (verb, resource, effect). Efficient and well-structured.

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 includes the return value format. Covers prerequisite, effect, reversibility, alternative, and system message. Complete for a toggle 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 covers both parameters with clear descriptions (100% coverage). Description adds little beyond schema, only reinforcing the toggle behavior for 'locked' parameter. 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 clearly states the verb 'Toggle' and resource 'locked mode on a group', specifying the effect (only admins can change name/topic/icon, system message). It distinguishes itself from sibling tool set_group_announce.

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 states prerequisite 'admin' and provides an alternative tool (set_group_announce) for restricting posting. Guides when to use and when not to.

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

set_group_nameA
Idempotent

Change a group's display name (its subject); members see a system message naming the new subject. Reversible by calling again with the previous name. Prerequisite: admin (or non-locked group). Returns the plain-text string Group <chat_jid> renamed to "<name>".

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesnew group subject (display name)
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A4.5/5.0
Behavior5/5

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

Describes side effects (members see a system message), reversibility, and request/response behavior. Annotations already indicate idempotentHint=true, but description adds concrete meaning: calling again with previous name reverses it. No contradiction 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?

Three sentences, each serving a purpose: action, effect plus reversibility, prerequisite and return format. No redundant words.

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?

Complete for a simple tool: covers prerequisite, behavioral effects, return format (since no output schema). All relevant aspects are 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% with good descriptions for both parameters. Description adds no new parameter details beyond what schema provides, so 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?

Description clearly states the action (change display name) and resource (group). It uses specific verb 'Change' and resource 'group's display name (its `subject`)', distinguishing it from sibling tools like set_group_announce or set_group_locked.

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?

Explicitly mentions prerequisite 'admin (or non-locked group)' and implies when to use (to rename a group). Reversibility is noted, which guides use. No explicit alternatives are stated, but the specificity relative to siblings is clear.

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

set_group_topicA
Idempotent

Change a group's description/topic; members see a system message indicating the description was updated. Reversible by calling again with the previous text or with an empty string to clear. Prerequisite: admin (or non-locked group). Returns the plain-text string Group <chat_jid> topic updated.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNonew topic/description text; pass an empty string to clear the topic
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`

TDQS

A4.5/5.0
Behavior5/5

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

Discloses key behaviors beyond annotations: system message to members, reversibility, clearing via empty string, prerequisite, and the exact return string. 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?

Three sentences, front-loaded with purpose, no fluff. Every sentence adds 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?

Complete for a simple tool: purpose, side effects, prerequisite, return value. No gaps given the annotations 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 the description adds no new param info beyond what the schema already provides (e.g., empty string to clear is also in schema). 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?

Explicitly states 'Change a group's description/topic', distinguishing from sibling tools like set_group_name. The verb and resource are precise, and it mentions the system message side effect.

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?

Clearly states prerequisite (admin or non-locked group) and reversibility, providing context for when to use. However, it does not explicitly compare to alternative tools or give 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.

set_privacy_settingA
Idempotent

Change a single WhatsApp privacy knob (read-receipts, last-seen, online, group-add, etc.) for the paired account; takes effect immediately and may change who can see your activity or contact you. Reversible by calling again with the previous value (capture it via get_privacy_settings first). Not every name/value combination is valid — WhatsApp rejects invalid combinations server-side. Returns a JSON document echoing the updated settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesprivacy knob to change; one of the WhatsApp setting names (e.g. `last`, `readreceipts`, `groupadd`, `online`)
valueYesnew value; one of the WhatsApp privacy values (e.g. `all`, `contacts`, `none`, `match_last_seen`)

TDQS

A4.5/5.0
Behavior4/5

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

Beyond annotations (idempotentHint true, destructiveHint false), description reveals immediate effect, potential visibility changes, and server-side validation, adding meaningful 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?

Three focused sentences: action+effect, practical tip, and validity warning. No filler; front-loaded with core purpose.

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?

Covers purpose, effects, parameter constraints, reversibility, and return format. Adequate for a two-parameter mutation tool with no output 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?

With 100% schema coverage, description adds value by warning about invalid name/value combinations and guiding users to capture previous values, supplementing the schema's enum listings.

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 clearly states it changes a single WhatsApp privacy knob, provides concrete examples (read-receipts, last-seen, etc.), and distinguishes from siblings like get_privacy_settings or block_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?

Advises capturing current value via get_privacy_settings for reversibility and warns about invalid server-side combinations, giving clear context though not explicitly stating when not to use.

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

set_status_messageA
Idempotent

Update the paired user's WhatsApp profile About text; contacts permitted by privacy settings see the new text on the profile screen. Reversible by calling again with the previous text or with an empty string to clear. Note: this is the static profile About line, not the temporary Status story feed. Returns a JSON object {success, message}.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesnew About text; pass an empty string to clear

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate a write operation (readOnlyHint=false) that is idempotent and not destructive. The description adds that the operation is reversible by calling again with previous text, and specifies the return format {success, message}, providing context beyond 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 front-loaded sentences with no wasted words. The first sentence states the core purpose, the second adds important nuance about reversibility and return type.

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 single-parameter tool, the description fully explains what the tool does, how to use it, and what to expect in return. No additional context is needed.

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% for the single parameter 'text'. The description adds context (it's the static About line) but does not add meaning beyond the schema, which already states 'pass an empty string to clear'.

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 it updates the WhatsApp profile About text. It explicitly distinguishes this from the temporary Status story feed, differentiating it from sibling tools like send_message or set_privacy_setting.

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: when to update the About text, that it's reversible, and that it's not for Status stories. However, it does not explicitly name alternative tools or give 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.

unblock_contactA
Idempotent

Unblock a previously blocked contact, restoring their ability to message the paired user and see your last seen/profile/status; the contact is not notified. Idempotent if already unblocked. Reversible via block_contact. Use get_blocklist to see who is currently blocked. Returns the plain-text string Unblocked <jid>.

ParametersJSON Schema
NameRequiredDescriptionDefault
jidYesSend target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`

TDQS

A4.3/5.0
Behavior4/5

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

Beyond annotations, the description adds that the contact is not notified and returns a plain-text string 'Unblocked <jid>'. It also confirms reversibility. The idempotentHint annotation is reinforced by stating 'Idempotent if already unblocked'. 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 three sentences long, each providing essential information: the core function and effects, idempotency and reversibility, and related tool and return value. It is front-loaded with the most important details and contains no extraneous words.

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 tool with one parameter and no output schema, the description covers the purpose, effect, return format, related tools (get_blocklist, block_contact), and idempotency. It gives sufficient information for an agent to correctly select and invoke the 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 coverage is 100%, so baseline is 3. The description does not elaborate on the jid parameter beyond what the schema provides, but it doesn't need to; the schema already gives detailed format instructions. The description uses 'jid' in the return string, implicitly confirming its role.

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 'Unblock a previously blocked contact' and describes the effect: restoring messaging ability, visibility of last seen/profile/status. It distinguishes from sibling tools by mentioning alternatives like get_blocklist and block_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?

The description explicitly recommends using get_blocklist before blocking, and notes reversibility via block_contact. It also mentions idempotency, which guides usage when the contact might already be unblocked. It could be more explicit about when to use this specific tool, but the context is clear.

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

update_group_participantsA
DestructiveIdempotent

Add, remove, promote, or demote participants of a group; the chat shows a system message naming each affected participant. Reversible by calling again with the inverse action (addremove, promotedemote). Prerequisite: the paired user must be a group admin. Returns a JSON object describing the per-participant outcome.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesmutation to perform: `add`, `remove`, `promote` (to admin), or `demote` (from admin)
chat_jidYesWhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`
participantsYesparticipants to mutate, as bare phone digits or individual JIDs (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)

TDQS

A4.3/5.0
Behavior4/5

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

Beyond annotations (destructiveHint, idempotentHint, openWorldHint), the description discloses a side effect ('chat shows a system message naming each affected participant') and confirms reversibility, adding context about behavior without contradicting 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 three sentences long, front-loaded with the core action, and every sentence adds necessary information without redundancy or fluff.

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?

Given the tool's moderate complexity (3 params, no output schema), the description covers purpose, prerequisites, side effects, reversibility, and return format, leaving no critical gaps for an AI agent.

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% with detailed parameter descriptions, so the baseline is 3. The description adds little extra meaning beyond what the schema already provides, though it does imply the return format ('JSON object describing the per-participant outcome').

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's action ('Add, remove, promote, or demote participants of a group'), the resource ('group'), and implicitly distinguishes from sibling tools like set_group_name or get_group_info by focusing on participant mutations.

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 guidance by stating the prerequisite ('the paired user must be a group admin') and hinting at reversibility ('Reversible by calling again with the inverse action'), though it does not directly compare to alternative tools.

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. 1 tool updatev0.4.1
    • Addedpairing_status
  2. 35 tool updatesv0.3.0
    • Changedblock_contact1 field changed
      • changedInput schema / properties / jid / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
    • Changedcreate_group2 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"group display name"New value: +"group display name (subject)"
      • changedInput schema / properties / participants / description
        Previous value: -"phone numbers or individual JIDs (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"New value: +"initial members as bare phone digits or individual JIDs (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
    • Changeddelete_message2 fields changed
      • changedInput schema / properties / message_id / description
        Previous value: -"WhatsApp message ID"New value: +"WhatsApp message ID of the message to revoke (use `message_id` from list_messages)"
      • changedInput schema / properties / sender_jid / description
        Previous value: -"original sender; leave empty when deleting your own messages (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"New value: +"JID of the original sender; required when deleting someone else's message as a group admin, leave empty when deleting your own (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
    • Changeddownload_media2 fields changed
      • changedInput schema / properties / message_id / description
        Previous value: -"WhatsApp message ID"New value: +"WhatsApp message ID of a media message (use `message_id` from list_messages)"
      • addedInput schema / properties / output_path
        Added value: +{
        +  "description": "optional absolute path under the configured media root (`WHATSAPP_MCP_MEDIA_ROOT`, default `<store>/uploads/`); parent directory must exist; calls are skipped if the file already exists; omit to write only to the daemon cache",
        +  "type": "string"
        +}
    • Changededit_message2 fields changed
      • changedInput schema / properties / message_id / description
        Previous value: -"WhatsApp message ID"New value: +"WhatsApp message ID of your own message to edit (use `message_id` from list_messages)"
      • changedInput schema / properties / new_body / description
        Previous value: -"replacement text"New value: +"replacement message body text"
    • Changedget_chat1 field changed
      • addedInput schema / properties / include_last_message / description
        Added value: +"if true, include the chat's most recent message in the result (defaults to true)"
    • Changedget_group_invite_link1 field changed
      • changedInput schema / properties / reset / description
        Previous value: -"if true, revoke the old link and return a new one"New value: +"if true, permanently revoke the existing invite link and mint a new one (defaults to false); previously-shared copies stop working"
    • Changedget_message_context3 fields changed
      • addedInput schema / properties / after / description
        Added value: +"messages to fetch after the target (default 5; non-positive values fall back to the default)"
      • addedInput schema / properties / before / description
        Added value: +"messages to fetch before the target (default 5; non-positive values fall back to the default)"
      • changedInput schema / properties / message_id / description
        Previous value: -"WhatsApp message ID"New value: +"WhatsApp message ID of the target message (use `message_id` from list_messages)"
    • Changedget_poll_results1 field changed
      • changedInput schema / properties / poll_message_id / description
        Previous value: -"ID of the poll message to tally"New value: +"WhatsApp message ID of the poll to tally (use `ID` from send_poll, or `message_id` from list_messages)"
    • Changedis_on_whatsapp1 field changed
      • addedInput schema / properties / phones / description
        Added value: +"phone numbers to check; digits only with no `+` prefix, spaces, or punctuation (e.g. `447700900000`); must be non-empty"
    • Changedjoin_group_with_link1 field changed
      • changedInput schema / properties / link_or_code / description
        Previous value: -"full invite URL or the trailing invite code"New value: +"full invite URL (`https://chat.whatsapp.com/<code>`) or just the trailing invite code"
    • Changedlist_chats6 fields changed
      • addedInput schema / properties / include_last_message / description
        Added value: +"if true, include each chat's most recent message in the result (defaults to true)"
      • addedInput schema / properties / limit / description
        Added value: +"max chats to return (default 20)"
      • addedInput schema / properties / page / description
        Added value: +"zero-based page index for paging through results (default 0)"
      • changedInput schema / properties / query / description
        Previous value: -"case-insensitive substring to match"New value: +"case-insensitive substring to match against chat name"
      • changedInput schema / properties / sort_by / description
        Previous value: -"last_active or name"New value: +"sort order: `last_active` (most-recent first, default) or `name` (alphabetic)"
      • addedInput schema / properties / sort_by / enum
        Added value: +[
        +  "last_active",
        +  "name"
        +]
    • Changedlist_messages10 fields changed
      • changedInput schema / properties / after / description
        Previous value: -"ISO-8601 lower bound"New value: +"ISO-8601 UTC lower bound on message timestamp (inclusive)"
      • changedInput schema / properties / before / description
        Previous value: -"ISO-8601 upper bound"New value: +"ISO-8601 UTC upper bound on message timestamp (inclusive)"
      • changedInput schema / properties / chat_jid / description
        Previous value: -"WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`"New value: +"filter to messages in this chat (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
      • addedInput schema / properties / context_after / description
        Added value: +"messages to include after each match (default 1, capped at 20 server-side)"
      • addedInput schema / properties / context_before / description
        Added value: +"messages to include before each match (default 1, capped at 20 server-side)"
      • addedInput schema / properties / include_context / description
        Added value: +"if true, attach a few surrounding messages to each match (defaults to true)"
      • addedInput schema / properties / limit / description
        Added value: +"max messages to return (default 20, capped at 100 server-side)"
      • addedInput schema / properties / page / description
        Added value: +"zero-based page index for paging through results (default 0)"
      • changedInput schema / properties / query / description
        Previous value: -"case-insensitive substring to match"New value: +"case-insensitive substring to match within message body"
      • changedInput schema / properties / sender_phone_number / description
        Previous value: -"WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`"New value: +"filter to messages sent by this phone or JID (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
    • Changedmark_chat_read1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"How many of the most recent incoming messages to ack."New value: +"how many of the most recent incoming messages to ack (default 50)"
    • Changedmark_read2 fields changed
      • addedInput schema / properties / message_ids / description
        Added value: +"list of WhatsApp message IDs to ack (use `message_id` values from list_messages); must be non-empty"
      • changedInput schema / properties / sender_jid / description
        Previous value: -"required for group chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"New value: +"JID of the original sender; required in group chats, omit in 1:1 chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
    • Changedrequest_sync1 field changed
      • changedInput schema / properties / from_timestamp / description
        Previous value: -"ISO-8601 UTC timestamp"New value: +"ISO-8601 UTC timestamp marking the lower bound; if omitted, anchors on the newest cached message in the chat"
    • Changedsearch_contacts1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"case-insensitive substring to match"New value: +"case-insensitive substring to match against name or phone"
    • Changedsend_audio_message4 fields changed
      • changedInput schema / properties / mark_chat_read / description
        Previous value: -"On successful send, ack recent incoming messages so the phone drops the unread badge."New value: +"if true, also ack recent incoming messages in the chat to clear the unread badge (defaults to false)"
      • changedInput schema / properties / media_path / description
        Previous value: -"absolute path to the media file (must sit under the configured media root)"New value: +"absolute path to the audio file; must sit under the configured media root (`WHATSAPP_MCP_MEDIA_ROOT`, default `<store>/uploads/`)"
      • changedInput schema / properties / recipient / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
      • changedInput schema / properties / view_once / description
        Previous value: -"If true, mark the voice note as view-once."New value: +"if true, mark the voice note as view-once (defaults to false)"
    • Changedsend_contact_card4 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"contact display name (also used for the synthesised vCard)"New value: +"contact display name; also used as the FN in the synthesised vCard"
      • changedInput schema / properties / phone / description
        Previous value: -"phone number (digits preferred); used to synthesise the vCard when `vcard` is not supplied"New value: +"phone number (digits preferred); embedded in the synthesised vCard when `vcard` is not supplied"
      • changedInput schema / properties / recipient / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
      • changedInput schema / properties / vcard / description
        Previous value: -"raw vCard 3.0 string; when set, name+phone synthesis is skipped"New value: +"raw vCard 3.0 string; when set, name+phone synthesis is skipped and this string is sent as-is"
    • Changedsend_file5 fields changed
      • changedInput schema / properties / caption / description
        Previous value: -"Optional caption for image/video/document"New value: +"optional caption for image/video/document submessages; ignored for raw audio"
      • changedInput schema / properties / mark_chat_read / description
        Previous value: -"On successful send, ack recent incoming messages so the phone drops the unread badge."New value: +"if true, also ack recent incoming messages in the chat to clear the unread badge (defaults to false)"
      • changedInput schema / properties / media_path / description
        Previous value: -"absolute path to the media file (must sit under the configured media root)"New value: +"absolute path to the media file; must sit under the configured media root (`WHATSAPP_MCP_MEDIA_ROOT`, default `<store>/uploads/`)"
      • changedInput schema / properties / recipient / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
      • changedInput schema / properties / view_once / description
        Previous value: -"If true, mark image/video/audio submessages as view-once. Silently ignored for documents."New value: +"if true, mark image/video/audio submessages as view-once; silently ignored for documents (defaults to false)"
    • Changedsend_message3 fields changed
      • changedInput schema / properties / mark_chat_read / description
        Previous value: -"On successful send, ack recent incoming messages so the phone drops the unread badge."New value: +"if true, also ack recent incoming messages in the chat to clear the unread badge (defaults to false)"
      • changedInput schema / properties / message / description
        Previous value: -"message body"New value: +"message body text"
      • changedInput schema / properties / recipient / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
    • Changedsend_poll4 fields changed
      • changedInput schema / properties / options / description
        Previous value: -"poll options (2–32)"New value: +"poll option labels; must contain between 2 and 32 entries"
      • changedInput schema / properties / question / description
        Previous value: -"poll question"New value: +"poll question text shown above the options"
      • changedInput schema / properties / recipient / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
      • changedInput schema / properties / selectable_count / description
        Previous value: -"how many options each voter may pick; 1 = single-choice"New value: +"how many options each voter may pick; 1 = single-choice (default), higher = multi-select up to this cap"
    • Changedsend_poll_vote2 fields changed
      • changedInput schema / properties / options / description
        Previous value: -"option names to pick (1–32); must match the poll exactly"New value: +"option labels to pick; must match the poll's option text exactly, between 1 and 32 entries"
      • changedInput schema / properties / poll_message_id / description
        Previous value: -"ID of the poll message to vote on"New value: +"WhatsApp message ID of the poll to vote on (use `ID` returned by send_poll, or `message_id` from list_messages)"
    • Changedsend_presence1 field changed
      • changedInput schema / properties / state / description
        Previous value: -"own availability state"New value: +"availability to broadcast: `available` (online) or `unavailable` (offline)"
    • Changedsend_reaction3 fields changed
      • changedInput schema / properties / emoji / description
        Previous value: -"single emoji, or empty string to clear the reaction"New value: +"single emoji to react with; pass an empty string to clear an existing reaction"
      • changedInput schema / properties / message_id / description
        Previous value: -"WhatsApp message ID"New value: +"WhatsApp message ID of the target message (use `message_id` from list_messages)"
      • changedInput schema / properties / sender_jid / description
        Previous value: -"original sender; required in group chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"New value: +"JID of the original sender; required in group chats, omit in 1:1 chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
    • Changedsend_reply3 fields changed
      • changedInput schema / properties / body / description
        Previous value: -"reply text"New value: +"reply text body"
      • changedInput schema / properties / target_message_id / description
        Previous value: -"WhatsApp message ID"New value: +"WhatsApp message ID of the message being quoted (use `message_id` from list_messages)"
      • changedInput schema / properties / target_sender_jid / description
        Previous value: -"original sender; required in group chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"New value: +"JID of the quoted message's original sender; required in group chats, omit in 1:1 chats (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
    • Changedsend_typing3 fields changed
      • changedInput schema / properties / active / description
        Previous value: -"True = composing/recording, false = paused"New value: +"true to show the indicator (composing or recording), false to pause it"
      • changedInput schema / properties / kind / description
        Previous value: -"'' for text (default) or 'audio' for recording"New value: +"indicator kind: empty string for text typing (default) or `audio` for voice-note recording"
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "",
        +  "audio"
        +]
    • Changedset_group_announce1 field changed
      • changedInput schema / properties / announce_only / description
        Previous value: -"true to lock posting to admins only"New value: +"true to lock posting to admins only, false to allow all members to post"
    • Changedset_group_locked1 field changed
      • changedInput schema / properties / locked / description
        Previous value: -"true to restrict metadata edits to admins"New value: +"true to restrict subject/topic/icon edits to admins, false to allow all members"
    • Changedset_group_name1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"new group name"New value: +"new group subject (display name)"
    • Changedset_group_topic1 field changed
      • changedInput schema / properties / topic / description
        Previous value: -"new topic text; empty string clears"New value: +"new topic/description text; pass an empty string to clear the topic"
    • Changedset_privacy_setting2 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"privacy knob to change"New value: +"privacy knob to change; one of the WhatsApp setting names (e.g. `last`, `readreceipts`, `groupadd`, `online`)"
      • changedInput schema / properties / value / description
        Previous value: -"new value for the knob"New value: +"new value; one of the WhatsApp privacy values (e.g. `all`, `contacts`, `none`, `match_last_seen`)"
    • Changedset_status_message1 field changed
      • changedInput schema / properties / text / description
        Previous value: -"new About text; empty string clears"New value: +"new About text; pass an empty string to clear"
    • Changedunblock_contact1 field changed
      • changedInput schema / properties / jid / description
        Previous value: -"Send target: phone digits, `<digits>@s.whatsapp.net`, or group `<digits>-<timestamp>@g.us`"New value: +"Send target: digits only (E.164 without `+`, no spaces or punctuation); or `<digits>@s.whatsapp.net`; or group `<digits>-<timestamp>@g.us`"
    • Changedupdate_group_participants2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"participant mutation to perform"New value: +"mutation to perform: `add`, `remove`, `promote` (to admin), or `demote` (from admin)"
      • changedInput schema / properties / participants / description
        Previous value: -"phone numbers or individual JIDs (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"New value: +"participants to mutate, as bare phone digits or individual JIDs (WhatsApp JID: individual as `<digits>@s.whatsapp.net` or bare phone digits, group as `<digits>-<timestamp>@g.us`)"
  3. 9 tool updates
    • Addedsend_typing
    • Addedset_group_announce
    • Addedset_group_locked
    • Addedset_group_name
    • Addedset_group_topic
    • Addedset_privacy_setting
    • Addedset_status_message
    • Addedunblock_contact
    • Addedupdate_group_participants
  4. 9 tool updates
    • Removedsend_typing
    • Removedset_group_announce
    • Removedset_group_locked
    • Removedset_group_name
    • Removedset_group_topic
    • Removedset_privacy_setting
    • Removedset_status_message
    • Removedunblock_contact
    • Removedupdate_group_participants
  5. 41 tool updatesv0.1.0
    • First observedblock_contact
    • First observedcreate_group
    • First observeddelete_message
    • First observeddownload_media
    • First observededit_message
    • First observedget_blocklist
    • First observedget_chat
    • First observedget_group_info
    • First observedget_group_invite_link
    • First observedget_message_context
    • First observedget_poll_results
    • First observedget_privacy_settings
    • First observedget_status
    • First observedis_on_whatsapp
    • First observedjoin_group_with_link
    • First observedleave_group
    • First observedlist_chats
    • First observedlist_groups
    • First observedlist_messages
    • First observedmark_chat_read
    • First observedmark_read
    • First observedrequest_sync
    • First observedsearch_contacts
    • First observedsend_audio_message
    • First observedsend_contact_card
    • First observedsend_file
    • First observedsend_message
    • First observedsend_poll
    • First observedsend_poll_vote
    • First observedsend_presence
    • First observedsend_reaction
    • First observedsend_reply
    • First observedsend_typing
    • First observedset_group_announce
    • First observedset_group_locked
    • First observedset_group_name
    • First observedset_group_topic
    • First observedset_privacy_setting
    • First observedset_status_message
    • First observedunblock_contact
    • First observedupdate_group_participants

TDQS

A4.2/5.0

Scored across 42 tools

Disambiguation4/5

Most tools have clearly distinct purposes, with detailed descriptions that disambiguate overlaps like send_message vs send_reply vs send_reaction and mark_chat_read vs mark_read. A couple of pairs could still cause hesitation, notably get_status vs pairing_status and send_file vs send_audio_message, but the descriptions resolve them well enough.

Naming Consistency4/5

The set follows a consistent snake_case verb_noun pattern throughout, such as get_chat, list_messages, send_poll, set_privacy_setting, and update_group_participants. Minor exceptions like pairing_status and is_on_whatsapp deviate from the convention but remain readable and predictable.

Tool Count2/5

42 tools is well beyond the typical well-scoped range and falls into the too-many category. The surface is thorough, but it likely places a heavy selection burden on agents and contains enough related variants that consolidation could be possible.

Completeness5/5

The toolset gives cohesive lifecycle coverage for the WhatsApp domain: sending, editing, deleting, reading, searching, media handling, group management, privacy settings, contacts, blocking, presence, and polling. There are no obvious dead ends; mutating operations are paired with read/get/reverse operations.

Maintenance

ActivitySlowing
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers