WAHA WhatsApp MCP Server
The WAHA WhatsApp MCP Server integrates WhatsApp messaging with AI assistants via the Model Context Protocol (MCP), providing 28 tools across messaging, contacts, media, search, and automation.
Session & Account
Check WhatsApp session connection status and authenticated account info (connected number, display name)
Chats & Messages
List recent chats with previews
Read message history with filtering by sender, type, and date range
Send text messages to individuals or groups (rate-limited)
React to messages with emojis, edit previously sent messages, delete (unsend) for everyone, and forward messages
Contacts
Check if a phone number is registered on WhatsApp
List all contacts (people and groups) with activity stats
Get detailed info on a specific person or group (members, metadata, message stats)
View a contact's social graph — shared groups and mutual connections
Media
Download images, audio, video, and documents from messages (images/audio returned inline)
Transcribe voice messages to text using server-side Whisper-based transcription
Generate text-to-speech (TTS) audio inline without sending to WhatsApp
Message Store & Search
Full-text search across all message history with date, sender, and type filters
Get readable chat summaries (up to 200 recent messages)
View activity stats: message totals, top chats, top contacts, group/DM breakdown
Import WhatsApp chat export files (ZIP or TXT) to backfill historical messages
Auto-Reply
Enable/disable automatic voice-note transcription replies for specific contacts
List all contacts with auto-reply currently enabled
Media Automation
Read and update per-conversation media automation policies (capture, analysis, archiving, Nextcloud integration)
Disable all media automation flags for a conversation
Check system health diagnostics for backend, listener, media, and worker components
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WAHA WhatsApp MCP Serversend 'Running late' to my contact John"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
WAHA WhatsApp MCP Server
A TypeScript Model Context Protocol stdio server for WhatsApp through a unified WAHA backend. It exposes 28 tools for messages, contacts, media, transcription, speech generation, automatic voice-note replies, message-store search, and per-conversation media automation.
Architecture
MCP client → this package → unified backend /api (:8200)
├─ PostgreSQL message store
├─ WAHA live proxy
├─ transcription and TTS providers
└─ media analysis/archive workerThe MCP server only talks to the authenticated /api facade. It does not connect
directly to WAHA, databases, Nextcloud, or model providers. LAN-only management
routes for archive review and LLM provider administration are intentionally excluded.
This release targets waha-backend commit 46acc32 or a compatible newer build.
Related MCP server: WhatsApp MCP Server
Install
Claude Code
claude mcp add waha-whatsapp -- \
env WAHA_API_URL=http://your-server:8200/api \
WAHA_API_KEY=your-backend-api-key \
npx -y @marcos-heidemann/waha-mcp-serverMCP JSON configuration
{
"mcpServers": {
"waha-whatsapp": {
"command": "npx",
"args": ["-y", "@marcos-heidemann/waha-mcp-server"],
"env": {
"WAHA_API_URL": "http://your-server:8200/api",
"WAHA_API_KEY": "your-backend-api-key"
}
}
}
}Configuration
Variable | Required | Default | Description |
| no |
| Unified backend API URL |
| yes | — | Value sent as |
| no |
| WAHA session name |
| no |
| Minimum delay between outbound sends; non-negative integer |
Older WAHA_STORE_* and WAHA_TRANSCRIPTION_* variables are no longer used.
Those services are configured behind the unified backend.
Contact identifiers
Chat-targeting tools use a stable contactId:
Person: phone digits with country code, such as
5521999999999.Group: the stable group JID ending in
@g.us.Legacy
@c.usand@lidaliases remain accepted on routes where the backend supports them.Imported chat IDs ending in
@importwork with message read/search, but not with the backend chat-summary route.
Use whatsapp_list_contacts to discover identifiers.
Tools (28)
Area | Tool | Purpose |
Session |
| Connection and account presence |
Session |
| Authenticated WhatsApp identity |
Chats |
| Live chat overview with previews |
Chats |
| Persistent history with live fallback and optional mark-read |
Messaging |
| Rate-limited text send |
Messaging |
| Add or remove a reaction |
Messaging |
| Edit an outgoing text message |
Messaging |
| Unsend a message |
Messaging |
| Copy stored text into another chat |
Media |
| Return images/audio up to 10 MiB inline; save larger/other files in |
Media |
| Transcribe with language and prompt hints |
Media |
| Generate inline TTS audio; does not send it to WhatsApp |
Contacts |
| Check whether a phone is registered |
Contacts |
| Unified people and groups address book |
Contacts |
| Person or group detail |
Store |
| Search text plus indexed captions, OCR, summaries, tags, and documents |
Store |
| Shared groups and mutual contacts |
Store |
| Recent readable history, up to 100 messages |
Store |
| Activity totals and top chats/contacts |
Store |
| Import a local |
Auto-reply |
| Enable person/group voice-note replies; optional contextual mode |
Auto-reply |
| Disable automatic voice-note replies |
Auto-reply |
| Check enabled/found state |
Auto-reply |
| List enabled people and groups |
Automation |
| Read per-conversation media policy |
Automation |
| Partially update capture/analysis/reply/archive policy |
Automation |
| Turn every media automation flag off for a conversation |
Automation |
| Combined backend/listener/media/worker diagnostics |
Media automation settings
whatsapp_media_settings_update supports:
captureEnabledanalyzeImagesanalyzeDocumentswhatsappReplyEnabledincludeMediaInRecaparchiveMode:off,review, orautofixedNextcloudFolderId: integer ornullarchiveConfirmationEnabledallowSensitiveProcessingaskOnReview
Conversation settings are combined with backend-wide kill switches. Always inspect
returned warnings or call whatsapp_automation_health before assuming a feature is
active. The current public health/warning contract does not expose the global gates
for recap inclusion or review questions.
Current backend limitations
Manual quote replies are not implemented by the public backend send route. Supplying
replyToreturns an MCP error and sends nothing.whatsapp_forward_messagere-sends stored text. It does not preserve media, sender attribution, or WhatsApp's Forwarded label.Some current GOWS media is still exposed as stored type
chat; type filters may miss it until the backend public API switches tonormalized_type.Public chat summaries are not fully
@lidalias-aware. Read/search are the safer choices for migrated histories.Imported sender identities are history-only and are omitted from
whatsapp_list_contacts; imported*@importchats support read/search but not live read receipts or chat summaries.Durable staged-media preview, Nextcloud folder discovery, archive review/actions, and Motor/LLM configuration remain operator-only management functions.
Development and verification
npm ci
npm test # hermetic unit + backend-contract tests
npm run build
npm pack --dry-runReleases are deployed by pushing a tag that exactly matches the package version,
for example v2.4.0. The publish workflow repeats unit tests and the build before
publishing to npm with the repository secret.
Live tests require WAHA_API_URL and WAHA_API_KEY:
npm run test:live # read-only suites
WAHA_TEST_LEVEL=2 npm run test:live # includes self-chat writes
WAHA_TEST_LEVEL=3 npm run test:live # includes configured contact writesThe default test and CI paths never contact WhatsApp.
Security
Treat the backend API key as a password; never commit it.
Sending through an unofficial WhatsApp API can trigger anti-abuse controls. Keep automation narrow and rate-limited.
Media and chat exports can contain sensitive data. Review automation policy before enabling analysis, replies, or archival.
Rotate any credential that has previously appeared in Git history.
License
Available Tools
22 toolswhatsapp_account_infoWhatsApp Account InfoARead-onlyIdempotent
Get information about the authenticated WhatsApp account.
Returns the phone number, display name, and WhatsApp ID of the connected account. Use this to verify which account is connected.
No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds the specific return values, confirming the safe read-only nature and providing behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each adding value: purpose, returned data, and usage. No unnecessary words, front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and comprehensive annotations, the description is sufficiently complete. It tells what it returns and a use case. It could mention error handling but not necessary for a getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the description explicitly states 'No parameters required,' which is helpful. Per rubric, baseline is 4 for no parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get information' and specifies the resource (authenticated WhatsApp account). It lists the specific fields returned (phone number, display name, WhatsApp ID), distinguishing it from siblings like send or delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'Use this to verify which account is connected.' It does not mention alternatives or when not to use, but the context is sufficient for a simple read-only tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_auto_reply_disableDisable Auto-Reply TranscriptionAIdempotent
Disable auto-reply with audio transcription for a contact.
Args:
phone: Phone number digits only, no @, no spaces (e.g., "5521986910666").
Returns:
status: "ok"
phone: the canonical phone
enabled: false
| Name | Required | Description | Default |
|---|---|---|---|
| phone | Yes | Phone digits only with country code (e.g., "5521986910666") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false, so the description adds value by specifying the return fields (status, phone, enabled: false). However, it does not disclose other behavioral traits like side effects or prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a one-line purpose statement followed by structured Args and Returns sections. Every sentence is necessary and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter fully documented in the schema, annotations present, and no output schema needed, the description is complete. It explains the tool's action, input format, and output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description and pattern for the phone parameter. The description adds an example and format clarification ('digits only, no @, no spaces'), but this largely overlaps with the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Disable' and the resource 'auto-reply with audio transcription', along with the scope 'for a contact'. This distinguishes it from sibling tools like whatsapp_auto_reply_enable and whatsapp_auto_reply_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. There is no mention of when not to use it or references to enable/list siblings. The usage is only implicitly understood from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_auto_reply_enableEnable Auto-Reply TranscriptionAIdempotent
Enable auto-reply with audio transcription for a contact.
When the contact sends a voice note, the transcription is sent back as a quoted reply automatically. DM only — voice notes in groups are never auto-replied even if a member is flagged.
The flag is contact/phone-scoped, so it follows the contact across WhatsApp's @c.us → @lid JID transitions automatically — no need to re-flag when WhatsApp migrates the JID.
Args:
phone: Phone number digits only, no @, no spaces (e.g., "5521986910666"). Look up via whatsapp_list_contacts first if you only know the name.
Returns:
status: "ok" on success
phone: the canonical phone
enabled: true
| Name | Required | Description | Default |
|---|---|---|---|
| phone | Yes | Phone digits only with country code (e.g., "5521986910666") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the scoping behavior (contact/phone-scoped, follows JID transitions) and idempotent nature (implied). Annotations already set idempotentHint=true and destructiveHint=false; description adds valuable context beyond these.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with summary, then detailed behavior, Args/Returns sections. Slightly verbose with the JID transition explanation, but all sentences add value. Front-loaded main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Completely describes behavior, parameter, and return value. Without output schema, the Returns section covers needed info. Sibling tools context makes it stand out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema: specifies format 'Phone number digits only, no @, no spaces' with example, and advises looking up contact first. Schema coverage is 100%, but description enhances usability.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Enable auto-reply with audio transcription for a contact.' Verb 'enable', specific resource 'auto-reply transcription', and scope 'for a contact' distinguish it from sibling tools like disable, list, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly notes when to use: 'When the contact sends a voice note, the transcription is sent back as a quoted reply automatically.' Also excludes groups: 'DM only — voice notes in groups are never auto-replied even if a member is flagged.' Advises lookup via whatsapp_list_contacts first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_auto_reply_listList Contacts with Auto-Reply EnabledARead-onlyIdempotent
List every contact that currently has auto-reply transcription enabled, with display names from Google Contacts (when matched) or WhatsApp push name fallback.
Returns:
contacts: array of { phone, display_name, person_name, push_name }
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations by explaining the name resolution logic (Google Contacts with WhatsApp fallback) and the exact fields returned. Annotations already indicate read-only, non-destructive, idempotent behavior, so the description complements them well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences: the first states the purpose and name resolution, the second details the return structure. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameterless tool, the description is sufficiently complete. It explains the output structure, though it might be missing details like sorting or pagination, but those are not critical for this query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the baseline is 4. The description adds no parameter information, which is appropriate given the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists contacts with auto-reply enabled, using a specific verb ('list') and resource ('contacts with auto-reply'), and distinguishes from sibling tools like whatsapp_auto_reply_enable and whatsapp_list_contacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the purpose is clear, the description does not explicitly state when to use this tool versus alternatives, such as when to use whatsapp_list_contacts instead. The usage context is implied but not directly addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_chat_summaryChat SummaryARead-onlyIdempotent
Get a readable summary of recent messages in a WhatsApp chat, including sender names and timestamps.
This is optimized for readability — use whatsapp_read_messages for structured data with filtering, or whatsapp_search_messages for full-text search.
Args:
contactId: Phone digits for a person, or "*@g.us" for a group
limit: Number of recent messages to include (1-200, default 50)
Returns:
chat: Name, type, message count, date range
messages: Recent messages with sender name, body, timestamp, type
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Phone digits for a person, or "*@g.us" for a group | |
| limit | No | Number of recent messages to include (1-200, default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the safety profile is clear. The description adds context by explaining the return structure (chat and messages objects) and that the output is human-readable. No contradictions exist. While it doesn't go beyond what annotations provide for safety, it adds value in output transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise with no wasted words: a one-sentence purpose, a one-sentence usage note, and clearly formatted Args and Returns sections. Every sentence serves a purpose, making it easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 provides a detailed textual description of the return value (chat info and messages with sender, body, timestamp, type). This fully compensates for the missing schema, and the tool's simplicity (2 parameters) means no further information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters have schema descriptions. The description's 'Args' section repeats the schema descriptions verbatim without adding new information. Thus, the description adds no additional semantic value beyond the schema, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get a readable summary of recent messages in a WhatsApp chat, including sender names and timestamps.' It also distinguishes from siblings by explicitly mentioning alternatives (whatsapp_read_messages for structured data, whatsapp_search_messages for full-text search), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'This is optimized for readability — use whatsapp_read_messages for structured data with filtering, or whatsapp_search_messages for full-text search.' This clearly tells the agent when to use this tool versus alternatives, fulfilling the highest standard.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_check_numberCheck WhatsApp NumberARead-onlyIdempotent
Check if a phone number is registered on WhatsApp.
Use this before sending a message to a number not yet in your address book.
Args:
phone: Phone number with country code, no spaces or dashes (e.g., "5511999999999")
Returns:
numberExists: true if registered on WhatsApp
contactId: The id to use as contactId in other tools (the same phone digits)
| Name | Required | Description | Default |
|---|---|---|---|
| phone | Yes | Phone number with country code, no spaces/dashes (e.g., "5511999999999") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. The description adds value by explaining return values (numberExists, contactId) and the contactId's reuse in other tools, which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a clear summary, usage note, and structured Args/Returns sections. Every sentence is purposeful with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple check tool with one parameter, the description covers purpose, usage context, parameter format, and return values. It could mention error handling but is largely complete given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a parameter description. The description repeats the format example and adds a usage note, but does not add significant new semantic 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Check if a phone number is registered on WhatsApp,' using a specific verb and resource. It distinguishes itself from sibling tools that handle other WhatsApp operations like account info or messaging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises: 'Use this before sending a message to a number not yet in your address book,' providing clear context. It does not mention when not to use or alternatives, but the guidance is direct and useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_contact_graphContact Social GraphARead-onlyIdempotent
Get social graph for a WhatsApp contact — shared groups, mutual connections.
Args:
phone: Phone number with country code (e.g., "5524999160115")
Returns:
groups: Groups this contact is in, with message counts
mutualContacts: Other contacts who share groups with this person
| Name | Required | Description | Default |
|---|---|---|---|
| phone | Yes | Phone number with country code (e.g., "5524999160115") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds that the tool returns groups with message counts and mutual contacts, providing additional behavioral detail 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the purpose, and uses a clear args/returns structure. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with comprehensive annotations, the description is largely complete. It could optionally mention that the contact must exist, but overall it covers the key aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the 'phone' parameter with an example. The description repeats the same information without adding new semantic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Get social graph for a WhatsApp contact — shared groups, mutual connections', specifying the verb and resource clearly. It distinguishes from sibling tools like whatsapp_get_contact by focusing on social connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does and what it returns, allowing the agent to infer when to use it (when social graph info is needed). However, it does not explicitly mention when not to use it or compare to alternatives like whatsapp_list_contacts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_delete_messageDelete WhatsApp MessageADestructive
Delete (unsend) a message from a contact's chat.
Removes the message for everyone. WhatsApp shows "This message was deleted" in its place.
Args:
contactId: Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts.
messageId: Message ID to delete
Returns confirmation of deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts. | |
| messageId | Yes | Message ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true. The description adds that WhatsApp shows 'This message was deleted' as a placeholder, providing extra behavioral context beyond what 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and uses a clear structure with an Args section. The first sentence is slightly redundant with later details, but overall efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple destructive operation with two parameters and an output confirmation, the description covers the essential behavioral and parameter details. No output schema exists, but return value is noted. Lacks mention of idempotency or rate limits, but acceptable given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%. The description adds example values for contactId and explains special handling for group JIDs, but for messageId it only repeats the schema description. Meets baseline but adds limited extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete (unsend) a message from a contact's chat.' It uses a specific verb and resource, distinguishing it from siblings like whatsapp_edit_message and whatsapp_forward_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While it explains the action and outcome ('Removes the message for everyone'), it does not explicitly state when to use this tool versus alternatives or when not to use it. The context of destructive action is clear, but no direct comparison to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_download_mediaDownload WhatsApp MediaARead-onlyIdempotent
Download media (image, audio, video, document) from a WhatsApp message.
Fetches the media attached to a specific message and returns it directly:
Images: returned inline so Claude can see them
Audio: returned inline so Claude can process them
Video/documents: saved to /tmp/whatsapp-media/ and path returned
Use whatsapp_read_messages first to find messages with hasMedia=true, then pass the contactId and messageId here.
Note: Old media (weeks+) may no longer be available on WhatsApp's servers.
Args:
contactId: Phone digits or "*@g.us" — the contact whose chat contains the message
messageId: Message ID with media to download (from whatsapp_read_messages)
Returns:
For images: the image content directly (Claude can see it)
For audio: the audio content directly
For other files: file path where it was saved + metadata
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Phone digits or "*@g.us" — chat that contains the media message | |
| messageId | Yes | Message ID with media to download |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint. The description adds valuable behavioral context: inline return for images/audio, file save path for video/documents, and potential unavailability of old media.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (5 sentences plus structured Args/Returns sections), front-loaded with purpose, and well-organized. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 required parameters and no output schema, the description covers all necessary aspects: return behavior by media type, prerequisite workflow, and data persistence. Annotations cover safety constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 repeats similar explanations in Args section, adding no new semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool downloads media (image, audio, video, document) from a WhatsApp message. It distinguishes from siblings by specifying to use whatsapp_read_messages first and provides the exact 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use whatsapp_read_messages first to find messages with hasMedia=true, then pass contactId and messageId. Also notes that old media may not be available, guiding appropriate usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_edit_messageEdit WhatsApp MessageAIdempotent
Edit a previously sent text message.
Only works on messages you sent (fromMe=true). WhatsApp shows an "edited" label on the message after editing.
Args:
contactId: Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts.
messageId: Message ID to edit (must be your own message)
text: New text content
Returns confirmation with the edited message ID.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts. | |
| messageId | Yes | Message ID to edit (must be your own message) | |
| text | Yes | New text content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral info: 'WhatsApp shows an "edited" label on the message after editing.' Annotations already declare idempotentHint=true and nondestructive, but description enriches with user-visible effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, each sentence adds value. Could be slightly tighter but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Includes return info ('confirmation with edited message ID'), sufficient given no output schema. Coverage is adequate for a simple edit tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description repeats parameter info without adding extra meaning. Meets baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with 'Edit a previously sent text message,' clearly stating verb (edit) and resource (message). Distinguishes from siblings like send, delete, forward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Only works on messages you sent (fromMe=true),' providing a clear condition. No explicit alternatives or when-not usage, 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.
whatsapp_forward_messageForward WhatsApp MessageA
Forward a message from one chat to another contact.
The forwarded message shows a "Forwarded" label in WhatsApp and preserves the original sender attribution.
Args:
contactId: Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts. — destination
messageId: Message ID to forward (get from whatsapp_read_messages)
Returns confirmation with forwarded message ID.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts. (destination) | |
| messageId | Yes | Message ID to forward (from whatsapp_read_messages) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false) confirm this is a write operation. The description adds behavioral context: the forwarded message labels itself, preserves attribution, and returns a confirmation with the new message ID. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 short paragraphs) and well-structured: a one-sentence purpose, a line about labeling, and bullet-like parameter explanations. No redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-param tool, the description covers all essential aspects: purpose, parameter sourcing, expected label behavior, and return value. No output schema is needed given the simple confirmation format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningful guidance beyond the schema: how to obtain contactId (via whatsapp_list_contacts) and messageId (from whatsapp_read_messages), and explains the ID format and stability across @c.us↔@lid flips.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Forward a message from one chat to another contact.' This is a specific verb+resource pair that distinguishes it from sibling tools like whatsapp_send_text (sends new message) or whatsapp_delete_message (deletes message).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what forwarding does (shows 'Forwarded' label, preserves attribution) but does not explicitly state when to use this tool vs alternatives like sending a new message or editing. Usage context is implied rather than explicit, lacking 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.
whatsapp_get_contactGet Contact Detail (person or group)ARead-onlyIdempotent
Detail for a single contact — person OR group, by stable id.
Returns shape depends on kind:
Person: contact (phone, names, email, org), all chats they appear in, all JID variants, message stats.
Group: chat (group metadata), members with display names, member_count.
Args:
contactId: phone digits (person; "5521986910666"), or "*@g.us" (group). Look up via whatsapp_list_contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Phone digits for a person, or "*@g.us" for a group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnly and safe behavior. The description adds behavioral specifics: return shape depends on kind (person vs group) and lists included fields. Does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a clear structure: a one-line summary, bullet-style return details, and an args section. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter tool and lack of output schema, the description fully covers what the tool does, return shapes, and how to find the input. No missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description for contactId. The description enriches this by showing example formats and referencing a sibling tool to look up the ID, adding context beyond the schema pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state the tool retrieves details for a single contact (person or group) by stable id. It distinguishes itself from siblings like 'whatsapp_list_contacts' by specifying it returns detailed info for one contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on how to obtain the contactId via 'whatsapp_list_contacts' and gives format examples. It implies usage for getting detail after listing, but does not explicitly state when not to use (e.g., for listing multiple contacts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_import_chatImport WhatsApp Chat ExportAIdempotent
Import a WhatsApp chat export file (ZIP or TXT) into the message store.
Use this to backfill historical messages from WhatsApp's "Export Chat" feature. Only inserts new messages — won't overwrite or duplicate existing data.
The file should be a WhatsApp chat export:
ZIP file containing a .txt (standard WhatsApp export format)
Or a plain .txt file
The chat name is extracted from the filename (e.g., "Conversa do WhatsApp com NAME.zip"). You can override it with the chatName parameter.
Messages are matched to existing contacts by name. If a contact doesn't exist, it's created. If the chat already exists in the store (by name), messages are added to it.
Args:
filePath: Absolute path to the ZIP or TXT file on the server
chatName: Optional override for the chat name (extracted from filename if omitted)
Returns:
chat_name: Resolved chat name
total_parsed: Number of messages found in file
inserted: New messages added
skipped_duplicates: Messages already in store
senders: List of sender names found
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Absolute path to the WhatsApp export ZIP or TXT file on the server | |
| chatName | No | Override chat name (extracted from filename if omitted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotent, non-destructive), the description details behavior: filename extraction for chat name, contact matching/creation, and duplicate skipping. It also lists return fields, which is not in the output schema. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place. The description is organized with paragraphs, a bullet list for file format, and clear 'Args' and 'Returns' sections. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (handling ZIP/TXT, contact matching, idempotency), the description covers all essential aspects. The output schema is absent but the return fields are listed in the description. The sibling set is addressed by the unique purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning: explains filePath is an absolute path, chatName is an optional override, and describes how the chat name is extracted. This enriches the schema's short descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Import') and resource ('WhatsApp chat export file'), clearly stating it inserts messages into the message store. It distinguishes from siblings like 'whatsapp_read_messages' and 'whatsapp_send_text' by being the only tool for backfilling historical exports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using the tool to 'backfill historical messages from WhatsApp's 'Export Chat' feature.' It notes it only inserts new messages, implying it's not for overwriting. While no direct alternatives are named, the sibling list makes the context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_list_chatsList WhatsApp ChatsARead-onlyIdempotent
List recent WhatsApp chats with last message preview and profile pictures.
Returns chat IDs, names, profile picture URLs, and a preview of the last message. Use the chat ID from results to read messages with whatsapp_read_messages.
Args:
limit: Number of chats to return (1-100, default 20)
offset: Pagination offset (default 0)
Returns array of chats with:
id: Chat ID (use this in other tools)
name: Contact or group name
picture: Profile picture URL (may expire)
lastMessage: Preview with body, from, fromMe, hasMedia, timestamp
lastMessageAt: ISO timestamp of last message
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of chats to return (1-100, default 20) | |
| offset | No | Pagination offset (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description doesn't need to restate safety. It adds value by noting that profile picture URLs may expire, describing the return structure including nullable fields, and specifying pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, uses bullet points for return fields, and is overall concise with no wasted words. Every sentence provides necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers purpose, parameters, return structure, and usage guidance. It lacks an explicit output schema but compensates with a detailed textual description. The absence of error handling details is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning beyond the schema by explaining the output structure (id, name, picture, lastMessage, lastMessageAt) and how to use the returned chat ID in other tools. This contextualizes the parameters' purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists recent WhatsApp chats with last message preview and profile pictures, using a specific verb and resource. It distinguishes from siblings like whatsapp_list_contacts (contacts) and whatsapp_read_messages (reading after getting ID).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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: 'Use the chat ID from results to read messages with whatsapp_read_messages.' It provides clear context for a typical workflow, though it doesn't explicitly exclude alternatives like whatsapp_search_messages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_list_contactsList WhatsApp Contacts (people + groups)ARead-onlyIdempotent
Unified address book — lists people you DM and groups you're in.
Use the returned 'id' as contactId in any chat-targeting tool (send_text, read_messages, etc.):
Person: id = phone digits (universal — survives @c.us↔@lid flips)
Group: id = group JID (e.g. "120363...@g.us")
Args:
kind: "person" | "group" | "all" (default "all")
search: Filter by name or id (optional)
limit: Maximum rows to return (1-100, default 20)
offset: Pagination offset for the persons section (default 0)
Returns array of contacts with:
kind: "person" | "group"
id: phone digits or group JID — pass to other tools
name: display name (Google Contact name → push name → phone/jid fallback)
messageCount, lastMessageAt: activity stats
For persons: pushName, googleName, email, organization
For groups: memberCount
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by contact type (default 'all') | all |
| search | No | Filter by name or id (optional) | |
| limit | No | Maximum rows to return (1-100, default 20) | |
| offset | No | Pagination offset (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent. Description adds behavioral details about ID formats, name resolution fallback, and pagination, which is valuable 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with Args and Returns sections. It is concise but thorough, though slightly verbose in explaining ID formats and fallbacks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no output schema, and strong annotations, the description fully explains return structure, ID usage, pagination, and filtering options. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage, so description adds only marginal value for parameters. It explains the kind enum and output context, but the schema already provides clear parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Title and description clearly state the tool lists WhatsApp contacts (people and groups). Description distinguishes from siblings like whatsapp_list_chats and whatsapp_get_contact. Uses specific verbs and resource types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly explains how to use returned IDs for chat-targeting tools, but doesn't state when not to use or alternatives. Still provides clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_reactReact to WhatsApp MessageAIdempotent
React to a WhatsApp message with an emoji.
Use an empty string for the reaction to remove an existing reaction.
Args:
contactId: Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts.
messageId: Message ID to react to (get from whatsapp_read_messages)
reaction: Emoji to react with (e.g., "👍", "❤️", "😂"). Empty string removes reaction.
Returns confirmation of the reaction.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts. | |
| messageId | Yes | Message ID to react to | |
| reaction | Yes | Emoji reaction (e.g., "👍", "❤️"). Empty string removes reaction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotent, destructive=false, readOnly=false, openWorld=true. The description adds important context: removal via empty string and return confirmation. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise paragraphs: first sentence states purpose, second gives special behavior, third explains args. Every sentence is necessary and no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 required parameters, no output schema, the description covers all necessary aspects: purpose, parameter usage, special cases, and references to sibling tools for lookup. An agent can correctly invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explaining the empty string removal for reaction and providing examples for contactId format. It also ties contactId and messageId to lookup tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'React' and resource 'WhatsApp message', and distinguishes from siblings like delete or edit. It also specifies the empty string behavior for removing reactions, which is unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on how to use the tool (e.g., refer to whatsapp_list_contacts and whatsapp_read_messages), and mentions the empty string for removal. However, it does not explicitly contrast with alternatives like whatsapp_send_text or whatsapp_edit_message.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_read_messagesRead WhatsApp MessagesA
Read messages from a specific WhatsApp chat.
Returns messages with sender, text content, timestamp, and message ID. Use the message ID from results for whatsapp_react or reply_to in whatsapp_send_text.
Powered by Message Store — persistent full history with full-text search and sender filtering.
Args:
contactId: Phone digits for a person ("5521986910666"; survives @c.us↔@lid flips), or group JID "*@g.us". Look up via whatsapp_list_contacts.
limit: Number of messages to return (1-100, default 20)
offset: Skip N messages for pagination (default 0)
search: Full-text search within this chat's messages (optional)
sender: Filter by sender name or JID (optional)
type: Filter by message type: chat, image, album (optional)
since: ISO date — messages after this date (optional)
until: ISO date — messages before this date (optional)
fromMe: Filter sent (true) or received (false) messages (optional)
downloadMedia: Include media download URLs when falling back to live (default false)
markAsRead: Mark messages as read after fetching (default false)
Returns:
messages: Array with id, sender, body, timestamp, type, fromMe, hasMedia
total: Total matching messages
hasMore: Whether more results exist
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Phone digits for a person, or "*@g.us" for a group | |
| limit | No | Number of messages to return (1-100, default 20) | |
| offset | No | Skip N messages for pagination (default 0) | |
| search | No | Full-text search within this chat (optional) | |
| sender | No | Filter by sender name or JID (optional) | |
| type | No | Filter by message type: chat, image, album (optional) | |
| since | No | ISO date — only messages after this date (optional) | |
| until | No | ISO date — only messages before this date (optional) | |
| fromMe | No | Filter: true = sent, false = received (optional) | |
| downloadMedia | No | Include media download URLs when falling back to live (default false) | |
| markAsRead | No | Mark messages as read after fetching (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations do not indicate readOnlyHint but description explains the markAsRead parameter (side effect). It also describes return fields and the 'hasMore' flag. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a summary paragraph then bullet lists for args and returns, making it readable. A bit lengthy but well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters and no output schema, the description covers each parameter and outlines return fields. Examples and usage tips enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds extra context for contactId (phone digits, group JID, format survival) and return fields, providing value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read messages from a specific WhatsApp chat,' specifying the action and resource. It also distinguishes from siblings like whatsapp_search_messages and provides context on returned fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using message IDs from results for reacting or replying, and mentions looking up contactId via whatsapp_list_contacts. While it doesn't explicitly state when not to use this tool, 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.
whatsapp_search_messagesSearch WhatsApp MessagesARead-onlyIdempotent
Search across all WhatsApp message history. Supports full-text search, date ranges, sender filtering, and message type filtering.
Args:
search: Text to search for (case insensitive, supports Portuguese/unicode)
contactId: Scope search to one contact (phone digits or "*@g.us") (optional)
sender: Filter by sender name or JID (optional)
since: ISO date string — messages after this date (optional)
until: ISO date string — messages before this date (optional)
type: Message type filter: chat, image, album, e2e_notification (optional)
fromMe: Filter sent (true) or received (false) messages (optional)
limit: Results per page (1-100, default 20)
offset: Pagination offset (default 0)
Returns:
messages: Array with id, chatJid, senderName, body, timestamp, messageType, fromMe
total: Total matching messages
has_more: Whether more results exist
Note: sender_name may be null for some messages.
| Name | Required | Description | Default |
|---|---|---|---|
| search | Yes | Text to search for (case insensitive) | |
| contactId | No | Scope search to one contact: phone digits (person) or "*@g.us" (group). Optional. | |
| sender | No | Filter by sender name or JID (optional) | |
| since | No | ISO date string — only messages after this date (optional) | |
| until | No | ISO date string — only messages before this date (optional) | |
| type | No | Message type filter: chat, image, album, e2e_notification (optional) | |
| fromMe | No | Filter: true = sent, false = received (optional) | |
| limit | No | Results per page (1-100, default 20) | |
| offset | No | Pagination offset (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true. Description adds case-insensitive search, Portuguese/unicode support, and notes that sender_name may be null. This provides 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with summary, Args, and Returns. Front-loaded with key purpose. Slightly lengthy but clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given high parameter count (9) and no output schema, description fully explains each parameter, return structure, and behavioral traits (case-insensitivity, null sender_name). Complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description repeats schema parameter descriptions almost verbatim, adding only case-insensitivity note and return format. Minimal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Title and description clearly specify the tool searches WhatsApp messages with full-text, date, sender, and type filters. It distinguishes from siblings like whatsapp_list_chats and whatsapp_read_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use instructions. Usage is implied through description, but no alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_send_textSend WhatsApp Text MessageA
Send a text message to a contact (person or group).
CORE tier supports text messages only (no images, video, audio, or documents). A rate limit delay is enforced between sends to avoid WhatsApp detection.
Args:
contactId: Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts.
text: Message text to send
replyTo: Optional message ID to quote-reply to (get from whatsapp_read_messages)
Returns:
status: "sent"
messageId: The sent message's ID
contactId: Where it was sent
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact id: phone digits for a person (e.g. "5521986910666"; survives @c.us↔@lid flips), or a group JID "*@g.us". Look up via whatsapp_list_contacts. | |
| text | Yes | Text message to send | |
| replyTo | No | Message ID to quote-reply to (from whatsapp_read_messages) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate it is not read-only (readOnlyHint=false) and not destructive (destructiveHint=false), which the description confirms by describing a send operation. The description adds transparency about rate limit delays and the CORE tier limitation, which goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for purpose, constraints, parameter details, and returns. It is efficient but not overly terse. Some information (e.g., parameter descriptions) partly duplicates schema, but overall it is concise and front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers input, behavior (rate limit, tier restriction), and output (status, messageId, contactId). Since there is no output schema, the description fills that gap. It also references sibling tools for lookup, making the context complete for a simple send operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description partially overlaps with schema. However, the description adds value by explaining that contactId 'survives @c.us↔@lid flips' (not in schema) and clarifying replyTo's purpose. The schema already defines types and constraints, so the description enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('send'), the resource ('text message'), and the target ('contact (person or group)'). It distinguishes itself from sibling tools by specifying 'CORE tier supports text messages only', implying that other tools handle media. It also provides context for finding contact IDs via whatsapp_list_contacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: send text messages, not media. It mentions rate limit delay, and provides guidance on how to obtain contactId and replyTo from other tools. It does not explicitly state when not to use, but the purpose is well-defined, and siblings like whatsapp_forward_message or whatsapp_download_media imply alternative use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_session_statusWhatsApp Session StatusARead-onlyIdempotent
Check if the WhatsApp session is connected and working.
Returns the session status (WORKING, STOPPED, etc.), the connected phone number, and display name. Use this to verify connectivity before sending messages.
No parameters required.
Returns:
name: Session name
status: "WORKING" if connected, "STOPPED" if disconnected
phone: Connected phone number (if authenticated)
pushName: Display name on WhatsApp
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds behavioral details beyond the annotations, such as the possible status values ('WORKING', 'STOPPED') and the meaning of each return field, which helps agents understand exactly what the tool reveals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two short sentences and a structured list of return values. Every sentence adds value: the first states the purpose, the second explains when to use it, and the list clarifies the output. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema required), the description is fully complete. It explains the purpose, the scenario for use, and details the output fields with expected values. An agent can invoke this tool without any additional clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters (input schema is empty), and the description explicitly states 'No parameters required.' According to guidelines, 0 parameters earns a baseline of 4, and the description correctly confirms this, leaving no ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Check if the WhatsApp session is connected and working.' It specifies the resource (WhatsApp session) and the action (check status), and lists the return values (status, phone, name) which distinguish it from siblings like sending or listing messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Use this to verify connectivity before sending messages.' It explains when to use the tool but does not explicitly mention when not to use it or suggest alternatives among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_statsWhatsApp StatsARead-onlyIdempotent
Overview dashboard of WhatsApp activity — message totals, top chats, top contacts, and group/DM breakdown.
No arguments needed. Returns:
Totals: messages, contacts, chats, groups, DMs
Activity: messages today, this week
Top 5 chats by message count (name may be null for groups — use whatsapp_get_contact to look up)
Top 5 contacts by message count
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by detailing the return structure (totals, top lists, null name for groups) and suggesting whatsapp_get_contact for group lookups. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, starting with a summary sentence followed by bullet points for return fields. Every sentence adds value without redundancy or wordiness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description adequately explains the return values including totals, activity counts, top chats, and top contacts. It notes that group names may be null, providing useful context. Minor gap: not specifying the timeframe for 'this week' but overall complete for a simple stats tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100%. The description explicitly states 'No arguments needed,' which adds clarity. No additional parameter information is necessary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides an overview dashboard of WhatsApp activity including message totals, top chats, top contacts, and breakdowns. It uses specific verbs ('Overview dashboard') and resource ('WhatsApp activity'), and distinguishes from siblings like whatsapp_chat_summary and whatsapp_list_chats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'No arguments needed,' making when to use clear. It provides context for the dashboard overview but does not explicitly mention when not to use or name alternatives among siblings. However, the zero-parameter nature makes usage straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whatsapp_transcribe_audioTranscribe WhatsApp AudioA
Transcribe a WhatsApp voice message or audio to text.
Server-side transcription via Speaches (Whisper). Optionally replies to the original message with the transcription text.
Args:
contactId: Phone digits or "*@g.us" — the contact whose chat contains the audio
messageId: Message ID of the audio to transcribe
replyWithTranscription: If true, sends the transcription as a WhatsApp reply to the audio message (default false)
Returns:
transcription: The transcribed text
language: Detected language (if available)
replyMessageId: ID of the reply message (if replyWithTranscription=true)
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Phone digits or "*@g.us" — chat that contains the audio | |
| messageId | Yes | Message ID of the audio to transcribe | |
| replyWithTranscription | No | If true, sends the transcription as a WhatsApp reply to the audio (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses server-side transcription via Speaches/Whisper and the optional reply behavior, which aligns with annotations (readOnlyHint=false, destructiveHint=false). No contradictions, and it provides useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and structured with Args/Returns sections. Every sentence adds value, and there is no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity and full parameter coverage, the description adequately explains the tool's behavior, including optional reply and language detection. It lacks error handling or input validation details, but is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the format for contactId (phone digits or *@g.us) and the default for replyWithTranscription. It enhances understanding beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Transcribe' and the resource 'WhatsApp audio', specifying it converts voice messages to text. It distinguishes from sibling tools by being the only transcription tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly state when to use it or when not to, nor does it mention alternatives. Usage context is implied through parameter descriptions but lacks clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose, from account info to message operations to auto-reply management. No two tools appear to do the same thing, and descriptions clarify boundaries (e.g., chat_summary vs read_messages vs search_messages).
All tools share the 'whatsapp_' prefix and mostly follow a verb_noun pattern (e.g., delete_message, send_text). A few deviate slightly (e.g., account_info, stats, session_status are noun_noun or noun only), but the overall pattern is clear and consistent.
With 22 tools, the count is slightly above the ideal range but still well-scoped for a comprehensive WhatsApp server. Each tool covers a distinct operation, and none feel redundant or excessive.
The tool set covers most core WhatsApp operations: account management, contacts, chats, messages (send, read, edit, delete, forward, react, download media, transcribe), and auto-reply. Notable gaps include sending media (images, files) and group management, but the core workflow is well-supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Drive your real WhatsApp inbox from Claude — send, reply, label, assign, and triage via TimelinesAI.
One workspace of tools for Claude and ChatGPT: connect 600+ apps, generate media, build tools.
Run WhatsApp Business campaigns from any AI assistant: contacts, segments, and broadcasts.
Give your AI agents a real WhatsApp number to send and receive messages.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables WhatsApp integration through Evolution API, allowing users to send messages, manage media, track conversations, and control presence status directly from Claude.MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude to read and send WhatsApp messages, including media and call history, via a local bridge.MIT
- AlicenseNot gradedqualityDmaintenanceEnterprise-grade WhatSMS integration for Claude AI providing 173 tools for SMS, WhatsApp, OTP, contacts, and device management.13MIT
- AlicenseBqualityDmaintenanceEnables Claude to manage WhatsApp templates, flows, and send messages through the WhatsApp Cloud API.3126MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Maheidem/waha-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server