Skip to main content
Glama
sendkuy

SendKuy MCP server

Official

Send a batch of messages

sendkuy_send_batch

Sends up to 500 personalized WhatsApp, SMS, or email messages in one call, with per-recipient content and independent results so failed rows do not block the rest.

Instructions

Send up to 500 independent messages in one call, each with its own channel, recipient and body. Use it when the content differs per recipient: a revenue summary per branch, a notification per order, a reminder per invoice. Every row is answered on its own: one bad number or a channel out of credit fails that row only, and the rest still go out. The answer lists the message id of every row in input order (null where the row failed) and each failed row with its error. Messages are queued and sent in the background, paced per number. This really sends and spends SendKuy credit. A recipient on the suppression list or who unsubscribed still gets a message id and fails later; read the final status with sendkuy_get_messages. Pass dedupe_key so a retried step does not send the batch twice.

Input Schema

NameRequiredDescriptionDefault
messagesYes
dedupe_keyNoA key derived from the event this call reports, such as "order-1234-shipped" or "daily-revenue-2026-10-29". Calling again with the same key and the same input returns the first answer instead of sending twice. The same key with different input is refused with idempotency_key_reused, so keep changing values such as the time out of a deduplicated message. A refusal (for example insufficient_credits or a bad number) is remembered under the key too: after fixing it, retry with a new key. Keys are remembered for about 24 hours.

Output Schema

NameRequiredDescriptionDefault
idsYes
failedYes
acceptedYes
failuresYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that it really sends and spends credit, that rows fail independently, that queued sends are paced per number, and that suppressed recipients get an id now and fail later. It also explains the dedupe_key idempotency contract including that refused attempts are remembered under the key.

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?

Front-loads purpose in the first sentence and every subsequent sentence carries real information, but it is a dense wall of text without breaks or bullets, which makes scanning harder than it needs to be for a definition this rich.

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

Completeness5/5

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

Given an output schema exists, the description still helpfully previews the return shape (message id per row in input order, failed rows with errors) and covers the critical non-obvious behaviors (credit spend, independent row failure, queued background sending, dedupe). Nothing an agent needs in order to call it correctly is missing.

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 schema carries 50% of descriptions (to, subject, gateway_id, schedule_at, dedupe_key) while body and channel are bare, and the description compensates by specifying that each row has its own channel, recipient and body and that row-level failures are reported with a null message id. It adds useful context about dedupe_key's retry purpose but does not enrich the nested message fields beyond what the schema already says.

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?

States a specific verb and resource ('Send up to 500 independent messages in one call') and distinguishes from batched-identical sends by saying each row has its own channel, recipient and body. An agent can immediately tell this apart from the single-message sibling sendkuy_send_message without opening either schema.

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 a clear condition for use ('when the content differs per recipient') and concrete examples (revenue per branch, notification per order, reminder per invoice). It does not explicitly name when not to use it or point to alternatives like sendkuy_send_message for single messages or start_campaign for marketing campaigns, so it stops short of 5.

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