Skip to main content
Courier Skills is structured guidance AI coding agents follow when building notifications. Install it once. Your agent gets channel-specific delivery rules, reliability patterns, and code examples for the whole Courier platform. Works with Cursor, Claude Code, Codex, Windsurf, Cline, and any tool that supports agent skills.

Installation

Agents discover the skill from the name and description frontmatter in SKILL.md. There is exactly one, named courier, and nothing else to configure.

What your agent learns

How it works

Agents read a routing file (SKILL.md) first. It points them at only the 1-2 files relevant to the task. Each resource file has the same structure:
  1. Quick Reference at the top with hard rules, common mistakes, and copy-paste templates
  2. Detailed guidance with explanations, examples, and edge cases
  3. Related links to other files
So agents read only what they need, not the entire skill.

Example: agent building an OTP flow

  1. Agent reads SKILL.md, finds the routing table
  2. Routing table says: OTP/2FA -> read transactional.md + sms.md
  3. Agent reads both files and gets: SMS first with email as the fallback, routing.method: "single" so one code never goes out twice, an idempotency key, and a suggested cap of five OTP requests an hour
  4. Agent generates code that follows every constraint

Check that it worked

Skills load silently, so the quickest confirmation is to ask for something the skill has an opinion about:
Add a one-time passcode flow to this project.
With the skill loaded, the agent reaches for SMS first with email as the fallback, routes on a single channel rather than sending to every one, and adds an idempotency key. If it fans the code out to every channel at once, or invents an endpoint, the skill is not being read. If nothing changes, check that the skill landed in the directory your tool actually reads, then start a new session. Most agents pick skills up at session start.

Code examples

The skill generates the send in every language Courier ships an SDK for. A transactional send always carries an idempotency key, so a retry after a network failure returns the original result instead of sending twice:

Universal rules

The skill enforces these constraints across all generated code:
  • Never send promotional content in transactional notifications
  • Never batch or delay OTP, password reset, or security alerts
  • Never batch, delay, or fan out a code that is meant to reach one device
  • Always use idempotency keys for transactional sends
  • Always express quiet hours as a native delivery window rather than queueing in your own code
  • Always use method: "single" unless the notification warrants all channels