Home / Toolkit / AI Chief of Staff
HOW I BUILT MY AI CHIEF OF STAFF.
A step-by-step guide to building a personal AI assistant that knows your calendar, your inbox, your priorities, and your communication style — using Claude, Cursor, Obsidian, the Microsoft Office MCP, and direct API connections for data analysis.
By Yannic Desch · Last updated June 2026 · Build time: ~1 weekend
Why Build Your Own
Every executive productivity tool promises to save you time. Most of them replace one inbox with another. The reason to build your own AI Chief of Staff instead is simple: a general-purpose tool doesn't know you. It doesn't know your portfolio companies, your communication style, your meeting patterns, or the three decisions you're currently sitting on.
When you build for yourself, you hyper-customize. Your Chief of Staff knows exactly who you're meeting with and why. It knows what you care about and what you don't. It knows your calendar well enough to flag the meetings you shouldn't attend.
This isn't a tutorial for engineers. It's a tutorial for operators who are willing to spend a weekend building something that runs for years.
What you'll have when you're done
A morning brief delivered every day at 07:00 — calendar, priorities, overnight news
A meeting prep agent that briefs you before every call
An email triage system that surfaces what actually needs your attention
A calendar audit that drafts delegation messages for meetings you should skip
A custom interface built in Cursor that ties it all together
Prerequisites
You don't need to be a developer. You need to be comfortable with basic file management, willing to read error messages, and able to spend a focused Saturday building something. That's it.
Claude
Primary AI — Pro plan for Projects, API for custom tools
Cursor
AI code editor — where you build and iterate everything
Obsidian
Local markdown vault — your personal knowledge base
Microsoft Office MCP
Connects Claude directly to Outlook, Teams, and Office files
Raycast
Mac launcher — hotkeys to trigger agents instantly
Anthropic API key
For Claude API access in your custom scripts
Estimated cost: ~€30/month for Claude Pro + API usage. The Google API is free within generous limits for personal use.
Your Knowledge Base
This is the foundation. Everything else depends on it. Your AI Chief of Staff is only as good as the context it has access to. Build this first — it takes two hours and pays back every day.
I use Obsidian as the knowledge base. It stores everything as plain markdown files in a local vault — which means Claude can read them directly, they're searchable, and there's no vendor lock-in. The vault lives at ~/Obsidian/Chief-of-Staff/.
Why Obsidian over Notion: Notion requires an API call to read data. Obsidian is just files. Claude can open them directly, Cursor can edit them, and your scripts can reference them without authentication overhead. Simpler is faster.
me.md — who you are
style.md — how you communicate
priorities.md — what matters this quarter
people.md — key contacts
companies.md — your portfolio or key accounts
# Example: me.md ## Role Director Product Portfolio Management & Post Merger Integration Rapid Data GmbH (PSG-backed) · Berlin ## What I own - Product portfolio strategy across 4 software products - P&L responsibility up to €30M - AI integration roadmap for the group - Post-merger integration workstream ## What I delegate - Operational product decisions to product leads - Calendar management to my assistant - Routine reporting to product managers ## What I always say no to - Meetings without an agenda - Requests that belong in email - Calls where the decision has already been made ## Communication style Direct. Short. No preamble. I prefer bullet points for status updates and prose only for strategic recommendations.
Setting Up Claude
Two options depending on how technical you want to go. Start with Option A — you can upgrade to Option B once you know what you're building.
Option A — Claude Projects (no code required)
Open Claude.ai → New Project. Paste the contents of your Obsidian context files into the Project Knowledge section. Write a system prompt that tells Claude who it is. Fastest path — everything runs inside Claude's interface.
Limitation: you have to sync your context files manually when they change. Fine for getting started, but you'll outgrow it.
Option B — Microsoft Office MCP (my setup)
The Microsoft Office MCP (Model Context Protocol server) connects Claude directly to your Outlook calendar, emails, Teams messages, and Office files — without writing a single line of integration code. Claude Desktop reads your actual Outlook data in real time.
Install the MCP server, connect it to your Microsoft 365 account, and Claude gains live access to everything in your Office environment. This is how the morning brief knows what's actually on your calendar — not a cached export, the live data.
Add your Obsidian vault as a second MCP source using the filesystem MCP. Now Claude has both your real-time Office data and your personal context files — simultaneously.
Option C — Direct API connections for data analysis
For portfolio-level data analysis, I connect Claude directly to our internal data sources via API: financial dashboards, product metrics, CRM data. A Python script pulls the relevant slice, passes it to Claude with context from the Obsidian vault, and gets back a structured analysis.
This is where the real leverage is in a PE environment: instead of someone spending three hours building a report, Claude reads the raw data and writes the analysis. You validate. Done in 20 minutes.
The system prompt that goes into your Project or API call:
You are the personal AI Chief of Staff for Yannic Desch. You have access to his knowledge base which includes his role, communication style, priorities, key contacts, and portfolio companies. Your job is to help him: 1. Prepare for meetings — always with concrete talking points, not platitudes 2. Triage and draft emails — in his voice, direct and short 3. Audit his calendar — flag meetings he should skip or delegate 4. Research and synthesize — quickly, with source citations 5. Give honest feedback — no social softening, no "great idea, but..." Rules: - Never use buzzwords. Never start with "Certainly!" or "Great question!" - Always be concrete. If you don't know something, say so. - When drafting emails, match his style exactly. - When giving feedback, lead with the problem, not the compliment. - Default to bullet points for information, prose for recommendations.
Morning Brief
Every morning at 07:00, a brief lands in your inbox. Three sections: what's on your calendar today, what's in your inbox that needs attention, and any news relevant to your portfolio or industry. Takes 5 minutes to read. Saves 30 minutes of context-switching.
Build this in Cursor using Python. It calls the Google Calendar API, Gmail API, and Claude API — combines the output and emails it to you via SendGrid or plain SMTP.
Set up Google API access
Create the brief script in Cursor
Schedule it
# The Claude prompt inside morning_brief.py
BRIEF_PROMPT = """
You are generating a morning brief for Yannic Desch.
Today's calendar events:
{calendar_events}
Unread emails (last 24h):
{emails}
Generate a brief with exactly three sections:
TODAY'S CALENDAR
List each meeting with: time, who, and one sentence on what's needed
from Yannic. Flag any meeting he should consider skipping or delegating.
INBOX PRIORITIES
List only the emails that require a decision or response today.
Ignore newsletters, notifications, and FYI messages.
THREE THINGS
The three most important actions for today, in order of priority.
Keep the whole brief under 300 words. Be direct.
"""Meeting Prep Agent
Thirty minutes before each meeting, you get a prep brief. Who's attending, what you last discussed, what you want to accomplish, and three specific talking points. Built from your knowledge base and calendar.
Create a Raycast script
Build the prep generator in Cursor
Trigger it with a hotkey
# Meeting prep prompt
PREP_PROMPT = """
Prepare Yannic for this meeting:
Meeting: {title}
Attendees: {attendees}
Time: {time}
Notes from calendar: {description}
Context from knowledge base:
{relevant_context}
Generate:
1. CONTEXT (2-3 sentences on who these people are and the relationship)
2. OBJECTIVE (what Yannic should accomplish in this meeting)
3. TALKING POINTS (3 specific points, not platitudes)
4. WATCH OUT FOR (one thing that could go wrong)
Under 200 words total. Direct.
"""Email Triage
The goal isn't to process every email. It's to identify the 10% that actually need you and draft responses for the straightforward ones. Everything else gets labeled and archived.
Build the triage script
Auto-draft the responses
Set your thresholds
# Email triage prompt
TRIAGE_PROMPT = """
You are triaging Yannic's inbox. His communication style and email rules
are in the context provided.
For each email, output:
- CATEGORY: [Needs Decision | Needs Response | FYI | Noise]
- PRIORITY: [Today | This Week | Archive]
- SUMMARY: one sentence
- DRAFT: (only if Needs Response) a draft reply in his voice
Emails to triage:
{emails}
Be brutal. Most emails are noise. If it doesn't require Yannic specifically,
or if the decision has already been made, it's noise.
"""Calendar Delegation
Run this once a week — Sunday evening or Monday morning. It looks at the upcoming week and identifies every meeting where your presence isn't actually required. For each one, it drafts the delegation message.
# Calendar audit prompt
AUDIT_PROMPT = """
Review Yannic's calendar for the week of {week}.
For each meeting, assess:
1. Is Yannic's presence actually required, or could someone else attend?
2. Could this be handled asynchronously (email, Loom, written update)?
3. If he must attend, what is the specific decision or input needed from him?
His role and delegation preferences are in the context.
For every meeting where he should delegate or skip, draft the exact message
he should send. Make it friendly but clear. Include who he suggests instead
and what context they'll need.
Format as:
MEETING: [title]
VERDICT: [Attend | Delegate | Skip | Async]
REASON: [one sentence]
MESSAGE: [draft if delegating/skipping]
"""The output becomes a to-do list. Each delegation message is ready to send. Takes 10 minutes to review and execute. Protects 3-5 hours of focus time per week.
Building the Interface with Cursor
Why Cursor specifically
You describe what you want in plain language. Cursor writes the code. You don't need to know Python syntax — you need to know what you want the program to do.
It understands the full context of your project. When you say "add a fifth tab that edits my Obsidian files," it reads your existing code and knows exactly where to add it.
Iteration is fast. Change something, describe the problem, Cursor fixes it. The feedback loop is minutes, not hours.
It's the difference between learning to drive and learning to build a car. You're the operator. Cursor does the engineering.
The scripts from the previous sections work standalone, but a simple web dashboard ties everything together. Built in an afternoon.
Open Cursor and describe what you want
Connect your Obsidian vault
Add the data analysis tab
Run it locally, trigger with Raycast
The exact prompt to start with in Cursor
"I'm building a personal executive dashboard. Create a minimal Flask app with clean inline CSS — no frameworks. Six tabs: Morning Brief, Meeting Prep, Email Triage, Calendar Audit, Obsidian Editor, Data Pulse. Each tab has a title, a last-updated timestamp, scrollable content area, and a Refresh button. I'll add the Python functions for each tab — just scaffold the structure first. I'm the only user so skip auth."
The Full Stack
When everything is connected, this is what your daily workflow looks like.
07:00
Morning brief arrives in inbox. Read in 5 minutes.
08:30
Open the dashboard. Check overnight updates to context files.
Before each call
Raycast → ⌘⇧M → Meeting prep brief in 10 seconds.
12:00
Email triage runs. Review drafted responses, send or edit.
Sunday 20:00
Calendar audit for the week. Delegation messages sent.
Weekly
Update priorities.md. The whole system recalibrates.
The tools in the stack
Claude API
Brain — all reasoning, analysis, and generation
Microsoft Office MCP
Live Outlook calendar, emails, and Office file access
Obsidian
Local markdown vault — personal knowledge base
Cursor
Building all scripts, integrations, and the dashboard UI
Direct data APIs
Portfolio metrics, CRM, BI tools — raw data for analysis
Raycast
Hotkeys and one-click triggers for every agent
Python
Glue layer connecting APIs, files, and Claude
Flask
Local web dashboard — your Chief of Staff interface
The most important thing
Start with the knowledge base and the morning brief. Get those working in a day. Use them for a week. Then add the meeting prep. Then email triage. Build in layers — each one earns its keep before you add the next.