Skip to main content
Glama

Server Details

Send notifications, manage templates, and configure integrations with Courier.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 39 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Server Listing
Courier MCP Server

TDQS

B3.1/5.0

Scored across 170 tools

Disambiguation3/5

The descriptions are unusually detailed and often explicitly distinguish near-neighbors (e.g., get_audience vs list_audience_members, get_user_preferences vs get_user_preference_topic), but 170 tools still creates real selection risk. Many name pairs like send_message/send_message_template, create_notification/create_journey_template, and the cluster of bulk_* preference/user tools could easily be mischosen without careful reading.

Naming Consistency3/5

Everything is snake_case verb_noun and generally readable, but the verb conventions are inconsistent across similar operations: create vs add vs put vs replace vs update are all used for essentially the same kind of lifecycle action. Prefix ordering also varies (add_bulk_users vs bulk_add_user_tenants), and archive vs delete is used inconsistently across resources.

Tool Count1/5

170 tools is an extreme mismatch for an MCP server, even one mirroring a large API. This far exceeds the 50+ threshold for a 1 and would overwhelm an agent's tool-selection process regardless of how well-organized the underlying API is.

Completeness4/5

The surface is remarkably comprehensive, covering templates, journeys, broadcasts, lists, users, tenants, preferences, audiences, providers, routing, previews, digests, translations, messages, metrics, and audit events. Minor gaps exist, such as automation templates being list/invoke-only with no create/update/delete lifecycle, and translations lacking list/delete, but these are edge cases in an otherwise full domain.

Available Tools

170 tools
add_bulk_usersBInspect

Add users to an existing bulk job.

ParametersJSON Schema
NameRequiredDescriptionDefault
usersYesArray of user objects to add
job_idYesThe bulk job ID

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate this is not read-only but not destructive; the description adds nothing beyond the operation itself. It does not disclose whether users are appended or replaced, whether duplicates are allowed, whether the job must be in a draft state, or any effects on an already-running job.

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 description is a single, front-loaded sentence with no filler. It is efficient, though the brevity comes at the cost of behavioral and workflow context.

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

Completeness3/5

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

For a simple two-parameter mutation with no output schema, the description is minimally adequate, especially since the schema covers both parameters. It omits the lifecycle relationship with create_bulk_job/run_bulk_job and any constraints, leaving an agent to guess the intended workflow.

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?

Input schema coverage is 100%, with descriptions for both job_id and users, so a baseline of 3 applies. The description adds no additional parameter semantics beyond restating that users are added to an existing job.

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 description states a clear action ('Add users') and the target resource ('an existing bulk job'), which distinguishes it from creation and execution tools such as create_bulk_job and run_bulk_job. It does not, however, clarify what a 'bulk job' is or how this differs from list/tenant/user bulk operations, leaving some ambiguity.

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 word 'existing' conveys that this must be used only after a bulk job has been created, which is an implicit usage condition. No alternative tools or when-not-to-use guidance are provided, so an agent must infer placement in the create→add→run workflow from the sibling names.

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

add_subscribers_to_listAInspect

Append subscribers to a list without removing existing subscribers.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID
recipientsYesRecipients to set on the list

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate this is not read-only, not idempotent, and not destructive. The description adds one useful behavioral guarantee—existing subscribers are preserved—but does not disclose duplicate handling, failure modes, or response behavior. This is acceptable given the annotations but not rich.

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 a single front-loaded sentence with no wasted words. It states the action, the target, and the key non-destructive qualifier in eleven words.

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 simple two-parameter schema, 100% parameter documentation, and safety-relevant annotations, the description is largely complete for selecting and invoking the tool. It could mention duplicate behavior or the response format, but for a straightforward append operation this is not a critical gap.

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%, so the schema already documents list_id and recipients. The description adds little beyond framing recipients as subscribers. Notably, the schema's 'Recipients to set on the list' wording slightly conflicts with the append semantics, but that is a schema issue, not compensated by the description.

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 description states a specific verb ('Append'), a resource ('subscribers to a list'), and the key behavioral qualifier 'without removing existing subscribers.' This clearly conveys the core operation, though it does not explicitly distinguish itself from sibling tools like bulk_subscribe_to_list or subscribe_user_to_list.

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 phrase 'without removing existing subscribers' implies this tool is appropriate when preservation of existing list membership matters, and not for replacement-style updates. However, it provides no explicit when-to-use guidance or mention of alternatives among the many sibling list/subscription tools.

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

add_user_to_tenantC
Idempotent
Inspect

Add a user to a tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoTenant-scoped profile overrides
user_idYesThe user ID
tenant_idYesThe tenant ID

TDQS

C2.4/5.0
Behavior2/5

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

The description provides no behavioral traits beyond the annotation block: it only restates the action. It does not explain idempotent behavior, whether existing memberships are replaced, or what profile overrides do; the annotations already supply the read-only/destructive hints but the description adds no extra context.

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 description is a single sentence with no filler or repetition, and the core action is front-loaded. It is not overly verbose, though its brevity comes at the cost of useful context.

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

Completeness2/5

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

With no output schema, a nested profile object, and ambiguous sibling operations, the description leaves users without return-value expectations, membership semantics, or profile-override behavior. It is barely adequate for a tool with only two required scalar fields but insufficient given the surrounding toolset.

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 coverage is 100%, so the schema already documents user_id, tenant_id, and profile. The description adds no parameter-specific meaning beyond echoing the roles of user and tenant, which keeps it at the baseline.

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

Purpose2/5

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

The description is a plain-language restatement of the tool name — 'Add a user to a tenant' adds no information beyond the name/title. It gives no detail about tenant-scoped profiles or how this differs from add_bulk_users and bulk_add_user_tenants, so it does not achieve sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to call this tool instead of add_bulk_users, bulk_add_user_tenants, or remove_user_from_tenant. The core operation can be inferred from the name, but the description does not state contexts, prerequisites, or exclusions.

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

archive_journeyA
DestructiveIdempotent
Inspect

Archive a journey. Archived journeys cannot be invoked but existing runs continue to completion.

ParametersJSON Schema
NameRequiredDescriptionDefault
journey_idYesThe journey template ID to archive

TDQS

A4/5.0
Behavior4/5

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

Annotations only indicate destructive, idempotent, and non-read-only behavior. The description adds the specific impact not present in annotations: archived journeys cannot be invoked and existing runs continue. This is valuable extra context for a destructive operation.

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?

Two tightly written sentences: the action first, then the key consequence. No filler, no redundant restating of schema or annotations.

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 single-required-parameter archive operation with no output schema, the description covers the essential behavior and outcome: the journey is archived, future invocations stop, and running executions finish. It could add reversibility or permanence details, but the destructiveHint annotation already signals that risk.

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?

The schema already documents journey_id with 'The journey template ID to archive' and has 100% coverage, so the description need not repeat parameter details. It adds no additional parameter-level nuance beyond what the schema provides, so a baseline 3 is appropriate.

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 description uses a specific verb and resource ('Archive a journey') and clarifies the consequence of archiving: future invocations are blocked while existing runs continue. It does not explicitly differentiate from the sibling 'archive_journey_template', whose name overlaps, but the resource naming is still clear.

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?

The phrase 'cannot be invoked but existing runs continue to completion' explains the scenario where this tool applies: you want to stop new invocations without interrupting active runs. It does not explicitly name alternatives like cancel_journey or archive_journey_template, but the behavioral context is enough to guide selection.

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

archive_journey_templateA
DestructiveIdempotent
Inspect

Archive a journey-scoped notification template. Archived templates cannot be sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
journey_idYesThe journey template ID that owns this notification
notification_idYesThe notification template ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the description does not need to re-state those traits. It adds genuine behavioral context by warning that archived templates cannot be sent, which is not present in the annotations or schema. No contradiction exists between the description and annotations.

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 two short sentences with the action and scope front-loaded, followed by the most important behavioral consequence. Every sentence earns its place, with no filler or redundant restatement of the tool name.

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 two-parameter archive operation with no output schema, the description plus the fully documented input schema provides enough context to call the tool safely and correctly. It could be slightly richer by mentioning whether archiving is reversible or how it relates to siblings, but nothing essential is missing.

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 journey_id and notification_id already have meaningful descriptions in the input schema. The tool description only reinforces that the notification is journey-scoped and does not add new parameter-level meaning, so the schema-driven baseline of 3 is appropriate.

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 uses a specific verb ('Archive') and identifies the resource as 'a journey-scoped notification template,' which clearly differentiates it from siblings like archive_journey and archive_notification. It also states the practical consequence ('Archived templates cannot be sent'), making the tool's purpose unambiguous.

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 'journey-scoped' qualifier implies this tool is for notification templates owned by a journey, but the description does not explicitly name alternatives or state when not to use this tool (e.g., using archive_notification for standalone templates). Usage guidance is therefore more implied than explicitly contrasted with sibling tools.

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

archive_notificationB
DestructiveIdempotent
Inspect

Archive a notification template by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
notification_idYesThe notification template ID to archive

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description aligns with those. However, the description adds no extra behavioral context beyond the annotations—it does not mention irreversibility, soft-delete semantics, or what happens to the notification template after archiving.

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 one tight sentence with no filler. The verb, resource, and selection mechanism are all present and front-loaded, making it efficient and easy to parse.

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

Completeness3/5

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

The tool is simple and the annotations cover the destructive profile, but the description still leaves gaps: no return/output information, no postcondition details, and no differentiation among the many archive_* siblings. It is minimally adequate but not fully complete.

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%, and the parameter description already states the notification template ID is to be archived. The tool description adds no new parameter semantics, so the baseline 3 is appropriate.

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 uses a specific verb, 'Archive', and a clear resource, 'notification template', with the selection method 'by ID'. This distinguishes it from other archive_* siblings such as archive_journey_template or archive_routing_strategy without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives like archive_journey_template or archive_request. The description states only the action and resource; no when-not conditions, prerequisites, or alternative references are provided.

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

archive_preference_sectionA
DestructiveIdempotent
Inspect

Archive a preference section. The section must be empty: delete its topics first, otherwise the request fails with 409.

ParametersJSON Schema
NameRequiredDescriptionDefault
section_idYesId of the preference section to archive

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable behavioral context beyond those annotations by stating that non-empty sections cause a 409 and that topics must be removed first. This operational constraint is not inferable from the annotations alone.

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 just two sentences with no filler. The core action is stated first, followed immediately by the critical precondition. Every word contributes to effective tool invocation.

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?

For a single-parameter mutation with no output schema, the description covers the essential operational context: what the tool does, what must be true before calling it, and what happens if that condition is violated. The annotations cover idempotency and destructiveness, so nothing important is missing.

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?

The schema already provides full coverage for the single parameter, section_id, with a clear description. The tool description does not add extra parameter-level detail, but the schema handles that sufficiently, so the baseline of 3 is appropriate.

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 uses a specific verb ('Archive') and a clear resource ('a preference section'), making the tool's function immediately identifiable. It also distinguishes itself from sibling tools like create_preference_section, replace_preference_section, and archive_preference_topic by naming the exact object being acted upon.

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?

The description gives an explicit precondition: the section must be empty, and topics must be deleted first. It also specifies the failure mode (409) if this precondition is not met. It does not explicitly name an alternative tool such as archive_preference_topic, but the guidance is clear enough for an agent to understand the required workflow.

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

archive_preference_topicB
DestructiveIdempotent
Inspect

Archive a topic within a section.

ParametersJSON Schema
NameRequiredDescriptionDefault
topic_idYesId of the subscription preference topic to archive
section_idYesId of the preference section

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the safety profile is covered. The description adds only the section-scoping context, not extra behavioral detail such as whether archiving affects subscribers or is reversible.

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?

A single sentence with no filler; the verb and object are front-loaded and the sentence is easy to parse.

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

Completeness3/5

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

For a two-parameter mutation with full schema coverage and safety annotations, the description is minimally sufficient. However, there is no explanation of what archiving does semantically or what a successful call returns, and the wording is thin for a destructive operation.

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%, so the schema already documents both topic_id and section_id. The description's 'within a section' conveys a slight relationship hint but does not add meaningful parameter semantics beyond the schema.

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?

States a specific verb ('Archive') and a specific resource ('topic within a section'), which already separates it from archive_preference_section and archive_journey. It does not explicitly name the sibling for section archiving, so it doesn't fully earn a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus sibling archive_preference_section, get_preference_topic, or delete_user_preference_topic. No exclusions or prerequisites are mentioned.

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

archive_preview_device_setA
DestructiveIdempotent
Inspect

Archive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_set_idYesThe device set id (pvs_...)

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (destructive, idempotent, not read-only), the description adds valuable behavioral context: existing runs are unaffected because they retain their own copies, and the Courier Recommended set is protected from archiving. This helps an agent anticipate side effects and avoid an invalid invocation.

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 two short sentences with no wasted words. The core action is front-loaded, and the two behavior-relevant caveats follow immediately. Every sentence earns its place.

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?

For a one-parameter archive tool with no output schema, this description is complete: it states what happens, why it's safe for existing runs, and the one prohibited target. An agent has enough information to decide when to use it and how to invoke it correctly.

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?

The input schema already provides 100% coverage for the single parameter device_set_id, including its format hint (pvs_...). The description adds no additional parameter-level detail, which is acceptable since the schema fully documents the required input.

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 states the action clearly: 'Archive a preview device set.' This uses a specific verb and resource, distinguishing it from related siblings like create_preview_device_set, replace_preview_device_set, get_preview_device_set, and list_preview_device_sets. The first sentence alone makes the tool's purpose unambiguous.

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?

The description gives clear context: runs that used the set keep their own copy, so archiving is safe for historical data. It also gives a direct when-not condition ('The Courier Recommended set cannot be archived'). It doesn't explicitly name alternative tools, but the operation is self-explanatory and the constraints are practical.

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

archive_requestB
DestructiveIdempotent
Inspect

Archive a send request and all its associated messages by request ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYesThe request ID (requestId returned from /send)

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already carry idempotentHint=true and destructiveHint=true, lowering the description's burden. The description adds useful context by stating that archiving affects 'all associated messages', not just the request. It does not explicitly mention irreversibility or post-archive effects, but the annotation coverage mitigates that gap.

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 a single 12-word sentence with a clear verb-object structure and no filler. It is front-loaded with the action and resource, making it easy for an agent to quickly parse.

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?

With one well-documented parameter and annotations declaring destructive and idempotent behavior, the description covers the operation's scope adequately. It lacks an explicit note about irreversibility or return value, but this is a simple operation and the schema plus annotations fill most gaps.

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?

The input schema documents the sole parameter request_id with a clear description ('The request ID (requestId returned from /send)'), so schema coverage is 100%. The description only rephrases 'by request ID' and adds no format, source, or validation detail beyond the schema.

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 description states a specific action ('Archive'), a resource ('a send request'), and the scope ('all its associated messages'), with the lookup method ('by request ID'). It is clear enough to distinguish from sibling archive_* tools that target journeys, templates, notifications, and preferences, though it does not explicitly name an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, prerequisites, or exclusions are provided. It does not tell an agent to prefer this tool over related message tools like cancel_message or resend_message, nor when not to use it. The only usage signal is the inherent action of archiving, requiring the agent to infer applicability.

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

archive_routing_strategyA
DestructiveIdempotent
Inspect

Archive a routing strategy. The strategy must not have associated notification templates; unlink all templates before archiving.

ParametersJSON Schema
NameRequiredDescriptionDefault
routing_strategy_idYesThe routing strategy ID to archive

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructive and non-read-only behavior. The description adds that archiving is gated on absence of notification templates and tells the caller to unlink first, which is meaningful context beyond annotations. It doesn't discuss reversibility or failure cases, but the annotation coverage lowers the burden.

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?

Two sentences, action first, precondition second, and no filler. The clause about unlinking templates is essential and earns its place.

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 single-parameter archive operation with annotations covering destructiveness and idempotency, the description covers the action and the central precondition. It doesn't identify the tool used to unlink templates or describe the response, but these are minor for this simple operation.

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 covers routing_strategy_id at 100%, so the parameter is fully documented in the schema. The description adds no extra detail about ID format, source, or how to obtain it, so the baseline 3 applies.

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 precise verb and object: 'Archive a routing strategy.' The resource is specific and uniquely identifies this operation among sibling archive_* tools, distinguishing it from archive_notification, archive_journey, and similar.

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 prerequisite: the strategy must not have associated notification templates and instructs to unlink templates before archiving. It doesn't name alternative tools or explicitly say when not to use it, but the precondition provides usable call-condition guidance.

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

bulk_add_user_tenantsA
Idempotent
Inspect

Add a user to multiple tenants at once. A custom profile can be supplied per tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantsYesArray of tenant associations
user_idYesThe user ID

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already communicate that this is a mutating but idempotent, non-destructive operation. The description adds the useful detail that a custom profile can be applied per tenant, but does not disclose anything about partial failures, existing associations, or what happens after the operation. No contradiction exists between text and annotations.

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?

Two short sentences with no filler. The first states the core action and scope; the second adds the optional per-tenant profile behavior. Every word contributes useful 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?

For a two-parameter mutation with fully described schema fields and an idempotency annotation, the description covers the essential invocation context. The only nuance not addressed—such as behavior when the user already belongs to a tenant—is not necessary to make a correct first call.

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?

The schema already provides descriptions for both user_id and the tenants array, giving 100% coverage. The description's mention of a custom profile per tenant slightly reinforces the schema's 'Tenant-scoped profile overrides', but does not add substantial meaning beyond what the schema already states.

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 uses a specific action ('Add a user to multiple tenants at once') and clearly distinguishes this tool from the single-tenant sibling add_user_to_tenant by emphasizing the bulk, multi-tenant nature. It also adds the per-tenant custom profile capability, which makes the purpose unmistakable.

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 implies this is the right choice when multiple tenants need to be handled in one call, but it does not explicitly name add_user_to_tenant as the alternative for single-tenant operations or state any exclusion criteria. An agent must infer the usage boundary from the tool name and wording.

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

bulk_add_user_tokensAInspect

Add multiple push/device tokens for a user in one request. Overwrites matching existing tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokensYesToken records to upsert
user_idYesThe user ID

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate a write operation, so the description adds value by disclosing that matching existing tokens are overwritten rather than appended, preventing duplicate accumulation. It does not cover failure modes or what counts as a 'matching' token, but the overwrite behavior is a meaningful disclosure beyond the annotations.

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 exactly two sentences: the first delivers the primary action and scope, and the second adds the critical overwrite behavior. There is no filler or redundant restatement of the tool name.

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

Completeness3/5

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

For a bulk mutation with a nested token schema and no output schema, the description covers the core semantics but leaves gaps: it does not explain the key used to match existing tokens, how duplicates inside the same request are handled, or what response/error behavior to expect. It is serviceable for basic invocation but not fully complete.

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?

The input schema fully documents both parameters and nested fields like token, provider_key, expiry_date, and device metadata, so the description does not need to repeat them. The description adds only the generic framing of 'push/device tokens,' which does not elevate it beyond the schema baseline.

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 states a specific action—adding multiple push/device tokens for a user in one request—and distinguishes it from singular token tools like create_or_replace_user_push_token by emphasizing batch operation. The overwrite note further clarifies the operation's semantics.

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 implies the batch use case with 'multiple tokens in one request' and upsert behavior with 'overwrites matching existing tokens,' but it never explicitly names alternatives or states when to prefer this over a singular token tool. No exclusions or conditions are provided.

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

bulk_replace_user_preferencesA
DestructiveIdempotent
Inspect

Replace a user's complete set of preference overrides in one request. The topics in the body become the recipient's entire override set: listed topics are created or updated, and every existing override not included is reset to its topic default. An empty topics array clears all overrides. Validation-atomic (all-or-nothing).

ParametersJSON Schema
NameRequiredDescriptionDefault
topicsYesThe complete set of topic overrides. An empty array resets every existing override.
user_idYesThe user ID
tenant_idNoScope the replacement to a specific tenant context

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses destructive behavior in detail: omitted overrides are reset to defaults and an empty array clears all overrides, going beyond the annotations' destructiveHint=true. It also adds the validation-atomicity trait, which annotations do not convey, and there is no contradiction with readOnlyHint=false or idempotentHint=true.

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?

Three short sentences plus one atomicity tag; each sentence carries a distinct fact (scope, reset behavior, empty-array behavior, transactional guarantee). The purpose is front-loaded and there is no filler.

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?

