tokens&
For enterprises
Submit
Sign in
tokens&

Build better AI stacks, claim useful opportunities, and give AI infrastructure companies a source-labeled adoption readout they can trust.

For buildersFor enterprises

Product

  • For builders
  • Category rankings
  • Startup credits and perks
  • Agent Skills
  • Platform
  • Submit project, tool, product, or perk

Enterprise

  • Start free company workspace

Community

  • Community
  • Newsletter
  • Events
Xin

© 2026 tokensand, LLC. All rights reserved.

  • Terms
  • Privacy
  • Security
  • Data Processing
  • Status
Agent Skills/Cloudflare Email Service
CloudflareBackendSKILL.mdVerified source

Agent Skill

Cloudflare Email Service

Send, receive, route, and test transactional email from Workers and REST APIs.

Install this skillView repository

Vendor-authored source · Apache-2.0 license.

Raw SKILL.mdInstall the Tokens& Agent Pack

Skill specification

Declared by Cloudflare in the package front matter. Trigger conditions are what the coding agent matches on before it loads the skill.

View package fields
Cloudflare Email Service SKILL.md front matter fields
Skill namecloudflare-email-service
Trigger conditionsSend and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF/DKIM/DMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like "add email to my Worker" — this skill has critical config details.

Install cloudflare-email-service

In a terminal with Node.js, npm and Git, run the command for your agent. The Skills CLI installs the complete package directory, including referenced files within it. Review its install prompt, then start a new agent session. A skill package does not set up an MCP server connection.

Claude Code

.claude/skills/cloudflare-email-service/SKILL.md

Project skills are committed with the repo. Use the user directory for a personal install across every project.

Project install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'claude-code'
Install for all projects instead

Personal install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'claude-code' --global

Codex

.agents/skills/cloudflare-email-service/SKILL.md

Codex reads `.agents/skills/` as its primary location, which is also the cross-platform default other clients honour.

Project install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'codex'
Install for all projects instead

Personal install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'codex' --global

Cursor

.agents/skills/cloudflare-email-service/SKILL.md

Cursor also loads `.agents/skills/`, `.claude/skills/`, and `.codex/skills/`, so one committed copy can serve several clients.

Project install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'cursor'
Install for all projects instead

Personal install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'cursor' --global

Gemini CLI

.agents/skills/cloudflare-email-service/SKILL.md

Gemini CLI reads `.agents/skills/` first when both directories exist.

Project install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'gemini-cli'
Install for all projects instead

Personal install

npx skills add 'https://github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service' --skill 'cloudflare-email-service' --agent 'gemini-cli' --global

SKILL.md

View raw source

Published by Cloudflare under Apache-2.0. Rendered from the package in github.com/cloudflare/skills/tree/main/skills/cloudflare-email-service.

Read full skill instructions

Cloudflare Email Service

Your knowledge of the Cloudflare Email Service, Email Routing or Email Sending may be outdated. Prefer retrieval over pre-training for any Cloudflare Email Service task.

Cloudflare Email Service lets you send transactional emails and route incoming emails, all within the Cloudflare platform. Your knowledge of this product may be outdated — it launched in 2025 and is evolving rapidly. Prefer retrieval over pre-training for any Email Service task.

If there is any discrepancy between this skill and the sources below, always trust the original source. The Cloudflare docs, REST API spec, @cloudflare/workers-types, and Agents SDK repo are the source of truth. This skill is a convenience guide — it may lag behind the latest changes. When in doubt, retrieve from the sources below and use what they say.

Retrieval Sources

SourceHow to retrieveUse for
Cloudflare docsCloudflare MCP docs tool or URL https://developers.cloudflare.com/email-service/API reference, limits, pricing, latest features
REST API spechttps://developers.cloudflare.com/api/resources/email_sendingOpenAPI spec for the Email Sending REST API
Workers typeshttps://www.npmjs.com/package/@cloudflare/workers-typesType signatures, binding shapes
Agents SDK docsFetch docs/email.md from https://github.com/cloudflare/agents/tree/main/docsEmail handling in Agents SDK

FIRST: Check Prerequisites

Before writing any email code, verify the basics are in place:

  1. Domain onboarded? Run npx wrangler email sending list to see which domains have email sending enabled. If the domain isn't listed, run npx wrangler email sending enable userdomain.com or see cli-and-mcp.md for full setup instructions.
  2. Binding configured? Look for send_email in wrangler.jsonc (for Workers)
  3. postal-mime installed? Run npm ls postal-mime (only needed for receiving/parsing emails)

What Do You Need?

Start here. Find your situation, then follow the link for full details.

