重新发送MCP服务器
可流式HTTP MCP服务器,用于通过以下方式管理电子邮件和时事通讯 重发.
作者 过度
\[!警告\] 此服务器允许AI代理访问您的电子邮件发送功能。语言模型可能会出错、误解指令或发送意外的电子邮件。始终: - 确保您使用此MCP的客户端要求您在使用前查看并确认该操作。 - 先用小段进行测试 - 广播始终被安排(至少提前5分钟),因此如果需要,您可以取消(默认为5分钟) - 集 RESEND_DEFAULT_FROM 发送到已验证的发件人地址动机
传统的电子邮件API需要知道确切的ID、段结构和API的怪癖。此服务器的设计使AI代理可以:
- 发送新闻通讯 --以适当的格式广播到片段
- 管理订阅者 --批量添加、更新、删除联系人
- 使用人类标识符 --段名称和电子邮件,而不是UUID
- 处理格式化 --自动多部分电子邮件(HTML+纯文本)
- 跟踪活动 --查看交货状态,取消预定发送
结果:一个代理可以可靠地管理您的时事通讯,而无需您触摸重新发送仪表板。
特性
- ✅ 联系人 --添加、更新、删除、搜索联系人(可批量处理,每次通话最多100个)
- ✅ 片段 --创建、列出、删除分段和管理成员资格
- ✅ 发送 --个人电子邮件或向细分市场广播
- ✅ 活动 --查看历史记录、检查交货状态、取消计划
- ✅ 模板 --列出带有变量的可用模板
- ✅ 订阅 --主题选择加入/选择退出管理
- ✅ 多部分电子邮件 --自动生成HTML+纯文本以获得最佳交付效果
- ✅ 双运行时 --Node.js/Bun或Cloudflare Workers
设计原则
- LLM友好:面向任务的工具,而不是1:1 API镜像
- 批量优先:默认情况下,联系人操作接受数组
- 人类标识符:使用电子邮件和段名称,而不是UUID
- 默认情况下为多部分:纯文本自动生成HTML以进行正确呈现
- 清晰的反馈:结果包括总结和下一步建议
______________________________________________________________________
服务器说明(模型看到的内容)
Use these tools to manage email contacts, segments, and send emails via Resend.
WORKFLOW:
1. find_contacts or segments(list) → discover existing data
2. upsert_contacts → add/update subscribers
3. send → individual email or broadcast to segment
4. campaigns(status) → track delivery
FORMATTING (for body):
- Use \n\n between paragraphs
- Use \n between list items
- Plain text is auto-converted to multipart (HTML + text) for proper rendering
IMPORTANT:
- Segment names are case-insensitive
- Templates must be published in Resend dashboard to use
- Broadcasts use segment name, not ID______________________________________________________________________
快速开始
先决条件
1.安装
cd resend-mcp
bun install
cp env.example .env2.配置
从获取重新发送API密钥 resend.com/api-keys.
编辑 .env:
PORT=3000
AUTH_ENABLED=true
AUTH_STRATEGY=bearer
# Generate with: openssl rand -hex 32
BEARER_TOKEN=your-random-auth-token
# Resend credentials
RESEND_API_KEY=re_your_resend_api_key
RESEND_DEFAULT_FROM=newsletter@yourdomain.com3.跑步
bun dev
# MCP: http://127.0.0.1:3000/mcp4.连接客户端
爱丽丝应用程序:
- 网址:
http://127.0.0.1:3000/mcp - 类型:
streamable-http - 头球
Authorization: Bearer
克劳德桌面/光标:
{
"mcpServers": {
"resend": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:3000/mcp", "--transport", "http-only"],
"env": { "NO_PROXY": "127.0.0.1,localhost" }
}
}
}______________________________________________________________________
工具
upsert_contacts
批量添加或更新联系人。如果电子邮件不存在则创建,如果存在则更新。
// Input
{
contacts: [
{ email: "john@example.com", first_name: "John", last_name: "Doe" },
{ email: "jane@example.com", properties: { plan: "pro", company: "Acme" } }
],
segments?: ["Newsletter", "Premium"], // Add to these segments
unsubscribed?: false // Set subscription status
}
// Output
{
results: [{ email, ok, id, action: "created" | "updated", error? }],
summary: { created: 1, updated: 1, failed: 0 }
}remove_contacts
从列表中永久删除联系人。
// Input
{ emails: ["user@example.com", "other@example.com"] }
// Output
{ results: [{ email, ok, error? }], summary: { deleted: 2, failed: 0 } }find_contacts
使用分页搜索和筛选联系人。
// Input
{
segment?: "Newsletter", // Filter by segment name
email?: "user@example.com", // Find specific contact
unsubscribed?: false, // Filter by status
limit?: 50, // Max 100
cursor?: "..." // From previous response
}
// Output
{
items: [{ id, email, first_name, last_name, unsubscribed, created_at, properties }],
has_more: boolean,
cursor?: string
}segments
管理细分市场及其成员。
// List all segments
{ action: "list" }
→ { items: [{ id, name, contact_count, created_at }] }
// Create segment
{ action: "create", name: "VIP Customers" }
→ { id, name, ok: true }
// Delete segment (contacts remain in system)
{ action: "delete", name: "Old Segment" }
// Add contacts to segment
{ action: "add_contacts", name: "Newsletter", contacts: ["a@x.com", "b@x.com"] }
// Remove contacts from segment
{ action: "remove_contacts", name: "Newsletter", contacts: ["a@x.com"] }send
发送个人电子邮件或向分段广播。
// Individual email
{
to: "user@example.com", // or array up to 50
subject: "Welcome!",
body: "Hello {{{FIRST_NAME}}}!\n\nWelcome to our newsletter.",
from_name?: "Alice Newsletter",
reply_to?: "support@example.com",
schedule_for?: "2024-12-25T10:00:00Z"
}
// Broadcast to segment
{
segment: "Newsletter", // Segment name (case-insensitive)
subject: "Weekly Update",
name?: "Week 42 Newsletter", // Dashboard display name
body: "HEADLINE\n\nFirst paragraph.\n\nSecond paragraph.",
schedule_for?: "in 2 hours" // Natural language supported
}
// Using template
{
to: "user@example.com",
template: "welcome-email", // Template alias or ID
variables: { CTA_TEXT: "Get Started", DISCOUNT: "20%" }
}格式化提示:
- 使用
\n\n段落之间 - 使用
\n列表项之间 - 纯文本通过适当的换行符自动转换为HTML
- 个性化:
{{{FIRST_NAME}}}或{{{FIRST_NAME|Friend}}}
campaigns
查看和管理广播活动。
// List recent campaigns
{ action: "list", limit?: 20 }
→ { items: [{ id, name, subject, segment_name, status, sent_at, recipients_count }] }
// Get detailed status
{ action: "status", campaign_id: "bc123..." }
→ { id, status, sent_count, delivered_count, opened_count, failed_count }
// Cancel scheduled campaign
{ action: "cancel", campaign_id: "bc123..." }
→ { id, cancelled: true }subscriptions
管理联系人的主题首选项。
// Subscribe to topic
{ emails: "user@example.com", action: "subscribe", topic: "Product Updates" }
// Unsubscribe from topic
{ emails: ["a@x.com", "b@x.com"], action: "unsubscribe", topic: "Newsletter" }
// Global unsubscribe (from all emails)
{ emails: "user@example.com", action: "unsubscribe_all" }templates
列出可用的电子邮件模板。
// Input
{ limit?: 50, cursor?: "..." }
// Output
{
items: [{ id, alias, name, subject, from, variables: [{ key, type, fallback }] }],
has_more: boolean
}______________________________________________________________________
例子
1.导入订阅者并发送欢迎电子邮件
// Add contacts to Newsletter segment
{
"name": "upsert_contacts",
"arguments": {
"contacts": [
{ "email": "alice@example.com", "first_name": "Alice" },
{ "email": "bob@example.com", "first_name": "Bob" }
],
"segments": ["Newsletter"]
}
}答复:
Added 2 contact(s). Created: 2, Updated: 0, Failed: 0.
Next: Use 'find_contacts' to verify or 'send' to email them.2.发送广播通讯
{
"name": "send",
"arguments": {
"segment": "Newsletter",
"subject": "This Week in AI",
"name": "Week 42 Newsletter",
"body": "HIGHLIGHTS\n\nClaude 4 was released this week with impressive new capabilities.\n\nKEY FEATURES\n\n• Extended context window\n• Improved reasoning\n• Better code generation\n\nREAD MORE\n\nCheck out the full announcement on our blog."
}
}答复:
Broadcast to segment "Newsletter" queued for sending (Campaign ID: abc123).
Use 'campaigns' tool to track delivery.3.检查活动交付情况
{
"name": "campaigns",
"arguments": { "action": "status", "campaign_id": "abc123" }
}答复:
Campaign abc123: sent
- Sent: 1,234
- Delivered: 1,198
- Opened: 456 (38%)
- Failed: 364.取消订阅用户
{
"name": "subscriptions",
"arguments": {
"emails": "unhappy@example.com",
"action": "unsubscribe_all"
}
}答复:
Updated 1 contact(s). Success: 1, Failed: 0.______________________________________________________________________
身份验证流程
┌─────────────────────────────────────────────────────────────────┐
│ Client (Alice App, Claude Desktop) │
│ │ │
│ │ Authorization: Bearer │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ MCP Server (Node.js / Cloudflare Worker) ││
│ │ ││
│ │ 1. Validate BEARER_TOKEN (client auth) ││
│ │ 2. Use RESEND_API_KEY internally ││
│ │ ││
│ │ RESEND_API_KEY ──────────► Resend API ││
│ │ RESEND_DEFAULT_FROM ─────► (api.resend.com) ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘要点:
BEARER_TOKEN:您生成的随机令牌--对MCP客户端进行身份验证RESEND_API_KEY:重新发送API密钥-从不向客户端公开RESEND_DEFAULT_FROM:已验证的发件人地址--必填
______________________________________________________________________
部署选项
本地开发(Node.js/Bun)
bun dev
# Endpoint: http://127.0.0.1:3000/mcpCloudflare Worker(本地开发人员)
# Create .dev.vars with secrets
echo "BEARER_TOKEN=your_token" >> .dev.vars
echo "RESEND_API_KEY=re_xxx" >> .dev.vars
echo "RESEND_DEFAULT_FROM=newsletter@yourdomain.com" >> .dev.vars
bun x wrangler dev --local | cat
# Endpoint: http://127.0.0.1:8787/mcpCloudflare员工(生产)
# Set secrets
bun x wrangler secret put BEARER_TOKEN
bun x wrangler secret put RESEND_API_KEY
bun x wrangler secret put RESEND_DEFAULT_FROM
# Deploy
bun x wrangler deploy
# Endpoint: https://..workers.dev/mcp______________________________________________________________________
HTTP端点
| 端点 | 方法 | 目的 |
|---|---|---|
/mcp | 发布 | MCP JSON-RPC 2.0 |
/mcp | GET | SSE流(用于通知) |
/health | GET | 健康检查 |
______________________________________________________________________
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
RESEND_API_KEY | ✓ | 从重新发送.com/API-keys重新发送API密钥 |
RESEND_DEFAULT_FROM | ✓ | 已验证的发件人地址(例如。,newsletter@yourdomain.com) |
BEARER_TOKEN | ✓ | MCP客户端的认证令牌(使用生成 openssl rand -hex 32) |
PORT | 服务器端口(默认值:3000) | |
HOST | 服务器主机(默认值:127.0.0.1) | |
AUTH_ENABLED | 启用身份验证(默认值:true) | |
AUTH_STRATEGY | 认证策略(默认:承载) | |
LOG_LEVEL | 调试、信息、警告、错误(默认值:信息) |
______________________________________________________________________
建筑
src/
├── index.ts # Node.js entry point
├── worker.ts # Cloudflare Workers entry point
├── config/
│ ├── env.ts # Environment parsing
│ └── metadata.ts # Server & tool descriptions
├── core/
│ └── mcp.ts # McpServer builder
├── shared/
│ └── tools/
│ └── resend/ # Tool definitions
│ ├── upsert-contacts.ts
│ ├── remove-contacts.ts
│ ├── find-contacts.ts
│ ├── segments.ts
│ ├── send.ts
│ ├── campaigns.ts
│ ├── subscriptions.ts
│ └── templates.ts
├── services/
│ └── resend/
│ └── client.ts # Resend API client
├── schemas/
│ └── outputs.ts # Zod output schemas
└── http/
├── app.ts # Hono HTTP app
└── routes/
└── mcp.ts # MCP endpoint handler______________________________________________________________________
发展
bun dev # Start with hot reload (note: sessions clear on reload)
bun start # Production mode (stable sessions)
bun run typecheck # TypeScript check
bun run lint # Lint code
bun run build # Production buildMCP检验员测试:
bunx @modelcontextprotocol/inspector
# Connect to: http://localhost:3000/mcp
# Add header: Authorization: Bearer ______________________________________________________________________
故障排除
| 问题 | 解决方案 |
|---|---|
| 401未经授权 | 检查 BEARER_TOKEN 服务器和客户端中的匹配 |
| “未配置RESEND_API_KEY” | 设置 RESEND_API_KEY 在 .env 或秘密 |
| “RESEND_DEFAULT_FROM未配置” | 设置 RESEND_DEFAULT_FROM 发送给经过验证的发件人 |
| “未找到段” | 使用 segments(action='list') 查看可用细分市场 |
| “找不到模板” | 确保在“重新发送”仪表板中发布模板 |
| 电子邮件中没有换行符 | 已修复-电子邮件是多部分的(HTML+文本) |
| 重启后会话停滞 | 断开连接并重新连接客户端(热重新加载会清除会话) |
| 速率限制(429) | 重新发送默认值为2请求/秒。等待 retry-after 头球 |
| 工具未显示 | 重新连接客户端--会话可能已过时 |
______________________________________________________________________
许可证
麻省理工学院