The description is complete enough for a destructive bulk replace: it explains the full replacement contract, the empty-array edge case, and atomicity, while annotations and full schema coverage handle safety and parameter meaning. It does not mention an alternative for partial updates or describe the response/return value, but given no output schema and a clear mutation contract, those are minor gaps.

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 input schema already documents all parameters (100% coverage), so the description does not need to repeat definitions. It adds meaningful behavior for `topics`—listed topics are created or updated, omitted ones are reset to defaults—which goes slightly beyond the schema's 'complete set' summary. Other parameters like `user_id` and `tenant_id` are adequately covered by schema descriptions.

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 a specific verb and object ('Replace a user's complete set of preference overrides'), and the second sentence clarifies the exact scope of replacement ('entire override set', 'every existing override not included is reset'). This clearly distinguishes the full-replace semantics from partial-update siblings even without naming them.

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?

The description makes the use case explicit: use this tool when the caller wants to set a user's full override set in one atomic request. It implies that partial updates or single-topic changes belong elsewhere, though it does not explicitly name alternatives like bulk_update_user_preferences, so the routing guidance is slightly implicit.

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

bulk_subscribe_to_listA
DestructiveIdempotent
Inspect

Replace all subscribers on a list with the given recipients.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID
recipientsYesRecipients to set on the list

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds useful context by specifying that the destructive effect is replacing all existing subscribers with the supplied recipients, which is consistent with the annotations.

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 a single concise sentence that front-loads the core behavior ('Replace') and the object ('all subscribers on a list'). Every word earns its place, with no redundant filler.

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 the low complexity, complete parameter schema, and annotations covering destructive and idempotent behavior, the description fully enables an agent to call the tool correctly. No critical usage detail, such as the replacement semantics, is missing.

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%, with list_id and recipients documented. The tool description reinforces that recipients become the full replacement set, but it adds no parameter-level detail beyond what the schema already provides, such as format, constraints, or edge cases.

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 uses a specific verb ('Replace') and clearly identifies the resource ('all subscribers on a list') and the action ('with the given recipients'). This immediately distinguishes it from additive siblings like add_subscribers_to_list or subscribe_user_to_list.

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?

'Replace all subscribers' clearly conveys that this tool is for setting the exact subscriber set rather than incrementally adding subscribers. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough for an agent to select the correct operation.

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

bulk_update_user_preferencesAInspect

Additively create or update a user's preferences for one or more topics in a single request. Only the topics in the body are touched; existing overrides for other topics are left untouched. Partial-success: valid topics are written and returned in items, unapplicable ones collected in errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicsYesTopics to create or update
user_idYesThe user ID
tenant_idNoScope the update to a specific tenant context

TDQS

A4.2/5.0
Behavior4/5

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

Annotations carry the basic safety profile (readOnly=false, idempotent=false, destructive=false), and the description adds genuinely valuable behavior on top: the partial-success contract ('valid topics are written and returned in items, unapplicable ones collected in errors') and the non-destructive scoping to only topics present in the body. It does not contradict annotations; 'create or update' aligns with readOnlyHint=false.

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?

Three sentences, roughly 40 words, each earning its place: core purpose, scoping behavior, and partial-success behavior. The most decision-relevant fact (additive, not replace) is front-loaded in the first clause.

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 bulk mutation with partial-success semantics, the description covers the essential facts: additive create-or-update behavior, touched-topic scoping, and the items/errors result split that compensates for the absent output schema. Minor gaps remain — it does not route explicitly to bulk_replace_user_preferences for replacement needs, explain tenant_id's effect, or detail the exact shape of items/errors entries — but none block correct invocation.

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%, so the schema already documents user_id, topics, and tenant_id with individual descriptions; baseline 3 applies. The description reinforces that topics entries are processed individually via the partial-success split but adds no syntax or format details beyond what the schema provides.

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?

Begins with a specific verb+resource ('Additively create or update a user's preferences') and bounds the scope to 'one or more topics in a single request.' The phrase 'Only the topics in the body are touched; existing overrides for other topics are left untouched' clearly differentiates it from the sibling bulk_replace_user_preferences without needing to open 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?

The 'Additively' qualifier and 'existing overrides for other topics are left untouched' effectively convey when this tool is appropriate: partial, additive updates rather than wholesale replacement. However, it stops short of explicitly naming bulk_replace_user_preferences as the alternative for full-replacement scenarios or stating a when-not-to-use condition.

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

cancel_automationA
Idempotent
Inspect

Cancel a running automation by its cancelation_token. This invokes a second ad-hoc automation with a single cancel step. The token must match the cancelation_token set when the original automation was started. Note: spelling is "cancelation_token" (single "l").

ParametersJSON Schema
NameRequiredDescriptionDefault
cancelation_tokenYesThe cancelation_token that was set when the automation was originally invoked

TDQS

A4.1/5.0
Behavior4/5

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

The description adds valuable behavioral details beyond annotations: it reveals that cancellation works by invoking a second ad-hoc automation with a single cancel step, which is non-obvious and useful. The spelling note also helps avoid invocation errors. Annotations already cover idempotence and non-destructive nature, so the bar is partially lowered.

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 description is concise and front-loaded with the core purpose. Four sentences are used, but each earns its place: the cancellation mechanism, the token matching prerequisite, and the spelling note are all relevant. Minor redundancy exists between 'cancelation_token' appearing in the first and third sentences.

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 simple one-parameter tool, the description is largely complete: it explains the action, the mechanism, and the token requirement. The lack of an output schema is acceptable since return values are not critical for invocation. It could briefly mention when not to use it, but this is not a significant gap.

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?

The input schema already documents the single parameter with 100% coverage. The description reinforces the matching requirement and adds a spelling clarification, but does not substantially expand parameter semantics beyond what the schema provides.

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 states an unambiguous action ('Cancel a running automation') and specifies the exact resource and identifier mechanism ('cancelation_token'). It clearly differentiates from sibling tools like cancel_journey and cancel_message by targeting automations specifically.

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?

The description provides clear context: use this tool to cancel a running automation, and the token must match the original cancelation_token. It does not explicitly exclude other scenarios or name alternatives, but the context is clear enough for correct selection.

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

cancel_broadcast_scheduleA
DestructiveIdempotent
Inspect

Cancel a broadcast's scheduled send. The broadcast itself is kept.

ParametersJSON Schema
NameRequiredDescriptionDefault
broadcast_idYesThe broadcast id

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide idempotentHint and destructiveHint, and the description adds the key context that the broadcast itself is preserved, which refines what 'destructive' means here. It does not overpromise or contradict the annotations.

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 two short sentences with no filler. The primary action is front-loaded, and the clarifying scope ('broadcast itself is kept') earns its place immediately.

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 single-parameter, no-output-schema tool, the description plus annotations cover the essential behavior: what is canceled, what is preserved, and that the operation is destructive-but-idempotent. Minor missing context about response values or no-op behavior is acceptable given the tool's simplicity.

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 coverage is 100%: the only parameter, broadcast_id, is already described as 'The broadcast id'. The description adds no new parameter-level detail beyond tying it to the broadcast being canceled, so baseline 3 is appropriate.

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 states a specific verb ('Cancel') and a precise resource ('a broadcast's scheduled send'), and clarifies the broadcast itself is kept, distinguishing this from delete_broadcast and other cancellation tools. This is unambiguous and actionable.

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 implies this is for future scheduled sends rather than sent messages, but it does not explicitly state when to prefer this over siblings like cancel_message, cancel_automation, or delete_broadcast. No alternatives or exclusions are named.

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

cancel_journeyA
DestructiveIdempotent
Inspect

Cancel journey runs. Supply EXACTLY ONE of cancelation_token (cancels every run associated with the token) or run_id (cancels a single run). Cancelation is idempotent: a run that already finished or was already canceled is left unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNoCancels a single run by id. Mutually exclusive with cancelation_token.
cancelation_tokenNoCancels every run associated with this token. Mutually exclusive with run_id.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide destructiveHint and idempotentHint, but the description goes further by spelling out what idempotency means in practice: already-finished or already-canceled runs are left unchanged. It also discloses that cancelation_token affects every run associated with the token, which is key behavioral context beyond the annotation flags.

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?

Two short sentences deliver the essential information in order: what the tool does, the parameter selection rule, and idempotency behavior. There is no filler, repetition, or unnecessary elaboration.

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?

For a two-parameter cancellation tool with strong annotations and full schema coverage, the description is sufficient. It covers the action, the parameter constraint, and the idempotency behavior. No output schema exists, but none is needed for an agent to invoke this tool correctly.

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 input schema already documents both parameters and their mutual exclusivity with 100% coverage. The description adds value by emphasizing 'EXACTLY ONE' as a hard invocation rule and summarizing the semantic difference between canceling a single run and canceling every run tied to a token, which helps an agent select the right parameter without opening the schema definitions.

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 names a specific verb and resource: 'Cancel journey runs,' which distinguishes this tool from siblings like cancel_automation, cancel_message, and cancel_notification_submission. It also clarifies the two scopes of cancellation (token-wide vs single run), making the tool's purpose unambiguous.

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?

The description gives explicit invocation guidance: supply EXACTLY ONE of cancelation_token or run_id. It also explains the consequence of each choice. It does not explicitly state when to prefer this tool over sibling cancel tools, but the resource-focused name and 'journey runs' phrasing make the intended context clear.

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

cancel_messageA
DestructiveIdempotent
Inspect

Cancel a message that is currently being delivered. Returns the message details with updated status.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message ID to cancel

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already signal destructive and idempotent behavior. The description adds meaningful context by specifying the in-delivery precondition and stating that the return value contains the message details with updated status. This goes beyond what annotations and schema provide, with no contradiction.

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?

Two short sentences with no filler. The core action and precondition are front-loaded, and the return behavior is stated efficiently in the second sentence.

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?

For a single-parameter destructive action, the description covers the action, the valid precondition, and the return value. Annotations cover idempotency and destructiveness, so nothing essential is missing for an agent to invoke it correctly.

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?

The schema describes message_id as 'The message ID to cancel' with 100% parameter coverage, so the schema already carries the meaning. The description adds no additional syntax, format, or source guidance for the parameter, which lands at the expected baseline.

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 an explicit action ('Cancel'), a specific resource ('a message'), and a precondition ('currently being delivered'). This clearly differentiates it from sibling tools like cancel_automation, cancel_journey, and cancel_notification_submission without needing to inspect their schemas.

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?

The phrase 'currently being delivered' gives a clear condition for when this tool applies, which helps an agent decide whether cancellation is appropriate. It does not explicitly name alternatives or exclusions, but the precondition is contextually strong enough for basic routing.

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

cancel_notification_submissionA
DestructiveIdempotent
Inspect

Cancel a notification template submission.

ParametersJSON Schema
NameRequiredDescriptionDefault
submission_idYesThe submission ID to cancel
notification_idYesThe notification template ID

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered by structured data. The description adds no additional behavioral context, such as whether cancellation is reversible or what happens to the submission, but it does not contradict the annotations.

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?

One short sentence with no filler, redundant modifiers, or irrelevant context. The action and resource are front-loaded, and every word contributes.

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

Completeness3/5

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

For a simple two-parameter destructive operation with annotations and full schema coverage, the definition is minimally sufficient. However, it is cryptic about what a 'notification template submission' is and what cancellation means in the overall workflow, with no output schema or additional context to clarify.

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%, with both notification_id and submission_id documented in the input schema. The description adds no parameter-level detail, but the schema already carries the burden of explaining each parameter.

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, 'Cancel', and a distinct resource, 'notification template submission,' which clearly differentiates it from sibling tools like cancel_automation, cancel_journey, and cancel_message. There is no ambiguity about which object is acted upon.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool vs. alternatives, no prerequisites, and no workflow context. It does not mention under what conditions a notification template submission should be cancelled or how it differs from similar cancellation operations.

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

courier_installation_guideA
Read-only
Inspect

Get the Courier SDK installation guide for one platform: the install command, a quick-start code sample and the relevant doc links. This is the answer to "how do I integrate Courier" or "how do I get started". Client-side platforms need a JWT to authenticate; each guide says so and names the tool that issues one.

ParametersJSON Schema
NameRequiredDescriptionDefault
platformYesWhich SDK to return the installation guide for.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description is not required to restate read-only behavior. It adds valuable context beyond the annotation by noting that client-side platforms need a JWT and that each guide names the tool that issues one. This is a helpful cross-reference and prerequisite warning without contradicting the annotations.

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?

Three sentences, zero fluff. The first sentence immediately states the purpose and contents; the second gives the common trigger phrases; the third adds the important JWT caveat. Every sentence earns its place and the key information is front-loaded.

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?

For a single-parameter, read-only tool with no output schema, the description is complete. It explains what the tool returns (install command, sample, doc links), when to use it, and the JWT nuance. An agent has everything it needs to select and invoke this tool correctly.

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%: the single 'platform' parameter has an enum of seven valid values and a clear description ('Which SDK to return the installation guide for'). The description adds only a hint that client-side platforms need JWT authentication, but it does not enumerate which platforms are client-side, so it does not materially enrich the parameter semantics beyond the schema.

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 a specific verb ('Get'), resource ('Courier SDK installation guide'), and scope ('for one platform'), and lists the guide's contents (install command, quick-start sample, doc links). It is plainly distinct from all sibling tools, which are API operations on Courier resources, so an agent can differentiate it without opening the 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?

It provides explicit usage context: 'This is the answer to "how do I integrate Courier" or "how do I get started"'. It does not name alternatives or exclusions, but no sibling tool is a plausible alternative (none return installation guides), so the context is sufficient. The JWT note also guides when authentication prerequisites matter.

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

create_brandBInspect

Create a new brand. The API requires settings — omitting it returns a 400. If you do not have specific brand colors, omit settings and a safe default will be used automatically (black primary, white secondary). Example: { name: "Acme", settings: { colors: { primary: "#1a73e8", secondary: "#ffffff" } } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoOptional brand ID; auto-generated if omitted
nameYesBrand display name
settingsNoBrand appearance settings. If omitted, defaults to { colors: { primary: "#000000", secondary: "#ffffff" } }.
snippetsNoBrand snippets

TDQS

B3.2/5.0
Behavior2/5

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

The description discloses a 400-on-omitted-settings behavior and a safe default, but the two statements contradict each other: it first says omitting settings returns 400, then says omitting settings uses a safe default. The schema already documents the default, and the annotations carry little behavioral content, so the contradictory claims reduce transparency rather than add it.

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

Conciseness3/5

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

The description is appropriately short at three sentences with an example, and it front-loads the core purpose. However, the self-contradictory middle sentence harms clarity, keeping this from a higher score.

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

Completeness2/5

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

With nested settings/colors objects and no output schema, the description needed to clearly explain when settings are required and what happens if omitted. Instead it gives conflicting answers, so an agent cannot reliably decide whether to send settings. The schema fills some gaps, but the tool-level description is not complete enough on its own.

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%, so the baseline is 3. The example adds a concrete structure for settings.colors, and the second sentence offers a heuristic for omitting settings, but the contradictory 'requires settings' statement undercuts that guidance and prevents a higher score.

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 opening phrase 'Create a new brand' clearly states the verb and resource, and 'new' distinguishes this from update_brand, delete_brand, get_brand, and list_brands. Even without naming siblings, the purpose is unambiguous.

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 implies when to use the tool—creating a new brand—and offers guidance about when to omit settings (when no specific brand colors are available). However, it never explicitly states the alternative for updating an existing brand or gives a clear when-not-to-use condition.

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

create_broadcastAInspect

Create a broadcast: a one-off message to a list or audience on a single channel. It starts as a draft with no content; add content with put_broadcast_content, then send_broadcast or schedule_broadcast.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name
channelYesThe single delivery channel for this broadcast

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this as read-write and non-destructive. The description adds useful behavioral context beyond annotations: the created broadcast 'starts as a draft with no content'. It also outlines the expected sequence, which helps the agent understand the object's state after creation. Idempotency is not elaborated, but idempotentHint=false already covers that.

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 two sentences with zero filler. The core purpose is front-loaded ('Create a broadcast'), and the workflow is stated compactly in the second sentence. Every clause earns its place.

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 simple create tool with two scalar parameters and no output schema, the description is complete enough. It states the draft state and the next steps. It does not cover edge cases like name collisions or channel mutability, but given the annotations and schema, these are minor omissions.

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 coverage is 100%, so both parameters (name, channel) are already fully described in the schema. The description adds only that the broadcast is a draft with no content, which implies the channel is set at creation but does not add semantics for the parameters themselves. Baseline 3 is appropriate for high schema coverage.

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 uses a specific verb-resource pair ('Create a broadcast') and clarifies the scope: a one-off message to a list or audience on a single channel. It also notes the draft state, distinguishing it from content-loading (put_broadcast_content) and sending (send_broadcast/schedule_broadcast) tools.

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?

It explicitly describes the intended workflow: create the broadcast first, then add content with put_broadcast_content, then send or schedule. This tells the agent when to use this tool and names the follow-up alternatives. No exclusions are given, but the lifecycle guidance is clear and actionable.

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

create_bulk_jobAInspect

Create a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesBulk message definition with event/template and content

TDQS

A4/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false, idempotentHint=false, destructiveHint=false, but carry limited detail. The description adds the multi-step workflow context, implying the created job is not yet ready to send until users are added and run. However, it doesn't disclose behaviors like persistence, auth requirements, or side effects beyond creating a job. Without additional context, this is adequate but not rich.

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 two sentences with no fluff. It front-loads the primary purpose and immediately follows with the workflow, which is essential context. Every sentence earns its place, making it highly concise and well-structured.

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 creation tool with one parameter and no output schema, the description is fairly complete. It explains the tool's role in the overall process via the workflow, which is crucial for an agent. However, it doesn't mention what the response looks like (e.g., job ID), which agents might need for subsequent steps. The open-ended message structure is also not detailed, but this is partially a schema issue. Overall, it's sufficient for basic usage.

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?

The single parameter 'message' has a schema description: 'Bulk message definition with event/template and content.' Schema description coverage is 100%, so the schema already documents the parameter. The tool description adds little beyond this—only the workflow context. The description of 'message' is vague (additionalProperties open), so no extra clarity is provided. Baseline 3 is appropriate since the schema carries the burden.

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 the tool's purpose: 'Create a new bulk job for sending messages to multiple recipients.' It uses a specific verb (create) and resource (bulk job), and the mention of sending messages distinguishes it from sibling tools that add users or run the job. The purpose is unambiguous and distinct from other bulk-related tools like add_bulk_users and run_bulk_job.

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?

The description provides an explicit workflow: 'create_bulk_job → add_bulk_users → run_bulk_job.' This tells an agent exactly when to call this tool (as the first step in a multi-step bulk-sending process) and gives context for how it fits with siblings. It doesn't explicitly state alternatives to avoid, but the workflow sequence is clear and actionable.

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

create_journeyAInspect

Create a new journey. Always created as a draft; making it live is a separate step this tool cannot perform. Send two nodes: the trigger, and an exit node last. Both are required — a create with no exit node is rejected, and the API reports that as "exit node must be the last node in the journey" even when no exit was sent at all. Send and delay nodes are added afterwards by replace_journey, once journey-scoped templates exist. Node ids are server-generated; do NOT include an id field. Example: { name: "Welcome Journey", nodes: [{ type: "trigger", trigger_type: "api-invoke" }, { type: "exit" }], enabled: true }. The result carries a "verification" object read back from the server after the write — check it every time. verified:true means what you asked for is what saved. verified:false names what did not: "fieldMismatches" for node fields that failed to land, "nodeCountMismatch" for a node dropped or added, and "unknownTemplateReferences" for a send node pointing at a template id this journey does not have — almost always a mistyped id, so re-copy it from the create_journey_template or get_journey response it came from. Fix the specific thing named and send the corrected document. Re-sending an identical call changes nothing, and every replace_journey overwrites the whole draft again. An "errorKind" of "unauthorized" means the write itself succeeded and only the read-back was refused: report that as unconfirmed, never as a failed write.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesJourney display name
nodesYesThe trigger node, then a terminal exit node — both required. Send and delay nodes are added later by replace_journey. Node ids are server-generated — do NOT include an id field. Example: [{ type: "trigger", trigger_type: "api-invoke" }, { type: "exit" }].
stateNoMust be "DRAFT". These tools cannot publish.
enabledNoWhether the journey is active. Defaults to true.

TDQS

A3.9/5.0
Behavior1/5

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

The description says "Re-sending an identical call changes nothing," implying idempotent behavior, but the annotations set idempotentHint to false. This is a direct contradiction on a critical behavioral property, so the description cannot be trusted as transparent.

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 description is long but information-dense; nearly every sentence adds operational detail or error-handling context. It is well front-loaded with the core draft-only and node-order rules, though the verification paragraph is verbose enough that it could be tightened.

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?

With no output schema, the description does a strong job explaining the verification object, mismatch categories, unauthorized errorKind handling, and the relationship to replace_journey. However, the conflict between the stated idempotence and idempotentHint:false leaves an unresolved, operationally important inconsistency.

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. The description still adds meaning beyond the schema: nodes must be trigger then exit, exit is required even though only name and nodes are in the schema's required list, node ids are server-generated and must be omitted, and verification failure modes map to specific node/template parameters.

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 "Create a new journey," naming a clear verb and resource, then sharpens scope with "Always created as a draft; making it live is a separate step this tool cannot perform." It distinguishes itself from replace_journey by noting send/delay nodes are added there, so an agent can separate create from modify.

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?

The description explicitly states when to use this tool versus replace_journey: send and delay nodes are added later by replace_journey once journey-scoped templates exist, and publishing is a separate step. It also gives corrective guidance for failed verification: fix only the named mismatch and resend.

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

create_journey_templateAInspect

Create a notification template scoped to a journey. Always created as a draft; making it live is a separate step this tool cannot perform. The template can then be referenced in journey send nodes. content.elements must be wrapped in a channel block — the API rejects bare elements. Example: { journey_id: "j-abc", channel: "email", notification: { name: "Welcome Email", tags: [], brand: null, subscription: null, content: { version: "2022-01-01", elements: [{ type: "channel", channel: "email", elements: [{ type: "text", content: "Hello!" }] }] } } }. The result carries a "verification" object confirming the new id is really present on the journey. verified:true means the id in this response is safe to reference from a send node. verified:false means it is not visible yet — re-read the journey before referencing it, and do not create a second template to work around it. An "errorKind" of "unauthorized" means the template was created and only the check was refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoMust be "DRAFT". These tools cannot publish.
channelYesChannel for this template (e.g. "email", "push", "sms", "inbox")
journey_idYesThe journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notificationYesNotification template definition
provider_keyNoSpecific provider key to target

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint false, but the description adds critical behavior: templates are always created as drafts, content.elements must be wrapped in a channel block or the API rejects it, the response carries a verification object whose semantics are explained, and an unauthorized errorKind still means the template was created. This goes far beyond the annotations and contains no contradictions.

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 description is longer than average, but every clause adds essential operational detail: draft status, channel block requirement, verification semantics, unauthorized caveat, and a complete example. It is front-loaded with the purpose before caveats. Slight redundancy with the schema's own examples keeps it from a 5.

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?

For a mutation tool with nested parameters and no output schema, the description covers the non-obvious behaviors an agent must know: creation always draft, verification result meaning, and errorKind semantics. Combined with 100% schema coverage and annotations, nothing critical is left to guesswork.

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

Parameters5/5

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

Schema coverage is already 100%, but the description adds a complete example, explains the required nesting of elements inside a channel block, and warns to copy journey_id exactly rather than retype it. It also reinforces that state must be DRAFT. This adds meaning beyond the schema's field descriptions.

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 states a specific verb and resource: 'Create a notification template scoped to a journey.' It immediately distinguishes this from siblings like create_notification (not journey-scoped) and create_journey (creates the journey, not the template). The draft-only constraint further clarifies what the tool does and does not do.

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?

The description clearly frames when to use the tool: to create a journey-scoped notification template that is always a draft, and explicitly says making it live is a separate step this tool cannot perform, implicitly pointing to publish_journey_template. It also gives fallback guidance for verification false (re-read journey, do not create a second template). It does not name sibling tools explicitly, so not a 5.

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

create_listA
Idempotent
Inspect

Create or update a list by list ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the list
list_idYesThe list ID

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already convey that the tool mutates (readOnlyHint=false), is idempotent, and is not destructive. The description adds the upsert behavior ('create or update'), but it does not disclose what happens to unspecified fields or whether update is a full replacement. This is modest additional context beyond the annotations, with no contradiction.

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?

A single sentence that front-loads the action and resource while identifying the key parameter. There is no redundant or filler text; every word contributes to the tool's purpose.

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 simple two-parameter tool with full schema coverage and annotations, the description plus schema are enough to invoke it correctly. It could be more complete by stating the update semantics explicitly (e.g., 'This is an upsert'), but the current wording already conveys that reasonably well.

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%, and both list_id and name already have clear descriptions. The description only restates the role of list_id ('by list ID') and does not add format, constraints, or relationship details beyond the schema, so it earns the baseline score.

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 states a specific action (create or update), the resource (a list), and the key identifier (list ID), which clearly separates it from CRUD siblings like get_list, delete_list, and restore_list. The action is unambiguous and not a tautology of the tool name.

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 implies an upsert usage—use it to create a list or update an existing one by providing its list_id—but it does not explicitly state when to prefer this over sibling tools or what conditions trigger update vs. create. No alternatives or exclusions are mentioned, so guidance is only implied.

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

create_notificationAInspect

Create a V2 notification template. name is required. Content may be provided inline or set separately afterwards. A newly created template is a draft; making it live is a separate step this tool cannot perform. Link a routing strategy via notification.routing.strategy_id to control which channels are used. Example: { notification: { name: 'welcome-email', tags: [], brand: null, subscription: null, routing: { strategy_id: 'rs_01abc' }, content: { version: '2022-01-01', elements: [] } } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoMust be "DRAFT". These tools cannot publish.
notificationYesNotification template payload

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false), the description discloses that a newly created template defaults to draft, cannot be published through this tool, and may have content updated separately. This gives an agent important workflow context without contradicting any annotation.

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 front-loaded with the core purpose, then delivers constraints, workflow caveats, and a full example in a compact block. Every sentence conveys necessary decision-relevant information; the example is long but earned because it shows the required nested structure.

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?

For a nested-object creation tool with no output schema, this is complete: the schema documents each field exhaustively, and the description adds the draft/publish lifecycle, routing intent, and the option to set content later. An agent has enough to construct a valid request and know what this tool does not do.

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 schema already documents parameters; the description adds value by explaining why routing is linked ('to control which channels are used') and showing a complete example of the required notification object. It reinforces that name is required and that content can be deferred, which is not evident from the JSON schema alone.

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?

Opens with 'Create a V2 notification template,' a specific verb and resource that immediately distinguishes creation from sibling get/archive/publish/replace notification tools. It also clarifies draft state and names required fields, so an agent can recognize what resource is being produced.

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?

The description explains this tool creates only drafts and explicitly states 'making it live is a separate step this tool cannot perform,' which tells the agent not to expect publication here. It also notes content may be supplied later, implying a follow-up content-editing tool, though it doesn't name sibling tools like publish_notification explicitly.

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

create_or_merge_userA
Idempotent
Inspect

Create a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoProfile data to create or merge (e.g. { email: "...", phone_number: "..." })
user_idYesThe user ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, idempotent, non-destructive operation. The description adds valuable behavioral detail beyond those flags by explaining that omitted fields are preserved, which clarifies the upsert semantics. It does not disclose response behavior or error conditions, but the annotations cover the core safety profile.

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?

A single sentence conveys the core action, the update behavior, and the crucial preservation guarantee. Every clause earns its place, with no filler or repetition of schema details.

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?

The tool has only two parameters and a clear behavior, and the description plus schema cover what an agent needs to invoke it correctly. There is no output schema, so return-value details are absent, but that gap is not critical for an upsert operation whose inputs and semantics are well specified.

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%, so the schema already documents user_id and profile with an example. The description's phrase 'supplied values' loosely maps to the profile parameter but adds little new semantic detail beyond what the schema provides. Baseline 3 is appropriate given full schema coverage.

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 identifies the action (create or merge), the resource (user profile), and the critical merge behavior ('Existing fields not included are preserved'). This also distinguishes it from sibling tools like replace_profile and patch_profile without naming them, because preservation semantics are explicit.

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?

The description provides clear context for when the tool is appropriate: when creating a new profile or updating an existing one with a partial set of values. However, it does not explicitly state when to use an alternative (e.g., patch_profile or replace_profile) or list exclusions, so it stops short of full guidance.

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

create_or_replace_user_push_tokenB
Idempotent
Inspect

Create or replace a push/device token for a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesThe token string
deviceNoDevice metadata
user_idYesThe user ID
provider_keyYesPush provider

TDQS

B3.3/5.0
Behavior3/5

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

The description discloses the 'replace' behavior, which is not explicitly stated in the annotations (they only mark idempotentHint true). However, it does not add context about auth requirements, side effects beyond replacement, or rate limits, so it adds only marginal value beyond the annotations.

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?

A single, compact sentence with no filler. The core action and target resource are front-loaded, making it easy for an agent to quickly scan and understand the tool's purpose.

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

Completeness3/5

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

The tool is relatively simple and the schema covers all parameters, while annotations cover safety and idempotency. However, the description omits any mention of when to use this instead of the closely related 'patch_user_token' or bulk token operations, and it does not clarify expected outcome or error scenarios, leaving room for ambiguity.

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%, so the schema already documents all parameters. The description adds no additional meaning about parameters, such as how 'provider_key' or 'device' interact with the replace behavior. This meets the baseline but provides no extra value.

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 description 'Create or replace a push/device token for a user' states a specific action and resource, clearly identifying what the tool does. It avoids tautology and is distinct from siblings like 'delete_user_token' or 'patch_user_token', though it does not explicitly name any alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'patch_user_token' or 'bulk_add_user_tokens'. The description only restates the core functionality, leaving the agent to infer selection criteria from the tool name alone.

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

create_or_update_tenantB
Idempotent
Inspect

Create or replace a tenant. Tenants represent organizations or groups that users belong to.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the tenant
brand_idNoBrand ID to associate with this tenant
tenant_idYesThe tenant ID
propertiesNoCustom properties for the tenant
user_profileNoDefault profile data for users in this tenant
parent_tenant_idNoParent tenant ID for hierarchical tenants
default_preferencesNoDefault notification preferences applied to users in this tenant. Example: { "items": [{ "id": "topic_abc", "status": "OPTED_IN", "type": "subscription_topic" }] }

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already establish that this is a mutating, idempotent, non-destructive operation. The description adds the 'create or replace' framing but does not explain what replacement does to existing tenant data, child objects, users, or preferences. It is consistent with annotations and provides some context, but the burden of detail is left to the schema.

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 description is two short sentences with no wasted words and the action is front-loaded. It is concise but thin, lacking operational detail that would make it truly excellent.

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

Completeness2/5

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

With 7 parameters, nested objects like default_preferences and user_profile, and no output schema, the description is incomplete. It does not clarify what 'replace' means in practice, whether updated fields are merged or reset, what the tool returns, or how existing tenant state is affected.

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%, so the schema fully documents the parameters. The description adds no parameter-level guidance and merely provides background context about tenants, placing it at baseline.

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 description names a specific action ('Create or replace') and resource ('a tenant'), then defines what a tenant is. It clearly identifies the tool among siblings like get_tenant and delete_tenant, though it does not explicitly contrast with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No usage guidance is provided. The description does not say when to use this tool versus alternatives such as add_user_to_tenant, update_tenant_preference, or delete_tenant, leaving the appropriate context entirely to inference.

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

create_preference_sectionAInspect

Create a preference section in your workspace. The section id is generated and returned. Add topics afterwards with create_preference_topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the section
routing_optionsNoDefault channels for the section. Defaults to empty if omitted.
has_custom_routingNoWhether the section defines custom routing for its topics

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses a concrete behavioral detail beyond the annotations: the section id is generated and returned. It also scopes the operation to 'your workspace.' The annotations already signal the mutation profile, so the description adds useful output-behavior context without needing to repeat safety hints.

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?

Two short sentences with no filler. The action and resource come first, followed by the key output behavior and a pointer to the relevant sibling tool. Every sentence earns its place.

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 straightforward create tool with three well-documented parameters, the description covers the essential action, the returned id, and the next step in the workflow. It does not describe the full response shape or compare against replace_preference_section, but the id mention partially compensates for the missing output schema.

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%, so the parameters name, routing_options, and has_custom_routing are already fully documented in the schema. The description adds no parameter-level meaning of its own, which lands it at the baseline 3.

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 names a specific action and resource: creating a preference section. It also differentiates itself from the sibling create_preference_topic by explicitly pointing topic creation to that tool, and the note that the section id is generated and returned further clarifies the tool's purpose.

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?

The description gives clear workflow context by instructing the agent to add topics afterwards with create_preference_topic, which implies this tool is only for creating the section itself. It does not enumerate alternatives like replace_preference_section, but the creation-focused verb and the follow-up pointer provide sufficient orientation.

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

create_preference_topicAInspect

Create a subscription preference topic inside a section. The topic id is generated and returned. Fails with 404 if the section does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the preference topic
digestNoBatch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off.
section_idYesId of the preference section to create the topic in
topic_dataNoArbitrary metadata associated with the topic
default_statusYesDefault subscription status applied when a recipient has not set their own
routing_optionsNoDefault channels delivered for this topic. Defaults to empty if omitted.
allowed_preferencesNoPreference controls a recipient may customize for this topic
include_unsubscribe_headerNoWhether to include a list-unsubscribe header on emails for this topic

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations (readOnly false, destructive false, idempotent false), the description adds that the topic id is generated and returned, and that it fails with a 404 if the section does not exist. This gives useful behavioral context about side effects and error conditions.

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 two concise sentences, front-loaded with the core action, followed by a key result and an error condition. No unnecessary words or redundancy; every sentence earns its place.

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 tool's complexity (8 parameters, nested objects) and no output schema, the description is minimal but sufficient because the schema already documents all parameters thoroughly. It covers the essential behavioral points (creation, return value, error condition) and relies on annotations for safety and idempotency. It could mention idempotency but that's covered by annotations.

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 coverage is 100%, so the baseline is 3. The description does not elaborate on any parameters; it only references section existence implicitly. It adds no extra meaning beyond what the schema already provides, so a 3 is appropriate.

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 the tool creates a subscription preference topic within a section, using a specific verb and resource. It implicitly distinguishes from create_preference_section by specifying 'inside a section', and the generated id and 404 behavior add precision.

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 does not explicitly mention when to use this tool versus alternatives like create_preference_section or update tools. It implies usage context by noting the dependency on an existing section, but provides no exclusions or routing guidance to sibling tools.

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

create_preview_device_setAInspect

Create a named, reusable set of preview devices.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the set
device_idsYesDevice ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already signal that this is a mutating, non-idempotent, non-destructive operation. The description adds 'named, reusable' but does not disclose additional behavioral details such as duplicate-name handling or what happens on invalid device_ids. It is consistent with annotations and minimally adequate.

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 a single, focused sentence with no filler. Key qualifiers ('named, reusable') are front-loaded, and every word contributes to understanding the tool's purpose.

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?

The tool has low complexity, a fully documented schema, and annotations covering the safety profile. The description is sufficient for basic invocation, though it does not mention return values or duplicate-name behavior; these are minor gaps for a create operation.

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%, with both parameters already documented: name is a human-readable string, and device_ids must come from list_preview_devices with invalid ids rejected. The description adds little beyond the schema, so the baseline of 3 is appropriate.

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 states a specific verb ('Create') and resource ('preview device set'), and adds clarifying qualifiers 'named, reusable'. This distinguishes it from siblings like create_preview_run, replace_preview_device_set, and archive_preview_device_set.

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 implies when to use the tool—when creating a named, reusable set of preview devices—but gives no explicit guidance about alternatives such as replace_preview_device_set for updates or archive_preview_device_set for removal. Usage context is present but not elaborated.

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

create_preview_runAInspect

Render a template's email on real email clients and capture screenshots. Pass exactly one of device_set_id or device_ids. Each run is billed to the workspace's previews add-on. The run starts PENDING, so poll get_preview_run for the results.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoVariables for the template, the same shape as the data a send would carry
localeNoLocale to render, e.g. "en-US"
device_idsNoDevice ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.
template_idYesThe notification template id (nt_...). It must be a Design Studio template with an email channel.
device_set_idNoA saved device set id (pvs_...). Use the Courier Recommended set from list_preview_device_sets for a sensible default.
template_versionNoWhich version renders: omit for the latest draft, "published" for the live version, or a publish such as "v002".

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate this is a mutating, non-idempotent operation (readOnlyHint=false, idempotentHint=false). The description adds valuable context: it bills to the workspace's previews add-on and starts in PENDING state, requiring polling. These are behavioral side effects that go beyond the annotations and inform the agent of consequences and follow-up actions. There is no contradiction with annotations.

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 three sentences with zero redundancy. The primary action is front-loaded, followed by the key usage rule, a billing caveat, and the async nature. Every sentence contributes essential information, making it highly concise and well-structured.

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?

The tool has six parameters, a nested object, no output schema, and no enum constraints. The description covers the core purpose, the mandatory device argument selection, the cost implication, and the asynchronous workflow (poll get_preview_run). This is sufficient for an agent to invoke it correctly and know what to expect next, despite the lack of an output schema.

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% (all six parameters have descriptions). The description adds the cross-parameter constraint 'exactly one of device_set_id or device_ids', which is not captured in individual schema descriptions. This is a meaningful semantic addition beyond the schema, meriting a score above the baseline of 3.

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 states a specific action ('Render a template's email on real email clients and capture screenshots') with a clear resource (a template's email preview run). It distinguishes itself from siblings like list_preview_runs and get_preview_run by focusing on creation, and it adds the key constraint ('Pass exactly one of device_set_id or device_ids') that clarifies its scope.

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?

The description explicitly states the mutual-exclusion rule for device_set_id vs device_ids, warns about billing, and directs the agent to poll get_preview_run. This is clear operational guidance. It does not explicitly name alternatives or when-not-to-use scenarios, but the workflow is well implied and the constraints are direct.

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

create_providerAInspect

Create a new provider (integration) configuration. Once routing strategies or notification templates reference this config, credential or settings mistakes can affect live sends—confirm provider key and settings against list_provider_catalog before saving. The provider field must be a known Courier provider key.

ParametersJSON Schema
NameRequiredDescriptionDefault
aliasNoShort alias for referencing this provider
titleNoDisplay name for this provider configuration
providerYesProvider key from the catalog (e.g. sendgrid, twilio, firebase-fcm)
settingsNoProvider-specific settings (API keys, credentials, etc.)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds meaningful behavioral context: the created config can affect live sends once referenced, so credential/settings mistakes have real consequences. It also stresses pre-save validation, which is useful risk disclosure.

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 three sentences long, front-loaded with the core purpose, and every sentence carries information: what it does, why caution is needed, and a hard validation requirement. No filler or repetition of annotation fields.

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 mutating tool with no output schema, the description covers the essential prerequisites: valid provider key, catalog validation, settings correctness, and downstream consequences. It does not describe the response shape, but the risk warning and validation guidance are the key missing context that an agent needs before invoking.

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 coverage is 100%, so the schema already documents all four parameters. The description reinforces that provider must be a known Courier catalog key and that settings contain credentials, but it does not add material meaning beyond the schema's own descriptions.

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?

Description opens with a specific verb and resource: 'Create a new provider (integration) configuration.' This clearly distinguishes from siblings like update_provider, get_provider, and list_provider_catalog, and the word 'new' signals creation semantics.

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?

Provides clear context for when the tool is appropriate—creating a fresh provider config—and advises validating against list_provider_catalog before saving. It does not explicitly name exclusions or alternatives such as update_provider for existing configs, so it stops short of a full routing guide.

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

create_routing_strategyCInspect

Create a routing strategy defining how notifications are delivered across channels and providers.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the routing strategy
tagsNoTags for categorization
routingYesRouting tree defining channel selection method and order
channelsNoPer-channel delivery configuration
providersNoPer-provider delivery configuration
descriptionNoDescription of the routing strategy

TDQS

C2.9/5.0
Behavior2/5

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

Annotations provide only negative hints (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the description carries the behavioral burden. It adds no context about duplicate-name handling, validation failures, default routing behavior, or what the created strategy implies operationally. No contradiction with annotations, but also no added disclosure.

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?

A single, front-loaded sentence with zero filler: the action verb comes first, followed by the purpose clause. It is appropriately sized, though the available space could have been used to add usage or behavioral guidance.

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

Completeness2/5

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

For a tool with 6 parameters, a nested routing object, free-form channels/providers configuration objects, and no output schema, the description is thin. It does not say what the call returns, whether the name must be unique, or how channel/provider references relate to existing resources, leaving an agent uncertain about post-creation outcomes.

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%, so each parameter is already documented inline. The tool description's phrase 'across channels and providers' adds slight reinforcement to the channels and providers objects, but it does not clarify their free-form structure. The baseline of 3 applies because the schema does the heavy lifting.

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 description states a specific verb ('Create'), a specific resource ('routing strategy'), and the scope ('how notifications are delivered across channels and providers'). This is clearly distinct from get/list/archive_routing_strategy siblings and from other create_* tools (create_provider, create_notification). However, it does not explicitly differentiate from replace_routing_strategy, leaving the create-versus-replace boundary to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus its alternatives, particularly replace_routing_strategy. It also omits practical context such as prerequisites (e.g., whether referenced channels or providers must already exist) or when a routing strategy is needed versus sending a notification directly.

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

delete_audienceA
DestructiveIdempotent
Inspect

Delete an audience by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
audience_idYesThe audience ID to delete

TDQS

A3.7/5.0
Behavior2/5

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

The description merely restates the action and gives no additional behavioral context such as irreversibility, side effects on related entities, or permission requirements. The annotations already declare destructiveHint=true and idempotentHint=true, so the description adds nothing beyond them.

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 a single, focused sentence that is concise and front-loaded with the action and resource. No unnecessary words or redundancy.

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?

For a simple delete operation with one parameter and no output schema, the description is complete. The annotations cover safety and idempotency, and the schema handles parameter details. An agent can safely invoke this tool based on the provided information.

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?

The schema provides full coverage (100%) for the single required parameter, including its description 'The audience ID to delete'. The tool description does not add extra meaning, so a baseline score of 3 is appropriate since the schema already documents the parameter adequately.

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 the action (delete) and the target resource (audience), and specifies the identifier (ID). It is unambiguous and distinguishes from sibling tools like delete_list or delete_brand because it names 'audience' 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?

There is no explicit mention of when to use this tool versus alternatives, but the intent is obvious from the name and description. The lack of any exclusion or alternative hint is acceptable for a straightforward delete operation, though a sentence about not using it for soft-deletion or restoring would be better.

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

delete_brandB
DestructiveIdempotent
Inspect

Delete a brand by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
brand_idYesThe brand ID to delete

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description only restates the action without adding context such as irreversibility, cascading effects, or permission requirements. It does not contradict the annotations, but it adds no behavioral depth beyond them.

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 a single, front-loaded sentence with no filler. It conveys the action, target, and required input in the fewest possible words, and every word earns its place.

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 simple one-parameter delete operation, the description plus schema and annotations are largely complete. The destructive and idempotent hints cover the main operational expectations, and no output schema is specified. It could mention irreversibility or side effects, but the existing information is sufficient for correct invocation.

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% and the single parameter brand_id is already documented in the schema as 'The brand ID to delete.' The description's 'by its ID' adds no meaningful semantic value beyond the schema, so the baseline of 3 is appropriate.

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 states an unambiguous action ('Delete') on a specific resource ('a brand'), with the identifier mechanism ('by its ID'). It clearly distinguishes this from sibling tools like update_brand, get_brand, and create_brand without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to choose this tool over alternatives such as update_brand or the other delete_* siblings. There are no conditions, exclusions, or explicit statements about when this operation is appropriate.

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

delete_broadcastC
DestructiveIdempotent
Inspect

Delete a broadcast.

ParametersJSON Schema
NameRequiredDescriptionDefault
broadcast_idYesThe broadcast id

TDQS

C2.9/5.0
Behavior2/5

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

The description is consistent with annotations (destructiveHint=true, idempotentHint=true) but adds no behavioral context beyond the word 'delete'. It doesn't mention whether deletion is permanent, whether scheduled broadcasts are canceled, or any side effects. With annotations present, the description should add extra context but fails to do so.

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 description is a single short sentence with no filler words, front-loading the core operation. It is concise and well-structured, though it is also under-specified—a completeness concern rather than a conciseness one.

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

Completeness2/5

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

For a destructive tool with no output schema and only one parameter, the description is too minimal. It doesn't explain the consequences of deletion, whether it affects scheduled broadcasts, or how it relates to sibling tools like cancel_broadcast_schedule. The annotations cover the destructive nature, but the description fails to provide a complete operational picture.

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?

The schema provides 100% coverage for broadcast_id with the description 'The broadcast id', so the parameter is already documented. The tool description adds no further semantic meaning about the parameter, matching the baseline of 3 for high schema coverage.

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 description 'Delete a broadcast.' clearly states the verb (delete) and resource (broadcast), making the primary action obvious. However, it doesn't differentiate from related broadcast actions like cancel_broadcast_schedule or note whether this is a permanent hard delete, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus cancel_broadcast_schedule, archive tools, or other delete_* tools. No prerequisites, exclusions, or alternative conditions are mentioned, leaving the agent to infer the appropriate usage context.

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

delete_listB
DestructiveIdempotent
Inspect

Delete a list by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID

TDQS

B3.4/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds no behavioral context beyond the word 'Delete'. It does not disclose whether deletion is permanent or soft-deletable, whether restore_list can undo it, or what happens to list subscriptions. No contradiction with annotations exists.

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 a single, well-structured sentence with the action and object front-loaded. Every word earns its place, and there is no unnecessary elaboration.

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 one-parameter tool with annotations covering destructiveness, the description is adequate for basic selection and invocation. However, it omits potentially useful details about reversibility (especially given the restore_list sibling) and downstream effects such as subscriber associations, so it is not fully complete.

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?

The schema already provides 100% coverage for the single list_id parameter. The phrase 'by its ID' simply reinforces the schema and adds no new semantic, format, or constraint information.

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 states a specific action ('Delete'), a precise resource ('a list'), and the identifying method ('by its ID'). It is unambiguous and clearly distinguishes this tool from siblings like get_list, create_list, and delete_user_list_subscriptions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to prefer this tool over related operations such as delete_user_list_subscriptions, unsubscribe_user_from_list, or delete_audience. It also does not mention prerequisites or caveats, leaving the selection logic entirely to the agent.

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

delete_profileA
DestructiveIdempotent
Inspect

Delete a user profile permanently.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID to delete

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description does not need to restate the destructive nature. It does add the qualifier 'permanently,' which communicates irreversibility beyond the boolean annotation. However, it does not disclose what associated data is removed or whether special permissions are required.

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 a single, front-loaded sentence with no filler. Every word contributes meaning, and the most important qualifier, 'permanently,' appears immediately after the verb.

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 one-parameter destructive tool, the description covers the action, target, and irreversibility. The absence of an output schema is acceptable given the simplicity of the operation. It could additionally note cascading effects or permission requirements, but this is not a significant gap.

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%, and the user_id parameter is already described in the schema as 'The user ID to delete.' The tool description adds no further semantic detail about the parameter. This matches the baseline for a fully documented schema.

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 states a specific verb and resource: 'Delete a user profile permanently.' It clearly identifies the action and target. The qualifier 'permanently' also distinguishes this from sibling non-destructive profile operations like patch_profile and replace_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as patch_profile, replace_profile, or delete_user_list_subscriptions. There are no exclusions, prerequisites, or alternative routing suggested, so an agent must infer usage solely from the tool name.

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

delete_providerA
DestructiveIdempotent
Inspect

Delete a provider configuration. Returns 409 if the provider is still referenced by routing or notifications.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idYesThe provider configuration ID to delete

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate destructiveness, non-read-only, and idempotency. The description adds a valuable behavior beyond annotations: the 409 conflict when the provider is still referenced by routing or notifications. This is meaningful operational context for an agent.

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?

A single, front-loaded sentence states the core action and the key failure condition with zero waste. Every clause earns its place.

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 simple one-parameter delete operation with rich annotations, the description covers the main invocation need and the critical conflict case. It does not describe the success response, but the absence of an output schema makes that less critical.

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 coverage is 100% and the single parameter provider_id is fully described in the schema. The tool description does not add additional meaning beyond what the schema already provides, so baseline 3 is appropriate.

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 names the exact action ('Delete') and resource ('provider configuration') with a specific verb. It is clearly distinguishable from sibling tools like update_provider, create_provider, and other delete_* tools.

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 implies usage as the destructive counterpart to create/update provider, but it does not explicitly state when to choose this over alternatives, nor does it mention any conditions for when deletion makes sense. The 409 note is behavioral context, not usage guidance.

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

delete_tenantA
DestructiveIdempotent
Inspect

Delete a tenant by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesThe tenant ID to delete

TDQS

A3.5/5.0
Behavior3/5

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

The description is consistent with the annotations (destructiveHint=true, readOnlyHint=false) but adds no behavioral context beyond what the annotations already convey. It does not disclose whether deletion is permanent, whether it cascades to related records (users, preferences, templates), or whether special authorization is required, and the idempotentHint=true is neither confirmed nor explained. No contradiction with annotations exists.

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?

A single six-word sentence, 'Delete a tenant by its ID,' with zero filler and the action front-loaded. It is appropriately sized for a one-parameter tool where every word earns its place.

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

Completeness3/5

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

For a simple one-parameter, no-output-schema tool whose annotations already carry the safety profile, the description is nearly sufficient. However, a destructive tenant operation would benefit from at least a note on permanence or cascade effects — for example, whether deleting a tenant also removes its users, preferences, and templates — to fully inform an agent's decision.

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%: tenant_id is already documented as 'The tenant ID to delete' and marked required. The description's phrase 'by its ID' reinforces the parameter but adds no format, source, or validation detail beyond the schema, so the baseline 3 applies.

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 uses a specific verb ('Delete') and a specific resource ('tenant') and identifies the targeting mechanism ('by its ID'). It distinguishes cleanly among the many sibling delete_* tools, since 'tenant' unambiguously names the entity itself rather than tenant preferences, templates, audiences, brands, or providers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when this tool should be used, what preconditions exist (e.g., removing tenant users or associated data first), or how it relates to alternatives in the sibling set. An agent receives no context to decide between delete_tenant and related operations like remove_user_from_tenant or archiving tools, nor any warning about the consequences of calling it.

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

delete_tenant_preferenceA
DestructiveIdempotent
Inspect

Remove default notification preference for a topic from a tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
topic_idYesThe subscription topic ID
tenant_idYesThe tenant ID

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description aligns with these and adds specificity about what is removed, but it does not disclose additional behavioral traits such as whether deletion cascades, whether it is reversible, or what happens when the preference does not exist.

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 a single, front-loaded sentence with no filler. Every word earns its place, and the verb 'Remove' immediately conveys the action.

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?

For a simple two-parameter deletion operation with strong annotations (destructive and idempotent hints), the description is sufficient. The schema fully covers parameters, and the description clearly states what is being deleted.

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%, so the parameters are already documented. The description maps 'topic' to topic_id and 'tenant' to tenant_id but adds no extra format, constraints, or relationships beyond the schema.

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 uses a specific verb ('Remove') and names the exact resource ('default notification preference for a topic') and scope ('from a tenant'). It clearly differentiates from related siblings like update_tenant_preference and delete_tenant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as update_tenant_preference or delete_tenant. It does not state exclusions, such as when a preference should be updated instead of removed.

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

delete_tenant_templateA
Destructive
Inspect

Delete a tenant notification template. Returns 204 on success, 404 if the template does not exist for this tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesThe tenant ID that owns the template
template_idYesThe notification template ID to delete

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already convey destructive and non-idempotent behavior, so the description needs to add context beyond that. It does add the HTTP response semantics (204 on success, 404 if the template does not exist for this tenant), which is useful but does not discuss irreversibility or permission requirements.

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 a single sentence that front-loads the core action and then provides the most relevant response outcomes. Every clause earns its place with zero redundancy.

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 simple two-parameter delete operation, the description covers the essential call semantics and expected success/failure statuses. The absent details, such as authentication requirements or broader error codes, are not critical given the low complexity and strong schema coverage.

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%, so the parameter descriptions already fully explain tenant_id and template_id. The tool description adds no additional parameter detail beyond what the schema provides, leaving the baseline of 3 appropriate.

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 uses a specific verb ('Delete') and resource ('tenant notification template'), making the tool's function immediately clear. It also distinguishes this from sibling deletes like delete_tenant and delete_tenant_preference by naming the exact entity type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives such as archive_notification or replace_tenant_template. The description states only what the tool does, not under what conditions an agent should choose it or avoid it.

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

delete_user_list_subscriptionsA
DestructiveIdempotent
Inspect

Delete all list subscriptions for a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the description need not repeat that. It does not add extra behavioral context such as side effects, permission requirements, or return conventions. It is consistent with annotations and minimally sufficient, but adds no new information beyond the scope ('all') that the name already suggests.

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?

A single, direct sentence that gets straight to the action and scope. No wasted words, and the key constraint ('all') is front-loaded.

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 one-parameter destructive tool with annotations covering safety and idempotency, the description is nearly complete. It clarifies the full scope ('all' subscriptions) which is essential. However, it does not mention what happens to responses or whether it should be used cautiously, but that's beyond what's needed given the simplicity.

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 coverage is 100% and the only parameter, user_id, is already described as 'The user ID'. The description does not add any additional meaning about how the user_id is used or any format expectations, so it provides no value beyond the schema.

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 uses a specific verb ('Delete'), a clear resource ('list subscriptions'), and scope ('all' and 'for a user'). It clearly distinguishes from sibling tools like unsubscribe_user_from_list (which implies a single list) and get_user_list_subscriptions (a read operation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description does not mention when to choose this over unsubscribe_user_from_list or bulk_subscribe_to_list, nor does it state any prerequisites or context. The name implies bulk removal, but the description alone does not explicitly instruct the agent.

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

delete_user_preference_topicA
DestructiveIdempotent
Inspect

Delete a user's preference for a specific subscription topic, reverting it to the topic's default status.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID
topic_idYesThe subscription topic ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint and idempotentHint, so the description adds value by clarifying the exact behavioral effect: the preference is not merely removed but 'reverted to the topic's default status.' This complements the annotations without repeating them.

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?

A single sentence that is front-loaded with the action and includes the key behavioral consequence. Every word earns its place; there is no redundancy or filler.

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 two-parameter, no-output-schema tool with annotations covering destructive and idempotent behavior, the description is largely complete. It could explicitly state what happens when no preference exists, but the idempotentHint annotation covers that implication.

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%, with straightforward descriptions for user_id and topic_id. The tool description does not add meaning beyond the schema, so the baseline of 3 is appropriate.

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 a specific verb ('delete'), the resource ('a user's preference for a specific subscription topic'), and the resulting behavior ('reverting it to the topic's default status'). This distinguishes it from siblings like update_user_preference_topic, archive_preference_topic, and delete_tenant_preference.

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?

The description conveys a clear context: use this when you want to remove a user's custom preference and restore the topic default. It does not explicitly name alternatives or exclusions, but the effect is stated plainly enough for an agent to infer when it applies.

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

delete_user_tokenA
DestructiveIdempotent
Inspect

Delete a specific push token for a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesThe token identifier to delete
user_idYesThe user ID

TDQS

A3.6/5.0
Behavior3/5

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

The annotations already provide destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds the specific object of destruction ('a specific push token'), but does not disclose extra behavioral details like irreversibility, auth requirements, or cascading effects. It does not contradict the annotations.

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 a single, front-loaded sentence with no filler or redundancy. Every word contributes meaning: 'Delete', 'specific', 'push token', and 'for a user' together define the tool's purpose clearly.

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 simple two-parameter destructive operation, the description, combined with full schema documentation and the annotations coverage, gives the agent enough to invoke the tool correctly. A brief note about absence behavior when the token does not exist would improve completeness, but it is not essential for correct invocation.

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 coverage is 100% and both parameters have clear descriptions ('The token identifier to delete' and 'The user ID'). The description adds no additional semantic nuance beyond what the schema already provides, so the baseline score of 3 applies.

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 states a specific verb ('Delete') and a specific resource ('a specific push token for a user'), which clearly distinguishes it from sibling tools like list_user_push_tokens or create_or_replace_user_push_token. It is not a tautology and immediately conveys the tool's exact operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives such as patch_user_token, create_or_replace_user_push_token, or bulk_add_user_tokens. The description only states what the tool does, leaving the agent to infer the appropriate context without explicit routing or exclusions.

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

duplicate_broadcastAInspect

Copy a broadcast into a new draft. The original is left unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
broadcast_idYesThe broadcast to copy

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds the key behavioral guarantee that the original is left unchanged, which is valuable context beyond the annotations. It also clarifies the result is a new draft, not a sent broadcast. It doesn't mention side effects like whether the draft is immediately visible or requires further steps, but for a simple copy operation this is adequate.

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?

Two short sentences with no wasted words. The core action is front-loaded, and the non-destructive guarantee is stated in the second sentence. Every word earns its place.

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 single-parameter, no-output-schema tool, the description is nearly complete. It states the action, the result (new draft), and the non-destructive nature. It could mention whether the new draft is immediately editable or requires additional setup, but that is a minor gap given the simplicity of the operation.

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%: the only parameter, broadcast_id, is described as 'The broadcast to copy'. The description adds no additional parameter-level detail, but none is needed given the single, self-explanatory parameter. Baseline 3 is appropriate.

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 states a specific verb ('Copy') and resource ('a broadcast into a new draft'), and explicitly notes the original is left unchanged. This clearly distinguishes it from related broadcast tools like create_broadcast, send_broadcast, schedule_broadcast, and rename_broadcast.

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?

The description implies the use case: duplicating an existing broadcast to create a draft without modifying the original. It doesn't explicitly name alternatives or exclusions, but the context of sibling tools (create_broadcast, send_broadcast, rename_broadcast) makes the intended usage clear. A small gap: it doesn't state when to prefer this over create_broadcast.

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

generate_jwt_for_userAInspect

Generate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
scopesNoPermission scopes for the token
user_idYesThe user ID to scope the token to
expires_inNoToken expiry duration (e.g. "1h", "2 days")1h

TDQS

A4/5.0
Behavior3/5

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

Annotations are all false/neutral, so the description carries the behavioral burden. It clarifies the intended use but does not disclose details like whether the token is returned directly, how it is signed, or if generation has side effects. Still, the core behavior is clear.

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?

Two short sentences with no filler. The action is front-loaded and the use case adds practical context without redundancy.

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 low parameter count, full schema coverage, and annotations, the description is mostly complete for selection and invocation. The main gap is the absence of an output schema and no description of what the tool returns, but the name and action make the result reasonably inferable.

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?

All three parameters have schema descriptions, so schema coverage is 100%. The description adds no extra parameter-level meaning beyond naming the user and the client-side SDK context.

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: 'Generate a JWT authentication token for a user.' The use case ('client-side SDK auth') further disambiguates it from the many user/token-related sibling tools.

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?

Provides a clear context for when to use this tool: client-side SDK auth for Inbox, Preferences, etc. It does not explicitly mention alternatives or exclusions, but no sibling tool performs JWT generation.

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

get_audienceA
Read-only
Inspect

Get one audience by ID, including the filter that defines its membership. Read this to explain why someone is or is not in an audience — the filter is the rule, not a stored member list. Use list_audience_members for who currently matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
audience_idYesThe audience ID

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description correctly focuses on additional behavioral context: it clarifies that membership is derived from a filter rather than a stored member list. This is meaningful beyond the annotation and helps the agent reason about the returned data.

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?

Three compact sentences with no filler. The core action is front-loaded, the conceptual clarification follows, and the sibling alternative is given at the end without redundancy.

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?

For a single-parameter, read-only tool with no output schema, the description covers what the tool returns, why an agent would use it, and how it differs from the closest sibling. Nothing essential for correct invocation is missing.

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 coverage is 100% and the single parameter audience_id is already described as 'The audience ID'. The description merely echoes 'by ID' without adding new semantic detail, so the schema carries the load and a baseline score of 3 is appropriate.

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+resource ('Get one audience by ID') and adds the unique distinguishing detail that it returns the membership filter, not a member list. This clearly separates it from siblings like list_audiences and list_audience_members.

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?

Explicitly explains when to use this tool: to explain why someone is or is not in an audience, because the filter is the rule. It also names the alternative, list_audience_members, for the related but different need of seeing who currently matches.

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

get_audit_eventA
Read-only
Inspect

Get a specific audit event by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
audit_event_idYesThe audit event ID

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description's 'Get' is consistent with a safe read operation. The description adds little beyond the annotation and does not disclose error behavior, not-found handling, or return format.

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?

A single, front-loaded sentence that clearly conveys the action and target with no filler. Every word earns its place.

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 simple single-parameter read operation with a read-only annotation, the description is largely sufficient. An agent knows the required input and that the operation is non-mutating, though no return shape is described since no output schema exists.

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?

The only parameter, audit_event_id, is fully documented in the schema as 'The audit event ID,' giving 100% schema coverage. The description does not add additional meaning beyond what the schema already provides.

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 description states a specific verb and resource: 'Get a specific audit event by its ID,' making the tool's purpose clear and distinguishing it from list_audit_events. However, it does not explicitly name or contrast the sibling list tool.

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 phrase 'by its ID' implies this tool is for retrieving a single known event rather than listing events, but the description provides no explicit when-to-use guidance or mention of alternatives. Usage context is only implied.

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

get_brandA
Read-only
Inspect

Get one brand by ID, including its colors, logo and styling settings. Read this to describe what a template referencing this brand will actually look like.

ParametersJSON Schema
NameRequiredDescriptionDefault
brand_idYesThe brand ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds value by stating what data the response includes (colors, logo, styling settings) and the purpose this serves, going beyond the bare annotation without contradicting it.

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?

Two concise sentences pack the resource, scope, returned content, and a use case with no filler. The primary action is front-loaded.

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 single-parameter read tool with readOnlyHint and no output schema, the description is sufficient: it names the resource, the lookup key, the key returned fields, and the motivating use case. It could add explicit error/not-found behavior, but that is not necessary for basic correct invocation.

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 coverage is 100% and the sole brand_id parameter is documented in the schema. The description does not add new parameter meaning, so it meets the baseline but no more.

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 action (get) on a specific resource (brand by ID) and enumerates the meaningful payload (colors, logo, styling settings), which distinguishes it from list_brands and brand mutation tools. The second sentence gives a concrete use case for interpreting templates.

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?

The description clearly frames when to call this tool: when you need a brand's visual styling to describe what a referencing template will look like. It does not explicitly name alternatives or exclusions, but the single-brand-by-ID semantics and sibling set make the intended use obvious.

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

get_broadcastA
Read-only
Inspect

Get a broadcast by id, including its channel and send or schedule state.

ParametersJSON Schema
NameRequiredDescriptionDefault
broadcast_idYesThe broadcast id

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, and the description's verb 'Get' is consistent. The description adds value by specifying that the response includes channel and send/schedule state, which is not implied by the schema or annotations. It does not contradict annotations and provides useful context about the return payload.

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 a single, front-loaded sentence: 'Get a broadcast by id' immediately conveys the core action, followed by the relevant return details. There is no redundant wording or filler, making it highly concise and well-structured.

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 simple read operation with one parameter, the description adequately explains what is returned (channel and send/schedule state). No output schema exists, so this explicit mention is helpful. It does not cover edge cases or error behavior, but for a basic get-by-id tool, this is sufficient. A slightly more detailed explanation of 'send or schedule state' could elevate it, but it is not essential.

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?

The input schema fully describes broadcast_id as 'The broadcast id' (100% coverage). The description does not add additional meaning to this parameter, but with full schema coverage, the baseline of 3 is appropriate. No further clarification is necessary for a single, self-explanatory parameter.

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 states a specific verb ('Get'), a specific resource ('a broadcast'), and identifies it by 'id'. It also clarifies what is included in the response ('channel and send or schedule state'), distinguishing it from siblings like get_broadcast_content. This clearly separates it from other retrieval tools.

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 implies its use for fetching a broadcast's details and state, but it does not explicitly mention when to use it over alternatives such as get_broadcast_content or list_broadcasts. With many sibling get_* tools, some explicit guidance on selection would improve clarity, though the purpose itself is unambiguous.

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

get_broadcast_contentB
Read-only
Inspect

Get a broadcast's Elemental content.

ParametersJSON Schema
NameRequiredDescriptionDefault
broadcast_idYesThe broadcast id

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description adds only the 'Elemental content' qualifier as extra context. It does not describe output shape, nullability, or other behavioral details, but for a straightforward read-only getter this is an acceptable baseline.

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 definition is a single, front-loaded sentence with no filler. It states the action and resource concisely, and every word earns its place.

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?

This is a one-parameter, read-only getter with no output schema, so the description is largely sufficient. The only minor gap is that 'Elemental content' is left undefined, which may leave an agent uncertain about the exact returned artifact.

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?

The input schema covers 100% of the parameters with a clear description for broadcast_id, and the tool description adds no further parameter meaning. Baseline of 3 is appropriate because the schema carries the semantic weight.

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 description uses a specific verb ('Get') and identifies the resource as a broadcast's 'Elemental content', which distinguishes it from related tools like get_broadcast or put_broadcast_content. It does not explicitly explain what 'Elemental content' means, so it falls just short of full clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no indication of when to choose this tool over siblings such as get_broadcast, get_message_content, or put_broadcast_content. There are no exclusions, prerequisites, or contextual triggers, leaving selection heuristics entirely to the agent.

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

get_bulk_jobA
Read-only
Inspect

Get the status of a bulk job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesThe bulk job ID

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description's 'get' phrasing aligns with that. The description adds no further behavioral context such as whether polling is safe, what status values may appear, or how long jobs typically take. This is acceptable but not rich.

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 one concise, front-loaded sentence that communicates the exact purpose without wasted words. It earns every word.

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 simple single-parameter getter with readOnlyHint=true, the description plus schema is sufficient for an agent to invoke it correctly. It does not describe possible status values or error behavior, but those are not necessary for basic invocation.

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?

The schema fully documents the single required parameter, job_id, including its description ('The bulk job ID'). The tool description adds no additional parameter-level detail, so the schema carries the burden.

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 states a specific verb ('Get') and resource ('the status of a bulk job'), making the tool's purpose immediately clear. It also distinguishes itself from sibling tools like create_bulk_job and run_bulk_job, which represent different lifecycle stages.

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 intended use is implied: an agent would call this when it needs the current status of a bulk job, likely after creating or running one. However, no explicit guidance is given about when to prefer this tool over related siblings or when not to use it.

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

get_journeyA
Read-only
Inspect

Get a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoVersion to retrieve: "draft", "published" (default), or a version string like "v001"
journey_idYesThe journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4/5.0
Behavior4/5

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

The description adds behavior beyond the readOnlyHint annotation by explaining versioning semantics: defaults to published, supports draft and historical versions. It makes the read behavior concrete and gives the agent an expectation about what will happen when no version is supplied.

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?

Two sentences carry the core operation and versioning behavior with no wasted words. The primary purpose appears first and the default behavior is stated clearly at the end.

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?

This is a simple two-parameter read operation, with readOnlyHint set and full schema coverage. The description gives the launching semantics and required parameters; while it doesn't describe the returned object shape, no output schema exists and the normal expectations for a fetch-by-ID tool are met.

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?

The schema already documents both parameters fully with 100% description coverage. The description rephrases the version parameter as 'working draft' versus 'historical version', which adds minor color but no new semantic information beyond the schema.

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 states a specific verb and resource: 'Get a journey by ID' and explains the version variants (draft, vN, published). This clearly separates it from siblings like get_journey_template and list_journeys, which enumerate or access templates, not a single journey by ID.

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 gives clear invocation guidance for the version parameter: pass draft, pass vN, or rely on the published default. However, it does not explicitly compare get_journey to alternative retrieval tools or state when it should be used versus those alternatives, so guidance is implied rather than explicit.

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

get_journey_runA
Read-only
Inspect

Get one journey run by id: its journey, status, and timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYesThe journey run id

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safe-read nature is covered. The description adds useful behavioral context by naming the return fields (journey, status, timestamps), but it does not disclose error/not-found behavior or output format. Since annotations cover the safety profile, this is adequate but not exceptional.

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?

A single 11-word sentence that front-loads the verb and resource, states the identifier method, and lists the key return fields. No filler or repetition of schema details.

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 single-parameter get tool with readOnly annotation and no output schema, the description is largely complete: it states what the tool does and what fields the result contains. It could optionally mention not-found behavior or explicitly route to list_journey_runs for enumeration, but nothing essential is missing.

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% and run_id is already well described as 'The journey run id'. The description only reinforces 'by id' without adding format, examples, or lookup semantics. Baseline 3 is appropriate given the schema carries the semantic weight.

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 explicitly that it retrieves a single journey run by id and enumerates the returned aspects (journey, status, timestamps). This clearly distinguishes it from siblings like get_journey, list_journey_runs, and list_journey_run_steps without requiring schema inspection.

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 implies the usage: when you have a run_id and need a single run's details. However, it does not explicitly mention alternatives or when-not-to-use, such as 'for listing runs use list_journey_runs'. The sibling names provide context, but the description itself leaves exclusions to inference.

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

get_journey_templateA
Read-only
Inspect

Get a journey-scoped notification template by notification ID. Pass version=draft to retrieve the working draft (required before the template has been published). Defaults to published.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoVersion to retrieve: "draft", "published" (default), or "vN"
journey_idYesThe journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.4/5.0
Behavior4/5

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

The annotation already carries readOnlyHint=true, and the description adds meaningful mode-dependent behavior: draft retrieval is mandatory pre-publication, while published is the default. This goes beyond the annotation, though it stops short of describing response contents or pagination.

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?

Two sentences with zero filler: the core purpose is front-loaded, and the draft/published caveat follows immediately. Every sentence earns its place.

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 read-only tool with fully documented parameters, an agent has everything needed to invoke it correctly: required IDs, version semantics, and the safety profile from annotations. There is no output schema, so the return shape is unspecified, but the name and 'template' wording make the response type reasonably predictable.

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%, and the schema already provides strong guidance, including exact character-for-character copying instructions for both IDs and the enumerated version values. The description adds one layer of meaning beyond the schema: the rule that version=draft is required before publishing, clarifying when each version value applies.

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 names a specific verb (get), a specific resource (journey-scoped notification template), and the lookup key (notification ID). The qualifier 'journey-scoped' differentiates it from sibling getters such as get_notification and get_journey_template_content, and the version semantics are stated directly.

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?

The description gives concrete usage context: pass version=draft when the template has not yet been published, and rely on the published default otherwise. It does not explicitly name sibling tools or state when-not-to-use, so an agent must infer the boundary against get_notification and get_journey_template_content.

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

get_journey_template_contentA
Read-only
Inspect

Fetch the elemental content of a journey-scoped notification template. Pass version=draft for the working draft, or vN for a historical version. Defaults to published.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoVersion to retrieve: "draft", "published" (default), or a version string like "v001"
journey_idYesThe journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint: true, so the tool is known to be a safe read operation. The description adds context by explaining version resolution (draft, historical, or published default), which is valuable. However, it does not disclose other behavioral aspects such as error handling, what 'elemental content' exactly returns, or any implications of the journey-scoped context. Since annotations cover safety, this is adequate but not comprehensive.

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 concise and well-structured: two sentences, the first stating the core purpose and the second providing version usage. It front-loads the primary action and avoids redundancy or unrelated details. Every sentence contributes meaningful information with no filler.

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 that the tool has a read-only annotation, no output schema, and 3 parameters (2 required), the description covers the essential usage: what it fetches and how to specify versions. It does not explain the return format or contrast with very similar siblings, which might be helpful but is not critical for a simple fetch operation. The description is sufficient for an agent to call it correctly for most scenarios.

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%, so all three parameters are already documented in the schema with descriptions. The description adds minimal value by reaffirming the default version behavior ('Defaults to published'), which is already stated in the schema's version description. It does not introduce new parameter semantics beyond what the schema provides, so the baseline 3 applies.

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 the tool fetches 'elemental content of a journey-scoped notification template', using a specific verb ('Fetch') and resource. It also distinguishes itself from siblings by specifying 'journey-scoped' and version handling, which separates it from generic get_notification_content or get_journey_template. The version parameter is explicitly described, making the tool's function unambiguous.

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 usage guidance for the version parameter ('Pass version=draft for the working draft, or vN for a historical version. Defaults to published.') but does not contrast this tool with related siblings like get_journey_template or get_notification_content. It implies the tool is for journey-scoped content, but does not explicitly state when to choose this over alternatives. Some context is given, but exclusions are missing.

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

get_listA
Read-only
Inspect

Get one list by its ID, including its name and current state.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, covering the safety profile. The description adds value by specifying what the response includes (name and current state), which is useful context about the return value. No contradictions, and no additional behavioral traits (like error cases) are required for a simple getter.

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?

A single, focused sentence with no redundant words. The core purpose and the returned fields are front-loaded, and every phrase earns its place. Excellent structure.

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?

For a one-parameter read tool with no output schema, the description is fully complete. It specifies what is returned (name and current state) and the selection criterion (by ID). An agent has everything needed to call it correctly.

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% for the single parameter (list_id), so the schema already documents it. The description does not add further detail about the parameter, but the baseline of 3 is appropriate since the schema carries the semantic load. No additional explanation needed.

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 states a clear verb ('Get'), a specific resource ('one list by its ID'), and the scope ('including its name and current state'). It clearly distinguishes from sibling tools like list_lists (which lists many) and get_list_subscribers (which retrieves subscribers, not the list itself). No ambiguity.

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?

The description implies when to use it: when you have a specific list ID and need that single list's details. It does not explicitly name alternatives or exclusions, but the purpose is unambiguous given the wording. In a large sibling set, mentioning 'instead of list_lists when you have an ID' would have been ideal, but it's not necessary for correct usage.

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

get_list_subscribersA
Read-only
Inspect

List the users subscribed to a list. Use this to confirm whether someone was actually on a list at all — a subscription here is the reason a list-addressed send reached them.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
list_idYesThe list ID

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already covers the safety profile, and the description adds contextual meaning about subscriptions. It does not disclose additional behavioral traits such as pagination behavior or output shape, but the bar is lowered by the annotation.

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?

Two focused sentences, front-loaded with the purpose, followed by a relevant use-case explanation. No wasted words or redundant restatement of the schema.

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 simple read-only tool with fully documented parameters and a readOnlyHint annotation, the description and schema provide enough to call the tool correctly. A note about return format would be marginally helpful but is not essential given the simple list semantics.

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 cursor and list_id are fully documented in the schema. The description itself adds no parameter-level detail, so the baseline score of 3 applies.

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 uses a specific verb and resource ('List the users subscribed to a list') and adds the use case of confirming list membership. This clearly distinguishes the tool from sibling read tools like get_user_list_subscriptions or list_audience_members.

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?

It explicitly states when to use the tool ('Use this to confirm whether someone was actually on a list at all') and provides valuable domain context about why a subscription matters. However, it does not name alternatives or state when not to use it.

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

get_messageB
Read-only
Inspect

Get the full details and status of a single message by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message ID to retrieve

TDQS

B3.4/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read operation. The description adds minor context by mentioning 'full details and status' but does not disclose return shape, error behavior, or other operational traits.

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 a single, front-loaded sentence with no filler. Every word contributes to the core purpose, making it easy to scan and parse.

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 one-parameter, read-only lookup with no output schema, the description is mostly sufficient for an agent to understand the tool's role. It could be slightly richer by describing what 'status' includes or what response shape to expect, but the low complexity keeps the gap small.

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?

The input schema fully describes message_id as 'The message ID to retrieve' with 100% coverage. The description merely repeats 'by its ID' without adding new meaning or format expectations.

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 description uses a specific verb ('Get') and identifies the resource ('a single message') and key ('by its ID'). It loosely distinguishes from list_messages and content/history getters via 'full details and status', but does not explicitly name or disambiguate sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives like get_message_content, get_message_history, or list_messages. The description is purely declarative and leaves selection criteria to inference.

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

get_message_contentA
Read-only
Inspect

Get the rendered content (HTML, text, subject) of a previously sent message.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message ID

TDQS

A4/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, so the read-only nature is already covered. The description adds a bit of useful context by naming the exact output facets (HTML, text, subject) and the 'rendered' nature. It doesn't disclose edge-case behavior such as behavior for unsent messages or errors, but this is a simple read operation with the safety profile already captured.

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?

A single, front-loaded sentence with zero filler. Every word adds information: the action, the resource type, the exact data returned, and the lifecycle constraint.

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 one-parameter read-only tool with no output schema, the description covers the essential purpose and the target object. It could have mentioned the response format or how to handle missing messages, but given the low complexity, nothing critical is missing.

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 coverage is 100%, so the message_id parameter is already documented in the schema. The tool description adds only the lifecycle context ('previously sent message'), which slightly enriches what message_id refers to, but does not introduce format, type, or usage details beyond the schema. Baseline 3 applies.

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 uses a specific verb ('Get') and identifies a distinct resource: 'rendered content (HTML, text, subject) of a previously sent message.' It clearly differentiates from siblings like get_message, get_message_history, and get_notification_content by specifying the exact payload and lifecycle stage.

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?

The phrase 'previously sent message' provides clear context for when to invoke this tool—only for messages that have already been sent—but it does not explicitly exclude alternatives or reference sibling tools. It stops short of demonstrating full routing logic, though the context is unambiguous.

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

get_message_historyA
Read-only
Inspect

Get the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by event type
message_idYesThe message ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description is consistent with that. It adds value beyond the annotations by describing the returned information as a sequence of delivery stages, which tells the agent what kind of lifecycle data to expect.

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 entire description is one focused sentence that front-loads the core action and immediately clarifies the return content with examples. No wasted words.

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 simple read-only lookup with fully documented parameters and a safe annotation, the description is nearly complete. It gives enough examples to understand the output even without an output schema, though it does not specify ordering or pagination.

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%, with message_id and type both documented in the schema. The tool description adds no additional parameter semantics beyond the schema, so the baseline 3 is appropriate.

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 uses a specific verb and resource: 'Get the event history for a message.' It also adds concrete examples of the pipeline stages (enqueued, sent, delivered), which clearly distinguishes this from sibling tools like get_message or get_message_content.

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?

The description makes it clear this is the tool for delivery-pipeline event history, giving enough context for an agent to select it over get_message or get_audit_event. It does not explicitly name alternatives or exclusions, but the use case is strongly implied.

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

get_notificationA
Read-only
Inspect

Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoVersion to retrieve: "draft", "published" (default — omit this to get it), or a version string like "v001"
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A3.6/5.0
Behavior3/5

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

The readOnlyHint annotation already communicates that this is a safe read operation, so the description does not need to restate that. It adds the version-selection behavior but does not mention defaults, response shape, or any caveats about what is returned.

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 two short sentences with no filler. The core action is front-loaded, and the optional version behavior is stated efficiently.

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?

With complete schema coverage, a readOnlyHint annotation, and no nested objects or output schema, the description covers what is needed. The only minor gap is not explicitly stating the published default, but the schema already provides that.

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%, so the schema already documents both notification_id and version thoroughly. The description adds little beyond restating that version can be a draft, published, or version string.

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 description uses a specific verb ('Retrieve') and resource ('notification template by ID'), and the mention of draft/published/versions adds scope. It is clear, though it does not explicitly distinguish itself from related siblings like get_notification_content or get_notification_draft_content.

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 implies usage for fetching a specific notification template and clarifies version options, but it does not state when to prefer this tool over get_notification_content, get_notification_draft_content, or get_notification_metrics. There is no explicit alternative routing.

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

get_notification_contentA
Read-only
Inspect

Get the published content blocks of a notification template.

ParametersJSON Schema
NameRequiredDescriptionDefault
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark this as readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context by clarifying that only published content blocks are returned, not draft or historical versions.

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?

A single, front-loaded sentence with no filler. Every word adds meaning, and the key qualifier 'published' appears early.

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 one-parameter, read-only getter with a fully documented schema, the description gives enough context to select and invoke the tool correctly. There is no output schema, but the description names the returned entity ('published content blocks'), which is sufficient for this simple case.

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%, so the description does not need to re-explain the parameter. The schema itself provides strong guidance about copying the notification_id exactly; the tool description adds no parameter-specific meaning beyond that.

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 names a specific verb ('Get') and a concrete resource ('published content blocks of a notification template'). The qualifier 'published' distinguishes it from the sibling get_notification_draft_content, so an agent can tell this tool apart without opening the schema.

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 word 'published' implies this tool is for published content rather than draft content, but the description does not explicitly state when to use it versus alternatives such as get_notification_draft_content or get_notification. No when-not or alternative routing is provided.

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

get_notification_draft_contentA
Read-only
Inspect

Get the draft (unpublished) content blocks of a notification template.

ParametersJSON Schema
NameRequiredDescriptionDefault
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read, lowering the bar for behavioral disclosure. The description adds the draft/unpublished scoping, but does not disclose additional behavioral traits such as authentication requirements or what is returned. No contradiction with annotations.

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?

A single, front-loaded sentence with no filler. Every word contributes to identifying the resource and its draft/unpublished nature.

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 one-parameter, read-only retrieval tool, the description plus the detailed schema and annotations are nearly sufficient. There is no output schema, but the answer to 'what does this return' is reasonably inferable from 'content blocks'; still, a small note on return shape would make it fully complete.

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?

The input schema is fully documented (100% coverage), including a detailed warning to copy notification_id exactly. The tool description itself adds no parameter-level meaning, so the schema-carrying baseline of 3 is appropriate.

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 names a specific verb ('Get') and a precise resource: draft (unpublished) content blocks of a notification template. The 'draft (unpublished)' qualifier distinguishes it from the sibling get_notification_content without needing to open schema.

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 purpose implies this should be used when draft/unpublished content is needed, but the description does not explicitly state when to use it vs get_notification_content or any other alternative. There are no exclusions or conditions stated, so usage guidance is only implicit.

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

get_notification_metricsA
Read-only
Inspect

Delivery funnel for ONE notification template over time: sent, delivered, opened, clicked, errors and undeliverable, per provider and channel, in time buckets.

Choosing the window — supply EITHER lookback OR start and end together, NEVER both. Supplying both is rejected. For a relative window like 'the last week', lookback alone is the whole answer: do not also pin start and end. Default is the last 30 days by day. Fine granularities cover shorter windows: HOUR spans at most 7 days and DAY at most 90. How far back a workspace may look also depends on its plan; a request reaching further back is refused with a payment error, which means the plan does not cover that window, NOT that there is no data. A coarser granularity can reach further back than a fine one.

Reading the numbers correctly:

  • The first four counters are NESTED, not separate groups. Every delivered message is also counted in sent, every opened one in delivered, every clicked one in opened. So sent >= delivered >= opened >= clicked always. Report rates (delivered/sent) or the counters themselves. Do NOT add them together — the total is meaningless. And sent minus delivered is NOT a failure count; it is only 'did not reach the delivered stage', for any reason.

  • errors and undeliverable are counted separately and OVERLAP the funnel: a message that failed on one provider and succeeded on a retry appears in both errors and sent. They are not a remainder and do not complete a total.

  • Every counter is a count of distinct MESSAGES, not of events. A message that errored three times counts once in errors.

  • A bucket's data array holds one entry per provider and channel. To get a bucket total, add up the entries in that array — that is the only sum that means anything here. Note that rows for Courier's own built-in email sender are excluded, so these entries can add up to less than the workspace's true volume.

What the buckets mean:

  • A message is counted in the bucket it was ENQUEUED in, not when the event happened. An open today of a message sent last Tuesday is counted in last Tuesday's bucket. So a past bucket can still change: yesterday's opened may be higher when you ask again tomorrow.

  • Results are cached for up to an hour and the pipeline adds its own lag, so a message sent minutes ago is expected NOT to appear yet. Never tell a user a just-sent message is missing; say the data has not caught up.

  • Read the window off the response's start and end, not off what you asked for. The API widens the window to whole buckets and returns the boundaries it actually used.

  • Quiet buckets are returned with an empty data array, so the series has no gaps.

  • An unknown template id returns an all-empty series rather than an error, and messages sent without a template never appear here at all. An empty result is not proof a template is unused — check that the id is right before concluding anything from it.

  • Because of that, a NOT FOUND / 404 error is never about the template id. It means the metrics endpoint itself could not be reached, which is an infrastructure or configuration problem on Courier's side. Say that the metrics service is unreachable and that someone should be told; do NOT tell the user to check or correct their template id, which sends them to fix something that was never wrong.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoWindow end, ISO 8601 with offset. Requires start. Must not be combined with lookback.
startNoInclusive window start, ISO 8601 with offset (2026-04-01T00:00:00Z). Requires end. Must not be combined with lookback.
lookbackNoWindow length counted back from now, as an ISO 8601 duration (P30D, P12W, PT12H). Defaults to P30D. Must not be combined with start/end.
granularityNoBucket size. HOUR covers at most 7 days, DAY at most 90. Defaults to DAY.DAY
notification_idYesThe notification template ID to report on (no commas or whitespace)

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, so the description carries the behavioral burden and exceeds it substantially. It discloses nested counter semantics, overlap between errors/undeliverable and the funnel, distinct-message counting, enqueue-time bucketing, caching lag, widening of the window, empty data arrays, and the meaning of 404 errors. This is exemplary transparency.

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?

Although long, the description is carefully structured with clear headings ('Choosing the window', 'Reading the numbers correctly', 'What the buckets mean') and front-loads the most important operational constraints. Every section adds necessary behavioral context rather than padding.

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?

With no output schema, the description fully compensates by explaining the response shape: bucket data arrays per provider/channel, how to compute bucket totals, empty arrays for quiet buckets, and reading start/end from the response. It also covers error behavior for unknown template ids and 404s, leaving no critical gap for correct invocation.

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

Parameters5/5

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

Schema coverage is 100%, which sets a baseline of 3, but the description adds significant semantic depth: it explains how lookback relates to start/end, how granularity constrains the window (HOUR at most 7 days, DAY at most 90), plan-based lookback limits, and the warning against combining lookback with start/end. This goes well beyond the schema's field descriptions.

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 opening sentence states a specific verb and resource: 'Delivery funnel for ONE notification template over time' with concrete counters (sent, delivered, opened, clicked, errors, undeliverable) per provider and channel. This clearly distinguishes it from sibling get_* tools by emphasizing it is scoped to a single template's aggregate delivery metrics.

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?

The description gives explicit when-to-use guidance for window selection: 'supply EITHER lookback OR start and end together, NEVER both', plus granularity limits and plan-based restrictions. It does not name alternative sibling tools for comparison, but the usage context is unambiguous and actionable.

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

get_preference_sectionA
Read-only
Inspect

Get one preference section by ID, including its topics. Use this when you already know which section you need; list_preference_sections returns every section with its topics in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
section_idYesId of the preference section

TDQS

A4.5/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes safety, and the description adds useful behavioral context by stating that the response includes topics and that the list variant returns everything at once. It does not discuss error cases or pagination, but these are not critical for a simple single-get operation.

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?

Two concise sentences with the core action front-loaded and the alternative explanation placed second. Every word earns its place, and there is no redundant restatement of the title or annotation.

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?

For a simple read-only tool with one well-described parameter, the description is complete: it states the resource, the ID lookup behavior, the included topics, and how to choose between this and the sibling list tool. No critical information is missing.

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?

The schema already provides 100% coverage for the single section_id parameter with a clear description. The tool description reinforces that lookup is by ID but does not add new parameter-level semantics, so the baseline score of 3 is appropriate.

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 uses a specific verb and resource ('Get one preference section by ID') and explicitly distinguishes itself from list_preference_sections, so an agent knows exactly what this tool retrieves and how it differs from the closest sibling.

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 provides a clear when-to-use condition ('when you already know which section you need') and names the alternative for the opposite case (list_preference_sections returns every section in one call). This leaves no ambiguity about tool selection.

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

get_preference_topicA
Read-only
Inspect

Get one subscription topic within a section, including its default opt-in state. Returns 404 if the section or topic does not exist, or if the topic belongs to a different section — so a 404 here can mean the pairing is wrong rather than the topic missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
topic_idYesId of the subscription preference topic
section_idYesId of the preference section

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral detail: the 404 can indicate a wrong pairing rather than a missing topic, and it includes the default opt-in state. This goes beyond annotation coverage.

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?

Two sentences with no fluff. The first sentence front-loads the action and result; the second clarifies an important edge case. Every word earns its place.

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 simple read tool with two parameters and no output schema, the description covers the essential behaviors: what it returns (opt-in state) and the 404 semantics. It lacks nothing critical for correct invocation. A small gap is that it does not describe the response format, but since there is no output schema, that is not required.

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% for both parameters, so the description does not need to restate them. It adds relational context (topic must belong to section) but does not add parameter-level meaning beyond the schema. Baseline 3 is appropriate.

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?

Description states a specific verb ('Get') and resource ('one subscription topic within a section'), plus the key payload ('default opt-in state'). It clearly distinguishes from sibling tools like get_preference_section and get_user_preference_topic by scoping to a section-topic pairing.

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 implies usage (fetch a single topic's details) but does not explicitly name alternatives or state when to prefer this over list_preference_topics or get_user_preference_topic. The 404 note gives context but not active routing guidance.

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

get_preview_device_setA
Read-only
Inspect

Get a preview device set by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_set_idYesThe device set id (pvs_...)

TDQS

A3.9/5.0
Behavior3/5

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

The description is consistent with the readOnlyHint=true annotation and describes a safe read operation. It does not add meaningful behavioral context beyond the annotation, such as response shape, error behavior, or auth requirements, though the simplicity of the operation makes this a minor gap.

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?

One clean sentence with no filler. The verb and resource are front-loaded, and every word contributes to meaning.

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?

For a simple read-only getter with one fully documented required parameter and a readOnlyHint annotation, the definition provides everything an agent needs to select and invoke the tool correctly. No output schema exists, but the 'get' semantics sufficiently imply the returned resource.

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%, with the single parameter device_set_id documented as 'The device set id (pvs_...)'. The description only repeats 'by id' and adds no new parameter semantics beyond what the schema already provides, so the baseline of 3 applies.

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 uses a specific verb ('Get') and resource ('preview device set') with the scoping qualifier 'by id,' making the operation unambiguous. It clearly stands apart from sibling tools like list_preview_device_sets, archive_preview_device_set, and replace_preview_device_set.

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 phrase 'by id' implies this tool is for retrieving a single known device set rather than enumerating or mutating one. However, it does not explicitly mention alternatives such as list_preview_device_sets or state when not to use this tool, so usage guidance is only implicit.

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

get_preview_runA
Read-only
Inspect

Get a preview run with its per-device results and screenshot URLs. Poll until status is COMPLETED or FAILED. The URLs are short-lived and re-signed on every read, so fetch them rather than storing them.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesThe notification template id (nt_...) the run previewed
preview_run_idYesThe preview run id (pvr_...)

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses two important behavioral traits: the need to poll until terminal status and that screenshot URLs are short-lived and re-signed on each read, so they should be fetched rather than stored. This is valuable operational context the annotations do not provide.

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 compact and front-loaded: the core purpose is in the first sentence, followed by the essential polling behavior and the URL freshness warning. Every sentence conveys necessary information with no filler.

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?

With only two well-documented parameters and no output schema, the description sufficiently covers what the tool returns (per-device results and screenshot URLs) and how to interact with it (polling, URL handling). Nothing critical is missing for an agent to use it correctly.

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%, with both template_id and preview_run_id clearly documented in the schema itself. The description adds no additional parameter-level detail, so the baseline score of 3 applies.

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 states a specific verb and resource: 'Get a preview run with its per-device results and screenshot URLs.' This clearly distinguishes it from sibling tools like create_preview_run or list_preview_runs by specifying the exact object and the unique content (per-device results, screenshot URLs) it returns.

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?

The description gives clear context for when to use the tool: to retrieve a preview run's results and to poll until status is COMPLETED or FAILED. It does not explicitly name alternatives or when-not-to-use conditions, so it misses the top tier, but the polling instruction provides actionable usage guidance.

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

get_providerA
Read-only
Inspect

Fetch a single provider configuration by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
provider_idYesThe provider configuration ID

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, and the description's 'Fetch' is consistent with that. The description adds little beyond the annotation, though it does clarify the operation is a single-item lookup rather than a list operation. No behavioral contradiction exists.

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?

A single clear sentence that front-loads the action and the key distinguishing constraint ('by ID'). There is no redundant or filler content.

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 simple one-parameter, read-only getter with no output schema, the description provides enough information for an agent to invoke it correctly: it knows the resource, the single required parameter, and that this is a read operation. It does not describe return format or not-found behavior, but those are not necessary to make the call successfully.

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%, with provider_id already documented as 'The provider configuration ID'. The description's 'by ID' reinforces this dependency but adds no new semantic detail, so the baseline 3 is appropriate.

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 uses a specific verb ('Fetch') and resource ('provider configuration') and clarifies scope as 'a single ... by ID', which distinguishes it from list_providers and other getters. It leaves no ambiguity about what this tool does.

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 phrase 'by ID' implies the tool should be used when the agent already knows a provider_id, and the sibling list_providers is the natural alternative for discovery. However, the description does not explicitly state when not to use it or name the alternative, leaving the usage guidance implicit.

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

get_routing_strategyA
Read-only
Inspect

Retrieve a routing strategy by ID. Returns the full entity including routing, channels, and providers.

ParametersJSON Schema
NameRequiredDescriptionDefault
routing_strategy_idYesThe routing strategy ID (rs_ prefix)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds value by disclosing the return payload composition (routing, channels, providers) beyond what annotations provide, which helps predict behavior. No contradiction with annotations.

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?

A single sentence that front-loads the verb and resource, then adds one useful clause about return contents. No filler, no repetition of schema details, and highly scannable for an agent.

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?

For a simple 1-parameter read operation with a readOnly annotation, the description covers the operation, the identifier to supply, and the expected return contents. Nothing an agent needs to invoke it correctly is missing, especially given the absence of an output schema is mitigated by the stated return structure.

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 coverage is 100%, with the parameter documented as 'The routing strategy ID (rs_ prefix)'. The description's 'by ID' adds no substantive meaning beyond the schema, so the baseline score of 3 applies.

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 the specific verb 'Retrieve', the resource 'routing strategy', and the retrieval key 'by ID', which distinguishes it from list and archive siblings. It also specifies the return composition ('routing, channels, and providers'), making the tool's scope clear.

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 phrase 'by ID' implies the use case: when an agent has a known routing strategy ID and wants the full entity. However, it provides no explicit exclusions or alternatives, such as recommending list_routing_strategies to discover IDs first.

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

get_tenantA
Read-only
Inspect

Get a tenant by its ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesThe tenant ID

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only safety profile is established. The description adds the ID-scoped nature of the lookup but does not mention not-found behavior or response shape, which is acceptable for a simple read but adds only minimal behavioral context.

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?

A single sentence directly communicates the action and the identifying key. There is no filler, and the most important information is front-loaded.

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 simple read-only lookup with one required parameter, schema coverage, and a clear readonly annotation, the description is nearly complete. The only gap is the absence of an explicit return-value or error-behavior statement, but 'Get' makes the intended result reasonably implicit.

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?

The input schema covers 100% of the parameter, including its type and description, so the schema already provides the meaning. The description only reinforces 'by its ID' and adds no new parameter details.

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 states a specific verb and resource ('Get a tenant') plus the retrieval criterion ('by its ID'). This clearly distinguishes it from list_tenants and from create/update/delete tenant siblings.

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?

'By its ID' signals when this tool should be used: when the caller has a specific tenant_id and needs a single tenant. It does not explicitly name alternatives like list_tenants for enumeration, so the guidance is clear but not exhaustive.

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

get_tenant_templateB
Read-only
Inspect

Get a tenant notification template association by template ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesThe tenant ID
template_idYesThe template ID

TDQS

B3.1/5.0
Behavior2/5

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

The annotations provide readOnlyHint: true, and the description's 'Get' is consistent with that. However, the description adds no behavioral context beyond the annotation—nothing about return shape, not-found behavior, auth requirements, or what 'association' means operationally.

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?

A single, front-loaded sentence with no filler. Every word contributes to identifying the action and resource.

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

Completeness3/5

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

For a simple read operation with documented parameters and readOnlyHint, the description is mostly adequate, but it leaves ambiguity around closely related siblings and does not describe what the returned association contains. Since there is no output schema, a little more context would make it fully complete.

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%, with both tenant_id and template_id described in the schema. The description only adds 'by template ID,' which partially restates the schema and omits the tenant_id dimension, so it adds no meaningful semantic value beyond the schema.

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 description clearly states the verb 'Get' and identifies the resource as 'a tenant notification template association' looked up 'by template ID.' This is specific enough to separate it from list-style tools, though it does not explicitly differentiate it from closely related siblings like get_tenant_template_version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as list_tenant_templates or get_tenant_template_version. There are no exclusions, conditions, or alternative routing mentioned.

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

get_tenant_template_versionA
Read-only
Inspect

Get a specific version of a tenant notification template (e.g. latest, published, or v1).

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion identifier (latest, published, or v-prefixed)
tenant_idYesThe tenant ID
template_idYesThe template ID

TDQS

A3.6/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read operation, and the description aligns with that by saying "Get." The description adds useful version-scoping context but does not disclose additional behavioral details such as response contents, error behavior, or prerequisites.

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 a single concise sentence that leads with the action and resource, then gives clarifying examples. There is no redundant or filler content.

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 simple read operation with three fully documented required parameters, the description is nearly complete. It could be improved by explicitly distinguishing this from get_tenant_template or mentioning how to discover available versions, but nothing essential to invoking the tool is missing.

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%, so the parameters tenant_id, template_id, and version are already documented in the schema. The description only repeats the version value examples that the schema already provides, adding no significant meaning beyond it.

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 description clearly states a specific verb and resource: "Get a specific version of a tenant notification template." It conveys the uniqueness of this tool compared to simpler template retrieval, but it does not explicitly name or contrast sibling tools such as get_tenant_template or list_tenant_templates.

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 implies this tool is for retrieving a particular template version, with examples like "latest, published, or v1." However, it does not explicitly state when to choose this over sibling tools or when another tool such as get_tenant_template would be more appropriate.

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

get_translationB
Read-only
Inspect

Get a translation for a specific locale (e.g. "en_US", "fr_FR").

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoTranslation domain (only "default" is supported currently)default
localeYesLocale code (e.g. en_US, fr_FR)

TDQS

B3.4/5.0
Behavior3/5

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

The description matches the readOnlyHint annotation by using 'Get', so there is no contradiction. However, it adds no behavioral detail beyond the annotation: it does not describe return shape, error behavior, or whether multiple translations exist per locale. The annotation lowers the burden, but the description still offers minimal extra transparency.

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?

One concise sentence with no filler. The action, target, and parameter example are all front-loaded and immediately understandable. Nothing extraneous is included.

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 simple two-parameter read-only tool with a fully documented schema, the description is nearly sufficient. The only minor gap is that it does not explain what a 'translation' is in this context or what the caller should expect in the response, but the operation is simple enough that this is not a major deficiency.

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?

The input schema has 100% coverage for both parameters, so the baseline is 3. The description repeats the locale format from the schema but does not add additional meaning about the domain parameter or the relationship between domain and locale beyond what the schema already documents.

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 description clearly states the verb ('Get'), the resource ('translation'), and the qualifying parameter ('locale') with concrete examples. It is unambiguous enough to identify this as a read operation for a translation, though it does not explicitly differentiate itself from sibling tools like update_translation or put_notification_locale.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that update_translation exists for modifying translations, nor does it clarify when get_translation is the appropriate choice among the many get_/list_ sibling tools.

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

get_user_list_subscriptionsA
Read-only
Inspect

List the lists one user is subscribed to. Use this when explaining why a user received something — a subscription here is the reason a list-addressed send reached them, and its absence rules that path out.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
user_idYesThe user ID

TDQS

A4.1/5.0
Behavior3/5

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

The readOnlyHint annotation already communicates that this is a safe read operation. The description adds useful context about what a subscription means for list-addressed sends, but does not describe output shape or pagination beyond what the schema's cursor parameter already covers. This is adequate but not rich.

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?

Two short sentences carry the purpose and the primary use case with no filler. The main action is front-loaded, and every clause earns its place.

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?

For a simple read-only tool with a single required parameter, a fully documented cursor, and a clear usage scenario, nothing essential is missing. The absence of an output schema is acceptable here because the tool's purpose and semantics are already clear from the description and annotations.

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%, so the schema already fully documents both parameters. The description adds only a slight clarification that user_id identifies the 'one user' whose subscriptions are listed, but does not otherwise extend parameter meaning beyond the schema.

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 starts with a specific verb and resource: 'List the lists one user is subscribed to.' It clearly distinguishes this from the sibling tool get_list_subscribers by making the direction explicit (subscriptions belonging to a user, not subscribers of a list).

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?

The description gives an explicit use case: 'Use this when explaining why a user received something — a subscription here is the reason a list-addressed send reached them.' This gives the agent a clear decision rule, though it does not name alternatives or explicitly state when not to use it.

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

get_user_preferencesA
Read-only
Inspect

Get a user's notification preferences (subscriptions, opt-outs, channel preferences).

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID
tenant_idNoOmit this to get the user's workspace-level preferences — that answers most preference questions. Only pass it when you need the tenant-scoped overrides for one specific tenant instead.

TDQS

A3.6/5.0
Behavior3/5

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

The readOnlyHint annotation already conveys the no-mutation behavior, and the description adds context about which preference categories are included. No extra behavioral details (auth, rate limits, return shape) are disclosed, but the annotation reduces the burden for this simple read tool.

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?

A single sentence states the purpose first, then a parenthetical list of the covered preference categories. There is no filler and the structure is easy to scan.

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 two-parameter read-only tool with readOnlyHint and full schema documentation, the description is largely complete. It does not describe the returned output structure, but the category list communicates the core output intent.

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%, which sets the baseline at 3. The description does not directly explain the parameters, but the schema already fully documents user_id and tenant_id, including the tenant_id scoping guidance.

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 description clearly identifies the verb-resource pair: 'Get a user's notification preferences' and enumerates the content categories (subscriptions, opt-outs, channel preferences). It does not name or contrast siblings such as get_user_preference_topic, so it stops short of full sibling differentiation.

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 itself implies no when-to-use guidance, but the tenant_id parameter schema carries an explicit usage note ('Omit this to get the user's workspace-level preferences... Only pass it when you need the tenant-scoped overrides'). That directs parameter choice but not tool choice between alternatives.

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

get_user_preference_topicA
Read-only
Inspect

Get one user's choice for a single subscription topic — whether they opted in or out, and per channel. Use this when you already know which topic is in question; get_user_preferences returns all of them at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID
topic_idYesThe subscription topic ID
tenant_idNoOmit this for the user's workspace-level choice, which answers most questions. Only pass it when you need this topic as scoped to one specific tenant.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Get'. It adds value beyond the annotation by disclosing the return content ('whether they opted in or out, and per channel'), which helps the agent understand what to expect. No contradiction or missing critical behavioral detail.

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?

Two crisp sentences. The core function is stated first, followed by the selection guidance and sibling comparison. No wasted words.

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?

For a simple read-only retrieval tool with a fully documented schema and annotations, the description is complete: it states what it returns, when to use it, and how it differs from the sibling. The lack of an output schema is not a gap because the description communicates the key output fields.

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?

The schema description coverage is 100%, so the schema already fully documents all three parameters. The description does not add meaning beyond what the schema provides for parameters, though it clarifies the output context. Baseline 3 is appropriate.

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 the specific verb and resource: getting a single user's choice for a single subscription topic, including opt-in/out status per channel. It explicitly differentiates this from the sibling tool get_user_preferences, which returns all topics at once.

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?

The description provides explicit guidance on when to use this tool: when you already know which topic is in question, and contrasts it with get_user_preferences as the alternative for retrieving all topics. This leaves no ambiguity about selection.

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

get_user_profile_by_idB
Read-only
Inspect

Get a user profile by their ID. Returns profile data including email, phone, and custom properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID to look up

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safe read-only nature is covered. The description adds some useful context by listing the fields returned (email, phone, custom properties), but it doesn't disclose error behavior, auth needs, or whether a missing user returns null or an error. It adds value but not rich behavioral context.

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?

A single sentence that states the action, the target resource, the key identifier, and the expected output fields. There is no redundancy or filler, and the most important information is front-loaded.

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 simple one-parameter read-only lookup with no output schema, the description is largely sufficient: it names the input and the output content. It is slightly incomplete because it does not address error/not-found behavior or how this differs from related profile/preference retrieval tools, but these are minor for this tool's complexity.

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?

The schema already documents the only parameter, user_id, with 'The user ID to look up,' covering 100% of parameters. The description's 'by their ID' adds no meaningful semantics beyond the schema, so the baseline of 3 applies.

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 description uses a clear verb-resource pair: 'Get a user profile by their ID,' and adds what the result contains (email, phone, custom properties). However, it does not explicitly distinguish itself from the many other get_* siblings, relying mostly on the tool name for differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is provided. The description does not mention when to prefer this tool over alternatives like get_user_preferences, get_user_push_token, or list_tenant_users, nor does it state any exclusions or prerequisites.

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

get_user_push_tokenA
Read-only
Inspect

Get a specific push/device token for a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesThe token identifier
user_idYesThe user ID

TDQS

A3.5/5.0
Behavior3/5

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

readOnlyHint=true already declares the operation safe, and 'Get' is consistent with that. The description adds no behavioral details beyond that, such as what happens if the token is not found, whether the token value is returned, or any auth requirements, so it provides only modest value over the annotation.

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?

One short sentence front-loads the core purpose with no filler. It is appropriately sized for a simple getter, though it does not enrich the definition with any usage or behavior context.

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 simple two-parameter read-only getter with fully documented schema properties and readOnlyHint, the description is largely sufficient: it names the resource, scope, and required granularity. It could be more complete by clarifying the return shape or how this differs from listing tokens, but those gaps are minor given the low complexity.

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%, so the schema already documents both user_id and token. The description does not add any meaning, format, or relationship between token and user beyond what the schema provides, so the baseline 3 applies.

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?

States a clear verb ('Get') and resource ('specific push/device token') scoped to a user. The qualifier 'specific' hints at the singular nature and helps distinguish it from list_user_push_tokens, though no sibling is named.

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 word 'specific' implies this tool is for retrieving one token rather than enumerating all tokens, and the sibling list_user_push_tokens provides an implicit contrast. There is no explicit when-to-use guidance or mention of alternatives, so the guidance is only implied.

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

invoke_ad_hoc_automationBInspect

Invoke an ad-hoc automation with inline steps. Valid step actions: send, send-list, delay, cancel, update-profile, invoke, fetch-data. To cancel a previously started automation, use the cancel_automation tool instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
brandNo
profileNo
templateNo
recipientNo
automationYesThe automation definition with typed steps

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already say this is not read-only and not idempotent, but the description adds no behavioral context about what invoking does (e.g., executes steps immediately, sends messages, updates profiles) or what happens to previously started automations. The cancel guidance contradicts the presence of a cancel step, further muddying behavior.

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 description is compact and front-loaded with the core purpose, and the action list is a useful summary. The cancel sentence is short but creates ambiguity, which slightly reduces the value of the concise structure.

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

Completeness2/5

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

For a tool with a nested automation definition, seven step variants, no output schema, and sparse parameter descriptions, the description is too thin. It omits return/execution behavior, token semantics, and parameter meaning, so an agent would struggle to construct a correct invocation despite the detailed schema.

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

Parameters2/5

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

Schema description coverage is only 17%, so the description carries the burden for explaining parameters, but it only names the step actions. Top-level parameters like data, brand, profile, template, and recipient are left undocumented in the description; the nested schema has to do all the work.

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 uses a specific verb ('Invoke') and resource ('ad-hoc automation') plus 'with inline steps', which distinguishes it from sibling invoke_automation_template. It also enumerates the valid step actions, making the tool's scope immediately recognizable.

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?

It explicitly routes cancellation to cancel_automation, which is good alternative guidance. However, it also lists 'cancel' as a valid inline step action and the schema's cancel step accepts a cancelation_token, creating conflicting guidance about when to use this tool versus the sibling. No guidance is given for choosing between ad-hoc inline automations and invoke_automation_template.

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

invoke_automation_templateAInspect

Invoke an automation run from an existing automation template. template_id refers to an existing automation template in the workspace. Example: { template_id: "auto-onboarding", recipient: "user-123", data: { plan: "pro" } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoData to pass to the automation
brandNoBrand ID override
profileNoProfile data for the recipient
templateNoNotification template override
recipientYesRecipient user ID
template_idYesThe automation template ID

TDQS

A3.8/5.0
Behavior2/5

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

Annotations are all false and provide no safety profile, so the description carries the full burden of behavioral disclosure. It states that an automation run is invoked but does not explain side effects, whether the run is asynchronous, what gets sent or created, or what the response contains. The example demonstrates payload shape but not behavioral consequences.

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 compact: a one-sentence purpose, a clarifying constraint on template_id, and one illustrative example. Every sentence earns its place and the key action is front-loaded.

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

Completeness2/5

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

There is no output schema and no mention of return values, failure modes, idempotency, or whether the invocation is asynchronous. For a non-read-only, non-idempotent operation, the description omits important context an agent needs to safely interpret the result of the call.

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. The description adds value beyond the schema by explaining that template_id must point to an existing template and by giving a concrete example that shows how data, recipient, and template_id fit together. This is genuinely useful for a tool with nested object parameters.

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 a specific verb and resource: 'Invoke an automation run from an existing automation template.' It clarifies that template_id must refer to an existing workspace template, which also helps distinguish it from invoke_ad_hoc_automation. The example reinforces the purpose without ambiguity.

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?

The description establishes clear context: use this when you have an existing automation template and want to run it. It does not explicitly name alternatives or exclusions, such as 'use invoke_ad_hoc_automation for ad-hoc runs', but the 'existing template' qualifier makes the intended use case reasonably clear.

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

invoke_journeyBInspect

Invoke a journey run from a journey template. template_id refers to an existing journey template in the workspace. Example: { template_id: "j-onboarding", user_id: "user-123", data: { plan: "pro" } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoData payload passed to the journey for conditions and template variables
profileNoProfile data for the user (email, phone, custom fields)
user_idNoRecipient user ID. Can also be resolved from profile or data.
template_idYesThe journey template ID

TDQS

B3.2/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false and idempotentHint=false, implying a state-changing operation that may have side effects. The description does not disclose these behavioral traits at all—it only says 'invoke a journey run' without explaining what happens (e.g., sends messages, triggers automations) or whether it is asynchronous. With no further context, the agent is left guessing about side effects and reliability.

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 extremely concise: one sentence plus an example. The core purpose is front-loaded, and the example is directly relevant to parameter usage. There is no extraneous information, making it easy for an agent to parse quickly.

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

Completeness2/5

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

Given that this is a mutation tool with no output schema, the description should explain what happens after invocation (return value, async behavior, possible errors). It only gives an example, leaving out crucial execution details. The presence of nested objects (data and profile) and the ambiguity of user_id resolution suggest the description is incomplete for an agent to invoke this correctly in all cases.

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%, as all four parameters (data, profile, user_id, template_id) have descriptions. The description adds a clarifying example and notes that template_id refers to an existing template, which is a small enhancement. However, it does not explain how user_id relates to profile or data beyond what the schema already says, so it meets but does not exceed the baseline for full coverage.

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 the action ('Invoke a journey run from a journey template') with a specific verb and resource. It also immediately clarifies that template_id refers to an existing template in the workspace, and provides a concrete example. This distinguishes it from siblings like invoke_automation_template by explicitly mentioning 'journey run' and 'journey template'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives. It does not mention prerequisites, like whether the template must be published, nor does it contrast with invoke_automation_template or invoke_ad_hoc_automation. An agent would have to infer usage from the example, which is insufficient for routing.

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

list_audience_membersA
Read-only
Inspect

List the users who currently match an audience's filter. Membership is computed, so this reflects profiles as they are right now — a profile change can move someone in or out without the audience itself being edited.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
audience_idYesThe audience ID

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, so the description's job is to add value beyond that. It does so by explaining that membership is computed and can change without editing the audience, which is a meaningful behavioral trait. It also implicitly confirms it's a read operation consistent with the annotation. It doesn't cover pagination or return format, but for a read-only list tool, this is a solid contribution.

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?

Two sentences with no filler. The first sentence states the core purpose, and the second adds a key behavioral nuance. The information is front-loaded and every word earns its place. It avoids repeating schema details or annotations.

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 simple list tool with two parameters, a readOnly annotation, and no output schema, the description captures the essential nuance (dynamic membership). It doesn't mention pagination explicitly, but the cursor parameter is described thoroughly in the schema, so the agent can infer. It's complete enough for correct invocation without being verbose.

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?

The schema has 100% coverage for both parameters (audience_id and cursor) with clear descriptions. The tool description adds no additional meaning beyond what the schema provides. Per the calibration, baseline 3 applies when schema fully documents parameters, and the description doesn't compensate for anything missing.

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 states a specific verb ('List'), a clear resource ('users who currently match an audience's filter'), and distinguishes it from similar tools like list_audiences (lists audiences) and get_audience (gets an audience). The nuance that membership is computed and reflects current profiles adds specificity beyond a generic 'list members' phrasing, making it easy for an agent to identify the exact purpose.

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 implies when to use it (when you need the current members of an audience) but provides no explicit exclusions or alternatives. It doesn't mention that for static lists, get_list_subscribers might be more appropriate, or that it's read-only. The behavioral note about computed membership gives context but not direct guidance on choosing this over siblings.

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

list_audiencesA
Read-only
Inspect

List the workspace's audiences. An audience is a saved filter over user profiles — a dynamic segment — so this answers "who can I target" and gives you the audience IDs that journey audience triggers and send requests refer to.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.

TDQS

A4.2/5.0
Behavior4/5

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

The readOnlyHint annotation already signals this is a safe read operation Taxonomy. The description adds meaningful behavioral context beyond that: an audience is a dynamic segment, not a static list, and the call yields the audience IDs needed elsewhere. This clarifies what the returned data represents without contradicting the annotations.

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 two sentences, front-loaded with the primary action, and every clause adds value. The first sentence states exactly what the tool does; the second explains the audience concept and why the result matters. There is no filler, repetition, or unnecessary schema duplication.

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 simple list operation with one optional parameter and a well-documented cursor, the description is nearly complete: it tells the agent what the tool lists, what an audience is, and what the result is used for. Since there is no output schema, a brief mention of the returned fields would have been stronger, but the key value — audience IDs — is explicitly included.

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%, with the cursor parameter thoroughly explained in the schema itself including the warnings about not decoding or editing it. The main description adds no parameter-specific detail, which is acceptable because the schema already carries full weight here. Baseline 3 is appropriate.

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 states a clear verb and resource: "List the workspace's audiences." It goes beyond the name by defining what an audience is and why this tool matters: it identifies who can be targeted and provides the IDs used by journey triggers and send requests. This distinguishes it from sibling tools like get_audience, which fetches a single audience, and list_audience_members, which lists member profiles rather than audiences themselves.

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?

The description gives a clear use case: when you need to know "who can I target" or need audience IDs for journey triggers and send requests. It does not explicitly list alternatives or state when not to use it, so it stops short of full exclusion-level guidance, but the intended context is unmistakable.

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

list_audit_eventsA
Read-only
Inspect

List audit events in the workspace. Useful for tracking API usage and changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description's 'List' is consistent with a read operation. It adds the workspace scope but does not disclose pagination behavior or return format; with annotations covering the safety profile, a mid score is appropriate.

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?

Two short sentences with no filler. The core operation is front-loaded and the purpose statement adds value without bloat.

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 simple read-only list tool with one optional parameter and no nested objects, the description is largely sufficient. Omitted details about pagination behavior and response shape are minor given the simplicity and the schema documentation.

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?

The input schema covers the single cursor parameter 100%, so the description does not need to compensate. The description adds no parameter-level meaning beyond the schema, keeping this at the baseline of 3.

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 states a clear verb-resource pair: 'List audit events', and scopes it to the workspace. It is unambiguous and distinct from the sibling get_audit_event, which handles a single event.

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 phrase 'Useful for tracking API usage and changes' gives implied context for when to call the tool, but there is no explicit guidance about when to choose this over a sibling such as get_audit_event, nor any exclusions.

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

list_automationsA
Read-only
Inspect

List the workspace's automation templates, each with its template ID and whether it has a published or draft version. Answers "what automations already exist here" — this only reads the catalog, it never runs one.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
versionNoReturn only templates in this state. Omit to return every automation template regardless of state.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description adds a meaningful behavioral guarantee: listing the catalog never executes an automation. This reassures the agent that the call has no side effects. No contradictions with the annotations are present.

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?

Two concise sentences lead with the action and resource, then immediately provide the key behavioral clarification. Every sentence earns its place with no redundancy or filler.

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?

For a read-only list tool with two optional, fully documented parameters and a readOnlyHint annotation, the description covers scope, output shape, and side-effect behavior. It is complete enough for an agent to both select and invoke the tool correctly.

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%, so the cursor and version parameters are already fully documented. The description adds no extra parameter detail, but none is needed; the baseline of 3 applies.

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 description identifies a specific verb (list), a specific resource (workspace automation templates), and a concrete output (template ID and published/draft version status). It is clear and actionable, though it does not explicitly contrast itself with similar sibling tools like list_journey_templates or list_tenant_templates.

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?

The description states its intended question ('what automations already exist here') and explicitly clarifies a when-not case ('it never runs one'). It gives clear context for when to use the tool, though it does not name alternatives or provide exclusion criteria relative to sibling list tools.

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

list_brandsA
Read-only
Inspect

List the workspace's brands. A brand is the reusable logo, colors and email styling a notification template renders with; this gives you the brand IDs a template's brand reference points at.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint annotation already signals a safe read operation. The description adds useful scoping context ('workspace's brands') and explains the output's purpose, but it does not disclose additional runtime behavior such as pagination or absence of filtering. The schema covers cursor mechanics, so the description carries no contradiction and adequate but minimal behavioral context.

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 two sentences with no filler. The first sentence names the operation and scope; the second provides concise domain context that helps the agent understand why the result matters. It is front-loaded and every word earns its place.

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 simple optional-paginated list operation with a read-only annotation, the description explains the resource, the return value's role, and the workspace scope. The schema handles cursor behavior, so the description is nearly complete; it only stops short of explicitly noting that full brand objects, not just IDs, are returned.

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?

The single cursor parameter has 100% schema description coverage, including strong guidance about the opaque token and when to omit it. The description itself does not add parameter-level details, which is acceptable since the schema already carries the full semantic burden.

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 description clearly identifies the operation ('List') and the resource ('the workspace's brands'), and adds a concrete definition of what a brand is and how the result relates to template brand references. It does not explicitly contrast with sibling operations like get_brand, but the verb-and-resource pairing is unambiguous.

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?

The description gives a concrete use case: retrieving the brand IDs that a template's brand reference points at. It does not spell out exclusions or explicitly name alternatives, but the context is clear enough to guide an agent's choice between listing and other brand operations.

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

list_broadcastsB
Read-only
Inspect

List broadcasts in the workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax broadcasts per page
cursorNoPagination cursor from a previous response

TDQS

B3.3/5.0
Behavior2/5

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

Annotations declare readOnlyHint=true, so the tool is known to be safe for reads. However, the description adds no behavioral detail beyond the action, such as pagination behavior, return format, or any side effects. With annotations covering the read-only nature, the description offers minimal additional transparency.

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 a single, concise sentence that directly states the tool's purpose. It is front-loaded and contains no extraneous information, earning a high score for efficiency.

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

Completeness3/5

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

For a simple list operation with two optional parameters and no output schema, the description provides the basic purpose. However, it lacks details on pagination behavior, ordering, or the shape of returned data, which could be inferred from parameter names but are not explicitly stated. Given the annotations and schema, it is minimally complete but could be enhanced.

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?

Both parameters (limit, cursor) have descriptions in the schema, achieving 100% coverage. The description adds no extra meaning beyond the schema, so the baseline score of 3 is appropriate.

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 states a specific verb ('List') and resource ('broadcasts') with scope ('workspace'), clearly distinguishing it from other list tools by resource type. It is unambiguous and directly actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like get_broadcast or create_broadcast. There is no mention of context, prerequisites, or exclusions, leaving the agent to infer appropriate usage.

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

list_bulk_usersB
Read-only
Inspect

List the users in a bulk job.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor
job_idYesThe bulk job ID

TDQS

B3.3/5.0
Behavior3/5

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

The readOnlyHint annotation already signals a safe read operation, and the description's 'List' verb is consistent with that. The description adds the scoping to a bulk job but does not disclose pagination, result contents, or ordering. With annotations covering the safety profile, this is adequate but not enriching.

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?

A single sentence with no filler, front-loading the action and target. It is appropriately sized for the tool's simplicity, and every word contributes to understanding the operation.

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

Completeness3/5

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

For a simple read-only list operation with a required job_id and an optional cursor described in the schema, the description is nearly sufficient. It does not mention the response shape (no output schema is present) or link to related bulk-job tools, but the core calling context is present.

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%, so both parameters are already well-documented in the schema. The description only reinforces that job_id refers to a bulk job and adds no new syntax or meaning beyond what is in the input schema. The baseline of 3 applies.

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 description uses a specific verb ('List') and a clear resource ('users in a bulk job'), and it is distinguishable from sibling tools like get_bulk_job and add_bulk_users. However, it does not clarify what a bulk job is or which users are included, keeping it just below a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives such as get_bulk_job, list_tenant_users, or list_audience_members. The agent must infer usage from the tool name and job_id parameter, with no explicit context or exclusions.

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

list_digest_instancesA
Read-only
Inspect

List the digest instances for a digest schedule. Each instance is the events accumulated so far for one user against that schedule, so this shows what is waiting to go out and answers why a digest has not arrived yet — it is still accumulating, or it has nothing in it.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum instances to return. Defaults to 20; the API caps this at 100.
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
schedule_idYesThe digest schedule id, in the form "sch/{uuid}"

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds behavioral value by explaining that each instance represents per-user accumulated events and why a digest might be pending (still accumulating or empty). This goes beyond the annotation's basic safety hint and helps the agent interpret the results.

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 description is a single sentence but packs the core action, a definition of instances, and a diagnostic rationale without redundancy. It is front-loaded with the primary purpose and remains readable. While not overly concise, it uses structure well and contains no filler.

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?

There is no output schema, so the description must convey what to expect. It explains the nature of instances and the diagnostic value, which is largely sufficient for a list operation. It does not describe ordering or explicit pagination semantics, but the cursor parameter is already documented in the schema. Overall, the description covers the essential context.

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 coverage is 100%, and the schema descriptions for limit, cursor, and schedule_id are already detailed (defaults, caps, format, and opaque-token warnings). The tool description does not add parameter-specific semantics beyond what the schema provides, so the baseline 3 applies.

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 the verb (List), the resource (digest instances), and defines what an instance is ('events accumulated so far for one user against that schedule'). It also explains the purpose (shows what is waiting to go out, answers why a digest hasn't arrived). This is specific and distinguishes it from related tools like release_digest.

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?

The description gives clear context for when to use this tool: to inspect what is waiting to go out and diagnose non-arrival. It implicitly distinguishes from release tools by focusing on inspection. However, it does not explicitly name alternatives or state when not to use it, so it falls short of the 5-level criterion.

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

list_journey_runsA
Read-only
Inspect

List journey runs, newest first. Filter by journey, status, or a created_at window to find a run that stalled or errored, then read its steps with list_journey_run_steps.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRuns per page, 1 to 50. Defaults to 20.
cursorNonext_cursor from a previous response
statusNoComma-separated run statuses to filter on, e.g. PROCESSED,ERROR
end_dateNoInclusive upper bound on created_at, ISO 8601 date or timestamp
start_dateNoInclusive lower bound on created_at, ISO 8601 date or timestamp
template_idNoComma-separated journey ids to filter on

TDQS

A4.2/5.0
Behavior4/5

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

Adds useful behavioral context beyond the readOnlyHint annotation: results are ordered newest first, filters can be combined to find stalled/errored runs, and step-level detail lives in a sibling tool. It does not describe pagination or result shape, but the schema covers cursor and limit mechanics.

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?

A single, well-structured sentence that front-loads the core listing behavior, then mentions filters and the intended workflow. No filler words or redundant restatements of the tool name.

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 read-only list tool with six optional, fully documented parameters and no output schema, the description is nearly complete: it gives the ordering, filter options, and a chained next action. The main missing piece is a note about pagination/return envelope, though cursor and limit semantics are present in the schema.

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?

The input schema already documents all six parameters with full descriptions, so the baseline is 3. The description usefully groups start_date/end_date as a 'created_at window' and maps 'journey' to template_id, but adds little detail that is not already present in the schema.

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?

Description uses a specific verb-resource pair ('List journey runs'), states the sort order ('newest first'), and describes the available filters. It also names the closely related sibling list_journey_run_steps, making it easy for an agent to distinguish this listing tool from other journey-related tools.

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?

The description gives a clear context for use—find a run that stalled or errored—and explicitly points to list_journey_run_steps as the follow-up. It does not explicitly state when not to use this tool versus list_journeys or get_journey_run, so it falls short of a full when/when-not set of alternatives.

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

list_journey_run_stepsA
Read-only
Inspect

List the steps of a journey run in order, with each node and what happened at it. This is how to see where a run stopped and why.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYesThe journey run id

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to restate that. It adds value by disclosing that the output includes ordered steps, per-node events, and stop/why information—behavioral details not inferable from annotations. No contradiction exists.

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?

Two concise sentences with zero filler. The first sentence states the core function, the second explains the primary use case. Information is front-loaded and every phrase earns its place.

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 read-only, single-parameter tool, the description is complete: it explains what the output contains (ordered steps, node events, stop reason) and why it's used. It doesn't cover error handling or output format, but the simplicity and annotations make that acceptable.

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?

The schema covers the only parameter, run_id, with a minimal description ('The journey run id'). The tool description doesn't add any further meaning about run_id. Since schema coverage is 100%, the baseline of 3 applies; the description adds no extra parameter semantics.

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 states a specific verb and resource: 'List the steps of a journey run in order, with each node and what happened at it.' This clearly distinguishes it from sibling tools like get_journey_run (which retrieves run-level info) and list_journey_runs (which lists runs, not steps). It also adds specific output details that set it apart.

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?

The description gives a clear use case: 'This is how to see where a run stopped and why.' This tells an agent when to use the tool, but it doesn't explicitly mention alternatives or when not to use it. However, the context is sufficient for most selection scenarios.

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

list_journeysB
Read-only
Inspect

List journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoIf a response has no cursor, every journey already came back — calling this again with the same arguments returns the same page, not new data. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
versionNoFilter by version state. Defaults to published, and the two are never combined in one call. If you don't know whether the journey you want is published or still a draft, calling this twice — once per value — is the correct way to check both, not a repeat.

TDQS

B3.4/5.0
Behavior3/5

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

With readOnlyHint=true, the description does not need to establish safety, and it adds useful output context by stating that journey IDs and version state are returned. It does not disclose pagination behavior, but the cursor parameter schema already covers that thoroughly, so the description's contribution is adequate but not substantial.

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 a single, front-loaded sentence that communicates the resource, scope, output, and optional filter with no wasted words. It is concise without sacrificing the key information an agent needs.

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?

The description explains what is returned (IDs and version state) and the available filter, and the schema covers cursor mechanics and version defaults. It is reasonably complete for a simple list operation, though it could have resolved the ambiguity with sibling list_journey_templates by noting what this tool is not.

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%, and the parameter descriptions for cursor and version are already detailed. The description merely restates the version filter in prose, adding no new semantic meaning beyond the schema, so the baseline of 3 is appropriate.

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 description clearly states the verb 'list', the resource 'journey templates in the workspace', and the expected output 'journey IDs and version state'. However, it does not distinguish this tool from the sibling list_journey_templates, which could plausibly serve the same purpose, so it falls short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its purpose but provides no explicit guidance on when to use this tool over alternatives like list_journey_templates, list_journey_versions, or get_journey_template. The 'Optionally filter by version' note addresses parameter usage, not tool selection, so an agent gets little help choosing correctly among the many journey-related siblings.

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

list_journey_templatesA
Read-only
Inspect

List notification templates scoped to a journey. Journey-scoped templates can only be used by send nodes within the same journey. Call this to discover template IDs before wiring send nodes in replace_journey.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (1–100)
cursorNoCheck the response's paging.more before calling again — false means every template already came back, and calling again with the same arguments returns the same page, not new data. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
journey_idYesThe journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4/5.0
Behavior3/5

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

The annotation includes readOnlyHint=true, so the safety profile is already known. The description adds useful context about journey scoping and the template-ID discovery purpose, but it does not disclose additional behavioral details such as result ordering, default page size, or overall response structure. This is acceptable for a read-only list tool but not especially rich.

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?

Two sentences with no filler. The primary purpose and scope appear first, followed by a single actionable usage hint. Every clause earns its place.

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 simple read-only listing tool, the description is sufficient: it states the object type, scope, and the workflow context. The schema handles parameter details, including paging semantics. There is no output schema, but the description's focus on discovering template IDs aligns with what the agent needs before calling replace_journey.

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 coverage is 100%, with detailed parameter descriptions for journey_id, limit, and cursor, including the instruction to pass cursor back byte-for-byte. The description itself does not add parameter-level meaning, so the baseline of 3 is appropriate.

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 starts with a specific verb-resource pair, 'List notification templates scoped to a journey,' which precisely states both the object type and the scope. It further clarifies that journey-scoped templates are distinct and usable only by send nodes within the same journey, distinguishing this tool from broader template-listing siblings.

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?

It gives a clear use case: 'Call this to discover template IDs before wiring send nodes in replace_journey.' This tells the agent when to invoke the tool and why. It does not explicitly name alternatives or exclusion cases, but the journey scoping provides enough context to avoid confusion with tenant-level template tools.

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

list_journey_template_versionsA
Read-only
Inspect

List published versions of a journey-scoped notification template, ordered most recent first.

ParametersJSON Schema
NameRequiredDescriptionDefault
journey_idYesThe journey template ID that owns this notification
notification_idYesThe notification template ID

TDQS

A3.8/5.0
Behavior4/5

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

The annotation already declares readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context beyond the annotation: it only returns published versions and orders them most recent first. This helps the agent understand what data to expect without contradicting the read-only nature.

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 a single, focused sentence with no redundant words. It front-loads the key action and scope, and the ordering behavior is included efficiently. Every word earns its place.

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 simple read-only list tool with no output schema, the description is adequate. It specifies that only published versions are returned and the ordering, which covers the main expectations. It does not mention pagination or the exact response structure, but these are not critical for a tool of this simplicity, and the readOnlyHint covers side-effect concerns.

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?

The input schema fully describes both parameters (journey_id and notification_id) with clear descriptions, so schema coverage is 100%. The description does not add any additional meaning to the parameters, but the baseline of 3 is appropriate because the schema handles the heavy lifting.

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 the verb 'list', the resource 'published versions of a journey-scoped notification template', and adds the ordering constraint 'most recent first'. This distinguishes it from generic list tools like list_notification_versions (which are not journey-scoped) and list_journey_versions (which likely list journey versions rather than notification template versions). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as list_notification_versions or list_journey_versions. The description implies a specific scope but does not explicitly state when this tool is preferred or when to avoid it. Given the large sibling list with overlapping names, an agent could easily pick the wrong tool without clearer differentiation.

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

list_journey_versionsA
Read-only
Inspect

List published versions of a journey, ordered most recent first.

ParametersJSON Schema
NameRequiredDescriptionDefault
journey_idYesThe journey template ID

TDQS

A3.6/5.0
Behavior4/5

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

The annotations already mark the operation as read-only, and the description adds useful behavioral context: only published versions are included and they are ordered newest first. It does not mention pagination or output shape, but for a simple read-only version list that is a minor gap.

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?

One sentence contains the operation, resource, filter, and ordering with zero filler. The most important scoping information is at the front.

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 one-parameter, read-only listing tool, the description covers what is listed and the order. It is slightly incomplete because it does not describe the returned version objects or mention pagination, and the journey-versus-template terminology is not reconciled.

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 coverage is 100% and the single parameter is already documented as 'The journey template ID', so the description does not need to add much. It adds little beyond the schema and slightly mixes terminology by calling the resource a journey rather than a journey template.

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 description names a specific operation (list), a resource (published versions of a journey), and an ordering (most recent first), so a caller knows what to expect. It does not explicitly differentiate this from the closely named sibling list_journey_template_versions, so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus siblings such as list_journey_template_versions or get_journey. The word 'published' implies a scope restriction, but no alternative or exclusion is stated explicitly.

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

list_listsA
Read-only
Inspect

List the workspace's lists. A list is an explicit, subscription-based group of users — someone is on it because they were subscribed, not because they match a rule. Optionally filter by an id pattern such as "example.list.*".

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
patternNoFilter by list id pattern, where * matches a segment — for example "example.list.*". Omit to return every list.

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes this is a safe read operation, so the description does not need to cover mutation risks. The description adds useful domain context about subscription-based lists and the optional pattern filter, but it does not disclose behavior such as pagination, ordering, or response shape beyond what the cursor schema already implies.

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 two concise sentences that front-load the primary action and then add only the essential conceptual distinction and filter guidance. Every sentence earns its place with no redundancy.

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 read-only listing tool with no required parameters and fully documented parameters, the description plus schema is nearly complete. It could go a step further by explicitly mentioning pagination or the returned list shape, but the rich cursor schema and the straightforward 'List...' phrasing make the tool adequately callable.

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%, and both parameters are already well documented, especially cursor with its detailed opaque-token warning. The description's pattern example adds little beyond the schema, so the baseline 3 is appropriate.

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 a specific verb and resource: 'List the workspace's lists.' It then clarifies what a list is by contrasting subscription-based membership with rule-based membership, which distinguishes it from sibling tools like list_audiences or get_list.

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 implies this tool is for enumerating lists, and it notes that the pattern parameter is optional, but it does not explicitly state when to prefer this over get_list, list_audiences, or other list-related siblings. The usage context is inferable but not spelled out.

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

list_messagesB
Read-only
Inspect

List messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by metadata tags
listNoFilter by list ID
tagsNoComma-delimited list of tags
eventNoFilter by event ID
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
statusNoFilter by status (e.g. DELIVERED, UNDELIVERABLE)
traceIdNoFilter by trace ID
archivedNoThis NARROWS, it does not widen: true returns ONLY archived messages, excluding every active one. Omit it entirely to search active messages — the default view for a normal delivery question. Setting it true is not the thorough or safe choice; it is a different, much smaller result set.
providerNoFilter by provider key (e.g. sendgrid, twilio)
messageIdNoFilter by message ID
recipientNoFilter by recipient user ID
tenant_idNoFilter by tenant ID
notificationNoFilter by notification ID
enqueued_afterNoISO 8601 timestamp; only return messages enqueued after this time

TDQS

B3.3/5.0
Behavior3/5

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

The readOnlyHint annotation already signals a safe read operation. The description adds the scope 'previously sent' but doesn't disclose behavioral details like pagination, default active-message view, or archived narrowing; those live only in the schema. It neither contradicts annotations nor adds significant behavioral context.

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?

One compact sentence states the resource and then enumerates the filter options. Every word earns its place, and the core purpose is front-loaded.

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

Completeness3/5

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

For a 14-parameter listing tool, the description gives a serviceable overview but omits any mention of pagination, result scoping, or ordering. The schema fills some gaps, but the description alone leaves an agent with limited context about defaults and page traversal.

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%, so the schema already documents every parameter. The description restates a subset of filter dimensions without adding new meaning or clarifying usage beyond the schema. Baseline 3 is appropriate.

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 description names a specific action and resource ('List messages you've previously sent') and lists the main filter dimensions. It is clear and distinguishable from get_message/get_message_history at a glance, though it doesn't explicitly contrast itself with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lists filterable fields but gives no guidance on when to use this tool versus alternatives like get_message, get_message_history, or list_notifications. There is no when-to-use, when-not-to-use, or mention of sibling tools.

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

list_notification_checksA
Read-only
Inspect

List the checks recorded against one notification submission. Checks are the gates a submission has to clear before it goes out, so a failing check here is the reason a template is stuck rather than live.

ParametersJSON Schema
NameRequiredDescriptionDefault
submission_idYesThe submission ID whose checks to list
notification_idYesThe notification template ID

TDQS

A4.1/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes this is a safe read operation, and the description adds useful domain context about checks being gates. It does not, however, describe the return shape, whether empty results are possible, or any other behavioral details, so the added value beyond annotations is moderate.

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?

Two sentences with no filler: the first states exactly what the tool does, and the second provides one piece of high-value context. The key scope is front-loaded.

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?

For a simple two-parameter, read-only list operation with fully documented parameters and a readOnlyHint annotation, the description is complete. It explains the domain meaning of checks and how to interpret a failure, and no additional information is needed to invoke the tool correctly.

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 coverage is 100% and both required parameters have clear descriptions ('The submission ID whose checks to list' and 'The notification template ID'). The description only refers to 'one notification submission' and adds no parameter-specific detail beyond the schema, so it meets the baseline without exceeding it.

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 states a specific verb and resource: 'List the checks recorded against one notification submission.' It also defines checks as gates, making it clear this is about per-submission check results, distinct from list_notifications (all notifications) and update_notification_checks (mutating checks).

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?

The second sentence gives clear diagnostic context: a failing check here explains why a template is stuck instead of live, which tells an agent when to call this tool. It does not explicitly name alternatives or when-not-to-use conditions, so it falls short of a 5.

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

list_notificationsA
Read-only
Inspect

List notification templates, newest first. Pass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOnly return templates carrying ALL of these tags, matched case-insensitively on the tag name shown in a template's tags field (e.g. ["onboarding"]). Omit to list every template.
cursorNoThis is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, so the description need not repeat that this is read-only. It adds behavioral details beyond the schemas: newest-first ordering, the ALL-of-tags matching semantics, and cursor-based pagination. This gives the agent a solid picture of how the tool behaves without contradiction.

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 three short sentences, front-loaded with the core purpose in the first phrase. Every sentence adds a distinct piece of information: purpose, filtering, pagination. There is no verbose filler.

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 two-optional-parameter list tool with no output schema and minimal annotations, the description covers the main behavioral aspects: ordering, filtering, and pagination. It does not explicitly describe the response shape, but the phrase 'Page through the rest with cursor' implies the cursor is in the response, and the tool's name and purpose make the list return obvious. Overall it is sufficiently complete.

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%, so the input schema already documents both `tags` and `cursor` thoroughly. The description essentially restates the schema's tag-filtering behavior and cursor-page concept, adding no new information. Baseline 3 applies because the schema does the heavy lifting.

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: 'List notification templates, newest first.' The resource 'notification templates' differentiates from sibling tools like list_notification_versions and list_notification_checks, which are clearly not templates. The ordering detail further clarifies the behavior.

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?

The description gives clear context that this tool lists notification templates, and explains tag filtering and cursor pagination. However, it does not explicitly direct the agent to alternatives for related resources (e.g., versions) or state when not to use this tool. That leaves the usage guidance at 'clear context, no exclusions' rather than explicit alternative routing.

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

list_notification_versionsA
Read-only
Inspect

List the version history of a notification template — each published version with when it was created. Use this to say what changed and when, or to find the version string get_notification accepts.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum versions to return per page. Defaults to 10, which is also the maximum.
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
notification_idYesThe notification template ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations include readOnlyHint: true, so the read-only nature is already disclosed. The description adds value by explaining the content of each version (creation time) and its relationship to get_notification. No contradiction or hidden side effects.

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 a single, focused sentence that front-loads the primary action and resource, then immediately gives usage context. No fluff or redundant phrasing.

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?

The description covers what is returned (published versions with creation times) and the linkage to get_notification. Pagination is documented in the schema (cursor/limit), and read-only is in annotations. It lacks explicit error handling or edge cases, but for a read-only list operation, the core missing information is minimal.

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 coverage is 100%, with detailed descriptions for limit, cursor, and notification_id. The description adds no additional parameter-level semantics beyond what the schema already provides, so baseline 3 is appropriate.

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 the tool lists version history of a notification template, with each published version and its creation time. It also distinguishes from siblings by mentioning that the version string is what get_notification accepts, making the purpose unambiguous.

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?

The description provides explicit use cases: to say what changed and when, or to find the version string for get_notification. It implies an alternative (get_notification) but does not explicitly state when not to use this tool versus others. Still, the guidance is clear enough for an agent.

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

list_preference_sectionsA
Read-only
Inspect

List the workspace's preference sections, each with the topics inside it. One call returns the whole opt-in surface: everything a user could subscribe to or opt out of. This is what the workspace DEFINES — use get_user_preferences for what a particular person actually chose.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description goes beyond that by disclosing that a single call returns the whole opt-in surface, including nested topics, and clarifying that this represents workspace definitions rather than user selections.

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?

Three sentences, each earning its place: the first states the action and output, the second clarifies the breadth of the response, and the third routes to the correct sibling. The key distinction is front-loaded and there is no filler.

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?

With no parametersaint and no output schema, this description is complete for an agent deciding whether to call it. It explains the return shape, the scope, and the contrast with get_user_preferences, so the agent can confidently invoke it without further lookup.

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?

There are zero parameters serious path, so the description has no parameter semantics to add. The baseline of 4 applies because nothing is missing; the description correctly focuses on what the call returns rather than arguments.

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 states a clear verb ('List') and resource ('the workspace's preference sections'), and specifies that each section includes its topics. It also distinguishes itself from get_user_preferences, making the tool's scope immediately identifiable among siblings.

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?

The description explicitly says when to use this tool — to see the entire opt-in surface as defined by the workspace — and directs the agent to get_user_preferences when the goal is a specific user's actual choices. This is direct when/when-not guidance with a named alternative.

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

list_preference_topicsA
Read-only
Inspect

List the subscription topics inside one preference section. A topic is the individual thing a user opts in or out of, and its ID is what get_user_preference_topic takes.

ParametersJSON Schema
NameRequiredDescriptionDefault
section_idYesId of the preference section

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds context about what a topic is and its ID usage, but does not disclose additional behavioral details such as return format or pagination. It is consistent with annotations and adds some value but not substantial behavioral disclosure.

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 concise and front-loaded. The first sentence states the purpose, and the second adds useful context about topics and their relationship to another tool. There is no fluff 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 low complexity (one parameter, no output schema) and the presence of read-only annotations, the description provides sufficient context for an agent to call the tool correctly. It explains the domain concept of a topic and how the result relates to get_user_preference_topic, though it does not explicitly describe the return shape. It is adequate for a list tool.

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?

The sole parameter section_id has a schema description ('Id of the preference section') that is clear. The description reinforces this by mentioning 'inside one preference section', but does not add meaning beyond the schema. With 100% schema coverage, baseline of 3 is appropriate.

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 the action ('List') and the resource ('subscription topics inside one preference section'), and it differentiates from the related get_user_preference_topic by explaining that the topic ID is used there. This effectively distinguishes it from sibling tools like list_preference_sections.

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 implies usage by describing what the tool does, but it does not explicitly state when to use it versus alternatives or when not to use it. It provides a hint about the workflow with get_user_preference_topic but lacks explicit exclusions or alternative naming.

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

list_preview_devicesA
Read-only
Inspect

List the email clients a preview can render on. Each device has a pvd_ id, a display name, and fields to filter by: category, app, platform, os, os_version and theme. Use these ids in a device set or in create_preview_run.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, and the description confirms this is a list operation. It adds useful behavioral context by describing the device fields returned (pvd_ id, display name, filterable attributes), going beyond the bare annotation.

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 tight and front-loaded. It states the purpose first, summarizes the entity shape, and closes with actionable usage guidance, with no wasted words.

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 zero-parameter, read-only list tool without an output schema, the description is nearly complete. It tells the agent what the tool returns and how to use it. It could be slightly clearer about the filtering mechanism since no query parameters exist in the schema, but this is a minor gap.

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?

There are no parameters, so schema coverage is effectively 100%. The description compensates by explaining what values will be present in the returned data, especially the pvd_ id and filter fields, which helps an agent understand how to use the output.

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?

Description states a specific verb and resource: 'List the email clients a preview can render on.' It clearly identifies this as a device enumeration tool and distinguishes it from device-set related siblings like list_preview_device_sets.

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?

The description gives explicit downstream guidance: 'Use these ids in a device set or in create_preview_run.' It does not explicitly state when not to use this tool or compare it with sibling alternatives, but the usage context is clear.

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

list_preview_device_setsA
Read-only
Inspect

List saved preview device sets. Every workspace has a read-only Courier Recommended set that runs can use without creating a set first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, so the tool is known to be safe. The description adds useful behavioral context beyond that: the existence of a read-only Courier Recommended set and that runs can use it without prior creation. It does not contradict the annotations and provides a small but meaningful behavioral detail.

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 only two sentences and each earns its place. The first sentence states the operation clearly; the second provides a useful default-set fact that helps the agent understand expected data. No filler or redundant phrasing exists.

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?

For a zero-parameter, read-only list operation with no output schema, the description is complete enough. It names the resource, indicates the tool lists saved sets, and highlights the special default set. An agent can invoke this tool without any additional ambiguity.

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?

There are zero parameters in the input schema, so parameter semantics are essentially moot. The baseline for a zero-parameter tool is 4; the description does not need to explain parameters and does not attempt to invent them. The context about the recommended set is tangential but not misleading.

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 uses a specific verb and resource: 'List saved preview device sets.' It clearly distinguishes itself from sibling get_preview_device_set by indicating this is the collection/list operation, and it adds the meaningful detail about the Courier Recommended set so an agent knows what will appear in results.

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?

The description gives clear context: every workspace has a read-only Courier Recommended set, and runs can use it without creating it first. This helps an agent understand the default state before listing. However, it does not explicitly mention when to use list_preview_device_sets instead of get_preview_device_set or other siblings, so it falls short of full alternative routing.

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

list_preview_runsA
Read-only
Inspect

List a template's preview runs, newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax runs per page
cursorNoPagination cursor from a previous response
template_idYesThe notification template id (nt_...)

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds a behavioral detail – results are ordered newest first – which is not in annotations. It also makes clear the resource scope. No contradictions with annotations.

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?

A single, front-loaded sentence conveys all essential information with zero waste. It is efficient and immediately understandable.

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 simple list operation, the description is complete enough: it scopes the resource, indicates ordering, and the schema covers all parameters. It does not explain pagination or return format, but these are standard for list tools and not strictly required given the schema and annotations.

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%, with each parameter (limit, cursor, template_id) already documented in the schema. The description adds no additional parameter-level meaning beyond referencing 'template's' which mirrors template_id. Baseline 3 applies since the schema does the heavy lifting.

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 states a specific verb ('List') with a clear resource ('a template's preview runs') and adds ordering ('newest first'). It distinguishes itself from sibling tools like list_preview_device_sets by clearly scoping to preview runs of a template.

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 implies usage context – when you need to see preview runs for a template – but does not explicitly mention alternatives or when not to use it. There is no exclusionary guidance, though the scope is clear from the name and description.

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

list_provider_catalogA
Read-only
Inspect

List the provider integrations Courier supports and the configuration each one expects. This is the catalog of what COULD be connected, not what this workspace has configured — use list_providers for that. Answers "what can I connect Courier to" and "what do I need in order to set up this provider".

ParametersJSON Schema
NameRequiredDescriptionDefault
keysNoComma-separated provider keys to return, for example "sendgrid,twilio".
nameNoSubstring match against the provider's display name.
channelNoReturn only providers serving this channel, for example email, sms or push.

TDQS

A4.4/5.0
Behavior4/5

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

The description adds a key behavioral trait beyond the readOnlyHint annotation: this returns the global catalog of what COULD be connected, not the workspace's configured providers, which prevents a common category error when comparing against list_providers. It doesn't address response size or pagination, but the scope disclosure is the more important behavioral fact and the safety profile is already covered by the annotation.

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?

Three sentences with no fluff, front-loaded with the core operation, then the sibling differentiation, then user-question framing. The restatement of purpose in question form is mildly redundant but earns its place by helping agents map natural-language intent to the tool.

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 read-only, zero-required-param listing tool with full schema coverage, the description covers selection semantics, scope, and setup relevance. It doesn't describe the response shape, but the tool's low complexity and clear schema/annotations make the description complete enough for correct invocation.

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 coverage is 100% — all three params (keys, name, channel) have descriptions. The description reinforces that each catalog entry includes configuration expectations, but adds no parameter-level detail beyond the schema, so the baseline 3 applies.

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 uses a specific verb+resource ('List the provider integrations Courier supports and the configuration each one expects') and immediately differentiates from the sibling list_providers by clarifying catalog vs workspace config. It also frames the tool by the two questions it answers, so an agent can match it to user intent without opening the schema.

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 explicitly says when not to use it — 'use list_providers for that' — drawing the workspace-config vs catalog boundary. The phrasing 'what do I need in order to set up this provider' implies the setup/onboarding context that would trigger selection.

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

list_providersA
Read-only
Inspect

List configured provider integrations for the workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoThis is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read-only operation, and the description aligns with it without contradicting it. The description adds the workspace-scoped 'configured' context but does not disclose additional behavior such as response shape or pagination, though the cursor parameter partially implies pagination.

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?

A single front-loaded sentence communicates the action, resource, and scope with no filler or repeated schema details. Every word earns its place.

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 simple read-only listing tool with one optional cursor parameter, the description plus the schema is almost sufficient. It could be more complete by explicitly noting the response contains a page of provider integration objects and a cursor, since there is no output schema.

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%, and the cursor parameter has a rich, operation-specific explanation about passing it back verbatim. The tool description itself adds no parameter information, so it meets the baseline for fully documented schema rather than exceeding it.

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 uses a specific verb ('List') and a clearly scoped resource ('configured provider integrations for the workspace'), making it easy to distinguish from singular get_provider and from a raw catalog API. The qualifier 'configured' tells the agent this is about active workspace integrations, not generic provider options.

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?

The phrase 'configured provider integrations for the workspace' gives clear context for when this read-only list is appropriate. It does not explicitly name alternatives like get_provider or list_provider_catalog, so it falls short of fully explicit when-not guidance.

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

list_routing_strategiesA
Read-only
Inspect

List the workspace's routing strategies, returning metadata only. A routing strategy decides which channel a notification takes and in what order. Use this to find the rs_-prefixed strategy ID that get_routing_strategy needs for the full definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum strategies to return per page. Defaults to 20; the API caps this at 100.
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already provide readOnlyHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations by stating it returns metadata only, scopes to the workspace, and clarifies that the response is meant to yield strategy IDs. This goes beyond a bare mutation/read classification, though it does not cover pagination behavior beyond what the schema already describes.

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 compact, front-loaded with the primary action and scope, and each sentence earns its place. It defines the resource, states the metadata-only return nature, gives domain context, and points to the sibling tool without redundancy.

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?

For a simple list tool with two optional parameters, no output schema, and readOnlyHint annotations, the description is complete enough. It tells the agent what the result is for, what it returns, and how it relates to get_routing_strategy. No critical information needed to invoke it correctly is missing.

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%, so the schema already fully documents limit and cursor, including defaults, caps, and the opaque-token warning. The description adds no parameter-specific meaning beyond what the schema provides, so the baseline of 3 is appropriate.

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 states a specific verb and resource: 'List the workspace's routing strategies', and immediately clarifies scope with 'returning metadata only'. It also distinguishes the tool from get_routing_strategy by explaining that this tool produces the rs_-prefixed ID needed for the full definition, so an agent can tell the two apart without inspecting schemas.

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?

The description gives explicit usage context: use this tool to find the strategy ID required by get_routing_strategy, while implying that the full definition belongs to the sibling call. This is clear when-to-use guidance and routes the agent to the correct alternative.

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

list_routing_strategy_notificationsA
Read-only
Inspect

List notification templates associated with a routing strategy. Useful for checking linked templates before archiving.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results per page (default 20, max 100)
cursorNoPagination cursor
routing_strategy_idYesThe routing strategy ID (rs_ prefix)

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description consistently describes a read-only listing operation. It adds context about linked templates being checked before archiving, but does not disclose pagination behavior or any additional edge-case details. The bar is lower due to annotations, so 3 is appropriate.

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?

Two short sentences with no filler. The core operation is stated first, and the second sentence adds a practical use case without redundancy.

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 simple read-only list operation with well-documented parameters, the description is mostly complete. It does not describe return fields, but no output schema exists and the operation's purpose is straightforward, so the absence is a minor gap rather than a blocking one.

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%, so the schema already documents limit, cursor, and routing_strategy_id. The description adds little beyond the schema, merely confirming that templates are associated with a routing strategy. Baseline 3 is appropriate because the schema carries the parameter meaning.

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 uses a specific verb and resource: 'List notification templates associated with a routing strategy.' It clearly names the relation to routing strategies, distinguishing this from sibling tools like list_notifications or list_routing_strategies.

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?

The description provides a concrete use context: 'Useful for checking linked templates before archiving.' It does not explicitly name alternatives or exclusions, but the intended scenario is clear enough for an agent to know when to invoke it.

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

list_tenantsA
Read-only
Inspect

List the workspace's tenants. A tenant is a customer or organisation whose users, branding and preferences are scoped separately; this answers "what tenants do I have" and gives you the tenant IDs get_tenant needs.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum tenants to return per page.
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description is consistent with that safety profile. The description adds useful domain context about tenants but does not disclose additional operational behavior such as pagination, ordering, or response shape. With a read-only list tool, this is acceptable but not exceptional.

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 two purposeful sentences with no filler. The first states the action and defines the resource, and the second gives the use case and downstream relationship to get_tenant. Every sentence earns its place.

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 zero-required-parameter list tool with pagination parameters already documented in the schema, the description covers the core purpose and key output concept (tenant IDs). It could more explicitly describe the response type since there is no output schema, but nothing essential for correct invocation is missing.

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% for both optional parameters, including a detailed explanation of the opaque cursor token. The description adds no parameter-specific meaning, but the schema already carries the full burden, so the baseline score of 3 is appropriate.

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 a specific verb and resource ('List the workspace's tenants'), then defines what a tenant is and states the exact question it answers ('what tenants do I have'). It also links directly to get_tenant by saying it provides the tenant IDs that tool needs, which helps differentiate it from tenant-scoped list tools.

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?

It gives clear situational guidance: use it to discover tenants and obtain tenant IDs for get_tenant. However, it does not explicitly name alternatives like list_tenant_users or list_user_tenants, so it stops short of fully excluding sibling tools.

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

list_tenant_templatesA
Read-only
Inspect

List notification templates configured for a tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results per page (default 20, max 100)
cursorNoPagination cursor
tenant_idYesThe tenant ID

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already include readOnlyHint: true, and the description consistently describes a read-only list operation. It adds the tenant-scoped context, but does not disclose further behavioral details like pagination behavior or result ordering beyond what the schema already covers.

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?

A single sentence that is front-loaded with the verb and resource, and adds the important tenant-scoping qualifier. There is no wasted or redundant wording.

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 simple list operation with fully documented parameters and a readOnly annotation, the description is nearly sufficient. An explicit statement about the return shape (an array of templates) would improve completeness, but it is reasonably implied by 'List'.

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%, with tenant_id, limit, and cursor all already documented. The description adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.

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 a specific verb ('List') and a distinct resource ('notification templates configured for a tenant'). It distinguishes this from sibling tools like get_tenant_template or delete_tenant_template by describing the list scope.

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 gives clear context: this lists templates for a tenant. However, it does not explicitly state when to use it versus related tools such as get_tenant_template or list_journey_templates, nor does it mention any exclusions or prerequisites.

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

list_tenant_usersA
Read-only
Inspect

List the users associated with one tenant. Use this to confirm whether someone actually belongs to the tenant whose branding or preferences you are reasoning about.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum users to return per page. Defaults to 20; the API caps this at 100.
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
tenant_idYesThe tenant ID

TDQS

A4/5.0
Behavior3/5

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

Annotations already carry readOnlyHint=true, so the read-only safety profile needs no restatement, and the description adds the scoping intent. However, it discloses no additional behavioral traits — no mention of pagination outcomes, ordering, response shape, or that fully confirming non-membership requires following cursors across pages. The schema's cursor/limit descriptions cover the mechanics, but the description itself adds little behavioral value beyond the annotation.

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?

Two sentences with zero waste. The core action is front-loaded and the second sentence earns its place by supplying the motivating use case. Nothing is repeated from the title or schema, and there is no filler.

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 low-complexity paginated list tool, this is nearly complete: the schema fully documents all parameters including pagination mechanics, annotations cover the read-only safety profile, and the description supplies the when-to-use intent. The one real gap is that the stated use case — 'confirm whether someone actually belongs' — is subtly undermined by pagination: a user on a later page would be missed on the first call, and the description doesn't warn that concluding non-membership requires sweeping all cursors.

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%: tenant_id, limit (with default and API cap), and cursor (with detailed opaque-token handling rules) are all well documented in the schema. The description contributes no parameter-specific meaning, so the baseline 3 applies per the coverage rule.

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+resource+scope — 'List the users associated with one tenant' — which is immediately distinct from inverse siblings like list_user_tenants (tenants for a user) and broader lists like list_tenants. The second sentence anchors it to a concrete reasoning task (confirming tenant membership for branding/preferences analysis), making the tool's role unambiguous without needing to open the 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, explicit use case: confirm whether someone actually belongs to the tenant whose branding or preferences you are reasoning about. This is actionable context an agent can select on, but it stops short of full guidance — it names no alternatives and states no exclusions (e.g., no pointer to list_user_tenants for the inverse direction or to get_user_profile_by_id for richer profile data).

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

list_user_push_tokensB
Read-only
Inspect

List all push/device tokens for a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the tool is known to be safe. The description adds that it returns all tokens for a user, but does not disclose pagination, ordering, or potential empty-result behavior. No contradiction with annotations.

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 a single, front-loaded sentence with no filler. It communicates the essential purpose efficiently.

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 simple one-parameter, read-only list operation, the description plus annotations cover most needs. It could specify the response shape or pagination behavior, but these are minor gaps given the tool's simplicity.

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%, and the user_id parameter is already documented as 'The user ID'. The description adds little beyond the schema, which meets the baseline but does not go further.

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 description clearly states the action ('List') and resource ('push/device tokens') scoped to a user, making the tool's purpose obvious. It does not explicitly differentiate from siblings like get_user_push_token, though 'all' implies the plural listing nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as get_user_push_token or bulk_add_user_tokens. No conditions, exclusions, or contextual hints are given beyond the basic action.

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

list_user_tenantsA
Read-only
Inspect

List the tenants a user belongs to. Preferences and branding can be scoped per tenant, so this tells you which tenant-scoped settings could apply to this user at all before you go looking for them.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum tenants to return per page.
cursorNoFor fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call.
user_idYesThe user ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description does not need to re-state that it's a read operation. It adds value by explaining why the result matters (preferences and branding scoping), which helps the agent understand the tool's role. It does not contradict the annotations. The description could mention pagination behavior, but the added context is meaningful, so a 4 is appropriate.

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 two sentences with no fluff. The primary action is front-loaded, and the supporting rationale is concise and directly relevant. Every sentence earns its place.

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 tool's simplicity—a read-only list operation with pagination—and the fact that the schema documents all parameters, the description is mostly complete. However, it does not mention the shape of the response (e.g., whether it returns tenant IDs or full objects) or default pagination behavior. Since there is no output schema, a brief note about return format would have made it fully complete, but the current level suffices for a capable agent.

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?

The input schema already provides detailed descriptions for all three parameters, including the opaque cursor token usage and the requirement to pass it back byte-for-byte. Since schema description coverage is 100%, the description adds no additional parameter semantics beyond the schema. Baseline 3 is correct.

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 the tool's function: 'List the tenants a user belongs to.' It also provides a specific verb and resource, and the added rationale about per-tenant preferences and branding distinguishes it from generic list tools like list_tenants or list_tenant_users. The purpose is unambiguous and distinct from siblings.

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?

The description explains when to use the tool: to determine which tenant-scoped settings could apply to a user 'before you go looking for them.' This gives clear context on the intended use case, though it does not explicitly name alternatives or state when not to use it. Since it implies the correct selection among siblings, it earns a 4 rather than a 5.

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

patch_profileAInspect

Partially update a user profile via JSON Patch (RFC 6902). Use add/replace/remove operations on specific profile paths.

ParametersJSON Schema
NameRequiredDescriptionDefault
patchYesArray of JSON Patch operations to apply to the profile
user_idYesThe user ID

TDQS

A4/5.0
Behavior4/5

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

Annotations establish that this is a non-read-only, non-idempotent write operation. The description adds meaningful behavioral context by clarifying that the update is partial and that remove operations are permitted, signaling possible field deletion beyond what the raw annotation flags convey.

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 entire description is one focused sentence: it front-loads the action, names the protocol, and states the allowed operations. There is no filler or redundant content.

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 only two documented parameters and no output schema, the description covers what the agent needs to invoke the tool correctly. A minor gap is that it does not mention whether the updated profile is returned, but this is not essential for a mutation tool with well-documented inputs.

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 coverage is 100%, so both parameters are already documented. The description adds modest value by narrowing the operation set to add/replace/remove, which differs slightly from the schema's broader enum (add, remove, replace, move, copy, test), but it does not otherwise enrich parameter meaning.

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 the verb ('partially update'), the resource ('user profile'), and the method ('JSON Patch (RFC 6902)'). It differentiates itself from the sibling 'replace_profile' by specifying partial, path-scoped updates rather than wholesale replacement.

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 usage context is implied: use this when a partial, path-specific profile update is needed. The description also instructs which patch operations to use (add/replace/remove), but it does not explicitly name alternatives or provide when-not-to-use guidance.

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

patch_user_tokenBInspect

Apply a JSON Patch (RFC 6902) to a specific push token.

ParametersJSON Schema
NameRequiredDescriptionDefault
patchYesArray of JSON Patch operations
tokenYesThe token identifier
user_idYesThe user ID

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already mark the operation as non-read-only, non-idempotent, and non-destructive; the description does not contradict that. It adds the RFC 6902 semantics of applying a sequence of patch operations, but it does not disclose failure behavior, whether a missing token is created, or how the patch is applied.

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 a single front-loaded sentence with no redundant words or filler. It puts the operation first and the target second, making it easy to scan.

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 three-parameter patching tool with full schema coverage and annotations covering mutation behavior, the description covers the operation and target adequately. There is no output schema, so return-value documentation is not required; a one-line statement of the patch semantics is enough for correct invocation.

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?

All three parameters are already fully described in the schema (user_id, token, and patch operations), so the description carries little parameter burden. It confirms that the patch targets a token identified by the user/token pair but adds no syntax or format details beyond the schema. Baseline 3 applies.

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 description states a concrete action ('Apply a JSON Patch') and a precise resource ('a specific push token'), also naming the RFC 6902 standard. This distinguishes it from sibling token tools such as create_or_replace_user_push_token, delete_user_token, and list_user_push_tokens, though it does not name them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool instead of create_or_replace_user_push_token or delete_user_token, and no prerequisites are mentioned. The word 'specific' only weakly implies an existing token; an agent could still misselect between full replacement and partial patch.

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

publish_journeyAInspect

Publish the current draft of a journey, making it live and invokable. Pass version to roll back to a prior published version instead of publishing the draft. Returns 404 if there is no draft to publish.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoHistorical version to roll back to (e.g. "v001"). Omit to publish the current draft.
journey_idYesThe journey template ID to publish

TDQS

A4.2/5.0
Behavior4/5

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

The description adds useful behavior beyond the annotations: it discloses that the operation transitions a draft to live/invokable, that passing version switches to rollback, and that a 404 is returned when there is no draft. It does not detail success responses or invalid-version behavior, but annotations already mark this as a non-read-only, non-idempotent action.

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?

Three short sentences cover the operation, the version alternative, and a key error condition. The main action is front-loaded and there is no filler.

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 two-parameter mutation tool with no output schema, the description covers the core action, conditional version behavior, and one important error. It could mention the success response or invalid-version behavior, but the essentials for invoking correctly are present.

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 coverage is 100% and both parameters are described there, including the 'omit to publish current draft' behavior. The description repeats that semantic rather than adding new parameter detail, so it does not exceed the baseline for fully documented schemas.

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?

Description names a specific verb ('publish') and resource ('current draft of a journey'), and clarifies the desired effect ('making it live and invokable'). It also separates the rollback behavior from draft publishing, which distinguishes this tool from publish_journey_template and other publish/create siblings.

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?

It clearly states the primary use case (publish current draft) and the alternative mode within the tool (pass version to roll back to a prior published version). It does not explicitly name an alternative tool or exclusion, but the entity name 'journey' and the behavior are clear enough in context.

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

publish_journey_templateAInspect

Publish the current draft of a journey-scoped notification template. Optionally pass version to roll back to a prior version.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoVersion to roll back to (e.g. "v1"). Omit to publish current draft.
journey_idYesThe journey template ID that owns this notification
notification_idYesThe notification template ID

TDQS

A4.2/5.0
Behavior4/5

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

With annotations only saying readOnly=false, idempotent=false, destructive=false, the description adds the key behavior: publishing the current draft and optionally rolling back to a prior version. This meaningfully explains state mutation without contradicting the annotations.

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?

One concise sentence front-loads the primary action and punctuates the optional variant. No filler or repetition of parameter names.

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 three-parameter publish action with no output schema, the description supplies the essential scope and the optional rollback behavior. A bit more detail about the effect on existing published versions could make it fully complete, but it is sufficient for correct invocation.

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 coverage is 100%, so the schema already documents all three parameters. The description adds value only for version, clarifying it is used to roll back to a prior version, while notification_id and journey_id remain covered by the schema.

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 names a specific verb and resource: 'Publish the current draft of a journey-scoped notification template.' This makes the operation distinct from siblings like publish_journey or publish_notification by adding the journey-template scope.

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?

It clearly states the default use case (publish current draft) and the optional version-rollback branch. It does not explicitly name sibling alternatives or exclusions, but the journey-scoped wording gives enough context for an agent to route to this tool among the publish_* siblings.

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

publish_notificationAInspect

Publish a notification template, making it available for sending. Must be called before send_message_template unless the template was created with state: 'PUBLISHED'. Publishes the current draft by default; pass version (e.g. 'v001') to publish a specific historical version. Returns 204 on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoHistorical version to publish (e.g. v001); omit to publish current draft
notification_idYesThe notification template ID to publish

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, non-idempotent operation. The description adds useful context beyond that: it publishes the current draft by default, can publish a specific historical version, and returns 204 on success. This gives the agent a clear picture of the operation's behavior without contradicting the annotations.

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?

Three short sentences with no filler. The core action is front-loaded, followed by the prerequisite, version behavior, and return code. Every sentence contributes operational value.

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?

For a two-parameter tool with no output schema, this description covers the key facts an agent needs: the prerequisite, default vs. historical version behavior, and the success response (204). Nothing essential is missing for correct invocation.

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%, so the schema already documents both notification_id and version effectively. The description reinforces the version semantics ('e.g. v001', omit to publish current draft) but does not add meaning beyond what the schema already provides. Baseline 3 is appropriate.

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?

Description states a specific verb ('Publish'), a specific resource ('notification template'), and the intended outcome ('making it available for sending'). It also names a related sibling tool (send_message_template) and explains the lifecycle relationship, which distinguishes it from other publish_* tools like publish_journey_template or publish_tenant_template.

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?

Explicitly states the prerequisite: must be called before send_message_template unless the template was created with state 'PUBLISHED'. It also clarifies when to omit vs. provide the version parameter, giving concrete operational guidance rather than leaving usage to inference.

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

publish_preferencesAInspect

Publish the workspace's preferences page. Takes a snapshot of every section with its topics under a new published version, making the current state visible on the hosted preferences page.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate the tool is non-read-only, non-idempotent, and non-destructive. The description adds meaningful behavior beyond those flags: it takes a snapshot of all sections/topics, creates a new published version, and changes what is visible on the hosted page. It does not cover permission requirements or what happens to prior published versions.

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?

Two short sentences deliver the full picture: what is published, how the snapshot works, and the resulting effect. Every clause earns its place, and the resource and verb are front-loaded.

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 zero-parameter publishing action, the description gives the key outcome and mechanism an agent needs to call it correctly. Minor gaps remain, such as return behavior and whether previous published versions remain accessible, but these are not blockers.

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?

There are zero parameters and the input schema is empty, so there are no parameter semantics to document. The description still compensates by explaining what the operation applies to and what it produces, satisfying the baseline for a parameterless tool.

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 names the specific operation ('Publish') and the specific resource ('workspace's preferences page'), then explains the mechanism: snapshot every section with its topics under a new published version. This clearly differentiates it from sibling publish_* tools that target journeys, notifications, or tenant templates.

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 makes it clear that this is how the current preference sections and topics become visible on the hosted page, so the general use case is implied. However, it does not explicitly state when to use it versus alternatives, mention prerequisites such as having draft changes ready, or note any exclusions.

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

publish_tenant_templateCInspect

Publish a version of a tenant notification template.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoVersion to publish (e.g. v1, latest); defaults to latest if omitted
tenant_idYesThe tenant ID
template_idYesThe template ID

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, indicating this is a mutating but non-destructive operation. The description adds no behavioral context beyond that—it doesn't explain what publishing entails, whether it's reversible, or what happens to previous versions.

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 description is a single tight sentence with no filler; the verb and object are front-loaded. However, it is so minimal that it reads as a bare statement rather than a structured guide. It is concise but under-sized relative to the need for usage context.

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

Completeness3/5

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

For a tool with only three params, no output schema, and full schema coverage, the description covers the basic purpose. But it omits context about the publishing workflow—when a version must be specified, how this differs from publishing notifications/journeys, and what side effects occur—making it incomplete for an agent facing many sibling publish tools.

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?

All three parameters have descriptions in the schema (100% coverage), so the baseline applies. The tool description itself provides no additional parameter-level meaning; it only echoes the 'version' concept, which is already in the schema. No enums or nested structures require extra explanation.

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 description uses the specific verb 'publish' and names the resource 'a version of a tenant notification template,' clearly identifying the action. It distinguishes itself from sibling publish_* tools by the resource type, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool over alternatives like publish_journey_template or publish_notification. There are no usage conditions, prerequisites, or exclusions; the agent must infer context from the tool name alone.

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

put_broadcast_contentA
Idempotent
Inspect

Replace a broadcast's content with an Elemental document. Saved as a draft unless state is PUBLISHED.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTemplate state. Defaults to DRAFT.
contentYesElemental content, e.g. { "version": "2022-01-01", "elements": [...] }. version defaults when omitted.
broadcast_idYesThe broadcast id

TDQS

A4.2/5.0
Behavior4/5

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

Annotations provide readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds meaningful behavioral context beyond annotations: it states the operation is a replacement (not an append), that the result is saved as a draft unless state is PUBLISHED, and that the content is an Elemental document. This is useful behavioral disclosure that the annotations alone don't convey. It doesn't mention side effects like overwriting existing content, but the word 'Replace' covers that.

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?

Two sentences, no filler. The core action is front-loaded, and the state caveat is a single clause. Every word earns its place.

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 3-parameter tool with 100% schema coverage and no output schema, the description covers the key behavioral nuance (draft vs published). It doesn't explain what the response looks like, but no output schema exists and the operation is a simple replace. The idempotentHint annotation covers repeat-call safety. Minor gap: no mention of whether the broadcast must exist or what happens if it doesn't, but that's not critical for a replace operation.

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%, so the schema already documents all three parameters. The description adds the draft/published state behavior, which clarifies the state parameter's effect, but doesn't add much beyond the schema. Baseline 3 is appropriate.

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 states a specific verb ('Replace'), a specific resource ('a broadcast's content'), and the document type ('Elemental document'). It also distinguishes itself from related tools like put_notification_content and put_journey_template_content by naming the broadcast resource. The draft/published state note adds precision.

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?

The description implies when to use it: when replacing a broadcast's content with an Elemental document. It doesn't explicitly name alternatives or exclusions, but the sibling list contains get_broadcast_content and create_broadcast, and the description's resource-specific language makes the use case clear. It lacks an explicit 'use X instead when...' statement, so not a 5.

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

put_journey_template_contentA
DestructiveIdempotent
Inspect

Replace the elemental content of a journey-scoped notification template. Overwrites all elements. The template stays a draft; making it live is a separate step this tool cannot perform.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTemplate state after update. Must be "DRAFT". These tools cannot publish.
versionNoContent version string (e.g. "2022-01-01"). Server defaults when omitted.
elementsYesArray of elemental content nodes. Likely must be wrapped in a channel block, the same way create_journey_template's content requires — not independently confirmed for this call, but they write the same field. Example: [{ type: "channel", channel: "email", elements: [{ type: "text", content: "Hello!" }] }].
journey_idYesThe journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds the draft constraint and the fact that overwriting all elements is destructive. It also warns in the elements parameter about the channel wrapper uncertainty, which is honest about limits. No contradiction with annotations.

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 main description is three concise sentences that front-load the purpose and key constraint. Parameter descriptions are detailed but reside in the schema, not cluttering the main description. Every sentence earns its place without redundancy.

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?

The description covers the core behavior, draft status, and overwrite semantics. The parameter descriptions handle ID copying and elements structure. The only minor gap is not describing the return value (no output schema exists), but that is not required. The uncertainty about elements structure is honestly flagged, which is good.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds significant value: for journey_id and notification_id it instructs to copy exactly from the response, never retype. For elements it provides a concrete example and notes the structure is not independently confirmed. The state parameter clarifies that only DRAFT is allowed and these tools cannot publish.

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 states a specific verb ('Replace'), a specific resource ('elemental content of a journey-scoped notification template'), and a key behavior ('Overwrites all elements'). It clearly differentiates from siblings like put_notification_content and put_journey_template_locale by emphasizing journey scoping and full replacement. The draft/publish distinction further clarifies scope.

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 implies when to use it (for journey templates) but does not explicitly name alternatives or provide exclusions. It notes the template stays a draft and that publishing is a separate step, but does not point to a specific sibling tool for publishing. This is contextual but not explicit routing guidance.

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

put_journey_template_localeA
Idempotent
Inspect

Set locale-specific content overrides for a journey-scoped notification template. Each element override must reference an existing element by its id. The template stays a draft; making it live is a separate step this tool cannot perform.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTemplate state after update. Must be "DRAFT". These tools cannot publish.
elementsYesArray of element overrides with id and locale-specific content
locale_idYesLocale identifier (e.g. es, fr, pt-BR)
journey_idYesThe journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_idYesThe notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context beyond these annotations: the template remains a draft, the tool cannot publish, and element overrides must reference existing element ids. This meaningfully supplements the annotation-only safety profile.

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 two sentences with no wasted words. The primary action is front-loaded, and the second sentence adds only high-value constraints about draft state and element id validity.

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 rich schemas and annotations, the description is largely complete for calling the tool correctly. It explains the draft-state limitation and the referential integrity requirement. It does not explicitly describe overwrite/merge semantics or return behavior, but the idempotentHint and absence of an output schema keep this from being a serious gap.

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%, so the schema already documents all parameters. The description reinforces that elements are locale-specific overrides and must reference existing ids, but it does not add substantial new parameter semantics beyond what the schema already states. Baseline 3 is appropriate.

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 uses a specific verb and resource: "Set locale-specific content overrides for a journey-scoped notification template." This clearly differentiates it from siblings like put_journey_template_content and put_notification_locale by highlighting both "locale-specific" and "journey-scoped."

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?

The description provides clear context: it operates on a journey-scoped notification template and requires element overrides to reference existing element ids. It also gives an explicit exclusion—"making it live is a separate step this tool cannot perform"—which prevents misuse. It does not name alternative sibling tools, so it falls short of a 5.

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

put_notification_contentA
Idempotent
Inspect

Replace the elemental content of a V2 notification template. Overwrites all elements. Use channel elements to target specific channels. Multi-channel example: elements: [{ type: "channel", channel: "email", elements: [{ type: "meta", title: "Hello" }, { type: "text", content: "Email body" }] }, { type: "channel", channel: "push", elements: [{ type: "meta", title: "Hello" }, { type: "text", content: "Push body" }] }, { type: "channel", channel: "inbox", elements: [{ type: "text", content: "Inbox plain text only" }] }]. The template stays a draft; making it live is a separate step this tool cannot perform.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoMust be "DRAFT". These tools cannot publish.
versionNoContent version string (e.g. "2022-01-01"). Server defaults when omitted.
elementsYesArray of elemental content nodes
notification_idYesThe notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the annotations, the description discloses that all elements are overwritten, that the template remains a draft, and that publishing is outside this tool's ability. These are meaningful behavioral details not present in the annotations, and nothing contradicts the annotated readOnly, idempotent, or destructive hints.

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 core action is front-loaded, and the overwrite behavior is stated immediately. The multi-channel example is long but earns its place because the schema's elements definition is vague and the example documents a non-obvious nested structure.

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 mutation tool with a complex nested elements parameter and no output schema, the description covers the critical object shape and state behavior. It does not describe the response or publish workflow prerequisites, but the schema's detailed instructions for notification_id and state cover the remainder of the call contract.

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. The description adds real value by supplying a concrete multi-channel elements example and by reinforcing the state/DRAFT and publish limitation. The notification_id and version parameters are already sufficiently explained in the schema, so the description does not need to repeat them.

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 action, 'Replace the elemental content of a V2 notification template,' and immediately clarifies that it overwrites all elements. This distinguishes it clearly from siblings like put_notification_element and replace_notification, which handle different granularity or scope.

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 implies usage by explaining overwrite semantics, channel-element targeting, and the draft-only limitation. However, it never explicitly names an alternative tool or states when to prefer this over put_notification_element or replace_notification, so the selection guidance remains implicit.

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

put_notification_elementA
Idempotent
Inspect

Update a single element within a V2 notification template. The template stays a draft; making it live is a separate step this tool cannot perform.

ParametersJSON Schema
NameRequiredDescriptionDefault
ifNoConditional expression for element visibility
refNoReference identifier
dataNoElement data payload
loopNoLoop expression for repeating elements
typeYesElement type (e.g. text, action, image, divider, meta)
stateNoMust be "DRAFT". These tools cannot publish.
channelsNoChannels this element applies to
element_idYesThe element ID to update, from a prior get_notification or get_notification_draft_content response. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
notification_idYesThe notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare the safety profile (not read-only, idempotent, not destructive). The description adds genuine behavioral context beyond that: updates keep the template in draft state and publishing is intentionally out of scope. No contradiction with annotations.

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?

Two sentences with zero filler: the action is stated first and the critical draft-state limitation follows immediately. Every word earns its place.

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 9-parameter, no-output-schema tool, the schema carries the parameter documentation burden at 100% coverage and the state enum self-documents the DRAFT-only constraint. The description supplies the key behavioral limitation (no publishing). The only real gap is explicit routing among sibling tools like put_notification_content.

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%, so every parameter (if, ref, data, loop, type, state, channels, element_id, notification_id) is already documented in the input schema, including the copy-exactly guidance for IDs. The tool description itself adds no parameter-level detail beyond the schema, matching the baseline of 3.

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 description uses a specific verb (Update) and resource (a single element within a V2 notification template), making the tool's scope clear. It implies differentiation from siblings like put_notification_content and put_notification_locale by scope, 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a clear context — editing draft templates — and asserts a when-not boundary: 'making it live is a separate step this tool cannot perform.' It does not name the sibling tool that publishes (e.g., publish_notification), so the guidance is clear but not fully explicit.

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

put_notification_localeA
Idempotent
Inspect

Set locale-specific content overrides for a V2 notification template. Each element override must reference an existing element by its id. Example for Spanish locale: { notification_id: "nt_01abc", locale_id: "es", elements: [{ id: "elem_meta_1", title: "Restablecer contraseña" }, { id: "elem_text_1", content: "Haga clic en el enlace para restablecer su contraseña." }] }. The template stays a draft; making it live is a separate step this tool cannot perform.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoMust be "DRAFT". These tools cannot publish.
elementsYesArray of element overrides with id and locale-specific content
locale_idYesLocale identifier (e.g. es, fr, pt-BR)
notification_idYesThe notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already show readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds meaningful behavioral context beyond this: the operation leaves the template in draft state, and each override must reference an existing element. This helps an agent anticipate side effects and preconditions.

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?

Every sentence serves a purpose: the core action, the precondition about existing element ids, a concrete example, and the draft-state limitation. The example is long but directly clarifies the expected payload shape.

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 mutation tool with no output schema, the description covers the critical context: what the tool does, the draft behavior, and the element-reference rule. The required state parameter is described in the schema, and the example covers the remaining ambiguity around the elements array.

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 description coverage is 100%, so the schema already documents each parameter. The description adds value through a concrete example that clarifies the elements array structure (id, title, content), which is otherwise left open via additionalProperties.

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 leads with a specific verb and resource: 'Set locale-specific content overrides for a V2 notification template.' This clearly distinguishes the tool from siblings like put_notification_content or put_notification_element, and the draft caveat separates it from publish actions.

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?

The description gives a clear when-to-use context ('locale-specific content overrides') and an explicit exclusion: 'The template stays a draft; making it live is a separate step this tool cannot perform.' However, it does not name the alternative tools for non-locale overrides or publishing, so guidance is not fully explicit.

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

release_digestAInspect

Release a digest schedule early — send what users have collected so far now instead of waiting for the scheduled time. A 204 is also returned when the schedule has no in-progress instances to release.

ParametersJSON Schema
NameRequiredDescriptionDefault
schedule_idYesThe digest schedule id, in the form "sch/{uuid}"

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate this is not read-only, not idempotent, and not destructive. The description adds behavioral nuance: it sends what has been collected so far and returns 204 even when there is nothing to release. This goes beyond the annotation hints.

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?

Two sentences with no filler. The core purpose is front-loaded, and the edge-case behavior is stated in a compact second sentence.

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 single-parameter tool with no output schema, the description covers the trigger behavior and the notable no-op case. It does not describe side effects on the schedule itself, but the essential invocation guidance is present.

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 coverage is 100% and the schedule_id parameter includes its format. The description does not add additional meaning beyond the schema, but it doesn't need to because the schema fully documents the single parameter.

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 the action (release early), the resource (a digest schedule), and the effect (send collected content now instead of waiting). It distinguishes itself from list_digest_instances and other scheduling tools by explaining the early-trigger behavior.

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?

The description provides when to use the tool ('instead of waiting for the scheduled time') and defines a meaningful edge case (no in-progress instances). It does not explicitly name alternatives or state when not to use it, but the use case is clear.

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

release_user_digestAInspect

Release one recipient's held digest for a topic now, instead of waiting for its schedule. Use it to preview a digest, or to let a user flush their own, without releasing everyone else on the schedule. There is no release-everyone form of this call; use release_digest with a schedule id for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe recipient whose digest to release
topic_idYesId of the digest topic
tenant_idNoThe recipient's tenant, when they were sent to as part of one
section_idYesId of the preference section the topic belongs to

TDQS

A4.4/5.0
Behavior4/5

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

Annotations give some safety context (readOnly=false, idempotent=false, destructive=false). The description adds meaningful behavioral context beyond that: the operation is immediate, scoped to one user, and does not affect other schedule recipients. It does not explicitly state whether the schedule for that user is altered or whether the release is permanent, but the core side effect is clear.

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?

Three tightly-written sentences: the first states the action, the second gives use cases, and the third explicitly routes to the sibling tool. Every sentence earns its place, and the most important information is front-loaded.

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 low-complexity mutation with complete schema and basic annotations, the description is nearly complete. It explains the 'held digest' concept, the single-recipient scope, and the distinction from the sibling. The only minor gap is that no return value or success indication is described, but that is easily inferred for a release action. Overall, nothing critical is missing.

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%, so each parameter is already documented. The description refers to 'recipient,' 'topic,' and 'schedule,' which maps loosely to user_id, topic_id, and section_id, but it does not add new meaning beyond what the schema provides. Baseline 3 is appropriate.

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 a specific verb-resource pair: 'Release one recipient's held digest for a topic now.' It immediately distinguishes from the sibling release_digest by emphasizing the single-recipient scope and the 'now' action. The first sentence alone uniquely identifies the operation.

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?

Provides explicit use cases: 'preview a digest' and 'let a user flush their own.' It also states an exclusion: 'without releasing everyone else on the schedule.' Finally, it names the exact alternative for the broader operation: 'use release_digest with a schedule id for that.' This is model guidance.

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

remove_all_user_tenantsA
DestructiveIdempotent
Inspect

Remove a user from all tenants.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already convey destructiveHint=true and idempotentHint=true, so the description does not need to restate those traits. It does add the 'all tenants' scope, which is useful, but it does not disclose any additional behavioral details such as whether the user profile itself is deleted or whether removal is irreversible beyond what the destructive hint implies.

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 a single, front-loaded sentence with no filler. Every word earns its place by communicating the verb, object, and scope ('all tenants') efficiently.

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 one-parameter destructive operation, the description plus annotations provide the core information needed: what is removed, at what scope, and that it is destructive yet idempotent. It does not describe the return value or side effects on the user profile, but the tool's low complexity and strong schema/annotation coverage make it reasonably complete.

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?

The input schema already provides 100% coverage with a clear description for user_id ('The user ID'). The tool description adds no extra parameter-level meaning, so the schema carries the full burden; baseline 3 is appropriate.

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 states a specific verb ('Remove') and a precise resource/scope ('a user from all tenants'), clearly distinguishing this from the sibling remove_user_from_tenant by the 'all tenants' qualifier. An agent can immediately understand both what it does and how it differs from the single-tenant removal tool.

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 by the description and sibling set: 'all tenants' signals this is the bulk version of remove_user_from_tenant. However, there is no explicit guidance on when to choose this tool over alternatives or any exclusions, so the agent must infer the appropriate context.

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

remove_user_from_tenantB
DestructiveIdempotent
Inspect

Remove a user from a tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesThe user ID
tenant_idYesThe tenant ID

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true, so the agent knows it is destructive and idempotent. The description adds no extra behavioral context beyond the verb 'remove', such as consequences (e.g., does not delete the user, only the association) or side effects. Since the description adds nothing beyond the annotations, it falls short of providing valuable disclosure.

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 description is a single concise sentence: 'Remove a user from a tenant.' It is front-loaded with the action and resource, and there is no redundancy. It is appropriately brief for a simple operation, though it omits any extra guidance that might enhance clarity.

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

Completeness3/5

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

With only two required parameters, no output schema, and annotations covering destructiveness/idempotency, the description is minimally adequate. It lacks explicit mention of the operation's scope (removing the association without deleting the user), which could be useful, but given the simplicity, it is borderline complete. The lack of any additional detail or prerequisites makes it somewhat incomplete.

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% with both user_id and tenant_id described as 'The user ID' and 'The tenant ID'. The description does not add meaning beyond the schema, so the baseline of 3 applies. It does not clarify the relationship semantics (e.g., that the user is removed only from that specific tenant).

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 'Remove a user from a tenant' clearly states the action (remove) and the resource (user from tenant). It distinguishes from siblings like add_user_to_tenant (opposite action) and remove_all_user_tenants (removes from all tenants) by specifying a single tenant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It does not mention that remove_all_user_tenants is for removing from all tenants, nor does it advise how to use this for a specific tenant relationship. The agent must infer usage from the name alone.

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

rename_broadcastA
Idempotent
Inspect

Rename a broadcast. Content and channel are unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe new name
broadcast_idYesThe broadcast id

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable behavioral context beyond those: it explicitly states the mutation scope is limited to the name while content and channel are preserved. This clarifies what side effects occur and what remains untouched, which is useful for an agent deciding whether this tool fits.

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 two short sentences with no wasted words. The primary action is front-loaded, and the key qualifier about unchanged content/channel follows immediately. Every phrase earns its place.

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 simple two-parameter, non-destructive, idempotent rename operation, the description, combined with the annotations and complete schema, covers almost everything an agent needs to invoke it correctly. It does not mention required preconditions like the broadcast existing, or describe the return value, but these are minor given the tool's simplicity and the available structured metadata.

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. The description adds operational meaning beyond the schema: it tells the agent that only the name changes and that broadcast_id identifies which broadcast. This reinforces the role of each parameter without repeating schema text. It does not go into format or validation, but given the high schema coverage and simple parameters, the added clarity justifies a 4.

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 states a specific action and resource: 'Rename a broadcast.' It also adds a distinguishing boundary with 'Content and channel are unchanged,' which clearly separates it from content-editing tools like put_broadcast_content or channel-related operations. An agent can identify the tool's purpose without opening the 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?

The description clearly implies when to use the tool: when you need to change only the broadcast name. The statement 'Content and channel are unchanged' provides an exclusion—if content or channel needs changing, another tool is appropriate. However, it does not explicitly name alternative tools or provide concrete when-to-use/not-use conditions, so it stops short of a 5.

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

replace_journeyA
DestructiveIdempotent
Inspect

Replace (update) a journey draft. Full document replacement — include all nodes and properties in the body, the trigger included; anything omitted is deleted. The journey stays a draft; making the change live is a separate step this tool cannot perform. This is where send, delay, branch and exit nodes are added, and send node template IDs must already be scoped to this journey. The result carries a "verification" object read back from the server after the write — check it every time. verified:true means what you asked for is what saved. verified:false names what did not: "fieldMismatches" for node fields that failed to land, "nodeCountMismatch" for a node dropped or added, and "unknownTemplateReferences" for a send node pointing at a template id this journey does not have — almost always a mistyped id, so re-copy it from the create_journey_template or get_journey response it came from. Fix the specific thing named and send the corrected document. Re-sending an identical call changes nothing, and every replace_journey overwrites the whole draft again. An "errorKind" of "unauthorized" means the write itself succeeded and only the read-back was refused: report that as unconfirmed, never as a failed write.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesJourney display name
nodesYesComplete array of journey nodes: the trigger first, a terminal exit last, and everything else between them. Use server-assigned node ids from get_journey — do NOT invent new ids. Send node example: { type: "send", channel: "email", message: { template: "nt_journey_1" } } — the template goes inside message, never at node level, and the id is a journey-scoped one returned by create_journey_template rather than a workspace template id. Copy that id character-for-character from the create_journey_template or get_journey response you got it from — never retype or reconstruct it from memory, since a single dropped or altered character produces a different, non-existent id and the reference silently fails to resolve. channel must always be set to one of "email", "sms", "push", "inbox", "slack", or "msteams" on every send node — do not omit it even though the field is optional. An unset channel makes Studio silently render the node as email: for sms, push, and inbox sends this means the wrong title, an Email Address field shown instead of the real recipient field, no provider picker, and a hard-blocked "+Create message" button, with nothing shown to warn the user. The stored recipient data is not lost and delivery is not affected — this only breaks how the journey looks and works for a human editing it in Studio. Delay node example: { type: "delay", mode: "duration", duration: "PT1H" }. Branch node example: { type: "branch", paths: [{ conditions: ["data.plan", "is equal", "pro"], nodes: [] }], default: { nodes: [] } } — paths and default are both required, and the key inside a path is "conditions", not "condition".
stateNoMust be "DRAFT". These tools cannot publish.
enabledNoWhether the journey is active.
journey_idYesThe journey template ID to update. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=true, and the description richly extends all three: full-replacement delete semantics ('anything omitted is deleted,' 'overwrites the whole draft again'), idempotency confirmation ('Re-sending an identical call changes nothing'), and the verification-object read-back behavior with specific mismatch kinds. The 'errorKind: unauthorized' nuance — write succeeded but read-back refused, report as unconfirmed — is high-value context well beyond what annotations provide. No contradiction with annotations found.

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 description is dense and every sentence carries operational value — no filler. Core purpose is front-loaded, and critical verification semantics come before secondary node details. It loses a point for being a single wall-of-text paragraph that partially repeats the schema's own nodes-parameter examples, making it harder to scan despite the high information density.

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?

For a complex, destructive tool with no output schema, the description is remarkably complete: it explains the verification object (the primary return signal), destructive and idempotent behavior, prerequisites (journey-scoped template IDs), error classification for unauthorized read-back, and remediation steps ('Fix the specific thing named and send the corrected document'). Nothing an agent needs to call it correctly or interpret its result is missing.

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

Parameters5/5

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

Even with 100% schema coverage, the description adds substantial meaning: exact node ordering (trigger first, terminal exit last), instruction to use server-assigned IDs and never invent new ones, the send-node template placement ('inside message, never at node level'), the channel-field gotcha with its silent email-render consequences, and the branch-node 'conditions' vs 'condition' key warning. It also reinforces character-for-character ID copying for journey_id. This far exceeds the baseline for fully covered schemas.

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 a specific verb+resource pairing, 'Replace (update) a journey draft,' and immediately clarifies scope: full document replacement with the trigger included. It distinguishes itself from siblings by stating the journey remains a draft (versus publish_journey) and by framing itself around journey drafts (versus replace_journey_template).

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?

The description gives explicit when-to-use context: 'This is where send, delay, branch and exit nodes are added.' It states a key exclusion — 'making the change live is a separate step this tool cannot perform' — and names source tools (create_journey_template, get_journey) for obtaining IDs. It does not explicitly name the publish tool as the alternative or contrast itself with replace_journey_template, so the exclusions are clear but the alternative names are partially implied.

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

replace_journey_templateA
Idempotent
Inspect

Replace the draft of a journey-scoped notification template. Full document replacement. Call publish_journey_template afterwards to make it live.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo"PUBLISHED" to publish immediately after replace
journey_idYesThe journey template ID that owns this notification
notificationYesFull notification template definition
notification_idYesThe notification template ID

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context by specifying that only the draft is replaced, that replacement is full-document rather than partial, and that a separate publish step is required. This goes meaningfully beyond the annotations without contradicting them.

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 two sentences with no filler. It front-loads the core action, then adds the critical scoping fact and the follow-up publish step. Every sentence earns its place.

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 nested schema and annotations, the description conveys the essential workflow: replace the draft fully, then publish to make it live. It omits the fact that the 'state' parameter can publish immediately, and it does not mention partial-update alternatives, but the schema covers parameter details and the annotations cover safety traits. This is adequately complete for correct invocation.

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%, so the input schema already documents all parameters, including the 'state' parameter and the 'notification' full-template definition. The description adds little parameter-level meaning beyond restating that replacement is full-document. This meets the baseline for fully schema-covered parameters but does not significantly extend it.

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 description states a specific verb and resource: 'Replace the draft of a journey-scoped notification template.' It also clarifies the scope with 'Full document replacement,' which helps differentiate from partial-update tools. It does not explicitly name a sibling alternative, so it falls just short of a 5.

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 clear sequential guidance: 'Call publish_journey_template afterwards to make it live.' This strongly implies this tool is for draft updates before publishing. However, it does not specify when not to use it or mention alternatives such as partial content update tools, leaving some selection reasoning implied.

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

replace_notificationA
Idempotent
Inspect

Replace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoMust be "DRAFT". These tools cannot publish.
notificationYesFull notification template payload
notification_idYesThe notification template ID to replace. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only provide readOnly=false, idempotent=true, destructive=false. The description adds meaningful behavioral context: full-document PUT semantics, the template remains a draft after replacement, and publication is explicitly out of scope. This goes beyond the annotations and is consistent with them.

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?

Two sentences with no filler. The core action and full-document semantics are front-loaded, and the critical draft-state limitation is stated immediately in the second sentence.

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?

The description covers the non-obvious behavioral facts—full replacement, draft-only state, no publishing—while the schema handles payload requirements. It does not describe the response shape, but no output schema exists and the key calling constraints are well covered.

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%, and the schema itself contains detailed parameter guidance, including warnings about never omitting keys or sending empty objects. The tool description adds no parameter-level information, so the schema-heavy baseline of 3 applies.

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 states a specific action ('Replace') on a specific resource ('notification template') and clarifies it is a 'full document PUT'. This distinguishes it from partial-update tools like put_notification_content and from publish_notification via the draft-state note.

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?

It clearly communicates a key exclusion: making the template live is a separate step this tool cannot perform. It does not name sibling alternatives explicitly, but the draft-versus-live boundary gives agents enough context to avoid using this tool for publishing.

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

replace_preference_sectionA
Idempotent
Inspect

Replace a preference section. Full document replacement; missing optional fields are cleared. Topics attached to the section are unaffected.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the section
section_idYesId of the preference section
routing_optionsNoDefault channels for the section. Omit to clear.
has_custom_routingNoWhether the section defines custom routing for its topics

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate that this is a write operation and is idempotent. The description adds valuable behavioral detail beyond the annotations: missing optional fields are cleared, and attached topics are unaffected. This meaningfully informs an agent's side-effect expectations.

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?

Three short sentences deliver the core action, replace semantics, clearing behavior, and topic preservation. No filler words, and the most important information appears first. Every sentence earns its place.

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?

The description covers the key behavioral nuances necessary for correct invocation: full replacement, clearing omitted optional fields, and non-impact on topics. The schema covers parameters. A note on the expected return value would make it fully complete, but nothing critical is missing for calling this tool correctly.

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?

The schema already describes all four parameters with 100% coverage. The description adds general context around clearing missing optional fields, but it does not need to re-document individual parameters. This matches the baseline for fully schema-documented parameters.

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 a specific verb and resource: 'Replace a preference section.' It goes on to clarify full-document replacement semantics, which distinguishes it from partial updates and from the related replace_preference_topic sibling. This is unambiguous and scoped.

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 phrase 'Full document replacement' implies the intended use case, but the description never explicitly says when to choose this over create_preference_section, an update-style tool, or archive_preference_section. Usage context is inferred rather than stated.

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

replace_preference_topicA
Idempotent
Inspect

Replace a topic within a section. Full document replacement: omitted optional fields are cleared, except digest, which is left untouched when omitted. Pass digest: null to turn a digest off.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the preference topic
digestNoBatch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off.
topic_idYesId of the subscription preference topic
section_idYesId of the preference section
topic_dataNoArbitrary metadata associated with the topic. Omit to clear.
default_statusYesDefault subscription status applied when a recipient has not set their own
routing_optionsNoDefault channels delivered for this topic. Omit to clear.
allowed_preferencesNoPreference controls a recipient may customize. Omit to clear.
include_unsubscribe_headerNoWhether to include a list-unsubscribe header on emails for this topic

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses that omitted optional fields are cleared, with a special exception for `digest`. It also explains how to disable a digest via `null`. This adds meaningful behavioral context that annotations alone do not convey.

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?

Two sentences, no filler. The first sentence states the primary behavior; the second clarifies an important exception. Every word earns its place.

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?

The description covers the essential behavioral contract (replacement, field clearing, digest handling) needed to invoke the tool correctly. With 100% schema coverage, no output schema, and annotations for safety, nothing critical is missing for making a correct call.

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 description coverage is 100%, so each parameter is already documented. The description adds cross-cutting semantics: it explains the global replacement rule for all optional fields and the digest-specific edge case. This is valuable context beyond the per-parameter schema descriptions.

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 states a specific action ('Replace a topic within a section') with a clear resource ('preference topic') and scope ('within a section'). It distinguishes from sibling tools like replace_preference_section, and the phrase 'Full document replacement' adds crucial intent.

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?

The description explicitly frames the tool as 'Full document replacement' and explains the clearing semantics for omitted fields, which tells an agent when to choose this over a partial update. It does not name alternative tools or exclusion criteria, but the context is clear enough for correct selection.

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

replace_preview_device_setA
Idempotent
Inspect

Replace a preview device set's name and devices. This is a full replace, so send every device the set should keep. The Courier Recommended set cannot be changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe new name
device_idsYesDevice ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.
device_set_idYesThe device set id (pvs_...)

TDQS

A4.2/5.0
Behavior4/5

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

The description adds the key behavioral detail that this is a full replace (so the caller must send every desired device) and the restriction that the Courier Recommended set is immutable. These go beyond the annotations (idempotent, non-destructive, not read-only) and provide useful context without contradiction.

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 two sentences with no redundant words. It front-loads the primary purpose, then adds the critical caveat about full replace and the immutable Courier Recommended set. Every sentence earns its place.

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?

The description covers the essential behavior, the special-casing of the Courier Recommended set, and the requirement to send the full device list. With no output schema, it doesn't need to describe return values. It is sufficient for an agent to call it correctly.

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%, with each parameter already well-documented (including the pvd_ prefix and validation for device_ids). The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

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 states a specific action (Replace) and resource (preview device set), and clarifies scope with 'full replace' and the restriction on the Courier Recommended set. It clearly distinguishes from create/get/list siblings by the replace verb and the explicit note about being a full replacement.

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?

The description clearly instructs when use this tool: to replace the entire device set, requiring the full list of devices. It also gives a when-not by stating the Courier Recommended set cannot be changed. It does not mention alternative tools explicitly, but the intent is clear enough for an agent.

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

replace_profileA
DestructiveIdempotent
Inspect

Fully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileYesComplete profile data to replace with
user_idYesThe user ID

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate destructiveHint and idempotentHint, but the description adds what gets destroyed: 'All existing data is overwritten.' It also provides practical guidance about including fields to keep, which goes beyond the annotation flags and helps an agent predict side effects.

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?

Two short sentences, each earning its place. The core action and method are front-loaded, followed by the critical overwrite warning and the keep-fields guidance. No filler or repetition.

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 destructive nature, the description sufficiently explains correct usage: provide the full profile. No output schema exists, and the description does not mention return values, but that is not critical for invocation. Minor gaps are the lack of an explicit alternative mention and no error/permission context, but annotations cover idempotence and destruction.

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% and both parameters have descriptions. The description adds meaning to the 'profile' parameter by explaining that the provided data must be complete, reinforcing that omitted fields will be lost. This is valuable beyond the schema's 'Complete profile data to replace with.'

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 the action ('Fully replace'), the resource ('a user profile'), and the HTTP method ('PUT'). It distinguishes this from sibling tools like patch_profile by emphasizing full replacement and overwrite semantics.

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?

The description makes the usage context explicit: use this when you want a full replacement and must include every field to keep. It does not explicitly name patch_profile as the partial-update alternative, but the PUT/full-replace language gives clear context without exclusion.

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

replace_routing_strategyA
Idempotent
Inspect

Replace a routing strategy. Full document replacement; missing optional fields are cleared.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name
tagsNoTags. Omit to clear.
routingYesRouting tree
channelsNoPer-channel delivery configuration. Omit to clear.
providersNoPer-provider delivery configuration. Omit to clear.
descriptionNoDescription. Omit to clear.
routing_strategy_idYesThe routing strategy ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate a non-read idempotent operation; the description adds important behavioral detail that omitting optional fields clears existing values. This clarifies the actual impact of a call, which is not fully captured by the annotations. It does not mention auth or return behavior, but the core destructive semantics are disclosed.

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?

Two short sentences with no filler. The primary action is stated first and the critical replacement semantics are front-loaded in the second sentence.

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?

The description captures the essential behavior needed to invoke the tool correctly: full replacement and clearing of missing optional fields. The required parameters are documented in the schema, and no output schema exists to explain. It is complete for this operation, though a brief note distinguishing it from create/update would elevate it further.

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% and each optional parameter is already documented as 'Omit to clear'. The description's note about missing optional fields being cleared reinforces this but adds no parameter-level information beyond what the schema provides, so the baseline 3 is appropriate.

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 names a specific verb ('Replace') and resource ('routing strategy'), and adds the key property that this is a full document replacement. This makes it distinguishable from sibling tools such as create_routing_strategy, archive_routing_strategy, or get_routing_strategy without needing to inspect schemas.

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 phrase 'Full document replacement' implies this tool is for replacing entire routing strategies rather than patching specific fields, but it never explicitly says when to prefer it over create/update/archive siblings or what to do for partial updates. Usage context is present but only by inference.

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

replace_tenant_templateA
Idempotent
Inspect

Create or replace a tenant notification template (draft unless published is true).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoOptional title merged into template content when provided
contentYesElemental content document. Example: { "version": "2022-01-01", "elements": [{ "type": "meta", "title": "Welcome" }, { "type": "text", "content": "Thanks for signing up." }] }
routingNoMessage routing tree. Example: { "method": "single", "channels": ["email", "sms"] }
channelsNoPer-channel delivery configuration, keyed by channel name. Example: { "email": { "providers": ["sendgrid"], "routing_method": "single" } }
providersNoPer-provider configuration, keyed by provider name. Example: { "sendgrid": { "override": { "from": "noreply@example.com" } } }
publishedNoWhen true, publish immediately after save
tenant_idYesThe tenant ID
template_idYesThe template ID

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, lowering the burden on the description. The description adds meaningful behavioral context by stating that the template is saved as a draft unless 'published' is true, which clarifies the default state after the call. It does not detail overwrite semantics or response behavior, but the added draft context is valuable.

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?

A single front-loaded sentence states the action, the resource, and the key draft/published behavior. There is no filler or repetition of schema content, and every phrase earns its place.

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 highly nested schema (which includes examples and field descriptions for content, routing, channels, and providers) and the presence of safety annotations, the description covers the core behavioral nuance: templates are drafts unless published is true. It does not describe return values or error conditions, but the schema richness and annotations make the description sufficient for a competent agent.

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%, so the baseline is 3. The description does not add any parameter-level meaning beyond what the schema already provides; it only references the published flag indirectly. The schema itself richly documents parameters with examples and constraints, so no compensation is needed.

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 description states a specific verb ('Create or replace') and a clear resource ('tenant notification template'), so an agent can tell it is an upsert operation. The phrase 'draft unless published is true' distinguishes it from publish_tenant_template, though it does not explicitly contrast with other sibling replace/create tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus related siblings such as create_notification, replace_notification, put_notification_content, or publish_tenant_template. The description implies it is for creating/replacing templates but does not state conditions, exclusions, or alternatives.

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

resend_messageAInspect

Resend a previously sent message. Loads the original send request and enqueues a brand-new send to the same recipient with the same content, producing a new messageId; the original message is unchanged. Rate limited per message (429 on rapid repeats).

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message ID of the original message to resend

TDQS

A4.5/5.0
Behavior5/5

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

The annotations only say readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description meaningfully adds behavior: it loads the original send request, enqueues a new send, creates a new messageId, leaves the original message unchanged, and includes a rate-limit warning with a 429 code. This is substantial context beyond the structured annotations and aligns with the non-idempotent hint.

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 three sentences with no filler: the core purpose is front-loaded, the behavioral mechanism and side effects follow, and the rate-limit caution is compactly stated. Every sentence earns its place.

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?

This is a simple single-parameter tool with no output schema. The description covers the operation's purpose, side effects (new messageId, original unchanged), and an important operational constraint (429 rate limit). An agent has enough to invoke it correctly and anticipate consequences.

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%, and the single parameter message_id is already described as 'The message ID of the original message to resend.' The main description reinforces the parameter's role by explaining that the original send request is loaded, but it does not add significantly new semantic detail beyond what the schema already provides. Baseline 3 is appropriate.

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 a precise verb and resource: 'Resend a previously sent message.' It clearly distinguishes this from siblings like send_message and send_message_to_list by emphasizing 'previously sent' and the fact that it creates a 'brand-new send' with a 'new messageId.' An agent can tell this tool apart without inspecting sibling schemas.

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?

The description clearly conveys the context: use this when resending a previously sent message, and the behavioral explanation that it reuses the original request makes the use case unambiguous. However, it does not explicitly name alternatives or state when NOT to use it, such as 'use send_message for new content,' so it stops short of a 5.

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

restore_listA
Idempotent
Inspect

Restore a previously deleted list.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds the precondition that the list must have been previously deleted, which is useful behavioral context, but does not disclose details such as what exactly gets restored, failure behavior for active lists, or permission requirements.

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 a single front-loaded sentence with no filler or repetition. Every word earns its place and the core operation and precondition are communicated efficiently.

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 one-parameter operation with no output schema, the description is nearly complete: it names the action, the target resource, and the precondition. Minor gaps such as exact side effects and error behavior exist, but annotations already cover idempotency and non-destructiveness, so the missing detail is not critical.

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%, so the baseline is 3 even without additional parameter details in the description. The tool description adds the implication that list_id must refer to a previously deleted list, but it does not elaborate on ID format or how to obtain the ID, which is acceptable for a single obvious parameter.

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 states a specific verb (Restore) and resource (previously deleted list), clearly distinguishing this from sibling tools like create_list, get_list, and delete_list. The phrase 'previously deleted' adds essential scope beyond what the name alone conveys.

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?

The description gives clear context by specifying that this operation applies to a previously deleted list, implying it should be used rather than create_list when undoing a deletion. It does not explicitly name alternatives or when-not-to-use conditions, but the single-sentence scope is sufficient for this straightforward operation.

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

run_bulk_jobAInspect

Run a bulk job, triggering delivery to all added users.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesThe bulk job ID to run

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate this is not read-only or idempotent, and the description adds the key behavioral detail that running the job triggers delivery to all added users. However, it does not disclose potential consequences, such as repeated runs causing duplicate deliveries, beyond what the annotations imply.

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 a single clear sentence with no filler. The core action and its effect are front-loaded and every word contributes meaning.

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 tool with one parameter and a clear side effect, the description covers the essential information needed to call it correctly. It could add a note about idempotency or what happens if the job has already run, but the current description is sufficient for basic correct use.

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?

The single parameter job_id is fully described in the schema as 'The bulk job ID to run', and the description adds no additional parameter context. With 100% schema coverage, the baseline of 3 is appropriate.

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 states a specific verb ('Run') and resource ('bulk job') and clarifies the consequence ('triggering delivery to all added users'). This distinguishes it from related tools like create_bulk_job and get_bulk_job.

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 phrase 'triggering delivery to all added users' implies this tool is used after users have been added to a bulk job, but it does not explicitly state when to use it versus alternatives or provide exclusions. Usage context is present but left to inference.

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

schedule_broadcastAInspect

Schedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.

ParametersJSON Schema
NameRequiredDescriptionDefault
timezoneNoIANA timezone scheduled_to is expressed in, e.g. America/New_York
broadcast_idYesThe broadcast id
recipient_idYesThe list or audience id
scheduled_toYesWall-clock time of the send with no timezone offset, e.g. 2026-10-01T09:00:00
recipient_typeYesWhether to send to a list or an audience

TDQS

A4/5.0
Behavior3/5

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

Annotations indicate a write operation (readOnlyHint=false) but description adds no details about side effects such as overwriting existing schedules, idempotency, or auth requirements. Since annotations are sparse (only booleans), the description could add more behavioral context, but it's not misleading.

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?

One concise sentence that front-loads the core action (schedule a broadcast to send later) and includes a useful pointer to the cancellation sibling. No wasted words, highly scannable.

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?

Covers the essential action and cancellation path. Parameter details are fully handled by schema. The description doesn't explicitly mention that the broadcast must already exist (broadcast_id required), but schema implies it. Adequate for a mutating scheduling tool.

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 covers all 5 parameters with descriptions (100% coverage). The description adds no parameter-specific meaning beyond what schema provides, which is acceptable given full coverage. Baseline 3 is appropriate.

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 (schedule) and resource (broadcast) with recipient scope (list or audience). Clearly distinguishes from immediate send (send_broadcast) and creation (create_broadcast), and even mentions the cancellation alternative. An agent can easily identify this tool's role among many siblings.

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?

Implicitly says use for later sending, contrasting with immediate send. Mentions cancellation via cancel_broadcast_schedule, but doesn't explicitly exclude alternatives like send_broadcast for immediate sends or create_broadcast for creating the broadcast first. Good guidance but not exhaustive.

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

send_broadcastAInspect

Send a broadcast now to every member of a list or audience. This delivers real messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
broadcast_idYesThe broadcast id
recipient_idYesThe list or audience id
recipient_typeYesWhether to send to a list or an audience

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this as mutating and non-idempotent, and the description adds meaningful context: it delivers real messages to every member, implying real-world side effects and scale. This goes beyond the schema/annotation signal, though it doesn't address auth or rate limits.

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?

Two short sentences that front-load the action and impact; the follow-up sentence 'This delivers real messages' earns its place by reinforcing side-effect severity. No filler.

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 three-parameter tool with fully described schema, the description covers action, timing, audience scope, and side effects. It could add a note about scheduling or return behavior, but nothing essential is missing for correct invocation.

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%, so the baseline is 3; the description only echoes the list/audience distinction rather than adding format, constraints, or examples beyond the schema.

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?

Uses a specific verb ('send') and resource ('broadcast') plus the immediate-timing qualifier 'now', which distinguishes it from schedule_broadcast. It specifies the target population (every member of a list or audience), so the agent can tell it apart from send_message or broadcast creation.

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?

The phrase 'now' establishes immediate send context and the list/audience constraint narrows when to use it. It does not explicitly name alternatives such as schedule_broadcast or send_message_to_list, nor state when not to use them, so it stops short of a 5.

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

send_messageAInspect

Send a message to a user using inline title and body content (no template). Optionally specify routing channels. API reference: https://www.courier.com/docs/api-reference/send/send-a-message.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesMessage body
dataNoKey-value data to include with the message
titleYesMessage title
methodNoRouting method: deliver to all channels or stop after first successall
user_idYesThe recipient user ID
channelsNoChannel names to route through (e.g. email, sms, push). Omit to use default routing.

TDQS

A3.7/5.0
Behavior3/5

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

The false annotations signal that this is a mutating, non-idempotent operation, and the description adds useful context about inline content and optional routing channels. It does not mention delivery side effects, auth requirements, rate limits, or whether the call returns a message ID, but it does not contradict the annotations.

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?

Two sentences with no filler: the core action and content mode are front-loaded, and the API reference link is a useful pointer at the end. Every clause earns its place.

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

Completeness3/5

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

The combination of description and fully-described schema is enough to invoke the core call, and the API reference link supplements documentation. But with no output schema, the description does not tell the agent what a successful send returns, and the relationship to list/template siblings is only implicit, leaving contextual gaps.

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 coverage is 100%, so the schema already documents all parameters. The description's mention of inline title/body and routing channels maps directly to schema properties but adds no new parameter-level meaning; the 'method' enum and 'data' object are only explained in the schema, which is acceptable.

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 a specific action and object ('Send a message to a user') and immediately scopes the content mode ('inline title and body content (no template)'), which distinguishes it from template-based sibling tools. It also mentions optional routing channels, giving a precise one-line definition.

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 'no template' qualifier tells an agent this is for inline sends rather than template-based siblings, and 'to a user' suggests single-recipient use rather than list sends. However, it never names send_message_template, send_message_to_list, or other alternatives explicitly, so an agent must infer routing decisions from sibling names.

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

send_message_templateAInspect

Send a message to a user using a published notification template. Only published templates can be sent; publishing a draft is a separate operation. Example: { user_id: "user-123", template: "nt_01abc123", data: { name: "Alex", resetUrl: "https://app.example.com/reset" } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoKey-value data for template variables
methodNoRouting methodall
user_idYesThe recipient user ID
channelsNoChannel names to route through. Omit to use template routing config.
templateYesTemplate ID or notification slug

TDQS

A4.1/5.0
Behavior3/5

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

Annotations are all false (not read-only, not idempotent, not destructive), so the description carries the burden of explaining side effects. It adds the prerequisite that only published templates can be sent, but does not disclose what happens on invalid templates, whether a message record is created, or how delivery works. The basic side effect is clear from 'Send', but the description adds limited behavioral depth.

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 two sentences plus a compact JSON example, with no filler. The key constraint (published templates only) is stated early, and the example is directly illustrative. Everything present earns its place.

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

Completeness3/5

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

The description plus schema cover the core action, required parameters, and a precondition, but gaps remain: the 'method' enum (all/single) is not explained, there is no mention of what the operation returns, and error conditions are absent. Given the tool has nested objects and no output schema, a bit more context about routing options would improve completeness.

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 input schema already documents all five parameters, so the baseline is 3. The description's example goes further by showing how the 'data' object maps to template variables (e.g., name, resetUrl), which clarifies the nested structure. It does not add semantic detail for 'method' or 'channels', but the schematic descriptions already cover those fields.

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 a specific verb and resource ('Send a message to a user using a published notification template'), making the operation unambiguous. The added note that only published templates can be sent distinguishes it from publish/draft operations, and the example reinforces the intended use. It is clearly not a generic send_message tool.

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?

The description supplies clear context by restricting use to published templates and stating that publishing a draft is a separate operation, giving an implicit when-not. It also implies a single recipient ('to a user'), differentiating from list-based send tools, but it does not explicitly name sibling alternatives or describe when to choose this over send_message. Thus it provides context with one exclusion but lacks explicit alternative routing.

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

send_message_to_listAInspect

Send a message to all subscribers of a list using inline title and body content. API reference: https://www.courier.com/docs/api-reference/send/send-a-message.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesMessage body
dataNoKey-value data to include
titleYesMessage title
methodNoRouting methodall
list_idYesThe list ID to send to
channelsNoChannel names to route through. Omit to use default routing.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already carry the readOnly/idempotent/destructive flags, and the description is consistent with them, so there is no contradiction. The description adds that this targets all list subscribers and uses inline content, but it does not disclose return shape or other side-effect details beyond what 'Send' implies.

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?

A single direct sentence states the core purpose and content mode, followed by a useful API reference URL. There is no filler or repeated title.

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

Completeness3/5

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

Given no output schema and six parameters, the description is adequate but not rich: it identifies the target and content mode, while the schema covers field details. It leaves unaddressed the difference from template-based sends and does not describe the response, though the API reference mitigates this.

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?

With 100% schema description coverage, the schema already documents all 6 parameters, including the method enum, data, and channels. The description adds no parameter semantics beyond mapping 'title' and 'body' to inline content, so the baseline of 3 applies.

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 uses a specific verb ('Send') plus a resource ('message to all subscribers of a list'), and clarifies it uses inline title and body rather than a template. This distinguishes it from siblings like send_message_to_list_template and send_message, making the purpose unambiguous.

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?

The phrase 'to all subscribers of a list' and 'using inline title and body content' gives a clear context for choosing this tool over template-based or single-recipient senders. It does not explicitly name a sibling or provide when-not-to-use guidance, but the intended use case is evident.

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

send_message_to_list_templateAInspect

Send a message to all subscribers of a list using a notification template.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoKey-value data for template variables
methodNoRouting methodall
list_idYesThe list ID to send to
channelsNoChannel names to route through. Omit to use template routing config.
templateYesTemplate ID or notification slug

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already note this is non-readonly and non-idempotent. The description adds no behavioral information such as delivery side effects, inability to retract, or asynchronous 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?

One concise, front-loaded sentence with no filler. Every word contributes to the tool's purpose.

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

Completeness3/5

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

Schema and annotations provide a fair amount of context, but without an output schema or alternative routing guidance, the description leaves some operational context unspecified.

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 documents all parameters with descriptions, so the baseline applies. The description does not extend parameter meaning beyond what is in the schema.

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?

Describes a specific operation: sending a template-based message to every subscriber of a list. This is clear on verb and resource, though it doesn't explicitly differentiate from similarly named siblings such as send_message_to_list and send_message_template.

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?

Provides clear context: use when routing a notification template to all list subscribers. No exclusions or alternative guidance are given.

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

subscribe_user_to_listA
Idempotent
Inspect

Subscribe a user to a list. Creates the list if it doesn't exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID
user_idYesThe user ID to subscribe
preferencesNoOptional notification preferences

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already indicate the operation is not read-only and is idempotent. The description adds valuable non-obvious context by revealing the side effect of creating the list if it does not exist, which goes beyond what annotations provide. It does not contradict the idempotentHint.

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 a single, front-loaded sentence with no filler. The primary action is stated first, followed by the important auto-creation caveat, making it efficient and easy to parse.

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?

With the annotations covering idempotency and the schema covering all parameters, the description provides the key behavioral caveat about list creation. The lack of an output schema and sibling differentiation guidance is a minor gap, but the core information needed to call the tool correctly is present.

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%, so the parameters list_id, user_id, and preferences are already documented to the degree of their names and types. The description adds no additional meaning beyond the schema, so the baseline score of 3 applies.

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 uses a specific verb and resource ('Subscribe a user to a list') and adds a distinctive behavior ('Creates the list if it doesn't exist'). This clearly states what the tool does and helps distinguish it from siblings like unsubscribe_user_from_list and add_bulk_users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description only states the action and does not say when to use this tool versus the many related siblings such as subscribe_user_to_lists, bulk_subscribe_to_list, or add_subscribers_to_list. There is no explicit guidance about choosing alternatives for bulk or multiple subscriptions.

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

subscribe_user_to_listsB
Idempotent
Inspect

Subscribe a user to one or more lists. Creates lists that do not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
listsYesArray of lists to subscribe to
user_idYesThe user ID

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already communicate non-read-only and non-destructive behavior, and the description adds a meaningful side effect: missing lists are created. However, it does not clarify behavior for already-subscribed users, partial failures, or the effect of preferences, though idempotentHint does cover some repeat-invocation semantics.

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?

Two short sentences, both earning their place: the first states the core operation, the second discloses an important side effect. There is no filler or redundancy.

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 simple write tool with full parameter documentation, annotations, and no output schema, the description is largely sufficient. The main gap is the lack of guidance distinguishing this plural variant from the singular sibling, which an agent may need when choosing tools.

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% and both parameters are documented. The description adds no parameter-specific meaning beyond what the schema already provides, so baseline 3 is appropriate.

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 description states a specific verb and resource: subscribing a user to one or more lists. It also adds a meaningful behavioral detail, 'Creates lists that do not exist.' However, it does not explicitly differentiate itself from the sibling `subscribe_user_to_list` despite their close naming and overlapping purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a use case but gives no guidance on when to use this tool versus siblings like `subscribe_user_to_list`, `bulk_subscribe_to_list`, or `add_subscribers_to_list`. There are no exclusions, conditions, or alternative-selection hints.

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

trace_messageA
Read-only
Inspect

Trace delivery in one call. Give EXACTLY ONE of message_id (a single message) or trace_id (the metadata.trace_id set on a send, which can span several messages). Returns each matching message with its event history, which carries the status reason when a message is undeliverable. Set include_output to also return the rendered content each provider received.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax messages to trace for a trace_id. Defaults to 10.
trace_idNoThe metadata.trace_id set on the send. Mutually exclusive with message_id.
message_idNoA message id, as returned by send. Mutually exclusive with trace_id.
include_outputNoAlso return rendered content per provider. Off by default, since rendered email can be large.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so no contradiction. The description adds valuable behavioral context: it states the tool returns event history and that the status reason is included for undeliverable messages. It also discloses that include_output is off by default because 'rendered email can be large,' which signals performance implications beyond the schema.

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 three sentences, front-loaded with the core purpose ('Trace delivery in one call'). Every sentence earns its place: it covers invocation modes, return content, and the include_output option, with no fluff or redundancy.

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 read-only trace tool with four parameters and no output schema, the description adequately explains what is returned (matching messages with event history and status reasons) and key parameter semantics. It doesn't detail pagination or error cases, but the limit parameter and read-only nature make it sufficiently complete for an agent to call correctly.

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% with descriptions for each parameter, so baseline is 3. The description adds meaning: it clarifies mutual exclusivity of message_id/trace_id, explains that trace_id can span several messages, and describes the default behavior of limit and include_output with rationale. This exceeds the schema alone.

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 states a specific verb ('Trace') and resource ('delivery') and explains the two mutually exclusive ways to invoke it (message_id or trace_id). It clearly distinguishes from sibling tools like get_message or get_message_history by framing this as a one-call delivery trace that returns event history with status reasons.

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?

The description gives explicit guidance on parameter usage: 'Give EXACTLY ONE of message_id or trace_id' and explains the difference between a single message and a trace spanning multiple. It also indicates when to set include_output. However, it does not explicitly compare to alternatives like get_message_history, though the 'in one call' framing implies a distinction.

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

track_inbound_eventA
Idempotent
Inspect

Track an inbound event that can trigger automations. Requires event name, messageId (for deduplication), and properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesThe event name (appears as trigger in Automation Trigger node)
userIdNoUser ID associated with the event
messageIdYesUnique ID for deduplication (returns 409 if not unique)
propertiesYesEvent properties payload

TDQS

A4.2/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations by stating that tracking can trigger automations, which is a key side effect. It also highlights the deduplication role of messageId, complementing the idempotentHint annotation. No contradiction with annotations exists.

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 a single efficient sentence that front-loads the core purpose and then lists the required inputs. Every word earns its place; no filler or repetition of schema details.

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 4-parameter tool with a 100% covered schema and clear annotations, the description sufficiently covers what the tool does, what it requires, and its side effects. It does not describe response output, but no output schema exists and the core invocation context is complete.

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%, so the schema already documents all four parameters. The description restates the required parameters and adds little beyond the schema, aside from emphasizing messageId for deduplication, which the schema already mentions. Baseline 3 is appropriate.

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 uses a specific verb ('Track') and resource ('inbound event') and states the purpose ('can trigger automations'). It clearly distinguishes this from sibling invoke_* tools by emphasizing inbound event ingestion rather than direct invocation.

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?

The phrase 'Track an inbound event' establishes clear context for external event ingestion, and 'that can trigger automations' signals its relationship to automation tools. It does not explicitly name alternatives or exclusions, but the context is clear enough for an agent to select this over invoke_automation_template or invoke_ad_hoc_automation.

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

unsubscribe_user_from_listB
DestructiveIdempotent
Inspect

Unsubscribe a user from a list.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesThe list ID
user_idYesThe user ID to unsubscribe

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds no behavioral context beyond the action itself, such as whether the subscription is hard-deleted, whether user data is affected, or any side effects.

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?

A single five-word sentence that is front-loaded and contains no filler. It expresses the operation in minimal space without losing clarity.

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

Completeness3/5

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

For a simple two-parameter mutation with idempotent and destructive annotations, the basics are present. However, the description does not clarify the relationship to sibling unsubscribe/delete tools or state the post-condition, making it adequate but not complete.

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%, with list_id and user_id each described. The tool description adds no extra parameter meaning, so the schema carries the documentation burden; baseline 3 is appropriate.

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?

States a specific verb and resource: unsubscribes a user from a list. It is distinguishable from subscribe_user_to_list by the action verb, but it does not explicitly differentiate from related sibling operations such as delete_user_list_subscriptions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose this tool over alternatives like delete_user_list_subscriptions or bulk subscription tools. The intended use is only implied by the verb 'unsubscribe'.

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

update_audienceB
Idempotent
Inspect

Create or update an audience with a filter definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name
filterNoAudience membership filter. Either a single condition ({ operator, path, value }) or a group ({ operator: "AND" | "OR", filters: [...] }) nesting to any depth. Example: { "operator": "AND", "filters": [{ "operator": "EQ", "path": "title", "value": "Engineer" }, { "operator": "INCLUDES", "path": "tags", "value": "beta" }] }
audience_idYesThe audience ID
descriptionNoDescription

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, covering the basic safety profile. The description adds a small amount beyond that by mentioning 'Create or update' (upsert behavior) and emphasizing the filter definition. It does not disclose side effects, whether existing filters are replaced or merged, or any permission requirements, but the annotation coverage lowers the burden.

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 description is one short, direct sentence with no filler. It front-loads the core action and resource. It earns its place, though it could carry a bit more useful context without becoming verbose.

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

Completeness3/5

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

The schema richly documents parameters and the filter grammar, so an agent can construct valid inputs. However, the description alone leaves ambiguity around create-versus-update behavior, return values (no output schema), and whether calling with only audience_id has meaningful side effects. These are notable gaps, but not fatal given schema and annotation coverage.

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%, so the schema already documents every parameter including the nested filter structure and example. The description's phrase 'filter definition' maps to the filter parameter but provides no additional semantic detail beyond what the schema already offers. Baseline 3 is appropriate.

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 description names a specific action and resource: "Create or update an audience with a filter definition." It clearly distinguishes this from sibling tools like list_audiences, get_audience, and delete_audience. However, the dual verb 'Create or update' is slightly ambiguous against the tool name 'update_audience', though it may intentionally signal upsert semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives, or whether it is preferred over get_audience/list_audiences for inspection tasks. It also does not state when an audience is created versus updated, despite saying 'Create or update.' The context must be inferred entirely from the tool name and schema.

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

update_brandB
Idempotent
Inspect

Replace an existing brand with new values.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesBrand display name
brand_idYesThe brand ID to update
settingsNoBrand settings (colors, email, inapp)
snippetsNoBrand snippets

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate this is a non-read-only, idempotent, non-destructive write operation. The description adds little beyond saying 'replace', which is ambiguous: it could mean full replacement of all fields or partial update of provided fields. It does not clarify what happens to omitted settings or snippets, leaving a meaningful behavioral gap.

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 description is a single, focused sentence with no filler. It front-loads the action ('Replace') and the object ('an existing brand'). While it is terse, it is appropriately sized for the information it tries to convey, though it omits important details that would make it more useful.

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

Completeness3/5

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

Given the nested settings and snippets objects and no output schema, the description is adequate but incomplete. It doesn't explain the replace semantics for partially specified objects, how to clear a field, or what the response contains. With no alternative guidance, an agent may not know whether omitted fields are reset or preserved.

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 coverage is 100%, so parameters (name, brand_id, settings, snippets) are already documented in the input schema. The description adds no additional parameter detail or usage nuance beyond the generic 'new values', so it sits at the baseline of 3 without providing extra semantic value.

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 description 'Replace an existing brand with new values' identifies a clear verb and resource: it modifies an existing brand. It distinguishes from creating or deleting a brand by explicitly saying 'existing', even though it does not name sibling tools. 'Replace' is slightly ambiguous relative to the tool name 'update_brand', so it loses a point.

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 use case is implied by 'existing brand' — an agent can infer this is for updating a brand that already exists rather than creating a new one. However, it does not explicitly mention alternatives like create_brand or delete_brand, nor does it state when not to use this tool. The guidance is minimal and left to inference.

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

update_notification_checksB
Idempotent
Inspect

Update check statuses for a notification submission.

ParametersJSON Schema
NameRequiredDescriptionDefault
checksYesChecks to update
submission_idYesThe submission ID for the checks resource
notification_idYesThe notification template ID

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already indicate the operation is a non-read-only, idempotent, non-destructive update, and the description adds no behavioral detail beyond the verb. It does not disclose whether existing checks are replaced, whether status transitions are validated, or what happens when the submission is already final.

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?

A single front-loaded sentence with no filler. It is concise, though the available space could have been used to add behavioral context without harming clarity.

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

Completeness2/5

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

For a mutation tool with three required parameters and no output schema, the description does not explain the effect on existing checks, required lifecycle state, or what a successful update returns. It is minimal but not sufficient on its own.

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%, with descriptions for notification_id, submission_id, and checks, so the schema carries the parameter documentation. The description itself adds no additional parameter semantics, yielding the baseline score.

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 names a specific verb, resource, and object: 'Update check statuses for a notification submission.' This clearly distinguishes it from read-only siblings like list_notification_checks and from submission-level actions like cancel_notification_submission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to update checks versus auditing or cancelling a notification submission, and no alternative tools are named. The usage context is only implied by the resource name and sibling set.

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

update_providerA
DestructiveIdempotent
Inspect

Replace an existing provider configuration. Full replacement — retrieve current config with get_provider first; omitted optional fields are cleared. Changing API keys or settings affects live delivery if this integration is in use.

ParametersJSON Schema
NameRequiredDescriptionDefault
aliasNoShort alias
titleNoDisplay name
providerYesProvider key (must match existing; changing provider type is not supported)
settingsNoProvider-specific settings
provider_idYesThe provider configuration ID

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as destructive and non-read-only, but the description adds crucial context: full replacement clears omitted fields, and changes affect live delivery if the integration is in use. This goes well beyond the annotations.

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?

Three dense, purposeful sentences. The action, prerequisite, and consequences are all stated without redundancy or fluff, and the most important behavioral fact is front-loaded.

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?

The description gives the agent everything needed to use this tool correctly: what it does, how to prepare with get_provider, what happens to omitted fields, and the operational impact on live delivery. No output schema exists, but for this mutation tool the missing response details are not a barrier to correct invocation.

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 description coverage is 100%, so the parameters are already well documented. The description adds valuable behavior not in the schema, such as full-replacement clearing omitted optional fields and the live-delivery consequence of changing settings.

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 uses a specific verb and resource: 'Replace an existing provider configuration.' Saying 'existing' and 'Full replacement' clearly distinguishes it from create_provider, delete_provider, or partial updates.

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?

The description gives concrete usage guidance: retrieve current config with get_provider first, and warns that omitted optional fields are cleared. It doesn't explicitly list create/delete alternatives, but the context makes the replace-vs-create/delete distinction clear.

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

update_tenant_preferenceA
Idempotent
Inspect

Set the default notification preference for a subscription topic on a tenant. This controls tenant-level defaults — it does NOT set per-user preferences (use the user preferences API for that). The topic_id must already exist as a subscription topic in the workspace; a 404 means the topic has not been created yet. Example: { tenant_id: "acme", topic_id: "marketing-updates", status: "OPTED_IN", has_custom_routing: true, custom_routing: ["email", "push"] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesSubscription status for the topic
topic_idYesThe subscription topic ID — must already exist in the workspace. A 404 response means the topic does not exist; create it in the Preferences Editor first.
tenant_idYesThe tenant ID
custom_routingNoDefault channels when has_custom_routing is enabled
has_custom_routingNoWhen true, use custom_routing instead of template defaults

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide idempotentHint=true, readOnlyHint=false, destructiveHint=false, so the bar is lower. The description adds useful operational context beyond annotations: the tenant-level scope, the pre-existence requirement, and what a 404 response means. No contradiction with annotations.

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?

Three sentences plus one JSON example. The opening sentence carries the core action and scope, and the exclusion follows immediately. The example adds useful concrete context, though it slightly lengthens the description.

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 straightforward update with a fully documented 5-parameter schema and idempotency/destructive hints already encoded, the description covers scope, prerequisite, and an error signature. It does not describe the success return value, but the lack of an output schema makes this a minor gap.

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%, so the baseline is 3. The description adds a concrete JSON example that shows how tenant_id, topic_id, status, has_custom_routing, and custom_routing compose together, but most field semantics (enums, 404 behavior) are already in the schema, so the added meaning is modest.

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 action and resource: 'Set the default notification preference for a subscription topic on a tenant.' It explicitly contrasts with per-user preferences, which differentiates it from the many user-preference tools in the sibling list.

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?

Directly tells the agent when not to use it: 'it does NOT set per-user preferences (use the user preferences API for that).' It also provides a prerequisite and diagnostic: topic_id must already exist, and a 404 means the topic has not been created yet.

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

update_translationB
Idempotent
Inspect

Create or update a translation for a specific locale. API reference: https://www.courier.com/docs/api-reference/translations/update-translations-by-locale.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesTranslation content (PO file format)
domainNoTranslation domaindefault
localeYesLocale code (e.g. en_US, fr_FR)

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already supply the safety profile: readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description adds upsert semantics ('Create or update') but no extra detail about whether existing translations are overwritten wholesale or how partial updates behave, so it adds some but not rich context.

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?

One concise sentence that front-loads the action and resource, plus a relevant API reference link. There is no filler or redundant repetition of schema content.

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 simple upsert operation with 100% parameter coverage, annotations for safety, and no output schema, the description is largely sufficient. The main missing piece is sibling differentiation, which is already captured in the usage_guidelines dimension.

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?

The input schema covers all parameters with descriptions, so the baseline is 3 under the rubric. The description's phrase 'for a specific locale' loosely maps to the locale parameter but adds no new meaning beyond the schema fields.

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 description states a specific verb ('Create or update') and resource ('a translation for a specific locale'), making the core function immediately clear. It does not explicitly distinguish from sibling locale-related tools like put_notification_locale or put_journey_template_locale, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as get_translation, put_notification_locale, or put_journey_template_locale. The description explains what the tool does but not which scenario selects it over siblings.

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

update_user_preference_topicB
Idempotent
Inspect

Update a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesPreference status
user_idYesThe user ID
topic_idYesThe subscription topic ID
tenant_idNoUpdate the preference for this tenant context only
custom_routingNoCustom channel routing order
digest_schedule_idNoPut the user on one of the topic's digest schedules. Pass null to clear their choice and fall back to the default schedule.
has_custom_routingNoWhether custom channel routing is set

TDQS

B3.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and the description is consistent with these (no contradiction). The description adds that the update can be an opt in/out or channel preference change, which provides a little behavioral context beyond the schema. However, it does not disclose side effects, permission requirements, or return behavior, so it adds only modest value over the annotations.

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 description is a single sentence that front-loads the verb and resource, followed by a parenthetical clarifying the scope. It is concise and free of fluff, though it could be slightly more structured to separate the action from the specific cases.

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

Completeness3/5

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

For a 7-parameter mutation tool with no output schema, the description is minimal. It does not mention what the function returns, any prerequisites, or how it differs from related tools like update_tenant_preference or replace_preference_topic. However, the schema fully documents all parameters and the annotations cover the safety profile, so it is adequate but not thorough.

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 coverage is 100%—all 7 parameters are documented in the input schema. The description's mention of 'opt in, opt out, or set channel preferences' loosely maps to the status enum and custom_routing, but it does not provide any parameter-specific details beyond what the schema already supplies. Baseline of 3 is appropriate given full schema coverage.

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 description clearly states a specific verb (update) and resource (user's preference for a specific subscription topic), and enumerates the action types (opt in, opt out, set channel preferences). It distinguishes itself from bulk operations by saying 'a specific' topic, but it does not explicitly name sibling tools like get_user_preference_topic or delete_user_preference_topic, so it lacks explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention that bulk updates should use bulk_update_user_preferences or that reads should use get_user_preference_topic. The only contextual clue is the word 'specific', which implies a single topic but no explicit when/when-not guidance.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updates
    • Addedarchive_preview_device_set
    • Addedcreate_preview_device_set
    • Addedcreate_preview_run
    • Addedget_preview_device_set
    • Addedget_preview_run
    • Addedlist_preview_device_sets
    • Addedlist_preview_devices
    • Addedlist_preview_runs
    • Addedreplace_preview_device_set
  2. 18 tool updates
    • Changedcourier_installation_guide2 fields changed
      • changedInput schema / properties / platform / description
        Previous value: -"The platform to get installation guide for"New value: +"Which SDK to return the installation guide for."
      • removedInput schema / properties / user_id
        Removed value: -{
        -  "description": "User ID for JWT generation (client-side SDKs only). Defaults to \"example_user\".",
        -  "type": "string"
        -}
    • Changedget_list_subscribers1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedget_user_list_subscriptions1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedget_user_preference_topic1 field changed
      • changedInput schema / properties / tenant_id / description
        Previous value: -"Scope to a specific tenant"New value: +"Omit this for the user's workspace-level choice, which answers most questions. Only pass it when you need this topic as scoped to one specific tenant."
    • Changedlist_audience_members1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedlist_audiences1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedlist_automations2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / version / description
        Previous value: -"Filter by version state"New value: +"Return only templates in this state. Omit to return every automation template regardless of state."
    • Changedlist_brands1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedlist_digest_instances2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor from a previous response"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / limit / description
        Previous value: -"Max instances to return (default 20, max 100)"New value: +"Maximum instances to return. Defaults to 20; the API caps this at 100."
    • Changedlist_lists2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / pattern / description
        Previous value: -"Filter pattern (e.g. 'example.list.*')"New value: +"Filter by list id pattern, where * matches a segment — for example \"example.list.*\". Omit to return every list."
    • Changedlist_notification_checks1 field changed
      • changedInput schema / properties / submission_id / description
        Previous value: -"The submission ID for the checks resource"New value: +"The submission ID whose checks to list"
    • Changedlist_notification_versions2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor from a previous response"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / limit / description
        Previous value: -"Max versions per page (default 10, max 10)"New value: +"Maximum versions to return per page. Defaults to 10, which is also the maximum."
    • Changedlist_notifications1 field changed
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Only return templates carrying ALL of these tags, matched case-insensitively on the tag name shown in a template's tags field (e.g. [\"onboarding\"]). Omit to list every template.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedlist_provider_catalog3 fields changed
      • changedInput schema / properties / channel / description
        Previous value: -"Filter by channel type (email, sms, push, etc.)"New value: +"Return only providers serving this channel, for example email, sms or push."
      • changedInput schema / properties / keys / description
        Previous value: -"Comma-separated provider keys to filter by"New value: +"Comma-separated provider keys to return, for example \"sendgrid,twilio\"."
      • changedInput schema / properties / name / description
        Previous value: -"Substring match on provider name"New value: +"Substring match against the provider's display name."
    • Changedlist_routing_strategies2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (default 20, max 100)"New value: +"Maximum strategies to return per page. Defaults to 20; the API caps this at 100."
    • Changedlist_tenant_users2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page (default 20, max 100)"New value: +"Maximum users to return per page. Defaults to 20; the API caps this at 100."
    • Changedlist_tenants2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Maximum tenants to return per page."
    • Changedlist_user_tenants2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Maximum tenants to return per page."
  3. 19 tool updates
    • Addedcancel_broadcast_schedule
    • Addedcreate_broadcast
    • Changedcreate_preference_topic1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "audience_id": {
        +          "description": "Optional audience the digest is scoped to",
        +          "type": "string"
        +        },
        +        "categories": {
        +          "description": "Retention rules per category key. Defaults to a single `digest` category.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "category_key": {
        +                "description": "Key identifying the category within the digest",
        +                "type": "string"
        +              },
        +              "limit": {
        +                "description": "How many collected events reach the rendered digest. Defaults to 10.",
        +                "type": "integer"
        +              },
        +              "retain": {
        +                "description": "Which collected events survive the limit",
        +                "enum": [
        +                  "FIRST",
        +                  "LAST",
        +                  "HIGHEST",
        +                  "LOWEST",
        +                  "NONE"
        +                ],
        +                "type": "string"
        +              },
        +              "sort_key": {
        +                "description": "Data key to rank events by. Required when retain is HIGHEST or LOWEST.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "category_key"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "schedules": {
        +          "description": "The cadences this digest delivers on. At least one is required.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "day_of_month": {
        +                "description": "Required when frequency is monthly",
        +                "type": "integer"
        +              },
        +              "day_of_week": {
        +                "description": "Required when frequency is weekly",
        +                "enum": [
        +                  "sunday",
        +                  "monday",
        +                  "tuesday",
        +                  "wednesday",
        +                  "thursday",
        +                  "friday",
        +                  "saturday"
        +                ],
        +                "type": "string"
        +              },
        +              "days_of_week": {
        +                "description": "Required when frequency is custom_days",
        +                "items": {
        +                  "enum": [
        +                    "sunday",
        +                    "monday",
        +                    "tuesday",
        +                    "wednesday",
        +                    "thursday",
        +                    "friday",
        +                    "saturday"
        +                  ],
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "disabled": {
        +                "description": "Whether the schedule is disabled",
        +                "type": "boolean"
        +              },
        +              "frequency": {
        +                "description": "How often the digest delivers. `instant` delivers each event immediately.",
        +                "enum": [
        +                  "instant",
        +                  "daily",
        +                  "weekdays",
        +                  "weekly",
        +                  "custom_days",
        +                  "monthly"
        +                ],
        +                "type": "string"
        +              },
        +              "is_default": {
        +                "description": "The schedule recipients are placed on when they have not chosen one",
        +                "type": "boolean"
        +              },
        +              "schedule_id": {
        +                "description": "Id of an existing schedule to update. Omit to create a new one.",
        +                "type": "string"
        +              },
        +              "time": {
        +                "description": "24-hour local delivery time, HH:MM. Required for every frequency except instant.",
        +                "type": "string"
        +              },
        +              "timezone": {
        +                "description": "IANA timezone for `time` and the day fields, e.g. America/New_York",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "frequency"
        +            ],
        +            "type": "object"
        +          },
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "template_id": {
        +          "description": "The notification template that renders the digest",
        +          "type": "string"
        +        },
        +        "trigger_empty": {
        +          "description": "Deliver the digest even when nothing was collected",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "template_id",
        +        "schedules"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off."
        +}
    • Addeddelete_broadcast
    • Addedduplicate_broadcast
    • Addedget_broadcast
    • Addedget_broadcast_content
    • Addedget_journey_run
    • Addedlist_broadcasts
    • Addedlist_journey_run_steps
    • Addedlist_journey_runs
    • Addedput_broadcast_content
    • Addedrelease_user_digest
    • Addedrename_broadcast
    • Changedreplace_preference_topic1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "audience_id": {
        +          "description": "Optional audience the digest is scoped to",
        +          "type": "string"
        +        },
        +        "categories": {
        +          "description": "Retention rules per category key. Defaults to a single `digest` category.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "category_key": {
        +                "description": "Key identifying the category within the digest",
        +                "type": "string"
        +              },
        +              "limit": {
        +                "description": "How many collected events reach the rendered digest. Defaults to 10.",
        +                "type": "integer"
        +              },
        +              "retain": {
        +                "description": "Which collected events survive the limit",
        +                "enum": [
        +                  "FIRST",
        +                  "LAST",
        +                  "HIGHEST",
        +                  "LOWEST",
        +                  "NONE"
        +                ],
        +                "type": "string"
        +              },
        +              "sort_key": {
        +                "description": "Data key to rank events by. Required when retain is HIGHEST or LOWEST.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "category_key"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "schedules": {
        +          "description": "The cadences this digest delivers on. At least one is required.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "day_of_month": {
        +                "description": "Required when frequency is monthly",
        +                "type": "integer"
        +              },
        +              "day_of_week": {
        +                "description": "Required when frequency is weekly",
        +                "enum": [
        +                  "sunday",
        +                  "monday",
        +                  "tuesday",
        +                  "wednesday",
        +                  "thursday",
        +                  "friday",
        +                  "saturday"
        +                ],
        +                "type": "string"
        +              },
        +              "days_of_week": {
        +                "description": "Required when frequency is custom_days",
        +                "items": {
        +                  "enum": [
        +                    "sunday",
        +                    "monday",
        +                    "tuesday",
        +                    "wednesday",
        +                    "thursday",
        +                    "friday",
        +                    "saturday"
        +                  ],
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "disabled": {
        +                "description": "Whether the schedule is disabled",
        +                "type": "boolean"
        +              },
        +              "frequency": {
        +                "description": "How often the digest delivers. `instant` delivers each event immediately.",
        +                "enum": [
        +                  "instant",
        +                  "daily",
        +                  "weekdays",
        +                  "weekly",
        +                  "custom_days",
        +                  "monthly"
        +                ],
        +                "type": "string"
        +              },
        +              "is_default": {
        +                "description": "The schedule recipients are placed on when they have not chosen one",
        +                "type": "boolean"
        +              },
        +              "schedule_id": {
        +                "description": "Id of an existing schedule to update. Omit to create a new one.",
        +                "type": "string"
        +              },
        +              "time": {
        +                "description": "24-hour local delivery time, HH:MM. Required for every frequency except instant.",
        +                "type": "string"
        +              },
        +              "timezone": {
        +                "description": "IANA timezone for `time` and the day fields, e.g. America/New_York",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "frequency"
        +            ],
        +            "type": "object"
        +          },
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "template_id": {
        +          "description": "The notification template that renders the digest",
        +          "type": "string"
        +        },
        +        "trigger_empty": {
        +          "description": "Deliver the digest even when nothing was collected",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "template_id",
        +        "schedules"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off."
        +}
    • Addedschedule_broadcast
    • Addedsend_broadcast
    • Addedtrace_message
    • Changedupdate_user_preference_topic2 fields changed
      • addedInput schema / properties / digest_schedule_id
        Added value: +{
        +  "description": "Put the user on one of the topic's digest schedules. Pass null to clear their choice and fall back to the default schedule.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / tenant_id
        Added value: +{
        +  "description": "Update the preference for this tenant context only",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedput_journey_template_locale5 fields changed
      • changedInput schema / properties / elements / items / properties / id / description
        Previous value: -"Target element ID to override"New value: +"Target element ID to override, from a prior get_journey_template or get_journey_template_content response. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID that owns this notification"New value: +"The journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / state / description
        Previous value: -"Template state after update"New value: +"Template state after update. Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
  5. 20 tool updates
    • Changedcreate_journey_template2 fields changed
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID"New value: +"The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification / properties / content / properties / elements / description
        Previous value: -"Elemental content nodes"New value: +"Elemental content nodes. Must be wrapped in a channel block — the API rejects bare elements. Example: [{ type: \"channel\", channel: \"email\", elements: [{ type: \"text\", content: \"Hello!\" }] }]."
    • Changedcreate_notification16 fields changed
      • changedInput schema / properties / notification / properties / brand / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / notification / properties / brand / description
        Added value: +"Brand to apply, or null for none. Required on every call — never omit this key, and never send {}."
      • addedInput schema / properties / notification / properties / content / additionalProperties
        Added value: +false
      • addedInput schema / properties / notification / properties / content / description
        Added value: +"Elemental content, required on every call. Example: { version: \"2022-01-01\", elements: [{ type: \"text\", content: \"Hello!\" }] }."
      • addedInput schema / properties / notification / properties / content / properties
        Added value: +{
        +  "elements": {
        +    "description": "Elemental content nodes",
        +    "items": {
        +      "additionalProperties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "version": {
        +    "description": "Content version identifier, e.g. \"2022-01-01\"",
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / notification / properties / content / required
        Added value: +[
        +  "version",
        +  "elements"
        +]
      • addedInput schema / properties / notification / properties / content / type
        Added value: +"object"
      • addedInput schema / properties / notification / properties / name / description
        Added value: +"Template display name"
      • changedInput schema / properties / notification / properties / routing / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "strategy_id": {
        +        "description": "From a get_routing_strategy or list_notifications/get_notification response for THIS template's own intended strategy — never an id borrowed from an unrelated template found while searching for one.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "strategy_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / notification / properties / routing / description
        Added value: +"Routing strategy reference, or null to use the workspace default. Required on every call — never omit this key, and never send {}: the API rejects both an absent routing key and an empty object; if you have no strategy id, send null explicitly."
      • changedInput schema / properties / notification / properties / subscription / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "topic_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "topic_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / notification / properties / subscription / description
        Added value: +"Subscription topic reference, or null for none. Required on every call — never omit this key, and never send {}."
      • addedInput schema / properties / notification / properties / tags / description
        Added value: +"Tag list (use [] if none)"
      • changedInput schema / properties / notification / required
        Previous value: -[
        -  "name",
        -  "tags"
        -]New value: +[
        +  "name",
        +  "tags",
        +  "brand",
        +  "subscription",
        +  "routing",
        +  "content"
        +]
      • changedInput schema / properties / state / description
        Previous value: -"Template state after creation (defaults to DRAFT)"New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
    • Changedget_journey1 field changed
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID"New value: +"The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedget_journey_template2 fields changed
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID that owns this notification"New value: +"The journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedget_journey_template_content2 fields changed
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID that owns this notification"New value: +"The journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedget_notification2 fields changed
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / version / description
        Previous value: -"Version to retrieve: draft, published, or a string like v001"New value: +"Version to retrieve: \"draft\", \"published\" (default — omit this to get it), or a version string like \"v001\""
    • Changedget_notification_content1 field changed
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedget_notification_draft_content1 field changed
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedget_user_preferences1 field changed
      • changedInput schema / properties / tenant_id / description
        Previous value: -"Scope preferences to a specific tenant"New value: +"Omit this to get the user's workspace-level preferences — that answers most preference questions. Only pass it when you need the tenant-scoped overrides for one specific tenant instead."
    • Changedlist_journey_templates2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"Check the response's paging.more before calling again — false means every template already came back, and calling again with the same arguments returns the same page, not new data. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID"New value: +"The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedlist_journeys2 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"If a response has no cursor, every journey already came back — calling this again with the same arguments returns the same page, not new data. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
      • changedInput schema / properties / version / description
        Previous value: -"Filter by version state. Defaults to published."New value: +"Filter by version state. Defaults to published, and the two are never combined in one call. If you don't know whether the journey you want is published or still a draft, calling this twice — once per value — is the correct way to check both, not a repeat."
    • Changedlist_messages2 fields changed
      • changedInput schema / properties / archived / description
        Previous value: -"Include archived messages"New value: +"This NARROWS, it does not widen: true returns ONLY archived messages, excluding every active one. Omit it entirely to search active messages — the default view for a normal delivery question. Setting it true is not the thorough or safe choice; it is a different, much smaller result set."
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor for fetching the next page"New value: +"For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedlist_notifications1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedlist_providers1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor"New value: +"This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have one from a prior response of this exact call."
    • Changedput_journey_template_content3 fields changed
      • changedInput schema / properties / elements / description
        Previous value: -"Array of elemental content nodes"New value: +"Array of elemental content nodes. Likely must be wrapped in a channel block, the same way create_journey_template's content requires — not independently confirmed for this call, but they write the same field. Example: [{ type: \"channel\", channel: \"email\", elements: [{ type: \"text\", content: \"Hello!\" }] }]."
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID that owns this notification"New value: +"The journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID"New value: +"The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedput_notification_content4 fields changed
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID (nt_ prefix)"New value: +"The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / state / description
        Previous value: -"Template state after update"New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
      • changedInput schema / properties / version / description
        Previous value: -"Content version string"New value: +"Content version string (e.g. \"2022-01-01\"). Server defaults when omitted."
    • Changedput_notification_element4 fields changed
      • changedInput schema / properties / element_id / description
        Previous value: -"The element ID to update"New value: +"The element ID to update, from a prior get_notification or get_notification_draft_content response. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID (nt_ prefix)"New value: +"The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / state / description
        Previous value: -"Template state after update"New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
    • Changedput_notification_locale4 fields changed
      • changedInput schema / properties / elements / items / properties / id / description
        Previous value: -"Target element ID to override"New value: +"Target element ID to override, from a prior get_notification or get_notification_draft_content response. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID (nt_ prefix)"New value: +"The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / state / description
        Previous value: -"Template state after update"New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
    • Changedreplace_journey1 field changed
      • changedInput schema / properties / journey_id / description
        Previous value: -"The journey template ID to update"New value: +"The journey template ID to update. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
    • Changedreplace_notification17 fields changed
      • changedInput schema / properties / notification / properties / brand / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / notification / properties / brand / description
        Added value: +"Brand to apply, or null for none. Required on every call — never omit this key, and never send {}."
      • addedInput schema / properties / notification / properties / content / additionalProperties
        Added value: +false
      • addedInput schema / properties / notification / properties / content / description
        Added value: +"Elemental content, required on every call. Example: { version: \"2022-01-01\", elements: [{ type: \"text\", content: \"Hello!\" }] }."
      • addedInput schema / properties / notification / properties / content / properties
        Added value: +{
        +  "elements": {
        +    "description": "Elemental content nodes",
        +    "items": {
        +      "additionalProperties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "version": {
        +    "description": "Content version identifier, e.g. \"2022-01-01\"",
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / notification / properties / content / required
        Added value: +[
        +  "version",
        +  "elements"
        +]
      • addedInput schema / properties / notification / properties / content / type
        Added value: +"object"
      • addedInput schema / properties / notification / properties / name / description
        Added value: +"Template display name"
      • changedInput schema / properties / notification / properties / routing / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "strategy_id": {
        +        "description": "From a get_routing_strategy or list_notifications/get_notification response for THIS template's own intended strategy — never an id borrowed from an unrelated template found while searching for one.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "strategy_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / notification / properties / routing / description
        Added value: +"Routing strategy reference, or null to use the workspace default. Required on every call — never omit this key, and never send {}: the API rejects both an absent routing key and an empty object; if you have no strategy id, send null explicitly."
      • changedInput schema / properties / notification / properties / subscription / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "topic_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "topic_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / notification / properties / subscription / description
        Added value: +"Subscription topic reference, or null for none. Required on every call — never omit this key, and never send {}."
      • addedInput schema / properties / notification / properties / tags / description
        Added value: +"Tag list (use [] if none)"
      • changedInput schema / properties / notification / required
        Previous value: -[
        -  "name",
        -  "tags"
        -]New value: +[
        +  "name",
        +  "tags",
        +  "brand",
        +  "subscription",
        +  "routing",
        +  "content"
        +]
      • changedInput schema / properties / notification_id / description
        Previous value: -"The notification template ID to replace"New value: +"The notification template ID to replace. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
      • changedInput schema / properties / state / description
        Previous value: -"Template state after update (defaults to DRAFT)"New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
  6. 1 tool update
    • Addedget_notification_metrics
  7. 4 tool updates
    • Changedcreate_or_update_tenant5 fields changed
      • addedInput schema / properties / default_preferences / additionalProperties
        Added value: +false
      • changedInput schema / properties / default_preferences / description
        Previous value: -"Default notification preferences for users in this tenant"New value: +"Default notification preferences applied to users in this tenant. Example: { \"items\": [{ \"id\": \"topic_abc\", \"status\": \"OPTED_IN\", \"type\": \"subscription_topic\" }] }"
      • addedInput schema / properties / default_preferences / properties
        Added value: +{
        +  "items": {
        +    "description": "One entry per subscription topic",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "custom_routing": {
        +          "description": "Channels this topic delivers on when has_custom_routing is true",
        +          "items": {
        +            "enum": [
        +              "direct_message",
        +              "email",
        +              "push",
        +              "sms",
        +              "webhook",
        +              "inbox"
        +            ],
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "has_custom_routing": {
        +          "description": "Whether custom_routing overrides the topic's default channels",
        +          "type": "boolean"
        +        },
        +        "id": {
        +          "description": "Subscription topic ID this default applies to",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Default status for the topic. \"REQUIRED\" prevents users from opting out",
        +          "enum": [
        +            "OPTED_IN",
        +            "OPTED_OUT",
        +            "REQUIRED"
        +          ],
        +          "type": "string"
        +        },
        +        "type": {
        +          "const": "subscription_topic",
        +          "description": "Always \"subscription_topic\" when provided",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "status"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedInput schema / properties / default_preferences / required
        Added value: +[
        +  "items"
        +]
      • addedInput schema / properties / default_preferences / type
        Added value: +"object"
    • Changedreplace_journey1 field changed
      • changedInput schema / properties / nodes / description
        Previous value: -"Complete array of journey nodes: the trigger first, a terminal exit last, and everything else between them. Use server-assigned node ids from get_journey — do NOT invent new ids. Send node example: { type: \"send\", message: { template: \"nt_journey_1\" } } — the template goes inside message, never at node level, and the id is a journey-scoped one returned by create_journey_template rather than a workspace template id. Delay node example: { type: \"delay\", mode: \"duration\", duration: \"PT1H\" }. Branch node example: { type: \"branch\", paths: [{ conditions: [\"data.plan\", \"is equal\", \"pro\"], nodes: [] }], default: { nodes: [] } } — paths and default are both required, and the key inside a path is \"conditions\", not \"condition\"."New value: +"Complete array of journey nodes: the trigger first, a terminal exit last, and everything else between them. Use server-assigned node ids from get_journey — do NOT invent new ids. Send node example: { type: \"send\", channel: \"email\", message: { template: \"nt_journey_1\" } } — the template goes inside message, never at node level, and the id is a journey-scoped one returned by create_journey_template rather than a workspace template id. Copy that id character-for-character from the create_journey_template or get_journey response you got it from — never retype or reconstruct it from memory, since a single dropped or altered character produces a different, non-existent id and the reference silently fails to resolve. channel must always be set to one of \"email\", \"sms\", \"push\", \"inbox\", \"slack\", or \"msteams\" on every send node — do not omit it even though the field is optional. An unset channel makes Studio silently render the node as email: for sms, push, and inbox sends this means the wrong title, an Email Address field shown instead of the real recipient field, no provider picker, and a hard-blocked \"+Create message\" button, with nothing shown to warn the user. The stored recipient data is not lost and delivery is not affected — this only breaks how the journey looks and works for a human editing it in Studio. Delay node example: { type: \"delay\", mode: \"duration\", duration: \"PT1H\" }. Branch node example: { type: \"branch\", paths: [{ conditions: [\"data.plan\", \"is equal\", \"pro\"], nodes: [] }], default: { nodes: [] } } — paths and default are both required, and the key inside a path is \"conditions\", not \"condition\"."
    • Changedreplace_tenant_template17 fields changed
      • addedInput schema / properties / channels / additionalProperties
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "brand_id": {
        +      "description": "Brand applied when delivering on this channel",
        +      "type": "string"
        +    },
        +    "if": {
        +      "description": "Expression; the channel is used only when truthy",
        +      "type": "string"
        +    },
        +    "metadata": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "utm": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "campaign": {
        +              "type": "string"
        +            },
        +            "content": {
        +              "type": "string"
        +            },
        +            "medium": {
        +              "type": "string"
        +            },
        +            "source": {
        +              "type": "string"
        +            },
        +            "term": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "override": {
        +      "additionalProperties": {},
        +      "description": "Channel-specific overrides, e.g. email subject/from or push title/icon",
        +      "type": "object"
        +    },
        +    "providers": {
        +      "description": "Providers eligible for this channel, in preference order",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "routing_method": {
        +      "description": "\"all\" delivers via every provider; \"single\" stops after the first success",
        +      "enum": [
        +        "all",
        +        "single"
        +      ],
        +      "type": "string"
        +    },
        +    "timeouts": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "channel": {
        +          "description": "Whole-channel timeout in ms",
        +          "type": "number"
        +        },
        +        "provider": {
        +          "description": "Per-provider timeout in ms",
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / channels / description
        Previous value: -"Channel-specific delivery configuration"New value: +"Per-channel delivery configuration, keyed by channel name. Example: { \"email\": { \"providers\": [\"sendgrid\"], \"routing_method\": \"single\" } }"
      • addedInput schema / properties / channels / type
        Added value: +"object"
      • addedInput schema / properties / content / additionalProperties
        Added value: +false
      • changedInput schema / properties / content / description
        Previous value: -"Elemental content object (e.g. elements and version per Courier Elemental schema)"New value: +"Elemental content document. Example: { \"version\": \"2022-01-01\", \"elements\": [{ \"type\": \"meta\", \"title\": \"Welcome\" }, { \"type\": \"text\", \"content\": \"Thanks for signing up.\" }] }"
      • addedInput schema / properties / content / properties
        Added value: +{
        +  "brand": {
        +    "additionalProperties": {},
        +    "description": "Inline brand overrides",
        +    "type": "object"
        +  },
        +  "elements": {
        +    "description": "Elemental nodes. Channel and group containers nest to any depth",
        +    "items": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "channels": {
        +                  "description": "Restrict this element to these channels",
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "content": {
        +                  "description": "The text to render",
        +                  "type": "string"
        +                },
        +                "format": {
        +                  "const": "markdown",
        +                  "description": "Set to \"markdown\" to render markdown",
        +                  "type": "string"
        +                },
        +                "if": {
        +                  "description": "Expression; the element renders only when truthy",
        +                  "type": "string"
        +                },
        +                "loop": {
        +                  "description": "Expression resolving to a list to repeat this element over",
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Reference name for this element",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "text",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "content"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "channels": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +                },
        +                "if": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +                },
        +                "loop": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +                },
        +                "ref": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +                },
        +                "title": {
        +                  "description": "Message title (email subject, push title, etc.)",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "meta",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "align": {
        +                  "enum": [
        +                    "center",
        +                    "left",
        +                    "right",
        +                    "full"
        +                  ],
        +                  "type": "string"
        +                },
        +                "altText": {
        +                  "type": "string"
        +                },
        +                "channels": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +                },
        +                "href": {
        +                  "description": "Link the image points to",
        +                  "type": "string"
        +                },
        +                "if": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +                },
        +                "loop": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +                },
        +                "ref": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +                },
        +                "src": {
        +                  "description": "Image URL",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "image",
        +                  "type": "string"
        +                },
        +                "width": {
        +                  "description": "Rendered width, e.g. \"300px\"",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "src"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "actionId": {
        +                  "type": "string"
        +                },
        +                "align": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/2/properties/align"
        +                },
        +                "backgroundColor": {
        +                  "type": "string"
        +                },
        +                "channels": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +                },
        +                "content": {
        +                  "description": "Button or link label",
        +                  "type": "string"
        +                },
        +                "href": {
        +                  "description": "URL the action opens",
        +                  "type": "string"
        +                },
        +                "if": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +                },
        +                "loop": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +                },
        +                "ref": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +                },
        +                "style": {
        +                  "enum": [
        +                    "button",
        +                    "link"
        +                  ],
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "action",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "content",
        +                "href"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "channels": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +                },
        +                "color": {
        +                  "type": "string"
        +                },
        +                "if": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +                },
        +                "loop": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +                },
        +                "ref": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +                },
        +                "type": {
        +                  "const": "divider",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "align": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/2/properties/align"
        +                },
        +                "borderColor": {
        +                  "type": "string"
        +                },
        +                "channels": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +                },
        +                "content": {
        +                  "type": "string"
        +                },
        +                "if": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +                },
        +                "loop": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +                },
        +                "ref": {
        +                  "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +                },
        +                "textStyle": {
        +                  "enum": [
        +                    "text",
        +                    "h1",
        +                    "h2",
        +                    "subtext"
        +                  ],
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "quote",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "content"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "channel": {
        +              "description": "Channel these elements target, e.g. \"email\", \"push\", \"inbox\"",
        +              "type": "string"
        +            },
        +            "channels": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +            },
        +            "elements": {
        +              "description": "Elements rendered for this channel",
        +              "items": {
        +                "$ref": "#/properties/content/properties/elements/items"
        +              },
        +              "type": "array"
        +            },
        +            "if": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +            },
        +            "loop": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +            },
        +            "raw": {
        +              "additionalProperties": {},
        +              "description": "Channel-native payload passed through untouched",
        +              "type": "object"
        +            },
        +            "ref": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +            },
        +            "type": {
        +              "const": "channel",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "type",
        +            "channel"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "channels": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/channels"
        +            },
        +            "elements": {
        +              "description": "Grouped elements",
        +              "items": {
        +                "$ref": "#/properties/content/properties/elements/items"
        +              },
        +              "type": "array"
        +            },
        +            "if": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/if"
        +            },
        +            "loop": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/loop"
        +            },
        +            "ref": {
        +              "$ref": "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/properties/ref"
        +            },
        +            "type": {
        +              "const": "group",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "type",
        +            "elements"
        +          ],
        +          "type": "object"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  "version": {
        +    "const": "2022-01-01",
        +    "description": "Elemental schema version",
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / content / required
        Added value: +[
        +  "version",
        +  "elements"
        +]
      • addedInput schema / properties / content / type
        Added value: +"object"
      • addedInput schema / properties / providers / additionalProperties
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "if": {
        +      "description": "Expression; the provider is used only when truthy",
        +      "type": "string"
        +    },
        +    "override": {
        +      "additionalProperties": {},
        +      "description": "Provider-native payload fields merged into the request",
        +      "type": "object"
        +    },
        +    "timeouts": {
        +      "description": "Provider timeout in ms",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / providers / description
        Previous value: -"Provider-specific routing configuration"New value: +"Per-provider configuration, keyed by provider name. Example: { \"sendgrid\": { \"override\": { \"from\": \"noreply@example.com\" } } }"
      • addedInput schema / properties / providers / type
        Added value: +"object"
      • addedInput schema / properties / routing / additionalProperties
        Added value: +false
      • changedInput schema / properties / routing / description
        Previous value: -"Message routing configuration"New value: +"Message routing tree. Example: { \"method\": \"single\", \"channels\": [\"email\", \"sms\"] }"
      • addedInput schema / properties / routing / properties
        Added value: +{
        +  "channels": {
        +    "description": "Channels to attempt, in order. Entries may be names or config objects",
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "channel": {
        +              "description": "Channel name",
        +              "type": "string"
        +            },
        +            "config": {
        +              "additionalProperties": {},
        +              "type": "object"
        +            },
        +            "if": {
        +              "type": "string"
        +            },
        +            "method": {
        +              "enum": [
        +                "all",
        +                "single"
        +              ],
        +              "type": "string"
        +            },
        +            "providers": {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "config": {
        +                        "additionalProperties": {},
        +                        "type": "object"
        +                      },
        +                      "if": {
        +                        "type": "string"
        +                      },
        +                      "metadata": {
        +                        "additionalProperties": false,
        +                        "properties": {
        +                          "utm": {
        +                            "$ref": "#/properties/channels/additionalProperties/properties/metadata/properties/utm"
        +                          }
        +                        },
        +                        "type": "object"
        +                      },
        +                      "name": {
        +                        "description": "Provider name",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "name"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "type": "string"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "channel"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "$ref": "#/properties/routing/properties/channels/items/anyOf/1/properties/providers/items/anyOf/0"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  "method": {
        +    "description": "\"all\" delivers to every channel; \"single\" stops after the first success",
        +    "enum": [
        +      "all",
        +      "single"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / routing / required
        Added value: +[
        +  "method",
        +  "channels"
        +]
      • addedInput schema / properties / routing / type
        Added value: +"object"
      • changedInput schema / required
        Previous value: -[
        -  "tenant_id",
        -  "template_id"
        -]New value: +[
        +  "tenant_id",
        +  "template_id",
        +  "content"
        +]
    • Changedupdate_audience2 fields changed
      • addedInput schema / properties / filter / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "A single condition evaluated against one user profile field",
        +    "properties": {
        +      "operator": {
        +        "description": "Comparison to apply, e.g. \"EQ\", \"INCLUDES\", \"IS_AFTER\"",
        +        "enum": [
        +          "ENDS_WITH",
        +          "EQ",
        +          "EXISTS",
        +          "GT",
        +          "GTE",
        +          "INCLUDES",
        +          "IS_AFTER",
        +          "IS_BEFORE",
        +          "LT",
        +          "LTE",
        +          "MEMBER_OF",
        +          "NEQ",
        +          "OMIT",
        +          "STARTS_WITH"
        +        ],
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Dot-notation path into the user profile, e.g. \"title\" or \"location.city\"",
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "Value to compare against. Omit for existence checks like \"EXISTS\"",
        +        "type": [
        +          "string",
        +          "number",
        +          "boolean"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "operator",
        +      "path"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A group combining nested filters with AND/OR",
        +    "properties": {
        +      "filters": {
        +        "description": "Conditions and/or nested groups to combine",
        +        "items": {
        +          "$ref": "#/properties/filter"
        +        },
        +        "type": "array"
        +      },
        +      "operator": {
        +        "description": "How the nested filters combine. The combinator lives on the group itself",
        +        "enum": [
        +          "AND",
        +          "OR"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "operator",
        +      "filters"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / filter / description
        Previous value: -"Filter definition object (operator, rules)"New value: +"Audience membership filter. Either a single condition ({ operator, path, value }) or a group ({ operator: \"AND\" | \"OR\", filters: [...] }) nesting to any depth. Example: { \"operator\": \"AND\", \"filters\": [{ \"operator\": \"EQ\", \"path\": \"title\", \"value\": \"Engineer\" }, { \"operator\": \"INCLUDES\", \"path\": \"tags\", \"value\": \"beta\" }] }"
  8. 2 tool updates
    • Changedcreate_journey1 field changed
      • changedInput schema / properties / nodes / description
        Previous value: -"Array of journey node objects. Node ids are server-generated — do NOT include an id field. Trigger node example: { type: \"trigger\", trigger_type: \"api-invoke\" }. Send node example: { type: \"send\", template: \"nt_abc\" }. Delay node example: { type: \"delay\", mode: \"duration\", duration: \"PT1H\" }."New value: +"The trigger node, then a terminal exit node — both required. Send and delay nodes are added later by replace_journey. Node ids are server-generated — do NOT include an id field. Example: [{ type: \"trigger\", trigger_type: \"api-invoke\" }, { type: \"exit\" }]."
    • Changedreplace_journey1 field changed
      • changedInput schema / properties / nodes / description
        Previous value: -"Complete array of journey nodes. Use server-assigned node ids from get_journey — do NOT invent new ids. Each node requires type plus type-specific fields."New value: +"Complete array of journey nodes: the trigger first, a terminal exit last, and everything else between them. Use server-assigned node ids from get_journey — do NOT invent new ids. Send node example: { type: \"send\", message: { template: \"nt_journey_1\" } } — the template goes inside message, never at node level, and the id is a journey-scoped one returned by create_journey_template rather than a workspace template id. Delay node example: { type: \"delay\", mode: \"duration\", duration: \"PT1H\" }. Branch node example: { type: \"branch\", paths: [{ conditions: [\"data.plan\", \"is equal\", \"pro\"], nodes: [] }], default: { nodes: [] } } — paths and default are both required, and the key inside a path is \"conditions\", not \"condition\"."
  9. 4 tool updates
    • Changedcreate_journey2 fields changed
      • changedInput schema / properties / state / description
        Previous value: -"Create as DRAFT (default) or PUBLISHED immediately."New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
    • Changedcreate_journey_template2 fields changed
      • changedInput schema / properties / state / description
        Previous value: -"Initial state: \"DRAFT\" (default) or \"PUBLISHED\""New value: +"Must be \"DRAFT\". These tools cannot publish."
      • addedInput schema / properties / state / enum
        Added value: +[
        +  "DRAFT"
        +]
    • Changedput_journey_template_content2 fields changed
      • changedInput schema / properties / state / description
        Previous value: -"Template state after update"New value: +"Template state after update. Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
    • Changedreplace_journey2 fields changed
      • changedInput schema / properties / state / description
        Previous value: -"Set to PUBLISHED to publish immediately after replace."New value: +"Must be \"DRAFT\". These tools cannot publish."
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "DRAFT",
        -  "PUBLISHED"
        -]New value: +[
        +  "DRAFT"
        +]
  10. 21 tool updates
    • Addedarchive_preference_section
    • Addedarchive_preference_topic
    • Addedbulk_replace_user_preferences
    • Addedbulk_update_user_preferences
    • Addedcancel_journey
    • Addedcreate_preference_section
    • Addedcreate_preference_topic
    • Addeddelete_user_preference_topic
    • Addedget_journey_template_content
    • Addedget_preference_section
    • Addedget_preference_topic
    • Addedlist_digest_instances
    • Addedlist_preference_sections
    • Addedlist_preference_topics
    • Addedpublish_preferences
    • Addedput_journey_template_content
    • Addedput_journey_template_locale
    • Addedrelease_digest
    • Addedreplace_preference_section
    • Addedreplace_preference_topic
    • Addedresend_message
  11. 18 tool updates
    • Addedarchive_journey
    • Addedarchive_journey_template
    • Addedcancel_automation
    • Changedcreate_brand7 fields changed
      • changedInput schema / properties / settings / description
        Previous value: -"Brand settings (colors, email, inapp)"New value: +"Brand appearance settings. If omitted, defaults to { colors: { primary: \"#000000\", secondary: \"#ffffff\" } }."
      • changedInput schema / properties / settings / properties / colors / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / settings / properties / colors / description
        Added value: +"Brand colors"
      • addedInput schema / properties / settings / properties / colors / properties
        Added value: +{
        +  "primary": {
        +    "description": "Primary brand color (hex, e.g. \"#1a73e8\")",
        +    "type": "string"
        +  },
        +  "secondary": {
        +    "description": "Secondary brand color (hex, e.g. \"#ffffff\")",
        +    "type": "string"
        +  },
        +  "tertiary": {
        +    "description": "Tertiary brand color (hex)",
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / settings / properties / colors / required
        Added value: +[
        +  "primary",
        +  "secondary"
        +]
      • addedInput schema / properties / settings / properties / email / description
        Added value: +"Email template settings (header, footer)"
      • addedInput schema / properties / settings / properties / inapp / description
        Added value: +"In-app notification settings"
    • Addedcreate_journey
    • Addedcreate_journey_template
    • Addeddelete_tenant_template
    • Addedget_journey
    • Addedget_journey_template
    • Changedinvoke_ad_hoc_automation4 fields changed
      • changedInput schema / properties / automation / description
        Previous value: -"The automation definition"New value: +"The automation definition with typed steps"
      • changedInput schema / properties / automation / properties / cancelation_token / description
        Previous value: -"Token for cancelling the automation"New value: +"Token for cancelling this automation later (single \"l\" spelling)"
      • changedInput schema / properties / automation / properties / steps / description
        Previous value: -"Array of automation step objects"New value: +"Ordered array of automation steps"
      • addedInput schema / properties / automation / properties / steps / items
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "send",
        +          "type": "string"
        +        },
        +        "brand": {
        +          "type": "string"
        +        },
        +        "data": {
        +          "additionalProperties": {},
        +          "type": "object"
        +        },
        +        "if": {
        +          "description": "Condition expression",
        +          "type": "string"
        +        },
        +        "profile": {
        +          "additionalProperties": {},
        +          "type": "object"
        +        },
        +        "recipient": {
        +          "type": "string"
        +        },
        +        "template": {
        +          "description": "Notification template ID or key",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "send-list",
        +          "type": "string"
        +        },
        +        "brand": {
        +          "type": "string"
        +        },
        +        "data": {
        +          "additionalProperties": {},
        +          "type": "object"
        +        },
        +        "if": {
        +          "type": "string"
        +        },
        +        "list": {
        +          "description": "List ID to send to",
        +          "type": "string"
        +        },
        +        "template": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action",
        +        "list"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "delay",
        +          "type": "string"
        +        },
        +        "duration": {
        +          "description": "ISO 8601 duration (e.g. \"PT1H\" for 1 hour)",
        +          "type": "string"
        +        },
        +        "if": {
        +          "type": "string"
        +        },
        +        "until": {
        +          "description": "ISO 8601 timestamp to wait until",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "cancel",
        +          "type": "string"
        +        },
        +        "cancelation_token": {
        +          "description": "The token set when the original automation was invoked (single \"l\" spelling)",
        +          "type": "string"
        +        },
        +        "if": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action",
        +        "cancelation_token"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "update-profile",
        +          "type": "string"
        +        },
        +        "if": {
        +          "type": "string"
        +        },
        +        "merge": {
        +          "enum": [
        +            "none",
        +            "overwrite",
        +            "soft-merge",
        +            "replace"
        +          ],
        +          "type": "string"
        +        },
        +        "profile": {
        +          "additionalProperties": {},
        +          "type": "object"
        +        },
        +        "recipient_id": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "invoke",
        +          "type": "string"
        +        },
        +        "if": {
        +          "type": "string"
        +        },
        +        "template": {
        +          "description": "Automation template ID to invoke",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action",
        +        "template"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "action": {
        +          "const": "fetch-data",
        +          "type": "string"
        +        },
        +        "if": {
        +          "type": "string"
        +        },
        +        "merge_strategy": {
        +          "enum": [
        +            "replace",
        +            "overwrite",
        +            "soft-merge"
        +          ],
        +          "type": "string"
        +        },
        +        "webhook": {
        +          "additionalProperties": false,
        +          "description": "HTTP request configuration",
        +          "properties": {
        +            "body": {
        +              "additionalProperties": {},
        +              "type": "object"
        +            },
        +            "headers": {
        +              "additionalProperties": {
        +                "type": "string"
        +              },
        +              "type": "object"
        +            },
        +            "method": {
        +              "enum": [
        +                "GET",
        +                "POST",
        +                "PUT",
        +                "PATCH"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "url"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "action",
        +        "webhook"
        +      ],
        +      "type": "object"
        +    }
        +  ]
        +}
    • Addedlist_journey_template_versions
    • Addedlist_journey_templates
    • Addedlist_journey_versions
    • Addedpublish_journey
    • Addedpublish_journey_template
    • Addedreplace_journey
    • Addedreplace_journey_template
    • Changedupdate_tenant_preference1 field changed
      • changedInput schema / properties / topic_id / description
        Previous value: -"The subscription topic ID"New value: +"The subscription topic ID — must already exist in the workspace. A 404 response means the topic does not exist; create it in the Preferences Editor first."
  12. 49 tool updates
    • Addedadd_subscribers_to_list
    • Addedarchive_notification
    • Addedarchive_request
    • Addedarchive_routing_strategy
    • Addedbulk_add_user_tenants
    • Addedbulk_add_user_tokens
    • Addedbulk_subscribe_to_list
    • Addedcancel_notification_submission
    • Addedcreate_notification
    • Addedcreate_provider
    • Addedcreate_routing_strategy
    • Addeddelete_brand
    • Addeddelete_list
    • Addeddelete_provider
    • Addeddelete_tenant_preference
    • Addeddelete_user_token
    • Addedget_notification
    • Addedget_provider
    • Addedget_routing_strategy
    • Addedget_tenant_template
    • Addedget_tenant_template_version
    • Addedget_user_preference_topic
    • Addedinvoke_journey
    • Addedlist_automations
    • Addedlist_journeys
    • Addedlist_notification_checks
    • Addedlist_notification_versions
    • Addedlist_provider_catalog
    • Addedlist_providers
    • Addedlist_routing_strategies
    • Addedlist_routing_strategy_notifications
    • Addedlist_tenant_templates
    • Addedlist_tenant_users
    • Addedpatch_profile
    • Addedpatch_user_token
    • Addedpublish_notification
    • Addedpublish_tenant_template
    • Addedput_notification_content
    • Addedput_notification_element
    • Addedput_notification_locale
    • Addedremove_all_user_tenants
    • Addedreplace_notification
    • Addedreplace_routing_strategy
    • Addedreplace_tenant_template
    • Addedrestore_list
    • Addedupdate_brand
    • Addedupdate_notification_checks
    • Addedupdate_provider
    • Addedupdate_tenant_preference
  13. 59 tool updates
    • First observedadd_bulk_users
    • First observedadd_user_to_tenant
    • First observedcancel_message
    • First observedcourier_installation_guide
    • First observedcreate_brand
    • First observedcreate_bulk_job
    • First observedcreate_list
    • First observedcreate_or_merge_user
    • First observedcreate_or_replace_user_push_token
    • First observedcreate_or_update_tenant
    • First observeddelete_audience
    • First observeddelete_profile
    • First observeddelete_tenant
    • First observeddelete_user_list_subscriptions
    • First observedgenerate_jwt_for_user
    • First observedget_audience
    • First observedget_audit_event
    • First observedget_brand
    • First observedget_bulk_job
    • First observedget_list
    • First observedget_list_subscribers
    • First observedget_message
    • First observedget_message_content
    • First observedget_message_history
    • First observedget_notification_content
    • First observedget_notification_draft_content
    • First observedget_tenant
    • First observedget_translation
    • First observedget_user_list_subscriptions
    • First observedget_user_preferences
    • First observedget_user_profile_by_id
    • First observedget_user_push_token
    • First observedinvoke_ad_hoc_automation
    • First observedinvoke_automation_template
    • First observedlist_audience_members
    • First observedlist_audiences
    • First observedlist_audit_events
    • First observedlist_brands
    • First observedlist_bulk_users
    • First observedlist_lists
    • First observedlist_messages
    • First observedlist_notifications
    • First observedlist_tenants
    • First observedlist_user_push_tokens
    • First observedlist_user_tenants
    • First observedremove_user_from_tenant
    • First observedreplace_profile
    • First observedrun_bulk_job
    • First observedsend_message
    • First observedsend_message_template
    • First observedsend_message_to_list
    • First observedsend_message_to_list_template
    • First observedsubscribe_user_to_list
    • First observedsubscribe_user_to_lists
    • First observedtrack_inbound_event
    • First observedunsubscribe_user_from_list
    • First observedupdate_audience
    • First observedupdate_translation
    • First observedupdate_user_preference_topic

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Manage your entire notification infrastructure using natural language. Trigger workflows, create users, manage preferences, update tenant branding, and access docs — all from Cursor, Claude Desktop, or Windsurf. 24 tools covering email, SMS, push, WhatsApp, Slack, MS Teams, and in-app notifications.
    22
    12
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables sending emails (including mass emailing), querying, updating, and canceling delayed emails via the Resend API.
    -
  • A
    license
    B
    quality
    C
    maintenance
    Manages SendGrid email workflows including design library, transactional templates, marketing contacts and lists, single sends, and direct email sends via the SendGrid v3 API.
    80
    250 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources