Skip to main content
Glama

scheduled_messages

Send, schedule, and manage WhatsApp messages: list queued items, edit or cancel pending sends, and check delivery status before or after dispatch.

Instructions

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 text for plain text, media_url (+ optional media_caption) for image/video/document, or poll: {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/or status — use status: '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):

  • id is the internal Blueticks message id, returned by send and accepted by get/update/cancel. Use it to look up message status.

  • waMessageKey is the WhatsApp wire message key, populated by the engine once the message is dispatched. Use its _serialized form for ack here and for every chats per-message endpoint. It is null on a freshly-pending message — call get after 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)

Input Schema

NameRequiredDescriptionDefault
idNo
toNo
pollNo
skipNo
textNo
limitNo
actionYes
statusNo
chat_idNo
send_atNo
media_urlNo
message_keysNo
media_captionNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/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, 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.

Purpose5/5

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.

Usage Guidelines5/5

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.