MCP server
Connect eusend to any AI coding tool over the Model Context Protocol — send email and manage domains, audiences, and broadcasts from Claude, Cursor, Codex, and other MCP clients.
The Model Context Protocol (MCP) lets AI tools call external services through a typed set of tools. eusend runs an MCP server so assistants like Claude Code, Claude Desktop, Cursor, and Codex can send email and manage domains, audiences, and broadcasts on your behalf — through the exact same pipeline as the HTTP API. DKIM signing, tracking, suppression, rate limits, and your sending ceilings all apply identically. In Claude, connect it straight from the connectors directory.
Using Claude Code? The eusend plugin installs this server and a skill that teaches Claude how eusend behaves — verified senders, idempotent retries, webhook signatures — in one command. The tools below let an assistant act on your account; the skill is what stops it writing the integration wrong.
There are two ways to connect, and they use the same tools underneath:
Remote (hosted)
Zero install — point your client at a URL. Best for getting started.
Local (stdio)
Runs on your machine via npx. Your key never leaves your computer.
How authentication works
The hosted server accepts two kinds of credential. The local server uses an API key only.
- Sign in (OAuth), remote only: add the URL with no key. Your client opens eusend in a browser, you sign in and approve it, and the client receives a token of its own. This is the only option for clients that cannot send a custom header, such as Claude on the web.
- API key, remote: your client sends one of your eusend API keys on each
request as an
Authorization: Bearerheader. - API key, local: the key is read from the
EUSEND_API_KEYenvironment variable in your own MCP config and never leaves your machine.
Either way the hosted server holds no credential of its own. It forwards each call to the API with the one your client presented, so it can never do anything that credential can't.
What you choose when signing in
The approval screen asks for three things, which together are the equivalent of an API key's settings:
| Parameter | Type | Description |
|---|---|---|
Workspace | required | The one workspace the app can reach. Connect again to use it with another. |
Access | Full access | Sending only | Full access reaches every tool. Sending only can send, reschedule and cancel email, and every other tool returns 403 FORBIDDEN. |
Mode | Live | Test mode | In test mode calls are accepted and tracked but never delivered, exactly like an eu_test_ key. |
Connected apps are listed under Settings → Connected apps. Disconnecting one takes effect on its next request. An app acts on behalf of the person who connected it, so it also stops working if that person leaves the workspace.
API key permissions
Most tools need a full_access key. A
sending_access key can only
send, so listing domains, managing audiences and every other tool will return
403 FORBIDDEN — useful if you want an assistant that can send mail and nothing
else.
Use an eu_test_ key while wiring things up — calls are accepted and tracked but never delivered.
Swap in an eu_live_ key to send for real.
Remote (hosted)
Endpoint: https://mcp.eusend.dev/mcp. No installation — add the URL to your
client and sign in when it prompts you, or pass an Authorization header
carrying an API key instead.
Claude (web, desktop, and mobile)
eusend is in Claude's connectors directory. Open Customize → Connectors, search for eusend, select Connect, and sign in. On Team and Enterprise plans an Owner adds it for the organization first, and members then connect with their own eusend account.
Claude Code
claude mcp add --transport http eusend https://mcp.eusend.dev/mcpThen run /mcp inside Claude Code and choose Authenticate. To use an API key
instead, add the header and skip the sign-in:
claude mcp add --transport http eusend https://mcp.eusend.dev/mcp \
--header "Authorization: Bearer eu_live_xxxxxxxxxxxx"Cursor, Windsurf, and other JSON-configured clients
Add a remote server entry to the client's MCP config (e.g. .cursor/mcp.json).
With only a url, the client signs you in on first use:
{
"mcpServers": {
"eusend": {
"url": "https://mcp.eusend.dev/mcp"
}
}
}Or pass an API key:
{
"mcpServers": {
"eusend": {
"url": "https://mcp.eusend.dev/mcp",
"headers": {
"Authorization": "Bearer eu_live_xxxxxxxxxxxx"
}
}
}
}Codex
codex mcp add eusend --url https://mcp.eusend.dev/mcpThen sign in with codex mcp login eusend, or set the
Authorization: Bearer eu_live_… header for the eusend server in your Codex MCP
configuration to use an API key.
Local (stdio)
The local server runs as a subprocess your client launches on demand, via
@eusend_dev/mcp. Your key stays in your own config and is
never sent to eusend as part of setup. Requires Node.js.
Claude Code
claude mcp add eusend \
--env EUSEND_API_KEY=eu_live_xxxxxxxxxxxx \
-- npx -y @eusend_dev/mcpClaude Desktop, Cursor, and other JSON-configured clients
{
"mcpServers": {
"eusend": {
"command": "npx",
"args": ["-y", "@eusend_dev/mcp"],
"env": {
"EUSEND_API_KEY": "eu_live_xxxxxxxxxxxx",
"EUSEND_FROM": "hello@yourdomain.com"
}
}
}
}Setting EUSEND_FROM pins a default sender, so the assistant doesn't have to guess an address on
every send. It must be on a verified domain.
Available tools
| Parameter | Type | Description |
|---|---|---|
Emails | 4 tools | send_email, list_emails, get_email, cancel_email — send transactional mail and inspect delivery. |
Domains | 4 tools | list_domains, get_domain, create_domain, verify_domain — add a sending domain, read back its DNS records, and re-check them. |
Audiences & contacts | 6 tools | list_audiences, get_audience, create_audience, rename_audience, list_contacts, create_contact — manage contact lists. |
Broadcasts | 7 tools | list_broadcasts, get_broadcast, create_broadcast, update_broadcast, test_broadcast, send_broadcast, cancel_broadcast — draft a broadcast with its reply-to and tracking settings, edit the draft, send yourself a test copy, then send it to an audience or cancel it. |
Suppressions | 2 tools | list_suppressions, create_suppression — see which addresses are blocked and why, and stop sending to one. |
Destructive actions — deleting domains, audiences, contacts, or API keys — are intentionally
not exposed to the assistant. Broadcasts are also two steps: create_broadcast only drafts,
and send_broadcast is a separate call, so a bulk send is never a single accidental action.
test_broadcast sits between them and is the one an assistant should reach for first — it can
only deliver to your own verified domains, so it cannot reach a list by mistake. Un-suppressing is
absent for the same reason: suppressing stops mail, but removing an entry re-enables sending to an
address that bounced or complained, and doing that in bulk is what wrecks a sender's reputation.
update_broadcast only edits drafts, so it can never change who a scheduled broadcast reaches.
The sender address
Like every other way to send through eusend, the from address must use a domain
you have verified. Sends from an unverified domain fail with DOMAIN_NOT_VERIFIED
— see Domain Setup to add one. Pin a default with EUSEND_FROM
(local) so the assistant always has a valid sender to use.
Go SDK
Official Go SDK for the eusend API. Zero dependencies, context-aware, and shaped to mirror resend-go.
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.