Skip to main content
Glama
HardikCoder45

WhatsApp MCP Server

WhatsApp MCP Server

A local stdio-only MCP server for a personal WhatsApp account using WhatsApp Web QR pairing. It provides chat and media reading plus safe opt-in text and media sending. Outbound tools are disabled unless explicitly enabled and limited to an allowlisted set of chats.

Risk: this uses an unofficial WhatsApp Web library. WhatsApp may change its protocol or restrict accounts that use unofficial clients. Use only with your own account, keep session state private, and prefer a separate account for experimentation.

Install

npm install
cp .env.example .env
npm run build

Set WHATSAPP_ALLOWLIST in .env to comma-separated WhatsApp JIDs. It is required for send_message and send_media; read tools remain available with an empty allowlist. Keep outbound files in WHATSAPP_OUTBOUND_MEDIA_DIRS (default: ./outbox).

Related MCP server: WhatsApp MCP

Pair

npm start

On first launch the server writes whatsapp-qr.png locally with mode 0600. Scan it from WhatsApp: Linked devices → Link a device. The local auth directory and media directories are created with mode 0700.

The process speaks MCP over stdin/stdout. Status and errors use stderr only. Do not expose this process behind HTTP or a network socket.

MCP tools

  • connection_status — pairing/connection state and local QR location

  • list_chats — cached chats

  • search_messages — text search over the local session cache

  • read_messages — recent cached messages for an allowlisted chat

  • download_media — save a cached allowlisted message attachment locally

  • fetch_all_chats — list every chat in the local session cache

  • fetch_message_history — page older messages for an allowlisted chat via Baileys fetchMessageHistory

  • send_message — send text to an allowlisted chat (requires WHATSAPP_SENDING_ENABLED=true)

  • send_media — send an image, video, audio, document, or sticker from an approved local file (requires WHATSAPP_SENDING_ENABLED=true)

The cache starts filling after WhatsApp history/message events arrive. It is intentionally not a full archive. fetch_message_history can pull older messages on demand, but only while the WhatsApp socket is connected.

MCP client configuration

{
  "mcpServers": {
    "whatsapp-local": {
      "command": "node",
      "args": ["/absolute/path/to/whatsapp-mcp-server/dist/index.js"],
      "env": {
        "WHATSAPP_ALLOWLIST": "1234567890@s.whatsapp.net",
        "WHATSAPP_SENDING_ENABLED": "true",
        "WHATSAPP_OUTBOUND_MEDIA_DIRS": "/absolute/path/to/whatsapp-mcp-server/outbox"
      }
    }
  }
}

Safety controls

  • Stdio transport only; no HTTP listener.

  • Sending is disabled by default. send_message and send_media require WHATSAPP_SENDING_ENABLED=true and a non-empty WHATSAPP_ALLOWLIST.

  • Send tools are gated at call time, so a config typo cannot silently enable them.

  • Outbound media must resolve to a regular file within WHATSAPP_OUTBOUND_MEDIA_DIRS and stay below WHATSAPP_MAX_OUTBOUND_MEDIA_BYTES (64 MiB default).

  • Outbound sends have a separate rate limit (default: 10/minute) independent of read limits.

  • Input validation via Zod on every tool.

  • Per-process read rate limit (default: 30 tool calls/minute).

  • Result caps (default: 50) and local allowlist support.

  • Auth files, QR image, downloaded media, outbound files, .env, build output, and logs are gitignored.

  • Sensitive files/directories are written with 0600/0700 modes where created by this service.

Verify

npm run check
npm test

License

MIT. See LICENSE.

Viewing the QR code

The QR image is written to the local whatsapp-qr.png path. Attach or upload that image in your MCP client UI after launching the server. The QR expires quickly; call connection_status after scanning to confirm the connection state is connected.

Whatsapp-Mcp

Available Tools

9 tools
connection_statusB

Show local pairing and connection state. QR is written to the configured local file.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose a real side effect — a QR code is written to a configured local file — which is valuable behavioral information an agent would not otherwise know. However, it says nothing about auth/session requirements, whether the call blocks while waiting for pairing, or whether the operation is read-only in any meaningful sense.

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

Conciseness5/5

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

Two short sentences, no filler, and the core purpose is front-loaded ahead of the side-effect detail. Every sentence contributes something.

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

Completeness3/5

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

