Last Tuesday I walked into a 9 AM stakeholder call and already knew the project scope had changed overnight. I knew exactly who added the VP to the email thread at 11:47 PM, what they asked for, and that my client was waiting on a decision I hadn't seen yet. I had a suggested response ready. The whole prep took five minutes — because my chief of staff agent built with GitHub Copilot had already triaged everything while I made coffee.
Three months ago, that same morning would have started with 40 minutes of inbox scrolling, calendar tab-switching, and trying to remember what I promised someone last Thursday. I'd sit down to "plan my day" and emerge an hour later having responded to six emails but planned nothing.
The difference is three files: a custom Copilot agent file, an MCP server connected to Microsoft Graph, and a prompt template refined over 60+ mornings. I'm going to give you all three — plus the weekly review system that caught me spending 40% more time on reactive email than I estimated.
What's Inside
- Why a chief of staff agent beats generic AI assistants
- The three-file architecture:
.agent.md+.prompt.md+mcp.json - The full daily briefing prompt — refined over 60+ iterations
- Connecting Copilot to Outlook, Calendar, and Teams via MCP
- Weekly planning prompt for Friday reviews
- Running it from Copilot CLI for terminal workflows
- Adapting it for team leads, founders, and fractional CTOs
Why a "Chief of Staff" Agent — Not Just Another AI Assistant
Most people use AI like a search engine: ask a question, get an answer, close the tab. A chief of staff agent is fundamentally different. It has standing context about your role, your priorities, and your communication patterns. It doesn't just answer — it proactively surfaces what you'd otherwise miss.
In the physical world, a chief of staff reads the room before you walk in. They know which emails are political landmines, which meetings actually need you, and which "urgent" requests can wait. That's the behavior we're encoding.
The key insight: GitHub Copilot now supports custom agent files (.agent.md) that define persistent AI personas with specific tools, model preferences, and even handoffs between agents. Combined with MCP (Model Context Protocol) servers that connect to your Outlook, Calendar, and Teams data, you can build an agent that has real-time access to your work life. If you've been following the evolution of Microsoft's agent ecosystem, this is the individual-productivity side of the same architecture.
The Architecture: Three Files, One System
The entire chief of staff agent is built from three files in your workspace. No build step, no deployment, no API keys beyond what MCP handles.
Here's what each file does and the exact contents I use.
File 1: The Agent — chief-of-staff.agent.md
This file defines who the agent is. It lives at .github/agents/chief-of-staff.agent.md and shows up in your Copilot agent picker in VS Code.
The tools array in the frontmatter restricts which tools this agent can access. The WorkIQ-MailServer/* wildcard includes all tools from that MCP server — same pattern for Calendar and Teams. The agent gets read access to your M365 data but can't edit files or run terminal commands. It's read-only by design. If a tool listed in the array isn't available at runtime, Copilot simply ignores it.
File 2: The MCP Connection — mcp.json
MCP (Model Context Protocol) is what gives Copilot access to data beyond your codebase. For a chief of staff agent, you need MCP servers that connect to your Outlook, Calendar, and Teams data.
Microsoft recently launched Work IQ MCP (preview) — enterprise-grade MCP servers for Microsoft 365. Work IQ is the intelligence layer behind Microsoft 365 Copilot, and these MCP servers expose that same context to your own agents. The catalog includes Work IQ Mail, Work IQ Calendar, Work IQ Teams, Work IQ SharePoint, Work IQ OneDrive, and more — exactly what a chief of staff agent needs.
Work IQ MCP servers connect over HTTP with OAuth authentication. Here's the configuration for GitHub Copilot CLI and VS Code:
A few things to note:
- Work IQ MCP requires a Microsoft 365 Copilot license and an enterprise application registered in Microsoft Entra with the appropriate WorkIQ permissions (e.g.,
WorkIQ-MailServer,WorkIQ-CalendarServer). - Authentication is OAuth-based — you sign in once through a browser redirect, and the token is cached. No API keys to manage.
- Enterprise governance built in — IT admins control which Work IQ servers are available via the Microsoft 365 admin center, with full audit trails in Microsoft Defender.
- The GitHub MCP server is included so the agent can also check your PRs, issues, and notifications — useful for the technical side of your briefing.
Don't have a Microsoft 365 Copilot license? You can build a lightweight custom MCP server using the MCP TypeScript SDK that wraps Microsoft Graph API calls directly. Register a Microsoft Entra app with read-only scopes (Mail.Read, Calendars.Read, Chat.Read) and you're set. The agent file and prompts work identically — only the mcp.json configuration changes.
If you're already using Microsoft 365 in your organization, your admin can set up the Entra app registration and grant Work IQ permissions in minutes.
Need help connecting your Microsoft 365 environment to AI tools? We help Alberta businesses set up secure integrations that actually work.
Book a Free Strategy CallFile 3: The Daily Briefing Prompt — daily-briefing.prompt.md
This is the heart of the system. It lives at .github/prompts/daily-briefing.prompt.md and you invoke it by typing /daily-briefing in Copilot Chat. I've refined this prompt over 60+ mornings. Every section earns its place.
📬 INBOX TRIAGE — since my last sign-off
Review my emails received since yesterday evening. For each item, decide: does this need me, today? **Needs my response today:** For each: sender, subject, the specific ask (quote the exact sentence), your suggested response angle, and any deadline stated or implied. **Decisions awaiting me:** Anything where someone is blocked on my input. Name what they need, what happens if I don't respond, and by when. **FYI but important:** Changes in scope, status, or stakeholder sentiment on projects I own — even if no action is requested. One sentence each. **Threads that escalated overnight:** Conversations where tone shifted, new people were added, or leadership was looped in. Explain what changed and why it matters. Skip: newsletters, calendar invites, automated alerts, marketing, and anything I'm only CC'd on unless it changes a project I lead.📅 TODAY'S CALENDAR
For each accepted meeting today, in chronological order: - **Meeting name** + time + attendees (flag anyone senior, external, or new to a recurring series) - **Why this meeting exists:** the actual decision or outcome it's meant to produce — not the calendar title - **My role:** driving, contributing, or listening. If unclear from prior threads, say so - **Pre-read:** the 1–2 most relevant recent emails, docs, or chat threads I should review beforehand - **What's changed since last time** (recurring meetings only): new commitments, blockers, or status shifts - **Open questions or risks** I should raise Also flag: - Back-to-back stretches with no prep buffer - Any meeting where I haven't responded to a pre-read or agenda request - Meetings that could be async based on the agenda🎯 TOP PRIORITY TODAY
Based on deadlines, stakeholder pressure, and what's blocking others: what is the single most important thing I should move forward today? Justify it in 2–3 sentences referencing specific signals from my inbox or calendar — not generic productivity advice. If there's a credible second candidate, name it and explain the tradeoff so I can make the call.⚡ QUICK WINS
List 2–3 things I can knock out in under 5 minutes each that would unblock someone or close a loop. Include the specific action (reply, approve, forward, etc.) and to whom.A few design decisions worth explaining:
- "Quote the exact sentence" — forces the agent to ground its triage in actual email content rather than hallucinated summaries
- "What happens if I don't respond" — creates urgency ranking based on real consequences, not arbitrary flags
- "Could be async" — the agent earns trust by saving you from unnecessary meetings
- "Not generic productivity advice" — the biggest failure mode of AI planners is vague output. This constraint forces specificity
The Weekly Review Prompt
Fridays get a different prompt. The daily briefing is tactical — what do I need to do today. The weekly review is strategic — am I working on the right things?
📊 COMMITMENTS SCORECARD
Review emails and calendar from this week. List every commitment I made (explicit or implied) — things I said I'd do, deadlines I accepted, follow-ups I promised. For each: - What I committed to and to whom - Status: delivered, in progress, or missed - If missed: is anyone waiting? What's the recovery action?🔍 DRIFT DETECTION
Compare how I actually spent my time this week (based on calendar and sent emails) against what I said my priorities were on Monday. - Where did I spend time that wasn't aligned with stated priorities? - What got crowded out that shouldn't have? - Any patterns: am I consistently over-indexing on reactive work?📋 NEXT WEEK SETUP
Looking at next week's calendar and open threads: - Top 3 priorities I should commit to on Monday - Meetings I should decline or delegate - Prep work I should do this afternoon to hit Monday running - Anyone I owe a follow-up to before the weekendRunning It: VS Code and Copilot CLI
In VS Code, you select chief-of-staff from the agent picker in Copilot Chat, then type /daily-briefing. The agent connects to your MCP servers, pulls your email and calendar data, and produces the formatted briefing.
You can also run this from GitHub Copilot CLI — the background agent runtime that operates directly in your terminal:
Copilot CLI sessions run in the background on your local machine. You can start a session from the Chat view by selecting Copilot CLI from the Session Target dropdown, or type copilot in any VS Code integrated terminal. Custom agents are selected from the agents dropdown — the same .agent.md files, MCP servers, and slash commands you use in the editor work here too.
Because Copilot CLI sessions persist independently, you can kick off your morning briefing in the terminal and continue working in your editor while it processes. The session supports / slash commands for your prompt files and even /compact to manage long conversations.
Tip: Use worktree isolation mode for Copilot CLI sessions that might produce file output — it creates a separate Git worktree so changes don't affect your working directory until you review them.
Adapting for Your Role
The prompt structure above is tuned for a fractional CTO serving multiple clients. But the same architecture works for any role — you just adjust the "My Context" section in the agent file and the triage criteria in the prompt.
For startup founders
Add investor email detection, board meeting prep, and runway-sensitive priority ranking. Replace "stakeholder pressure" with "burn rate impact" in the priority section.
For engineering managers
Add sprint health checks, PR review queue status (via the GitHub MCP server), and on-call rotation awareness. The /daily-briefing prompt can include a "team blockers" section that pulls from GitHub Issues.
For team leads in Alberta businesses
If you're leading a team at a Calgary startup or an Edmonton scale-up, add client SLA tracking and project budget signals. The beauty of this system is that it adapts to your communication patterns — not a generic template.
What I Learned After 60+ Days of Daily Briefings
I've been running this system daily since February 2026, across four fractional CTO engagements with startups and growing businesses in Alberta. Here's what surprised me:
1. The "escalated threads" section caught things I would have missed. Twice, I walked into meetings prepared for a conversation that had shifted overnight because the agent flagged new stakeholders being added to email threads. In one case, a client's CEO had been looped into a technical decision thread at 11 PM — the kind of signal that changes how you frame an entire conversation. That context would have blindsided me.
2. "Could be async" saves 3–4 hours per week. The agent is ruthless about identifying meetings without clear decision outcomes. I now decline or propose async alternatives for about 30% of recurring meetings — and nobody has pushed back.
3. The weekly drift detection is humbling. Seeing a clear comparison between "what I said I'd focus on" and "what I actually spent time on" forces accountability. Most weeks, reactive email consumes 40% more time than I estimate.
4. Quoting the exact ask from emails eliminates ambiguity. The "quote the sentence" constraint was the single biggest improvement to the prompt. Before that, the agent would paraphrase requests and sometimes miss the actual ask. Grounding in direct quotes fixed that.
5. The system compounds over time. After four weeks, I'd iterated the prompt enough that false positives (emails flagged as important that weren't) dropped to near zero. The agent learned my patterns through the context I encoded — not through training, but through better instructions. That's the advantage of the custom instructions architecture: you refine in plain English.
Building AI productivity systems like this is exactly what we do. Whether you're a founder, CTO, or team lead — we help you implement AI tools that compound, not just demo well.
Book a Free Strategy CallSecurity Considerations
A few things to be thoughtful about when building this:
- Work IQ MCP is governed centrally — IT admins control which MCP servers are available via the Microsoft 365 admin center. If a server is blocked, it's blocked for every user and every agent.
- Full audit trails — every tool call is traced and visible in Microsoft Defender's Advanced Hunting. You can inspect which tools were invoked, what parameters were passed, and the outcomes.
- Agent tool restrictions — the
toolsarray in.agent.mdensures the agent can only call the MCP tools you specify. It cannot run terminal commands or edit files. - OAuth with scoped permissions — Work IQ uses On-Behalf-Of (OBO) delegated user permissions via Microsoft Entra. The agent only accesses data the signed-in user can already see.
- Microsoft Entra app registration — use a dedicated app registration with only the Work IQ permissions you need (
WorkIQ-MailServer,WorkIQ-CalendarServer). Don't reuse an app that has broader permissions.
If your organization has compliance requirements around AI processing of email content, check with your IT governance team before connecting MCP to production mailboxes. The centralized governance in Work IQ MCP was designed specifically for this — admins maintain control while developers build.
Frequently Asked Questions
What is a chief of staff agent in GitHub Copilot?
A chief of staff agent is a custom AI persona built using GitHub Copilot's .agent.md files. It acts as your executive assistant — triaging your inbox, preparing daily briefings, and surfacing risks from your calendar and email. It connects to external data sources like Outlook and Calendar via MCP servers.
Can GitHub Copilot read my Outlook email and calendar?
Yes, through MCP (Model Context Protocol) servers. Microsoft's Work IQ MCP servers (preview) provide enterprise-grade access to Outlook Mail, Calendar, Teams, SharePoint, and more. You configure these HTTP-based MCP servers in your .vscode/mcp.json file with OAuth authentication. Once connected, Copilot agent mode can read your email, calendar events, and Teams messages. A Microsoft 365 Copilot license is required.
What is the difference between .agent.md and .prompt.md files?
An .agent.md file defines a persistent AI persona with specific tools, model preferences, and handoff capabilities — like a Chief of Staff agent. A .prompt.md file is a reusable task template invoked as a slash command — like /daily-briefing. You use both together: the agent defines who, the prompt defines what.
Does this work in Copilot CLI?
Yes. GitHub Copilot CLI sessions support custom agents (experimental). Start a session by typing copilot in your VS Code terminal, select the chief-of-staff agent from the agents dropdown, and type /daily-briefing. The same .agent.md files, MCP servers, and .prompt.md templates work in CLI sessions.
Get Started in 15 Minutes
Here's the fastest path to a working chief of staff agent:
- Create the three files using the templates above. Customize the "My Context" section in the agent file.
- Set up Work IQ MCP — register an enterprise application in Microsoft Entra with the Work IQ Mail and Calendar permissions, add your tenant and client IDs as environment variables. (No M365 Copilot license? Build a custom MCP server with Graph API instead.)
- Open VS Code, select the chief-of-staff agent from the picker, and type
/daily-briefing. - Iterate on the prompt — after a week, you'll know which sections add value and which need tuning for your workflow.
The prompt I shared above took 60+ iterations to get right. But the first version — even a rough one — already saved me 20 minutes per morning. Start messy, refine weekly.
If you build this and want to share what you've learned, come find us in the Code To Cloud Discord — there's a growing group of people building Copilot agents for productivity, infrastructure automation, and AI adoption.
Know someone drowning in email and back-to-back meetings? Send them this article.