How to use Claude + MCP to get a daily calendar briefing by email
If you're the kind of person who wants an AI to read your calendar every morning and email you a smart summary of your day, this is possible — and it's genuinely impressive when it works. It uses Claude, Anthropic's AI, connected to your calendar through something called MCP (Model Context Protocol).
This guide walks through the full setup. Fair warning: it takes a while, involves the terminal, and requires a few ongoing services. But if you want to understand how this kind of AI automation works, it's a great project.
If you just want the briefing — skip to the bottom.
What you're building
The finished setup looks like this: every morning, an automated script runs Claude with access to your calendar. Claude reads what's on your schedule, writes a natural-language summary of your day, and sends it to your email. No app to open. It just arrives.
What you'll need
- A Mac or Linux machine that stays on (or a server/cloud VM)
- Node.js installed (v18 or later)
- An Anthropic API key (paid — claude.ai/api)
- A Google Calendar account or an iCal-compatible calendar with a shareable URL
- An email sending service — SMTP credentials, or something like Resend or SendGrid (free tiers available)
- Basic comfort with the terminal and editing JSON files
Step 1: Install Claude Desktop and enable MCP
Download and install Claude Desktop from claude.ai/download. MCP (Model Context Protocol) is built into Claude Desktop — it lets Claude connect to external tools and data sources on your machine.
Open Claude Desktop, go to Settings → Developer and click Edit Config. This opens your claude_desktop_config.json file where MCP servers are configured.
Step 2: Set up an MCP calendar server
MCP servers are small local programs that give Claude access to a specific data source. There are community-built MCP servers for Google Calendar, iCal feeds, and more.
Install an MCP calendar server via npm. For iCal-compatible calendars (Google Calendar, Apple Calendar, Outlook):
npm install -g @modelcontextprotocol/server-google-calendar
Or for a generic iCal URL feed:
npm install -g mcp-server-ical
Add the server to your claude_desktop_config.json. For a Google Calendar setup it looks roughly like this:
{
"mcpServers": {
"calendar": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-google-calendar"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id",
"GOOGLE_CLIENT_SECRET": "your-client-secret",
"GOOGLE_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}
Getting those Google credentials requires creating a project in Google Cloud Console, enabling the Calendar API, creating OAuth credentials, and going through an authorization flow to get a refresh token. This is the most involved part of the setup — plan for 30–60 minutes.
Step 3: Write the briefing script
Now you'll write a script that calls the Claude API, passes in a prompt asking it to read your calendar and write a briefing, then sends the result by email.
Create a file called briefing.js. Install dependencies:
npm install @anthropic-ai/sdk nodemailer
The script structure looks like this — you'll need to fill in your API keys, email credentials, and calendar tool name:
import Anthropic from "@anthropic-ai/sdk";
import nodemailer from "nodemailer";
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
tools: [{ type: "calendar_read" }], // depends on your MCP server
messages: [{
role: "user",
content: `Read my calendar for today and tomorrow.
Write a friendly morning briefing that covers:
- What's happening today, in order
- Anything I need to prepare or bring
- Any conflicts or tight timing
- What tomorrow looks like
Keep it warm and practical. Under 300 words.`
}]
});
const briefingText = response.content
.filter(b => b.type === "text")
.map(b => b.text)
.join("\n");
const transporter = nodemailer.createTransport({
host: "smtp.youremailprovider.com",
port: 587,
auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS }
});
await transporter.sendMail({
from: "briefing@yourdomain.com",
to: "you@youremail.com",
subject: `Your morning briefing — ${new Date().toLocaleDateString()}`,
text: briefingText
});
Step 4: Schedule it to run every morning
On Mac, use launchd to schedule the script. Create a plist file at ~/Library/LaunchAgents/com.you.briefing.plist:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.you.briefing</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>/path/to/your/briefing.js</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>7</integer>
<key>Minute</key><integer>0</integer>
</dict>
<key>EnvironmentVariables</key>
<dict>
<key>ANTHROPIC_API_KEY</key>
<string>your-key-here</string>
</dict>
</dict>
</plist>
Load the schedule:
launchctl load ~/Library/LaunchAgents/com.you.briefing.plist
Your Mac needs to be awake at 7am for this to fire. If it's asleep, the briefing won't run until the next morning.
What you end up with
A working daily briefing for you. Just you. Your partner would need to replicate the entire setup independently — their own API key, their own script, their own scheduling, their own OAuth credentials. And the briefing only knows about the calendars you connected, so it won't include your partner's events unless you've shared calendars at the calendar level first.
It's a genuinely clever setup. But it's a developer project, not a family tool.
Haven does this out of the box — for your whole family
Haven is a family calendar app for iPhone that includes a daily morning briefing as a core feature. No terminal. No API keys. No scheduling scripts. You set your briefing time once during setup, and every morning it arrives as a notification — for you and your partner, covering both of your schedules together.
| Capability | Claude + MCP | Haven |
|---|---|---|
| Daily morning briefing | ✓ (you only) | ✓ you + partner |
| Covers partner's schedule | ✗ separate setup required | ✓ built-in |
| Conflict warnings | ✗ prompt engineering required | ✓ automatic |
| Leave-at reminders | ✗ not included | ✓ with travel time |
| Works on iPhone | ✗ requires Mac always on | ✓ native app |
| Setup time | 2–4 hours | 2 minutes |
| Ongoing maintenance | OAuth tokens, npm updates, server uptime | None |
Get the briefing without the setup
Haven sends a daily AI summary to you and your partner every morning — no terminal required.
- ☀️Daily summary notifications — your whole day, organized and delivered at the time you pick
- 👨👩👧Covers your whole family — your events, your partner's events, and the kids' activities in one briefing
- ⚠️Conflict detection — Haven flags overlapping events and logistics problems before they happen
- 🚗Leave-at alerts — reminds you when to leave based on real travel time, not a guess
- 📸Add events from a photo — forward a schedule screenshot from a coach or teacher and Haven reads it automatically
$49/year or $7.99/month after trial · iPhone only