How to Build a Morning Briefing Agent with Claude Code

Build a daily brief from your real calendar and inbox with Claude Code: connectors, a skill, a private page, scheduling, and guardrails that keep it drafts only

Most mornings start the same way: calendar, inbox, task list, chat, back to the calendar. A lot of opening apps before any real work happens. A morning briefing agent does that reading for you and hands you one short page with what matters today. The dashboard is the easy part to build. The value comes from connecting your real data and deciding what the brief is allowed to do.

Here is how to build one with Claude Code that you can trust enough to read first thing.

Decide what the brief must answer

Before any setup, write down the three questions you want answered every morning. Mine look roughly like this:

  • What is on my calendar, and what needs preparation?
  • Which messages actually need a reply from me today?
  • What are the three most important things to move forward, and why?

Anything that does not serve those questions stays out. A brief that tries to cover everything becomes another inbox.

Connect your apps once, on claude.ai

Your agent needs to read your real calendar and inbox. Add those services on claude.ai under Customize, then Connectors (the address is claude.ai/customize/connectors), and approve each one on the service's own consent screen. Google Calendar and Gmail must be connected there. Claude Code cannot sign in to them locally, as the MCP docs explain.

If you sign in to Claude Code with your claude.ai account, those connectors show up in the terminal automatically. Run /mcp to see them. If one is missing, run /status to check which login is active. An API key set in your shell takes precedence over your claude.ai login and hides your connectors.

Then test one read before you build on it. Ask "how many events do I have tomorrow?" and check the answer against your calendar yourself. One connector, one verified read, then the next.

Know what each connector can do

This matters more than anything else in this guide. According to Anthropic's Google Workspace article, the Gmail connector can send, reply to and forward email, and by default Claude asks for approval before each of those actions in a chat. It cannot read attachment contents, only metadata.

Approval prompts protect you when you are watching. A scheduled agent runs when you are not. So "draft, never send" has to be a rule you design in, which we will do below.

Put the brief in a small repository

Create a private GitHub repository called something like morning-brief. Keeping it in a repository is what lets the brief run in the cloud later. Add a CLAUDE.md with the context the agent needs:

# About me
Product designer. I run client projects and build my own apps.

# Current priorities, ranked
1. [most important project and its next milestone]
2. [second]
3. [third]

# Tone for the brief
Short, direct, no filler. Plain sentences.

# Rules
- Draft replies only. Never send, forward, delete or archive anything.
- If a source fails or returns nothing, say so. Never guess.

Update the priorities every Monday. A brief can only rank your day if it knows what matters to you.

Write the brief as a skill

A skill is a folder with a SKILL.md file, and the folder name becomes a command. Create .claude/skills/morning-brief/SKILL.md inside the repository:

---
description: Builds my morning brief from calendar, email and priorities. Use when I ask for my brief or what is on today.
---

Read CLAUDE.md first. Today's date is the date of this run.

1. Calendar: list today's events with times. Flag anything that needs
   preparation, overlaps, or back to back blocks with no break.
2. Email: read messages from the last 24 hours. Group them into
   "needs my reply", "FYI" and "ignore". For "needs my reply", write a
   draft reply in my tone and save it as a draft. Do not send anything.
3. Priorities: pick the three most important things for today from
   CLAUDE.md and the calendar, each with one line explaining why.
4. One thing I might miss: a deadline, a follow up, or a changed plan.

Output: at most 12 lines. Start with the run time and which sources
succeeded. If any source failed, name it at the top.

The folder name becomes the command, so you run the brief with /morning-brief. The description also lets Claude pick it up when you simply ask "what is on today?"

Run it by hand for a week

Start claude in the repository every morning and type /morning-brief. Read the brief, then check it against the sources. Does it miss meetings? Are the drafts in your voice? Does it rank things the way you would?

Every time it gets something wrong, fix the skill or CLAUDE.md, not the output. After a week of briefs you would have written the same way yourself, it is ready to run alone.

Give it a page to live on

A brief in a terminal is easy to miss. Ask Claude Code to publish it as an artifact: a private page on claude.ai that updates in place each time the brief runs. Publish it once by hand and keep it private. Then paste its URL into the skill and tell it to republish that same artifact every morning. You keep one bookmark instead of a new link per day.

Schedule it

You have two options, and the choice depends on where the brief needs to run.

A cloud routine runs on Anthropic's infrastructure with your laptop closed. Run /schedule in the repository, or create it at claude.ai/code/routines. The routines docs list the details that matter here: every run starts from a fresh clone of the repository, so the skill must be committed there, because personal skills on your machine are not loaded. All your connectors are included by default, and Claude can use every tool on an included connector, including writes, without asking. Remove every connector the brief does not need, and write the routine prompt as a plain instruction to run the morning-brief skill and republish the page.

A local scheduled task in the Claude desktop app runs on your machine with your files and a permission mode you choose. It only runs while the app is open and the computer is awake. If the computer slept through the scheduled time, the desktop docs note that it runs one catch-up later, so add a line to the skill: "If it is after noon, label this brief as late."

Guardrails before you trust it

  • Instructions reduce risk. They do not remove it. If the brief never needs to send email, the safest setup is one where it cannot. In local sessions you can add a deny rule in .claude/settings.json for the connector's send tool, using the exact tool name you see in /mcp (see the permissions docs).
  • Silence beats a confident wrong answer. The skill already reports failed sources at the top. Keep that rule.
  • Read the first week of scheduled runs, including the session logs, before you stop checking.

Start with calendar only. Get one honest, accurate brief from a single source, then add email as drafts, then anything else. The agent gets useful quickly. Trust takes longer, and it only comes from checking it for a while.

More in Agents

← All guides