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.
1. Capture Intent & Context
First, determine which meeting the user wants to sync.
- If they say "my last meeting", you will need to list recent meetings to find it.
- If they specify a person or topic, search or list recent meetings to identify the correct one.
- If the user says they already have an existing prepared note for this meeting in Obsidian, append the Granola contents to their existing note, and create a separate transcript note.
- Otherwise, you will generate a new title and create both the meeting note and transcript note from scratch.
2. Fetch Granola Data
Use the Granola MCP tools:
mcp_granola_list_meetings
to find the meeting ID if you don't already have it.
- 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. If the call fails with a paid-tier error, continue the workflow and still create the transcript note so the user can fill it in manually.)
3. Generate the Title (If creating a new note)
Generate a title using the user's specific naming convention:
[Meeting / Kickoff / Interview / etc] with [Person] [more concise context if relevant] [YYYY-MM]
Examples:
Meeting with Matt 2, 2025-10
Intro call with Acme 2026-01
Interview - Acme Corp design rol with Grace 2024-05
Kickoff with Carol for assistance work 2026-02
Crucial 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.
4. Prepare and Save the Transcript Note
The transcript note uses the
format and
must follow this naming convention:
Transcript - [Meeting Title]
.
-
Frontmatter:
- If you need the transcript template,
obsidian read file="Transcript template"
to read the latest properties for the template.
- Use the retrieved properties as the base for the new note's frontmatter.
- Inject the dynamic values from the meeting:
- : of the meeting.
- : Add any identified attendees as wikilinks (e.g., ).
- : 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 (e.g.,
["Project Phoenix Q3 roadmap sync", "Stripe API integration planning 2024-10"]
).
- : Add a wikilink back to the main meeting note (e.g., ).
- Generate a property summarizing the meeting. Write a 1-2 sentence concise summary directly (like "Summary mode" in the skill); do not use filler phrases like "This note is about" or "A summary of".
- If the template contains dynamic scripts or variables (e.g.
<% tp.file.creation_date(...) %>
), evaluate them into actual dates.
-
Content:
- Add a header below the frontmatter.
- Append the verbatim raw transcript below the header.
- Granola transcript logs have speaker labels like and . You must 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: "). Note the colon should be included in the bolding.
-
Save Location:
- Save to @03-Records/Talks/Transcript - [Meeting Title].md
5. Prepare and Save the Meeting Note
If the user provided an existing note:
- Read their existing note.
- Retain their frontmatter and title.
- Ensure the property in their frontmatter includes a link to the transcript (
"[[Transcript - [Meeting Title]]]"
).
- Intelligently append the Granola notes and AI summary into their document where it makes sense (e.g., under a header).
If creating a new note:
-
Frontmatter:
- If you need the meeting template,
obsidian read file="Meeting template"
to read the latest properties for the template.
- Use the retrieved properties as the base for the new note's frontmatter.
- Inject the dynamic values from the meeting:
- Follow the same rules for , , , and as defined above.
- :
"[[Transcript - [Meeting Title]]]"
- If the template contains dynamic scripts or variables (e.g.
<% tp.file.creation_date(...) %>
), evaluate them into actual dates.
-
Content:
- Add a or header.
- Insert the AI-generated summary, private notes, and action items from Granola. Make sure it is nicely formatted in Markdown.
-
Save Location:
- Save to @03-Records/Talks/[Meeting title].md
-
Bidirectional prev/next linking:
- If the new note has a frontmatter field pointing to an earlier meeting in a series, open that previous note and add (or append to) its frontmatter field with a wikilink back to the new note (e.g.,
next: "[[New Meeting Title]]"
). This keeps the chain navigable in both directions.
6. (Desktop environment only) Open in Obsidian
Note: This only works if the agent has Obsidian CLI access in the current environment. If the command fails or is unavailable, skip it silently and report the file paths to the user instead.
After saving both notes, try to open them in Obsidian using the CLI:
bash
# If you have Obsidian running in your environment
obsidian open file="[Meeting Title]"
7. Review
Confirm with the user that the notes have been successfully created and linked together!