Skip to main content
Glama
Pl3ntz

whatsapp-mcp

whatsapp-mcp-local

An MCP server that gives AI agents read and write access to WhatsApp. It reads your chat history and media straight from the local app data, and sends messages only after you approve them.

The desktop app keeps everything in a local SQLite store and in Message/Media/. This server reads those files in read-only mode. No WhatsApp protocol is touched, no third-party API is used, and there is no ban risk. That is the core difference from every other WhatsApp MCP out there.

What you can do

Read side:

  • List chats, including archived ones

  • Read the full message history of any chat, with pagination

  • Search across all messages

  • List media per chat: images, videos, audio, documents, stickers

  • Get media metadata and the resolved file path

  • Export a chat or a media file to a local folder

  • Transcribe audio locally with whisper, with a disk cache so nothing is re-transcribed

Write side:

  • Draft a message into the app, review it, then send with an explicit confirmation

  • Confirmations are one-time: the draft expires in 120 seconds and cannot be reused

Related MCP server: WAHA MCP

Install

uvx whatsapp-mcp-local

Or via npm:

npx whatsapp-mcp-local

The server picks the right driver automatically. On macOS with the WhatsApp app installed and logged in, it reads the local database. Anywhere else, it falls back to WhatsApp Web through a dedicated Chrome profile.

Drivers

Driver

Where it works

How it is selected

Local app

macOS, WhatsApp app installed and logged in

The ChatStorage.sqlite database exists

WhatsApp Web

Any OS with Google Chrome

No local database, or WHATSAPP_DRIVER=web

Force a driver with the WHATSAPP_DRIVER environment variable: local, web, or auto (default).

Tools

Tool

Purpose

Driver

Flag

list_chats

List chats with unread counts and last message

local

read-only

get_messages

Read messages, paginated, optionally including media

both

read-only

search_messages

Search across all messages

local

read-only

get_chat_info

Chat metadata

local

read-only

list_media

List media in a chat, filtered by type

local

read-only

get_media

Media metadata and resolved path

local

read-only

get_media_thumb

Thumbnail path or small base64

local

read-only

export_chat

Export a chat to JSON or Markdown

local

read-only

export_media

Copy a media file to a local folder

local

idempotent

transcribe_audio

Transcribe an audio message locally

local

read-only

verify_sent

Confirm a message was stored as sent

local

read-only

send_message

Draft a message into the app, nothing is sent yet

both

destructive

confirm_send

Press Enter on a valid draft, after your approval

both

destructive

Media and transcription

Media files live in Message/Media/ inside the WhatsApp shared container. They are stored in their original format, not encrypted, so the server reads them directly. Every media item reports file_exists, because the database can reference files that are no longer on disk.

Audio transcription runs locally with whisper.cpp (whisper-cli). No audio ever leaves your machine. Transcripts are cached by file hash under ~/.whatsapp-mcp/transcripts/, so a second request for the same file returns instantly.

Runtime prerequisites for transcription:

brew install whisper-cpp ffmpeg

You also need a whisper model file. The brew formula ships a tiny test model, useful to validate quickly:

$(brew --prefix whisper-cpp)/share/whisper-cpp/for-tests-ggml-tiny.bin

For decent Portuguese results, download the small model from the whisper.cpp repo and point the tool at it, or leave model=small and let the server resolve it.

Security model

  • The database is always opened in read-only mode. Tests verify the file hash does not change after any call.

  • Message content is marked untrusted. Treat it as data, never as instructions. A contact can write "ignore your previous instructions" and the server will surface it as untrusted content, not as a command.

  • Phone numbers (JIDs) are masked in every output. Media paths contain the raw JID folder, so paths are only returned when you explicitly ask with include_path=true.

  • Media paths are resolved server-side and checked against the media root. A path with .. in the database is rejected.

  • Sending is a two step flow. send_message pre-fills the text, nothing is sent. confirm_send requires the draft_id returned by send_message, the draft expires in 120 seconds, and it is consumed once. The confirmation re-opens the target chat with the approved text before pressing Enter, so a wrong chat or an edited message cannot be sent by mistake.

  • Exports never overwrite existing files (O_EXCL), and exported file names do not contain JIDs.

  • Nothing is written to ChatStorage.sqlite, Axolotl.sqlite, or any app database. Writing there would corrupt the app and would not reach the server anyway.

