Skip to main content
Glama

Send a message

send_message

Queue WhatsApp text, media or documents to send at a human pace with built-in gaps and daily limits, and get back when it will go out and why it isn't sooner.

Instructions

Queue a message on a connected channel: text, or a photo, video, GIF, voice note or document (pass media; text is then its caption). Parley sends at a human pace to keep the account safe: with gaps between sends, breaks after bursts, and a daily limit; if the person turned on active hours for the number, only inside its local active hours. The reply says when it will go out (scheduled_for) and why it isn't sooner (waits). Replies in existing conversations go ahead of conversation openers that hit their limit.

Input Schema

NameRequiredDescriptionDefault
toYesRecipient on the channel: a chat_id from list_chats, or a phone number for WhatsApp.
kindNoWhat the send costs the account. Defaults to "message" in an existing conversation and "first_message" to someone new.
textNoThe message, or the caption when sending media.
mediaNoA file to send: photos up to 16 MB; videos, audio and documents up to 100 MB from a url (16 MB as data). Give exactly one of url or data.
typingNoShow "typing…" in the chat first ("recording…" before a voice note), for about as long as a person would take: ~24s per 100 characters (50 words a minute), at most a minute, then send. On by default (the number's setting in Parley); pass false when it should just go. On a number whose typing the account holder turned off, it never shows.
not_beforeNoDon't send before this ISO time.
connection_idNoWhich of your accounts: a connection id from list_connections, or the account's number. Optional when only one account fits. Left out, it's the account that has the `to` chat.
idempotency_keyNoRetrying with the same key returns the original message instead of sending twice.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A3.8/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 human-paced dispatch (gaps between sends, breaks after bursts, a daily limit), active-hours gating, the priority of replies over conversation openers, and that the reply reports scheduled_for and waits. It omits failure modes, permission/prerequisite requirements, and what happens when the account or channel is not connected.

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?

Roughly five sentences, front-loaded with the core action and payload rule before the pacing behavior. Each sentence carries non-redundant information, though the pacing sentence is long and stacks several clauses that could be split for faster scanning.

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 an 8-parameter write tool with no annotations and no output schema, the description covers what an agent most needs: dispatch timing, active-hours constraint, media handling, and the shape of the reply. Remaining gaps are error/prerequisite handling and post-send lifecycle (revealed only through sibling tools like message_status and cancel_message).

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 100%, so the baseline is 3, but the description adds relational meaning the schema cannot: `media` and `text` are mutually reshaping (text becomes the caption), and the response carries `scheduled_for` and `waits`, which explains the practical significance of `not_before` and `typing`. It does not add anything beyond the schema for `kind`, `idempotency_key`, or `connection_id`.

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

Purpose4/5

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

The opening clause gives a specific verb and resource ("Queue a message on a connected channel") and immediately enumerates the payload shapes (text or media with text as caption). It is unmistakably distinct from siblings like cancel_message, list_outbox, or react_to_message, though it never names an alternative 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?

Usage is implied rather than prescribed: it explains that media is passed via `media` with text as caption, that `typing` can be set to false "when it should just go", and that `connection_id` is optional when only one account fits. There is no explicit when-not guidance or routing to alternatives such as cancel_message or list_outbox after a send.

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