Blueticks WhatsApp MCP
Enables interaction with WhatsApp through Blueticks, including reading and searching chats, listing messages and participants, sending text/media/poll messages, managing chat read/archive state, and scheduling messages from a linked WhatsApp number.
@blueticks/mcp
Local (stdio) MCP server for Blueticks. It lets an MCP client such as Claude Code or Cursor read WhatsApp chats, send messages and schedule them from your own WhatsApp number, using a Blueticks API key.
If you use Claude or ChatGPT on the web or desktop, you do not need this package. Add the hosted connector instead: https://api.blueticks.co/mcp (OAuth sign-in, nothing to install). Details: https://blueticks.co/mcp
Requirements
Node.js 20 or newer
A Blueticks account with a connected WhatsApp number
A Blueticks API key. API access depends on your plan; see https://blueticks.co/pricing
Related MCP server: 9bot
Configuration
The server reads the key from the BLUETICKS_API_KEY environment variable, or from --api-key <key>.
Claude Code
claude mcp add blueticks --env BLUETICKS_API_KEY=your_key -- npx -y @blueticks/mcpCursor
Add to ~/.cursor/mcp.json (or the project's .cursor/mcp.json):
{
"mcpServers": {
"blueticks": {
"command": "npx",
"args": ["-y", "@blueticks/mcp"],
"env": { "BLUETICKS_API_KEY": "your_key" }
}
}
}Claude Desktop, Cline and other stdio clients
Use the same command / args / env block in the client's MCP config file.
Tools
Nine tools. Each takes an action argument. Action names below are read from this package's tool definitions (src/tool-defs/tools/).
Tool | Actions |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The hosted connector at https://api.blueticks.co/mcp has its own tool manifest, which can differ from this package. See https://blueticks.co/mcp for that list.
Pricing and limits
The connector and API access are tied to your Blueticks plan. Current plans and what each includes: https://blueticks.co/pricing. Requests are made through the Blueticks API with your key, so the limits of that API and plan apply.
How it connects to WhatsApp
Blueticks drives WhatsApp through a linked device on your own number. It does not use the Meta WhatsApp Business Cloud API, and it is not affiliated with or endorsed by WhatsApp or Meta. You are responsible for having consent from the people you message and for honoring opt-outs.
Development
npm ci
npm run typecheck
npm run build
npm test -- --runsrc/tool-defs/ is a vendored copy of the backend tool definitions; see src/tool-defs/VENDORED.md.
License
MIT
Available Tools
9 toolsaudiencesA
Reusable contact lists used as targets for messages and campaigns. Available actions:
list: list audiences
create: create a new audience by name
get / update / delete: standard CRUD on an audience
append_contacts: add contacts (to + optional variables) to an audience
update_contact / remove_contact: edit or remove a single contact within an audience
Phone format: to must be in international format (e.g. +14155551234). JID form (12345@c.us) is rejected here.
Variables: each key on variables becomes a {key} token usable in campaign templates (case-insensitive).
Custom tokens override built-ins: setting variables.firstName='Doug' makes {firstName} resolve to Doug instead of the WA profile name.
Built-ins always available even without variables: whatsappname, displayname, phone, mobile.
Examples:
create: 'create an audience called Leads'
append_contacts: 'add +972544325389 to the Leads audience with firstName=Doug, product=Premium'
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| name | No | ||
| skip | No | ||
| limit | No | ||
| action | Yes | ||
| contacts | No | ||
| variables | No | ||
| contact_id | No | ||
| audience_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers real behavioral detail: phone numbers must be international format and 'JID form (12345@c.us) is rejected here', variables become `{key}` template tokens, custom tokens override built-ins, and four built-in tokens always resolve. These are non-obvious runtime semantics an agent could not infer. It is silent, though, on what delete does to stored contacts, permissions, and pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is front-loaded and scannable: purpose sentence, action list, then constraint notes, then examples. Nothing is redundant, though the examples slightly restate what the action list already conveys.
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 9-parameter, 8-action tool with no annotations and no output schema, the description covers the hardest semantics (token variables, phone validation) but omits pagination parameters, how `contact_id`/`audience_id` are obtained, and the consequences of delete. An agent can call the main flows correctly but would guess on the rest.
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% across 9 parameters, so the description must compensate and does so for several: `to` format, `variables` substitution semantics, `name` on create, and the nested contacts shape ('to + optional variables'). It leaves `skip`, `limit` (pagination), `contact_id`, and `audience_id` entirely unexplained, so roughly half the parameters remain undocumented in both schema and description.
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 opening line names the resource and its role ('Reusable contact lists used as targets for messages and campaigns'), and the action list gives a concrete verb inventory. An agent knows exactly what domain this covers, though it doesn't distinguish the tool from siblings like contacts or campaigns.
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?
Enumerating actions with one-line glosses ('list audiences', 'create a new audience by name') tells an agent which action to pick, and the examples illustrate two common flows. However, there is no guidance on when to use this tool versus contacts or campaigns, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignsA
Schedule audiences for paced bulk delivery, with pause/resume/cancel controls. Available actions:
list: list campaigns
create: schedule a campaign against an audience (name + audience_id + optional text/media_url/media_caption/on_missing_variable)
get: retrieve a campaign by id
pause / resume / cancel: control a running campaign
Templates: text supports per-contact substitution using SINGLE-brace tokens — Hi {firstName}, your {product} is renewing.
Resolution is case-insensitive. Built-ins always available: {whatsappname}, {displayname}, {phone}, {mobile}.
Custom tokens come from audiences.append_contacts variables (the property name becomes the token).
on_missing_variable=fail (default) rejects at create time if any contact lacks a referenced token; skip accepts and leaves {token} literal in unresolved sends.
Examples:
create: 'campaign called Summer Promo targeting the Leads audience with text "Hi {firstName}, your {product} is renewing"'
pause: 'pause campaign 6a37b9a44919fa7098017a65'
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| skip | No | ||
| text | No | ||
| limit | No | ||
| action | Yes | ||
| media_url | No | ||
| audience_id | No | ||
| campaign_id | No | ||
| media_caption | No | ||
| on_missing_variable | No |
TDQS
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 real traits: paced delivery, pause/resume/cancel control, and the important default that on_missing_variable=fail rejects at create time while skip leaves the literal `{token}` in the send. It is silent on permissions, whether cancel affects already-queued messages, and idempotency of create, which matter for a bulk-send mutation.
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?
Front-loaded with the action list, then template semantics, then examples — a sensible order for a multi-action tool, and the per-action bullets are terse. The token-resolution paragraph is dense but every sentence carries information an agent needs to compose a valid `text` value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, six-action tool with no annotations and no output schema, the definition covers the create path well and the control actions adequately. It still leaves `skip`/`limit` unexplained and gives no sense of what list or get returns, so an agent cannot fully plan a listing flow from the description 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%, so the description must compensate, and it largely does: name, audience_id, text, media_url, media_caption, campaign_id, and on_missing_variable are all given meaning, including the non-obvious fail/skip trade-off. The two pagination-ish parameters `skip` and `limit` are never mentioned, leaving the compensation incomplete.
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 opens with a specific verb and resource — scheduling audiences for paced bulk delivery — and enumerates all six actions with one-line definitions, so an agent knows exactly what surface it covers. It does not differentiate itself from the sibling `scheduled_messages` or `audiences` tools, which is the only thing keeping it from a 5.
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?
Each action is described with enough context to pick the right one (create needs name + audience_id, pause/resume/cancel operate on a campaign_id), and two worked examples show realistic invocations. However there is no guidance on when to use this tool versus `scheduled_messages`, no prerequisites, and no statement of what cannot be done here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chatsA
Read or send WhatsApp messages inside chats on the connected engine. Available actions:
list: list chats, newest message first (offset pagination via limit/skip)
search: list chats matching a name/keyword query. Archived chats are excluded by default — pass include_archive=true to find an archived chat (e.g. to get its chat_id before unarchive).
get: retrieve a single chat by chat_id (e.g. 972544325389@c.us)
list_messages: list messages inside a chat
mark_read: mark all messages in a chat as read
archive: archive a chat (hide it from the main chat list)
unarchive: unarchive a chat (restore it to the main chat list)
get_media: download media bytes for one message by its wire key — returns url/data_base64 + mimetype/filename + original_quality flag (false when WA returned a preview rather than the original; currently only happens for own-sent newsletter media).
get_participants: list the members of a group chat
load_more_history: request OLDER history for ONE specific chat (chat_id) from the phone, so a subsequent list_messages can page further back. Each call pulls one page; call it again to go deeper. Use it whenever a chat's loaded messages don't reach far enough back for what you need. Paced and limited: one request per chat at a time, WA-paced — a call while that chat's request is in flight or cooling down returns added:0 (not an error); wait and retry. While the initial sync is still running the call throws a not_connected error. After repeated unanswered requests WhatsApp history requests pause: the result's
errorstarts "cooling_down:" and says how long to wait — retry after that, don't treat it as "no history". canLoadMore:false = history is genuinely exhausted — stop paging. A chat with no messages AND no chat activity on the engine (e.g. a saved contact whose conversation WhatsApp's first sync never delivered:getreturns it with lastMessageAt null) has nothing to page back from, so added stays 0. Once one message is sent or received in that chat, its older history can be requested.send_message_text: send a text message NOW (fire-and-forget). Body: {chat_id, type: "text", text}
send_message_media: send an image/video/audio/document NOW. Body: {chat_id, type: "media", media: {url, kind?, caption?, filename?}}
send_message_poll: send a poll NOW. Body: {chat_id, type: "poll", poll: {question, options[2..12], allow_multiple?}}
type is derived automatically from the action ("text"/"media"/"poll"),
so you don't need to send it; include it only if you want to be explicit.
send_message_* is for IMMEDIATE delivery into a chat — use the
scheduled_messages tool's send action to schedule a future send (with
send_at) or to keep the message in a queue you can edit/cancel before
dispatch.
Examples:
list: 'show me my recent chats'
search: 'find chats with noam'
list_messages: 'last 20 messages with 972544325389@c.us'
send_message_text: 'reply hi to 972544325389@c.us'
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| poll | No | ||
| skip | No | ||
| text | No | ||
| type | No | ||
| limit | No | ||
| media | No | ||
| order | No | ||
| query | No | ||
| since | No | ||
| until | No | ||
| action | Yes | ||
| chat_id | No | ||
| reply_to | No | ||
| message_types | No | ||
| include_archive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well for the most complex action: it discloses `load_more_history` pacing, `added:0` retry semantics, `not_connected` during initial sync, `cooling_down:` errors, and `canLoadMore:false` exhaustion. It also notes that sends are fire-and-forget, archive/unarchive hide or restore a chat, and `get_media` may return a preview via `original_quality=false`. It still omits some operational details such as send failure modes, permission requirements, and rate limits for sending media.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is largely justified by 13 actions and several important caveats. It is front-loaded with the core purpose and structured as a clear bullet list with examples at the end. The `load_more_history` section is somewhat verbose and repetitive, but most sentences provide operational value rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, lack of annotations, and 0% schema description coverage, the description is substantially complete for action selection and many invocation details, especially for `load_more_history` and immediate versus scheduled sending. It still leaves some optional parameters and return-shape expectations undocumented, so an agent may need to infer how to use filters such as `since`, `until`, `message_types`, and `reply_to` correctly.
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, and it does explain several important parameters: `limit`/`skip` pagination, `query` in search, `include_archive`, `chat_id` examples, poll option constraints, media body fields, and automatic `type` derivation for send actions. However, several parameters remain unexplained, including `key`, `order`, `since`, `until`, `message_types`, `reply_to`, and `media.data_base64`, leaving meaningful gaps across a 16-parameter schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Read or send WhatsApp messages inside chats on the connected engine." It then enumerates all 13 actions with concrete meanings, so an agent can distinguish chat listing, searching, message listing, media retrieval, and sending without opening the schema. It also explicitly separates immediate sends from the sibling `scheduled_messages` tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage conditions: `send_message_*` is for immediate delivery while `scheduled_messages` handles future sends, `include_archive=true` is needed to find archived chats, and `load_more_history` is the tool to use when a chat's loaded messages do not reach far enough back. These are concrete when-to-use and when-to-use-alternative instructions rather than implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contactsA
Read WhatsApp contacts known to the connected engine. Available actions:
list: list contacts, optionally filtered by query (offset pagination via limit/skip)
common_groups: list the groups the connected account shares with a contact (WhatsApp's "groups in common"). chat_id is the contact JID (e.g. 12345@c.us).
Examples:
list: 'find contacts named Douglas'
common_groups: 'what groups do I share with 972544325389@c.us?'
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | ||
| limit | No | ||
| query | No | ||
| action | Yes | ||
| chat_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose that this is a read operation and that list uses offset pagination via limit/skip, which is genuine behavioral context. It does not cover permissions/authorization nuances (e.g., whether common_groups works for contacts not in the address book), rate limits, or what the response contains and whether more pages exist.
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?
Purpose is stated in the first line, followed by a scannable action list and two short examples; each line earns its place. The two example lines are marginally redundant with the action bullets but still aid selection.
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 5-parameter, action-dispatch tool with no annotations and no output schema, the description covers inputs and actions but says nothing about return values or how paginated results signal completion. The per-action coupling of parameters (e.g., chat_id only for common_groups) is implied by the bullets but not stated explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must define the parameters, and it largely does: query is the filter for list, limit/skip implement offset pagination, and chat_id is the contact JID with a concrete example format (12345@c.us). The action enum is explained action-by-action; only the limit ceiling (200) is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Read WhatsApp contacts known to the connected engine") and enumerates the two supported actions (list, common_groups) with their semantics. It never names a sibling (chats, groups) as the alternative for contact-adjacent needs, so differentiation from siblings is only implicit.
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 per-action examples ("find contacts named Douglas", "what groups do I share with...") show how each action is intended to be used, which is real guidance for picking the right action. However, there is no explicit when-not guidance or routing to sibling tools such as groups or chats, so an agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engineA
Inspect the WhatsApp engine(s) connected to this account. Available actions:
status: returns the connected engines as an array — one entry per online engine, each with {id, type, connected, state, stream, hasSynced}. An empty array means no engine is currently connected (not an error).
Examples:
status: 'is WhatsApp connected?'
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full load — and it does disclose the important behavioral detail that an empty array means no engine connected rather than an error, plus the per-entry field set ({id, type, connected, state, stream, hasSynced}). It omits auth/permission requirements and the meaning of fields like state and stream.
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?
Front-loaded purpose followed by action and return semantics, with no filler. The "Available actions" heading and an example for a single-action tool are slightly over-structured for what is essentially one call, but not wasteful.
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 one-parameter, single-action read tool with no output schema, the description supplies everything needed: the action, the return array shape, and the empty-array non-error case. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the single parameter is a one-value enum ("status") that is self-documenting; the description nonetheless explains what that action does and what it returns. Minor gap: no note that the enum is currently limited to a single action.
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 specific verb and resource: "Inspect the WhatsApp engine(s) connected to this account." No sibling (chats, contacts, groups, campaigns, webhooks, etc.) overlaps with connection/engine status, so an agent can route to it unambiguously.
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 example framing ("is WhatsApp connected?") implies the use case, but there is no explicit when-to-use or when-not-to-use statement, nor a named alternative. With only one action available, the guidance burden is low, so implied usage is adequate but not strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
groupsA
Create and manage WhatsApp groups via the connected engine. Available actions:
list: list groups the engine sees (offset pagination; optional name query)
get: retrieve a group by group_id (e.g. 972...-1597620113@g.us); set include_participants for the member list inline
create: create a new group with a name and a list of participant phone numbers
update: rename a group or change its admin/messaging settings
leave: cancel the authenticated user's membership. NOTE: WhatsApp has no "destroy group" — the group continues for any remaining members; only your membership ends.
Notes:
Newly-created groups default to admins-only-post (announce=true) and admins-only-edit (restrict=true) — that's WAWeb's default. To open posting/editing to all members, follow create with
update settings={announce:false, restrict:false}.participant_count includes the creator/owner. Inviting your own phone number deduplicates into the owner slot rather than adding a separate participant.
createalways returns participants[] inline so you can confirm membership immediately.
Examples:
list: 'show me my groups'
get: 'fetch group 972...-1597620113@g.us'
create: 'create a group called Crew with +972544325389 and +1234567890'
update: 'rename group g@g.us to Sales Team'
leave: 'leave group g@g.us'
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| skip | No | ||
| limit | No | ||
| query | No | ||
| action | Yes | ||
| group_id | No | ||
| settings | No | ||
| participants | No | ||
| include_participants | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that create defaults to announce=true/restrict=true, that leave only ends your membership while the group survives, that participant_count includes the creator, and that self-invites dedupe into the owner slot. It omits permission/auth requirements (e.g., that update/leave may require admin rights) and any error or rate-limit behavior, so it is rich but not complete.
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?
Front-loaded with the action list, then notes, then examples — a clean hierarchy that lets an agent stop reading once it has what it needs. The examples largely restate the action bullets, so a bit of the content is redundant rather than additive.
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 5-action, 9-parameter dispatch tool with a nested settings object and no annotations or output schema, the description covers action semantics, defaults, edge cases, and one return-shape detail (create returns participants[] inline). An agent has enough to select and invoke any action correctly, with only minor uncertainty about list/get response shape.
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, and it defines most of the 9 parameters: group_id with a concrete format example, participants as phone numbers, include_participants as inline member list, settings.announce/restrict with their meaning, query as an optional name filter, and skip/limit as offset pagination. The bounds (limit max 200, minimums) and the exact skip/limit parameter names are not surfaced, leaving a small gap.
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 specific domain (WhatsApp groups) and enumerates all five actions (list/get/create/update/leave) with the verb+resource for each, so an agent knows exactly what capability set is behind this tool. It also distinguishes the resource from sibling tools like chats and contacts by scoping everything to groups.
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 'Available actions' list plus the natural-language examples ('show me my groups', 'leave group g@g.us') give clear when-to-use routing for each action, and the 'leave' note explicitly says WhatsApp has no destroy-group, which prevents the wrong choice. It never contrasts itself with sibling tools (e.g., when to use groups vs chats for member info), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scheduled_messagesA
Send, list, edit, cancel, or look up the status of WhatsApp messages. Available actions:
send: send a message now (or schedule for later via send_at). Use
textfor plain text,media_url(+ optionalmedia_caption) for image/video/document, orpoll: {question, options, allow_multiple?}for a WhatsApp poll. The three are mutually exclusive.get: retrieve a single message by id
list: list messages, newest first (offset pagination via limit/skip). Optionally filter by
chat_id(recipient JID) and/orstatus— usestatus: 'pending'to see queued, not-yet-sent messages.update: edit a pending message that hasn't dispatched yet. Accepts
text,media_url,media_caption,send_at(any subset).cancel: cancel a pending message that hasn't dispatched yet.
ack: batch lookup of delivery + read acknowledgements for up to 200 message keys
Identifier model (important for chaining send → ack):
idis the internal Blueticks message id, returned bysendand accepted byget/update/cancel. Use it to look up message status.waMessageKeyis the WhatsApp wire message key, populated by the engine once the message is dispatched. Use its_serializedform forackhere and for everychatsper-message endpoint. It is null on a freshly-pending message — callgetafter status advances to obtain it.
Examples:
send: 'message 972544325389@c.us — your appointment is tomorrow at 10am'
get: 'what's the status of message msg_abc?'
list: 'show me my scheduled messages' (status: 'pending')
update: 'reschedule msg_abc to send tomorrow at 5pm'
cancel: 'cancel my scheduled message msg_abc'
ack: 'were these 3 messages read?' (message_keys come from get/list)
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| to | No | ||
| poll | No | ||
| skip | No | ||
| text | No | ||
| limit | No | ||
| action | Yes | ||
| status | No | ||
| chat_id | No | ||
| send_at | No | ||
| media_url | No | ||
| message_keys | No | ||
| media_caption | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that edits/cancels fail once dispatched, that `waMessageKey` is null until the engine dispatches and must be re-fetched via `get`, that `ack` is batched up to 200 keys, and that `list` returns newest-first. It stops short of permissions/auth requirements, error semantics, or rate limits, which is why it isn't a 5.
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 action list, identifier-model block, and examples are clearly sectioned and front-loaded, so an agent can scan to the relevant action quickly. It is long, and some example lines restate guidance already given above, but the length is largely justified for six actions across thirteen parameters.
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 six-action tool with thirteen parameters, no annotations, and no output schema, the description covers the load-bearing pieces: the id/waMessageKey chaining model, pagination, status filtering, and mutation preconditions. Return shapes are only loosely characterized (no output schema exists to defer to), and the `to` field remains underspecified, so it falls slightly short of fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: it explains `text`/`media_url`/`media_caption`/`poll` mutual exclusivity, `send_at` for scheduling, `limit`/`skip` as offset pagination, `chat_id` as a recipient JID filter, and the `id` vs `waMessageKey` split with its `_serialized` form. Gaps remain — the required `to` parameter is never defined (only hinted at through an ambiguous example string) and `skip` is implied rather than stated.
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 opens with an explicit verb list (send, list, edit, cancel, look up status) tied to the WhatsApp message resource, then enumerates each of the six actions the single `action` enum supports. This makes it immediately distinguishable from siblings like `chats`, `contacts`, or `campaigns`, which deal with 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?
It gives explicit selection rules per action and real exclusions: `update`/`cancel` only apply to pending messages that haven't dispatched, `status: 'pending'` is the way to see queued messages, and the three payload forms (text / media_url / poll) are declared mutually exclusive. The natural-language examples map directly onto each action, leaving little inference for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
utilsA
Local helpers that don't require a backend call. Available actions:
current_date_time: current date/time + timezone of the MCP host (gateway pod or stdio bridge). Always call this before any tool that takes a future timestamp.
Examples:
current_date_time: 'what time is it for me right now?'
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and discloses useful traits: no backend call is required, the result is local, and the timezone reflects the MCP host rather than the caller. It does not explicitly state read-only safety, but the operation is inherently a read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loads the key constraint, and uses a compact action list plus one example. Every sentence adds useful information without unnecessary repetition.
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 one-action utility with no output schema and no annotations, the description covers purpose, usage, and host-timezone semantics well. It stops short of specifying the exact return format or timezone string format, which would fully close the gap.
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 sole parameter is a single-value enum and the description explains the meaning of that action, including what it returns. More detail on the returned date/time format could improve it, but the parameter is otherwise fully understandable.
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 identifies the tool as a set of local helpers that avoid a backend call and specifically explains the only available action, current_date_time. It is clear what the tool does, though the broad namespace name 'utils' is only disambiguated by the description.
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?
It gives an explicit usage rule: call this before any tool that takes a future timestamp. The example also shows the intended natural-language trigger, leaving little ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhooksB
Register URLs to receive HTTPS POSTs on Blueticks events. Available actions:
list: list webhooks
create: register a new webhook (URL + events)
get / update / delete: standard CRUD
Examples:
create: 'register https://my.app/hook for message.delivered events'
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| skip | No | ||
| limit | No | ||
| action | Yes | ||
| events | No | ||
| status | No | ||
| webhook_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It does add genuine behavioral context: deliveries are HTTPS POSTs triggered by named events such as message.delivered. But it is silent on authentication/secret verification, retry and failure behavior, whether delete is irreversible, and what the create/get responses contain for a tool that also supports mutation and deletion.
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 one-line purpose is front-loaded, followed by a compact action list and a single concrete example. The `get / update / delete: standard CRUD` line is slightly redundant but earns its place by covering three actions in one clause. No filler sentences.
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 7-parameter tool with no annotations and no output schema, the description covers the essential what-and-which-action but omits auth requirements, deletion consequences, pagination, and return shape. Adequate for selecting the tool, thin for invoking it safely.
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% across 7 parameters, so the description must compensate. It meaningfully explains `url` and `events` through the create example and gives the `action` enum values verbatim, but `skip`, `limit`, `status`, and `webhook_id` are never mentioned, leaving pagination and enable/disable semantics 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?
The description states a specific resource and effect: registering URLs to receive HTTPS POSTs on Blueticks events. It then enumerates the five supported actions, so an agent immediately knows this is a multi-action webhook CRUD tool. It does not explicitly contrast itself with siblings, but the resource is distinct enough from chats, campaigns, and audiences that confusion is unlikely.
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 action list implicitly routes an agent to the correct sub-operation, and the create example shows the shape of a registration request. However, there is no guidance on when a webhook is the right tool versus polling or the other sibling resources, and no prerequisites such as required scopes or signing-secret setup.
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.
9 tool updates
v0.1.0- First observed
audiences - First observed
campaigns - First observed
chats - First observed
contacts - First observed
engine - First observed
groups - First observed
scheduled_messages - First observed
utils - First observed
webhooks
TDQS
Scored across 9 tools
Each top-level tool maps to a distinct resource (messages, chats, contacts, groups, audiences, campaigns, webhooks, engine, utils), so an agent can pick the right one by domain. The main gray area is sending: scheduled_messages.send can also send 'now', overlapping with chats.send_message_text/media/poll, and chats.list vs groups.list both return group-ish entities — but the descriptions explicitly clarify the intended split.
Consistent plural-resource noun naming with a uniform 'action' sub-parameter pattern (send/get/list/update/cancel) throughout all nine tools. Minor deviations: singular tools (engine, utils) and a few noun-style action names (common_groups, get_media) break the pure verb pattern, but the scheme is predictable.
Nine top-level tools is well-scoped for a WhatsApp automation server, and each maps to a coherent domain object rather than exposing every operation as its own tool. Heavy sub-action surfaces (e.g. chats) are grouped logically rather than sprawling the tool list.
Broad coverage: send/receive, scheduled queue, contacts, groups, audiences, campaigns, webhooks, and engine status — a full lifecycle for messaging automation. Gaps remain around destructive/engagement operations: no message delete/revoke or reaction, and group membership management lacks add/remove/promote participant actions despite group creation.
Maintenance
Related MCP Connectors
Send and read WhatsApp messages, templates, chats and campaigns through the official Business API.
Send WhatsApp messages from your own number, read the replies and send login codes.
Send WhatsApp messages and templates, manage chats, contacts, broadcasts and AI agents.
1Send WhatsApp messages from your own numbers, read and answer chats, and send sign-in codes.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables WhatsApp messaging and management through the Evolution API, supporting sending texts, checking numbers, listing contacts and groups, and more.25MIT
- AlicenseNot gradedqualityAmaintenanceAutomate and manage WhatsApp groups, communities, and channels with scheduling, moderation, analytics, and more.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables linking a WhatsApp number via QR code and then sending, reading, listing chats, and checking status through MCP tools, with per-account API key authentication.-
- AlicenseNot gradedqualityCmaintenanceEnables 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