Claude Code plugin
Install the official eusend plugin so Claude knows how eusend actually behaves — verified senders, idempotent retries, webhook signatures, and which errors to retry — before it writes a line of code.
The MCP server gives an assistant tools: it can send mail, add a domain,
read your delivery log. What it can't do is tell the assistant how eusend behaves —
that the sender domain must be verified, that a retry without an Idempotency-Key
double-sends, that a webhook signature covers the raw request body and not the parsed
JSON.
That's what a skill is for. The eusend plugin ships one, plus the MCP server, in a single install.
Install
/plugin marketplace add eusend-dev/eusend-skill
/plugin install eusend@eusendThen set your API key so the bundled MCP server can authenticate:
export EUSEND_API_KEY=eu_live_xxxxxxxxxxxx
export EUSEND_FROM=[email protected] # optional — pins a default senderThe skill itself needs no key. Only the MCP server does. Use an eu_test_ key while you're wiring
things up — sends are accepted, recorded, and fire the full webhook lifecycle, but never reach a
real inbox.
Using it
Claude loads the skill on its own when a task involves eusend — a @eusend_dev/sdk
import, an EUSEND_API_KEY in your env file, or just a prompt that mentions us. To
invoke it directly, type /eusend:eusend.
Things it's built for:
Add password reset emails to this app using eusend
Why is this send returning DOMAIN_NOT_VERIFIED?
Write a webhook handler for eusend bounces
Set up the DNS records for acme.comWhat it knows
The skill is written around the mistakes that actually reach production, not a restatement of the API reference:
| Parameter | Type | Description |
|---|---|---|
Verified senders | DOMAIN_NOT_VERIFIED | The from address must be on a verified domain, and no retry fixes it. Includes the sandbox sender and its one real constraint — it only delivers to your own account email. |
Idempotent retries | Idempotency-Key | Derive the key from a domain object, not a UUID minted per attempt — which is the version that makes every retry a fresh send. |
Webhook signatures | raw body | Verify against the bytes received, in constant time, checking length first. Working handlers for Express, Next.js route handlers, Flask, and net/http. |
The SPF record not to add | DNS | A second SPF record on your root domain breaks SPF for every other service sending from it, including your own Google Workspace mail. eusend authenticates with DKIM and does not need one. |
Retry policy | error codes | Which codes are transient, which need a longer horizon, and which are terminal. ALL_SUPPRESSED is the system working, not an incident. |
Per-language failure shapes | SDKs | The Node SDK returns { data, error } and never throws on an API error — an unchecked await silently drops every failed send. Python raises; Go returns an error. |
Detail lives in reference files the assistant loads only when it needs them, so the always-on cost is about 260 tokens.
Other agents
Agent Skills is an open standard, not a Claude format. This skill is written to it — spec-standard frontmatter only, no Claude-specific syntax in the body — so it works in Cursor, GitHub Copilot, VS Code, Codex, Gemini CLI, OpenCode, Goose, Amp, Roo Code and the rest of the skills-compatible ecosystem.
Only the install differs. /plugin is Claude Code's marketplace format; elsewhere you drop
the skill folder somewhere the agent scans. Cursor, Codex and Copilot all read
.agents/skills/, so one copy covers all three:
git clone https://github.com/eusend-dev/eusend-skill
mkdir -p .agents/skills
cp -r eusend-skill/plugins/eusend/skills/eusend .agents/skills/Use ~/.agents/skills/ to install it once for every project instead. Agents that scan
elsewhere — .github/skills/ for Copilot, .cursor/skills/ for Cursor — work the same way.
The MCP server is independent of the skill and equally portable — it speaks plain MCP, so Cursor, Codex, Claude Desktop and any other MCP client can connect to it. Only the bundled-in-one-install convenience is specific to Claude Code.
Found something the skill gets wrong? That's a bug, and the repository takes issues. A skill that confidently teaches the wrong thing is worse than no skill at all.