automationtutorialproductivitygoogle-calendar

Building a Daily Standup Agent with Google Calendar

A complete recipe for an agent that pulls your calendar every weekday morning, identifies conflicts and focus blocks, and sends a structured summary to Slack or email.

Sarah Chen
Developer Relations, CalendarMCP ·

A daily standup agent can pull your calendar every weekday morning, identify conflicts and gaps, and send a structured summary to Slack or email before you open your laptop. This is a practical recipe that actually works. No abstractions, no hand-waving.

What the agent does

Every weekday at 8am (or whenever you want), the agent:

  1. Pulls your calendar for the current week (today through Friday)
  2. Identifies conflicts: events that overlap or are back-to-back with no buffer
  3. Finds focus blocks: gaps of 90 minutes or more
  4. Flags meetings that need prep: code reviews, demos, syncs with unclear agendas
  5. Drafts a summary in standup format and sends it to your channel of choice

What you need

  • A CalendarMCP API key (for calendar access via MCP)
  • An AI agent runtime: Claude Code CLI, OpenClaw, or any agent that can execute MCP tool calls on a schedule
  • A Slack webhook URL or email address to send the summary to

The core prompt

This is the prompt the agent runs each morning. It is opinionated. Adjust for your own preferences.

You are a daily standup assistant. Today is {DATE}. My timezone is America/Los_Angeles.

Step 1: Pull my calendar for today through end of this Friday using list_events.
Also pull tomorrow's calendar separately so you have tomorrow's schedule in full detail.

Step 2: Analyze the week:
- List ALL events today in chronological order (time, title, duration, any notes)
- Flag any conflicts: events that overlap or leave less than 10 minutes between them
- Find focus blocks: gaps of 90+ minutes with no meetings
- Flag events that likely need prep: demos, code reviews, external calls, syncs with 
  "agenda TBD" or no description

Step 3: Write a standup summary in this format:

--- TODAY ({DATE}) ---
[List events in order. Flag conflicts with ⚠️]
Focus time: [available blocks or "none"]
Prep needed: [events that need work beforehand, or "none"]

--- THIS WEEK (highlights) ---
[Key events Wed-Fri that are worth flagging: deadlines, external meetings, anything heavy]

--- CONFLICTS TO RESOLVE ---
[List any overlapping events or impossible back-to-backs]

Keep it under 300 words. Be direct. Do not pad with commentary.

Scheduling it with Claude Code CLI

If you are using Claude Code, you can run the standup script from a cron job:

# standup.sh
#!/bin/bash
DATE=$(date +"%Y-%m-%d")
TODAY=$(date +"%A, %B %d")

PROMPT="You are a daily standup assistant. Today is $TODAY ($DATE)...
[paste full prompt above]"

RESULT=$(echo "$PROMPT" | claude --print --permission-mode bypassPermissions)

# Send to Slack
curl -s -X POST "$SLACK_WEBHOOK_URL"   -H "Content-Type: application/json"   -d "{"text": "```$RESULT```"}"

# Or send via email
# echo "$RESULT" | mail -s "Standup $DATE" you@youremail.com

Add to cron:

# crontab -e
# Run at 8am Mon-Fri Pacific time
0 8 * * 1-5 /path/to/standup.sh >> /var/log/standup.log 2>&1

Make sure Claude Code has CalendarMCP registered as an MCP server (see the Claude Code setup post for that) and the SLACK_WEBHOOK_URL environment variable is set.

Scheduling it with OpenClaw heartbeat

If you use OpenClaw, the heartbeat system handles the scheduling without a separate cron job. Add this to your HEARTBEAT.md task list:

| standup | 8am weekdays | Pull calendar, analyze week, send summary to Slack |

The heartbeat task file describes what to do, and OpenClaw's scheduling system fires it on the specified cadence. CalendarMCP is already available as a plugin, so the agent has access to calendar tools without additional config.

Handling edge cases

Monday: pull the full week

On Mondays, extend the prompt to pull Monday through Friday explicitly. Mid-week, today through Friday is enough. You can automate this with a day-of-week check in the shell script:

DAY=$(date +%u)  # 1=Mon, 5=Fri
if [ "$DAY" = "1" ]; then
  LOOKAHEAD="the full week (Mon through Fri)"
else
  LOOKAHEAD="today through end of Friday"
fi

All-day events

Tell the agent to treat all-day events as context, not as blocking time. Out-of-office events are the exception: if there is an OOO event today, the summary should note it and skip the detailed schedule.

Multiple calendars

If you have both personal and work calendars, specify both in the prompt: "Pull events from both my personal and work calendars." CalendarMCP handles multi-calendar queries in a single tool call when multiple accounts are connected.

What a good standup summary looks like

After a week of running this, a typical output looks like:

--- TODAY (Tuesday, May 26) ---
9:00 AM - Eng sync (30 min)
10:00 AM - 1:1 with Alex (45 min)
⚠️ 10:45 AM - Design review (1hr) -- starts 0 min after 1:1, no buffer
12:00 PM - Lunch
2:00 PM - External vendor call (1hr)
4:00 PM - PR reviews async

Focus time: 3:00-4:00 PM (1hr, marginal), none before 2pm
Prep needed: Vendor call at 2pm (no agenda set, check email thread)

--- THIS WEEK (highlights) ---
Wed: Product demo with new prospects (1pm, external)
Fri: Sprint retro (10am) + sprint planning (11am) -- back-to-back 2hr block

--- CONFLICTS TO RESOLVE ---
1:1 with Alex / Design review: 0-min gap Tue 10am-10:45am

That is 200 words, scanned in 30 seconds. The agent pulled six tool calls worth of calendar data and structured it into something actionable.

To set up the calendar access, head to calendarmcp.ai. Connect your Google account, grab the API key, and wire it into your agent of choice. The standup pattern above runs on top of that connection.

Ready to get started?

Connect your Google Calendar to Claude and any MCP client in about two minutes.

Connect Google Calendar