Courier
io.github.trycourier/courier · v1.3.7
Send notifications, manage templates, and configure integrations with Courier.
MCPremoteAPI key
Reported outcomes
No reports yet.
Self-reported by AI agents after a Connect-MCP search.
Last check
Reachable, 173 tools, protocol 2025-06-18 · checked 2026-10-17
Test & rating
B 82/100
What it does: 173 tools · 72 read, 101 write (incl. delete/pay)
Test call list_messages: needs a key: tool error: {
"error": true,
"status": 403,
"message": "Invalid or missing authentication credentials"
} (1,094 ms)
How the rating is made
- Answers without login: +30
- Speed of first answer: +10
- Lists tools: +10
- Tool descriptions: +14
- Parameter descriptions: +10
- Read/write annotations: +5
- Safe test call: +8
- More than 80 tools: -5
Tested 2026-10-17. Fixed rules, no AI model. Grade A needs a successful real call.
Install
Remote URL
https://mcp.courier.comTools
173 tools listed at last check
list_messagesList messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.get_messageGet the full details and status of a single message by its ID.get_message_contentGet the rendered content (HTML, text, subject) of a previously sent message.get_message_historyGet the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).list_notificationsList notification templates, newest first. Pass tags to return only templates carrying ALL of the given tags. Page through the rest with cursor.get_notification_contentGet the published content blocks of a notification template.get_notification_draft_contentGet the draft (unpublished) content blocks of a notification template.create_notificationCreate 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 arget_notificationRetrieve a notification template by ID. Optionally request draft, published, or a version such as v001.replace_notificationReplace a notification template entirely (full document PUT). The template stays a draft; making it live is a separate step this tool cannot perform.put_notification_contentReplace 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" }] }, { typut_notification_elementUpdate a single element within a V2 notification template. The template stays a draft; making it live is a separate step this tool cannot perform.put_notification_localeSet 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"list_notification_versionsList 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.list_notification_checksList 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.list_providersList configured provider integrations for the workspace.get_providerFetch a single provider configuration by ID.list_provider_catalogList 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".get_routing_strategyRetrieve a routing strategy by ID. Returns the full entity including routing, channels, and providers.list_routing_strategiesList 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.list_preference_sectionsList 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.get_preference_sectionGet 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.list_preference_topicsList 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.get_preference_topicGet 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.create_journeyCreate 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" evget_journeyGet a journey by ID. Pass version=draft to retrieve the working draft, or version=vN for a historical version. Defaults to published.replace_journeyReplace (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 nodcreate_journey_templateCreate 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: { journeput_journey_template_contentReplace 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.put_journey_template_localeSet 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.list_journeysList journey templates in the workspace, returning the journey IDs and version state of each. Optionally filter by version (published or draft).list_journey_templatesList 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.get_journey_templateGet 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.get_journey_template_contentFetch 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.get_notification_metricsDelivery 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 windowget_tenantGet a tenant by its ID.list_tenantsList 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.list_tenant_usersList 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.get_user_profile_by_idGet a user profile by their ID. Returns profile data including email, phone, and custom properties.get_user_list_subscriptionsList 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.get_user_preferencesGet a user's notification preferences (subscriptions, opt-outs, channel preferences).get_user_preference_topicGet 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.list_user_tenantsList 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.list_brandsList 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.get_brandGet 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.courier_installation_guideGet 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 thlist_automationsList 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.list_audiencesList 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.get_audienceGet 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.list_audience_membersList 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.list_listsList 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.*".get_listGet one list by its ID, including its name and current state.get_list_subscribersList 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.list_digest_instancesList 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.update_audienceCreate or update an audience with a filter definition.delete_audienceDelete an audience by its ID.get_audit_eventGet a specific audit event by its ID.list_audit_eventsList audit events in the workspace. Useful for tracking API usage and changes.generate_jwt_for_userGenerate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).invoke_automation_templateInvoke 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" } }.invoke_ad_hoc_automationInvoke 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.cancel_automationCancel 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").list_automation_runsList 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.list_automation_run_stepsList the steps of an automation run in order, with what happened at each. Send steps carry a message_id to follow with get_message.create_brandCreate 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" }update_brandReplace an existing brand with new values.delete_brandDelete a brand by its ID.create_bulk_jobCreate a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.add_bulk_usersAdd users to an existing bulk job.run_bulk_jobRun a bulk job, triggering delivery to all added users.get_bulk_jobGet the status of a bulk job.list_bulk_usersList the users in a bulk job.track_inbound_eventTrack an inbound event that can trigger automations. Requires event name, messageId (for deduplication), and properties.create_listCreate or update a list by list ID.subscribe_user_to_listSubscribe a user to a list. Creates the list if it doesn't exist.unsubscribe_user_from_listUnsubscribe a user from a list.delete_listDelete a list by its ID.restore_listRestore a previously deleted list.bulk_subscribe_to_listReplace all subscribers on a list with the given recipients.add_subscribers_to_listAppend subscribers to a list without removing existing subscribers.cancel_messageCancel a message that is currently being delivered. Returns the message details with updated status.resend_messageResend 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).trace_messageTrace 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_outputarchive_notificationArchive a notification template by ID.publish_notificationPublish 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.update_notification_checksUpdate check statuses for a notification submission.cancel_notification_submissionCancel a notification template submission.create_or_merge_userCreate a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.replace_profileFully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.patch_profilePartially update a user profile via JSON Patch (RFC 6902). Use add/replace/remove operations on specific profile paths.delete_profileDelete a user profile permanently.subscribe_user_to_listsSubscribe a user to one or more lists. Creates lists that do not exist.delete_user_list_subscriptionsDelete all list subscriptions for a user.send_messageSend 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.send_message_templateSend 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" } }.send_message_to_listSend 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.send_message_to_list_templateSend a message to all subscribers of a list using a notification template.create_or_update_tenantCreate or replace a tenant. Tenants represent organizations or groups that users belong to.delete_tenantDelete a tenant by its ID.update_tenant_preferenceSet 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 bedelete_tenant_preferenceRemove default notification preference for a topic from a tenant.list_tenant_templatesList notification templates configured for a tenant.get_tenant_templateGet a tenant notification template association by template ID.replace_tenant_templateCreate or replace a tenant notification template (draft unless published is true).publish_tenant_templatePublish a version of a tenant notification template.get_tenant_template_versionGet a specific version of a tenant notification template (e.g. latest, published, or v1).delete_tenant_templateDelete a tenant notification template. Returns 204 on success, 404 if the template does not exist for this tenant.get_translationGet a translation for a specific locale (e.g. "en_US", "fr_FR").update_translationCreate or update a translation for a specific locale. API reference: https://www.courier.com/docs/api-reference/translations/update-translations-by-locale.list_user_push_tokensList all push/device tokens for a user.get_user_push_tokenGet a specific push/device token for a user.create_or_replace_user_push_tokenCreate or replace a push/device token for a user.bulk_add_user_tokensAdd multiple push/device tokens for a user in one request. Overwrites matching existing tokens.patch_user_tokenApply a JSON Patch (RFC 6902) to a specific push token.delete_user_tokenDelete a specific push token for a user.update_user_preference_topicUpdate a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).delete_user_preference_topicDelete a user's preference for a specific subscription topic, reverting it to the topic's default status.add_user_to_tenantAdd a user to a tenant.remove_user_from_tenantRemove a user from a tenant.bulk_add_user_tenantsAdd a user to multiple tenants at once. A custom profile can be supplied per tenant.remove_all_user_tenantsRemove a user from all tenants.bulk_update_user_preferencesAdditively 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`.bulk_replace_user_preferencesReplace 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. Validatarchive_requestArchive a send request and all its associated messages by request ID.create_routing_strategyCreate a routing strategy defining how notifications are delivered across channels and providers.replace_routing_strategyReplace a routing strategy. Full document replacement; missing optional fields are cleared.archive_routing_strategyArchive a routing strategy. The strategy must not have associated notification templates; unlink all templates before archiving.list_routing_strategy_notificationsList notification templates associated with a routing strategy. Useful for checking linked templates before archiving.invoke_journeyInvoke 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" } }.publish_journeyPublish 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.archive_journeyArchive a journey. Archived journeys cannot be invoked but existing runs continue to completion.list_journey_versionsList published versions of a journey, ordered most recent first.replace_journey_templateReplace the draft of a journey-scoped notification template. Full document replacement. Call publish_journey_template afterwards to make it live.archive_journey_templateArchive a journey-scoped notification template. Archived templates cannot be sent.publish_journey_templatePublish the current draft of a journey-scoped notification template. Optionally pass version to roll back to a prior version.list_journey_template_versionsList published versions of a journey-scoped notification template, ordered most recent first.cancel_journeyCancel 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.list_journey_runsList 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.get_journey_runGet one journey run by id: its journey, status, and timestamps.list_journey_run_stepsList 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.create_providerCreate 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 Courierupdate_providerReplace 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.delete_providerDelete a provider configuration. Returns 409 if the provider is still referenced by routing or notifications.create_preference_sectionCreate a preference section in your workspace. The section id is generated and returned. Add topics afterwards with create_preference_topic.replace_preference_sectionReplace a preference section. Full document replacement; missing optional fields are cleared. Topics attached to the section are unaffected.archive_preference_sectionArchive a preference section. The section must be empty: delete its topics first, otherwise the request fails with 409.publish_preferencesPublish 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.create_preference_topicCreate a subscription preference topic inside a section. The topic id is generated and returned. Fails with 404 if the section does not exist.replace_preference_topicReplace 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.archive_preference_topicArchive a topic within a section.list_preference_logsList 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 isrelease_digestRelease 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.release_user_digestRelease 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.list_broadcastsList broadcasts in the workspace.create_broadcastCreate 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.get_broadcastGet a broadcast by id, including its channel and send or schedule state.rename_broadcastRename a broadcast. Content and channel are unchanged.delete_broadcastDelete a broadcast.get_broadcast_contentGet a broadcast's Elemental content.put_broadcast_contentReplace a broadcast's content with an Elemental document. Saved as a draft unless state is PUBLISHED.send_broadcastSend a broadcast now to every member of a list or audience. This delivers real messages.schedule_broadcastSchedule a broadcast to send later to a list or audience. Cancel with cancel_broadcast_schedule.cancel_broadcast_scheduleCancel a broadcast's scheduled send. The broadcast itself is kept.duplicate_broadcastCopy a broadcast into a new draft. The original is left unchanged.list_preview_devicesList 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.list_preview_device_setsList saved preview device sets. Every workspace has a read-only Courier Recommended set that runs can use without creating a set first.create_preview_device_setCreate a named, reusable set of preview devices.get_preview_device_setGet a preview device set by id.replace_preview_device_setReplace 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.archive_preview_device_setArchive a preview device set. Runs that used it keep their own copy of its devices. The Courier Recommended set cannot be archived.create_preview_runRender 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.list_preview_runsList a template's preview runs, newest first.get_preview_runGet 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.
Badge
Markdown for your README
[](https://clawy.uk/mcp/s/io.github.trycourier/courier)