Skip to main content
Glama

Mailrith Email Marketing

Create a broadcast

broadcasts_create

Creates a broadcast draft in the authenticated workspace. Effect: workspace-change. Retry with the same idempotency_key. Permission: broadcasts:write. API reference: https://mailrith.com/developers/api-reference.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyYesThe exact JSON request body defined by the Mailrith public API contract.
idempotency_keyNoOptional idempotency key to retry the request safely. It must not exceed 256 UTF-8 bytes.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNo
responseNo
request_idYesThe stable correlation ID for this MCP tool invocation.
operation_idYesThe stable Mailrith public API operation ID.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed12 schema fields changed
    • changedInput schema / $defs / BroadcastEmailDocument / description
      Previous value: -"A structured email document. The root node must use type `doc` and contain supported block nodes."New value: +"A structured email document. The root node must use type `doc` and contain supported block nodes. For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedInput schema / $defs / BroadcastEmailDocument / example / content
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "text": "Hello from Mailrith.",
      -        "type": "text"
      -      }
      -    ],
      -    "type": "paragraph"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +        "type": "text"
      +      }
      +    ],
      +    "type": "paragraph"
      +  }
      +]
    • changedInput schema / $defs / BroadcastEmailDocument / examples
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "content": [
      -          {
      -            "text": "Hello from Mailrith.",
      -            "type": "text"
      -          }
      -        ],
      -        "type": "paragraph"
      -      }
      -    ],
      -    "type": "doc"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "content": [
      +          {
      +            "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +            "type": "text"
      +          }
      +        ],
      +        "type": "paragraph"
      +      }
      +    ],
      +    "type": "doc"
      +  }
      +]
    • removedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / $ref
      Removed value: -"#/$defs/BroadcastEmailDocument"
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / allOf
      Added value: +[
      +  {
      +    "$ref": "#/$defs/BroadcastEmailDocument"
      +  }
      +]
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / description
      Added value: +"For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / subject / description
      Added value: +"For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional idempotency key for safe retries."New value: +"Optional idempotency key to retry the request safely. It must not exceed 256 UTF-8 bytes."
    • addedInput schema / properties / idempotency_key / maxLength
      Added value: +256
    • changedOutput schema / $defs / BroadcastEmailDocument / description
      Previous value: -"A structured email document. The root node must use type `doc` and contain supported block nodes."New value: +"A structured email document. The root node must use type `doc` and contain supported block nodes. For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedOutput schema / $defs / BroadcastEmailDocument / example / content
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "text": "Hello from Mailrith.",
      -        "type": "text"
      -      }
      -    ],
      -    "type": "paragraph"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +        "type": "text"
      +      }
      +    ],
      +    "type": "paragraph"
      +  }
      +]
    • changedOutput schema / $defs / BroadcastEmailDocument / examples
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "content": [
      -          {
      -            "text": "Hello from Mailrith.",
      -            "type": "text"
      -          }
      -        ],
      -        "type": "paragraph"
      -      }
      -    ],
      -    "type": "doc"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "content": [
      +          {
      +            "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +            "type": "text"
      +          }
      +        ],
      +        "type": "paragraph"
      +      }
      +    ],
      +    "type": "doc"
      +  }
      +]
  2. Changed12 schema fields changed
    • changedInput schema / $defs / BroadcastEmailDocument / description
      Previous value: -"A structured email document. The root node must use type `doc` and contain supported block nodes. For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."New value: +"A structured email document. The root node must use type `doc` and contain supported block nodes."
    • changedInput schema / $defs / BroadcastEmailDocument / example / content
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      -        "type": "text"
      -      }
      -    ],
      -    "type": "paragraph"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "text": "Hello from Mailrith.",
      +        "type": "text"
      +      }
      +    ],
      +    "type": "paragraph"
      +  }
      +]
    • changedInput schema / $defs / BroadcastEmailDocument / examples
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "content": [
      -          {
      -            "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      -            "type": "text"
      -          }
      -        ],
      -        "type": "paragraph"
      -      }
      -    ],
      -    "type": "doc"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "content": [
      +          {
      +            "text": "Hello from Mailrith.",
      +            "type": "text"
      +          }
      +        ],
      +        "type": "paragraph"
      +      }
      +    ],
      +    "type": "doc"
      +  }
      +]
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / $ref
      Added value: +"#/$defs/BroadcastEmailDocument"
    • removedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / allOf
      Removed value: -[
      -  {
      -    "$ref": "#/$defs/BroadcastEmailDocument"
      -  }
      -]
    • removedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / description
      Removed value: -"For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • removedInput schema / $defs / BroadcastUpsertRequest / properties / subject / description
      Removed value: -"For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional idempotency key to retry the request safely. It must not exceed 256 UTF-8 bytes."New value: +"Optional idempotency key for safe retries."
    • removedInput schema / properties / idempotency_key / maxLength
      Removed value: -256
    • changedOutput schema / $defs / BroadcastEmailDocument / description
      Previous value: -"A structured email document. The root node must use type `doc` and contain supported block nodes. For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."New value: +"A structured email document. The root node must use type `doc` and contain supported block nodes."
    • changedOutput schema / $defs / BroadcastEmailDocument / example / content
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      -        "type": "text"
      -      }
      -    ],
      -    "type": "paragraph"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "text": "Hello from Mailrith.",
      +        "type": "text"
      +      }
      +    ],
      +    "type": "paragraph"
      +  }
      +]
    • changedOutput schema / $defs / BroadcastEmailDocument / examples
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "content": [
      -          {
      -            "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      -            "type": "text"
      -          }
      -        ],
      -        "type": "paragraph"
      -      }
      -    ],
      -    "type": "doc"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "content": [
      +          {
      +            "text": "Hello from Mailrith.",
      +            "type": "text"
      +          }
      +        ],
      +        "type": "paragraph"
      +      }
      +    ],
      +    "type": "doc"
      +  }
      +]
  3. Changed2 schema fields changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional idempotency key for safe retries."New value: +"Optional idempotency key to retry the request safely. It must not exceed 256 UTF-8 bytes."
    • addedInput schema / properties / idempotency_key / maxLength
      Added value: +256
  4. Changed10 schema fields changed
    • changedInput schema / $defs / BroadcastEmailDocument / description
      Previous value: -"A structured email document. The root node must use type `doc` and contain supported block nodes."New value: +"A structured email document. The root node must use type `doc` and contain supported block nodes. For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedInput schema / $defs / BroadcastEmailDocument / example / content
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "text": "Hello from Mailrith.",
      -        "type": "text"
      -      }
      -    ],
      -    "type": "paragraph"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +        "type": "text"
      +      }
      +    ],
      +    "type": "paragraph"
      +  }
      +]
    • changedInput schema / $defs / BroadcastEmailDocument / examples
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "content": [
      -          {
      -            "text": "Hello from Mailrith.",
      -            "type": "text"
      -          }
      -        ],
      -        "type": "paragraph"
      -      }
      -    ],
      -    "type": "doc"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "content": [
      +          {
      +            "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +            "type": "text"
      +          }
      +        ],
      +        "type": "paragraph"
      +      }
      +    ],
      +    "type": "doc"
      +  }
      +]
    • removedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / $ref
      Removed value: -"#/$defs/BroadcastEmailDocument"
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / allOf
      Added value: +[
      +  {
      +    "$ref": "#/$defs/BroadcastEmailDocument"
      +  }
      +]
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / body_document / description
      Added value: +"For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • addedInput schema / $defs / BroadcastUpsertRequest / properties / subject / description
      Added value: +"For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedOutput schema / $defs / BroadcastEmailDocument / description
      Previous value: -"A structured email document. The root node must use type `doc` and contain supported block nodes."New value: +"A structured email document. The root node must use type `doc` and contain supported block nodes. For Subscriber personalization in email subjects and body text nodes, use Mailrith bracket tokens such as [Subscriber_Name, fallback=\"friend\"] or [Subscriber_Email, fallback=\"\"]. Before using a custom field, call custom_fields_list or custom_fields_get and copy its personalization_token exactly. Do not use Handlebars-style variables such as {{ subscriber.name }}; Mailrith sends them as literal text."
    • changedOutput schema / $defs / BroadcastEmailDocument / example / content
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "text": "Hello from Mailrith.",
      -        "type": "text"
      -      }
      -    ],
      -    "type": "paragraph"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +        "type": "text"
      +      }
      +    ],
      +    "type": "paragraph"
      +  }
      +]
    • changedOutput schema / $defs / BroadcastEmailDocument / examples
      Previous value: -[
      -  {
      -    "content": [
      -      {
      -        "content": [
      -          {
      -            "text": "Hello from Mailrith.",
      -            "type": "text"
      -          }
      -        ],
      -        "type": "paragraph"
      -      }
      -    ],
      -    "type": "doc"
      -  }
      -]New value: +[
      +  {
      +    "content": [
      +      {
      +        "content": [
      +          {
      +            "text": "Hello [Subscriber_Name, fallback=\"friend\"].",
      +            "type": "text"
      +          }
      +        ],
      +        "type": "paragraph"
      +      }
      +    ],
      +    "type": "doc"
      +  }
      +]
  5. First observed