For a simple zero-parameter status tool this is close to adequate, but with no output schema and no annotations the description should at least sketch what state values can come back or where the 'configured local file' path is set. Those gaps are minor but real.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool is 4. The mention of a 'configured local file' hints at external configuration but does not map to any input.

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

Purpose4/5

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

States a specific verb and resource: 'Show local pairing and connection state.' The domain (pairing/connection) is clearly distinct from every sibling, which all deal with chats, messages, or media. It stops short of explicitly naming an alternative or sibling, so it lands at 4 rather than 5.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no mention of alternatives such as the chat/message tools. The agent must infer that this is the tool to call to check or establish pairing, and whether it should be called before other operations is left unstated.

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

download_mediaB

Download media from a locally cached allowlisted message to the configured local directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYes
messageIdYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It adds real behavioral context by naming the destination ('configured local directory') and source constraints (cached, allowlisted), but says nothing about overwrite behavior, failure modes, or required permissions for a filesystem-writing operation.

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

Conciseness5/5

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

A single front-loaded sentence with the verb first and zero filler. Every clause (source constraints, destination) carries information.

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?

There is no output schema, so the description should state what is returned (e.g., a file path or bytes) and how failures behave, but it does neither. Combined with zero parameter documentation, an agent lacks enough to invoke this reliably.

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% for two required parameters, so the description must compensate. It only alludes vaguely to 'message' and 'directory' and never maps to chatId or messageId or explains their format, leaving both required params undocumented.

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

Purpose4/5

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

States a specific verb and resource ('Download media') plus the scope constraint ('from a locally cached allowlisted message'), which clearly distinguishes it from the send_media sibling. It stops short of naming an alternative, so it is clear but not sibling-routing.

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

Usage Guidelines3/5

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

The phrase 'locally cached allowlisted message' implies the precondition for use (the message must already be in the local cache and the chat/media allowlisted), but there is no explicit when-to-use versus send_media or when-not guidance. Usage is implied rather than stated.

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

fetch_all_chatsB

List ALL chats visible in the local session cache (not capped by the default list).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose two useful traits: results come from a 'local session cache' and the result set is uncapped. However, it omits the practical consequences of an unbounded fetch (volume, performance, pagination) and whether the cache can be stale relative to server state.

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

Conciseness5/5

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

A single sentence with the differentiator front-loaded and zero filler. Nothing to trim and nothing buried.

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

Completeness3/5

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

For a simple zero-required-parameter read tool with no output schema, the description covers the core purpose, but it leaves the one optional parameter unexplained and does not address the sibling list_chats it is clearly meant to complement. Adequate but with visible gaps.

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%, so the description must explain the single 'limit' parameter, and it does not mention it at all. Worse, the headline framing 'List ALL ... not capped' sits in tension with a limit parameter capped at 10000, so the agent gets no guidance on how limit interacts with the 'ALL' framing.

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

Purpose4/5

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

States a clear verb ('List') and resource ('chats') plus the scope qualifier 'ALL ... not capped by the default list'. It implicitly distinguishes itself from the sibling list_chats via the 'default list' reference, though it never names that sibling outright.

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 parenthetical '(not capped by the default list)' implies when this tool is preferred — when the default capped listing is insufficient — but it never says to use list_chats otherwise, nor does it name any alternative. Usage is inferable rather than stated.

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

fetch_message_historyA

Pull older messages for an allowlisted chat using Baileys fetchMessageHistory. Use beforeMessageId to page backward.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
chatIdYes
beforeMessageIdNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the 'allowlisted chat' constraint and names the underlying mechanism (Baileys fetchMessageHistory), but says nothing about pagination termination, limits, failure behavior, or what happens when beforeMessageId is omitted.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and scope, followed by the key paging instruction. No filler.

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

Completeness3/5

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

For a 3-param tool with no annotations, no output schema, and 0% parameter coverage, the description covers the essential paging flow but omits limit semantics and any return/behavioral detail. Adequate but with clear gaps.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate. It explains beforeMessageId's purpose (page backward) and implicitly scopes chatId to allowlisted chats, but the limit parameter's semantics (default, max 100) are left entirely to the schema with no added meaning.

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

Purpose4/5

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

States a specific verb (pull) and resource (older messages) and scopes it to an 'allowlisted chat', which distinguishes it from search_messages and read_messages that operate on current messages. It does not explicitly name a sibling, so it falls just short of the top score.

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?

