pi-cloudflare 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Zaraz Gotchas
|
|
2
|
+
|
|
3
|
+
## Events Not Firing
|
|
4
|
+
|
|
5
|
+
**Check:**
|
|
6
|
+
1. Tool enabled in dashboard (green dot)
|
|
7
|
+
2. Trigger conditions met
|
|
8
|
+
3. Consent granted for tool's purpose
|
|
9
|
+
4. Tool credentials correct (GA4: `G-XXXXXXXXXX`, FB: numeric only)
|
|
10
|
+
|
|
11
|
+
**Debug:**
|
|
12
|
+
```javascript
|
|
13
|
+
zaraz.debug = true;
|
|
14
|
+
console.log('Tools:', zaraz.tools);
|
|
15
|
+
console.log('Consent:', zaraz.consent.getAll());
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Consent Issues
|
|
19
|
+
|
|
20
|
+
**Modal not showing:**
|
|
21
|
+
```javascript
|
|
22
|
+
// Clear consent cookie
|
|
23
|
+
document.cookie = 'zaraz-consent=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
|
|
24
|
+
location.reload();
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Tools firing before consent:** Map tool to consent purpose with "Do not load until consent granted".
|
|
28
|
+
|
|
29
|
+
## SPA Tracking
|
|
30
|
+
|
|
31
|
+
**Route changes not tracked:**
|
|
32
|
+
1. Configure History Change trigger in dashboard
|
|
33
|
+
2. Hash routing (`#/path`) requires manual tracking:
|
|
34
|
+
```javascript
|
|
35
|
+
window.addEventListener('hashchange', () => {
|
|
36
|
+
zaraz.track('pageview', { page_path: location.pathname + location.hash });
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**React fix:**
|
|
41
|
+
```javascript
|
|
42
|
+
const location = useLocation();
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
zaraz.track('pageview', { page_path: location.pathname });
|
|
45
|
+
}, [location]); // Include dependency
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Performance
|
|
49
|
+
|
|
50
|
+
**Slow page load:**
|
|
51
|
+
- Audit tool count (50+ degrades performance)
|
|
52
|
+
- Disable blocking triggers unless required
|
|
53
|
+
- Reduce event payload size (<100KB)
|
|
54
|
+
|
|
55
|
+
## Tool-Specific Issues
|
|
56
|
+
|
|
57
|
+
| Tool | Issue | Fix |
|
|
58
|
+
|------|-------|-----|
|
|
59
|
+
| GA4 | Events not in real-time | Wait 5-10 min, use DebugView |
|
|
60
|
+
| Facebook | Invalid Pixel ID | Use numeric only (no `fbpx_` prefix) |
|
|
61
|
+
| Google Ads | Conversions not attributed | Include `send_to: 'AW-XXX/LABEL'` |
|
|
62
|
+
|
|
63
|
+
## Data Layer
|
|
64
|
+
|
|
65
|
+
- Properties persist per page only - set on each page load
|
|
66
|
+
- Nested access: `{{client.__zarazTrack.user.plan}}`
|
|
67
|
+
|
|
68
|
+
## Limits
|
|
69
|
+
|
|
70
|
+
| Resource | Limit |
|
|
71
|
+
|----------|-------|
|
|
72
|
+
| Request size | 100KB |
|
|
73
|
+
| Consent purposes | 20 |
|
|
74
|
+
| API rate | 1000 req/sec |
|
|
75
|
+
|
|
76
|
+
## When NOT to Use Zaraz
|
|
77
|
+
|
|
78
|
+
- Server-to-server tracking (use Workers)
|
|
79
|
+
- Real-time bidirectional communication
|
|
80
|
+
- Binary data transmission
|
|
81
|
+
- Authentication flows
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Zaraz Patterns
|
|
2
|
+
|
|
3
|
+
## SPA Tracking
|
|
4
|
+
|
|
5
|
+
**History Change Trigger (Recommended):** Configure in dashboard - no code needed, Zaraz auto-detects route changes.
|
|
6
|
+
|
|
7
|
+
**Manual tracking (React/Vue/Next.js):**
|
|
8
|
+
```javascript
|
|
9
|
+
// On route change
|
|
10
|
+
zaraz.track('pageview', { page_path: pathname, page_title: document.title });
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## User Identification
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// Login
|
|
17
|
+
zaraz.set({ userId: user.id, email: user.email, plan: user.plan });
|
|
18
|
+
zaraz.track('login', { method: 'oauth' });
|
|
19
|
+
|
|
20
|
+
// Logout - set to null (cannot clear)
|
|
21
|
+
zaraz.set('userId', null);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## E-commerce Funnel
|
|
25
|
+
|
|
26
|
+
| Event | Method |
|
|
27
|
+
|-------|--------|
|
|
28
|
+
| View | `zaraz.ecommerce('Product Viewed', { product_id, name, price })` |
|
|
29
|
+
| Add to cart | `zaraz.ecommerce('Product Added', { product_id, quantity })` |
|
|
30
|
+
| Checkout | `zaraz.ecommerce('Checkout Started', { cart_id, products: [...] })` |
|
|
31
|
+
| Purchase | `zaraz.ecommerce('Order Completed', { order_id, total, products })` |
|
|
32
|
+
|
|
33
|
+
## A/B Testing
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
zaraz.set('experiment_checkout', variant);
|
|
37
|
+
zaraz.track('experiment_viewed', { experiment_id: 'checkout', variant });
|
|
38
|
+
// On conversion
|
|
39
|
+
zaraz.track('experiment_conversion', { experiment_id, variant, value });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Worker Integration
|
|
43
|
+
|
|
44
|
+
**Context Enricher** - Modify context before tools execute:
|
|
45
|
+
```typescript
|
|
46
|
+
export default {
|
|
47
|
+
async fetch(request, env) {
|
|
48
|
+
const body = await request.json();
|
|
49
|
+
body.system.userRegion = request.cf?.region;
|
|
50
|
+
return Response.json(body);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
Configure: Zaraz > Settings > Context Enrichers
|
|
55
|
+
|
|
56
|
+
**Worker Variables** - Compute dynamic values server-side, use as `{{worker.variable_name}}`.
|
|
57
|
+
|
|
58
|
+
## GTM Migration
|
|
59
|
+
|
|
60
|
+
| GTM | Zaraz |
|
|
61
|
+
|-----|-------|
|
|
62
|
+
| `dataLayer.push({event: 'purchase'})` | `zaraz.ecommerce('Order Completed', {...})` |
|
|
63
|
+
| `{{Page URL}}` | `{{system.page.url}}` |
|
|
64
|
+
| `{{Page Title}}` | `{{system.page.title}}` |
|
|
65
|
+
| Page View trigger | Pageview trigger |
|
|
66
|
+
| Click trigger | Click (selector: `*`) |
|
|
67
|
+
|
|
68
|
+
## Best Practices
|
|
69
|
+
|
|
70
|
+
1. Use dashboard triggers over inline code
|
|
71
|
+
2. Enable History Change for SPAs (no manual code)
|
|
72
|
+
3. Debug with `zaraz.debug = true`
|
|
73
|
+
4. Implement consent early (GDPR/CCPA)
|
|
74
|
+
5. Use Context Enrichers for sensitive/server data
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cloudflare-email-service
|
|
3
|
+
description: Send 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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cloudflare Email Service
|
|
7
|
+
|
|
8
|
+
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.
|
|
9
|
+
|
|
10
|
+
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.
|
|
11
|
+
|
|
12
|
+
**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.
|
|
13
|
+
|
|
14
|
+
## Retrieval Sources
|
|
15
|
+
|
|
16
|
+
| Source | How to retrieve | Use for |
|
|
17
|
+
|--------|----------------|---------|
|
|
18
|
+
| Cloudflare docs | Cloudflare MCP `docs` tool or URL `https://developers.cloudflare.com/email-service/` | API reference, limits, pricing, latest features |
|
|
19
|
+
| REST API spec | `https://developers.cloudflare.com/api/resources/email_sending` | OpenAPI spec for the Email Sending REST API |
|
|
20
|
+
| Workers types | `https://www.npmjs.com/package/@cloudflare/workers-types` | Type signatures, binding shapes |
|
|
21
|
+
| Agents SDK docs | Fetch `docs/email.md` from `https://github.com/cloudflare/agents/tree/main/docs` | Email handling in Agents SDK |
|
|
22
|
+
|
|
23
|
+
## FIRST: Check Prerequisites
|
|
24
|
+
|
|
25
|
+
Before writing any email code, verify the basics are in place:
|
|
26
|
+
|
|
27
|
+
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](references/cli-and-mcp.md) for full setup instructions.
|
|
28
|
+
2. **Binding configured?** Look for `send_email` in `wrangler.jsonc` (for Workers)
|
|
29
|
+
3. **postal-mime installed?** Run `npm ls postal-mime` (only needed for receiving/parsing emails)
|
|
30
|
+
|
|
31
|
+
## What Do You Need?
|
|
32
|
+
|
|
33
|
+
Start here. Find your situation, then follow the link for full details.
|
|
34
|
+
|
|
35
|
+
| I want to... | Path | Reference |
|
|
36
|
+
|--------------|------|-----------|
|
|
37
|
+
| **Send emails from a Cloudflare Worker** | Workers binding (no API keys needed) | [sending.md](references/sending.md) |
|
|
38
|
+
| **Send emails from an AI agent built with [Cloudflare Agents SDK](https://developers.cloudflare.com/agents/)** | `onEmail()` + `replyToEmail()` in Agent class | [sending.md](references/sending.md) |
|
|
39
|
+
| **Send emails from an external app or agent** (Node.js, Go, Python, etc.) | REST API with Bearer token | [rest-api.md](references/rest-api.md) |
|
|
40
|
+
| **Send emails from a coding agent** (Claude Code, Cursor, Copilot, etc.) | MCP tools, wrangler CLI, or REST API | [cli-and-mcp.md](references/cli-and-mcp.md) |
|
|
41
|
+
| **Receive and process incoming emails** (Email Routing) | Workers `email()` handler | [routing.md](references/routing.md) |
|
|
42
|
+
| **Set up Email Sending or Email Routing** | `wrangler email sending enable` / `wrangler email routing enable`, or Dashboard | [cli-and-mcp.md](references/cli-and-mcp.md) |
|
|
43
|
+
| **Improve deliverability, avoid spam folders** | Authentication, content, compliance | [deliverability.md](references/deliverability.md) |
|
|
44
|
+
|
|
45
|
+
## Quick Start — Workers Binding
|
|
46
|
+
|
|
47
|
+
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`.
|
|
48
|
+
|
|
49
|
+
```jsonc
|
|
50
|
+
// wrangler.jsonc
|
|
51
|
+
{ "send_email": [{ "name": "EMAIL" }] }
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
const response = await env.EMAIL.send({
|
|
56
|
+
to: "user@example.com",
|
|
57
|
+
from: { email: "welcome@yourdomain.com", name: "My App" },
|
|
58
|
+
subject: "Welcome!",
|
|
59
|
+
html: "<h1>Welcome!</h1>",
|
|
60
|
+
text: "Welcome!",
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
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](references/rest-api.md).
|
|
65
|
+
|
|
66
|
+
See [sending.md](references/sending.md) for the full API, batch sends, attachments, custom headers, restricted bindings, and Agents SDK integration.
|
|
67
|
+
|
|
68
|
+
## Quick Start — REST API
|
|
69
|
+
|
|
70
|
+
For apps outside Workers, or within Workers if the user explicitly requests it. Key differences from the Workers binding:
|
|
71
|
+
|
|
72
|
+
- Endpoint: `POST https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/send`
|
|
73
|
+
- `from` object uses `address` (not `email`): `{ "address": "...", "name": "..." }`
|
|
74
|
+
- `replyTo` is `reply_to` (snake_case)
|
|
75
|
+
- Response returns `{ delivered: [], permanent_bounces: [], queued: [] }` (not `messageId`)
|
|
76
|
+
|
|
77
|
+
See [rest-api.md](references/rest-api.md) for curl examples, response format, and error handling.
|
|
78
|
+
|
|
79
|
+
## Common Mistakes
|
|
80
|
+
|
|
81
|
+
| Mistake | Why It Happens | Fix |
|
|
82
|
+
|---------|---------------|-----|
|
|
83
|
+
| Forgetting `send_email` binding in wrangler config | Email Service uses a binding, not an API key | Add `"send_email": [{ "name": "EMAIL" }]` to wrangler.jsonc |
|
|
84
|
+
| Sending from an unverified domain | Domain must be onboarded onto Email Sending before first send | Run `wrangler email sending enable yourdomain.com` or onboard in Dashboard |
|
|
85
|
+
| Reading `message.raw` twice in email handler | The raw stream is single-use — second read returns empty | Buffer first: `const raw = await new Response(message.raw).arrayBuffer()` |
|
|
86
|
+
| Missing `text` field (HTML only) | Some email clients only show plain text; also helps spam scores | Always include both `html` and `text` versions |
|
|
87
|
+
| Using email for marketing/bulk sends | Email Service is for transactional email only | Use a dedicated marketing email platform for newsletters and campaigns |
|
|
88
|
+
| Forwarding to unverified destinations | `message.forward()` only works with verified addresses | Run `wrangler email routing addresses create user@gmail.com` or add in Dashboard |
|
|
89
|
+
| Testing with fake addresses | Bounces from non-existent addresses hurt sender reputation | Use real addresses you control during development |
|
|
90
|
+
| Hardcoding API tokens in source code | Tokens in code get committed and leaked | Use environment variables or Cloudflare secrets |
|
|
91
|
+
| Ignoring the `from` domain requirement | The `from` address must use a domain onboarded to Email Service | Verify the domain first, then send from `anything@that-domain.com` |
|
|
92
|
+
| Using `email` key in REST API `from` object | REST API uses `address` not `email` for `from` object | Use `{ "address": "...", "name": "..." }` for REST, `{ "email": "...", "name": "..." }` for Workers |
|
|
93
|
+
| Using `replyTo` in REST API | REST API uses snake_case field names | Use `reply_to` for REST API, `replyTo` for Workers binding |
|
|
94
|
+
|
|
95
|
+
## References
|
|
96
|
+
|
|
97
|
+
Read the reference that matches your situation. You don't need all of them.
|
|
98
|
+
|
|
99
|
+
- **[references/sending.md](references/sending.md)** — Workers binding API, attachments, Agents SDK email. For Workers or Agents SDK.
|
|
100
|
+
- **[references/rest-api.md](references/rest-api.md)** — REST endpoint, curl examples, error handling. For apps NOT on Workers.
|
|
101
|
+
- **[references/routing.md](references/routing.md)** — Inbound `email()` handler, forwarding, replying, parsing. For receiving emails.
|
|
102
|
+
- **[references/cli-and-mcp.md](references/cli-and-mcp.md)** — Domain setup, wrangler commands, MCP tools. For first-time setup.
|
|
103
|
+
- **[references/deliverability.md](references/deliverability.md)** — SPF/DKIM/DMARC, bounces, suppressions, best practices.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# CLI, MCP, and Project Setup
|
|
2
|
+
|
|
3
|
+
Manage Cloudflare Email Service from the command line and coding agents.
|
|
4
|
+
|
|
5
|
+
For full CLI reference, run `npx wrangler email --help`. For Dashboard setup, see the [getting started docs](https://developers.cloudflare.com/email-service/get-started/).
|
|
6
|
+
|
|
7
|
+
## Wrangler Email Commands
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
wrangler email routing
|
|
11
|
+
├── enable/disable <domain> # Toggle email routing
|
|
12
|
+
├── dns get <domain> # Show required DNS records
|
|
13
|
+
├── rules list/create/update/delete # Manage routing rules
|
|
14
|
+
└── addresses list/create/delete # Destination addresses (account-scoped)
|
|
15
|
+
|
|
16
|
+
wrangler email sending
|
|
17
|
+
├── enable/disable <domain> # Toggle email sending
|
|
18
|
+
├── dns get <domain> # Show sending DNS records (SPF, DKIM)
|
|
19
|
+
├── send --from --to ... # Send an email (builder flags)
|
|
20
|
+
└── send-raw --from --to ... # Send a raw MIME email
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Domain Setup
|
|
24
|
+
|
|
25
|
+
### Via Dashboard
|
|
26
|
+
|
|
27
|
+
1. Navigate to **Compute & AI** > **Email Service** > **Email Sending** (or **Email Routing**)
|
|
28
|
+
2. Select **Onboard Domain** > choose domain > **Add records and onboard**
|
|
29
|
+
|
|
30
|
+
This auto-adds SPF (TXT) and DKIM (CNAME/TXT) records. DNS usually propagates within 5-15 minutes.
|
|
31
|
+
|
|
32
|
+
### Via CLI
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx wrangler email sending enable yourdomain.com
|
|
36
|
+
npx wrangler email sending dns get yourdomain.com # Verify records
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Local Development
|
|
40
|
+
|
|
41
|
+
Add `"remote": true` to send real emails during `wrangler dev`:
|
|
42
|
+
|
|
43
|
+
```jsonc
|
|
44
|
+
{ "send_email": [{ "name": "EMAIL", "remote": true }] }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx wrangler dev
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Emails are actually sent — use test addresses you control. Remove `"remote": true` before deploying.
|
|
52
|
+
|
|
53
|
+
## Cloudflare MCP Server
|
|
54
|
+
|
|
55
|
+
If you have the [Cloudflare MCP server](https://github.com/cloudflare/mcp) (`https://mcp.cloudflare.com/mcp`) configured, you can manage Email Service through its `search` and `execute` tools.
|
|
56
|
+
|
|
57
|
+
Use `search` to find email sending endpoints:
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
// search tool — find all email sending API endpoints
|
|
61
|
+
async () => {
|
|
62
|
+
const results = [];
|
|
63
|
+
for (const [path, methods] of Object.entries(spec.paths)) {
|
|
64
|
+
if (path.includes('email/sending')) {
|
|
65
|
+
for (const [method, op] of Object.entries(methods)) {
|
|
66
|
+
results.push({ method: method.toUpperCase(), path, summary: op.summary });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return results;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Then use `execute` to call them — for example, checking sending limits or sending an email:
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
// execute tool — check sending quota
|
|
78
|
+
async () => {
|
|
79
|
+
return cloudflare.request({
|
|
80
|
+
method: "GET",
|
|
81
|
+
path: `/accounts/${accountId}/email/sending/limits`
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// execute tool — send an email
|
|
86
|
+
async () => {
|
|
87
|
+
return cloudflare.request({
|
|
88
|
+
method: "POST",
|
|
89
|
+
path: `/accounts/${accountId}/email/sending/send`,
|
|
90
|
+
body: {
|
|
91
|
+
to: "user@example.com",
|
|
92
|
+
from: { address: "notifications@yourdomain.com", name: "My App" },
|
|
93
|
+
subject: "Deployment Complete",
|
|
94
|
+
html: "<h1>Deployed!</h1>",
|
|
95
|
+
text: "Deployed!"
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
GraphQL analytics queries also work through `execute` — see [deliverability.md](deliverability.md#graphql-analytics-api) for query examples. Note that email analytics are **zone-level** datasets (`emailSendingAdaptiveGroups`, `emailSendingAdaptive`) queried under `viewer > zones`, and require the **Analytics Read** token permission.
|
|
102
|
+
|
|
103
|
+
## Sending from CLI / Agents
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npx wrangler email sending send \
|
|
107
|
+
--from "agent@yourdomain.com" \
|
|
108
|
+
--to "developer@company.com" \
|
|
109
|
+
--subject "Deployment Complete" \
|
|
110
|
+
--text "Your Worker was deployed successfully."
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Or via REST API:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
curl "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/email/sending/send" \
|
|
117
|
+
--header "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
|
|
118
|
+
--header "Content-Type: application/json" \
|
|
119
|
+
--data '{
|
|
120
|
+
"to": "developer@company.com",
|
|
121
|
+
"from": {"address": "agent@yourdomain.com", "name": "Build Agent"},
|
|
122
|
+
"subject": "Deployment Complete",
|
|
123
|
+
"text": "Your Worker was deployed successfully."
|
|
124
|
+
}'
|
|
125
|
+
```
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# Email Deliverability & Best Practices
|
|
2
|
+
|
|
3
|
+
For full details, see the [deliverability docs](https://developers.cloudflare.com/email-service/concepts/deliverability/) and [email authentication docs](https://developers.cloudflare.com/email-service/concepts/email-authentication/). All the monitoring endpoints below can be called via the [REST API](rest-api.md), [Wrangler CLI, or the Cloudflare MCP server](cli-and-mcp.md).
|
|
4
|
+
|
|
5
|
+
## What Cloudflare Handles
|
|
6
|
+
|
|
7
|
+
When you onboard a domain, Cloudflare auto-configures:
|
|
8
|
+
|
|
9
|
+
- **SPF** — TXT records authorizing Cloudflare's sending infrastructure
|
|
10
|
+
- **DKIM** — Records for cryptographic signing of outbound emails
|
|
11
|
+
- **IP reputation** — Managed sending infrastructure optimized for deliverability
|
|
12
|
+
- **Soft bounce retries** — Automatic exponential backoff for temporary failures
|
|
13
|
+
- **Suppression lists** — Hard-bounced addresses automatically blocked
|
|
14
|
+
- **Feedback loops** — ISP complaint signals processed and acted on
|
|
15
|
+
|
|
16
|
+
Consider adding a **DMARC** record if you don't have one: `v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@yourdomain.com`
|
|
17
|
+
|
|
18
|
+
## Bounce Handling
|
|
19
|
+
|
|
20
|
+
**Hard bounces** — permanent failures (address doesn't exist, domain doesn't exist). Never retried. Address auto-added to suppression list. Sending to suppressed address returns `E_RECIPIENT_SUPPRESSED`.
|
|
21
|
+
|
|
22
|
+
**Soft bounces** — temporary failures (mailbox full, server down, greylisting). Cloudflare auto-retries with exponential backoff.
|
|
23
|
+
|
|
24
|
+
## Suppression Lists
|
|
25
|
+
|
|
26
|
+
**Account list** (your account) — spam complaints from recipients. Cloudflare integrates with Postmasters to auto-suppress. You can manually add/remove addresses in the Dashboard.
|
|
27
|
+
|
|
28
|
+
See the [suppressions docs](https://developers.cloudflare.com/email-service/concepts/suppressions/) for details.
|
|
29
|
+
|
|
30
|
+
## Your Responsibilities
|
|
31
|
+
|
|
32
|
+
### Content
|
|
33
|
+
- Include both HTML and plain text versions
|
|
34
|
+
- Use a recognizable sender name: `{ email: "noreply@app.com", name: "My App" }`
|
|
35
|
+
- Write honest subject lines — avoid ALL CAPS, excessive punctuation
|
|
36
|
+
- Include `List-Unsubscribe` headers for recurring emails
|
|
37
|
+
- Use full URLs from your domain — avoid URL shorteners
|
|
38
|
+
|
|
39
|
+
### List Quality
|
|
40
|
+
- Validate email addresses before sending
|
|
41
|
+
- Implement double opt-in for subscriptions
|
|
42
|
+
- Honor unsubscribe requests promptly
|
|
43
|
+
|
|
44
|
+
### Transactional Only
|
|
45
|
+
Email Service is for **transactional email** (triggered by user actions: signups, password resets, order confirmations). Marketing/bulk campaigns are not permitted — use a dedicated marketing platform.
|
|
46
|
+
|
|
47
|
+
## Monitoring Deliverability
|
|
48
|
+
|
|
49
|
+
### Dashboard
|
|
50
|
+
|
|
51
|
+
Per-domain and account-wide analytics are available in the Cloudflare dashboard:
|
|
52
|
+
|
|
53
|
+
1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account.
|
|
54
|
+
2. Go to **Compute & AI** > **Email Service**.
|
|
55
|
+
3. Select a domain or view account-wide metrics.
|
|
56
|
+
4. Select the **Analytics** tab.
|
|
57
|
+
|
|
58
|
+
### Send Response
|
|
59
|
+
|
|
60
|
+
Every send (REST API or Workers binding) returns immediate delivery feedback. Check the response to track per-send outcomes:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"result": {
|
|
65
|
+
"delivered": ["user@example.com"],
|
|
66
|
+
"permanent_bounces": ["bad@nonexistent.com"],
|
|
67
|
+
"queued": ["slow@recipient.com"]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Log these to build your own delivery rate metrics.
|
|
73
|
+
|
|
74
|
+
### Sending Limits
|
|
75
|
+
|
|
76
|
+
Check your account's daily sending quota:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/limits" \
|
|
80
|
+
--header "Authorization: Bearer <API_TOKEN>"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"result": {
|
|
88
|
+
"quota": { "value": 5000, "unit": "day" }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Suppression List
|
|
94
|
+
|
|
95
|
+
Addresses that hard-bounced or received spam complaints are auto-suppressed. You can query and manage suppressions via the API.
|
|
96
|
+
|
|
97
|
+
**List suppressions (account-wide):**
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/suppression?page=1&per_page=100&order=created_at&direction=desc" \
|
|
101
|
+
--header "Authorization: Bearer <API_TOKEN>"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"page": 1,
|
|
109
|
+
"per_page": 100,
|
|
110
|
+
"total": 2,
|
|
111
|
+
"result": [
|
|
112
|
+
{
|
|
113
|
+
"id": "396a5436-d4b0-42a6-b3fc-48e8fa522321",
|
|
114
|
+
"email": "bounced@example.com",
|
|
115
|
+
"reason": "hard_bounce",
|
|
116
|
+
"created_at": "2026-03-15T10:00:00Z",
|
|
117
|
+
"expires_at": null
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Query params: `page`, `per_page` (max 1000), `order` (`email` | `expires_at` | `created_at`), `direction` (`asc` | `desc`).
|
|
124
|
+
|
|
125
|
+
**Manually suppress an address:**
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/suppression" \
|
|
129
|
+
--header "Authorization: Bearer <API_TOKEN>" \
|
|
130
|
+
--header "Content-Type: application/json" \
|
|
131
|
+
--data '{ "email": "user@example.com", "expires_at": "2026-06-01T00:00:00Z" }'
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
`expires_at` is optional — omit for permanent suppression.
|
|
135
|
+
|
|
136
|
+
**Remove a suppression:**
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
curl -X DELETE "https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/suppression/{suppression_id}" \
|
|
140
|
+
--header "Authorization: Bearer <API_TOKEN>"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Zone-level suppressions are also available at `/zones/{zone_id}/email/sending/suppression` with the same interface.
|
|
144
|
+
|
|
145
|
+
### GraphQL Analytics API
|
|
146
|
+
|
|
147
|
+
Email Service exposes two zone-level datasets via the [GraphQL Analytics API](https://developers.cloudflare.com/analytics/graphql-api/). You can explore the schema interactively at [graphql.cloudflare.com/explorer](https://graphql.cloudflare.com/explorer). Metrics are retained for 31 days.
|
|
148
|
+
|
|
149
|
+
| Dataset | Description |
|
|
150
|
+
|---------|-------------|
|
|
151
|
+
| `emailSendingAdaptiveGroups` | Aggregated counts grouped by dimensions (status, date, domain, auth results, etc.) |
|
|
152
|
+
| `emailSendingAdaptive` | Individual email events with full detail (from, to, subject, messageId, errors, etc.) |
|
|
153
|
+
|
|
154
|
+
These are **zone-level** datasets — query under `viewer > zones`, not `accounts`.
|
|
155
|
+
|
|
156
|
+
**Aggregated dimensions** (`emailSendingAdaptiveGroups`):
|
|
157
|
+
|
|
158
|
+
| Dimension | Type | Description |
|
|
159
|
+
|-----------|------|-------------|
|
|
160
|
+
| `date` | Date | Day-level grouping |
|
|
161
|
+
| `datetime` | Time | Exact timestamp (also: `datetimeMinute`, `datetimeFiveMinutes`, `datetimeFifteenMinutes`, `datetimeHour`) |
|
|
162
|
+
| `status` | string | Delivery status |
|
|
163
|
+
| `eventType` | string | Event type |
|
|
164
|
+
| `sendingDomain` | string | The sending domain |
|
|
165
|
+
| `envelopeTo` | string | Recipient address |
|
|
166
|
+
| `errorCause` | string | Error cause for failed sends |
|
|
167
|
+
| `arc`, `dkim`, `dmarc`, `spf` | string | Email authentication results |
|
|
168
|
+
| `isSpam`, `isNDR`, `isLastEvent` | uint8 | Boolean flags |
|
|
169
|
+
| `spamScore`, `spamThreshold` | uint32 | Spam scoring |
|
|
170
|
+
|
|
171
|
+
**Individual event fields** (`emailSendingAdaptive`) additionally include: `from`, `to`, `subject`, `messageId`, `sessionId`, `errorDetail`.
|
|
172
|
+
|
|
173
|
+
**Email counts by status and date:**
|
|
174
|
+
|
|
175
|
+
```graphql
|
|
176
|
+
query EmailSendingByStatus(
|
|
177
|
+
$zoneTag: string!
|
|
178
|
+
$start: Date!
|
|
179
|
+
$end: Date!
|
|
180
|
+
) {
|
|
181
|
+
viewer {
|
|
182
|
+
zones(filter: { zoneTag: $zoneTag }) {
|
|
183
|
+
emailSendingAdaptiveGroups(
|
|
184
|
+
filter: { date_geq: $start, date_leq: $end }
|
|
185
|
+
limit: 10000
|
|
186
|
+
orderBy: [date_DESC]
|
|
187
|
+
) {
|
|
188
|
+
count
|
|
189
|
+
dimensions {
|
|
190
|
+
date
|
|
191
|
+
status
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Filter by status (e.g. only failures):**
|
|
200
|
+
|
|
201
|
+
```graphql
|
|
202
|
+
query EmailFailures(
|
|
203
|
+
$zoneTag: string!
|
|
204
|
+
$start: Date!
|
|
205
|
+
$end: Date!
|
|
206
|
+
) {
|
|
207
|
+
viewer {
|
|
208
|
+
zones(filter: { zoneTag: $zoneTag }) {
|
|
209
|
+
emailSendingAdaptiveGroups(
|
|
210
|
+
filter: { date_geq: $start, date_leq: $end, status: "deliveryFailed" }
|
|
211
|
+
limit: 10000
|
|
212
|
+
orderBy: [date_DESC]
|
|
213
|
+
) {
|
|
214
|
+
count
|
|
215
|
+
dimensions {
|
|
216
|
+
date
|
|
217
|
+
errorCause
|
|
218
|
+
sendingDomain
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Individual email events (troubleshooting):**
|
|
227
|
+
|
|
228
|
+
```graphql
|
|
229
|
+
query RecentEmailEvents(
|
|
230
|
+
$zoneTag: string!
|
|
231
|
+
$start: Time!
|
|
232
|
+
$end: Time!
|
|
233
|
+
) {
|
|
234
|
+
viewer {
|
|
235
|
+
zones(filter: { zoneTag: $zoneTag }) {
|
|
236
|
+
emailSendingAdaptive(
|
|
237
|
+
filter: { datetime_geq: $start, datetime_leq: $end }
|
|
238
|
+
limit: 50
|
|
239
|
+
orderBy: [datetime_DESC]
|
|
240
|
+
) {
|
|
241
|
+
datetime
|
|
242
|
+
from
|
|
243
|
+
to
|
|
244
|
+
subject
|
|
245
|
+
status
|
|
246
|
+
eventType
|
|
247
|
+
sendingDomain
|
|
248
|
+
messageId
|
|
249
|
+
errorCause
|
|
250
|
+
errorDetail
|
|
251
|
+
dkim
|
|
252
|
+
dmarc
|
|
253
|
+
spf
|
|
254
|
+
isSpam
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Note: `emailSendingAdaptive` filters use `datetime_geq`/`datetime_leq` (Time type, e.g. `"2026-04-01T00:00:00Z"`), while `emailSendingAdaptiveGroups` uses `date_geq`/`date_leq` (Date type, e.g. `"2026-04-01"`).
|
|
262
|
+
|
|
263
|
+
**curl example:**
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
curl "https://api.cloudflare.com/client/v4/graphql" \
|
|
267
|
+
--header "Authorization: Bearer <API_TOKEN>" \
|
|
268
|
+
--header "Content-Type: application/json" \
|
|
269
|
+
--data '{
|
|
270
|
+
"query": "query($zoneTag:string!,$start:Date!,$end:Date!){viewer{zones(filter:{zoneTag:$zoneTag}){emailSendingAdaptiveGroups(filter:{date_geq:$start,date_leq:$end},limit:10000,orderBy:[date_DESC]){count,dimensions{date,status}}}}}",
|
|
271
|
+
"variables": {
|
|
272
|
+
"zoneTag": "<ZONE_ID>",
|
|
273
|
+
"start": "2026-03-15",
|
|
274
|
+
"end": "2026-04-15"
|
|
275
|
+
}
|
|
276
|
+
}'
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Metrics to Watch
|
|
280
|
+
|
|
281
|
+
| Metric | Target | If Out of Range |
|
|
282
|
+
|--------|--------|-----------------|
|
|
283
|
+
| Delivery rate | > 95% | Check for invalid addresses; verify DNS records |
|
|
284
|
+
| Hard bounce rate | < 2% | Clean your email list |
|
|
285
|
+
| Complaint rate | < 0.1% | Make unsubscribe easier; stop unwanted emails |
|