Installation
- Any assistant (recommended)
- Claude Code (plugin)
- Manual clone
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:
- Quick Reference at the top with hard rules, common mistakes, and copy-paste templates
- Detailed guidance with explanations, examples, and edge cases
- Related links to other files
Example: agent building an OTP flow
- Agent reads
SKILL.md, finds the routing table - Routing table says: OTP/2FA -> read
transactional.md+sms.md - 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 - 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