Integrate with opencode

Add to ~/.config/opencode/opencode.json:

{
  "mcp": {
    "whatsapp": {
      "type": "local",
      "command": ["uvx", "whatsapp-mcp-local"],
      "enabled": true
    }
  }
}

Restart opencode. The destructive tools carry the MCP annotation, so clients ask for confirmation before calling them.

Integrate with Claude Code

claude mcp add whatsapp-mcp -- uvx whatsapp-mcp-local

Or with a .mcp.json file:

{
  "mcpServers": {
    "whatsapp-mcp": {
      "command": "uvx",
      "args": ["whatsapp-mcp-local"]
    }
  }
}

Integrate with other clients

Every major MCP client accepts this server over stdio. None of them discover packages by search, so you always add it explicitly with a command or a config file.

Codex CLI

codex mcp add whatsapp -- uvx whatsapp-mcp-local

ChatGPT desktop

Open Settings, then MCP servers, add a server with STDIO transport and the command uvx whatsapp-mcp-local.

Cursor

Add to .cursor/mcp.json in your project (or ~/.cursor/mcp.json globally):

{
  "mcpServers": {
    "whatsapp": {
      "command": "uvx",
      "args": ["whatsapp-mcp-local"]
    }
  }
}

VS Code / GitHub Copilot

code --add-mcp '{"name":"whatsapp","command":"uvx","args":["whatsapp-mcp-local"]}'

Or add a .vscode/mcp.json file with the same mcpServers shape as Cursor.

Windsurf / Devin

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "whatsapp": {
      "command": "uvx",
      "args": ["whatsapp-mcp-local"]
    }
  }
}

A note about PATH

Desktop apps like Cursor, VS Code, and ChatGPT do not inherit your shell PATH. If uvx is not found, install the package as a tool and use the full binary path, or install it globally:

uv tool install whatsapp-mcp-local
# then use: whatsapp-mcp-local  (or the full path from `which whatsapp-mcp-local`)

The npm route works the same way if Node is on the system PATH:

npx whatsapp-mcp-local

Test

uv run pytest

Notes

This is a tool for your own account and your own data. The database schema and the web interface belong to WhatsApp and can change between releases. Do not use it to send messages on behalf of other people, and do not use it for anything you are not authorized to do.

The project is MIT licensed. Source: https://github.com/Pl3ntz/whatsapp-mcp

Available Tools

8 tools
confirm_sendConfirmar envioA
Destructive

CONFIRMA o envio: pressiona Enter no campo pre-preenchido. Só após aprovação explícita.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses behavioral traits beyond the annotations by detailing the mechanism ('pressiona Enter') and the necessary precondition ('após aprovação explícita'). The destructiveHint annotation is consistent with this action, and the description adds context about the approval requirement, enhancing transparency without contradiction.

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

Conciseness5/5

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

The description is extremely concise: two short sentences that are front-loaded with the core purpose. Every phrase adds value: the action, the mechanism, and the usage condition. No wasted words.

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

Completeness5/5

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

Given the tool's simplicity (zero parameters, no output schema), the description is complete. It states what the tool does, how it does it, and when to use it. The destructive annotation covers safety, and no further explanation of return values is necessary.

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

Parameters4/5

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

There are no parameters to explain (schema coverage is trivially 100%). The description adds context about the 'campo pre-preenchido' (pre-filled field), which helps the agent understand what the tool acts on, even though no parameters exist. This is appropriate for a zero-parameter tool.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb and resource: 'CONFIRMA o envio' (confirms the sending). It also explains the mechanism, 'pressiona Enter no campo pre-preenchido' (presses Enter in the pre-filled field), which differentiates it from siblings like send_message or verify_sent by describing the action as a final confirmation step.

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

