Courier
by trycourier · remote · no sign-in to list tools · v1.3.7 · published by GitHub user trycourier
Send notifications, manage templates, and configure integrations with Courier.
173 tools: 34 can delete or cancel things, 19 do something that can't be undone, 49 change things and 71 only read.
Scanned Oct 21, 2026
- Deletes or cancels34Claude Code: deny: see these tools
- Can't be undone19Claude Code: ask: see these tools
- Changes things49Claude Code: ask: see these tools
- Only reads71Claude Code: allow: see these tools
9 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http courier https://mcp.courier.com --header 'api_key: <your-api-key>'Findings
Matches of fixed checks, with the text they matched.
The description contains "Never tell a user", an instruction to keep something from the user.
What this check looks forMatched text
description: "...utes ago is expected NOT to appear yet. Never tell a user a just-sent message is missing; say t..."
The server marks "cancel_automation" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}; The name "cancel_automation" says "cancel": a word for removing or ending something.
- Warnrestore_list
The server marks "restore_list" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}; The name "restore_list" says "list": a word for reading.
The input schema at properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.channels.$ref contains a 81-character base64 string.
What this check looks forMatched text
inputSchema.properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.channels.$ref: "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/proper..."
The input schema at properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.ref.$ref contains a 76-character base64 string.
What this check looks forMatched text
inputSchema.properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.ref.$ref: "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/proper..."
The input schema at properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.if.$ref contains a 75-character base64 string.
What this check looks forMatched text
inputSchema.properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.if.$ref: "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/proper..."
Show 3 more findingsShow fewer
The description is 3,371 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...rect their template id, which sends them to fix something that was never wrong."
- Infocreate_provider
The description mentions "credential".
What this check looks forMatched text
description: "...cation templates reference this config, credential or settings mistakes can affect live se..."
- Infocreate_provider
The input schema at properties.settings.description mentions "credentials".
What this check looks forMatched text
inputSchema.properties.settings.description: "Provider-specific settings (API keys, credentials, etc.)"
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
173 tools
Deletes or cancels 34Claude Code: deny
archive_journeyArchive a journey.No findings
Why it is in this group
- The name "archive_journey" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a journey. Archived journeys cannot be invoked but existing runs continue to completion.
Annotations the server declares
- title: Archive Journey
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_journey_templateArchive a journey-scoped notification template.No findings
Why it is in this group
- The name "archive_journey_template" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a journey-scoped notification template. Archived templates cannot be sent.
Annotations the server declares
- title: Archive Journey Template
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_notificationArchive a notification template by ID.No findings
Why it is in this group
- The name "archive_notification" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a notification template by ID.
Annotations the server declares
- title: Archive Notification
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_preference_sectionArchive a preference section.No findings
Why it is in this group
- The name "archive_preference_section" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a preference section. The section must be empty: delete its topics first, otherwise the request fails with 409.
Annotations the server declares
- title: Archive Preference Section
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_preference_topicArchive a topic within a section.No findings
Why it is in this group
- The name "archive_preference_topic" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a topic within a section.
Annotations the server declares
- title: Archive Preference Topic
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_preview_device_setArchive a preview device set.No findings
Why it is in this group
- The name "archive_preview_device_set" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.
Annotations the server declares
- title: Archive Preview Device Set
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_requestArchive a send request and all its associated messages by request ID.No findings
Why it is in this group
- The name "archive_request" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a send request and all its associated messages by request ID.
Annotations the server declares
- title: Archive Request
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
archive_routing_strategyArchive a routing strategy.No findings
Why it is in this group
- The name "archive_routing_strategy" says "archive": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Archive a routing strategy. The strategy must not have associated notification templates; unlink all templates before archiving.
Annotations the server declares
- title: Archive Routing Strategy
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
bulk_replace_user_preferencesReplace a user's complete set of preference overrides in one request.No findings
Why it is in this group
- The name "bulk_replace_user_preferences" says "replace": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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).
Annotations the server declares
- title: Bulk Replace User Preferences
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
bulk_subscribe_to_listReplace all subscribers on a list with the given recipients.No findings
Why it is in this group
- The name "bulk_subscribe_to_list" says "subscribe": a word for a change.
- The input addresses people (input.recipients): what it sends cannot be taken back.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Replace all subscribers on a list with the given recipients.
Annotations the server declares
- title: Bulk Subscribe to List
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
cancel_automationCancel a running automation by its cancelation_token.1 finding
Why it is in this group
- The name "cancel_automation" says "cancel": a word for removing or ending something.
- The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.
Findings
- Warn
The server marks "cancel_automation" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}; The name "cancel_automation" says "cancel": a word for removing or ending something.
Description, as the server wrote it 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").
Annotations the server declares
- title: Cancel Automation
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
cancel_broadcast_scheduleCancel a broadcast's scheduled send.No findings
Why it is in this group
- The name "cancel_broadcast_schedule" says "cancel": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Cancel a broadcast's scheduled send. The broadcast itself is kept.
Annotations the server declares
- title: Cancel Broadcast Schedule
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
cancel_journeyCancel journey runs.No findings
Why it is in this group
- The name "cancel_journey" says "cancel": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Cancel Journey
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
cancel_messageCancel a message that is currently being delivered.No findings
Why it is in this group
- The name "cancel_message" says "cancel": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Cancel a message that is currently being delivered. Returns the message details with updated status.
Annotations the server declares
- title: Cancel Message
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
cancel_notification_submissionCancel a notification template submission.No findings
Why it is in this group
- The name "cancel_notification_submission" says "cancel": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Cancel a notification template submission.
Annotations the server declares
- title: Cancel Notification Submission
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_audienceDelete an audience by its ID.No findings
Why it is in this group
- The name "delete_audience" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete an audience by its ID.
Annotations the server declares
- title: Delete Audience
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_brandDelete a brand by its ID.No findings
Why it is in this group
- The name "delete_brand" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a brand by its ID.
Annotations the server declares
- title: Delete Brand
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_broadcastDelete a broadcast.No findings
Why it is in this group
- The name "delete_broadcast" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a broadcast.
Annotations the server declares
- title: Delete Broadcast
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_listDelete a list by its ID.No findings
Why it is in this group
- The name "delete_list" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a list by its ID.
Annotations the server declares
- title: Delete List
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_profileDelete a user profile permanently.No findings
Why it is in this group
- The name "delete_profile" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a user profile permanently.
Annotations the server declares
- title: Delete Profile
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_providerDelete a provider configuration.No findings
Why it is in this group
- The name "delete_provider" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a provider configuration. Returns 409 if the provider is still referenced by routing or notifications.
Annotations the server declares
- title: Delete Provider
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_tenantDelete a tenant by its ID.No findings
Why it is in this group
- The name "delete_tenant" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a tenant by its ID.
Annotations the server declares
- title: Delete Tenant
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_tenant_preferenceRemove default notification preference for a topic from a tenant.No findings
Why it is in this group
- The name "delete_tenant_preference" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Remove default notification preference for a topic from a tenant.
Annotations the server declares
- title: Delete Tenant Preference
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_tenant_templateDelete a tenant notification template.No findings
Why it is in this group
- The name "delete_tenant_template" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a tenant notification template. Returns 204 on success, 404 if the template does not exist for this tenant.
Annotations the server declares
- title: Delete Tenant Template
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
delete_user_list_subscriptionsDelete all list subscriptions for a user.No findings
Why it is in this group
- The name "delete_user_list_subscriptions" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete all list subscriptions for a user.
Annotations the server declares
- title: Delete User List Subscriptions
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_user_preference_topicDelete a user's preference for a specific subscription topic, reverting it to the topic's default status.No findings
Why it is in this group
- The name "delete_user_preference_topic" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a user's preference for a specific subscription topic, reverting it to the topic's default status.
Annotations the server declares
- title: Delete User Preference Topic
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
delete_user_tokenDelete a specific push token for a user.No findings
Why it is in this group
- The name "delete_user_token" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a specific push token for a user.
Annotations the server declares
- title: Delete User Token
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
put_journey_template_contentReplace the elemental content of a journey-scoped notification template.No findings
Why it is in this group
- The name "put_journey_template_content" says "put": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Put Journey Template Content
- readOnlyHint: false
- idempotentHint: true
- destructiveHint: true
remove_all_user_tenantsRemove a user from all tenants.No findings
Why it is in this group
- The name "remove_all_user_tenants" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Remove a user from all tenants.
Annotations the server declares
- title: Remove All User Tenants
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
remove_user_from_tenantRemove a user from a tenant.No findings
Why it is in this group
- The name "remove_user_from_tenant" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Remove a user from a tenant.
Annotations the server declares
- title: Remove User from Tenant
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
replace_journeyReplace (update) a journey draft.No findings
Why it is in this group
- The name "replace_journey" says "replace": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Replace Journey
- readOnlyHint: false
- idempotentHint: true
- destructiveHint: true
replace_profileFully replace a user profile (PUT).No findings
Why it is in this group
- The name "replace_profile" says "replace": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Fully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.
Annotations the server declares
- title: Replace Profile
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
unsubscribe_user_from_listUnsubscribe a user from a list.No findings
Why it is in this group
- The name "unsubscribe_user_from_list" says "unsubscribe": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Unsubscribe a user from a list.
Annotations the server declares
- title: Unsubscribe User from List
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
update_providerReplace an existing provider configuration.No findings
Why it is in this group
- The name "update_provider" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it 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.
Annotations the server declares
- title: Update Provider
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
Can't be undone 19Claude Code: ask
add_subscribers_to_listAppend subscribers to a list without removing existing subscribers.No findings
Why it is in this group
- The name "add_subscribers_to_list" says "add": a word for a change.
- The input addresses people (input.recipients): what it sends cannot be taken back.
Description, as the server wrote it Append subscribers to a list without removing existing subscribers.
Annotations the server declares
- title: Add Subscribers to List
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_broadcastCreate a broadcast: a one-off message to a list or audience on a single channel.No findings
Why it is in this group
- The name "create_broadcast" says "create": a word for a change.
- The name "create_broadcast" also says "broadcast": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it 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.
Annotations the server declares
- title: Create Broadcast
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
duplicate_broadcastCopy a broadcast into a new draft.No findings
Why it is in this group
- The name "duplicate_broadcast" says "broadcast": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Copy a broadcast into a new draft. The original is left unchanged.
Annotations the server declares
- title: Duplicate Broadcast
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
invoke_ad_hoc_automationInvoke an ad-hoc automation with inline steps.No findings
Why it is in this group
- The name "invoke_ad_hoc_automation" says "invoke": a word for a change.
- The input addresses people (input.recipient): what it sends cannot be taken back.
Description, as the server wrote it 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.
Annotations the server declares
- title: Invoke Ad Hoc Automation
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
invoke_automation_templateInvoke an automation run from an existing automation template.No findings
Why it is in this group
- The name "invoke_automation_template" says "invoke": a word for a change.
- The input addresses people (input.recipient): what it sends cannot be taken back.
Description, as the server wrote it 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" } }.
Annotations the server declares
- title: Invoke Automation Template
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
publish_journeyPublish the current draft of a journey, making it live and invokable.No findings
Why it is in this group
- The name "publish_journey" says "publish": a word for a change that another call does not undo.
Description, as the server wrote it 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.
Annotations the server declares
- title: Publish Journey
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
publish_journey_templatePublish the current draft of a journey-scoped notification template.No findings
Why it is in this group
- The name "publish_journey_template" says "publish": a word for a change that another call does not undo.
Description, as the server wrote it Publish the current draft of a journey-scoped notification template. Optionally pass version to roll back to a prior version.
Annotations the server declares
- title: Publish Journey Template
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
publish_notificationPublish a notification template, making it available for sending.No findings
Why it is in this group
- The name "publish_notification" says "publish": a word for a change that another call does not undo.
Description, as the server wrote it 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.
Annotations the server declares
- title: Publish Notification
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
publish_preferencesPublish the workspace's preferences page.No findings
Why it is in this group
- The name "publish_preferences" says "publish": a word for a change that another call does not undo.
Description, as the server wrote it 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.
Annotations the server declares
- title: Publish Preferences
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
publish_tenant_templatePublish a version of a tenant notification template.No findings
Why it is in this group
- The name "publish_tenant_template" says "publish": a word for a change that another call does not undo.
Description, as the server wrote it Publish a version of a tenant notification template.
Annotations the server declares
- title: Publish Tenant Template
- readOnlyHint: false
- destructiveHint: false
put_broadcast_contentReplace a broadcast's content with an Elemental document.No findings
Why it is in this group
- The name "put_broadcast_content" says "put": a word for a change.
- The name "put_broadcast_content" also says "broadcast": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Replace a broadcast's content with an Elemental document. Saved as a draft unless state is PUBLISHED.
Annotations the server declares
- title: Put Broadcast Content
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
rename_broadcastRename a broadcast.No findings
Why it is in this group
- The name "rename_broadcast" says "rename": a word for a change.
- The name "rename_broadcast" also says "broadcast": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Rename a broadcast. Content and channel are unchanged.
Annotations the server declares
- title: Rename Broadcast
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
resend_messageResend a previously sent message.No findings
Why it is in this group
- The name "resend_message" says "resend": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it 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).
Annotations the server declares
- title: Resend Message
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
schedule_broadcastSchedule a broadcast to send later to a list or audience.No findings
Why it is in this group
- The name "schedule_broadcast" says "schedule": a word for a change.
- The name "schedule_broadcast" also says "broadcast": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Schedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.
Annotations the server declares
- title: Schedule Broadcast
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
send_broadcastSend a broadcast now to every member of a list or audience.No findings
Why it is in this group
- The name "send_broadcast" says "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Send a broadcast now to every member of a list or audience. This delivers real messages.
Annotations the server declares
- title: Send Broadcast
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
send_messageSend a message to a user using inline title and body content (no template).No findings
Why it is in this group
- The name "send_message" says "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it 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.
Annotations the server declares
- title: Send Message
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
send_message_templateSend a message to a user using a published notification template.No findings
Why it is in this group
- The name "send_message_template" says "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it 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" } }.
Annotations the server declares
- title: Send Message Template
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
send_message_to_listSend a message to all subscribers of a list using inline title and body content.No findings
Why it is in this group
- The name "send_message_to_list" says "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it 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.
Annotations the server declares
- title: Send Message to List
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
send_message_to_list_templateSend a message to all subscribers of a list using a notification template.No findings
Why it is in this group
- The name "send_message_to_list_template" says "send": a word for sending, and what is sent cannot be taken back.
Description, as the server wrote it Send a message to all subscribers of a list using a notification template.
Annotations the server declares
- title: Send Message to List Template
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
Changes things 49Claude Code: ask
add_bulk_usersAdd users to an existing bulk job.No findings
Why it is in this group
- The name "add_bulk_users" says "add": a word for a change.
Description, as the server wrote it Add users to an existing bulk job.
Annotations the server declares
- title: Add Bulk Users
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
add_user_to_tenantAdd a user to a tenant.No findings
Why it is in this group
- The name "add_user_to_tenant" says "add": a word for a change.
Description, as the server wrote it Add a user to a tenant.
Annotations the server declares
- title: Add User to Tenant
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
bulk_add_user_tenantsAdd a user to multiple tenants at once.No findings
Why it is in this group
- The name "bulk_add_user_tenants" says "add": a word for a change.
Description, as the server wrote it Add a user to multiple tenants at once. A custom profile can be supplied per tenant.
Annotations the server declares
- title: Bulk Add User Tenants
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
bulk_add_user_tokensAdd multiple push/device tokens for a user in one request.No findings
Why it is in this group
- The name "bulk_add_user_tokens" says "add": a word for a change.
Description, as the server wrote it Add multiple push/device tokens for a user in one request. Overwrites matching existing tokens.
Annotations the server declares
- title: Bulk Add User Tokens
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
bulk_update_user_preferencesAdditively create or update a user's preferences for one or more topics in a single request.No findings
Why it is in this group
- The name "bulk_update_user_preferences" says "update": a word for a change.
Description, as the server wrote it 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`.
Annotations the server declares
- title: Bulk Update User Preferences
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_brandCreate a new brand.No findings
Why it is in this group
- The name "create_brand" says "create": a word for a change.
Description, as the server wrote it 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" } } }.
Annotations the server declares
- title: Create Brand
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_bulk_jobCreate a new bulk job for sending messages to multiple recipients.No findings
Why it is in this group
- The name "create_bulk_job" says "create": a word for a change.
Description, as the server wrote it Create a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.
Annotations the server declares
- title: Create Bulk Job
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_journeyCreate a new journey.No findings
Why it is in this group
- The name "create_journey" says "create": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Create Journey
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
create_journey_templateCreate a notification template scoped to a journey.No findings
Why it is in this group
- The name "create_journey_template" says "create": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Create Journey Template
- readOnlyHint: false
- idempotentHint: false
- destructiveHint: false
create_listCreate or update a list by list ID.No findings
Why it is in this group
- The name "create_list" says "create": a word for a change.
Description, as the server wrote it Create or update a list by list ID.
Annotations the server declares
- title: Create List
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
create_notificationCreate a V2 notification template.No findings
Why it is in this group
- The name "create_notification" says "create": a word for a change.
Description, as the server wrote it 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: [] } } }.
Annotations the server declares
- title: Create Notification
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_or_merge_userCreate a new user profile or merge supplied values into an existing profile (POST).No findings
Why it is in this group
- The name "create_or_merge_user" says "create": a word for a change.
Description, as the server wrote it Create a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.
Annotations the server declares
- title: Create or Merge User
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
create_or_replace_user_push_tokenCreate or replace a push/device token for a user.No findings
Why it is in this group
- The name "create_or_replace_user_push_token" says "create": a word for a change.
Description, as the server wrote it Create or replace a push/device token for a user.
Annotations the server declares
- title: Create or Replace User Push Token
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
create_or_update_tenantCreate or replace a tenant.No findings
Why it is in this group
- The name "create_or_update_tenant" says "create": a word for a change.
Description, as the server wrote it Create or replace a tenant. Tenants represent organizations or groups that users belong to.
Annotations the server declares
- title: Create or Update Tenant
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
create_preference_sectionCreate a preference section in your workspace.No findings
Why it is in this group
- The name "create_preference_section" says "create": a word for a change.
Description, as the server wrote it Create a preference section in your workspace. The section id is generated and returned. Add topics afterwards with create_preference_topic.
Annotations the server declares
- title: Create Preference Section
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_preference_topicCreate a subscription preference topic inside a section.No findings
Why it is in this group
- The name "create_preference_topic" says "create": a word for a change.
Description, as the server wrote it Create a subscription preference topic inside a section. The topic id is generated and returned. Fails with 404 if the section does not exist.
Annotations the server declares
- title: Create Preference Topic
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_preview_device_setCreate a named, reusable set of preview devices.No findings
Why it is in this group
- The name "create_preview_device_set" says "create": a word for a change.
Description, as the server wrote it Create a named, reusable set of preview devices.
Annotations the server declares
- title: Create Preview Device Set
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_preview_runRender a template's email on real email clients and capture screenshots.No findings
Why it is in this group
- The name "create_preview_run" says "create": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Create Preview Run
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_providerCreate a new provider (integration) configuration.2 findings
Why it is in this group
- The name "create_provider" says "create": a word for a change.
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "...cation templates reference this config, credential or settings mistakes can affect live se..."
- Info
The input schema at properties.settings.description mentions "credentials".
What this check looks forMatched text
inputSchema.properties.settings.description: "Provider-specific settings (API keys, credentials, etc.)"
Description, as the server wrote it 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.
Annotations the server declares
- title: Create Provider
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
create_routing_strategyCreate a routing strategy defining how notifications are delivered across channels and providers.No findings
Why it is in this group
- The name "create_routing_strategy" says "create": a word for a change.
Description, as the server wrote it Create a routing strategy defining how notifications are delivered across channels and providers.
Annotations the server declares
- title: Create Routing Strategy
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
generate_jwt_for_userGenerate a JWT authentication token for a user.No findings
Why it is in this group
- The name "generate_jwt_for_user" says "generate": a word for a change.
Description, as the server wrote it Generate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).
Annotations the server declares
- title: Generate JWT for User
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
invoke_journeyInvoke a journey run from a journey template.No findings
Why it is in this group
- The name "invoke_journey" says "invoke": a word for a change.
Description, as the server wrote it 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" } }.
Annotations the server declares
- title: Invoke Journey
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
patch_profilePartially update a user profile via JSON Patch (RFC 6902).No findings
Why it is in this group
- The name "patch_profile" says "patch": a word for a change.
Description, as the server wrote it Partially update a user profile via JSON Patch (RFC 6902). Use add/replace/remove operations on specific profile paths.
Annotations the server declares
- title: Patch Profile
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
patch_user_tokenApply a JSON Patch (RFC 6902) to a specific push token.No findings
Why it is in this group
- The name "patch_user_token" says "patch": a word for a change.
Description, as the server wrote it Apply a JSON Patch (RFC 6902) to a specific push token.
Annotations the server declares
- title: Patch User Token
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
put_journey_template_localeSet locale-specific content overrides for a journey-scoped notification template.No findings
Why it is in this group
- The name "put_journey_template_locale" says "put": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Put Journey Template Locale
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
put_notification_contentReplace the elemental content of a V2 notification template.No findings
Why it is in this group
- The name "put_notification_content" says "put": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Put Notification Content
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
put_notification_elementUpdate a single element within a V2 notification template.No findings
Why it is in this group
- The name "put_notification_element" says "put": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Put Notification Element
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
put_notification_localeSet locale-specific content overrides for a V2 notification template.No findings
Why it is in this group
- The name "put_notification_locale" says "put": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Put Notification Locale
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
release_digestRelease a digest schedule early — send what users have collected so far now instead of waiting for the scheduled time.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it 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.
Annotations the server declares
- title: Release Digest
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
release_user_digestRelease one recipient's held digest for a topic now, instead of waiting for its schedule.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it 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.
Annotations the server declares
- title: Release User Digest
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
replace_journey_templateReplace the draft of a journey-scoped notification template.No findings
Why it is in this group
- The name "replace_journey_template" says "replace": a word for a change.
Description, as the server wrote it Replace the draft of a journey-scoped notification template. Full document replacement. Call publish_journey_template afterwards to make it live.
Annotations the server declares
- title: Replace Journey Template
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
replace_notificationReplace a notification template entirely (full document PUT).No findings
Why it is in this group
- The name "replace_notification" says "replace": a word for a change.
Description, as the server wrote it Replace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.
Annotations the server declares
- title: Replace Notification
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
replace_preference_sectionReplace a preference section.No findings
Why it is in this group
- The name "replace_preference_section" says "replace": a word for a change.
Description, as the server wrote it Replace a preference section. Full document replacement; missing optional fields are cleared. Topics attached to the section are unaffected.
Annotations the server declares
- title: Replace Preference Section
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
replace_preference_topicReplace a topic within a section.No findings
Why it is in this group
- The name "replace_preference_topic" says "replace": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Replace Preference Topic
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
replace_preview_device_setReplace a preview device set's name and devices.No findings
Why it is in this group
- The name "replace_preview_device_set" says "replace": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- title: Replace Preview Device Set
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
replace_routing_strategyReplace a routing strategy.No findings
Why it is in this group
- The name "replace_routing_strategy" says "replace": a word for a change.
Description, as the server wrote it Replace a routing strategy. Full document replacement; missing optional fields are cleared.
Annotations the server declares
- title: Replace Routing Strategy
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
replace_tenant_templateCreate or replace a tenant notification template (draft unless published is true).3 findings
Why it is in this group
- The name "replace_tenant_template" says "replace": a word for a change.
Findings
- Warn
The input schema at properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.channels.$ref contains a 81-character base64 string.
What this check looks forMatched text
inputSchema.properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.channels.$ref: "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/proper..."
- Warn
The input schema at properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.ref.$ref contains a 76-character base64 string.
What this check looks forMatched text
inputSchema.properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.ref.$ref: "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/proper..."
- Warn
The input schema at properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.if.$ref contains a 75-character base64 string.
What this check looks forMatched text
inputSchema.properties.content.properties.elements.items.anyOf[0].anyOf[1].properties.if.$ref: "#/properties/content/properties/elements/items/anyOf/0/anyOf/0/proper..."
Description, as the server wrote it Create or replace a tenant notification template (draft unless published is true).
Annotations the server declares
- title: Replace Tenant Template
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
restore_listRestore a previously deleted list.1 finding
Why it is in this group
- The name "restore_list" says "list": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "restore_list" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}; The name "restore_list" says "list": a word for reading.
Description, as the server wrote it Restore a previously deleted list.
Annotations the server declares
- title: Restore List
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
run_bulk_jobRun a bulk job, triggering delivery to all added users.No findings
Why it is in this group
- The name "run_bulk_job" says "run": a word for a change.
Description, as the server wrote it Run a bulk job, triggering delivery to all added users.
Annotations the server declares
- title: Run Bulk Job
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
subscribe_user_to_listSubscribe a user to a list.No findings
Why it is in this group
- The name "subscribe_user_to_list" says "subscribe": a word for a change.
Description, as the server wrote it Subscribe a user to a list. Creates the list if it doesn't exist.
Annotations the server declares
- title: Subscribe User to List
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
subscribe_user_to_listsSubscribe a user to one or more lists.No findings
Why it is in this group
- The name "subscribe_user_to_lists" says "subscribe": a word for a change.
Description, as the server wrote it Subscribe a user to one or more lists. Creates lists that do not exist.
Annotations the server declares
- title: Subscribe User to Lists
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
trace_messageTrace delivery in one call.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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.
Annotations the server declares
- title: Trace Message
- readOnlyHint: true
track_inbound_eventTrack an inbound event that can trigger automations.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Track an inbound event that can trigger automations. Requires event name, messageId (for deduplication), and properties.
Annotations the server declares
- title: Track Inbound Event
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
update_audienceCreate or update an audience with a filter definition.No findings
Why it is in this group
- The name "update_audience" says "update": a word for a change.
Description, as the server wrote it Create or update an audience with a filter definition.
Annotations the server declares
- title: Update Audience
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
update_brandReplace an existing brand with new values.No findings
Why it is in this group
- The name "update_brand" says "update": a word for a change.
Description, as the server wrote it Replace an existing brand with new values.
Annotations the server declares
- title: Update Brand
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
update_notification_checksUpdate check statuses for a notification submission.No findings
Why it is in this group
- The name "update_notification_checks" says "update": a word for a change.
Description, as the server wrote it Update check statuses for a notification submission.
Annotations the server declares
- title: Update Notification Checks
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
update_tenant_preferenceSet the default notification preference for a subscription topic on a tenant.No findings
Why it is in this group
- The name "update_tenant_preference" says "update": a word for a change.
Description, as the server wrote it 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"] }.
Annotations the server declares
- title: Update Tenant Preference
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
update_translationCreate or update a translation for a specific locale.No findings
Why it is in this group
- The name "update_translation" says "update": a word for a change.
Description, as the server wrote it Create or update a translation for a specific locale. API reference: https://www.courier.com/docs/api-reference/translations/update-translations-by-locale.
Annotations the server declares
- title: Update Translation
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
update_user_preference_topicUpdate a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).No findings
Why it is in this group
- The name "update_user_preference_topic" says "update": a word for a change.
Description, as the server wrote it Update a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).
Annotations the server declares
- title: Update User Preference Topic
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
Only reads 71Claude Code: allow
courier_installation_guideGet the Courier SDK installation guide for one platform: the install command, a quick-start code sample and the relevant doc links.No findings
Why it is in this group
- The description's first verb is "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Courier Installation Guide
- readOnlyHint: true
get_audienceGet one audience by ID, including the filter that defines its membership.No findings
Why it is in this group
- The name "get_audience" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Audience
- readOnlyHint: true
get_audit_eventGet a specific audit event by its ID.No findings
Why it is in this group
- The name "get_audit_event" says "get": a word for reading.
Description, as the server wrote it Get a specific audit event by its ID.
Annotations the server declares
- title: Get Audit Event
- readOnlyHint: true
get_brandGet one brand by ID, including its colors, logo and styling settings.No findings
Why it is in this group
- The name "get_brand" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Brand
- readOnlyHint: true
get_broadcastGet a broadcast by id, including its channel and send or schedule state.No findings
Why it is in this group
- The name "get_broadcast" says "get": a word for reading.
Description, as the server wrote it Get a broadcast by id, including its channel and send or schedule state.
Annotations the server declares
- title: Get Broadcast
- readOnlyHint: true
get_broadcast_contentGet a broadcast's Elemental content.No findings
Why it is in this group
- The name "get_broadcast_content" says "get": a word for reading.
Description, as the server wrote it Get a broadcast's Elemental content.
Annotations the server declares
- title: Get Broadcast Content
- readOnlyHint: true
get_bulk_jobGet the status of a bulk job.No findings
Why it is in this group
- The name "get_bulk_job" says "get": a word for reading.
Description, as the server wrote it Get the status of a bulk job.
Annotations the server declares
- title: Get Bulk Job
- readOnlyHint: true
get_journeyGet a journey by ID.No findings
Why it is in this group
- The name "get_journey" says "get": a word for reading.
Description, as the server wrote it Get a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.
Annotations the server declares
- title: Get Journey
- readOnlyHint: true
get_journey_runGet one journey run by id: its journey, status, and timestamps.No findings
Why it is in this group
- The name "get_journey_run" says "get": a word for reading.
Description, as the server wrote it Get one journey run by id: its journey, status, and timestamps.
Annotations the server declares
- title: Get Journey Run
- readOnlyHint: true
get_journey_templateGet a journey-scoped notification template by notification ID.No findings
Why it is in this group
- The name "get_journey_template" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Journey Template
- readOnlyHint: true
get_journey_template_contentFetch the elemental content of a journey-scoped notification template.No findings
Why it is in this group
- The name "get_journey_template_content" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Journey Template Content
- readOnlyHint: true
get_listGet one list by its ID, including its name and current state.No findings
Why it is in this group
- The name "get_list" says "get": a word for reading.
Description, as the server wrote it Get one list by its ID, including its name and current state.
Annotations the server declares
- title: Get List
- readOnlyHint: true
get_list_subscribersList the users subscribed to a list.No findings
Why it is in this group
- The name "get_list_subscribers" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get List Subscribers
- readOnlyHint: true
get_messageGet the full details and status of a single message by its ID.No findings
Why it is in this group
- The name "get_message" says "get": a word for reading.
Description, as the server wrote it Get the full details and status of a single message by its ID.
Annotations the server declares
- title: Get Message
- readOnlyHint: true
get_message_contentGet the rendered content (HTML, text, subject) of a previously sent message.No findings
Why it is in this group
- The name "get_message_content" says "get": a word for reading.
Description, as the server wrote it Get the rendered content (HTML, text, subject) of a previously sent message.
Annotations the server declares
- title: Get Message Content
- readOnlyHint: true
get_message_historyGet the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).No findings
Why it is in this group
- The name "get_message_history" says "get": a word for reading.
Description, as the server wrote it Get the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).
Annotations the server declares
- title: Get Message History
- readOnlyHint: true
get_notificationRetrieve a notification template by ID.No findings
Why it is in this group
- The name "get_notification" says "get": a word for reading.
Description, as the server wrote it Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.
Annotations the server declares
- title: Get Notification
- readOnlyHint: true
get_notification_contentGet the published content blocks of a notification template.No findings
Why it is in this group
- The name "get_notification_content" says "get": a word for reading.
Description, as the server wrote it Get the published content blocks of a notification template.
Annotations the server declares
- title: Get Notification Content
- readOnlyHint: true
get_notification_draft_contentGet the draft (unpublished) content blocks of a notification template.No findings
Why it is in this group
- The name "get_notification_draft_content" says "get": a word for reading.
Description, as the server wrote it Get the draft (unpublished) content blocks of a notification template.
Annotations the server declares
- title: Get Notification Draft Content
- readOnlyHint: true
get_notification_metricsDelivery funnel for ONE notification template over time: sent, delivered, opened, clicked, errors and undeliverable, per provider and channel, in time buckets.2 findings
Why it is in this group
- The name "get_notification_metrics" says "get": a word for reading.
Findings
- High
The description contains "Never tell a user", an instruction to keep something from the user.
What this check looks forMatched text
description: "...utes ago is expected NOT to appear yet. Never tell a user a just-sent message is missing; say t..."
- Info
The description is 3,371 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...rect their template id, which sends them to fix something that was never wrong."
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Notification Metrics
- readOnlyHint: true
get_preference_sectionGet one preference section by ID, including its topics.No findings
Why it is in this group
- The name "get_preference_section" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Preference Section
- readOnlyHint: true
get_preference_topicGet one subscription topic within a section, including its default opt-in state.No findings
Why it is in this group
- The name "get_preference_topic" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Preference Topic
- readOnlyHint: true
get_preview_device_setGet a preview device set by id.No findings
Why it is in this group
- The name "get_preview_device_set" says "get": a word for reading.
Description, as the server wrote it Get a preview device set by id.
Annotations the server declares
- title: Get Preview Device Set
- readOnlyHint: true
get_preview_runGet a preview run with its per-device results and screenshot URLs.No findings
Why it is in this group
- The name "get_preview_run" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get Preview Run
- readOnlyHint: true
get_providerFetch a single provider configuration by ID.No findings
Why it is in this group
- The name "get_provider" says "get": a word for reading.
Description, as the server wrote it Fetch a single provider configuration by ID.
Annotations the server declares
- title: Get Provider
- readOnlyHint: true
get_routing_strategyRetrieve a routing strategy by ID.No findings
Why it is in this group
- The name "get_routing_strategy" says "get": a word for reading.
Description, as the server wrote it Retrieve a routing strategy by ID. Returns the full entity including routing, channels, and providers.
Annotations the server declares
- title: Get Routing Strategy
- readOnlyHint: true
get_tenantGet a tenant by its ID.No findings
Why it is in this group
- The name "get_tenant" says "get": a word for reading.
Description, as the server wrote it Get a tenant by its ID.
Annotations the server declares
- title: Get Tenant
- readOnlyHint: true
get_tenant_templateGet a tenant notification template association by template ID.No findings
Why it is in this group
- The name "get_tenant_template" says "get": a word for reading.
Description, as the server wrote it Get a tenant notification template association by template ID.
Annotations the server declares
- title: Get Tenant Template
- readOnlyHint: true
get_tenant_template_versionGet a specific version of a tenant notification template (e.g.No findings
Why it is in this group
- The name "get_tenant_template_version" says "get": a word for reading.
Description, as the server wrote it Get a specific version of a tenant notification template (e.g. latest, published, or v1).
Annotations the server declares
- title: Get Tenant Template Version
- readOnlyHint: true
get_translationGet a translation for a specific locale (e.g.No findings
Why it is in this group
- The name "get_translation" says "get": a word for reading.
Description, as the server wrote it Get a translation for a specific locale (e.g. "en_US", "fr_FR").
Annotations the server declares
- title: Get Translation
- readOnlyHint: true
get_user_list_subscriptionsList the lists one user is subscribed to.No findings
Why it is in this group
- The name "get_user_list_subscriptions" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get User List Subscriptions
- readOnlyHint: true
get_user_preference_topicGet one user's choice for a single subscription topic — whether they opted in or out, and per channel.No findings
Why it is in this group
- The name "get_user_preference_topic" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: Get User Preference Topic
- readOnlyHint: true
get_user_preferencesGet a user's notification preferences (subscriptions, opt-outs, channel preferences).No findings
Why it is in this group
- The name "get_user_preferences" says "get": a word for reading.
Description, as the server wrote it Get a user's notification preferences (subscriptions, opt-outs, channel preferences).
Annotations the server declares
- title: Get User Preferences
- readOnlyHint: true
get_user_profile_by_idGet a user profile by their ID.No findings
Why it is in this group
- The name "get_user_profile_by_id" says "get": a word for reading.
Description, as the server wrote it Get a user profile by their ID. Returns profile data including email, phone, and custom properties.
Annotations the server declares
- title: Get User Profile by ID
- readOnlyHint: true
get_user_push_tokenGet a specific push/device token for a user.No findings
Why it is in this group
- The name "get_user_push_token" says "get": a word for reading.
Description, as the server wrote it Get a specific push/device token for a user.
Annotations the server declares
- title: Get User Push Token
- readOnlyHint: true
list_audience_membersList the users who currently match an audience's filter.No findings
Why it is in this group
- The name "list_audience_members" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Audience Members
- readOnlyHint: true
list_audiencesList the workspace's audiences.No findings
Why it is in this group
- The name "list_audiences" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Audiences
- readOnlyHint: true
list_audit_eventsList audit events in the workspace.No findings
Why it is in this group
- The name "list_audit_events" says "list": a word for reading.
Description, as the server wrote it List audit events in the workspace. Useful for tracking API usage and changes.
Annotations the server declares
- title: List Audit Events
- readOnlyHint: true
list_automation_run_stepsList the steps of an automation run in order, with what happened at each.No findings
Why it is in this group
- The name "list_automation_run_steps" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Automation Run Steps
- readOnlyHint: true
list_automation_runsList automation runs, newest first.No findings
Why it is in this group
- The name "list_automation_runs" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Automation Runs
- readOnlyHint: true
list_automationsList the workspace's automation templates, each with its template ID and whether it has a published or draft version.No findings
Why it is in this group
- The name "list_automations" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Automations
- readOnlyHint: true
list_brandsList the workspace's brands.No findings
Why it is in this group
- The name "list_brands" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Brands
- readOnlyHint: true
list_broadcastsList broadcasts in the workspace.No findings
Why it is in this group
- The name "list_broadcasts" says "list": a word for reading.
Description, as the server wrote it List broadcasts in the workspace.
Annotations the server declares
- title: List Broadcasts
- readOnlyHint: true
list_bulk_usersList the users in a bulk job.No findings
Why it is in this group
- The name "list_bulk_users" says "list": a word for reading.
Description, as the server wrote it List the users in a bulk job.
Annotations the server declares
- title: List Bulk Users
- readOnlyHint: true
list_digest_instancesList the digest instances for a digest schedule.No findings
Why it is in this group
- The name "list_digest_instances" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Digest Instances
- readOnlyHint: true
list_journey_run_stepsList the steps of a journey run in order, with each node and what happened at it.No findings
Why it is in this group
- The name "list_journey_run_steps" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Journey Run Steps
- readOnlyHint: true
list_journey_runsList journey runs, newest first.No findings
Why it is in this group
- The name "list_journey_runs" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Journey Runs
- readOnlyHint: true
list_journey_template_versionsList published versions of a journey-scoped notification template, ordered most recent first.No findings
Why it is in this group
- The name "list_journey_template_versions" says "list": a word for reading.
Description, as the server wrote it List published versions of a journey-scoped notification template, ordered most recent first.
Annotations the server declares
- title: List Journey Template Versions
- readOnlyHint: true
list_journey_templatesList notification templates scoped to a journey.No findings
Why it is in this group
- The name "list_journey_templates" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Journey Templates
- readOnlyHint: true
list_journey_versionsList published versions of a journey, ordered most recent first.No findings
Why it is in this group
- The name "list_journey_versions" says "list": a word for reading.
Description, as the server wrote it List published versions of a journey, ordered most recent first.
Annotations the server declares
- title: List Journey Versions
- readOnlyHint: true
list_journeysList journey templates in the workspace, returning the journey IDs and version state of each.No findings
Why it is in this group
- The name "list_journeys" says "list": a word for reading.
Description, as the server wrote it List journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).
Annotations the server declares
- title: List Journeys
- readOnlyHint: true
list_listsList the workspace's lists.No findings
Why it is in this group
- The name "list_lists" says "list": a word for reading.
Description, as the server wrote it 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.*".
Annotations the server declares
- title: List Lists
- readOnlyHint: true
list_messagesList messages you've previously sent.No findings
Why it is in this group
- The name "list_messages" says "list": a word for reading.
Description, as the server wrote it List messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.
Annotations the server declares
- title: List Messages
- readOnlyHint: true
list_notification_checksList the checks recorded against one notification submission.No findings
Why it is in this group
- The name "list_notification_checks" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Notification Checks
- readOnlyHint: true
list_notification_versionsList the version history of a notification template — each published version with when it was created.No findings
Why it is in this group
- The name "list_notification_versions" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Notification Versions
- readOnlyHint: true
list_notificationsList notification templates, newest first.No findings
Why it is in this group
- The name "list_notifications" says "list": a word for reading.
Description, as the server wrote it List notification templates, newest first. Pass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.
Annotations the server declares
- title: List Notifications
- readOnlyHint: true
list_preference_logsList preference changes, newest first.No findings
Why it is in this group
- The name "list_preference_logs" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Preference Logs
- readOnlyHint: true
list_preference_sectionsList the workspace's preference sections, each with the topics inside it.No findings
Why it is in this group
- The name "list_preference_sections" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Preference Sections
- readOnlyHint: true
list_preference_topicsList the subscription topics inside one preference section.No findings
Why it is in this group
- The name "list_preference_topics" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Preference Topics
- readOnlyHint: true
list_preview_device_setsList saved preview device sets.No findings
Why it is in this group
- The name "list_preview_device_sets" says "list": a word for reading.
Description, as the server wrote it List saved preview device sets. Every workspace has a read-only Courier Recommended set that runs can use without creating a set first.
Annotations the server declares
- title: List Preview Device Sets
- readOnlyHint: true
list_preview_devicesList the email clients a preview can render on.No findings
Why it is in this group
- The name "list_preview_devices" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Preview Devices
- readOnlyHint: true
list_preview_runsList a template's preview runs, newest first.No findings
Why it is in this group
- The name "list_preview_runs" says "list": a word for reading.
Description, as the server wrote it List a template's preview runs, newest first.
Annotations the server declares
- title: List Preview Runs
- readOnlyHint: true
list_provider_catalogList the provider integrations Courier supports and the configuration each one expects.No findings
Why it is in this group
- The name "list_provider_catalog" says "list": a word for reading.
Description, as the server wrote it 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".
Annotations the server declares
- title: List Provider Catalog
- readOnlyHint: true
list_providersList configured provider integrations for the workspace.No findings
Why it is in this group
- The name "list_providers" says "list": a word for reading.
Description, as the server wrote it List configured provider integrations for the workspace.
Annotations the server declares
- title: List Providers
- readOnlyHint: true
list_routing_strategiesList the workspace's routing strategies, returning metadata only.No findings
Why it is in this group
- The name "list_routing_strategies" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Routing Strategies
- readOnlyHint: true
list_routing_strategy_notificationsList notification templates associated with a routing strategy.No findings
Why it is in this group
- The name "list_routing_strategy_notifications" says "list": a word for reading.
Description, as the server wrote it List notification templates associated with a routing strategy. Useful for checking linked templates before archiving.
Annotations the server declares
- title: List Routing Strategy Notifications
- readOnlyHint: true
list_tenant_templatesList notification templates configured for a tenant.No findings
Why it is in this group
- The name "list_tenant_templates" says "list": a word for reading.
Description, as the server wrote it List notification templates configured for a tenant.
Annotations the server declares
- title: List Tenant Templates
- readOnlyHint: true
list_tenant_usersList the users associated with one tenant.No findings
Why it is in this group
- The name "list_tenant_users" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Tenant Users
- readOnlyHint: true
list_tenantsList the workspace's tenants.No findings
Why it is in this group
- The name "list_tenants" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List Tenants
- readOnlyHint: true
list_user_push_tokensList all push/device tokens for a user.No findings
Why it is in this group
- The name "list_user_push_tokens" says "list": a word for reading.
Description, as the server wrote it List all push/device tokens for a user.
Annotations the server declares
- title: List User Push Tokens
- readOnlyHint: true
list_user_tenantsList the tenants a user belongs to.No findings
Why it is in this group
- The name "list_user_tenants" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- title: List User Tenants
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.3.7. Values in angle brackets are yours to fill in.
claude mcp add --transport http courier https://mcp.courier.com --header 'api_key: <your-api-key>'Run in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__courier__list_messages",
"mcp__courier__get_message",
"mcp__courier__get_message_content",
"mcp__courier__get_message_history",
"mcp__courier__list_notifications",
"mcp__courier__get_notification_content",
"mcp__courier__get_notification_draft_content",
"mcp__courier__get_notification",
"mcp__courier__list_notification_versions",
"mcp__courier__list_notification_checks",
"mcp__courier__list_providers",
"mcp__courier__get_provider",
"mcp__courier__list_provider_catalog",
"mcp__courier__get_routing_strategy",
"mcp__courier__list_routing_strategies",
"mcp__courier__list_preference_sections",
"mcp__courier__get_preference_section",
"mcp__courier__list_preference_topics",
"mcp__courier__get_preference_topic",
"mcp__courier__get_journey",
"mcp__courier__list_journeys",
"mcp__courier__list_journey_templates",
"mcp__courier__get_journey_template",
"mcp__courier__get_journey_template_content",
"mcp__courier__get_notification_metrics",
"mcp__courier__get_tenant",
"mcp__courier__list_tenants",
"mcp__courier__list_tenant_users",
"mcp__courier__get_user_profile_by_id",
"mcp__courier__get_user_list_subscriptions",
"mcp__courier__get_user_preferences",
"mcp__courier__get_user_preference_topic",
"mcp__courier__list_user_tenants",
"mcp__courier__list_brands",
"mcp__courier__get_brand",
"mcp__courier__courier_installation_guide",
"mcp__courier__list_automations",
"mcp__courier__list_audiences",
"mcp__courier__get_audience",
"mcp__courier__list_audience_members",
"mcp__courier__list_lists",
"mcp__courier__get_list",
"mcp__courier__get_list_subscribers",
"mcp__courier__list_digest_instances",
"mcp__courier__get_audit_event",
"mcp__courier__list_audit_events",
"mcp__courier__list_automation_runs",
"mcp__courier__list_automation_run_steps",
"mcp__courier__get_bulk_job",
"mcp__courier__list_bulk_users",
"mcp__courier__list_tenant_templates",
"mcp__courier__get_tenant_template",
"mcp__courier__get_tenant_template_version",
"mcp__courier__get_translation",
"mcp__courier__list_user_push_tokens",
"mcp__courier__get_user_push_token",
"mcp__courier__list_routing_strategy_notifications",
"mcp__courier__list_journey_versions",
"mcp__courier__list_journey_template_versions",
"mcp__courier__list_journey_runs",
"mcp__courier__get_journey_run",
"mcp__courier__list_journey_run_steps",
"mcp__courier__list_preference_logs",
"mcp__courier__list_broadcasts",
"mcp__courier__get_broadcast",
"mcp__courier__get_broadcast_content",
"mcp__courier__list_preview_devices",
"mcp__courier__list_preview_device_sets",
"mcp__courier__get_preview_device_set",
"mcp__courier__list_preview_runs",
"mcp__courier__get_preview_run"
],
"ask": [
"mcp__courier__create_notification",
"mcp__courier__replace_notification",
"mcp__courier__put_notification_content",
"mcp__courier__put_notification_element",
"mcp__courier__put_notification_locale",
"mcp__courier__create_journey",
"mcp__courier__create_journey_template",
"mcp__courier__put_journey_template_locale",
"mcp__courier__update_audience",
"mcp__courier__generate_jwt_for_user",
"mcp__courier__invoke_automation_template",
"mcp__courier__invoke_ad_hoc_automation",
"mcp__courier__create_brand",
"mcp__courier__update_brand",
"mcp__courier__create_bulk_job",
"mcp__courier__add_bulk_users",
"mcp__courier__run_bulk_job",
"mcp__courier__track_inbound_event",
"mcp__courier__create_list",
"mcp__courier__subscribe_user_to_list",
"mcp__courier__restore_list",
"mcp__courier__add_subscribers_to_list",
"mcp__courier__resend_message",
"mcp__courier__trace_message",
"mcp__courier__publish_notification",
"mcp__courier__update_notification_checks",
"mcp__courier__create_or_merge_user",
"mcp__courier__patch_profile",
"mcp__courier__subscribe_user_to_lists",
"mcp__courier__send_message",
"mcp__courier__send_message_template",
"mcp__courier__send_message_to_list",
"mcp__courier__send_message_to_list_template",
"mcp__courier__create_or_update_tenant",
"mcp__courier__update_tenant_preference",
"mcp__courier__replace_tenant_template",
"mcp__courier__publish_tenant_template",
"mcp__courier__update_translation",
"mcp__courier__create_or_replace_user_push_token",
"mcp__courier__bulk_add_user_tokens",
"mcp__courier__patch_user_token",
"mcp__courier__update_user_preference_topic",
"mcp__courier__add_user_to_tenant",
"mcp__courier__bulk_add_user_tenants",
"mcp__courier__bulk_update_user_preferences",
"mcp__courier__create_routing_strategy",
"mcp__courier__replace_routing_strategy",
"mcp__courier__invoke_journey",
"mcp__courier__publish_journey",
"mcp__courier__replace_journey_template",
"mcp__courier__publish_journey_template",
"mcp__courier__create_provider",
"mcp__courier__create_preference_section",
"mcp__courier__replace_preference_section",
"mcp__courier__publish_preferences",
"mcp__courier__create_preference_topic",
"mcp__courier__replace_preference_topic",
"mcp__courier__release_digest",
"mcp__courier__release_user_digest",
"mcp__courier__create_broadcast",
"mcp__courier__rename_broadcast",
"mcp__courier__put_broadcast_content",
"mcp__courier__send_broadcast",
"mcp__courier__schedule_broadcast",
"mcp__courier__duplicate_broadcast",
"mcp__courier__create_preview_device_set",
"mcp__courier__replace_preview_device_set",
"mcp__courier__create_preview_run"
],
"deny": [
"mcp__courier__replace_journey",
"mcp__courier__put_journey_template_content",
"mcp__courier__delete_audience",
"mcp__courier__cancel_automation",
"mcp__courier__delete_brand",
"mcp__courier__unsubscribe_user_from_list",
"mcp__courier__delete_list",
"mcp__courier__bulk_subscribe_to_list",
"mcp__courier__cancel_message",
"mcp__courier__archive_notification",
"mcp__courier__cancel_notification_submission",
"mcp__courier__replace_profile",
"mcp__courier__delete_profile",
"mcp__courier__delete_user_list_subscriptions",
"mcp__courier__delete_tenant",
"mcp__courier__delete_tenant_preference",
"mcp__courier__delete_tenant_template",
"mcp__courier__delete_user_token",
"mcp__courier__delete_user_preference_topic",
"mcp__courier__remove_user_from_tenant",
"mcp__courier__remove_all_user_tenants",
"mcp__courier__bulk_replace_user_preferences",
"mcp__courier__archive_request",
"mcp__courier__archive_routing_strategy",
"mcp__courier__archive_journey",
"mcp__courier__archive_journey_template",
"mcp__courier__cancel_journey",
"mcp__courier__update_provider",
"mcp__courier__delete_provider",
"mcp__courier__archive_preference_section",
"mcp__courier__archive_preference_topic",
"mcp__courier__delete_broadcast",
"mcp__courier__cancel_broadcast_schedule",
"mcp__courier__archive_preview_device_set"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as courier. Review it before you use it.
