How to fix: On each tool, declare annotations.readOnlyHint, annotations.destructiveHint, and annotations.openWorldHint as booleans. The policy review separately assesses whether their values match the tool's actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
List messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.
Describe the returned information so the agent knows whether it will answer the request.
Inputs73/100
Explain the meaning of this value, not just its name.
cursor
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.
Clear enough to supply this argument.
event
Filter by event ID
Explain the meaning of this value, not just its name.
list
Filter by list ID
Explain the meaning of this value, not just its name.
messageId
Filter by message ID
Explain the meaning of this value, not just its name.
notification
Filter by notification ID
Explain the meaning of this value, not just its name.
recipient
Filter by recipient user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
status
Filter by status (e.g. DELIVERED, UNDELIVERABLE)
Clear enough to supply this argument.
tag
Filter by metadata tags
Clear enough to supply this argument.
tags
Comma-delimited list of tags
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tenant_id
Filter by tenant ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
traceId
Filter by trace ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
enqueued_after
ISO 8601 timestamp; only return messages enqueued after this time
Clear enough to supply this argument.
provider
Filter by provider key (e.g. sendgrid, twilio)
Clear enough to supply this argument.
archived
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_messages",
"description": "List messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"tag": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by metadata tags"
},
"list": {
"type": "string",
"description": "Filter by list ID"
},
"tags": {
"type": "string",
"description": "Comma-delimited list of tags"
},
"event": {
"type": "string",
"description": "Filter by event ID"
},
"cursor": {
"type": "string",
"description": "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."
},
"status": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by status (e.g. DELIVERED, UNDELIVERABLE)"
},
"traceId": {
"type": "string",
"description": "Filter by trace ID"
},
"archived": {
"type": "boolean",
"description": "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."
},
"provider": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by provider key (e.g. sendgrid, twilio)"
},
"messageId": {
"type": "string",
"description": "Filter by message ID"
},
"recipient": {
"type": "string",
"description": "Filter by recipient user ID"
},
"tenant_id": {
"type": "string",
"description": "Filter by tenant ID"
},
"notification": {
"type": "string",
"description": "Filter by notification ID"
},
"enqueued_after": {
"type": "string",
"description": "ISO 8601 timestamp; only return messages enqueued after this time"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Messages",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Get the full details and status of a single message by its ID.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
message_id
The message ID to retrieve
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get Message",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_message",
"description": "Get the full details and status of a single message by its ID.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"message_id"
],
"properties": {
"message_id": {
"type": "string",
"description": "The message ID to retrieve"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Message",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
List notification templates, newest first. Pass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
cursor
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.
Clear enough to supply this argument.
tags
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_notifications",
"description": "List notification templates, newest first. Pass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"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."
},
"cursor": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Notifications",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description69/100
Get the published content blocks of a notification template.
Describe the returned information so the agent knows whether it will answer the request.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_notification_content",
"description": "Get the published content blocks of a notification template.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id"
],
"properties": {
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Notification Content",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
Get the draft (unpublished) content blocks of a notification template.
Describe the returned information so the agent knows whether it will answer the request.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_notification_draft_content",
"description": "Get the draft (unpublished) content blocks of a notification template.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id"
],
"properties": {
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Notification Draft Content",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
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: [] } } }.
Describe the returned information so the agent knows whether it will answer the request.
Inputs66/100
6 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
notification › name
Template display name
Clear enough to supply this argument.
notification › tags
Tag list (use [] if none)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notification › brand › anyOf › 0 › id
Not provided
Missing description. Explain what this value means and how to supply it.
Missing description. Explain what this value means and how to supply it.
notification › routing › anyOf › 0 › strategy_id
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.
Clear enough to supply this argument.
notification › content › version
Content version identifier, e.g. "2022-01-01"
Clear enough to supply this argument.
notification › content › elements
Elemental content nodes
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.
Describe the returned information so the agent knows whether it will answer the request.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
version
Version to retrieve: "draft", "published" (default — omit this to get it), or a version string like "v001"
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_notification",
"description": "Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id"
],
"properties": {
"version": {
"type": "string",
"description": "Version to retrieve: \"draft\", \"published\" (default — omit this to get it), or a version string like \"v001\""
},
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Notification",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Replace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.
The description explains the capability, when to use it, and what to expect.
Inputs72/100
7 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
notification_id
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.
Clear enough to supply this argument.
notification › name
Template display name
Clear enough to supply this argument.
notification › tags
Tag list (use [] if none)
Clear enough to supply this argument.
notification › brand › anyOf › 0 › id
Not provided
Missing description. Explain what this value means and how to supply it.
Missing description. Explain what this value means and how to supply it.
notification › routing › anyOf › 0 › strategy_id
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.
Clear enough to supply this argument.
notification › content › version
Content version identifier, e.g. "2022-01-01"
Clear enough to supply this argument.
notification › content › elements
Elemental content nodes
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs81/100
Explain the meaning of this value, not just its name.
notification_id
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.
Clear enough to supply this argument.
elements
Array of elemental content nodes
Explain the meaning of this value, not just its name.
version
Content version string (e.g. "2022-01-01"). Server defaults when omitted.
Clear enough to supply this argument.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs69/100
Explain the meaning of this value, not just its name.
notification_id
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.
Clear enough to supply this argument.
element_id
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.
Clear enough to supply this argument.
type
Element type (e.g. text, action, image, divider, meta)
Clear enough to supply this argument.
channels
Channels this element applies to
Explain the meaning of this value, not just its name.
data
Element data payload
Explain the meaning of this value, not just its name.
if
Conditional expression for element visibility
Explain the meaning of this value, not just its name.
loop
Loop expression for repeating elements
Explain the meaning of this value, not just its name.
ref
Reference identifier
Explain the meaning of this value, not just its name.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "put_notification_element",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"element_id",
"type"
],
"properties": {
"if": {
"type": "string",
"description": "Conditional expression for element visibility"
},
"ref": {
"type": "string",
"description": "Reference identifier"
},
"data": {
"type": "object",
"description": "Element data payload",
"additionalProperties": {}
},
"loop": {
"type": "string",
"description": "Loop expression for repeating elements"
},
"type": {
"type": "string",
"description": "Element type (e.g. text, action, image, divider, meta)"
},
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Must be \"DRAFT\". These tools cannot publish."
},
"channels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Channels this element applies to"
},
"element_id": {
"type": "string",
"description": "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."
},
"notification_id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Put Notification Element",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
notification_id
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.
Clear enough to supply this argument.
locale_id
Locale identifier (e.g. es, fr, pt-BR)
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
elements › items › id
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.
Clear enough to supply this argument.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "put_notification_locale",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"locale_id",
"elements"
],
"properties": {
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Must be \"DRAFT\". These tools cannot publish."
},
"elements": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": {}
},
"description": "Array of element overrides with id and locale-specific content"
},
"locale_id": {
"type": "string",
"description": "Locale identifier (e.g. es, fr, pt-BR)"
},
"notification_id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Put Notification Locale",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
notification_id
The notification template ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
cursor
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.
Clear enough to supply this argument.
limit
Maximum versions to return per page. Defaults to 10, which is also the maximum.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_notification_versions",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum versions to return per page. Defaults to 10, which is also the maximum."
},
"cursor": {
"type": "string",
"description": "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."
},
"notification_id": {
"type": "string",
"description": "The notification template ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Notification Versions",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
notification_id
The notification template ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
submission_id
The submission ID whose checks to list
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_notification_checks",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"submission_id"
],
"properties": {
"submission_id": {
"type": "string",
"description": "The submission ID whose checks to list"
},
"notification_id": {
"type": "string",
"description": "The notification template ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Notification Checks",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
List configured provider integrations for the workspace.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_providers",
"description": "List configured provider integrations for the workspace.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Providers",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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".
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Input documentation gives an agent enough context to populate the arguments.
keys
Comma-separated provider keys to return, for example "sendgrid,twilio".
Clear enough to supply this argument.
name
Substring match against the provider's display name.
Clear enough to supply this argument.
channel
Return only providers serving this channel, for example email, sms or push.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_provider_catalog",
"description": "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\".",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"keys": {
"type": "string",
"description": "Comma-separated provider keys to return, for example \"sendgrid,twilio\"."
},
"name": {
"type": "string",
"description": "Substring match against the provider's display name."
},
"channel": {
"type": "string",
"description": "Return only providers serving this channel, for example email, sms or push."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Provider Catalog",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
Input documentation gives an agent enough context to populate the arguments.
cursor
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.
Clear enough to supply this argument.
limit
Maximum strategies to return per page. Defaults to 20; the API caps this at 100.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_routing_strategies",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"description": "Maximum strategies to return per page. Defaults to 20; the API caps this at 100."
},
"cursor": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Routing Strategies",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_preference_sections",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
},
"annotations": {
"title": "List Preference Sections",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Explain the meaning of this value, not just its name.
section_id
Id of the preference section
Explain the meaning of this value, not just its name.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_preference_section",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"section_id"
],
"properties": {
"section_id": {
"type": "string",
"description": "Id of the preference section"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Preference Section",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Explain the meaning of this value, not just its name.
section_id
Id of the preference section
Explain the meaning of this value, not just its name.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_preference_topics",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"section_id"
],
"properties": {
"section_id": {
"type": "string",
"description": "Id of the preference section"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Preference Topics",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Explain the meaning of this value, not just its name.
section_id
Id of the preference section
Explain the meaning of this value, not just its name.
topic_id
Id of the subscription preference topic
Explain the meaning of this value, not just its name.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_preference_topic",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"section_id",
"topic_id"
],
"properties": {
"topic_id": {
"type": "string",
"description": "Id of the subscription preference topic"
},
"section_id": {
"type": "string",
"description": "Id of the preference section"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Preference Topic",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Journey display name
Clear enough to supply this argument.
nodes
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" }].
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
enabled
Whether the journey is active. Defaults to true.
Clear enough to supply this argument.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_journey",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"nodes"
],
"properties": {
"name": {
"type": "string",
"description": "Journey display name"
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "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\" }]."
},
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Must be \"DRAFT\". These tools cannot publish."
},
"enabled": {
"type": "boolean",
"description": "Whether the journey is active. Defaults to true."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Journey",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Get a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.
Describe the returned information so the agent knows whether it will answer the request.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
journey_id
The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
version
Version to retrieve: "draft", "published" (default), or a version string like "v001"
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get Journey",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_journey",
"description": "Get a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journey_id"
],
"properties": {
"version": {
"type": "string",
"description": "Version to retrieve: \"draft\", \"published\" (default), or a version string like \"v001\""
},
"journey_id": {
"type": "string",
"description": "The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Explain what happens when this optional value is omitted.
journey_id
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.
Clear enough to supply this argument.
name
Journey display name
Clear enough to supply this argument.
nodes
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".
Clear enough to supply this argument.
enabled
Whether the journey is active.
Explain what happens when this optional value is omitted.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "replace_journey",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journey_id",
"name",
"nodes"
],
"properties": {
"name": {
"type": "string",
"description": "Journey display name"
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "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\"."
},
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Must be \"DRAFT\". These tools cannot publish."
},
"enabled": {
"type": "boolean",
"description": "Whether the journey is active."
},
"journey_id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Replace Journey",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
7 of 11 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
journey_id
The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
channel
Channel for this template (e.g. "email", "push", "sms", "inbox")
Clear enough to supply this argument.
notification › name
Template display name
Clear enough to supply this argument.
notification › tags
Tag list (use [] if none)
Clear enough to supply this argument.
notification › brand › anyOf › 0 › id
Not provided
Missing description. Explain what this value means and how to supply it.
Missing description. Explain what this value means and how to supply it.
notification › content › version
Not provided
Missing description. Explain what this value means and how to supply it.
notification › content › elements
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!" }] }].
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notification › content › scope
Not provided
Missing description. Explain what this value means and how to supply it.
provider_key
Specific provider key to target
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
state
Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_journey_template",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journey_id",
"channel",
"notification"
],
"properties": {
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Must be \"DRAFT\". These tools cannot publish."
},
"channel": {
"type": "string",
"description": "Channel for this template (e.g. \"email\", \"push\", \"sms\", \"inbox\")"
},
"journey_id": {
"type": "string",
"description": "The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
},
"notification": {
"type": "object",
"required": [
"name",
"tags",
"brand",
"subscription",
"content"
],
"properties": {
"name": {
"type": "string",
"description": "Template display name"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tag list (use [] if none)"
},
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Brand to apply, or null"
},
"content": {
"type": "object",
"required": [
"version",
"elements"
],
"properties": {
"scope": {
"enum": [
"default",
"strict"
],
"type": "string"
},
"version": {
"type": "string",
"const": "2022-01-01"
},
"elements": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "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!\" }] }]."
}
},
"additionalProperties": false
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"topic_id"
],
"properties": {
"topic_id": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Subscription topic, or null"
}
},
"description": "Notification template definition",
"additionalProperties": false
},
"provider_key": {
"type": "string",
"description": "Specific provider key to target"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Journey Template",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs85/100
Explain the meaning of this value, not just its name.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
journey_id
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.
Clear enough to supply this argument.
elements
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!" }] }].
Explain the meaning of this value, not just its name.
version
Content version string (e.g. "2022-01-01"). Server defaults when omitted.
Clear enough to supply this argument.
state
Template state after update. Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "put_journey_template_content",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"journey_id",
"elements"
],
"properties": {
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Template state after update. Must be \"DRAFT\". These tools cannot publish."
},
"version": {
"type": "string",
"description": "Content version string (e.g. \"2022-01-01\"). Server defaults when omitted."
},
"elements": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "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!\" }] }]."
},
"journey_id": {
"type": "string",
"description": "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."
},
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Put Journey Template Content",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
journey_id
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locale_id
Locale identifier (e.g. es, fr, pt-BR)
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
elements › items › id
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.
Clear enough to supply this argument.
state
Template state after update. Must be "DRAFT". These tools cannot publish.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "put_journey_template_locale",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"journey_id",
"locale_id",
"elements"
],
"properties": {
"state": {
"enum": [
"DRAFT"
],
"type": "string",
"description": "Template state after update. Must be \"DRAFT\". These tools cannot publish."
},
"elements": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": {}
},
"description": "Array of element overrides with id and locale-specific content"
},
"locale_id": {
"type": "string",
"description": "Locale identifier (e.g. es, fr, pt-BR)"
},
"journey_id": {
"type": "string",
"description": "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."
},
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Put Journey Template Locale",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
List journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
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.
Clear enough to supply this argument.
version
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_journeys",
"description": "List journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"type": "string",
"description": "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."
},
"version": {
"enum": [
"published",
"draft"
],
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Journeys",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journey_id
The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
cursor
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.
Clear enough to supply this argument.
limit
Page size (1–100)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_journey_templates",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journey_id"
],
"properties": {
"limit": {
"type": "number",
"description": "Page size (1–100)"
},
"cursor": {
"type": "string",
"description": "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."
},
"journey_id": {
"type": "string",
"description": "The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Journey Templates",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Clear enough to supply this argument.
journey_id
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
version
Version to retrieve: "draft", "published" (default), or "vN"
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_journey_template",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"journey_id"
],
"properties": {
"version": {
"type": "string",
"description": "Version to retrieve: \"draft\", \"published\" (default), or \"vN\""
},
"journey_id": {
"type": "string",
"description": "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."
},
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey Template",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notification_id
The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
journey_id
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
version
Version to retrieve: "draft", "published" (default), or a version string like "v001"
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_journey_template_content",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"journey_id"
],
"properties": {
"version": {
"type": "string",
"description": "Version to retrieve: \"draft\", \"published\" (default), or a version string like \"v001\""
},
"journey_id": {
"type": "string",
"description": "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."
},
"notification_id": {
"type": "string",
"description": "The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Journey Template Content",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notification_id
The notification template ID to report on (no commas or whitespace)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
granularity
Bucket size. HOUR covers at most 7 days, DAY at most 90. Defaults to DAY.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
lookback
Window length counted back from now, as an ISO 8601 duration (P30D, P12W, PT12H). Defaults to P30D. Must not be combined with start/end.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
start
Inclusive window start, ISO 8601 with offset (2026-04-01T00:00:00Z). Requires end. Must not be combined with lookback.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
end
Window end, ISO 8601 with offset. Requires start. Must not be combined with lookback.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_notification_metrics",
"description": "Delivery funnel for ONE notification template over time: sent, delivered, opened, clicked,\nerrors and undeliverable, per provider and channel, in time buckets.\n\nChoosing the window — supply EITHER `lookback` OR `start` and `end` together, NEVER both.\nSupplying both is rejected. For a relative window like 'the last week', `lookback` alone is\nthe whole answer: do not also pin `start` and `end`. Default is the last 30 days by day.\nFine granularities cover shorter windows: HOUR spans at most 7 days and DAY at most 90. How\nfar back a workspace may look also depends on its plan; a request reaching further back is\nrefused with a payment error, which means the plan does not cover that window, NOT that there\nis no data. A coarser granularity can reach further back than a fine one.\n\nReading the numbers correctly:\n- The first four counters are NESTED, not separate groups. Every delivered message is also\n counted in sent, every opened one in delivered, every clicked one in opened. So\n sent >= delivered >= opened >= clicked always. Report rates (delivered/sent) or the counters\n themselves. Do NOT add them together — the total is meaningless. And sent minus delivered is\n NOT a failure count; it is only 'did not reach the delivered stage', for any reason.\n- errors and undeliverable are counted separately and OVERLAP the funnel: a message that failed\n on one provider and succeeded on a retry appears in both errors and sent. They are not a\n remainder and do not complete a total.\n- Every counter is a count of distinct MESSAGES, not of events. A message that errored three\n times counts once in errors.\n- A bucket's `data` array holds one entry per provider and channel. To get a bucket total, add\n up the entries in that array — that is the only sum that means anything here. Note that rows\n for Courier's own built-in email sender are excluded, so these entries can add up to less\n than the workspace's true volume.\n\nWhat the buckets mean:\n- A message is counted in the bucket it was ENQUEUED in, not when the event happened. An open\n today of a message sent last Tuesday is counted in last Tuesday's bucket. So a past bucket\n can still change: yesterday's `opened` may be higher when you ask again tomorrow.\n- Results are cached for up to an hour and the pipeline adds its own lag, so a message sent\n minutes ago is expected NOT to appear yet. Never tell a user a just-sent message is missing;\n say the data has not caught up.\n- Read the window off the response's `start` and `end`, not off what you asked for. The API\n widens the window to whole buckets and returns the boundaries it actually used.\n- Quiet buckets are returned with an empty `data` array, so the series has no gaps.\n- An unknown template id returns an all-empty series rather than an error, and messages sent\n without a template never appear here at all. An empty result is not proof a template is\n unused — check that the id is right before concluding anything from it.\n- Because of that, a NOT FOUND / 404 error is never about the template id. It means the\n metrics endpoint itself could not be reached, which is an infrastructure or configuration\n problem on Courier's side. Say that the metrics service is unreachable and that someone\n should be told; do NOT tell the user to check or correct their template id, which sends\n them to fix something that was never wrong.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id"
],
"properties": {
"end": {
"type": "string",
"maxLength": 64,
"description": "Window end, ISO 8601 with offset. Requires start. Must not be combined with lookback."
},
"start": {
"type": "string",
"maxLength": 64,
"description": "Inclusive window start, ISO 8601 with offset (2026-04-01T00:00:00Z). Requires end. Must not be combined with lookback."
},
"lookback": {
"type": "string",
"maxLength": 32,
"description": "Window length counted back from now, as an ISO 8601 duration (P30D, P12W, PT12H). Defaults to P30D. Must not be combined with start/end."
},
"granularity": {
"enum": [
"HOUR",
"DAY",
"WEEK",
"MONTH"
],
"type": "string",
"default": "DAY",
"description": "Bucket size. HOUR covers at most 7 days, DAY at most 90. Defaults to DAY."
},
"notification_id": {
"type": "string",
"minLength": 1,
"description": "The notification template ID to report on (no commas or whitespace)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Notification Metrics",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Explain what happens when this optional value is omitted.
cursor
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.
Clear enough to supply this argument.
limit
Maximum tenants to return per page.
Explain what happens when this optional value is omitted.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "List Tenants",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_tenants",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"description": "Maximum tenants to return per page."
},
"cursor": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Tenants",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs82/100
Explain the meaning of this value, not just its name.
tenant_id
The tenant ID
Explain the meaning of this value, not just its name.
cursor
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.
Clear enough to supply this argument.
limit
Maximum users to return per page. Defaults to 20; the API caps this at 100.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_tenant_users",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tenant_id"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum users to return per page. Defaults to 20; the API caps this at 100."
},
"cursor": {
"type": "string",
"description": "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."
},
"tenant_id": {
"type": "string",
"description": "The tenant ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Tenant Users",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Get a user profile by their ID. Returns profile data including email, phone, and custom properties.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
The user ID to look up
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get User Profile by ID",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_user_profile_by_id",
"description": "Get a user profile by their ID. Returns profile data including email, phone, and custom properties.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "The user ID to look up"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get User Profile by ID",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
user_id
The user ID
Explain the meaning of this value, not just its name.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get User List Subscriptions",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_user_list_subscriptions",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "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."
},
"user_id": {
"type": "string",
"description": "The user ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get User List Subscriptions",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Get a user's notification preferences (subscriptions, opt-outs, channel preferences).
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Explain the meaning of this value, not just its name.
user_id
The user ID
Explain the meaning of this value, not just its name.
tenant_id
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get User Preferences",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_user_preferences",
"description": "Get a user's notification preferences (subscriptions, opt-outs, channel preferences).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "The user ID"
},
"tenant_id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get User Preferences",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs67/100
Explain the meaning of this value, not just its name.
user_id
The user ID
Explain the meaning of this value, not just its name.
topic_id
The subscription topic ID
Explain the meaning of this value, not just its name.
tenant_id
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get User Preference Topic",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_user_preference_topic",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id",
"topic_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "The user ID"
},
"topic_id": {
"type": "string",
"description": "The subscription topic ID"
},
"tenant_id": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get User Preference Topic",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
The user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
cursor
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.
Clear enough to supply this argument.
limit
Maximum tenants to return per page.
Explain what happens when this optional value is omitted.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "List User Tenants",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_user_tenants",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum tenants to return per page."
},
"cursor": {
"type": "string",
"description": "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."
},
"user_id": {
"type": "string",
"description": "The user ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List User Tenants",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
Input documentation gives an agent enough context to populate the arguments.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "List Brands",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_brands",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Brands",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Explain the meaning of this value, not just its name.
brand_id
The brand ID
Explain the meaning of this value, not just its name.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get Brand",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_brand",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"brand_id"
],
"properties": {
"brand_id": {
"type": "string",
"description": "The brand ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Brand",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
Which SDK to return the installation guide for.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "courier_installation_guide",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"platform"
],
"properties": {
"platform": {
"enum": [
"nodejs",
"python",
"react",
"ios",
"android",
"flutter",
"react native"
],
"type": "string",
"description": "Which SDK to return the installation guide for."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Courier Installation Guide",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
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.
Clear enough to supply this argument.
version
Return only templates in this state. Omit to return every automation template regardless of state.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_automations",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"type": "string",
"description": "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."
},
"version": {
"enum": [
"published",
"draft"
],
"type": "string",
"description": "Return only templates in this state. Omit to return every automation template regardless of state."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Automations",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
Input documentation gives an agent enough context to populate the arguments.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_audiences",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Audiences",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Explain the meaning of this value, not just its name.
audience_id
The audience ID
Explain the meaning of this value, not just its name.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get Audience",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_audience",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"audience_id"
],
"properties": {
"audience_id": {
"type": "string",
"description": "The audience ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Audience",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs72/100
Explain the meaning of this value, not just its name.
audience_id
The audience ID
Explain the meaning of this value, not just its name.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_audience_members",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"audience_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "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."
},
"audience_id": {
"type": "string",
"description": "The audience ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Audience Members",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
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.*".
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
pattern
Filter by list id pattern, where * matches a segment — for example "example.list.*". Omit to return every list.
Clear enough to supply this argument.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "List Lists",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_lists",
"description": "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.*\".",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"type": "string",
"description": "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."
},
"pattern": {
"type": "string",
"description": "Filter by list id pattern, where * matches a segment — for example \"example.list.*\". Omit to return every list."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Lists",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Get one list by its ID, including its name and current state.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Explain the meaning of this value, not just its name.
list_id
The list ID
Explain the meaning of this value, not just its name.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get List",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_list",
"description": "Get one list by its ID, including its name and current state.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"list_id"
],
"properties": {
"list_id": {
"type": "string",
"description": "The list ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get List",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Explain the meaning of this value, not just its name.
list_id
The list ID
Explain the meaning of this value, not just its name.
cursor
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.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "Get List Subscribers",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_list_subscribers",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"list_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "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."
},
"list_id": {
"type": "string",
"description": "The list ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get List Subscribers",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
schedule_id
The digest schedule id, in the form "sch/{uuid}"
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
cursor
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.
Clear enough to supply this argument.
limit
Maximum instances to return. Defaults to 20; the API caps this at 100.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_digest_instances",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"schedule_id"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum instances to return. Defaults to 20; the API caps this at 100."
},
"cursor": {
"type": "string",
"description": "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."
},
"schedule_id": {
"type": "string",
"description": "The digest schedule id, in the form \"sch/{uuid}\""
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Digest Instances",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description69/100
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" } }.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
template_id
The automation template ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
recipient
Recipient user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
brand
Brand ID override
Explain the meaning of this value, not just its name.
data
Data to pass to the automation
Explain the meaning of this value, not just its name.
profile
Profile data for the recipient
Explain the meaning of this value, not just its name.
template
Notification template override
Explain the meaning of this value, not just its name.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description69/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs15/100
8 of 41 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
automation › steps › items › anyOf › 0 › action
Not provided
Missing description. Explain what this value means and how to supply it.
automation › steps › items › anyOf › 0 › template
Notification template ID or key
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
automation › steps › items › anyOf › 0 › brand
Not provided
Missing description. Explain what this value means and how to supply it.
automation › steps › items › anyOf › 0 › data
Not provided
Missing description. Explain what this value means and how to supply it.
automation › steps › items › anyOf › 0 › profile
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
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").
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Input documentation gives an agent enough context to populate the arguments.
cancelation_token
The cancelation_token that was set when the automation was originally invoked
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "cancel_automation",
"description": "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\").",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"cancelation_token"
],
"properties": {
"cancelation_token": {
"type": "string",
"description": "The cancelation_token that was set when the automation was originally invoked"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Cancel Automation",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
List automation runs, newest first. Filter by automation template, status, or a created_at window to find a run that stalled or errored, then read its steps with list_automation_run_steps. Journey runs are listed by list_journey_runs instead.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
template_id
Comma-separated automation template ids to filter on
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
status
Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR
Clear enough to supply this argument.
start_date
Inclusive lower bound on created_at, ISO 8601 date or timestamp
Clear enough to supply this argument.
end_date
Inclusive upper bound on created_at, ISO 8601 date or timestamp
Clear enough to supply this argument.
cursor
next_cursor from a previous response
Clear enough to supply this argument.
limit
Runs per page, 1 to 50. Defaults to 20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_automation_runs",
"description": "List automation runs, newest first. Filter by automation template, status, or a created_at window to find a run that stalled or errored, then read its steps with list_automation_run_steps. Journey runs are listed by list_journey_runs instead.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Runs per page, 1 to 50. Defaults to 20."
},
"cursor": {
"type": "string",
"description": "next_cursor from a previous response"
},
"status": {
"type": "string",
"description": "Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR"
},
"end_date": {
"type": "string",
"description": "Inclusive upper bound on created_at, ISO 8601 date or timestamp"
},
"start_date": {
"type": "string",
"description": "Inclusive lower bound on created_at, ISO 8601 date or timestamp"
},
"template_id": {
"type": "string",
"description": "Comma-separated automation template ids to filter on"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Automation Runs",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
List the steps of an automation run in order, with what happened at each. Send steps carry a message_id to follow with get_message.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
run_id
The automation run id
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "List Automation Run Steps",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_automation_run_steps",
"description": "List the steps of an automation run in order, with what happened at each. Send steps carry a message_id to follow with get_message.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"description": "The automation run id"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Automation Run Steps",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
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" } } }.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Explain the meaning of this value, not just its name.
name
Brand display name
Clear enough to supply this argument.
id
Optional brand ID; auto-generated if omitted
Clear enough to supply this argument.
settings › colors › primary
Primary brand color (hex, e.g. "#1a73e8")
Clear enough to supply this argument.
settings › colors › secondary
Secondary brand color (hex, e.g. "#ffffff")
Clear enough to supply this argument.
settings › colors › tertiary
Tertiary brand color (hex)
Explain the meaning of this value, not just its name.
settings › inapp
In-app notification settings
Explain the meaning of this value, not just its name.
settings › email
Email template settings (header, footer)
Explain the meaning of this value, not just its name.
snippets
Brand snippets
Explain the meaning of this value, not just its name.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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).
Describe the returned information so the agent knows whether it will answer the request.
Inputs84/100
Input documentation gives an agent enough context to populate the arguments.
message_id
The message ID of the original message to resend
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "resend_message",
"description": "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).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"message_id"
],
"properties": {
"message_id": {
"type": "string",
"description": "The message ID of the original message to resend"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Resend Message",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
message_id
A message id, as returned by send. Mutually exclusive with trace_id.
Clear enough to supply this argument.
trace_id
The metadata.trace_id set on the send. Mutually exclusive with message_id.
Clear enough to supply this argument.
include_output
Also return rendered content per provider. Off by default, since rendered email can be large.
Clear enough to supply this argument.
limit
Max messages to trace for a trace_id. Defaults to 10.
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "trace_message",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Max messages to trace for a trace_id. Defaults to 10."
},
"trace_id": {
"type": "string",
"description": "The metadata.trace_id set on the send. Mutually exclusive with message_id."
},
"message_id": {
"type": "string",
"description": "A message id, as returned by send. Mutually exclusive with trace_id."
},
"include_output": {
"type": "boolean",
"description": "Also return rendered content per provider. Off by default, since rendered email can be large."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Trace Message",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Input documentation gives an agent enough context to populate the arguments.
notification_id
The notification template ID to publish
Clear enough to supply this argument.
version
Historical version to publish (e.g. v001); omit to publish current draft
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "publish_notification",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id"
],
"properties": {
"version": {
"type": "string",
"description": "Historical version to publish (e.g. v001); omit to publish current draft"
},
"notification_id": {
"type": "string",
"description": "The notification template ID to publish"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Publish Notification",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs71/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
The recipient user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
title
Message title
Explain the meaning of this value, not just its name.
body
Message body
Explain the meaning of this value, not just its name.
data
Key-value data to include with the message
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
method
Routing method: deliver to all channels or stop after first success
Clear enough to supply this argument.
channels
Channel names to route through (e.g. email, sms, push). Omit to use default routing.
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
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" } }.
Describe the returned information so the agent knows whether it will answer the request.
Inputs65/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
The recipient user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
template
Template ID or notification slug
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
data
Key-value data for template variables
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
method
Routing method
Explain the meaning of this value, not just its name.
channels
Channel names to route through. Omit to use template routing config.
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
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.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs58/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
list_id
The list ID to send to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
title
Message title
Explain the meaning of this value, not just its name.
body
Message body
Explain the meaning of this value, not just its name.
data
Key-value data to include
Explain the meaning of this value, not just its name.
method
Routing method
Explain the meaning of this value, not just its name.
channels
Channel names to route through. Omit to use default routing.
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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"] }.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
tenant_id
The tenant ID
Explain the meaning of this value, not just its name.
topic_id
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.
Clear enough to supply this argument.
status
Subscription status for the topic
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
custom_routing
Default channels when has_custom_routing is enabled
Explain what happens when this optional value is omitted.
has_custom_routing
When true, use custom_routing instead of template defaults
Explain what happens when this optional value is omitted.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_tenant_preference",
"description": "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\"] }.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tenant_id",
"topic_id",
"status"
],
"properties": {
"status": {
"enum": [
"OPTED_IN",
"OPTED_OUT",
"REQUIRED"
],
"type": "string",
"description": "Subscription status for the topic"
},
"topic_id": {
"type": "string",
"description": "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."
},
"tenant_id": {
"type": "string",
"description": "The tenant ID"
},
"custom_routing": {
"type": "array",
"items": {
"enum": [
"direct_message",
"email",
"push",
"sms",
"webhook",
"inbox"
],
"type": "string"
},
"description": "Default channels when has_custom_routing is enabled"
},
"has_custom_routing": {
"type": "boolean",
"description": "When true, use custom_routing instead of template defaults"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update Tenant Preference",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Missing description. Explain what this value means and how to supply it.
content › elements › items › anyOf › 1 › channels
Restrict this element to these channels
Clear enough to supply this argument.
content › elements › items › anyOf › 1 › ref
Reference name for this element
Clear enough to supply this argument.
content › elements › items › anyOf › 1 › if
Expression; the element renders only when truthy
Clear enough to supply this argument.
content › elements › items › anyOf › 1 › loop
Expression resolving to a list to repeat this element over
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content › elements › items › anyOf › 1 › type
Not provided
Missing description. Explain what this value means and how to supply it.
content › elements › items › anyOf › 1 › channel
Channel these elements target, e.g. "email", "push", "inbox"
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content › elements › items › anyOf › 1 › raw
Channel-native payload passed through untouched
Clear enough to supply this argument.
content › elements › items › anyOf › 2 › channels
Restrict this element to these channels
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content › elements › items › anyOf › 2 › ref
Reference name for this element
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content › elements › items › anyOf › 2 › if
Expression; the element renders only when truthy
Explain the meaning of this value, not just its name.
content › elements › items › anyOf › 2 › loop
Expression resolving to a list to repeat this element over
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content › elements › items › anyOf › 2 › type
Not provided
Missing description. Explain what this value means and how to supply it.
content › scope
"strict" reads send data only under the `data.` prefix, e.g. {{data.name}}. Under "default", data is spread to the root and {{data.name}} renders empty
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channels › additionalProperties › brand_id
Brand applied when delivering on this channel
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channels › additionalProperties › providers
Providers eligible for this channel, in preference order
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channels › additionalProperties › routing_method
"all" delivers via every provider; "single" stops after the first success
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channels › additionalProperties › if
Expression; the channel is used only when truthy
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
Create or update a translation for a specific locale. API reference: https://www.courier.com/docs/api-reference/translations/update-translations-by-locale.
Describe the concrete operation and its scope instead of restating the tool name.
Inputs78/100
Explain the meaning of this value, not just its name.
locale
Locale code (e.g. en_US, fr_FR)
Clear enough to supply this argument.
body
Translation content (PO file format)
Clear enough to supply this argument.
domain
Translation domain
Explain the meaning of this value, not just its name.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
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`.
Describe the returned information so the agent knows whether it will answer the request.
Inputs58/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
The user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
topics › items › topic_id
The subscription topic ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
topics › items › status
Preference status
Explain the meaning of this value, not just its name.
topics › items › has_custom_routing
Whether custom channel routing is set
Explain the meaning of this value, not just its name.
topics › items › custom_routing
Custom channel routing order (e.g. inbox, email)
Clear enough to supply this argument.
tenant_id
Scope the update to a specific tenant context
Explain the meaning of this value, not just its name.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "bulk_update_user_preferences",
"description": "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`.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id",
"topics"
],
"properties": {
"topics": {
"type": "array",
"items": {
"type": "object",
"required": [
"topic_id",
"status"
],
"properties": {
"status": {
"enum": [
"OPTED_IN",
"OPTED_OUT",
"REQUIRED"
],
"type": "string",
"description": "Preference status"
},
"topic_id": {
"type": "string",
"description": "The subscription topic ID"
},
"custom_routing": {
"type": "array",
"items": {
"type": "string"
},
"description": "Custom channel routing order (e.g. inbox, email)"
},
"has_custom_routing": {
"type": "boolean",
"description": "Whether custom channel routing is set"
}
},
"additionalProperties": false
},
"description": "Topics to create or update"
},
"user_id": {
"type": "string",
"description": "The user ID"
},
"tenant_id": {
"type": "string",
"description": "Scope the update to a specific tenant context"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Bulk Update User Preferences",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
The user ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
topics › items › topic_id
The subscription topic ID
Explain the meaning of this value, not just its name.
topics › items › status
Preference status
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
topics › items › has_custom_routing
Whether custom channel routing is set
Explain what happens when this optional value is omitted.
topics › items › custom_routing
Custom channel routing order (e.g. inbox, email)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tenant_id
Scope the replacement to a specific tenant context
Explain what happens when this optional value is omitted.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
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" } }.
Describe the returned information so the agent knows whether it will answer the request.
Inputs69/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
template_id
The journey template ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
user_id
Recipient user ID. Can also be resolved from profile or data.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
data
Data payload passed to the journey for conditions and template variables
Clear enough to supply this argument.
profile
Profile data for the user (email, phone, custom fields)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs84/100
Input documentation gives an agent enough context to populate the arguments.
journey_id
The journey template ID to publish
Clear enough to supply this argument.
version
Historical version to roll back to (e.g. "v001"). Omit to publish the current draft.
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "publish_journey",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"journey_id"
],
"properties": {
"version": {
"type": "string",
"description": "Historical version to roll back to (e.g. \"v001\"). Omit to publish the current draft."
},
"journey_id": {
"type": "string",
"description": "The journey template ID to publish"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Publish Journey",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "publish_journey_template",
"description": "Publish the current draft of a journey-scoped notification template. Optionally pass version to roll back to a prior version.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notification_id",
"journey_id"
],
"properties": {
"version": {
"type": "string",
"description": "Version to roll back to (e.g. \"v1\"). Omit to publish current draft."
},
"journey_id": {
"type": "string",
"description": "The journey template ID that owns this notification"
},
"notification_id": {
"type": "string",
"description": "The notification template ID"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Publish Journey Template",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
cancelation_token
Cancels every run associated with this token. Mutually exclusive with run_id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
run_id
Cancels a single run by id. Mutually exclusive with cancelation_token.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "cancel_journey",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"run_id": {
"type": "string",
"description": "Cancels a single run by id. Mutually exclusive with cancelation_token."
},
"cancelation_token": {
"type": "string",
"description": "Cancels every run associated with this token. Mutually exclusive with run_id."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Cancel Journey",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
template_id
Comma-separated journey ids to filter on
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
status
Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR
Clear enough to supply this argument.
start_date
Inclusive lower bound on created_at, ISO 8601 date or timestamp
Clear enough to supply this argument.
end_date
Inclusive upper bound on created_at, ISO 8601 date or timestamp
Clear enough to supply this argument.
cursor
next_cursor from a previous response
Clear enough to supply this argument.
limit
Runs per page, 1 to 50. Defaults to 20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_journey_runs",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Runs per page, 1 to 50. Defaults to 20."
},
"cursor": {
"type": "string",
"description": "next_cursor from a previous response"
},
"status": {
"type": "string",
"description": "Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR"
},
"end_date": {
"type": "string",
"description": "Inclusive upper bound on created_at, ISO 8601 date or timestamp"
},
"start_date": {
"type": "string",
"description": "Inclusive lower bound on created_at, ISO 8601 date or timestamp"
},
"template_id": {
"type": "string",
"description": "Comma-separated journey ids to filter on"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Journey Runs",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
run_id
The journey run id
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
{
"title": "List Journey Run Steps",
"readOnlyHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_journey_run_steps",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"description": "The journey run id"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Journey Run Steps",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
provider
Provider key from the catalog (e.g. sendgrid, twilio, firebase-fcm)
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs55/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
provider_id
The provider configuration ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
provider
Provider key (must match existing; changing provider type is not supported)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
Display name
Explain the meaning of this value, not just its name.
alias
Short alias
Explain the meaning of this value, not just its name.
settings
Provider-specific settings
Explain the meaning of this value, not just its name.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
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.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "publish_preferences",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
},
"annotations": {
"title": "Publish Preferences",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
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.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Explain the meaning of this value, not just its name.
section_id
Id of the preference section
Explain the meaning of this value, not just its name.
topic_id
Id of the subscription preference topic
Explain the meaning of this value, not just its name.
name
Human-readable name for the preference topic
Clear enough to supply this argument.
default_status
Default subscription status applied when a recipient has not set their own
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
routing_options
Default channels delivered for this topic. Omit to clear.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
allowed_preferences
Preference controls a recipient may customize. Omit to clear.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
include_unsubscribe_header
Whether to include a list-unsubscribe header on emails for this topic
Explain what happens when this optional value is omitted.
topic_data
Arbitrary metadata associated with the topic. Omit to clear.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
List preference changes, newest first. Each entry is one change a user made to one subscription topic, with the value before it where there was one. Pass user_id to answer "when did this user opt out, and of what?"; omit it to read the whole environment. Page with paging.cursor while paging.more is true.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
user_id
Return only this user's changes. Omit to read every change in the environment.
Clear enough to supply this argument.
tenant_id
Narrow to the changes the user made in one tenant context. Requires user_id.
Clear enough to supply this argument.
since
Only changes at or after this time, as an ISO 8601 date or date-time. A date alone is the start of that day in UTC.
Clear enough to supply this argument.
limit
Entries per page, 1 to 100. Defaults to 25.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
paging.cursor from a previous response
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_preference_logs",
"description": "List preference changes, newest first. Each entry is one change a user made to one subscription topic, with the value before it where there was one. Pass user_id to answer \"when did this user opt out, and of what?\"; omit it to read the whole environment. Page with paging.cursor while paging.more is true.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Entries per page, 1 to 100. Defaults to 25."
},
"since": {
"type": "string",
"description": "Only changes at or after this time, as an ISO 8601 date or date-time. A date alone is the start of that day in UTC."
},
"cursor": {
"type": "string",
"description": "paging.cursor from a previous response"
},
"user_id": {
"type": "string",
"description": "Return only this user's changes. Omit to read every change in the environment."
},
"tenant_id": {
"type": "string",
"description": "Narrow to the changes the user made in one tenant context. Requires user_id."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Preference Logs",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
schedule_id
The digest schedule id, in the form "sch/{uuid}"
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "release_digest",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"schedule_id"
],
"properties": {
"schedule_id": {
"type": "string",
"description": "The digest schedule id, in the form \"sch/{uuid}\""
}
},
"additionalProperties": false
},
"annotations": {
"title": "Release Digest",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs56/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
section_id
Id of the preference section the topic belongs to
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
topic_id
Id of the digest topic
Explain the meaning of this value, not just its name.
user_id
The recipient whose digest to release
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tenant_id
The recipient's tenant, when they were sent to as part of one
Explain what happens when this optional value is omitted.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "release_user_digest",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"section_id",
"topic_id",
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "The recipient whose digest to release"
},
"topic_id": {
"type": "string",
"description": "Id of the digest topic"
},
"tenant_id": {
"type": "string",
"description": "The recipient's tenant, when they were sent to as part of one"
},
"section_id": {
"type": "string",
"description": "Id of the preference section the topic belongs to"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Release User Digest",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
name
Human-readable name
Explain the meaning of this value, not just its name.
channel
The single delivery channel for this broadcast
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_broadcast",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"channel"
],
"properties": {
"name": {
"type": "string",
"description": "Human-readable name"
},
"channel": {
"enum": [
"email",
"sms",
"push",
"inbox",
"slack",
"msteams"
],
"type": "string",
"description": "The single delivery channel for this broadcast"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Broadcast",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send_broadcast",
"description": "Send a broadcast now to every member of a list or audience. This delivers real messages.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"broadcast_id",
"recipient_type",
"recipient_id"
],
"properties": {
"broadcast_id": {
"type": "string",
"description": "The broadcast id"
},
"recipient_id": {
"type": "string",
"description": "The list or audience id"
},
"recipient_type": {
"enum": [
"list",
"audience"
],
"type": "string",
"description": "Whether to send to a list or an audience"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Send Broadcast",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "schedule_broadcast",
"description": "Schedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"broadcast_id",
"recipient_type",
"recipient_id",
"scheduled_to"
],
"properties": {
"timezone": {
"type": "string",
"description": "IANA timezone scheduled_to is expressed in, e.g. America/New_York"
},
"broadcast_id": {
"type": "string",
"description": "The broadcast id"
},
"recipient_id": {
"type": "string",
"description": "The list or audience id"
},
"scheduled_to": {
"type": "string",
"description": "Wall-clock time of the send with no timezone offset, e.g. 2026-10-01T09:00:00"
},
"recipient_type": {
"enum": [
"list",
"audience"
],
"type": "string",
"description": "Whether to send to a list or an audience"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Schedule Broadcast",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_preview_devices",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
},
"annotations": {
"title": "List Preview Devices",
"readOnlyHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_preview_device_sets",
"description": "List saved preview device sets. Every workspace has a read-only Courier Recommended set that runs can use without creating a set first.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
},
"annotations": {
"title": "List Preview Device Sets",
"readOnlyHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
device_set_id
The device set id (pvs_...)
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
name
The new name
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
device_ids
Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.
Clear enough to supply this argument.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "replace_preview_device_set",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"device_set_id",
"name",
"device_ids"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "The new name"
},
"device_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected."
},
"device_set_id": {
"type": "string",
"description": "The device set id (pvs_...)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Replace Preview Device Set",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "archive_preview_device_set",
"description": "Archive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"device_set_id"
],
"properties": {
"device_set_id": {
"type": "string",
"description": "The device set id (pvs_...)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Archive Preview Device Set",
"readOnlyHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
template_id
The notification template id (nt_...). It must be a Design Studio template with an email channel.
Clear enough to supply this argument.
device_set_id
A saved device set id (pvs_...). Use the Courier Recommended set from list_preview_device_sets for a sensible default.
Clear enough to supply this argument.
device_ids
Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
template_version
Which version renders: omit for the latest draft, "published" for the live version, or a publish such as "v002".
Clear enough to supply this argument.
data
Variables for the template, the same shape as the data a send would carry
Clear enough to supply this argument.
locale
Locale to render, e.g. "en-US"
Explain what happens when this optional value is omitted.
Annotations75/100
Declare openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_preview_run",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"template_id"
],
"properties": {
"data": {
"type": "object",
"description": "Variables for the template, the same shape as the data a send would carry",
"additionalProperties": {}
},
"locale": {
"type": "string",
"description": "Locale to render, e.g. \"en-US\""
},
"device_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Device ids (pvd_...) from list_preview_devices. An id the catalog does not list is rejected."
},
"template_id": {
"type": "string",
"description": "The notification template id (nt_...). It must be a Design Studio template with an email channel."
},
"device_set_id": {
"type": "string",
"description": "A saved device set id (pvs_...). Use the Courier Recommended set from list_preview_device_sets for a sensible default."
},
"template_version": {
"type": "string",
"description": "Which version renders: omit for the latest draft, \"published\" for the live version, or a publish such as \"v002\"."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Preview Run",
"readOnlyHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Clarify ID sources, units, or usage conventions not already expressed in the schema.
template_id
The notification template id (nt_...) the run previewed
Clear enough to supply this argument.
preview_run_id
The preview run id (pvr_...)
Clear enough to supply this argument.
Annotations25/100
Declare destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_preview_run",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"template_id",
"preview_run_id"
],
"properties": {
"template_id": {
"type": "string",
"description": "The notification template id (nt_...) the run previewed"
},
"preview_run_id": {
"type": "string",
"description": "The preview run id (pvr_...)"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Preview Run",
"readOnlyHint": true
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Courier Installation GuideGet the Courier SDK installation guide for one platform: the install command, a quick-start code sample and the relevant doc links.
02Get User Profile by IDGet a user profile by their ID.
03Get MessageGet the full details and status of a single message by its ID.
04List JourneysList journey templates in the workspace, returning the journey IDs and version state of each.
05Get TranslationGet a translation for a specific locale (e.g.
Want to run these tasks against your MCP server with us?
@trycourier/courier-mcp setup, tools, quality score, publishing readiness, and alternatives.
How do I add @trycourier/courier-mcp to Claude, ChatGPT, or Cursor?
Add @trycourier/courier-mcp to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.courier.com/.
Is @trycourier/courier-mcp MCP ready for ChatGPT and Claude?
As of November 7, 2026, @trycourier/courier-mcp scores 90/100 on Manufact's MCP publishing checklist. The scan does not yet meet ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is @trycourier/courier-mcp's MCP tool documentation?
As of November 7, 2026, @trycourier/courier-mcp scores 71/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 173 of 173 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to @trycourier/courier-mcp?
As of November 8, 2026, alternatives to @trycourier/courier-mcp in communication on the Manufact MCP leaderboard include Granola, Cooper Email, Dial, Primitive Email, and Salvy.
How can @trycourier/courier-mcp improve its MCP documentation?
invoke_ad_hoc_automation is the lowest-scoring reviewed tool at 55/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.