Agent Skills for MillionSend — the open-source, self-hostable, Resend-compatible email platform on AWS SES. Each skill teaches a coding agent (Claude Code, Cursor, and other agents supporting the Agent Skills format) how to work with a real MillionSend instance: exact endpoints, request shapes, error codes, and gotchas, all verified against the API source.
All skills:
npx skills add MillionSend/skillsOne skill:
npx skills add MillionSend/skills --skill millionsend-send-emailThis repo is also a Cursor plugin: .cursor-plugin/plugin.json is the manifest, mcp.json adds the hosted MCP server (https://api.millionsend.com/mcp), and the skills load from skills/.
Cursor, from a local clone:
git clone https://github.com/MillionSend/skills ~/.cursor/plugins/local/millionsendThen run Developer: Reload Window (or restart Cursor) and check Customize for the skills and the millionsend MCP server. On Teams and Enterprise, local plugins load only while the admin setting Allow Local Plugin Imports is on (off by default on Enterprise). Clone into that folder rather than symlinking it: Cursor skips symlinks that point outside ~/.cursor/plugins/local.
Grok Bot: in a chat, say "Add this MCP server: https://api.millionsend.com/mcp".
Sign-in is OAuth through app.millionsend.com: on first connect you pick the team (or all teams) and the permissions the agent gets. There is no API key to paste and no local process to run. Revoke access under Settings → Connected apps in the MillionSend dashboard.
Self-hosted: point mcp.json at your instance's own /mcp URL (shown under Settings → MCP).
| Skill | What it covers |
|---|---|
| millionsend-send-email | POST /emails incl. attachments, headers, topic_id, ISO + relative scheduled_at, idempotency, batch (strict/permissive), reschedule/cancel, SDKs, SMTP relay |
| millionsend-contacts | Team-global contacts, bulk POST /contacts/batch (skip/upsert), typed /contact-properties, segments (filters and manual membership), topics + subscriptions, unsubscribe semantics, /suppressions (batch add/remove) |
| millionsend-broadcasts | Campaigns: draft / send: true / schedule, preview_text, segment ∩ topic targeting, {{{FIRST_NAME|fallback}}} merge fields, {{{UNSUBSCRIBE_URL}}}, /templates (aliases, no publish cycle) |
| millionsend-domains | /domains create → DNS records → verify, tracking toggles, the read-only shared inbox subdomain, plus /api-keys (permissions, domain-scoped keys) |
| millionsend-webhooks | /webhooks CRUD, event types incl. the email.failed / email.suppressed reasons, bring-your-own whsec_ secret, Standard Webhooks signature verification (webhook-* and svix-* headers), retries, receiver checklist |
| millionsend-self-host | Stand up an instance: npx @millionsend/setup, Docker Compose, AWS SES/SNS/SQS events, DNS, SMTP relay |
| millionsend-migrate-from-resend | npx @millionsend/cli migrate --from resend (read-only against Resend; plan / apply / status / rollback; re-run to sync), then zero-code cutover via RESEND_BASE_URL/RESEND_API_URL, SDK swap table for 9 languages, SMTP swap, the deliberate deltas |
| millionsend-mcp | Connect Claude Code / Claude Desktop / Cursor / VS Code to the built-in MCP server (/mcp, OAuth, team-scoped) and use its tools, incl. an agent setting up its own inbox on the shared subdomain |
MIT — see LICENSE. (The MillionSend application itself is AGPL-3.0; these skills are documentation and are deliberately permissive.)