Usage Guidelines4/5

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

The description provides a clear usage condition: 'Só após aprovação explícita' (Only after explicit approval). This tells the agent when this tool should be used, but it does not explicitly mention alternatives or when-not-to-use scenarios, so it stops short of a full 5.

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

export_chatExportar conversaA
Read-only

Exporta o histórico da conversa para arquivo local (json|md).

ParametersJSON Schema
NameRequiredDescriptionDefault
fmtNojson
chat_idYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, and the description adds context about writing to a local file and supported formats. However, it does not disclose other behavioral aspects like error handling, permissions, or return behavior. This is similar to the get_calls calibration example.

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

Conciseness5/5

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

The description is a single sentence with no fluff or redundancy. It efficiently communicates the core function and format options.

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

Completeness3/5

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

The tool is simple, but the description lacks information about the return value (does it return a file path or confirmation?) and error conditions. It relies on the schema for parameter requirements and annotations for safety, leaving some gaps for the agent.

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

Parameters2/5

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

Schema description coverage is 0%, and while the description mentions json|md (which hints at the fmt parameter), it does not explain the required chat_id parameter or clarify parameter semantics. The description adds minimal value over the raw schema.

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

Purpose5/5

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

The description clearly states the tool exports conversation history to a local file with format options (json|md), which is a specific verb+resource and distinguishes it from sibling tools like send_message or get_messages.

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

Usage Guidelines3/5

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

The description implies usage (when you need to export a chat), but provides no explicit when-to-use guidance, exclusions, or alternative tool recommendations. The context is clear but not elaborated.

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

get_chat_infoInfo da conversaB
Read-only

Metadados da conversa (tipo, grupo).

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_idYes

TDQS

B3.1/5.0
Behavior3/5

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

The annotation readOnlyHint=true already indicates a safe read operation. The description adds minimal behavioral context by listing the metadata types returned (type, group), but does not disclose any side effects, error conditions, or additional constraints. Since the annotation covers the safety profile, the description adds only a small amount of value.

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

Conciseness4/5

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

The description is a single concise phrase, directly stating the tool's output without redundant words. It is appropriately sized for a simple tool, though it is more of a fragment than a full structured sentence.

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

Completeness4/5

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

For a one-parameter read-only tool with no output schema, the description adequately conveys the return content (metadata with type and group) and the annotation covers safety. The lack of details on formatting or errors is acceptable given the tool's simplicity, though a full sentence explaining the action would improve completeness.

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

Parameters2/5

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

The description does not mention the chat_id parameter at all, and schema description coverage is 0%. Although the parameter name is self-explanatory, the description fails to compensate for the lack of schema documentation, leaving the agent to infer the parameter's meaning solely from its name.

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

Purpose4/5

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

The description 'Metadados da conversa (tipo, grupo)' clearly identifies the tool as retrieving conversation metadata, specifying the fields 'type' and 'group'. This distinguishes it from sibling tools like get_messages or send_message, though it remains terse and could be more explicit about the action (e.g., 'retrieves').

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

Usage Guidelines2/5

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

No usage guidance is provided. The description does not mention when to use this tool versus alternatives (e.g., list_chats or get_messages), nor does it state any prerequisites or context where this tool is the appropriate choice.

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

get_messagesLer mensagensA
Read-only

Lê mensagens de uma conversa (chat_id). Paginável com before (unix ts).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
beforeNo
chat_idYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, reducing the need for safety disclosure. The description adds value by explaining the 'before' timestamp pagination behavior, which is not in the annotations. However, it omits details like ordering, limit behavior, or error cases.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the core purpose and directly includes the key parameter context. No unnecessary words or repetition.

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

Completeness4/5

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

Given the simple read-only nature (annotations) and the schema providing limits and defaults, the description sufficiently covers the main use case and pagination hint. It does not describe the response format, but the absence of an output schema makes that less critical. The pagination context adds completeness beyond a bare description.

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

