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 →
get_audit_event ~32
Get a specific audit event by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| audit_event_id | string | yes | The audit event ID |
No output schema declared.
No examples provided.
get_brand ~26
Get a brand by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| brand_id | string | yes | The brand ID |
No output schema declared.
No examples provided.
get_broadcast ~35
Get a broadcast by id, including its channel and send or schedule state.
| Name | Type | Req | Description |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
No output schema declared.
No examples provided.
get_broadcast_content ~29
Get a broadcast's Elemental content.
| Name | Type | Req | Description |
|---|---|---|---|
| broadcast_id | string | yes | The broadcast id |
No output schema declared.
No examples provided.
get_bulk_job ~29
Get the status of a bulk job.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | The bulk job ID |
No output schema declared.
No examples provided.
get_journey ~103
Get a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.
| Name | Type | Req | Description |
|---|---|---|---|
| journey_id | string | yes | The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| version | string | – | Version to retrieve: "draft", "published" (default), or a version string like "v001" |
No output schema declared.
No examples provided.
get_journey_run ~37
Get one journey run by id: its journey, status, and timestamps.
| Name | Type | Req | Description |
|---|---|---|---|
| run_id | string | yes | The journey run id |
No output schema declared.
No examples provided.
get_journey_template ~145
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| version | string | – | Version to retrieve: "draft", "published" (default), or "vN" |
No output schema declared.
No examples provided.
get_journey_template_content ~150
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| version | string | – | Version to retrieve: "draft", "published" (default), or a version string like "v001" |
No output schema declared.
No examples provided.
get_list ~26
Get a list by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | yes | The list ID |
No output schema declared.
No examples provided.
get_list_subscribers ~37
Get all subscribers of a list.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| list_id | string | yes | The list ID |
No output schema declared.
No examples provided.
get_message ~35
Get the full details and status of a single message by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | The message ID to retrieve |
No output schema declared.
No examples provided.
get_message_content ~37
Get the rendered content (HTML, text, subject) of a previously sent message.
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | The message ID |
No output schema declared.
No examples provided.
get_message_history ~56
Get the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | yes | The message ID |
| type | string | – | Filter by event type |
No output schema declared.
No examples provided.
get_notification ~101
Retrieve a notification template by ID. Optionally request draft, published, or a version such as v001.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
| version | string | – | Version to retrieve: "draft", "published" (default — omit this to get it), or a version string like "v001" |
No output schema declared.
No examples provided.
get_notification_content ~56
Get the published content blocks of a notification template.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
get_notification_draft_content ~62
Get the draft (unpublished) content blocks of a notification template.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
get_notification_metrics ~952
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…
| Name | Type | Req | Description |
|---|---|---|---|
| end | string | – | Window end, ISO 8601 with offset. Requires start. Must not be combined with lookback. |
| granularity | string | – | Bucket size. HOUR covers at most 7 days, DAY at most 90. Defaults to DAY. |
| lookback | string | – | Window length counted back from now, as an ISO 8601 duration (P30D, P12W, PT12H). Defaults to P30D. Must not be combined with start/end. |
| notification_id | string | yes | The notification template ID to report on (no commas or whitespace) |
| start | string | – | Inclusive window start, ISO 8601 with offset (2026-04-01T00:00:00Z). Requires end. Must not be combined with lookback. |
No output schema declared.
No examples provided.
get_preference_section ~34
Retrieve a preference section by id, including its topics.
| Name | Type | Req | Description |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
No output schema declared.
No examples provided.
get_preference_topic ~65
Retrieve a topic within a section. Returns 404 if the section or topic does not exist, or the topic belongs to a different section.
| Name | Type | Req | Description |
|---|---|---|---|
| section_id | string | yes | Id of the preference section |
| topic_id | string | yes | Id of the subscription preference topic |
No output schema declared.
No examples provided.
get_provider ~28
Fetch a single provider configuration by ID.
| Name | Type | Req | Description |
|---|---|---|---|
| provider_id | string | yes | The provider configuration ID |
No output schema declared.
No examples provided.
get_routing_strategy ~46
Retrieve a routing strategy by ID. Returns the full entity including routing, channels, and providers.
| Name | Type | Req | Description |
|---|---|---|---|
| routing_strategy_id | string | yes | The routing strategy ID (rs_ prefix) |
No output schema declared.
No examples provided.
get_tenant ~27
Get a tenant by its ID.
| Name | Type | Req | Description |
|---|---|---|---|
| tenant_id | string | yes | The tenant ID |
No output schema declared.
No examples provided.
get_tenant_template ~42
Get a tenant notification template association by template ID.
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | The template ID |
| tenant_id | string | yes | The tenant ID |
No output schema declared.
No examples provided.
get_tenant_template_version ~72
Get a specific version of a tenant notification template (e.g. latest, published, or v1).
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | The template ID |
| tenant_id | string | yes | The tenant ID |
| version | string | yes | Version identifier (latest, published, or v-prefixed) |
No output schema declared.
No examples provided.
get_translation ~62
Get a translation for a specific locale (e.g. "en_US", "fr_FR").
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | – | Translation domain (only "default" is supported currently) |
| locale | string | yes | Locale code (e.g. en_US, fr_FR) |
No output schema declared.
No examples provided.
get_user_list_subscriptions ~39
Get all list subscriptions for a user.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
get_user_preference_topic ~57
Get a user's preference for a specific subscription topic.
| Name | Type | Req | Description |
|---|---|---|---|
| tenant_id | string | – | Scope to a specific tenant |
| topic_id | string | yes | The subscription topic ID |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
get_user_preferences ~75
Get a user's notification preferences (subscriptions, opt-outs, channel preferences).
| Name | Type | Req | Description |
|---|---|---|---|
| tenant_id | string | – | Omit this to get the user's workspace-level preferences — that answers most preference questions. Only pass it when you need the tenant-scoped overrides for one specific tenant instead. |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
get_user_profile_by_id ~45
Get a user profile by their ID. Returns profile data including email, phone, and custom properties.
| Name | Type | Req | Description |
|---|---|---|---|
| user_id | string | yes | The user ID to look up |
No output schema declared.
No examples provided.
get_user_push_token ~41
Get a specific push/device token for a user.
| Name | Type | Req | Description |
|---|---|---|---|
| token | string | yes | The token identifier |
| user_id | string | yes | The user ID |
No output schema declared.
No examples provided.
invoke_ad_hoc_automation ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| automation | object | yes | The automation definition with typed steps |
| brand | string | – | – |
| data | object | – | – |
| profile | object | – | – |
| recipient | string | – | – |
| template | string | – | – |
No output schema declared.
No examples provided.
invoke_automation_template ~128
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" } }.
| Name | Type | Req | Description |
|---|---|---|---|
| brand | string | – | Brand ID override |
| data | object | – | Data to pass to the automation |
| profile | object | – | Profile data for the recipient |
| recipient | string | yes | Recipient user ID |
| template | string | – | Notification template override |
| template_id | string | yes | The automation template ID |
No output schema declared.
No examples provided.
invoke_journey ~129
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" } }.
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | – | Data payload passed to the journey for conditions and template variables |
| profile | object | – | Profile data for the user (email, phone, custom fields) |
| template_id | string | yes | The journey template ID |
| user_id | string | – | Recipient user ID. Can also be resolved from profile or data. |
No output schema declared.
No examples provided.
list_audience_members ~37
List all members of an audience.
| Name | Type | Req | Description |
|---|---|---|---|
| audience_id | string | yes | The audience ID |
| cursor | string | – | Pagination cursor |
No output schema declared.
No examples provided.
list_audiences ~26
List all audiences in the workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
No output schema declared.
No examples provided.
list_audit_events ~34
List audit events in the workspace. Useful for tracking API usage and changes.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
No output schema declared.
No examples provided.
list_automations ~52
List automation templates in the workspace, returning each template_id and its version state. Optionally filter by version.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| version | string | – | Filter by version state |
No output schema declared.
No examples provided.
list_brands ~25
List all brands in the workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
No output schema declared.
No examples provided.
list_broadcasts ~40
List broadcasts in the workspace.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor from a previous response |
| limit | integer | – | Max broadcasts per page |
No output schema declared.
No examples provided.
list_bulk_users ~38
List the users in a bulk job.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| job_id | string | yes | The bulk job ID |
No output schema declared.
No examples provided.
list_digest_instances ~93
List the digest instances for a schedule. Each instance represents the events accumulated for a single user against the schedule, useful for monitoring accumulation before a digest is released.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor from a previous response |
| limit | number | – | Max instances to return (default 20, max 100) |
| schedule_id | string | yes | The digest schedule id, in the form "sch/{uuid}" |
No output schema declared.
No examples provided.
list_journey_run_steps ~54
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.
| Name | Type | Req | Description |
|---|---|---|---|
| run_id | string | yes | The journey run id |
No output schema declared.
No examples provided.
list_journey_runs ~167
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| end_date | string | – | Inclusive upper bound on created_at, ISO 8601 date or timestamp |
| limit | integer | – | Runs per page, 1 to 50. Defaults to 20. |
| start_date | string | – | Inclusive lower bound on created_at, ISO 8601 date or timestamp |
| status | string | – | Comma-separated run statuses to filter on, e.g. PROCESSED,ERROR |
| template_id | string | – | Comma-separated journey ids to filter on |
No output schema declared.
No examples provided.
list_journey_template_versions ~55
List published versions of a journey-scoped notification template, ordered most recent first.
| Name | Type | Req | Description |
|---|---|---|---|
| journey_id | string | yes | The journey template ID that owns this notification |
| notification_id | string | yes | The notification template ID |
No output schema declared.
No examples provided.
list_journey_templates ~193
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Check the response's paging.more before calling again — false means every template already came back, and calling again with the same arguments returns the same page, not new data. This is an opaque… |
| journey_id | string | yes | The journey template ID. Copy it exactly, character for character, from the response that returned it — never retype it from memory or reconstruct it. |
| limit | number | – | Page size (1–100) |
No output schema declared.
No examples provided.
list_journey_versions ~34
List published versions of a journey, ordered most recent first.
| Name | Type | Req | Description |
|---|---|---|---|
| journey_id | string | yes | The journey template ID |
No output schema declared.
No examples provided.
list_journeys ~187
List journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | If a response has no cursor, every journey already came back — calling this again with the same arguments returns the same page, not new data. This is an opaque token — never decode it, edit it, or r… |
| version | string | – | Filter by version state. Defaults to published, and the two are never combined in one call. If you don't know whether the journey you want is published or still a draft, calling this twice — once per… |
No output schema declared.
No examples provided.
list_lists ~52
Get all lists. Optionally filter by pattern (e.g. 'example.list.*').
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Pagination cursor |
| pattern | string | – | Filter pattern (e.g. 'example.list.*') |
No output schema declared.
No examples provided.
list_messages ~332
List messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | This NARROWS, it does not widen: true returns ONLY archived messages, excluding every active one. Omit it entirely to search active messages — the default view for a normal delivery question. Setting… |
| cursor | string | – | For fetching the next page. This is an opaque token — never decode it, edit it, or rebuild it. Pass it back exactly as it appeared in the previous response's cursor field, byte for byte. Omit this en… |
| enqueued_after | string | – | ISO 8601 timestamp; only return messages enqueued after this time |
| event | string | – | Filter by event ID |
| list | string | – | Filter by list ID |
| messageId | string | – | Filter by message ID |
| notification | string | – | Filter by notification ID |
| provider | array | – | Filter by provider key (e.g. sendgrid, twilio) |
| recipient | string | – | Filter by recipient user ID |
| status | array | – | Filter by status (e.g. DELIVERED, UNDELIVERABLE) |
| tag | array | – | Filter by metadata tags |
| tags | string | – | Comma-delimited list of tags |
| tenant_id | string | – | Filter by tenant ID |
| traceId | string | – | Filter by trace ID |
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.