{"id":"01a0fd91-2a8c-7a54-876c-a5b798e3c8d1","slug":"cf-mailroom","name":"Mailroom","oneLiner":"Shared email inbox for people and AI agents, with reply drafts held for approval and a built-in MCP server","logoUrl":null,"primaryCategory":{"slug":"customer-support","name":"Customer Support & Shared Inbox"},"services":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers"},{"slug":"static-assets","name":"Workers Static Assets","shortName":"Static Assets"},{"slug":"d1","name":"Cloudflare D1","shortName":"D1"},{"slug":"r2","name":"Cloudflare R2","shortName":"R2"},{"slug":"kv","name":"Workers KV","shortName":"KV"},{"slug":"queues","name":"Cloudflare Queues","shortName":"Queues"},{"slug":"workers-ai","name":"Workers AI","shortName":"Workers AI"},{"slug":"email-workers","name":"Email Workers","shortName":"Email Workers"},{"slug":"access","name":"Cloudflare Access","shortName":"Access"}],"deploy":"one_click","hasOneClick":true,"licenseName":"Apache-2.0","licenseClass":"open_source","freeTierStatus":"paid_plan_required","isTested":false,"lastTestedAt":null,"stars":331,"isArchived":false,"publishedAt":"2026-10-02T17:24:45.550Z","contentUpdatedAt":"2026-10-05T13:27:51.088Z","latestCommitAt":"2026-10-01T05:26:26Z","screenshot":{"url":"/media/apps/01a0fd91-2a8c-7a54-876c-a5b798e3c8d1/01a0fd91-bcb4-72ba-b0f2-44691bb7ca9a.png","alt":"Mailroom unified inbox across three addresses, with an agent draft awaiting approval"},"sourceHealth":"healthy","shortDescription":"Mailroom collects mail for several addresses and domains in one Gmail-style web app, where people read and reply. It receives through Email Routing and replies through Cloudflare Email Sending, all from one Worker in your own Cloudflare account.","longDescription":"You read from a unified inbox or a per-Inbox view, with conversations threaded by their In-Reply-To and References headers. New mail and replies can carry attachments. The app also has full-text search, unread and draft filters, bulk archive and opt-in Web Push notifications. The Worker rejects mail sent to an address you have not added as an Inbox in Settings.\n\nAI features start switched off and are configured per Inbox. Drafting uses your base instructions and playbooks to write a reply to the latest inbound message, and that draft waits for your approval; Mailroom never sends it on its own. Natural-language label rules tag incoming mail. The Worker flags auto-submitted and bulk senders so they never get automated replies. External agents connect to /mcp over OAuth 2.1 with scoped read and send access. Every send carries an idempotency key, and each identity is capped at 100 MCP sends per day by default.\n\nA single Worker serves the React app, the Hono API, the inbound email handler, the draft queue consumer and the MCP server. D1 stores inboxes, conversations and settings, R2 keeps raw MIME and attachments, Queues retry draft jobs with a dead-letter queue, and KV holds MCP OAuth state. The AI binding calls the drafting and labeling models. Cloudflare Access guards the web app; the API verifies Access JWTs and fails closed when they are missing.\n\nThe Deploy to Cloudflare button provisions the storage, queues and KV namespace, and the deploy script applies migrations and creates Web Push keys.","useCases":["Run support@ and hello@ for a product domain from one shared web inbox","Review AI-drafted replies before they reach customers","Let an MCP client search conversations and send mail from a registered Inbox","Tag inbound guest-post or link-exchange pitches with natural-language label rules"],"targetAudience":"Solo founders and small teams with a domain on Cloudflare who want a private shared inbox that people and AI agents both work from.","knownLimitations":"Replies can go out only after the sender domain is onboarded to Cloudflare Email Sending. The default drafting model (openai/gpt-6-luna) and labeling model (typesafe/jev) are third-party models from Cloudflare's AI catalog; Settings accepts a Workers AI model id for drafting instead. New mail goes to one recipient at a time, and outbound attachments are capped at 3 MB in total. Conversations do not show delivery or bounce status yet. MCP clients need an extra Access Bypass application. Upstream fixes do not arrive automatically; you merge them into the repository the button created.","editorialNote":null,"ownershipDisclosure":null,"homepageUrl":null,"demoUrl":null,"docsUrl":"https://github.com/wong2/cf-mailroom/blob/main/docs/deployment.md","repository":{"provider":"github","owner":"wong2","name":"cf-mailroom","url":"https://github.com/wong2/cf-mailroom","defaultBranch":"main","stars":331,"forks":44,"openIssues":0,"licenseSpdx":"NOASSERTION","isArchived":false,"latestRelease":null,"latestReleaseAt":null,"latestCommitAt":"2026-10-01T05:26:26Z","metadataFetchedAt":"2026-10-07T03:45:52.766Z"},"secondaryCategories":[{"slug":"email","name":"Email"}],"servicesDetailed":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers","detectionKind":"explicit","note":null},{"slug":"static-assets","name":"Workers Static Assets","shortName":"Static Assets","detectionKind":"explicit","note":null},{"slug":"d1","name":"Cloudflare D1","shortName":"D1","detectionKind":"explicit","note":null},{"slug":"r2","name":"Cloudflare R2","shortName":"R2","detectionKind":"explicit","note":null},{"slug":"kv","name":"Workers KV","shortName":"KV","detectionKind":"explicit","note":null},{"slug":"queues","name":"Cloudflare Queues","shortName":"Queues","detectionKind":"explicit","note":null},{"slug":"workers-ai","name":"Workers AI","shortName":"Workers AI","detectionKind":"explicit","note":null},{"slug":"email-workers","name":"Email Workers","shortName":"Email Workers","detectionKind":"explicit","note":null},{"slug":"access","name":"Cloudflare Access","shortName":"Access","detectionKind":"inferred","note":null}],"connectors":[],"externalRequirements":[],"deployMethods":[{"id":"01a0fd91-66b9-76c6-adf2-ba90d947dc81","methodType":"one_click","url":"https://deploy.workers.cloudflare.com/?url=https://github.com/wong2/cf-mailroom","command":null,"docsUrl":null,"branch":"main","isOneClick":true,"isPrimary":true,"requiredPlan":"Workers Paid","notes":null},{"id":"01a0fd91-6790-75e2-b8f9-f5142ee17cd5","methodType":"cli","url":null,"command":"git clone https://github.com/wong2/cf-mailroom.git\ncd cf-mailroom\nnpm ci\nnpx wrangler login\nnpx wrangler d1 create mailroom\nnpx wrangler r2 bucket create mailroom-raw\nnpx wrangler queues create mailroom-drafts\nnpx wrangler queues create mailroom-drafts-dlq\nnpm run deploy","docsUrl":null,"branch":"main","isOneClick":false,"isPrimary":false,"requiredPlan":"Workers Paid","notes":"Resource commands come from the manual setup in docs/deployment.md, which then deploys through Workers Builds with npm run deploy as the deploy command."}],"deployRequirements":[],"bindings":[{"bindingType":"ai","bindingName":"AI","resourceName":null},{"bindingType":"d1_databases","bindingName":"DB","resourceName":"mailroom"},{"bindingType":"kv_namespaces","bindingName":"OAUTH_KV","resourceName":null},{"bindingType":"queues.consumers","bindingName":null,"resourceName":"mailroom-drafts"},{"bindingType":"queues.producers","bindingName":"DRAFT_DLQ","resourceName":"mailroom-drafts-dlq"},{"bindingType":"queues.producers","bindingName":"DRAFT_QUEUE","resourceName":"mailroom-drafts"},{"bindingType":"r2_buckets","bindingName":"RAW","resourceName":"mailroom-raw"},{"bindingType":"send_email","bindingName":"EMAIL","resourceName":null}],"envVars":[],"screenshots":[{"id":"01a0fd91-c061-7573-b9d1-7062c46b7660","url":"/media/apps/01a0fd91-2a8c-7a54-876c-a5b798e3c8d1/01a0fd91-bcb4-72ba-b0f2-44691bb7ca9a.png","width":2880,"height":1800,"altText":"Mailroom unified inbox across three addresses, with an agent draft awaiting approval","isPrimary":true,"sourceType":"repository"}],"licenseUrl":"https://github.com/wong2/cf-mailroom/blob/56f5221507a75839d6c49a941051f3e868885648/LICENSE","freeTierNote":"Receiving mail works on Free: inbound Email Routing is unlimited on all plans, and D1, R2, KV and Queues (10,000 operations per day) have Workers Free allowances. Replying to arbitrary recipients through Email Sending requires Workers Paid ($5 per month with 3,000 emails included, then $0.35 per 1,000). AI Gateway credits for the default third-party models carry a 5% purchase fee.","freeTierSourceUrl":"https://developers.cloudflare.com/email-service/platform/pricing/","freeTierCheckedAt":null,"setupComplexity":"medium","setupComplexityNote":"After the button deploy, enable Cloudflare Access and add the two Worker variables the setup screen shows. Then turn on Email Routing and Email Sending for the domain, add an Inbox in Settings and route its address to the Worker.","verification":{"status":"untested","testedAt":null,"versionRef":null,"deploymentMethod":null,"coreUseCase":null,"publicNote":null,"resources":[],"steps":[],"screenshots":[],"staleReason":null},"alternatives":[{"slug":"gmail","name":"Gmail"}],"sources":[{"sourceType":"repository","url":"https://github.com/wong2/cf-mailroom","lastSeenAt":"2026-10-05T05:06:01.491Z"},{"sourceType":"docs","url":"https://github.com/wong2/cf-mailroom/blob/main/docs/deployment.md","lastSeenAt":"2026-10-07T03:45:51.355Z"}],"lastSourceRefreshAt":"2026-10-07T03:45:52.766Z","lastReviewedAt":"2026-10-02T17:24:45.550Z","seoTitle":"Mailroom: self-hosted shared inbox for people and AI agents","seoDescription":"Mailroom is a self-hosted shared inbox on Cloudflare Workers where people and AI agents handle email, with approval-gated reply drafts and an MCP server.","changeEvents":[{"id":"01a0fda5-a21b-7de2-804b-b76b5b1cca15","kind":"listed","summary":"Mailroom listed","createdAt":"2026-10-02T17:24:45.550Z","app":{"slug":"cf-mailroom","name":"Mailroom"}}]}