skills/obsidian-granola/SKILL.md
Sync meetings from Granola to Obsidian — pulls notes and transcripts and imports them as formatted meeting/transcript notes. Use when the user says "sync my last granola meeting", "note for my last meeting", or asks to pull in a Granola transcript.
npx skillsauth add nweii/agent-stuff obsidian-granolaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill helps the user extract meeting data from Granola (via the Granola MCP) and turn it into properly formatted Obsidian notes in their vault.
First, determine which meeting the user wants to sync.
Use the Granola MCP tools:
mcp_granola_list_meetings to find the meeting ID if you don't already have it.mcp_granola_get_meetings to get the AI-generated summary, action items, and private notes.mcp_granola_get_meeting_transcript to get the verbatim raw transcript (NOTE: This tool may require a paid Granola tier, and may not be exposed at all in some environments. If the call fails or the tool is unavailable, continue the workflow and still create the transcript note as a staging note so the user can paste the transcript in manually.)Generate a title using the user's specific naming convention:
[Meeting / Kickoff / Interview / Review / etc] with [Person] [more concise context if relevant] [YYYY-MM]
Examples:
Meeting with Matt 2, 2025-10Intro call with Acme 2026-01Interview - Acme Corp design rol with Grace 2024-05Kickoff with Carol for assistance work 2026-02Crucial Step: Present the generated title to the user for approval before creating the files. The user may want to tweak it or provide their own.
Meeting notes are no longer filed into a single Talks folder by default. They live alongside the working notes for whatever project or context the meeting belongs to, with the transcript note colocated in the same folder as its meeting note.
Determine the destination before saving:
03-Records/Working/<Area>/. For example, freelance/client gigs go in 03-Records/Working/Gigs/; the folder is flat (no per-project subfolders) — meeting notes and transcripts sit directly in it. Browse the candidate folder (vault_read in list mode, or the CLI) to confirm it exists and to match sibling naming.Talks (offer the most likely candidate). Talks is only a fallback for genuinely context-free meetings, and only if the user confirms.Both the meeting note and its transcript note save to this same destination folder.
The transcript note uses the Transcript template.md format and must follow this naming convention: Transcript - [Meeting Title].
Frontmatter:
obsidian read file="Transcript template" (or read 99-Admin/Templates/Transcript template.md with whatever vault tool is available) to get the latest properties.date: YYYY-MM-DD of the meeting.people: Add identified attendees as wikilinks (e.g., "[[Jane Doe]]"). Include attendees the user names even if they aren't in Granola's participant list.aliases: Generate a list of 1-2 short, alternative titles for the meeting to improve searchability. Make sure these aliases are highly specific to this exact meeting (e.g. mentioning specific project names, unique topics, or dates) so they don't broadly apply to other notes.related: Add a wikilink back to the main meeting note (e.g., "[[Meeting Title]]").description property summarizing the meeting. Write a 1-2 sentence concise summary directly (like "Summary mode" in the set-note-description skill); do not use filler phrases like "This note is about" or "A summary of".<% tp.file.creation_date(...) %>), evaluate them into actual dates.Content:
## Transcript header below the frontmatter.Them: and Me:. Format the transcript text, inserting blank newlines to separate speakers into distinct paragraphs. Replace Me: with **Nathan:** . If you know the other speaker, replace Them: with the bolded first name of the speaker. If this is a multi-speaker meeting and speaker assignment isn't certain, leave the original label but bold it (e.g. **Them:** ). The colon should be included in the bolding.Save Location:
[destination]/Transcript - [Meeting Title].md.If the user provided an existing note:
related property in their frontmatter includes a link to the transcript ("[[Transcript - [Meeting Title]]]").## Notes header).If creating a new note:
Frontmatter:
99-Admin/Templates/Meeting template.md (via CLI or vault tool) for the latest properties.date, people, aliases, and description as defined above.related: "[[Transcript - [Meeting Title]]]". Add the project's hub/parent note too if there's an obvious one (e.g. "[[BPL work]]").<% tp.file.creation_date(...) %>), evaluate them into actual dates.Content:
## Summary (or ## Notes) header.Save Location:
[destination]/[Meeting title].md (same folder as the transcript note).Bidirectional prev/next linking:
prev frontmatter field pointing to an earlier meeting in a series, open that previous note and add (or append to) its next frontmatter field with a wikilink back to the new note. This keeps the chain navigable in both directions.After saving, output a tappable Obsidian URI for each created note directly in the chat, so the user can open them manually on any platform (desktop or mobile). Don't rely on the desktop-only obsidian open CLI.
Construct each link as:
obsidian://open?vault=Brain&file=<URL-encoded note name>
URL-encode the note name (spaces → %20, etc.). The note basename is sufficient — Obsidian resolves it like a wikilink. Present them as markdown links labeled with the note titles, e.g.:
**Main note:** [<title>](obsidian://open?vault=Brain&file=<encoded>)
**Transcript:** [Transcript - <title>](obsidian://open?vault=Brain&file=<encoded>)
After saving the notes, append a bullet to the daily note for the meeting's date.
Format:
- Synced [[Meeting Title]] from Granola — [one sentence: who the meeting was with and what it covered]
Resolve the daily note for the meeting's date using the vault's standard daily note conventions. Read the note, find the ## Log - <Weekday> section, and append the bullet after the last existing bullet there.
Note on creating a missing daily: a bare vault_daily_note/create call produces a stub WITHOUT the user's Templater structure (Log section, Base embeds, prev/next). If the daily for the meeting's date doesn't exist, either skip the log silently, or — if you create it — rebuild it from 99-Admin/Templates/Daily Note.md with the Templater values resolved (prev/next dailies, the ISO week / quarter / year links, the ## Log - <Weekday> header) so it isn't a broken stub. Never edit a past daily other than this — they're frozen as of their day.
If multiple meetings were synced on different dates, log to each respective daily note.
Confirm with the user that the notes have been created, linked together, and filed in the right folder.
tools
Create a topic note grouping related notes under a common theme, with automatic backlinking to source notes. Triggers: 'group these under a topic', 'create topic note for [[A]], [[B]], [[C]]'.
data-ai
Save an archival summary of an AI conversation to Nathan's Obsidian vault, using the Thinking note template and vault folder conventions to capture intellectual journeys, key insights, and technical logs. Use when archiving a chat session to the vault.
testing
Enrich an existing meeting/interview note from its transcript, or scaffold one when only a transcript exists. Captures granular narrative, exact phrases, mechanics, casual context, and implicit signals. Run on thin auto-summary notes or transcripts that warrant close reading.
data-ai
Save a term, phrase, or coined concept as a Term note in the Brain vault under 02-Evergreen/Terms/. Two modes: capturing a nice term encountered in reading (with source quote) or recording one coined during conversation (with brief gloss). Triggers: '/save-term <term>', 'save this term', 'add this to my terms'.