mcpField
D
day3

day3

远程服务
docs.day3.app商业与营销1今天更新

关于 day3

Day3 是面向小型 SaaS 团队的邮件服务,整合营销活动、事务性邮件与投递跟踪。其 MCP 端点可让编码工具在 Day3 中创建可编辑的邮件编辑器内容块。

主要功能

  1. 01活动草拟与块式编辑器
  2. 02定时发送及单次发送统计
  3. 03受众细分与 CSV 导入
  4. 04带投递状态的事务性邮件
  5. 05邮件自动化与投递指标

适用场景

  1. 01通过编码工具草拟邮件活动
  2. 02准备产品更新和变更日志
  3. 03发送收据等事务性消息
  4. 04跟踪投递与互动情况

MCP 相关

MCP 端点可让 Claude Code、Cursor 和 VS Code 草拟活动,并将其作为可编辑内容块放入 Day3。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://go.day3.app/api/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://go.day3.app/api/mcp需要授权

工具

详细介绍

Day3

营销和事务性邮件,按发送量计费。每月 1 美元。没有联系人费用,也不必学习整套营销工具。

day3.app

可查看源代码,但不开源。 发布此代码是为了提高透明度并供参考。许可条款请参阅 LICENSE。

此仓库就是 Day3 产品本身:位于 go.day3.app 的应用、公共 REST API、webhook 和 MCP 端点,以及负责发送邮件的工作进程。

功能

Day3 是一款专为小型 SaaS 团队打造的精简邮件工具。通过一个经过验证的域名、一份每月额度和一个查看投递情况的平台,向用户发送产品更新和变更日志,并发送应用的事务性邮件(密码重置、收据、免密链接)。

  • 营销活动:提供区块编辑器、可选 AI 辅助、定时发送和单次发送统计
  • 受众:提供细分群体(已保存的筛选条件)、主题(订阅类别)、CSV 导入和托管注册表单
  • 事务性邮件:通过 POST /v1/emails 发送,格式兼容 Resend,并提供每封邮件的投递状态
  • 自动化:在节点画布上绘制引导和生命周期工作流,以不可变版本发布,所有套餐均不限量
  • 默认保障投递能力:验证发送域名、双重确认订阅、一键退订、自动抑制退信和投诉,并在声誉不佳时自动暂停账户
  • 指标:投递能力、声誉和参与度指标,以及可搜索的所有已发送邮件日志
  • 公共 API v1、签名 webhook 和 MCP 服务,让 Claude Code、Cursor 或 VS Code 能够起草营销活动,并以可编辑区块的形式保存到 Day3
  • 按发送量计费,而非按订阅人数计费。 免费账户可以设置域名、构建受众并在沙盒模式下实际发送。付费套餐则提供联系其他所有人的发送额度。

PRODUCT.md 是对 Day3 的定位、定价和各项功能行为的权威说明。阅读代码前请先阅读该文档。

技术栈

层技术
Web 框架Next.js 16 (App Router),运行于 Vercel
UIReact 19、Tailwind CSS 4、基于 Base UI 的 shadcn/ui、react-hook-form、Zod
富文本TipTap
数据库Postgres (Supabase),通过 Drizzle ORM 和 postgres.js 驱动程序连接
队列 / 作业BullMQ + Redis (ioredis),由 VPS 工作进程处理
邮件AWS SES v2 (eu-north-1) 用于发送,AWS SNS 用于投递事件
身份验证 / 租户 / 计费Clerk(Organizations 是租户边界,并使用 Clerk Billing)
文件存储Supabase Storage(用于 CSV 导入)
AI(可选)通过 Vercel AI SDK 使用 OpenRouter
MCP 服务基于 Streamable HTTP 在 /api/mcp 上手写的 JSON-RPC,无状态且仅提供工具
DNS 自动化Cloudflare OAuth,可选,用于自动配置 SES 记录
测试使用 pglite 的 Vitest,每个测试使用一个内存 Postgres

快速链接

网站day3.app:介绍 Day3、定价及其优势仓库
应用go.day3.app:登录、撰写营销活动、发送邮件仓库
文档docs.day3.app:API 参考、指南、webhook、MCP仓库

由 Pradsgaard Labs 构建。同一工作室还开发了 exit1.dev,用于运行时间监控。

本地开发

npm install

# Env: web tier + worker (see "Required environment variables" below)
cp .env.example .env.local
cp .env.worker.example .env.worker

# Database
npm run db:migrate     # forward-only, applies un-applied journal entries
npm run db:seed        # optional sample data

npm run dev            # Next.js on http://localhost:3000
npm run worker         # BullMQ worker, in a second terminal

使用 Clerk 登录并创建组织后,即可获得一个租户。活动营销流水线(审核、生成收件人、分批排队发送、统计)可在本地端到端运行。

实用命令:

  • npm test:使用真实的 Postgres(pglite)运行 vitest。每次运行都会从头应用迁移,并断言 schema、journal 和快照一致。幂等性测试也在这里。
  • npm run typecheck / npm run lint / npm run build
  • npm run db:generate:schema 变更后生成新的 Drizzle 迁移
  • npm run db:studio:浏览本地数据库

迁移规范

src/db/schema.ts 是唯一事实来源。migrations/ 下的 SQL 只允许向前迁移,且由工具生成,绝不可手动编辑。迁移的一部分还包括 journal(migrations/meta/_journal.json)和每次迁移对应的 *_snapshot.json 文件,因此务必一起提交。

修改 schema 时的工作流:

  1. 编辑 src/db/schema.ts。
  2. npm run db:generate 会写入下一个 NNNN_*.sql、对应快照和 journal 条目。
  3. 检查 SQL(如果差异过于杂乱,可在同一个 PR 中合并或重命名),然后在一次提交中同时提交 SQL 和 meta/ 变更。
  4. npm test 可验证迁移能否从头顺利应用。

