This workflow follows the Emailsend → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "AI-Powered Daily Briefing V2 (HTTP)",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * *"
}
]
}
},
"id": "daily-trigger",
"name": "Daily Trigger (8 AM Pacific)",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
400
]
},
{
"parameters": {
"jsCode": "// Get date for queries\nconst today = new Date().toISOString().split('T')[0];\nconst weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\nconst weekFromNow = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\n\nreturn [{ \n today,\n week_ago: weekAgo,\n week_from_now: weekFromNow\n}];"
},
"id": "prepare-dates",
"name": "Prepare Dates",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
460,
400
]
},
{
"parameters": {
"url": "https://YOUR-PROJECT-REF.supabase.co/functions/v1/second-brain-mcp",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'tools/call',\n params: {\n name: 'list-tasks',\n arguments: {\n status: 'pending',\n due_date_to: $json.week_from_now,\n limit: 50,\n sort_by: 'due_date',\n sort_order: 'asc'\n }\n }\n}) }}",
"options": {}
},
"id": "get-tasks",
"name": "Get Pending Tasks (MCP)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"url": "https://YOUR-PROJECT-REF.supabase.co/functions/v1/second-brain-mcp",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({\n jsonrpc: '2.0',\n id: 2,\n method: 'tools/call',\n params: {\n name: 'list-contacts',\n arguments: {\n contact_status: 'to reach out',\n limit: 20,\n format: 'summary'\n }\n }\n}) }}",
"options": {}
},
"id": "get-followups",
"name": "Get Follow-ups (MCP)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
400
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"url": "https://YOUR-PROJECT-REF.supabase.co/functions/v1/second-brain-mcp",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({\n jsonrpc: '2.0',\n id: 3,\n method: 'tools/call',\n params: {\n name: 'list-opportunities',\n arguments: {\n status: '0_research,1_to_apply',\n limit: 10,\n sort_by: 'weighted_score',\n sort_order: 'desc',\n format: 'summary'\n }\n }\n}) }}",
"options": {}
},
"id": "get-opportunities",
"name": "Get Top Opportunities (MCP)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
500
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Collect data from all parallel queries\nconst tasks = $('Get Pending Tasks (MCP)').item.json.result?.content?.[0]?.text || '{}';\nconst followups = $('Get Follow-ups (MCP)').item.json.result?.content?.[0]?.text || '{}';\nconst opportunities = $('Get Top Opportunities (MCP)').item.json.result?.content?.[0]?.text || '{}';\nconst dates = $('Prepare Dates').item.json;\n\n// Parse if strings\nlet parsedTasks, parsedFollowups, parsedOpportunities;\ntry {\n parsedTasks = typeof tasks === 'string' ? JSON.parse(tasks) : tasks;\n parsedFollowups = typeof followups === 'string' ? JSON.parse(followups) : followups;\n parsedOpportunities = typeof opportunities === 'string' ? JSON.parse(opportunities) : opportunities;\n} catch (e) {\n parsedTasks = { items: [] };\n parsedFollowups = { items: [] };\n parsedOpportunities = { items: [] };\n}\n\nreturn [{\n tasks: parsedTasks.items || parsedTasks,\n followups: parsedFollowups.items || parsedFollowups,\n opportunities: parsedOpportunities.items || parsedOpportunities,\n today: dates.today,\n task_count: (parsedTasks.items || parsedTasks).length || 0,\n followup_count: (parsedFollowups.items || parsedFollowups).length || 0,\n opportunity_count: (parsedOpportunities.items || parsedOpportunities).length || 0\n}];"
},
"id": "aggregate-data",
"name": "Aggregate Data",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
900,
400
]
},
{
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "anthropicApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 2048,\n temperature: 0.5,\n messages: [{\n role: 'user',\n content: `Generate a personalized daily briefing for ${$json.today}.\n\nDATA FROM SECOND BRAIN:\n\nPENDING TASKS (${$json.task_count}):\n${JSON.stringify($json.tasks, null, 2)}\n\nFOLLOW-UPS NEEDED (${$json.followup_count}):\n${JSON.stringify($json.followups, null, 2)}\n\nTOP OPPORTUNITIES (${$json.opportunity_count}):\n${JSON.stringify($json.opportunities, null, 2)}\n\nGENERATE BRIEFING:\n\n1. **Today's Priority** (1-2 sentences)\n - ONE most important focus for today\n - Why it matters\n\n2. **Critical Tasks** (Top 5)\n - List by intelligent priority (urgency + importance + impact)\n - Not just by due date\n - Include context for each\n\n3. **Key Follow-ups** (Top 3)\n - Who to reach out to\n - Why (context from past interactions)\n - Suggested talking points\n\n4. **Opportunities to Watch** (Top 2-3)\n - Sorted by weighted_score\n - Deadlines approaching\n - Action items\n\n5. **Quick Wins** (<15 min tasks)\n - 2-3 easy wins for momentum\n\n6. **Relationship Insights**\n - Patterns in follow-ups\n - Network gaps\n - Connection opportunities\n\nTONE: Concise, actionable, motivating\nFORMAT: Well-formatted markdown (not HTML)\nLENGTH: ~400-600 words\n\nReturn ONLY the briefing content (no JSON wrapper).`\n }]\n}) }}",
"options": {}
},
"id": "generate-briefing",
"name": "Generate Briefing (Claude API)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1120,
400
],
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const response = $input.item.json;\nconst briefingContent = response.content?.[0]?.text || 'Failed to generate briefing';\nconst aggregateData = $('Aggregate Data').item.json;\n\nreturn [{\n subject: `Daily Briefing - ${aggregateData.today}`,\n briefing: briefingContent,\n stats: {\n tasks: aggregateData.task_count,\n followups: aggregateData.followup_count,\n opportunities: aggregateData.opportunity_count\n },\n timestamp: new Date().toISOString()\n}];"
},
"id": "format-email",
"name": "Format Email",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1340,
400
]
},
{
"parameters": {
"fromEmail": "your-email@example.com",
"toEmail": "your-email@example.com",
"subject": "={{ $json.subject }}",
"emailFormat": "text",
"text": "={{ `\ud83d\udcca SECOND BRAIN DAILY BRIEFING\\n${'='.repeat(50)}\\n\\nTasks: ${$json.stats.tasks} | Follow-ups: ${$json.stats.followups} | Opportunities: ${$json.stats.opportunities}\\n\\n${$json.briefing}\\n\\n${'='.repeat(50)}\\n\ud83e\udd16 Generated by Second Brain at ${$json.timestamp}` }}",
"options": {}
},
"id": "send-email",
"name": "Send Email Briefing",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [
1560,
400
],
"credentials": {
"smtp": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Daily Trigger (8 AM Pacific)": {
"main": [
[
{
"node": "Prepare Dates",
"type": "main",
"index": 0
}
]
]
},
"Prepare Dates": {
"main": [
[
{
"node": "Get Pending Tasks (MCP)",
"type": "main",
"index": 0
},
{
"node": "Get Follow-ups (MCP)",
"type": "main",
"index": 0
},
{
"node": "Get Top Opportunities (MCP)",
"type": "main",
"index": 0
}
]
]
},
"Get Pending Tasks (MCP)": {
"main": [
[
{
"node": "Aggregate Data",
"type": "main",
"index": 0
}
]
]
},
"Get Follow-ups (MCP)": {
"main": [
[
{
"node": "Aggregate Data",
"type": "main",
"index": 0
}
]
]
},
"Get Top Opportunities (MCP)": {
"main": [
[
{
"node": "Aggregate Data",
"type": "main",
"index": 0
}
]
]
},
"Aggregate Data": {
"main": [
[
{
"node": "Generate Briefing (Claude API)",
"type": "main",
"index": 0
}
]
]
},
"Generate Briefing (Claude API)": {
"main": [
[
{
"node": "Format Email",
"type": "main",
"index": 0
}
]
]
},
"Format Email": {
"main": [
[
{
"node": "Send Email Briefing",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": [
{
"createdAt": "2025-12-16T00:00:00.000Z",
"updatedAt": "2025-12-16T00:00:00.000Z",
"id": "automation",
"name": "Automation"
},
{
"createdAt": "2025-12-16T00:00:00.000Z",
"updatedAt": "2025-12-16T00:00:00.000Z",
"id": "daily",
"name": "Daily"
}
],
"triggerCount": 1,
"updatedAt": "2025-12-16T00:00:00.000Z",
"versionId": "2"
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
anthropicApihttpHeaderAuthsmtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
AI-Powered Daily Briefing V2 (HTTP). Uses httpRequest, emailSend. Scheduled trigger; 9 nodes.
Source: https://github.com/Brennan-Wilkerson/second-brain-public/blob/9fbdffa8aa93a5916041f9294dc03526cd14bcd9/n8n-workflows/ai-daily-briefing-v2.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Birthday Automation - Production (Fixed). Uses stopAndError, httpRequest, emailSend, bannerbear. Scheduled trigger; 86 nodes.
This workflow is an improvement of this workflow by Greg Brzezinka.
N8N-Self-Updater. Uses ssh, emailSend, httpRequest. Scheduled trigger; 27 nodes.
> An automated n8n workflow originally built for DigitalOcean-based n8n deployments, but fully compatible with any VPS or cloud hosting (e.g., AWS, Google Cloud, Hetzner, Linode, etc.) where n8n ru
What if you could spot a major sales problem—or a winning campaign—the very next morning, instead of weeks later? Imagine receiving a beautiful, data-rich alert directly in your inbox the moment your