From matty-tiger-skills
Create Obsidian meeting notes for today's (or a specified day's) calendar events. Pulls Google Calendar events, filters out personal blocks, checks for existing notes, resolves attendees against the People directory for proper Dataview linking, and creates pre-populated meeting notes. Trigger when the user runs /meeting-notes or says "create meeting notes", "set up my meetings", "prep my meeting notes", "create notes for today's meetings", or "meeting notes for tomorrow". Can also be triggered from the morning-update skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/matty-tiger-skills:meeting-notesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill creates Obsidian meeting notes for each real meeting on a given day's calendar.
This skill creates Obsidian meeting notes for each real meeting on a given day's calendar. It pulls events from Google Calendar, filters out personal/routine blocks, resolves attendees against the People directory, and creates properly formatted meeting notes in the Obsidian vault.
The flow is always: pull calendar → filter → resolve attendees → check for existing notes → present list → get approval → create notes (and optionally People pages). Never create notes without showing the user what will be created first.
Read 00 - System/Claude Context.md from the Obsidian vault using obsidian_get_file_contents.
This is the memory layer — team, key people, shorthand, active projects. Internalize it
silently (don't summarize it back). Essential for this skill: the people nicknames and team
roster are needed for attendee resolution.
Read the user's CLAUDE.md from the Obsidian vault root using obsidian_get_file_contents.
This contains the folder structure, meeting system design, and formatting rules.
Key points from CLAUDE.md:
04 - Meetings/Meeting.md template on file creation in that
folder — but since we create via MCP, Templater won't fire. We must build the content
ourselves matching the template's output format.summary frontmatter field is for a brief one-liner (used on People page Dataview
queries — the query is WHERE contains(attendees, this.file.name))05 - People/ and use Dataview to list meetingsUse obsidian_list_files_in_dir with dirpath: "05 - People" to get the current list
of People pages. Strip the .md extension to get the names. This list is used for
attendee resolution in Step 2b.
The user is in America/Chicago (Central Time). Always use this timezone when pulling calendar events.
The user may specify a date ("tomorrow", "Friday", "March 15"). If they don't, default to today.
Use gcal_list_events with:
timeMin: start of target date (YYYY-MM-DDT00:00:00)timeMax: end of target date (YYYY-MM-DDT23:59:59)timeZone: America/ChicagocondenseEventDetails: false (we need attendees)Filter out events that are not real meetings. Skip any event where:
eventType is workingLocation (e.g., "Home")eventType is focusTime (e.g., "Focus")transparency is transparent AND the event has no attendees (personal time blocks)Keep everything else — these are real meetings. This includes:
[EXTERNAL] — these are real meetings with outside partiesSome events are ambiguous. Flag these but default to including them:
myResponseStatus is declinedmyResponseStatus is needsAction AND the event has
optional: true for the user (they may not attend)This is critical for Dataview linking. The People page Dataview query uses:
WHERE contains(attendees, this.file.name)
So the attendee list in meeting YAML must contain the exact People page filename for the link to work (e.g., "Corey Fitz" not "Corey" or "[email protected]").
For each calendar attendee across all included events:
Skip self — if email is [email protected] or self: true, add as just
Matty (no resolution needed).
Match by email — read each People page's frontmatter looking for a matching
email field. This is the most reliable match.
Match by display name — if no email match, compare the calendar displayName
against People page filenames. Use fuzzy matching to handle variations:
No match found — if an attendee can't be matched to a People page, track them separately. These will be surfaced to the user in Step 4 with an offer to create People pages.
Performance note: Reading every People page's frontmatter can be slow if there are many. To optimize:
obsidian_batch_get_file_contents to read multiple People pages at once if neededFor each included event, check whether a meeting note already exists. The filename
format is YYYY-MM-DD Meeting Name.md in 04 - Meetings/.
Use obsidian_list_files_in_dir with dirpath: "04 - Meetings" and check for files
starting with the target date.
If a note already exists for a meeting (match by date prefix + similar name), mark it as "already exists" and default to skipping it. The user can override this to recreate.
Show the user a clean list of what will be created. For each meeting:
If any attendees across the day's meetings couldn't be matched to People pages, surface them after the meeting list:
I found 2 meetings on your calendar for today (Mar 11). Here's what I'll create:
9:30–10:00 Corey / Matty sync
Attendees: Matty, Corey Fitz
Summary: "Weekly 1:1 sync with Corey."
→ Will create
12:00–12:30 AWS/TigerData Workshop sync
Attendees: Matty, Doug Pagnutti + 4 external
Summary: "Sync with AWS team on workshop collaboration."
→ Will create
Skipped (personal blocks): Prepare For Day, Walk dogs ×2, Focus, Lunch, Workout
These attendees don't have People pages yet:
- Charishma Makineni ([email protected]) — in AWS/TigerData Workshop sync
- Vijay Pawar ([email protected]) — in AWS/TigerData Workshop sync
- Helen Har Theisen ([email protected]) — in AWS/TigerData Workshop sync
- Mrinali Umashankar ([email protected]) — in AWS/TigerData Workshop sync
Want me to create People pages for any of them? (You can say "all", list names,
or "none" to skip.)
Want me to create these 2 meeting notes? Or any changes?
Wait for user confirmation on both the meeting notes AND whether to create People pages.
For any attendees the user wants to add, create a People page in 05 - People/ using
obsidian_append_content.
05 - People/Full Name.md
Use the display name from the calendar. Clean up "Last, First" formats to "First Last".
Example: "Makineni, Charishma" → 05 - People/Charishma Makineni.md
Match the Person.md template output:
---
type: person
company: [infer from email domain — e.g., "Amazon" for @amazon.com, "TigerData" for @tigerdata.com]
title:
email: [their email address]
image: 05 - People/images/default-avatar.png
obsidianUIMode: preview
---
# Full Name
`=" + ")"`
## Notes
-
## Meetings
> [!SUMMARY]+ Meetings
> ```dataview
> TABLE date AS "Date", summary AS "Summary"
> FROM "04 - Meetings"
> WHERE contains(attendees, this.file.name)
> SORT date DESC
> ```
After creating People pages, update the internal people list so the subsequent meeting note creation uses the correct names.
After creating People pages, check if any of the newly created pages are for people
with @tigerdata.com email addresses. These people are on the company Slack workspace,
so their profile photos can be pulled automatically — but not from this session (the
Obsidian MCP doesn't support binary file uploads).
If there are any new TigerData People pages, generate a ready-to-paste prompt the user can run in a separate Cowork session with their Obsidian vault folder selected (which gives filesystem access to write image files directly).
Only include people who:
@tigerdata.com email address (they'll be on Slack)Image naming convention: firstname-lastname.jpg (all lowercase, hyphenated). Match
the existing files in 05 - People/images/ — e.g., corey-fitz.png, doug-pagnutti.jpg,
erin-staples.jpg.
Format the handoff like this:
I created People pages for these TigerData folks with the default avatar. To pull
their Slack profile photos, open a new Cowork session with your Obsidian vault
selected and paste this:
---
Find Slack profile photos for these people and save them to my Obsidian vault:
- Naveen Sukumar ([email protected]) → 05 - People/images/naveen-sukumar.jpg
- Kyla Kurstin ([email protected]) → 05 - People/images/kyla-kurstin.jpg
For each person:
1. Look them up on Slack by email using slack_read_user_profile
2. Get their profile photo URL from the response (image_512 or image_original)
3. Download the image with curl and save it to the path above
4. Update the `image` field in their People page frontmatter (e.g., 05 - People/Naveen Sukumar.md)
to point to the new image path instead of the default avatar
---
Skip this section entirely if:
For each confirmed meeting, create a file in Obsidian using obsidian_append_content.
Format: YYYY-MM-DD Meeting Name.md
Where "Meeting Name" is the calendar event summary, with these cleanups:
[EXTERNAL] prefix (but keep the rest)\ / : * ? " < > |) with -Example: 2026-03-11 AWS-TigerData Workshop sync.md
The full filepath is: 04 - Meetings/YYYY-MM-DD Meeting Name.md
Build the content to match what the Meeting.md Templater template would produce:
---
type: meeting
date: YYYY-MM-DD
summary: [one-liner summary — see below]
attendees:
- Matty
- Corey Fitz
- Doug Pagnutti
---
# Meeting Name
## Context
[Brief context — see below for how to populate this]
------------------------------------------------------------------------
## Notes
Any notes for the meeting
------------------------------------------------------------------------
## Actions
- [ ]
This is the most important part for Dataview linking to work correctly. The People
page Dataview query is WHERE contains(attendees, this.file.name), so the attendee
value MUST contain the exact People page filename for the link to work.
CRITICAL: Do NOT append emails to attendees who have People pages. Use ONLY the bare name. Emails clutter the YAML and are unnecessary for Dataview matching.
Attendees with People pages: Use ONLY the People page filename — no email,
no parenthetical, no extra text. Just the bare name exactly as it appears in the
05 - People/ directory (minus the .md extension).
Corey Fitz ✅ (matches 05 - People/Corey Fitz.md)Corey Fitz ([email protected]) ❌ WRONG — do not do thisMatty (no email needed)Attendees WITHOUT People pages (user declined to create): Use the display name
and email: Charishma Makineni ([email protected]). If the user later creates a
People page, the Dataview query will start matching automatically as long as the
filename is contained in this string.
Attendees with no display name: Derive from email: cmakinen ([email protected])
The summary field is a brief one-liner that appears in Dataview TABLE queries on
People pages. It should be short and descriptive — think "what was this meeting about"
in 5-10 words.
Populate based on what you can infer:
[EXTERNAL] prefix or non-tigerdata attendees):
"Sync with [company] on [topic from title]."The ## Context section is longer than the summary — it's a paragraph that gives you
context when you open the note before the meeting starts.
After creating all notes, present a summary:
Done! Created 2 meeting notes in 04 - Meetings/:
9:30 2026-03-11 Corey - Matty sync.md
Attendees: Matty, Corey Fitz
Summary: "Weekly 1:1 sync with Corey."
12:00 2026-03-11 AWS-TigerData Workshop sync.md
Attendees: Matty, Doug Pagnutti + 4 others
Summary: "Sync with AWS team on workshop collaboration."
Also created 2 People pages: Charishma Makineni, Vijay Pawar
Skipped: 6 personal blocks, 0 already existed
The morning-update skill pulls calendar data for the daily briefing. After presenting the briefing (Step 4 of morning-update), it should ask:
"Want me to create meeting notes for today's meetings?"
If the user says yes, morning-update should hand off to this skill. The calendar data already fetched by morning-update can be reused — no need to pull it again. The flow picks up from Step 2 (filter events) using the already-fetched events.
This is optional — the user can also run /meeting-notes independently at any time.
No meetings today: If all events are personal blocks, say "No meetings on your calendar for [date] — just personal time blocks. Nothing to create."
Event with no attendees (but is a real meeting):
Some calendar events are just placeholders the user created without inviting anyone. If
it passed the filter (not a personal block), create the note but leave attendees as just
- Matty and note it to the user.
Very long event summary:
If the summary is excessively long (>80 chars), truncate the filename but keep the full
name in the note's # Heading. Add a note about the truncation.
Multiple meetings with the same name:
If two events share a name (e.g., recurring meetings that got duplicated), append the
time to disambiguate: 2026-03-11 Team Sync (2pm).md
User asks for a different day: Support "tomorrow", "Friday", "March 15", "next Monday" etc. Parse the date and adjust the calendar query accordingly.
Obsidian append_content creates the file if it doesn't exist:
This is the expected behavior. obsidian_append_content with a filepath that doesn't
exist will create the file. This is what we want.
Calendar event was declined: Default to skipping declined events but mention them. The user can ask to include them.
All-day events: Skip all-day events — these are typically working locations, OOO markers, or holidays, not meetings.
Large number of external attendees: For meetings with many external attendees (>5), don't offer to create People pages for all of them individually. Instead, offer a bulk option: "This meeting has 12 external attendees. Want me to create People pages for all of them, or just specific ones?"
People page already exists with different name format: If a calendar displayName is "Doug Pagnutti" and the People page is "Doug Pagnutti.md", that's a direct match. But if the calendar says "Pagnutti, Doug" and the file is "Doug Pagnutti.md", the fuzzy matching in Step 2b should catch this by reversing "Last, First" to "First Last".
npx claudepluginhub mattstratton/skills-poc --plugin matty-tiger-skillsPrepares structured meeting briefs by gathering participant context, related emails, past notes, and Obsidian vault references.
Manages Obsidian vault sessions, daily routines, tasks, memory, resources, output styles, and meeting transcripts for BenAI plugin. Mode-aware for professional/business. Activates on resume, compress, tasks, or /assistant.
Auto-detects next calendar event and produces a one-page meeting brief with relationship history and open commitments in under 30 seconds.