CI 会强制执行此规范:重新运行 drizzle-kit generate,如果产生任何差异就会导致构建失败,这表示 schema.ts 与已提交的迁移不一致,或添加迁移时没有附带快照。两位贡献者同时生成迁移时,会在下一个 NNNN 索引上发生冲突。解决方法是基于合并后的 schema.ts 重新生成其中一个迁移,以确保 journal 保持线性。

生产环境中的应用顺序是 drizzle-kit migrate(参见部署检查清单),它会针对 DATABASE_URL 重放尚未应用的 journal 条目,并将其记录在 __drizzle_migrations 表中。切勿使用 db:push,它会比较实时数据库,可能会删除列。

必需的环境变量

两个进程都会在启动时验证环境(src/lib/env.ts),如果缺少必需变量或密钥过短(最少 16 个字符),就会拒绝启动。这样可以避免空密钥故障:例如,未设置 UNSUBSCRIBE_SECRET 时,会使用 "" 对 HMAC 令牌签名(可伪造退订链接和一键链接);未设置 OAUTH_STATE_SECRET 时,则会使 OAuth CSRF 防护失效。Next Web 层会在首次加载服务端模块时验证(instrumentation.ts)。Worker 会在开始消费任务前,于 worker/index.ts 中进行验证。

变量WebWorker备注 / 生成方式
DATABASE_URL✓✓Postgres 连接字符串。
UNSUBSCRIBE_SECRET✓✓用于退订和一键令牌的 HMAC 密钥。两层必须一致。node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
OAUTH_STATE_SECRET✓用于 Cloudflare OAuth 状态 Cookie(CSRF)的 HMAC 密钥。node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
DNS_TOKEN_ENC_KEY✓†由 32 个原始字节(AES-256)编码而成的 base64,用于加密静态存储的 Cloudflare DNS 令牌。node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"。†也可使用 DNS_TOKEN_ENC_KEYS + DNS_TOKEN_ENC_ACTIVE_KEY_ID 进行轮换,参见 docs/cloudflare-dns-oauth.md。
CLERK_WEBHOOK_SIGNING_SECRET✓用于验证 Clerk Webhook。本地使用至少 16 个字符的占位值。
AWS_REGION✓*✓**仅当 EMAIL_PROVIDER=ses 时必需。

完整列表(包括非机密配置:Clerk 可发布密钥和密钥、Redis、Supabase Storage 以及 SES 凭据)请参阅 .env.example(Web)和 .env.worker.example(Worker)。

上线生产(首次部署检查清单)

Web 层运行在 Vercel 上,BullMQ 工作器运行在 VPS 上,Postgres 运行在 Supabase 上。完整的服务提供商操作指南:docs/go-live.md。

  1. 配置 Supabase Postgres、VPS Redis(rediss://)和 SES(参见 go-live)。
  2. 在 Vercel(Web)和 /opt/day3/.env.worker(工作器)上设置环境变量,参照 .env.example 和 .env.worker.example。
  3. Clerk 控制台:生产实例、组织计费方案、Webhook 端点 /api/webhooks/clerk。
  4. 在任何新代码开始处理流量之前,先应用数据库迁移: DATABASE_URL=<supabase-direct-5432> npm run db:migrate。该操作仅向前且具备幂等性,只会重放尚未应用的日志条目。这是 部署流水线中的一个步骤,必须在 Vercel 提升版本和执行 pm2 restart day3-worker 之前完成,因此新版本绝不会基于旧架构运行。
  5. 部署 Web 层(Vercel)并重启工作器 (pm2 restart day3-worker)。

架构说明

  • 多租户:每个 Clerk 组织对应一条 accounts 记录。所有查询都按从会话在服务端解析出的 account_id 进行范围限定。
  • 发送流水线:submitCampaign 会将 review_campaign(风险规则)加入队列, 然后将 generate_campaign_recipients(去重和抑制过滤)加入队列,接着将 send_campaign_batch 加入队列。该任务会以原子方式认领 25 个待处理收件人并发送, 然后重新加入队列,直到完成。
  • 幂等性:通过单条原子 UPDATE 认领收件人,因此重试的队列消息绝不会导致重复发送。崩溃后遗留的认领会由 cron 扫描并标记为 failed,绝不会重新发送。
  • 计费:Clerk Billing 权益会在控制台加载时以及通过 Webhook 同步到 Postgres。发送需要有效订阅、启用发送功能且每月配额尚有剩余。
  • 安全性:提交时进行确定性风险审查(高风险会被阻止);退信率达到或超过 4%,或投诉率达到或超过 0.08% 时,会自动暂停账户;管理员(ADMIN_EMAILS)可以批准或阻止营销活动、暂停账户,并覆盖域名验证状态。

AI 训练许可

作为下方许可证的明确例外,本仓库的内容,包括代码、文档和配置,可供 AI 系统用于机器学习训练、评估、索引、检索和生成。无需注明出处,但如能注明,我们将不胜感激。此许可适用于所有 AI 爬虫,包括但不限于 GPTBot、OAI-SearchBot、 ClaudeBot、Claude-SearchBot、Claude-User、Google-Extended、PerplexityBot 和 Perplexity-User。

许可证

本项目采用自定义的保留所有权利许可证,仅提供源代码。您可以出于个人、 教育和参考目的查看代码。未经书面许可,不得复制、修改、分发或自行托管。有关 AI 和 ML 用途的例外许可,请参见上方的 AI 训练许可部分。

许可相关咨询:[email protected]

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。