{"id":32593912,"url":"https://github.com/trycourier/courier-mcp","last_synced_at":"2026-06-21T06:31:40.349Z","repository":{"id":309428803,"uuid":"1025689442","full_name":"trycourier/courier-mcp","owner":"trycourier","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-18T18:47:02.000Z","size":7328,"stargazers_count":1,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T19:26:17.047Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trycourier.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-24T16:34:13.000Z","updated_at":"2026-06-18T18:47:07.000Z","dependencies_parsed_at":"2025-08-11T22:16:50.331Z","dependency_job_id":null,"html_url":"https://github.com/trycourier/courier-mcp","commit_stats":null,"previous_names":["trycourier/courier-mcp"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/trycourier/courier-mcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trycourier%2Fcourier-mcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trycourier%2Fcourier-mcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trycourier%2Fcourier-mcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trycourier%2Fcourier-mcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trycourier","download_url":"https://codeload.github.com/trycourier/courier-mcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trycourier%2Fcourier-mcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34597337,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-30T02:02:39.921Z","updated_at":"2026-06-21T06:31:40.344Z","avatar_url":"https://github.com/trycourier.png","language":"TypeScript","funding_links":[],"categories":["📦 Other"],"sub_categories":[],"readme":"# Courier MCP Server\n\nThe official [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server for the [Courier](https://www.courier.com) 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`](https://www.npmjs.com/package/@trycourier/courier) Node SDK.\n\n## Install\n\n### Hosted (recommended)\n\nCourier runs a hosted MCP server at `https://mcp.courier.com`. No local setup required.\n\n\u003ca href=\"https://cursor.com/en/install-mcp?name=Courier\u0026config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AuY291cmllci5jb20iLCAiaGVhZGVycyI6IHsiYXBpX2tleSI6ICJZb3VyIEFQSSBLZXkifX0=\"\u003e\u003cimg src=\"https://cursor.com/deeplink/mcp-install-dark.svg\" alt=\"Install in Cursor\" height=\"32\" /\u003e\u003c/a\u003e\n\n**Cursor** — add to `.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"Courier\": {\n      \"url\": \"https://mcp.courier.com\",\n      \"headers\": {\n        \"api_key\": \"YOUR_COURIER_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n**Claude Code:**\n\n```bash\nclaude mcp add Courier --transport http --url https://mcp.courier.com --header \"api_key: YOUR_COURIER_API_KEY\"\n```\n\n**Claude Desktop** — add to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"Courier\": {\n      \"url\": \"https://mcp.courier.com\",\n      \"headers\": {\n        \"api_key\": \"YOUR_COURIER_API_KEY\"\n      }\n    }\n  }\n}\n```\n\n### Local development\n\n```bash\ngit clone https://github.com/trycourier/courier-mcp.git\ncd courier-mcp\nsh dev.sh\n```\n\nThen point your IDE at `http://localhost:3000` with the same config format above.\n\n## Tools\n\n123 default tools organized by API resource, plus 1 diagnostic tool available in local installs.\n\n### Default tools\n\n| Category | Tools |\n|----------|-------|\n| **Send** | `send_message`, `send_message_template`, `send_message_to_list`, `send_message_to_list_template` |\n| **Messages** | `list_messages`, `get_message`, `get_message_content`, `get_message_history`, `cancel_message` |\n| **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` |\n| **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` |\n| **Audiences** | `get_audience`, `list_audience_members`, `list_audiences`, `update_audience`, `delete_audience` |\n| **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` |\n| **Brands** | `create_brand`, `get_brand`, `list_brands`, `update_brand`, `delete_brand` |\n| **Auth** | `generate_jwt_for_user` |\n| **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` |\n| **Docs** | `courier_installation_guide` |\n| **Automations** | `invoke_automation_template`, `invoke_ad_hoc_automation`, `list_automations`, `cancel_automation` |\n| **Bulk** | `create_bulk_job`, `add_bulk_users`, `run_bulk_job`, `get_bulk_job`, `list_bulk_users` |\n| **Audit Events** | `get_audit_event`, `list_audit_events` |\n| **Inbound** | `track_inbound_event` |\n| **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` |\n| **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` |\n| **Routing Strategies** | `create_routing_strategy`, `get_routing_strategy`, `replace_routing_strategy`, `archive_routing_strategy`, `list_routing_strategies`, `list_routing_strategy_notifications` |\n| **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` |\n| **Requests** | `archive_request` |\n| **Providers** | `list_providers`, `get_provider`, `list_provider_catalog`, `create_provider`, `update_provider`, `delete_provider` |\n| **Translations** | `get_translation`, `update_translation` |\n\n### Diagnostic tools (local only)\n\n| Category | Tools |\n|----------|-------|\n| **Config** | `get_environment_config` — check which API key, base URL, and package version the MCP session is using |\n\n### Safer defaults (optional client policies)\n\nTools that send live traffic, carry `destructiveHint` in MCP annotations, or mutate provider integrations are listed in code as `RECOMMENDED_CLIENT_DISABLED_TOOLS` ([source](mcp/src/policy/recommended-client-disabled-tools.ts)). Export it from `@trycourier/courier-mcp` if you want to drive codegen or docs. Teams typically paste subsets into **Claude Code** (`permissions.deny` / `mcp__\u003cserverName\u003e__\u003ctoolName\u003e`) or **Codex** (`[mcp_servers.\u003cname\u003e.disabled_tools]` in `config.toml`). This does not change hosted MCP behavior until each client applies its own policy.\n\n## Architecture\n\n```\ncourier-mcp/\n├── mcp/                    # MCP package (@trycourier/courier-mcp on npm)\n│   └── src/\n│       ├── index.ts        # CourierMcp server class\n│       ├── policy/         # Optional client policy helpers (e.g. recommended disable list)\n│       ├── tools/          # Tool definitions (one file per API resource)\n│       └── utils/          # Config, error handling, registry\n├── server/                 # Express server (hosts the MCP package via HTTP)\n│   └── src/index.ts        # Stateless HTTP handler\n└── dev.sh                  # Local development launcher\n```\n\nThe 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.\n\n## Configuration\n\n| Header | Required | Description |\n|--------|----------|-------------|\n| `api_key` | Yes | Your Courier API key. Get one at [app.courier.com/settings/api-keys](https://app.courier.com/settings/api-keys). |\n| `base_url` | No | Override the API base URL. Defaults to `https://api.courier.com`. |\n\n## Development\n\n```bash\n# Install dependencies\ncd mcp \u0026\u0026 npm install \u0026\u0026 cd ../server \u0026\u0026 npm install \u0026\u0026 cd ..\n\n# Start development server\nsh dev.sh\n\n# Run tests\ncd mcp \u0026\u0026 npm test\n\n# Build\ncd mcp \u0026\u0026 npm run build\n```\n\n## SDK dependency updates\n\nThe `@trycourier/courier` SDK dependency in `mcp/` is updated automatically via [Dependabot](https://docs.github.com/en/code-security/dependabot). Dependabot checks npm daily and opens a PR when a new SDK version is available.\n\n- **Patch/minor bumps**: review CI status, then merge.\n- **Major bumps** (labeled `breaking-review`): check whether any tool input schemas or error handling need updates before merging.\n\nAfter merging a Dependabot PR, the full pipeline runs automatically:\n\n1. `auto-version-bump.yml` bumps the MCP package patch version and pushes to main.\n2. `publish-npm.yml` publishes the new version to npm.\n3. `bump-services.yml` opens a PR in `trycourier/services` to update the hosted MCP server.\n\n**Secrets required** (set in repo Settings \u003e Secrets and variables \u003e Actions):\n\n- `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.\n- `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.\n- `NPM_TOKEN` — npm publish token. Used by `publish-npm.yml`.\n\n## Links\n\n- [Courier docs](https://www.courier.com/docs/)\n- [MCP documentation page](https://www.courier.com/docs/tools/mcp/)\n- [AI developer tools overview](https://www.courier.com/docs/tools/ai-onboarding/)\n- [Courier Node SDK](https://github.com/trycourier/courier-node)\n- [MCP protocol spec](https://modelcontextprotocol.io/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrycourier%2Fcourier-mcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrycourier%2Fcourier-mcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrycourier%2Fcourier-mcp/lists"}