whatsapp-mcp
Provides tools for reading WhatsApp history from the macOS desktop app's local SQLite database, including chats, messages, contacts, group members, and search; optionally enables sending replies through a separately enabled bridge.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@whatsapp-mcpWhat did I discuss with Sarah yesterday?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
whatsapp-mcp
An MCP server that reads your WhatsApp history from the macOS desktop app's own database — no QR pairing, no protocol reimplementation, no account risk — with optional, tightly-gated replying.
The technique
Every other WhatsApp MCP server runs whatsmeow or Baileys: a reverse-engineered WhatsApp Web client. That means scanning a QR code before you can read a single message, keeping a second copy of your entire history, and accepting a genuine risk of an account ban.
For reading, none of it is necessary.
WhatsApp's macOS desktop app stores your message history as unencrypted SQLite:
~/Library/Group Containers/group.net.whatsapp.WhatsApp.shared/ChatStorage.sqliteIt is a plain Core Data store, owned by your user, readable by any process running as you. So this server splits the two operations by their risk:
Mechanism | Risk | |
Read | The desktop app's own SQLite file | None. Official client, never written to. |
Send | A ~150-line whatsmeow bridge, session only | Real — opt-in, off by default. |
Reading works the moment you install it. Sending is a separate flag.
Related MCP server: WhatsApp MCP Server (TypeScript)
Five things that will bite you
These cost real debugging time. All are pinned by regression tests.
1. The write-ahead log
The live database has a WAL. Reading the main file alone silently omits recent messages; opening it read-write risks corrupting the app's state.
Copy db + -wal + -shm to a temp directory and open the copy, which
replays the WAL. Counter-intuitively, mode=ro is wrong here — a read-only
handle cannot replay a WAL and will serve you stale rows. The read-only
guarantee comes from never opening the source at all, which is asserted by a
test comparing the source's size and mtime after a full tool sweep.
Also delete a stale -wal in your temp copy when the source no longer has one,
or checkpointed rows come back from the dead.
2. strftime in a SQL comparison silently returns nothing
-- returns 0 rows, no error, on a database whose newest message is 4 minutes old
WHERE ZMESSAGEDATE + 978307200 > strftime('%s','now','-30 days')strftime returns TEXT. SQLite orders every number before every string, so
the comparison is false for every row. Observed live: "0 messages in 30 days"
against a database that actually held 283.
The fix is not CAST(... AS INTEGER) — it is to keep strftime out of
comparisons entirely and bind Python integers, so a query written later cannot
forget the cast.
(Timestamps are Core Data epoch: seconds since 2001-01-01. Add 978307200.)
3. ZMESSAGECOUNTER is not the message count
It reported 10 for a chat holding 419 rows, and 173 for one holding 3,484. Wrong by more than an order of magnitude. Count the rows.
4. ZLASTMESSAGETEXT is not text
It holds serialized protobuf on 65 of 66 chats on a real account — so a chat list built from it surfaces base64 noise. Read the newest actual message instead.
5. Filter in SQL, before LIMIT — never in Python after
Most group members carry an empty-string name. SQLite sorts '' first, so
LIMIT 500 returned nothing but blanks and a Python-side if name filter
dropped them all: 0 contacts returned when 358 existed.
This one passed every synthetic fixture test. Only real data caught it.
The pattern behind 3, 4 and 5: WhatsApp's denormalized summary columns do not contain what their names promise. Verify each against the underlying rows.
Install
./install.sh # prompts: 1 = read-only, 2 = read + replyRegisters with Claude Code and Claude Desktop.
Claude Desktop needs Full Disk Access (System Settings → Privacy & Security) or every call fails. Note that Claude Desktop rewrites its config file from memory when it quits, so add the connector while the app is closed — an entry added while it runs gets silently dropped on exit.
For reply mode, pair once in a real terminal:
cd bridge && ./whatsapp-bridge -pairQR codes expire in ~20–30 seconds, so have your phone already on
Linked Devices before you look. A <stream:error code="515"/> immediately
after <pair-success> is normal — it means "restart required" and whatsmeow
reconnects through it automatically.
Tools
Read (always): list_chats, list_messages, search_messages,
get_chat_context, list_contacts, get_group_members, stats.
Date arguments accept 7d, 24h, 2w, or an ISO date.
Reply (only with --enable-send): draft_reply, send_message.
In read-only mode these are absent from the tool list, not present and
refusing.
How replying is gated
An instruction the model is asked to follow is not a control. So:
draft_replyreturns the exact text and sends nothing, issuing an HMAC token bound to that precise(chat_id, text)pair.send_messagerecomputes the binding and rejects any mismatch — change one character and the token dies.
The model cannot send text the user has not seen, enforced by code rather than by prompt.
Plus: reply-only scope (recipients resolve from existing local history, so a phone number can never be supplied freehand and proactive messaging is unreachable), a rate limit, and an audit log of successful sends.
Limits
History only goes back to when you linked WhatsApp Desktop. Older messages live on your phone. That is WhatsApp's multi-device sync window, not something this code controls.
Media is mostly not on disk — on a real account, 22 of 4,938 media items had a local file path. Media is reported by type and caption; files are not served.
No reply threading —
ZPARENTMESSAGEis NULL on every row.macOS only. The path and Core Data schema are specific to the macOS desktop app.
Security note
Your WhatsApp history is a world-readable file in your home directory. Any process running as your user can already read it. This server does not grant access — it packages it, with typed tools, row limits, read-only snapshots and the send gate above. Worth understanding either way.
Development
uv run pytestTests run against a synthetic fixture database and need neither WhatsApp nor any real messages.
Licence
MIT
Available Tools
7 toolsget_chat_contextB
Show the messages surrounding one message, to expand a search hit.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| before | No | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It only says 'show' and 'surrounding,' which implies a read-only operation, but it does not explain ordering, default counts for before/after, or any other runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. The main action and purpose are front-loaded, making it easy for an agent to quickly understand the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but the description leaves out parameter semantics and explicit usage guidance. It is minimally viable for invoking the tool correctly, but an agent would benefit from knowing that before/after control the number of messages on each side and that message_id is the anchor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining parameters. It does not mention message_id, before, or after explicitly. 'Surrounding' hints at the role of before/after, but the description adds little semantic value beyond the schema's property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and resource ('messages surrounding one message') and states a clear purpose ('to expand a search hit'). This differentiates it well from siblings like search_messages and list_messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to expand a search hit' implies the tool is used after a search, but it does not explicitly discuss when to use this tool versus alternatives or when not to use it. Usage context is present but only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_group_membersA
List members of a group chat, with admin flags.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It clearly states a read operation ('List members') and promises admin flags, but does not disclose potential limitations such as requiring a group chat, auth/permissions, pagination, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every word contributes: 'List' gives the action, 'members of a group chat' gives the scope, and 'with admin flags' adds return detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool, the description is minimally sufficient: it names the action and the object. However, with no annotations and no output schema, it lacks context about permissions, return shape, and how this tool fits with siblings, leaving some gaps for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add meaning by identifying that the chat is a group chat, implying chat_id refers to a group chat ID, but it does not explicitly explain chat_id's role, format, or how to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('members of a group chat') and adds a distinguishing detail ('with admin flags'). This clearly separates it from siblings like list_chats and list_messages, which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives, nor any prerequisite such as first calling list_chats to obtain a chat_id. The usage context is only implied by the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsA
List WhatsApp chats, most recently active first.
kind: 'dm', 'group', or omit for both.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| query | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses ordering and the kind filter, but does not describe return shape, query semantics, or any auth/rate-limit considerations. This is a partially transparent read-list description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the main action and sort order first and a single clarifying parameter note second. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a basic list operation this is serviceable, but with no output schema and no annotations it should state what a returned chat entry looks like and clarify the query parameter. These gaps prevent full end-to-end confidence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate. It only explains kind ('dm', 'group', or omit); limit, offset, and especially query are left undefined, even though query's semantics are not obvious from the parameter name alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'List WhatsApp chats', and states the sort order, making it distinct from sibling tools such as list_messages and list_contacts. The kind line further clarifies scope by chat type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that the tool is for retrieving an ordered chat list, but it never explicitly says when to prefer it over list_messages, search_messages, or get_chat_context. There are no exclusions or alternative-route conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsC
List known contacts and named group members.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. 'List' implies a read-only operation, but the description does not mention pagination, ordering, whether group member expansion is included, or how the results are shaped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler. It is front-loaded and easy to parse, though the brevity comes at the cost of missing behavioral and parameter context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and no parameter descriptions, the description is under-specified. An agent cannot tell the return format, how query filters contacts, or how group membership is resolved from the provided text alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description itself says nothing about limit or query. The names are suggestive but their exact semantics, such as fuzzy matching or required format, are left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action and resource: 'List known contacts and named group members.' Differentiates from list_chats/list_messages by resource, though get_group_members could overlap without an explicit comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as get_group_members, which also returns group members. The description does not specify context, filters, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_messagesA
Read messages in one chat, oldest first.
after/before accept '7d', '24h', '2w', or an ISO date such as 2026-08-01.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| before | No | ||
| offset | No | ||
| chat_id | Yes | ||
| from_me | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavior burden. It usefully discloses that this is a read operation, that results are ordered oldest first, and that after/before accept specific formats. It does not describe pagination behavior, from_me filtering semantics, or response contents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences: the core function is front-loaded and the format note adds essential detail without bloat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers ordering and date syntax, which are the most important non-obvious traits. Gaps remain around pagination, filter behavior, and return shape, and since there is no output schema these omissions are more noticeable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description meaningfully documents the two ambiguous parameters, after and before, with concrete accepted formats. Limit, offset, and from_me are left to their titles and defaults, which are mostly self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the verb 'Read', the resource 'messages in one chat', and the ordering 'oldest first'. The phrase 'in one chat' distinguishes it from siblings like list_chats and search_messages, though it does not name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when you need messages from a specific chat, and provides date-format guidance, but gives no explicit when-to-use vs. alternatives such as search_messages or get_chat_context. There is no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesA
Search message text, newest first. Matches a literal substring.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| query | Yes | ||
| before | No | ||
| chat_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavior itself, and it does reveal two non-obvious traits: results are sorted newest first and matching is literal substring rather than regex/fuzzy. However, it omits other behavioral details such as pagination, case sensitivity, and what happens with large result sets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, with the most important behavioral facts (resource, ordering, matching mode) front-loaded. Every word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with no output schema and no annotations, the definition is incomplete. It does not explain the time/position parameters, result shape, or pagination, so an agent has to guess at valid usage for all optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only clarifies the query parameter semantics ('matches a literal substring'). The after, before, limit, and chat_id parameters are left to name inference, with no date format, default behavior, or interaction explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Search) and resource (message text), and adds distinguishing detail: newest-first ordering and literal substring matching. This separates it from sibling tools like list_messages, which would not perform text search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use case clear — retrieving messages by a literal text substring — but it does not explicitly contrast this with list_messages or list_chats or state when not to use it. No misleading guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statsA
Database health: source path, counts, date range, and whether sending is on.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains what information the tool exposes, which is useful. However, it does not explicitly state that the operation is read-only, has no side effects, or what the exact return format will be, leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficiently front-loaded sentence. 'Database health' immediately frames the tool's purpose, followed by a compact list of concrete output elements. There is no repetition, filler, or redundant restating of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema diagnostic tool, the description gives a good sense of what the agent will receive: source path, counts, date range, and sending status. It is sufficient for an agent to decide to call the tool and interpret its results at a high level. It could be slightly more explicit about the return shape, but the current description is functionally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there are no parameter semantics for the description to clarify. Per the baseline for zero-parameter tools, the description does not need to compensate for missing parameter docs. The description focuses on the output, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a database health readout and enumerates the returned aspects: source path, counts, date range, and sending status. It distinguishes itself from sibling list/search tools by focusing on aggregate health stats rather than individual chats, messages, or contacts. However, it uses a noun phrase ('Database health') rather than an explicit verb like 'returns' or 'provides'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for checking overall database health, which is enough for a zero-parameter diagnostic tool. It gives no explicit when-to-use direction or mention of alternatives, but the context makes the intended use reasonably clear. No exclusions or conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct retrieval role: chats, chat-scoped messages, full-text search, context expansion, contacts, group membership, and database health. The potential overlaps among list_messages, search_messages, and get_chat_context are clearly separated by their descriptions.
Most tools follow a snake_case verb_noun pattern like list_chats, list_messages, and search_messages. The lone 'stats' breaks the verb_noun convention, and get_group_members could have been list_group_members for stricter parallelism.
With seven tools, the server is well-scoped and each tool addresses a distinct need for inspecting WhatsApp data. No tool feels redundant or extraneous.
The read/search workflow is well covered: chats, messages, search, context, contacts, group members, and health checks. The main gaps are direct single-message lookup and any send/manage operations, but for a read-only database inspection surface these are minor and workaroundable.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
WhatsApp CRM for AI agents: search contacts, read chats, manage the sales pipeline, send messages.
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides read-only access to local Beeper message history on macOS, enabling users to search conversations, read messages, and list recent chats through natural language queries. Supports both SQLite and IndexedDB storage formats with privacy-focused local-only operation.1
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with your personal WhatsApp account to search messages, list chats, and send messages. It stores all authentication and message data locally using SQLite for privacy and direct multi-device API connection.131ISC
- AlicenseNot gradedqualityCmaintenanceEnables LLM clients to read and search your own WhatsApp messages stored in a local SQLite database, captured live via a linked device.47MIT
- AlicenseNot gradedqualityCmaintenanceEnables local querying of WhatsApp message history via SQLite, with profile separation, media transcription, and operational summaries.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rubickthemagus/whatsapp-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server