Kaption WhatsApp
An MCP server that lets AI assistants read, search, analyze, organize, and schedule WhatsApp data through the KaptionAI Chrome extension — without ever sending messages directly.
Query conversations, messages, contacts, labels, communities, and sessions — search globally or per chat, filter unread/label/community, paginate by date, and route across multiple accounts.
Summarize conversations on demand.
Read and download media (images, video, audio, documents, stickers) as base64 with metadata.
Access audio transcriptions and timed call recordings/transcripts, with search.
Analyze usage via analytics sections: KPIs, activity, rankings, response times, calls, emojis, words, countries, silences, streaks, communities, channels, and exports (CSV/JSON/TXT/VCF).
Manage Business labels and contact notes, plus personal chat lists (create, edit, add/remove chats, delete).
Manage chat state: archive, pin, mute, mark read/unread, and set/clear drafts.
Create and manage reminders and scheduled messages in two modes: cloud bot (Kaption's number) or local (user's own number, with consent and rate limits, groups supported locally).
Look up contacts and groups from local cache, including live group membership and a contact's groups.
Export contacts as CSV or JSON.
Get HTTP REST API connection info for programmatic access.
Multi-account and multi-instance support, plus WebMCP discovery for browser-native AI agents.
Security/limits: localhost only, locked chats hidden, no direct message sending, feature-gated, and rate-limited writes.
Provides tools for reading and managing WhatsApp conversations via WhatsApp Web, including querying conversations, contacts, messages, transcriptions, labels and communities; summarizing conversations; managing Business labels and personal chat lists; managing chat state (archive, mark read/unread, pin, mute, set drafts); creating personal reminders; and scheduling messages to be sent automatically either via Kaption's bot or from the user's own number.
@kaptionai/mcp-extension
MCP server that lets AI assistants read and manage your WhatsApp conversations through the KaptionAI Chrome extension. Also supports WebMCP for zero-config browser-native AI tool discovery.
Claude / Cursor ──stdio──> mcp-whatsapp ──ws://localhost:7865──> KaptionAI Extension ──> WhatsApp Web
Browser AI Agent ──navigator.modelContext──> KaptionAI Extension ──> WhatsApp Web (WebMCP)Agent skill
Teach Claude Code, Codex, Cursor and other agents how to use these tools well (search first, never send without confirming, reminders vs. scheduled messages, error handling):
npx skills add Kaption-AI/mcp-extensionThe skill lives in skills/kaption-whatsapp/SKILL.md.
Related MCP server: gaviwhatsapp-mcp
Setup
1. Install the extension
Install the KaptionAI Chrome Extension and enable the MCP bridge in settings.
2. Configure your AI tool
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"whatsapp": {
"command": "npx",
"args": ["-y", "@kaptionai/mcp-extension@latest"]
}
}
}Claude Code
claude mcp add whatsapp -- npx -y @kaptionai/mcp-extension@latestCursor
Add to .cursor/mcp.json in your project or go to Settings > MCP Servers:
{
"mcpServers": {
"whatsapp": {
"command": "npx",
"args": ["-y", "@kaptionai/mcp-extension@latest"]
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"whatsapp": {
"command": "npx",
"args": ["-y", "@kaptionai/mcp-extension@latest"]
}
}
}VS Code (Copilot)
Add to .vscode/mcp.json in your project:
{
"servers": {
"whatsapp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@kaptionai/mcp-extension@latest"]
}
}
}Or add to your VS Code settings.json:
{
"mcp": {
"servers": {
"whatsapp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@kaptionai/mcp-extension@latest"]
}
}
}
}Zed
Add to Zed settings (~/.config/zed/settings.json):
{
"context_servers": {
"whatsapp": {
"command": {
"path": "npx",
"args": ["-y", "@kaptionai/mcp-extension@latest"]
}
}
}
}OpenAI Agents SDK (Python)
from agents import Agent
from agents.mcp import MCPServerStdio
whatsapp = MCPServerStdio(
name="whatsapp",
command="npx",
args=["-y", "@kaptionai/mcp-extension@latest"],
)
agent = Agent(
name="assistant",
instructions="You can access WhatsApp conversations.",
mcp_servers=[whatsapp],
)Any MCP-compatible client
This package runs as a standard MCP server over stdio. To connect from any client:
npx -y @kaptionai/mcp-extension@latestThe server communicates via stdin/stdout using the MCP protocol. Point your client's MCP configuration to this command.
3. Open WhatsApp Web
Open web.whatsapp.com in Chrome or Edge. The extension will auto-connect to the MCP server.
Tools
query
Query WhatsApp data — conversations, contacts, messages, transcriptions, labels, and communities.
# List conversations
query {}
# Search everything
query { query: "meeting" }
# Unread only
query { unread: true }
# Look up a conversation with messages
query { id: "5511999887766@c.us" }
# Search contacts
query { query: "Alice", entity: "contacts" }
# List labels (Business accounts)
query { entity: "labels" }
# Filter by label
query { label: "Important" }
# List communities
query { entity: "communities" }
# Filter by community
query { community: "My Community" }
# Get session info
query { entity: "session" }Parameter | Type | Description |
| string | Search text (names, messages, transcriptions) |
| string | Look up a specific conversation, contact, or label |
| string |
|
| number | Max results (default 25, max 5000) |
| boolean | Only unread conversations |
| string | Filter by label name or ID |
| string | Filter by community name or ID |
| string | Messages before this ISO 8601 timestamp (pagination) |
| string | Messages after this ISO 8601 timestamp (incremental sync) |
summarize_conversation
Generate a summary of a conversation.
Parameter | Type | Description |
| string | The conversation ID |
manage_labels
Manage WhatsApp Business labels — add, remove, create, or delete labels.
Parameter | Type | Description |
| string |
|
| string | Label name |
| string | Label ID (alternative to name) |
| string | Required for add/remove |
manage_lists
Manage personal chat lists (custom lists). The personal account equivalent of Business labels — organize chats into custom categories.
Reading them is list_chat_lists / get_chat_list (read-only tools).
# List all custom lists (read-only tool)
list_chat_lists {}
# Get a list with its chats (read-only tool)
get_chat_list { name: "Family" }
# Create a new list
manage_lists { action: "create", name: "Work", conversation_id: "5511999887766@c.us" }
# Add a chat to a list
manage_lists { action: "add_chat", name: "Family", conversation_id: "5511999887766@c.us" }
# Remove a chat from a list
manage_lists { action: "remove_chat", name: "Family", conversation_id: "5511999887766@c.us" }
# Delete a list
manage_lists { action: "delete", name: "Old List" }Parameter | Type | Description |
| string |
|
| string | List ID |
| string | List name (for create/edit, or to resolve by name) |
| string | Chat ID(s) to add/remove |
manage_chat
Manage chat state — archive, unarchive, mark as read/unread, pin, unpin, mute, unmute, set/clear draft messages.
# Archive a chat
manage_chat { action: "archive", conversation_id: "5511999887766@c.us" }
# Mark as read
manage_chat { action: "mark_read", conversation_id: "5511999887766@c.us" }
# Pin a chat (max 3)
manage_chat { action: "pin", conversation_id: "5511999887766@c.us" }
# Mute for 1 week
manage_chat { action: "mute", conversation_id: "5511999887766@c.us", mute_duration: "1w" }
# Set a draft message
manage_chat { action: "set_draft", conversation_id: "5511999887766@c.us", text: "Hey, I'll call you back" }Parameter | Type | Description |
| string |
|
| string | The conversation ID |
| string |
|
| string | Draft text. Required for |
manage_reminders
Create, change, complete or delete personal reminders. Stored in the cloud and delivered via the Kaption extension.
Reading them is list_reminders / get_reminder (read-only tools).
# List active reminders (read-only tool)
list_reminders {}
# Create a reminder
manage_reminders { action: "create", title: "Follow up with client", datetime: "2026-03-07T14:00:00Z" }
# Complete a reminder
manage_reminders { action: "complete", id: "rem_abc123" }
# List all including completed
list_reminders { filter: "all" }Parameter | Type | Description |
| string |
|
| string | Reminder ID (for update/delete/complete/uncomplete) |
| string | Reminder text (max 800 chars, no newlines) |
| string | ISO 8601 datetime |
| string |
|
manage_scheduled_messages
Schedule messages to be sent automatically at a specific time, in one of two modes:
bot(default) — sent from Kaption's WhatsApp number, not yours. Stored in Kaption's cloud and sent even when your computer is off. One-to-one chats only; one line, up to 800 characters.local("From this computer") — sent from your own WhatsApp number, as you, while this computer and WhatsApp are open. Nothing leaves your device. Kaption keeps it within safe limits automatically (a few messages an hour and a day, minutes apart, only to chats where the other person has written, at most 3 a day to groups) and refuses what doesn't fit, with the reason. The only mode that can send to groups (ones you can post in and posted in within the last 30 days). Text only. A message whose time passes while the computer is off is marked missed, never sent late on its own.
The local mode has to be turned on by you in Kaption first (the "From this computer" option in the scheduling picker, after reading the limits and risks). An AI assistant can't turn it on; until you do, local requests are refused with (reason: no-consent). It is also rolled out gradually: where it isn't available yet, local requests are refused with (reason: flag-off) and the bot works as before.
Reading them is list_scheduled_messages / get_scheduled_message (read-only tools).
# List pending messages of both modes (each one has a "mode") — read-only tool
list_scheduled_messages {}
# Schedule with the Kaption bot
manage_scheduled_messages { action: "create", message: "Hey, just following up!", datetime: "2026-03-07T09:00:00Z", conversation_id: "5511999887766@c.us" }
# Schedule from your own number, or to a group
manage_scheduled_messages { action: "create", mode: "local", message: "Running 10 min late", datetime: "2026-03-07T09:00:00-03:00", conversation_id: "5511999887766@c.us" }
manage_scheduled_messages { action: "create", mode: "local", message: "Standup moved to 10", datetime: "2026-03-07T09:00:00Z", conversation_id: "120363000000000000@g.us" }
# Cancel a scheduled message
manage_scheduled_messages { action: "delete", id: "msg_abc123" }
manage_scheduled_messages { action: "cancel", mode: "local", id: "3f2c…" }Parameter | Type | Description |
| string |
|
| string |
|
| string | Scheduled message ID (for update/delete/cancel/remove/send_now) |
| string | Chat to send to (for create): a person, or a group with |
| string | Message text. Bot: max 800 chars, no newlines. Local: up to 2000 chars |
| string | ISO 8601 datetime when the message should be sent |
| string | Bot only: |
download_media
Download and decrypt media from a message (images, videos, audio, documents).
Parameter | Type | Description |
| string | The message ID containing media |
| string | The conversation the message belongs to |
Returns base64-encoded media data with mimetype, size, duration, and caption.
manage_notes
Write a contact's note (WhatsApp Business). Reading it is get_contact_note { contact_id } (read-only tool).
Parameter | Type | Description |
| string |
|
| string | The contact ID |
| string | Note text |
Read-only tools
Claude's and Google's connector reviews require reads and writes in separate tools, so each manage_* tool only
writes and these tools read (each carries readOnlyHint: true). The hub sends them to the extension as the matching
manage_* call, so every Kaption version answers them.
Tool | Reads | Parameters |
| Personal reminders |
|
| One reminder |
|
| Scheduled messages, both modes |
|
| One scheduled message |
|
| Custom chat lists (personal accounts) | — |
| One list and its chats |
|
| A contact's note (Business accounts) |
|
call_recordings
Read WhatsApp call recordings made by the Kaption extension and their transcripts, with every word timed. Each recording names its conversation (the other person, or the group for a group call). Recordings of locked chats are never returned.
Parameter | Type | Description |
| string |
|
| string | Recording ID (required for |
| string | Text to find in names and transcripts (required for |
| string | Only recordings of this contact or group |
| string | ISO 8601 date range of when the call started |
| number | Max recordings (default 20, max 100) |
| boolean | For |
get_api_info
Get HTTP REST API connection info for programmatic access without MCP overhead. Returns the URL, the available endpoints and where the auth token file is (~/.kaptionai/mcp-auth-token, readable only by your user). The token itself is never returned, so it never lands in a chat transcript.
Multi-account support
Multiple WhatsApp accounts can be connected simultaneously (e.g. personal + business). Use target_session on any tool to route to a specific account. Query entity: "session" to see all connected accounts and their session IDs.
Multi-instance support
Multiple AI tools can share the same extension connection. The first instance starts a WebSocket hub; subsequent instances auto-detect the existing hub and relay through it. If the hub stops, a relay automatically promotes itself.
WebMCP support
Kaption is WebMCP-ready. On browsers that support the W3C WebMCP draft (navigator.modelContext, Chrome 146+), the extension automatically registers all tools with the browser's native AI tool registry. This means browser-based AI agents can discover and invoke Kaption tools without any MCP server or WebSocket connection — zero configuration.
When WebMCP is available, the extension registers tools prefixed with kaption_ (e.g. kaption_query, kaption_manage_chat) complete with JSON Schema input definitions and readOnlyHint annotations. The tools use the same handlers as the MCP server, so behavior is identical across both paths.
Security
Localhost only — no cloud relay, no external connections
No messages sent — AI assistants can read, organize, schedule, and draft, but never send messages directly
Locked chats hidden — WhatsApp-locked conversations are excluded from all queries
Feature-gated — MCP bridge must be explicitly enabled in the extension
Business features gated — labels and notes require a WhatsApp Business account
Rate limited — draft messages limited to 10 conversations per 5-minute window; write operations include random delays
License
BSL 1.1 — free to use, converts to MIT after 4 years.
One-time attachments (when sending from this computer is on for the account)
Use create_attachment_upload({name,mime,size,target_session?}), PUT the file bytes to
its uploadUrl within 15 minutes, then send attachment:{ref:attachmentRef} within one
hour. The selected Kaption account consumes the ref once and stores it locally, so a
schedule days later does not depend on the temporary upload. If a download fails after
consumption, create a new upload. Maximum size: 8 MiB; image, document, audio or video.
On this local hub, attachment:{path:"/absolute/file.pdf"} uploads automatically; optional
name and mime override the filename/type. Paths must name regular files. The cloud
relay and WebMCP do not accept paths. Arbitrary URLs are never accepted. Existing small
inline {name,mime,size,dataB64} uploads continue to work. All sends still require
sending from this computer to be turned on for the account, consent and ask-first rules. No assistant can accept consent.
Available Tools
18 toolscall_recordingsARead-only
Read WhatsApp call recordings made by the Kaption extension and their transcripts, with every word timed. Each recording names its conversation (the other person, or the group for a group call), so it links to query, get_contact and get_group. Recordings of locked chats are never returned.
Actions: list - Recordings, newest first (optional conversation_id, date_from, date_to, limit) get - One recording and its transcript: turns by speaker ("you" or "contact") with start/end seconds (requires id; include_words adds each word's timing) search - Recordings whose name or transcript matches the search text, with the matching lines (requires search; same filters as list)
Examples: Recent calls: { action: "list", limit: 10 } Calls with one person: { action: "list", conversation_id: "5491157390064@c.us" } Read a transcript: { action: "get", id: "1790000000000-a1b2c3d4" } What was said about the budget: { action: "search", search: "budget" }
Inputs: action (required), id, limit, search, +5 more.
download_mediaARead-only
Download media content (image, video, audio, document, sticker) from a WhatsApp message. Returns base64-encoded media data with metadata.
Get message_id from query results. The message must be a media message.
Examples: Download an image: { message_id: "true_123@c.us_3EB0...", conversation_id: "123@c.us" }
Inputs: message_id (required), conversation_id (required), target_session.
export_contactsARead-only
Export all WhatsApp contacts as CSV (RFC 4180) or JSON. Deduped, sorted alphabetically by display name. Default format is CSV. JSON projects the requested fields. Available fields: jid, phone, name, pushname, is_my_contact, is_business. WhatsApp "@lid" privacy identifiers (opaque, non-dialable) are always excluded — only real phone-backed contacts are returned.
Examples: CSV all fields: { format: "csv" } JSON name + phone: { format: "json", fields: ["name", "phone"] } Filtered CSV: { format: "csv", query: "Argentina" } Saved contacts only: { format: "csv", is_my_contact: true }
Inputs: query, fields, format, is_my_contact.
get_analyticsARead-only
Get WhatsApp analytics data: KPIs, activity patterns, rankings, response times, call stats, labels, emojis, words, countries, and more. Supports section-based drill-down, date range filtering, chat/label/community filters, pagination, and chat/contact exports.
Start with section="overview" (default) for a compact summary, then drill into specific sections.
Sections: overview — High-level summary with top 5 chats (~5KB) kpis — Core + account KPIs + account overview activity — Daily/hourly/weekday/monthly + sent/received + message types rankings — Top chats/groups/DMs/senders (paginated) response_times — Avg/median/fastest/slowest + by-hour + by-chat calls — Call statistics (total/answered/missed/video/voice) labels — Labels (business) or Lists (personal) with chat counts emojis — Top emojis (paginated) words — Top words (paginated) countries — Contact country distribution silences — Longest-inactive chats channels — Newsletter/channel details + subscriber counts communities — Community details + sub-groups conversation_starters — Who starts conversations, night msgs, unanswered streaks — Current/longest streak + last active date gaps — Conversation gaps (>1 day silence periods) organization — Pinned/archived/muted/unread chat lists chat_detail — Full analytics for ONE specific chat (requires chat_id) export_chat — Export chat messages in format (requires chat_id + format) export_contacts — Export contacts in format (requires format) community_growth — Community member count history over time channel_growth — Channel subscriber count history over time
Examples: Overview: {} Rankings: { section: "rankings", chat_type: "group", limit: 5 } Filter by label: { section: "activity", label: "Family" } Chat detail: { section: "chat_detail", chat_id: "120363406792713578@g.us" } Export CSV: { section: "export_chat", chat_id: "...", format: "csv", limit: 100 } Export contacts: { section: "export_contacts", format: "vcf" }
Inputs: label, limit, query, format, +10 more.
get_api_infoARead-only
Get HTTP REST API connection info for programmatic access without MCP overhead. Returns URL, auth token, and available endpoints.
Inputs: no named parameters.
get_contactARead-only
Look up a single WhatsApp contact by JID or phone number. Pass either parameter — both work. If multiple raw contacts share the same phone (label dupes), the saved variant wins.
Examples: By JID: { jid: "5491155550001@c.us" } By phone with +: { phone: "+5491155550001" } By phone bare: { phone: "5491155550001" }
Inputs: jid, phone.
get_contact_groupsARead-only
List the WhatsApp groups a specific contact participates in. Reads from cached chat metadata — no network.
Examples: Groups for contact: { jid: "5491155550001@c.us" }
Inputs: jid (required).
get_groupARead-only
Fetch a single group with a LIVE participant list. Forces Store.GroupMetadata.update() against the WA backend before reading, so the result reflects current membership including recent joins/leaves.
Use this when accuracy matters; use list_groups for browsing.
Examples: Live group fetch: { jid: "120363421729019499@g.us" }
Inputs: jid (required).
list_contactsARead-only
List WhatsApp contacts from the encrypted DBR3 cache (no network). Results are deduplicated by phone number — the same person across multiple labels collapses to one row. Saved contacts sort before unsaved, then alphabetically by display name. WhatsApp "@lid" privacy identifiers (opaque, non-dialable) are always excluded — only real phone-backed contacts are returned.
Examples: All contacts: {} Saved contacts only: { is_my_contact: true } Search by name: { query: "Maria" } Page 2 of 50: { limit: 50, offset: 50 }
Inputs: limit, query, offset, is_my_contact.
list_groupsARead-only
List all WhatsApp groups the user belongs to. Reads from the cache — no network.
For a live snapshot of a single group, use get_group (it forces a fresh GroupMetadata.update).
Examples: All groups: {} Search by group name: { query: "family" } Top 10: { limit: 10 }
Inputs: limit, query.
manage_chatA
Manage chat state: archive, unarchive, mark as read/unread, pin, unpin, mute, unmute, set/clear draft.
Actions: archive - Archive a conversation unarchive - Unarchive a conversation mark_read - Mark a conversation as read mark_unread - Mark a conversation as unread pin - Pin a conversation (max 3 pinned) unpin - Unpin a conversation mute - Mute notifications (use mute_duration for duration) unmute - Unmute notifications set_draft - Set a draft message in the compose box (requires text) clear_draft - Clear the draft message
Inputs: action (required), conversation_id (required), text, mute_duration, +1 more.
manage_labelsADestructive
Manage WhatsApp Business labels. Requires a WhatsApp Business account.
Actions: add - Add a label to a conversation (requires label_name/label_id + conversation_id) remove - Remove a label from a conversation (requires label_name/label_id + conversation_id) create - Create a new label (requires label_name) delete - Delete a label (requires label_name or label_id)
Inputs: action (required), label_id, label_name, conversation_id.
manage_listsADestructive
Manage personal chat lists (custom lists). These are the personal account equivalent of Business labels. Lists allow organizing chats into custom categories like "Family", "Work", etc. Not available on all accounts — check with action "list" first to see if lists are enabled.
Actions: list - List all custom lists (also shows if feature is enabled) get - Get a list and its associated chats (requires id or name) create - Create a new list (requires name, optional conversation_id for initial chats) edit - Edit a list name or replace its chats (requires id or name) delete - Delete a list (requires id or name) add_chat - Add conversation(s) to a list (requires id/name + conversation_id) remove_chat - Remove conversation(s) from a list (requires id/name + conversation_id)
Examples: List all: { action: "list" } Create: { action: "create", name: "Family", conversation_id: ["number@c.us"] } Add chat: { action: "add_chat", name: "Family", conversation_id: "number@c.us" }
Inputs: action (required), id, name, target_session, +1 more.
manage_notesAIdempotent
Manage contact notes. Requires a WhatsApp Business account with notes enabled.
Actions: get - Read the note for a contact set - Write/update the note for a contact
Inputs: action (required), contact_id (required), note.
manage_remindersADestructive
Manage personal reminders. Reminders are stored in the cloud and trigger notifications via the Kaption extension.
Actions: list - List all reminders get - Get a specific reminder by ID create - Create a new reminder (requires title + datetime) update - Update a reminder (requires id, optional title/datetime) delete - Delete a reminder (requires id) complete - Mark a reminder as completed (requires id) uncomplete - Mark a reminder as not completed (requires id)
Examples: List all: { action: "list" } Create: { action: "create", title: "Follow up with client", datetime: "2026-03-07T14:00:00Z" } Complete: { action: "complete", id: "rem_abc123" }
Inputs: action (required), id, title, filter, +3 more.
manage_scheduled_messagesADestructive
Schedule WhatsApp messages to be sent automatically at a specific time, in one of two modes: bot (default) - sent from Kaption's WhatsApp number, not the user's own. Stored in Kaption's cloud and sent even when this computer is off. One-to-one chats only (no groups); one line, max 800 characters. local ("From this computer") - sent from the user's own WhatsApp number, as them, while this computer and WhatsApp are open. Stays on this device. Kaption keeps it within safe limits automatically (a few messages an hour and a day, minutes apart, only to chats where the other person has written, at most 3 a day to groups) and refuses what does not fit. The only mode that can send to groups (ones the user can post in and posted in within 30 days). Text only. A message whose time passes while this computer is off is missed, never sent late on its own. The local mode must first be turned on by the user in Kaption (its "From this computer" option, after reading the risks); an assistant cannot turn it on. A refused local request says why and ends with a reason code, e.g. "(reason: per-day)".
Actions: list - List scheduled messages of both modes (each has "mode"); pass mode to list only one get - Get a specific scheduled message by ID create - Schedule a new message (requires message + datetime + conversation_id) update - Change the message and/or datetime (requires id) delete - Cancel/delete a scheduled message (requires id); in local mode it cancels a waiting message and removes a finished one cancel - Local mode only: cancel a waiting, missed or failed message remove - Local mode only: remove a finished message from the list send_now - Local mode only: send a missed or failed message now (still within the limits) Pass mode "local" for every action on a local message.
Examples: List all: { action: "list" } Schedule (Kaption bot): { action: "create", message: "Hey, just following up!", datetime: "2026-03-07T09:00:00Z", conversation_id: "5491157390064@c.us" } Schedule from the user's own number: { action: "create", mode: "local", message: "Running 10 min late", datetime: "2026-03-07T09:00:00-03:00", conversation_id: "5491157390064@c.us" } Schedule to a group: { action: "create", mode: "local", message: "Standup moved to 10", datetime: "2026-03-07T09:00:00Z", conversation_id: "120363000000000000@g.us" } Cancel: { action: "delete", id: "msg_abc123" }
Inputs: action (required), id, mode, filter, +5 more.
queryARead-only
Query WhatsApp data: conversations, contacts, messages, transcriptions, labels, and communities. Supports listing, searching, filtering, and looking up by ID.
IMPORTANT: Multiple WhatsApp accounts may be connected (e.g. personal + business). Always query entity="session" FIRST to see all connected accounts and their session IDs. Then use target_session to route queries to the correct account. Each account has different conversations, contacts, and messages.
HOW TO READ MESSAGES: To get messages from a specific conversation, pass its id (e.g. "5491157390064@c.us"). This returns the conversation info WITH its messages. Use limit to control how many. Do NOT use entity="messages" for this — that is for global text search only.
AUDIO TRANSCRIPTIONS: To get audio transcriptions, use entity="transcriptions" with an optional query. Or pass a conversation id to see messages (audio messages include transcription text).
Examples: List sessions: { entity: "session" } List conversations: {} Target specific account: { entity: "conversations", target_session: "sess_abc123" } Read messages: { id: "5491157390064@c.us" } Read last 100 msgs: { id: "5491157390064@c.us", limit: 100 } Search globally: { query: "meeting" } Search in chat: { id: "5491157390064@c.us", query: "meeting" } Unread conversations: { unread: true } Search contacts: { query: "Alice", entity: "contacts" } List labels: { entity: "labels" } Filter by label: { label: "Important", entity: "conversations" } List communities: { entity: "communities" } Filter by community: { community: "My Community", entity: "conversations" } Find which groups a contact is in: { id: "5491157390064@c.us", entity: "contacts", include_participants: true } List members of a group: { entity: "contacts", group: "120363421729019499@g.us" }
Inputs: id, list, after, group, +11 more.
summarize_conversationCRead-only
Get or generate a summary of a conversation
Inputs: conversation_id (required), message_count, target_session.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 18 tools
Most tools have distinct purposes, but `query` is a mega-tool whose entities (contacts, conversations, groups, labels, communities) overlap heavily with specialized tools like `list_contacts`, `get_contact`, `get_contact_groups`, `list_groups`, and `get_group`. Additionally `get_analytics` embeds an `export_contacts` section that duplicates the standalone `export_contacts` tool, and `manage_labels` vs `manage_lists` are parallel business/personal variants.
Strong verb_noun pattern throughout (get_*, list_*, export_*, manage_*, download_*, summarize_*). Two deviations: the bare `query` with no noun, and the noun-only `call_recordings` with no verb, but overall the convention is predictable.
18 tools is on the heavier side but reasonable given the breadth of the domain (messaging, contacts, groups, analytics, media, reminders, scheduling, lists, labels, notes, recordings). Each tool maps to a coherent capability area.
Broad lifecycle coverage across reads, search, media download, chat state, labels/notes/lists, reminders, scheduling, analytics, and call recordings. Notable gaps: no direct/immediate message-send tool (only scheduling) and no group-membership modification (add/remove participants), though most workflows can be worked around.
Maintenance
Related MCP Connectors
Connect your own WhatsApp number to Cursor, Claude and ChatGPT: catch up, search, send replies.
Your own WhatsApp in Claude and ChatGPT: read chats, draft replies, send messages you approve.
Ask questions across your WhatsApp inbox from Claude, ChatGPT, Cursor or any MCP client.
WhatsApp for Claude, ChatGPT or any AI agent: search, reply and send. Personal or Business API.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables seamless integration with WhatsApp through the Model Context Protocol, featuring multi-user support and Supabase cloud storage for persistent message history and media. Users can send messages, search chat records, and manage contacts across platforms like Claude Desktop, Cursor, and OpenClaw.-
- FlicenseNot gradedqualityDmaintenanceSend WhatsApp messages, manage templates, and run broadcast campaigns from AI coding tools. Works with Cursor, Claude Code, and Codex via npx @gaviwhatsapp/mcp.-
- AlicenseBqualityBmaintenanceTurns Claude Code, Claude Desktop, Cursor, Windsurf or ChatGPT into a WhatsApp operator that knows your customers, your templates, your wallet, and your funnel.2921 npm3MIT
- AlicenseNot gradedqualityBmaintenanceProvides Claude with read-only access to your WhatsApp chat history entirely on your local machine, enabling natural language search, summarization, and retrieval of messages without sending data to the cloud.14 npmMIT