Ever wished your Obsidian notes could magically fill themselves with your latest meetings, complete with attendees, links, and all the context you need?

Well not totally, there is a lot more to it, than just that. Let me take you back a little, i was a One Note guy for many years, cause i come from a Microsoft back ground, many tries and systems for making it work, never really worked for me in a “work” context, and for private note i prefer my analogue way, with the Travellers notebook. But for work i like digital, i work as an IT Architect, so it’s kind of in my blood 🙂
So someday i stumbled over Obsidian, which tickled my inner nerd, notes in Markdown, no hard binding to some proprietary system, just Mark Down, and a good system for taking notes. An one day i stumbled across Dan Bergs system for meeting notes (And i have A LOT of meetings). Which i really likes, its an awesome system. With Meeting notes, and People Notes, but in a 35K People company, it takes a long time to create the Meetingnotes, and the people you are meeting with. And i thought i already got this info in my Office 365 Calendar (Yes we are a Microsoft shop). And thought, can’t it get that info from there into Obsidian, without manually entering the data for every meeting ? So i set out to build a sync engine, that could sync people and meeting info from my calendar into Office365. So i wanted to create a python script(cause that is what i knew) to do just that. And it was also a learning excercise in Learning Vibe Coding with Github CoPilot is VS Code
What is obsidian-meeting-sync?
obsidian-meeting-sync is a Python-powered command-line tool that connects to my Office 365 calendar via the Microsoft Graph API, fetches my meetings, and exports them as well structured Obsidian markdown notes. It’s designed for anyone(aka me right now 🙂 who wants to keep their meeting notes organized, searchable, and linked—without manual copy-pasting of people and notes, when using Danns system
Key Features
- Secure Microsoft Authentication
Supports MSAL browser login and Web Account Manager (WAM)broker, so you can authenticate securely—even in organizations with strict Conditional Access policies. (that took me quite a while to get working ;)) - Fetch Meetings with Rich Details
Pulls all your meetings for a given date, including subject, time, attendees, online meeting URLs, and even attendee response status (accepted/declined/tentative). - Interactive or Bulk Sync
Choose a specific meeting to sync, or process all your meetings for the day in one go. - Obsidian-Ready Markdown Export
Generates meeting notes using customizable templates, with sections for agenda, notes, action items, and more. (I use my existing templates from Dans System) - Automatic People Notes
Creates or updates “People” notes for every meeting participant, including their company, title, email, and phone—perfect for building a networked knowledge graph in Obsidian. - Smart Folder Organization
Saves meeting notes in a structured folder hierarchy by year and month, making it easy to browse your meeting history. - Dataview & Backlink Friendly
Notes are formatted to work seamlessly with Obsidian’s Dataview plugin and backlinking, so you can query, filter, and cross-reference meetings and people. - Environment-Driven Configuration
All paths, templates, and API credentials are managed via environment variables for maximum flexibility.
How Does It Work?
- Authenticate:
The tool authenticates you with Microsoft Graph using MSAL. On Windows, you can use the WAM broker for a native experience. - Fetch Meetings:
It grabs your calendar events for the specified date, including all attendee info. - Display & Select:
See your meetings in a pretty table. Pick one to sync, or sync them all. - Export to Obsidian:
Meeting notes are generated using your template and saved in your vault. People notes are created or updated for each attendee. - Enjoy Linked Notes:
Open Obsidian and marvel at your networked, queryable meeting and people notes!
Example Workflow
# Sync today’s meetings using Windows authentication (Needed for a corporate Azuer AD joined machine if "Token Protection policies is enabled" Uses wam, and picks up your local token)
python meeting_sync.py sync --today --win
Mermaid Diagram: High-Level Flow

There is some prerequites to doing this as it requires you to be able to create an app registration in Azure to do this. The permissions are only delegated, so should not pose a security issue. Write me, if you want to know more, and i’ll polish up the documentation.