Courier
REMOTE · MCP.COURIER.COM · SCANNED SEP 24
Send notifications, manage templates, and configure integrations with Courier.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (replace_journey). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability82
- AI-judged instruction clarity (excellent).Pass
- Tool/resource definitions use about 14709 tokens (~91/item across 161 items; 161 tools + 0 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- Stability check failed: schema churn in the 30 days we've observed: 0 tool removals, 1 breaking changes, 0 auth/transport breaks, 17 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 99% of tool parameters carry a description.Partial
Tool Safety50
- Injection-marker check failed: the description of tool "get_notification_metrics" contains an instruction to conceal the call from the user, the text "do NOT tell the user", at byte 3262 of that field. See how to fix → Fail
- All 25 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 161 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the Courier MCP server?
Courier is a hosted endpoint at https://mcp.courier.com/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.courier.com
claude mcp add --transport http trycourier-courier 'https://mcp.courier.com/'
{
"mcpServers": {
"trycourier-courier": {
"url": "https://mcp.courier.com/"
}
}
} {
"servers": {
"trycourier-courier": {
"type": "http",
"url": "https://mcp.courier.com/"
}
}
} [mcp_servers.trycourier-courier] url = "https://mcp.courier.com/"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"trycourier-courier": {
"type": "remote",
"url": "https://mcp.courier.com/",
"enabled": true
}
}
} openclaw mcp add trycourier-courier --url 'https://mcp.courier.com/' --transport streamable-http
mcp_servers:
trycourier-courier:
url: "https://mcp.courier.com/" {
"McpServers": {
"trycourier-courier": {
"Transport": "http",
"Url": "https://mcp.courier.com/"
}
}
} assistant mcp add trycourier-courier -t streamable-http -u 'https://mcp.courier.com/'
{
"mcpServers": {
"trycourier-courier": {
"type": "http",
"url": "https://mcp.courier.com/"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 23 Sept 26 0
- New tool “cancel_broadcast_schedule”, which the server declares destructive security
- New tool “delete_broadcast”, which the server declares destructive security
- Tool “put_journey_template_locale” rewrote its description, which is the text the model reads security
- Tool “replace_preference_topic” rewrote its description, which is the text the model reads security
- Schema quality: 13327 → 14709 ▼ functional
- New tool “create_broadcast” functional
- New tool “duplicate_broadcast” functional
- New tool “get_broadcast” functional
- New tool “get_broadcast_content” functional
- New tool “get_journey_run” functional
- New tool “list_broadcasts” functional
- New tool “list_journey_run_steps” functional
- New tool “list_journey_runs” functional
- New tool “put_broadcast_content” functional
- New tool “release_user_digest” functional
- New tool “rename_broadcast” functional
- New tool “schedule_broadcast” functional
- New tool “send_broadcast” functional
- New tool “trace_message” functional
- “create_preference_topic” added an optional parameter “digest” cosmetic
- “replace_preference_topic” added an optional parameter “digest” cosmetic
- “update_user_preference_topic” added an optional parameter “digest_schedule_id” cosmetic
- “update_user_preference_topic” added an optional parameter “tenant_id” cosmetic
- “put_journey_template_locale” reworded the description of “journey_id” cosmetic
- “put_journey_template_locale” reworded the description of “notification_id” cosmetic
- “put_journey_template_locale” reworded the description of “state” cosmetic
- 16 Sept 26 0
- Tool “create_journey_template” rewrote its description, which is the text the model reads security
- Tool “create_notification” rewrote its description, which is the text the model reads security
- Tool “put_notification_content” rewrote its description, which is the text the model reads security
- Tool “put_notification_element” rewrote its description, which is the text the model reads security
- Tool “put_notification_locale” rewrote its description, which is the text the model reads security
- Tool “replace_notification” rewrote its description, which is the text the model reads security
- “create_journey_template” reworded the description of “journey_id” cosmetic
- “create_notification” reworded the description of “state” cosmetic
- “get_journey” reworded the description of “journey_id” cosmetic
- “get_journey_template” reworded the description of “journey_id” cosmetic
- “get_journey_template” reworded the description of “notification_id” cosmetic
- “get_journey_template_content” reworded the description of “journey_id” cosmetic
- “get_journey_template_content” reworded the description of “notification_id” cosmetic
- “get_notification” reworded the description of “notification_id” cosmetic
- “get_notification” reworded the description of “version” cosmetic
- “get_notification_content” reworded the description of “notification_id” cosmetic
- “get_notification_draft_content” reworded the description of “notification_id” cosmetic
- “get_user_preferences” reworded the description of “tenant_id” cosmetic
- “list_journey_templates” reworded the description of “cursor” cosmetic
- “list_journey_templates” reworded the description of “journey_id” cosmetic
- “list_journeys” reworded the description of “cursor” cosmetic
- “list_journeys” reworded the description of “version” cosmetic
- “list_messages” reworded the description of “archived” cosmetic
- “list_messages” reworded the description of “cursor” cosmetic
- “list_notifications” reworded the description of “cursor” cosmetic
- “list_providers” reworded the description of “cursor” cosmetic
- “put_journey_template_content” reworded the description of “elements” cosmetic
- “put_journey_template_content” reworded the description of “journey_id” cosmetic
- “put_journey_template_content” reworded the description of “notification_id” cosmetic
- “put_notification_content” reworded the description of “notification_id” cosmetic
- “put_notification_content” reworded the description of “state” cosmetic
- “put_notification_content” reworded the description of “version” cosmetic
- “put_notification_element” reworded the description of “element_id” cosmetic
- “put_notification_element” reworded the description of “notification_id” cosmetic
- “put_notification_element” reworded the description of “state” cosmetic
- “put_notification_locale” reworded the description of “notification_id” cosmetic
- “put_notification_locale” reworded the description of “state” cosmetic
- “replace_journey” reworded the description of “journey_id” cosmetic
- “replace_notification” reworded the description of “notification_id” cosmetic
- “replace_notification” reworded the description of “state” cosmetic
- 15 Sept 26 −3
- Injection markers: pass → fail ▼ security
- New tool “get_notification_metrics” functional
- 4 Sept 26 +1
- Stability: pass → fail ▼ security
- A breaking change shipped without a version bump: still 1.3.7 ▼ security
- Tool “create_journey” rewrote its description, which is the text the model reads security
- Tool “create_journey_template” rewrote its description, which is the text the model reads security
- Tool “create_notification” rewrote its description, which is the text the model reads security
- Tool “invoke_automation_template” rewrote its description, which is the text the model reads security
- Tool “invoke_journey” rewrote its description, which is the text the model reads security
- Tool “list_automations” rewrote its description, which is the text the model reads security
- Tool “list_journeys” rewrote its description, which is the text the model reads security
- Tool “replace_journey” rewrote its description, which is the text the model reads security
- Tool “send_message” rewrote its description, which is the text the model reads security
- Tool “send_message_template” rewrote its description, which is the text the model reads security
- Tool “send_message_to_list” rewrote its description, which is the text the model reads security
- Tool “update_translation” rewrote its description, which is the text the model reads security
- Tool “bulk_subscribe_to_list” is now declared destructive security
- Tool “update_provider” is now declared destructive security
- “replace_tenant_template” made “content” required, so existing callers break ▼ functional
- Destructive annotations: All 23 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation. functional
- “create_or_update_tenant” reworded the description of “default_preferences” cosmetic
- “replace_journey” reworded the description of “nodes” cosmetic
- “replace_tenant_template” reworded the description of “channels” cosmetic
- “replace_tenant_template” reworded the description of “content” cosmetic
- “replace_tenant_template” reworded the description of “providers” cosmetic
- “replace_tenant_template” reworded the description of “routing” cosmetic
- “update_audience” reworded the description of “filter” cosmetic
- 26 Aug 26 81
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Aug 26 0
- Stability: 0.97 → pass security
- 20 Aug 26 0
- Tool “create_journey” rewrote its description, which is the text the model reads security
- Tool “create_journey_template” rewrote its description, which is the text the model reads security
- Tool “put_journey_template_content” rewrote its description, which is the text the model reads security
- Tool “replace_journey” rewrote its description, which is the text the model reads security
- Tool “put_journey_template_content” is now declared destructive security
- Tool “replace_journey” is now declared destructive security
- “create_journey” reworded the description of “state” cosmetic
- “create_journey_template” reworded the description of “state” cosmetic
- “put_journey_template_content” reworded the description of “state” cosmetic
- “replace_journey” reworded the description of “state” cosmetic
- 11 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 24 Sept 2026 · Probed https://mcp.courier.com
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=mcp.courier.com | CN=WE1,O=Google Trust Services,C=US | 9 Aug 2026 | 7 Nov 2026 | ECDSA 256 | ECDSA-SHA256 | df2aea7fc821556213cbc21276951523 |
| SANs: mcp.courier.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.courier.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| courier.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000; includeSubDomains |
| content-security-policy | default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests |
| x-content-type-options | nosniff |
| x-frame-options | SAMEORIGIN |
| referrer-policy | no-referrer |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.courier.com | Verified | 200 | |
| http (plaintext) | http://mcp.courier.com | HTTPS enforced | 301 | https://mcp.courier.com/ |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
list_notification_checks ~43
List checks for a notification submission.
| Name | Type | Req | Description |
|---|---|---|---|
| notification_id | string | yes | The notification template ID |
| submission_id | string | yes | The submission ID for the checks resource |
No output schema declared.
No examples provided.
list_notification_versions ~61
List version history for a notification template.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor from a previous response |
| limit | number | – | Max versions per page (default 10, max 10) |
| notification_id | string | yes | The notification template ID |
No output schema declared.
No examples provided.
list_notifications ~78
List notification templates. Optionally filter by cursor.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have o… |
No output schema declared.
No examples provided.
list_preference_sections ~23
List the workspace's preference sections. Each section embeds its topics.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_preference_topics ~31
List the topics in a preference section.
| Name | Type | Req | Description |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
No output schema declared.
No examples provided.
list_provider_catalog ~68
List available provider types from the catalog with their configuration schemas.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | Filter by channel type (email, sms, push, etc.) |
| keys | string | – | Comma-separated provider keys to filter by |
| name | string | – | Substring match on provider name |
No output schema declared.
No examples provided.
list_providers ~77
List configured provider integrations for the workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this entirely when you don't have o… |
No output schema declared.
No examples provided.
list_routing_strategies ~57
List routing strategies in the workspace. Returns metadata only; use get for full details.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| limit | number | – | Max results per page (default 20, max 100) |
No output schema declared.
No examples provided.
list_routing_strategy_notifications ~74
List notification templates associated with a routing strategy. Useful for checking linked templates before archiving.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| limit | number | – | Max results per page (default 20, max 100) |
| routing_strategy_id | string | yes | The routing strategy ID (rs_ prefix) |
No output schema declared.
No examples provided.
list_tenant_templates ~57
List notification templates configured for a tenant.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| limit | number | – | Max results per page (default 20, max 100) |
| tenant_id | string | yes | The tenant ID |
No output schema declared.
No examples provided.
list_tenant_users ~56
List users associated with a tenant.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| limit | number | – | Max results per page (default 20, max 100) |
| tenant_id | string | yes | The tenant ID |
No output schema declared.
No examples provided.
list_tenants ~36
List all tenants in the workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| limit | number | – | Max results per page |
No output schema declared.
No examples provided.
list_user_push_tokens ~30
List all push/device tokens for a user.
| Name | Type | Req | Description |
|---|---|---|---|
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
list_user_tenants ~49
List all tenants a user belongs to.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| limit | number | – | Max results per page |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
patch_profile ~62
Partially update a user profile via JSON Patch (RFC 6902). Use add/replace/remove operations on specific profile paths.
| Name | Type | Req | Description |
|---|---|---|---|
| patch | array | yes | Array of JSON Patch operations to apply to the profile |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
patch_user_token ~58
Apply a JSON Patch (RFC 6902) to a specific push token.
| Name | Type | Req | Description |
|---|---|---|---|
| patch | array | yes | Array of JSON Patch operations |
| token | string | yes | The token identifier |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
publish_journey ~93
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.
| Name | Type | Req | Description |
|---|---|---|---|
| journey_id | string | yes | The journey template ID to publish |
| version | string | – | Historical version to roll back to (e.g. "v001"). Omit to publish the current draft. |
No output schema declared.
No examples provided.
publish_journey_template ~88
Publish the current draft of a journey-scoped notification template. Optionally pass version to roll back to a prior version.
| Name | Type | Req | Description |
|---|---|---|---|
| journey_id | string | yes | The journey template ID that owns this notification |
| notification_id | string | yes | The notification template ID |
| version | string | – | Version to roll back to (e.g. "v1"). Omit to publish current draft. |
No output schema declared.
No examples provided.
publish_notification ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| notification_id | string | yes | The notification template ID to publish |
| version | string | – | Historical version to publish (e.g. v001); omit to publish current draft |
No output schema declared.
No examples provided.
publish_preferences ~41
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
publish_tenant_template ~65
Publish a version of a tenant notification template.
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | The template ID |
| tenant_id | string | yes | The tenant ID |
| version | string | – | Version to publish (e.g. v1, latest); defaults to latest if omitted |
No output schema declared.
No examples provided.
put_broadcast_content ~91
Replace a broadcast's content with an Elemental document. Saved as a draft unless state is PUBLISHED.
| Name | Type | Req | Description |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| content | object | yes | Elemental content, e.g. { "version": "2022-01-01", "elements": [...] }. version defaults when omitted. |
| state | string | – | Template state. Defaults to DRAFT. |
No output schema declared.
No examples provided.
put_journey_template_content ~248
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.
| Name | Type | Req | Description |
|---|---|---|---|
| elements | array | yes | Array of elemental content nodes. Likely must be wrapped in a channel block, the same way create_journey_template's content requires — not independently confirmed for this call, but they write the sa… |
| journey_id | string | yes | The journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| state | string | – | Template state after update. Must be "DRAFT". These tools cannot publish. |
| version | string | – | Content version string (e.g. "2022-01-01"). Server defaults when omitted. |
No output schema declared.
No examples provided.
put_journey_template_locale ~192
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.
| Name | Type | Req | Description |
|---|---|---|---|
| elements | array | yes | Array of element overrides with id and locale-specific content |
| journey_id | string | yes | The journey template ID that owns this notification. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| locale_id | string | yes | Locale identifier (e.g. es, fr, pt-BR) |
| notification_id | string | yes | The notification template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| state | string | – | Template state after update. Must be "DRAFT". These tools cannot publish. |
No output schema declared.
No examples provided.
put_notification_content ~262
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.
| Name | Type | Req | Description |
|---|---|---|---|
| elements | array | yes | Array of elemental content nodes |
| notification_id | string | yes | The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| state | string | – | Must be "DRAFT". These tools cannot publish. |
| version | string | – | Content version string (e.g. "2022-01-01"). Server defaults when omitted. |
No output schema declared.
No examples provided.
put_notification_element ~224
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.
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | – | Channels this element applies to |
| data | object | – | Element data payload |
| element_id | string | yes | The element ID to update, from a prior get_notification or get_notification_draft_content response. Copy it exactly, character for character, from the response that returned it — never retype it from… |
| if | string | – | Conditional expression for element visibility |
| loop | string | – | Loop expression for repeating elements |
| notification_id | string | yes | The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| ref | string | – | Reference identifier |
| state | string | – | Must be "DRAFT". These tools cannot publish. |
| type | string | yes | Element type (e.g. text, action, image, divider, meta) |
No output schema declared.
No examples provided.
put_notification_locale ~215
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.
| Name | Type | Req | Description |
|---|---|---|---|
| elements | array | yes | Array of element overrides with id and locale-specific content |
| locale_id | string | yes | Locale identifier (e.g. es, fr, pt-BR) |
| notification_id | string | yes | The notification template ID (nt_ prefix). Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| state | string | – | Must be "DRAFT". These tools cannot publish. |
No output schema declared.
No examples provided.
release_digest ~67
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.
| Name | Type | Req | Description |
|---|---|---|---|
| schedule_id | string | yes | The digest schedule id, in the form "sch/{uuid}" |
No output schema declared.
No examples provided.
release_user_digest ~139
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.
| Name | Type | Req | Description |
|---|---|---|---|
| section_id | string | yes | Id of the preference section the topic belongs to |
| tenant_id | string | – | The recipient's tenant, when they were sent to as part of one |
| topic_id | string | yes | Id of the digest topic |
| user_id | string | yes | The recipient whose digest to release |
No output schema declared.
No examples provided.
remove_all_user_tenants ~29
Remove a user from all tenants.
| Name | Type | Req | Description |
|---|---|---|---|
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
remove_user_from_tenant ~40
Remove a user from a tenant.
| Name | Type | Req | Description |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
rename_broadcast ~40
Rename a broadcast. Content and channel are unchanged.
| Name | Type | Req | Description |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| name | string | yes | The new name |
No output schema declared.
No examples provided.
replace_journey ~725
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.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | – | Whether the journey is active. |
| journey_id | string | yes | The journey template ID to update. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| name | string | yes | Journey display name |
| nodes | array | yes | Complete array of journey nodes: the trigger first, a terminal exit last, and everything else between them. Use server-assigned node ids from get_journey — do NOT invent new ids. Send node example: {… |
| state | string | – | Must be "DRAFT". These tools cannot publish. |
No output schema declared.
No examples provided.
replace_journey_template ~91
Replace the draft of a journey-scoped notification template. Full document replacement. Call publish_journey_template afterwards to make it live.
| Name | Type | Req | Description |
|---|---|---|---|
| journey_id | string | yes | The journey template ID that owns this notification |
| notification | object | yes | Full notification template definition |
| notification_id | string | yes | The notification template ID |
| state | string | – | "PUBLISHED" to publish immediately after replace |
No output schema declared.
No examples provided.
replace_notification ~103
Replace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.
| Name | Type | Req | Description |
|---|---|---|---|
| notification | object | yes | Full notification template payload |
| notification_id | string | yes | The notification template ID to replace. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| state | string | – | Must be "DRAFT". These tools cannot publish. |
No output schema declared.
No examples provided.
replace_preference_section ~96
Replace a preference section. Full document replacement; missing optional fields are cleared. Topics attached to the section are unaffected.
| Name | Type | Req | Description |
|---|---|---|---|
| has_custom_routing | boolean | – | Whether the section defines custom routing for its topics |
| name | string | yes | Human-readable name for the section |
| routing_options | array | – | Default channels for the section. Omit to clear. |
| section_id | string | yes | Id of the preference section |
No output schema declared.
No examples provided.
replace_preference_topic ~222
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allowed_preferences | array | – | Preference controls a recipient may customize. Omit to clear. |
| default_status | string | yes | Default subscription status applied when a recipient has not set their own |
| digest | – | – | Batch this topic's notifications into a scheduled digest. Omit to leave any existing digest untouched; pass null to turn it off. |
| include_unsubscribe_header | boolean | – | Whether to include a list-unsubscribe header on emails for this topic |
| name | string | yes | Human-readable name for the preference topic |
| routing_options | array | – | Default channels delivered for this topic. Omit to clear. |
| section_id | string | yes | Id of the preference section |
| topic_data | object | – | Arbitrary metadata associated with the topic. Omit to clear. |
| topic_id | string | yes | Id of the subscription preference topic |
No output schema declared.
No examples provided.
replace_profile ~54
Fully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.
| Name | Type | Req | Description |
|---|---|---|---|
| profile | object | yes | Complete profile data to replace with |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
replace_routing_strategy ~115
Replace a routing strategy. Full document replacement; missing optional fields are cleared.
| Name | Type | Req | Description |
|---|---|---|---|
| channels | object | – | Per-channel delivery configuration. Omit to clear. |
| description | string | – | Description. Omit to clear. |
| name | string | yes | Human-readable name |
| providers | object | – | Per-provider delivery configuration. Omit to clear. |
| routing | object | yes | Routing tree |
| routing_strategy_id | string | yes | The routing strategy ID |
| tags | array | – | Tags. Omit to clear. |
No output schema declared.
No examples provided.
replace_tenant_template ~243
Create or replace a tenant notification template (draft unless published is true).
| Name | Type | Req | Description |
|---|---|---|---|
| channels | object | – | Per-channel delivery configuration, keyed by channel name. Example: { "email": { "providers": ["sendgrid"], "routing_method": "single" } } |
| content | object | yes | Elemental content document. Example: { "version": "2022-01-01", "elements": [{ "type": "meta", "title": "Welcome" }, { "type": "text", "content": "Thanks for signing up." }] } |
| providers | object | – | Per-provider configuration, keyed by provider name. Example: { "sendgrid": { "override": { "from": "noreply@example.com" } } } |
| published | boolean | – | When true, publish immediately after save |
| routing | object | – | Message routing tree. Example: { "method": "single", "channels": ["email", "sms"] } |
| template_id | string | yes | The template ID |
| tenant_id | string | yes | The tenant ID |
| title | string | – | Optional title merged into template content when provided |
No output schema declared.
No examples provided.
resend_message ~75
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).
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | The message ID of the original message to resend |
No output schema declared.
No examples provided.
restore_list ~25
Restore a previously deleted list.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | yes | The list ID |
No output schema declared.
No examples provided.
run_bulk_job ~35
Run a bulk job, triggering delivery to all added users.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The bulk job ID to run |
No output schema declared.
No examples provided.
schedule_broadcast ~127
Schedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.
| Name | Type | Req | Description |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| recipient_id | string | yes | The list or audience id |
| recipient_type | string | yes | Whether to send to a list or an audience |
| scheduled_to | string | yes | Wall-clock time of the send with no timezone offset, e.g. 2026-10-01T09:00:00 |
| timezone | string | – | IANA timezone scheduled_to is expressed in, e.g. America/New_York |
No output schema declared.
No examples provided.
send_broadcast ~68
Send a broadcast now to every member of a list or audience. This delivers real messages.
| Name | Type | Req | Description |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
| recipient_id | string | yes | The list or audience id |
| recipient_type | string | yes | Whether to send to a list or an audience |
No output schema declared.
No examples provided.
send_message ~140
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.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | Message body |
| channels | array | – | Channel names to route through (e.g. email, sms, push). Omit to use default routing. |
| data | object | – | Key-value data to include with the message |
| method | string | – | Routing method: deliver to all channels or stop after first success |
| title | string | yes | Message title |
| user_id | string | yes | The recipient user ID |
No output schema declared.
No examples provided.
send_message_template ~144
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" } }.
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | – | Channel names to route through. Omit to use template routing config. |
| data | object | – | Key-value data for template variables |
| method | string | – | Routing method |
| template | string | yes | Template ID or notification slug |
| user_id | string | yes | The recipient user ID |
No output schema declared.
No examples provided.
send_message_to_list ~116
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.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | Message body |
| channels | array | – | Channel names to route through. Omit to use default routing. |
| data | object | – | Key-value data to include |
| list_id | string | yes | The list ID to send to |
| method | string | – | Routing method |
| title | string | yes | Message title |
No output schema declared.
No examples provided.
send_message_to_list_template ~93
Send a message to all subscribers of a list using a notification template.
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | – | Channel names to route through. Omit to use template routing config. |
| data | object | – | Key-value data for template variables |
| list_id | string | yes | The list ID to send to |
| method | string | – | Routing method |
| template | string | yes | Template ID or notification slug |
No output schema declared.
No examples provided.
subscribe_user_to_list ~59
Subscribe a user to a list. Creates the list if it doesn't exist.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | yes | The list ID |
| preferences | object | – | Optional notification preferences |
| user_id | string | yes | The user ID to subscribe |
No output schema declared.
No examples provided.
What is the Courier MCP server?
Courier is an MCP server listed in the public MCP registry as io.github.trycourier/courier. Send notifications, manage templates, and configure integrations with Courier. This page covers its hosted endpoint (https://mcp.courier.com).
Is the Courier MCP server safe to use?
Courier scores 79 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Courier MCP server expose?
Courier exposes 161 tools: list_messages, get_message, get_message_content, get_message_history, list_notifications, and 156 more. Their descriptions and schemas cost roughly 14,709 tokens of context every time the server is loaded.
Does the Courier MCP server require authentication?
No. We connected to Courier without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Courier MCP server still maintained?
Courier is still listed as active in the MCP registry. We last reached this channel on 24 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.