I want to...PathReference
Send emails from a Cloudflare WorkerWorkers binding (no API keys needed)sending.md
Send emails from an AI agent built with [Cloudflare Agents SDK](https://developers.cloudflare.com/agents/)onEmail() + replyToEmail() in Agent classsending.md
Send emails from an external app or agent (Node.js, Go, Python, etc.)REST API with Bearer tokenrest-api.md
Send emails from a coding agent (Claude Code, Cursor, Copilot, etc.)MCP tools, wrangler CLI, or REST APIcli-and-mcp.md
Receive and process incoming emails (Email Routing)Workers email() handlerrouting.md
Set up Email Sending or Email Routingwrangler email sending enable

Quick Start — Workers Binding

Add the binding to wrangler.jsonc, then call env.EMAIL.send(). The from domain must be onboarded via npx wrangler email sending enable yourdomain.com.

// wrangler.jsonc
{ "send_email": [{ "name": "EMAIL" }] }
const response = await env.EMAIL.send({
  to: "user@example.com",
  from: { email: "welcome@yourdomain.com", name: "My App" },
  subject: "Welcome!",
  html: "<h1>Welcome!</h1>",
  text: "Welcome!",
});

The binding is recommended for Workers — no API keys needed. If a user specifically requests the REST API from within a Worker (e.g., they already have an API token workflow), that works too — see rest-api.md.

See sending.md for the full API, batch sends, attachments, custom headers, restricted bindings, and Agents SDK integration.

Quick Start — REST API

For apps outside Workers, or within Workers if the user explicitly requests it. Key differences from the Workers binding:

  • Endpoint: POST https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/send
  • from object uses address (not email): { "address": "...", "name": "..." }
  • replyTo is reply_to (snake_case)
  • Response returns { delivered: [], permanent_bounces: [], queued: [] } (not messageId)

See rest-api.md for curl examples, response format, and error handling.

Common Mistakes

MistakeWhy It HappensFix
Forgetting send_email binding in wrangler configEmail Service uses a binding, not an API keyAdd "send_email": [{ "name": "EMAIL" }] to wrangler.jsonc
Sending from an unverified domainDomain must be onboarded onto Email Sending before first sendRun wrangler email sending enable yourdomain.com or onboard in Dashboard
Reading message.raw twice in email handlerThe raw stream is single-use — second read returns emptyBuffer first: const raw = await new Response(message.raw).arrayBuffer()
Missing text field (HTML only)Some email clients only show plain text; also helps spam scoresAlways include both html and text versions
Using email for marketing/bulk sends

References

Read the reference that matches your situation. You don't need all of them.

  • [references/sending.md](references/sending.md) — Workers binding API, attachments, Agents SDK email. For Workers or Agents SDK.
  • [references/rest-api.md](references/rest-api.md) — REST endpoint, curl examples, error handling. For apps NOT on Workers.
  • [references/routing.md](references/routing.md) — Inbound email() handler, forwarding, replying, parsing. For receiving emails.
  • [references/cli-and-mcp.md](references/cli-and-mcp.md) — Domain setup, wrangler commands, MCP tools. For first-time setup.
  • [references/deliverability.md](references/deliverability.md) — SPF/DKIM/DMARC, bounces, suppressions, best practices.

More Cloudflare Agent Skills

All Agent Skills

Agents SDK build guide

Create stateful Workers agents, MCP servers, workflows, queues, and realtime apps.

Agents

Durable Objects builder

Build and review stateful Workers apps with RPC, SQLite storage, alarms, and WebSockets.

Backend

Turnstile setup

Install Turnstile end to end with widget creation, siteverify Worker, and frontend snippets.

Backend

Web performance audit

Measure Core Web Vitals, identify resource bottlenecks, and prioritize page-speed fixes.

Frontend

Workers best practices

Author and review Workers code, wrangler config, bindings, secrets handling, and observability.

Backend

Wrangler CLI guide

Use current Wrangler commands and config for Workers, KV, R2, D1, Queues, and secrets.

Backend

/
wrangler email routing enable
, or Dashboard
cli-and-mcp.md
Improve deliverability, avoid spam foldersAuthentication, content, compliancedeliverability.md
Email Service is for transactional email only
Use a dedicated marketing email platform for newsletters and campaigns
Forwarding to unverified destinationsmessage.forward() only works with verified addressesRun wrangler email routing addresses create user@gmail.com or add in Dashboard
Testing with fake addressesBounces from non-existent addresses hurt sender reputationUse real addresses you control during development
Hardcoding API tokens in source codeTokens in code get committed and leakedUse environment variables or Cloudflare secrets
Ignoring the from domain requirementThe from address must use a domain onboarded to Email ServiceVerify the domain first, then send from anything@that-domain.com
Using email key in REST API from objectREST API uses address not email for from objectUse { "address": "...", "name": "..." } for REST, { "email": "...", "name": "..." } for Workers
Using replyTo in REST APIREST API uses snake_case field namesUse reply_to for REST API, replyTo for Workers binding