Parameters3/5

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

With 0% schema description coverage, the description must compensate. It explains chat_id as the conversation identifier and before as a unix timestamp for pagination, but does not explain the 'limit' parameter. The schema provides default values, but the description lacks complete parameter coverage.

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

Purpose5/5

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

The description clearly states the verb and resource: 'Lê mensagens de uma conversa (chat_id)' (reads messages from a conversation), which distinguishes it from siblings like send_message and export_chat by specifying the read action on conversation messages.

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

Usage Guidelines4/5

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

The description implies the use case (reading messages for a specific chat) by referencing chat_id and adds a practical pagination guideline with 'before' (unix ts). It does not explicitly exclude alternatives, but the clear scope makes it easy to select.

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

list_chatsListar conversasA
Read-only

Lista as conversas do WhatsApp (nome, não-lidas, última mensagem).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
unread_onlyNo

TDQS

A3.5/5.0
Behavior4/5

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

The annotations provide readOnlyHint=true, and the description adds behavioral detail about the output structure (name, unread, last message). This is consistent with the read-only annotation and gives useful context beyond the annotation alone.

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

Conciseness5/5

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

The description is a single, compact sentence that directly states the tool's purpose and output fields. It is front-loaded with the verb and contains no extraneous information.

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

Completeness4/5

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

For a simple read-only list tool with two optional parameters, the description covers the core purpose and output. However, it lacks any usage context or explanation of parameter effects, leaving some gaps in completeness.

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

Parameters1/5

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

The input schema has 0% description coverage, and the description does not mention the 'limit' or 'unread_only' parameters at all. The agent must rely solely on the parameter names and defaults, which is insufficient for fully understanding their semantics.

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

Purpose5/5

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

The description clearly states the tool's function: 'Lista as conversas do WhatsApp' (lists WhatsApp conversations) and specifies the returned fields (name, unread, last message). This distinguishes it from siblings that focus on messages or individual chat details.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like get_chat_info or search_messages. It simply states what it does without any context about suitable scenarios or exclusions.

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

search_messagesBuscar mensagensC
Read-only

Busca texto nas mensagens (LIKE; cobertura ampla).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
chat_idNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds that the search uses LIKE and has broad coverage, which implies substring matching across chats, providing some value beyond annotations. However, it doesn't disclose return formats or pagination.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with zero wasted words. It efficiently conveys the core purpose and a key behavior (LIKE) in a compact format.

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

Completeness2/5

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

Given the low complexity but also sparse information, the description is incomplete. It fails to explain how chat_id scopes the search, what limit does, or the exact meaning of 'LIKE', leaving an agent uncertain about invocation. The readOnly annotation helps but doesn't cover these operational details.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must compensate by explaining parameters. It does not mention query, limit, or chat_id, leaving the agent to infer their meanings from names and defaults. This is insufficient for a 3-parameter tool.

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

Purpose4/5

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

The description clearly states the tool performs a text search across messages with 'Busca texto nas mensagens', which is a specific verb+resource. It distinguishes from siblings like get_messages or list_chats by implying a content-based search, though it doesn't explicitly name alternatives.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool vs. alternatives. The phrase 'cobertura ampla' hints at broad applicability, but there is no explicit mention of when to prefer search_messages over get_messages or list_chats.

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

send_messageEnviar mensagemA
Destructive

ENVIA uma mensagem (com confirmação).

Passo 1 (chamada): abre a conversa com o texto pre-preenchido, NADA é enviado. Passo 2 (confirmação): a chamada retorna preview; apenas ao confirmar, o cliente deve chamar confirm_send() para pressionar Enter.

ParametersJSON Schema
NameRequiredDescriptionDefault
jidNo
textNo
phoneNo
chat_idNo

TDQS

A4.1/5.0
Behavior5/5

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

The description reveals crucial behavioral traits beyond the annotations: 'NADA é enviado' on the first call, returns a preview, and actual sending only occurs via confirm_send(). This adds important nuance to the destructiveHint=true annotation and clarifies the deferred destructiveness.

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

