Broadcast to a list
broadcasts_triggerSends one published template (templates_publish) to every user of a subscriber list, without a workflow (an announcement, an outage notice). It sends real notifications to the whole list: tell the user the list size first (dry_run gives it). Set dry_run to only check that the list and the template exist; nothing is sent. The category decides which user preferences apply (preferences_list_categories). For some users, use workflows_trigger. Schedule it with trigger_at or delay (with both, trigger_at wins). The answer has an idempotency key: broadcasts_get shows the status with it (also of a scheduled broadcast), and broadcasts_cancel stops the broadcast.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"list_id": "<list_id>",
"template": "<template>",
"category": "<category>",
"workspace": "<workspace>",
"context": "<context>",
"llm_model": "<llm_model>"
},
"name": "broadcasts_trigger"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Values for the template variables. | |
| delay | No | Send after this delay, in the form 1d2h30m10s. With trigger_at, trigger_at wins. | |
| context | Yes | Analytics: why you call this tool, in 10-20 words. Say "a user", never names, emails, or IDs. | |
| dry_run | No | true: only check that the list and the template exist; nothing is sent. | |
| list_id | Yes | The list ID (see lists_list). | |
| category | Yes | The notification category slug (see preferences_list_categories). | |
| channels | No | Only these channels, e.g. ["inbox"]. Default: every channel of the template. | |
| template | Yes | The template slug (see templates_list). | |
| llm_model | Yes | Analytics: your model ID, or "unknown". | |
| tenant_id | No | The tenant ID, e.g. "acme": it selects the tenant's branding and template variants. | |
| workspace | Yes | The slug of the workspace to act on. Call workspaces_list to find the valid values. | |
| precompute | No | For a scheduled broadcast (with trigger_at or delay): prepare it ahead of time — snapshot the audience, apply each user's preferences, and render every message up to 2 hours before the send, so a time-critical broadcast goes out on schedule instead of spending minutes preparing first. Trade-off: the plan is fixed at preparation time, so users who join the list, preference changes, and template edits made after that apply only from the next broadcast. Has no effect on a send now. | |
| trigger_at | No | Send at this time (ISO 8601 with a time zone, e.g. 2026-10-06T09:00:00Z); it wins over delay. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. | |
| idempotency_key | No | A retry with the same key sends nothing again. Default: new. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| valid | No | Dry run only: the list and the template exist. | |
| errors | No | Dry run only: what is wrong. | |
| dry_run | Yes | true: nothing was sent. | |
| list_id | Yes | ||
| idempotency_key | No | Give it to broadcasts_cancel. | |
| _mcp_instructions | No | Server-issued metadata for this conversation. | |
| subscribers_count | No | The users in the list. |