Home / Toolkit / AI Chief of Staff

TOOLKITBUILD YOUR OWN.

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


00

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


01

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

claude.ai

Cursor

AI code editor — where you build and iterate everything

cursor.com

Obsidian

Local markdown vault — your personal knowledge base

obsidian.md

Microsoft Office MCP

Connects Claude directly to Outlook, Teams, and Office files

github.com/microsoft/mcp

Raycast

Mac launcher — hotkeys to trigger agents instantly

raycast.com

Anthropic API key

For Claude API access in your custom scripts

console.anthropic.com

Estimated cost: ~€30/month for Claude Pro + API usage. The Google API is free within generous limits for personal use.


02

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.

1

me.md — who you are

Your role, your company, your key responsibilities. What you own, what you delegate, what you care about. Write it like you'd brief a new EA on their first day.
2

style.md — how you communicate

Your writing style. How you structure emails. Your standard responses to common requests. What you always say no to. What you say yes to without thinking. Include 3-5 real email examples you've written.
3

priorities.md — what matters this quarter

Your top 3 strategic priorities. Current live decisions. What you're trying to finish before end of month. Update this weekly — it's the most time-sensitive file.
4

people.md — key contacts

Everyone you interact with regularly. Name, role, context, relationship history. The more detail, the better the meeting prep.
5

companies.md — your portfolio or key accounts

For each company you're responsible for: what they do, current status, open questions, key contacts. One section per company.
# 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.

03

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.

04

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.

1

Set up Google API access

Go to console.cloud.google.com → New Project → Enable Calendar API + Gmail API → Create credentials (OAuth 2.0) → Download the JSON credentials file into your project folder.
2

Create the brief script in Cursor

Open Cursor, create a new file morning_brief.py. Tell Cursor: "Write a Python script that fetches today's Google Calendar events and the last 20 unread Gmail messages, then calls the Claude API to generate a morning brief with three sections: Today's Calendar, Inbox Priorities, and Action Items. Email the result to [your email]."
3

Schedule it

On Mac: use cron or Automator. In Terminal: crontab -e then add 0 7 * * * python3 ~/chief-of-staff/morning_brief.py. Runs every day at 07:00.
# 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.
"""

05

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.

1

Create a Raycast script

In Raycast → Extensions → Script Commands → New Script Command. Name it "Meeting Prep". Set it to run a Python script that takes the next calendar event and generates a brief.
2

Build the prep generator in Cursor

The script: fetch the next calendar event from Google Calendar, extract attendees, search your people.md and companies.md for relevant context, call Claude to generate the prep brief.
3

Trigger it with a hotkey

In Raycast, assign a hotkey (e.g., ⌘⇧M). Before any meeting, hit the hotkey. Brief appears in 10 seconds.
# 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.
"""

06

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.

1

Build the triage script

A Python script that reads your last 50 unread emails, sends them to Claude with your style.md, and categorizes each as: Needs Decision / Needs Response / FYI / Noise.
2

Auto-draft the responses

For anything in "Needs Response" that's straightforward, Claude drafts a response in your voice. The draft goes into Gmail as a Draft — you review and send. You never write from scratch.
3

Set your thresholds

In your style.md, add a section called "## Email rules" that defines what gets a same-day response, what can wait, and what you never reply to. Claude uses this to triage.
# 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.
"""

07

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.


08

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.

1

Open Cursor and describe what you want

"Build a minimal Flask web app with five tabs: Morning Brief, Meeting Prep, Email Triage, Calendar Audit, and Obsidian Editor. Each tab shows the output of the corresponding Python script and has a Refresh button. The Obsidian Editor tab shows my markdown context files and lets me edit them directly."
2

Connect your Obsidian vault

Tell Cursor: "The context files live at ~/Obsidian/Chief-of-Staff/. The editor tab should list all .md files in that directory, let me click one to open it, and save changes back to the file." Done in one prompt.
3

Add the data analysis tab

"Add a sixth tab: Data Pulse. It connects to [your API endpoint], pulls the last 7 days of [metric], passes it to Claude with my priorities.md, and returns a structured analysis. Show the raw numbers and the Claude commentary side by side."
4

Run it locally, trigger with Raycast

Run on localhost:5000. In Raycast, create a script command that opens this URL. One hotkey — your entire Chief of Staff in one browser tab.

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."


09

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.