Morning Briefing
Generate and send a personalized daily briefing email. Gather everything in parallel, format as clean scannable HTML, and send it.
When to use
- The user says "morning briefing", "morning brief", "brief me", "start my day".
- Runs automatically on a daily schedule (see Setup below).
What to gather
Collect these five sections. Run the lookups in parallel where possible.
1. Five news articles relevant to the person's industry
- Use
web_searchto pull the top five stories from the past 24 hours relevant to the person's industry and role (infer from their job title, company, and recent work — e.g. a CTO at a consulting firm gets enterprise/AI/technology-strategy news). - For each: a one-line headline, a one-sentence "why it matters" framed for the person's role, the source, and the date.
- Only use stories you can trace to a current web source. Discard anything outside the 24-hour window.
2. Open communications & replies needed
- Check email (
ListMessages,SearchM365) and Teams (ListChats,ListChatMessages) from the previous day. - Surface threads where the person owes a reply or an action: who is waiting, what they asked, and the specific next step owed.
- Exclude distribution-list / broadcast traffic. Skip any message addressed to a distribution list, group alias, or large cc where the person is only copied (not in the To: line directly and not named with an explicit ask). These are FYI/broadcast threads — the person has no action. Examples of patterns to drop: MVP/community DLs, vendor escalation threads addressed to a partner alias where the person is merely cc'd, "reply-all" announcements. A thread only belongs here when the person is a direct, named recipient with a specific reply or action owed.
3. Priority client updates
- Scan email, Teams, and any project sources for client-facing developments: escalations, ticket numbers, deadlines, blockers, status changes.
- List each with the client name, the development, and any reference IDs.
- Same distribution-list filter applies. Only include updates from threads where the person is a direct participant or owner. Drop developments that arrived via a DL/group alias on which the person is just one of many cc's and carries no ownership — those are noise, not priority client signal.
4. Top five committed tasks, deliverables & to-dos
- Look across tasks, emails, Teams, and projects for the person's five highest-priority open commitments.
- Phrase each as a concrete action with the owner of the next step and any dependency (e.g. "Pull tenant ID from X → send to Y for ticket Z").
5. Today's schedule
- Use
ListCalendarView(with the person's time zone) for today. - List events chronologically. Flag conflicts/overlaps. Respect privacy: show private/personal events as time blocks ("Private appointment"), not raw titles.
- If there are no timed meetings, say so and note any all-day items.
Formatting & send
- Subject line:
Morning Briefing — [today's date](e.g. "Morning Briefing — May 31, 2026"). - Body: clean HTML, one
<h2>header per section, scannable and concise. Suggested style:- Body:
font-family: 'Segoe UI', Arial, sans-serif; color:#1a1a1a; line-height:1.5; max-width:760px; - Section headers:
color:#810FFB; font-size:18px;(swap in your own brand color)
- Body:
- Save the HTML to
output/first, then send withSendEmailWithAttachments(to=[<the person's email>], subject=..., body_file_path=..., content_type="HTML"). - Before claiming it's sent, confirm the file exists with
Glob output/**/*.
Notes
- Never fabricate facts (names, numbers, dates, ticket IDs). If a section has no data, say so rather than filling the gap.
- Keep every section tight — this is a scan-in-60-seconds email, not a report.