Clear usage context: fetch older messages and use beforeMessageId to page backward, implying it is the pagination/backfill tool rather than the search tool. No explicit when-not condition or named alternative is given.

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

list_chatsC

List chats visible in this local session cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

C2.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose one important trait — results come from the local session cache, implying possible staleness or incompleteness — but says nothing about permissions, pagination, ordering, or what happens when the cache is empty.

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

Conciseness4/5

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

One short sentence with the scoping constraint front-loaded and zero filler. It is appropriately sized, though the extreme brevity leaves little room for the usage and parameter context an agent needs.

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

Completeness2/5

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

For a list tool with no annotations and no output schema, the description should clarify return shape, ordering, and pagination semantics. It covers only the data source, leaving the agent under-informed about what a call actually yields.

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 single parameter (limit) has 0% schema description coverage, exposing only type and min/max. The description adds no information about what limit controls, its default, or whether truncation is signalled.

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?

Names a specific verb and resource ("List chats") and adds a meaningful scope qualifier ("visible in this local session cache") that implies a cached-snapshot view rather than a server fetch. It does not, however, explicitly distinguish itself from the sibling fetch_all_chats, leaving the agent to infer which one talks to the network.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus fetch_all_chats, search_messages, or fetch_message_history. The word "visible" hints at a scoping condition, but no explicit when/when-not guidance is given.

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

read_messagesB

Read recent locally cached messages from one allowlisted chat.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
chatIdYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, but it does disclose two real traits: results come from a local cache (no network fetch) and access is restricted to an 'allowlisted' chat. It does not state read-only nature explicitly, pagination/ordering behavior, or what happens when the cache is empty or the chat is not allowlisted.

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

Conciseness5/5

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

A single front-loaded sentence with no filler. The scope constraint (recent, cached, single allowlisted chat) appears immediately.

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

Completeness3/5

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

For a two-parameter read tool with no output schema and no annotations, the description establishes the source (cache) and scope but leaves the limit semantics, default paging, result ordering, and error conditions unspecified. Adequate but with clear gaps.

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% for two parameters. The description only weakly implies that chatId targets a single chat and that recency is bounded, but it says nothing about the 'limit' parameter, its 1-100 range, or how limit interacts with 'recent'. The schema does the heavy lifting and the description does not compensate.

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?

Clear specific verb (read) and resource (messages) with meaningful scope qualifiers: 'recent' and 'locally cached'. It implicitly distinguishes itself from fetch_message_history (network/history) and search_messages (query-based), but never names a sibling, so differentiation requires inference.

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

Usage Guidelines3/5

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

The phrase 'locally cached' and 'recent' implies when this is appropriate versus fetching history, but there is no explicit when-to-use or when-not-to-use statement and no sibling is named. Usage is inferable rather than stated.

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

search_messagesB

Search locally cached message text. This never sends messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
chatIdNo

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden and does disclose two meaningful traits: the search is limited to the local cache (results may be incomplete) and it never sends messages. It omits other relevant behavior such as pagination via limit, auth requirements, or result ordering.

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

Conciseness5/5

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

Two short sentences, zero filler, with the scoping constraint front-loaded. Nothing could be removed without losing information.

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?

No annotations and no output schema, and the description leaves all three parameters unexplained, including how limit and chatId narrow the search. For a search tool with an undocumented input shape, this is insufficient beyond the useful local-cache caveat.

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% for three parameters, so the description must compensate and it does not — query, limit, and chatId are never mentioned or explained. An agent gets no help mapping the parameters to search scoping or result size.

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

Purpose4/5

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

States a specific verb ("Search") and resource ("message text") plus a qualifier ("locally cached") that sets it apart from read_messages or fetch_message_history. It does not name a sibling explicitly, so differentiation is only implied by the cache scoping.

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?

"Locally cached" implicitly tells the agent this only covers already-synced data, which is useful context for choosing between this and fetch_message_history. However, there is no explicit when-to-use, no exclusion, and no named alternative, so an agent must infer the routing.

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

send_mediaA

Send an image, video, audio, document, or sticker from a regular file inside WHATSAPP_OUTBOUND_MEDIA_DIRS to an allowlisted chat. Requires WHATSAPP_SENDING_ENABLED=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatIdYes
captionNo
filePathYes
mediaTypeYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the disclosure burden and does well on the critical items: it states the authorization/gating requirement (WHATSAPP_SENDING_ENABLED=true) and two allowlist constraints (source directory, recipient chat). It omits failure behavior, size limits, and whether a sent message can be recalled, so it stops short of full coverage.

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

