Connects Claude to Courier's notification API with 60 tools covering the full platform. You can send multi-channel messages (email, SMS, push), manage user profiles and preferences, configure notification templates, debug delivery history, and handle list subscriptions without leaving your editor. The hosted version at mcp.courier.com requires just an API key in your config. Useful when you're building notification workflows, debugging why a message didn't deliver, or wiring up user communication features and want to skip context switching between your IDE and Courier's dashboard. Built on their official Node SDK, so it stays current with API changes automatically.
Public tool metadata for what this MCP can expose to an agent.
get_audienceGet an audience by its ID, including its filter definition.1 paramsGet an audience by its ID, including its filter definition.
audience_idstringlist_audience_membersList all members of an audience.2 paramsList all members of an audience.
cursorstringaudience_idstringlist_audiencesList all audiences in the workspace.1 paramsList all audiences in the workspace.
cursorstringupdate_audienceCreate or update an audience with a filter definition.4 paramsCreate or update an audience with a filter definition.
namestringfiltervalueaudience_idstringdescriptionstringdelete_audienceDelete an audience by its ID.1 paramsDelete an audience by its ID.
audience_idstringget_audit_eventGet a specific audit event by its ID.1 paramsGet a specific audit event by its ID.
audit_event_idstringlist_audit_eventsList audit events in the workspace. Useful for tracking API usage and changes.1 paramsList audit events in the workspace. Useful for tracking API usage and changes.
cursorstringgenerate_jwt_for_userGenerate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).3 paramsGenerate a JWT authentication token for a user. Used for client-side SDK auth (Inbox, Preferences, etc.).
scopesarrayuser_idstringexpires_instringinvoke_automation_templateInvoke an automation run from an existing automation template.6 paramsInvoke an automation run from an existing automation template.
dataobjectbrandstringprofileobjecttemplatestringrecipientstringtemplate_idstringinvoke_ad_hoc_automationInvoke an ad-hoc automation with inline steps (no template needed).6 paramsInvoke an ad-hoc automation with inline steps (no template needed).
dataobjectbrandstringprofileobjecttemplatestringrecipientstringautomationobjectcreate_brandCreate a new brand with name, colors, and email/inapp settings.4 paramsCreate a new brand with name, colors, and email/inapp settings.
idstringnamestringsettingsobjectsnippetsobjectget_brandGet a brand by its ID.1 paramsGet a brand by its ID.
brand_idstringlist_brandsList all brands in the workspace.1 paramsList all brands in the workspace.
cursorstringcreate_bulk_jobCreate a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.1 paramsCreate a new bulk job for sending messages to multiple recipients. Workflow: create_bulk_job → add_bulk_users → run_bulk_job.
messageobjectadd_bulk_usersAdd users to an existing bulk job.2 paramsAdd users to an existing bulk job.
usersarrayjob_idstringrun_bulk_jobRun a bulk job, triggering delivery to all added users.1 paramsRun a bulk job, triggering delivery to all added users.
job_idstringget_bulk_jobGet the status of a bulk job.1 paramsGet the status of a bulk job.
job_idstringlist_bulk_usersList the users in a bulk job.2 paramsList the users in a bulk job.
cursorstringjob_idstringcourier_installation_guideGet the Courier SDK installation guide for a specific platform. For client-side SDKs (React, iOS, Android, Flutter, React Native), also generates a sample JWT.2 paramsGet the Courier SDK installation guide for a specific platform. For client-side SDKs (React, iOS, Android, Flutter, React Native), also generates a sample JWT.
user_idstringplatformstringnodejs · python · react · ios · android · fluttertrack_inbound_eventTrack an inbound event that can trigger automations. Requires event name, messageId (for deduplication), and properties.4 paramsTrack an inbound event that can trigger automations. Requires event name, messageId (for deduplication), and properties.
eventstringuserIdstringmessageIdstringpropertiesobjectlist_listsGet all lists. Optionally filter by pattern (e.g. 'example.list.*').2 paramsGet all lists. Optionally filter by pattern (e.g. 'example.list.*').
cursorstringpatternstringget_listGet a list by its ID.1 paramsGet a list by its ID.
list_idstringget_list_subscribersGet all subscribers of a list.2 paramsGet all subscribers of a list.
cursorstringlist_idstringcreate_listCreate or update a list by list ID.2 paramsCreate or update a list by list ID.
namestringlist_idstringsubscribe_user_to_listSubscribe a user to a list. Creates the list if it doesn't exist.3 paramsSubscribe a user to a list. Creates the list if it doesn't exist.
list_idstringuser_idstringpreferencesobjectunsubscribe_user_from_listUnsubscribe a user from a list.2 paramsUnsubscribe a user from a list.
list_idstringuser_idstringlist_messagesList messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.14 paramsList messages you've previously sent. Filter by status, recipient, notification, provider, tags, or tenant.
tagarrayliststringtagsstringeventstringcursorstringstatusarraytraceIdstringarchivedbooleanproviderarraymessageIdstringrecipientstringtenant_idstringnotificationstringenqueued_afterstringget_messageGet the full details and status of a single message by its ID.1 paramsGet the full details and status of a single message by its ID.
message_idstringget_message_contentGet the rendered content (HTML, text, subject) of a previously sent message.1 paramsGet the rendered content (HTML, text, subject) of a previously sent message.
message_idstringget_message_historyGet the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).2 paramsGet the event history for a message, showing each step in the delivery pipeline (enqueued, sent, delivered, etc.).
typestringmessage_idstringcancel_messageCancel a message that is currently being delivered. Returns the message details with updated status.1 paramsCancel a message that is currently being delivered. Returns the message details with updated status.
message_idstringlist_notificationsList notification templates. Optionally filter by cursor.1 paramsList notification templates. Optionally filter by cursor.
cursorstringget_notification_contentGet the published content blocks of a notification template.1 paramsGet the published content blocks of a notification template.
notification_idstringget_notification_draft_contentGet the draft (unpublished) content blocks of a notification template.1 paramsGet the draft (unpublished) content blocks of a notification template.
notification_idstringget_user_profile_by_idGet a user profile by their ID. Returns profile data including email, phone, and custom properties.1 paramsGet a user profile by their ID. Returns profile data including email, phone, and custom properties.
user_idstringcreate_or_merge_userCreate a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.2 paramsCreate a new user profile or merge supplied values into an existing profile (POST). Existing fields not included are preserved.
profileobjectuser_idstringreplace_profileFully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.2 paramsFully replace a user profile (PUT). All existing data is overwritten; include every field you want to keep.
profileobjectuser_idstringdelete_profileDelete a user profile permanently.1 paramsDelete a user profile permanently.
user_idstringget_user_list_subscriptionsGet all list subscriptions for a user.2 paramsGet all list subscriptions for a user.
cursorstringuser_idstringsubscribe_user_to_listsSubscribe a user to one or more lists. Creates lists that do not exist.2 paramsSubscribe a user to one or more lists. Creates lists that do not exist.
listsarrayuser_idstringdelete_user_list_subscriptionsDelete all list subscriptions for a user.1 paramsDelete all list subscriptions for a user.
user_idstringsend_messageSend a message to a user using inline title and body content (no template). Optionally specify routing channels.6 paramsSend a message to a user using inline title and body content (no template). Optionally specify routing channels.
bodystringdataobjecttitlestringmethodstringall · singledefault: alluser_idstringchannelsarraysend_message_templateSend a message to a user using a pre-configured notification template. Optionally pass data and routing.5 paramsSend a message to a user using a pre-configured notification template. Optionally pass data and routing.
dataobjectmethodstringall · singledefault: alluser_idstringchannelsarraytemplatestringsend_message_to_listSend a message to all subscribers of a list using inline title and body content.6 paramsSend a message to all subscribers of a list using inline title and body content.
bodystringdataobjecttitlestringmethodstringall · singledefault: alllist_idstringchannelsarraysend_message_to_list_templateSend a message to all subscribers of a list using a notification template.5 paramsSend a message to all subscribers of a list using a notification template.
dataobjectmethodstringall · singledefault: alllist_idstringchannelsarraytemplatestringget_tenantGet a tenant by its ID.1 paramsGet a tenant by its ID.
tenant_idstringcreate_or_update_tenantCreate or replace a tenant. Tenants represent organizations or groups that users belong to.7 paramsCreate or replace a tenant. Tenants represent organizations or groups that users belong to.
namestringbrand_idstringtenant_idstringpropertiesobjectuser_profileobjectparent_tenant_idstringdefault_preferencesvaluelist_tenantsList all tenants in the workspace.2 paramsList all tenants in the workspace.
limitnumbercursorstringdelete_tenantDelete a tenant by its ID.1 paramsDelete a tenant by its ID.
tenant_idstringget_translationGet a translation for a specific locale (e.g. "en_US", "fr_FR").2 paramsGet a translation for a specific locale (e.g. "en_US", "fr_FR").
domainstringlocalestringupdate_translationCreate or update a translation for a specific locale.3 paramsCreate or update a translation for a specific locale.
bodystringdomainstringlocalestringlist_user_push_tokensList all push/device tokens for a user.1 paramsList all push/device tokens for a user.
user_idstringget_user_push_tokenGet a specific push/device token for a user.2 paramsGet a specific push/device token for a user.
tokenstringuser_idstringcreate_or_replace_user_push_tokenCreate or replace a push/device token for a user.4 paramsCreate or replace a push/device token for a user.
tokenstringdeviceobjectuser_idstringprovider_keystringfirebase-fcm · apn · expo · onesignalget_user_preferencesGet a user's notification preferences (subscriptions, opt-outs, channel preferences).2 paramsGet a user's notification preferences (subscriptions, opt-outs, channel preferences).
user_idstringtenant_idstringupdate_user_preference_topicUpdate a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).5 paramsUpdate a user's preference for a specific subscription topic (opt in, opt out, or set channel preferences).
statusstringOPTED_IN · OPTED_OUT · REQUIREDuser_idstringtopic_idstringcustom_routingarrayhas_custom_routingbooleanlist_user_tenantsList all tenants a user belongs to.3 paramsList all tenants a user belongs to.
limitnumbercursorstringuser_idstringadd_user_to_tenantAdd a user to a tenant.3 paramsAdd a user to a tenant.
profileobjectuser_idstringtenant_idstringremove_user_from_tenantRemove a user from a tenant.2 paramsRemove a user from a tenant.
user_idstringtenant_idstringThe official Model Context Protocol (MCP) server for the Courier notification API. It gives AI agents full access to the Courier API — send messages, manage profiles, debug deliveries, configure lists, and more — through 124 tools backed by the @trycourier/courier Node SDK.
Courier runs a hosted MCP server at https://mcp.courier.com. No local setup required.
Cursor — add to .cursor/mcp.json:
{
"mcpServers": {
"Courier": {
"url": "https://mcp.courier.com",
"headers": {
"api_key": "YOUR_COURIER_API_KEY"
}
}
}
}
Claude Code:
claude mcp add Courier --transport http --url https://mcp.courier.com --header "api_key: YOUR_COURIER_API_KEY"
Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"Courier": {
"url": "https://mcp.courier.com",
"headers": {
"api_key": "YOUR_COURIER_API_KEY"
}
}
}
}
git clone https://github.com/trycourier/courier-mcp.git
cd courier-mcp
sh dev.sh
Then point your IDE at http://localhost:3000 with the same config format above.
123 default tools organized by API resource, plus 1 diagnostic tool available in local installs.
| Category | Tools |
|---|---|
| Send | send_message, send_message_template, send_message_to_list, send_message_to_list_template |
| Messages | list_messages, get_message, get_message_content, get_message_history, cancel_message |
| Profiles | get_user_profile_by_id, create_or_merge_user, replace_profile, patch_profile, delete_profile, get_user_list_subscriptions, subscribe_user_to_lists, delete_user_list_subscriptions |
| Lists | list_lists, get_list, get_list_subscribers, create_list, delete_list, restore_list, subscribe_user_to_list, unsubscribe_user_from_list, bulk_subscribe_to_list, add_subscribers_to_list |
| Audiences | get_audience, list_audience_members, list_audiences, update_audience, delete_audience |
| Notifications | list_notifications, get_notification, get_notification_content, get_notification_draft_content, create_notification, replace_notification, archive_notification, publish_notification, list_notification_versions, list_notification_checks, update_notification_checks, put_notification_content, put_notification_element, put_notification_locale, cancel_notification_submission |
| Brands | create_brand, get_brand, list_brands, update_brand, delete_brand |
| Auth | generate_jwt_for_user |
| Device Tokens | list_user_push_tokens, get_user_push_token, create_or_replace_user_push_token, bulk_add_user_tokens, patch_user_token, delete_user_token |
| Docs | courier_installation_guide |
| Automations | invoke_automation_template, invoke_ad_hoc_automation, list_automations, cancel_automation |
| Bulk | create_bulk_job, add_bulk_users, run_bulk_job, get_bulk_job, list_bulk_users |
| Audit Events | get_audit_event, list_audit_events |
| Inbound | track_inbound_event |
| Tenants | get_tenant, create_or_update_tenant, list_tenants, delete_tenant, list_tenant_users, update_tenant_preference, delete_tenant_preference, list_tenant_templates, get_tenant_template, replace_tenant_template, publish_tenant_template, get_tenant_template_version, delete_tenant_template |
| Users | get_user_preferences, get_user_preference_topic, update_user_preference_topic, list_user_tenants, add_user_to_tenant, remove_user_from_tenant, bulk_add_user_tenants, remove_all_user_tenants |
| Routing Strategies | create_routing_strategy, get_routing_strategy, replace_routing_strategy, archive_routing_strategy, list_routing_strategies, list_routing_strategy_notifications |
| Journeys | list_journeys, invoke_journey, create_journey, get_journey, replace_journey, publish_journey, archive_journey, list_journey_versions, list_journey_templates, create_journey_template, get_journey_template, replace_journey_template, archive_journey_template, publish_journey_template, list_journey_template_versions |
| Requests | archive_request |
| Providers | list_providers, get_provider, list_provider_catalog, create_provider, update_provider, delete_provider |
| Translations | get_translation, update_translation |
| Category | Tools |
|---|---|
| Config | get_environment_config — check which API key, base URL, and package version the MCP session is using |
Tools that send live traffic, carry destructiveHint in MCP annotations, or mutate provider integrations are listed in code as RECOMMENDED_CLIENT_DISABLED_TOOLS (source). Export it from @trycourier/courier-mcp if you want to drive codegen or docs. Teams typically paste subsets into Claude Code (permissions.deny / mcp__<serverName>__<toolName>) or Codex ([mcp_servers.<name>.disabled_tools] in config.toml). This does not change hosted MCP behavior until each client applies its own policy.
courier-mcp/
├── mcp/ # MCP package (@trycourier/courier-mcp on npm)
│ └── src/
│ ├── index.ts # CourierMcp server class
│ ├── policy/ # Optional client policy helpers (e.g. recommended disable list)
│ ├── tools/ # Tool definitions (one file per API resource)
│ └── utils/ # Config, error handling, registry
├── server/ # Express server (hosts the MCP package via HTTP)
│ └── src/index.ts # Stateless HTTP handler
└── dev.sh # Local development launcher
The MCP package uses the official @trycourier/courier Node SDK (Stainless-generated) for all API calls. The SDK stays in sync with the Courier API spec automatically, so tool implementations are thin wrappers with proper error handling.
| Header | Required | Description |
|---|---|---|
api_key | Yes | Your Courier API key. Get one at app.courier.com/settings/api-keys. |
base_url | No | Override the API base URL. Defaults to https://api.courier.com. |
# Install dependencies
cd mcp && npm install && cd ../server && npm install && cd ..
# Start development server
sh dev.sh
# Run tests
cd mcp && npm test
# Build
cd mcp && npm run build
The @trycourier/courier SDK dependency in mcp/ is updated automatically via Dependabot. Dependabot checks npm daily and opens a PR when a new SDK version is available.
breaking-review): check whether any tool input schemas or error handling need updates before merging.After merging a Dependabot PR, the full pipeline runs automatically:
auto-version-bump.yml bumps the MCP package patch version and pushes to main.publish-npm.yml publishes the new version to npm.bump-services.yml opens a PR in trycourier/services to update the hosted MCP server.Secrets required (set in repo Settings > Secrets and variables > Actions):
REPO_TOKEN — PAT with Contents: Read and write on this repo. Used by auto-version-bump.yml to push to main and trigger downstream workflows.SERVICES_REPO_TOKEN — PAT with Contents: Read and write + Pull requests: Read and write on trycourier/services. Used by bump-services.yml to open dependency bump PRs.NPM_TOKEN — npm publish token. Used by publish-npm.yml.