eusend

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

shell
/plugin marketplace add eusend-dev/eusend-skill
/plugin install eusend@eusend

Then set your API key so the bundled MCP server can authenticate:

shell
export EUSEND_API_KEY=eu_live_xxxxxxxxxxxx
export EUSEND_FROM=[email protected]   # optional — pins a default sender

The 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.com

What it knows

The skill is written around the mistakes that actually reach production, not a restatement of the API reference:

ParameterTypeDescription
Verified sendersDOMAIN_NOT_VERIFIEDThe 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 retriesIdempotency-KeyDerive the key from a domain object, not a UUID minted per attempt — which is the version that makes every retry a fresh send.
Webhook signaturesraw bodyVerify 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 addDNSA 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 policyerror codesWhich codes are transient, which need a longer horizon, and which are terminal. ALL_SUPPRESSED is the system working, not an incident.
Per-language failure shapesSDKsThe 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:

shell
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.