Conciseness5/5

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

A single dense sentence front-loads the action and resource, then appends the hard constraints. No filler, no repetition of the tool name.

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

Completeness3/5

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

For a 4-parameter, 0%-schema-coverage mutation tool with no annotations and no output schema, the description covers the path and recipient constraints well but leaves the optional caption undocumented and says nothing about outcomes or failure modes. Adequate but with clear gaps.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate and it partially does: filePath gains the crucial 'regular file inside WHATSAPP_OUTBOUND_MEDIA_DIRS' constraint and chatId the 'allowlisted chat' constraint, both absent from the schema. However caption (optional, maxLength 2048) is never mentioned, and the mediaType list merely restates the schema enum.

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

Purpose4/5

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

Specific verb ('send') plus a precise resource enumeration (image, video, audio, document, sticker) and the file source. An agent can tell this is the outbound media path rather than the text path used by send_message, though no sibling is named explicitly.

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

Usage Guidelines4/5

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

Gives clear preconditions for use: the file must be a regular file inside WHATSAPP_OUTBOUND_MEDIA_DIRS, the chat must be allowlisted, and WHATSAPP_SENDING_ENABLED=true must be set. No explicit 'use X instead' routing to send_message or download_media, but the operating context is unambiguous.

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

send_messageB

Send a text message to an allowlisted chat. Requires WHATSAPP_SENDING_ENABLED=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
chatIdYes

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses two behavioral constraints (allowlist target, env-flag gating) beyond the schema, but says nothing about failure behavior on non-allowlisted chats, rate limits, idempotency, or what the response contains for a write operation.

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

Conciseness5/5

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

Two short sentences with zero filler, and the primary action is front-loaded ahead of the gating prerequisite.

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

Completeness3/5

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

For a write tool with no annotations, no output schema, and 0% parameter coverage, the description covers the critical enablement gate and target restriction but omits what a successful call returns and how errors surface. Adequate to attempt the call, incomplete for confident use.

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% — the schema gives types and length bounds but no semantics. The description only gestures at 'chat' via 'allowlisted chat' and does not explain the chatId format (phone number vs JID) or any other meaning for either parameter, so it fails to compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb and resource ('Send a text message') plus the scoping qualifier 'to an allowlisted chat'. The word 'text' implicitly separates it from the sibling send_media, though the sibling is never named explicitly.

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

Usage Guidelines3/5

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

Discloses a real prerequisite ('Requires WHATSAPP_SENDING_ENABLED=true') and the allowlist constraint, which tells the agent when the call will succeed. However, it never states when to prefer this over send_media or any alternative, leaving routing to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.2.0
    • First observedconnection_status
    • First observeddownload_media
    • First observedfetch_all_chats
    • First observedfetch_message_history
    • First observedlist_chats
    • First observedread_messages
    • First observedsearch_messages
    • First observedsend_media
    • First observedsend_message

TDQS

A3.5/5.0

Scored across 9 tools

Disambiguation4/5

Most tools target distinct operations, but list_chats vs fetch_all_chats and read_messages vs fetch_message_history have overlapping purposes. Their descriptions clarify the differences (default-capped vs all chats, recent vs older history), so misselection is possible but manageable.

Naming Consistency4/5

Nearly all tools follow a consistent snake_case verb_noun pattern: list_chats, search_messages, read_messages, send_message, etc. Minor deviations are fetch_all_chats vs list_chats for similar listing actions and connection_status lacking a clear verb.

Tool Count5/5

Nine tools is well-scoped for a local WhatsApp MCP server. Each tool covers a distinct capability such as connection status, chat listing, message reading/searching, media handling, and sending.

Completeness4/5

The server covers core messaging workflows: connection state, chat discovery, message reading/searching/history, media download, and guarded sending. Some gaps remain, such as contact/group metadata, message reactions, or chat creation, but the essential read/send surface is present.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables connecting a personal or business WhatsApp account via QR pairing and then sending/reading messages, managing chats, contacts, groups, and searching message history through MCP tools.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents and MCP clients to read and send WhatsApp messages and media, search chats, and manage contacts and groups after a one-time QR pairing.
    20 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to read, search, and send personal WhatsApp messages and files through a locally linked device.
    20 npm
    MIT