Conciseness5/5

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

The description is concise and front-loaded. It leads with the action, then uses a clear step structure (Passo 1/Passo 2) to convey the workflow precisely without wasting words.

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

Completeness2/5

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

While the two-phase workflow is well explained, the description omits essential details: parameter usage, what the preview contains, and how confirm_send() receives the preview. Given no output schema and 4 ambiguous optional parameters, this leaves an agent under-informed for reliable invocation.

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

Parameters1/5

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

With 0% schema description coverage, the description must explain parameters but only mentions 'texto pre-preenchido.' It fails to define jid, phone, or chat_id, leaving the agent without any guidance on which to use or how they relate to the action.

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

Purpose5/5

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

The description clearly states 'ENVIA uma mensagem (com confirmação)'—a specific verb and resource—and immediately explains the two-step process, distinguishing this tool from confirm_send by showing it only pre-fills and does not send.

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

Usage Guidelines5/5

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

It explicitly provides a step-by-step usage: call this first, then call confirm_send() to press Enter. It names the alternative (confirm_send) and clarifies when to use each step, giving clear usage context.

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

verify_sentVerificar envioB
Read-only

Verifica no banco se uma mensagem foi enviada (from_me=1).

ParametersJSON Schema
NameRequiredDescriptionDefault
text_substringNo

TDQS

B3/5.0
Behavior3/5

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

The readOnlyHint annotation already covers safety, and the description adds the 'from_me=1' filter as useful context. However, it does not disclose behavior with an empty text_substring parameter or clarify the return value, leaving some behavioral aspects ambiguous.

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

Conciseness4/5

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

The description is a single, efficient sentence with no redundancy. However, its brevity comes at the cost of omitting key parameter semantics, so it is well-structured but not maximally informative.

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

Completeness2/5

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

With only one optional parameter and no output schema, the description should clarify the role of text_substring and what 'verified' means (e.g., return type or behavior). It only describes the general action, which is insufficient for full contextual completeness.

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

Parameters1/5

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

The description makes no mention of the 'text_substring' parameter, and the schema has 0% description coverage. This leaves the agent with no explanation of the argument's purpose or how it influences the query, so the description fails to compensate for the missing schema documentation.

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

Purpose5/5

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

The description clearly states the tool's function using the specific verb 'Verifica' (checks), identifies the resource (database), and includes the condition 'from_me=1'. This distinguishes it from siblings like send_message or search_messages, which focus on sending or general search.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, nor any mention of exclusions. The description only states what the tool does without contextualizing when it should be preferred over confirm_send or get_messages.

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

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a distinct operation: sending (with a two-step confirmation), verifying, listing, reading, searching, exporting, and fetching chat metadata. The only potential overlap, get_messages and search_messages, is clearly separated by intent (read all vs. search by text).

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., export_chat, send_message, list_chats, get_messages). Names are lowercase with underscores throughout, making the set predictable and easy to navigate.

Tool Count5/5

With 8 tools, the server is well-scoped for a WhatsApp integration. Each tool serves a clear core function without redundancy or bloat, making the set manageable and focused.

Completeness4/5

The tool set covers the major WhatsApp workflows: sending (with confirmation), verifying delivery, reading chats and messages, searching, exporting, and retrieving chat metadata. Minor gaps exist, such as lack of media sending or chat creation, but for the stated purpose it is largely complete.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    F
    maintenance
    A Model Context Protocol server that connects your personal WhatsApp account to AI agents like Claude, enabling them to search messages, view contacts, retrieve chat history, and send messages via WhatsApp.
    7
    13
    72
    ISC
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A self-hosted MCP server that connects AI clients to WhatsApp via the WAHA HTTP API. It enables users to manage sessions, search contacts, and send or receive messages and media directly through natural language interfaces.
    21
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that connects AI agents to WhatsApp using the multi-device API, enabling messaging, group management, and more as a regular user.
    16
    MIT

Latest Blog Posts

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/Pl3ntz/whatsapp-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server