TDQS

A4/5.0
Behavior4/5

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

Annotations provide readOnlyHint=false and destructiveHint=false, but the description adds valuable behavioral context: 'Effect: workspace-change', required permission, and idempotency retry guidance. This goes beyond the annotation hints and offers a clear side-effect profile, though it does not describe return values or validation behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences, each with a purpose: defining the action, noting side effects, explaining idempotency, and giving permission/reference. No wasted words or redundant information.

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?

Given the complex nested body schema, the description adequately covers purpose, side effect, permission, and idempotency, and points to an API reference for deeper detail. However, it does not explain when to use this over similar create tools or clarify that the draft is not sent automatically, though 'draft' implies that. The presence of output schema compensates for not describing return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (both body and idempotency_key have descriptions). The description itself adds minimal parameter-level detail beyond the schema, merely restating that the idempotency key can be retried, which is already in the schema. It correctly does not duplicate schema content.

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 clearly states 'Creates a broadcast draft in the authenticated workspace', using a specific verb and resource, and explicitly notes 'draft' to distinguish from send/schedule tools. This differentiates it from sibling tools like broadcasts_send and broadcasts_schedule.

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?

The description provides context that this is a create operation and mentions permission and idempotency, but does not explicitly state when to use this vs alternatives (e.g., broadcasts_update, broadcasts_send). It does not reference sibling tools or give exclusion criteria, leaving usage inference to the name.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A3.8/5.0
Disambiguation5/5

Every tool is prefixed by its resource and targets a unique action, so there is no real overlap between tools. Even similar operations like preflight, preview_journey, and send_test are clearly separated by resource and described with distinct effects.

Naming Consistency5/5

All tools follow a consistent `resource_action` snake_case pattern, e.g., broadcasts_create, subscribers_upsert, sequences_update_status. Custom verbs like cancel, unschedule, and preview_journey still fit the same predictable convention.

Tool Count1/5

55 tools is an extreme count for a single MCP server, making it difficult for an agent to efficiently discover and choose among the surface. While each tool appears justified, the size suggests the API should be split into focused servers by resource domain.

Completeness3/5

The broadcast, automation, sequence, and subscriber workflows are well covered with lifecycle operations. However, custom fields and segments only have read/list/preview operations with no create, update, or delete, and several resources lack delete endpoints, leaving notable gaps for full lifecycle management.