Granola Meeting Export
Pull your Granola meeting notes and full transcript without leaving your editor, then optionally save them to disk.
---
name: granola-export
description: "Extract and export meeting transcripts and summary notes from Granola. Trigger this skill whenever the user wants to pull, view, export, or read their Granola meeting notes, transcript, or summary for a specific meeting or their most recent one. Trigger on phrases like 'get my Granola notes', 'pull the transcript from my last meeting', 'export my meeting notes', 'show me the notes from [meeting name]', 'grab the transcript', 'get the summary from my [meeting name] call', 'pull meeting notes from Granola', 'what are my notes from [X]', or any request to retrieve content from a Granola meeting. Always use this skill even if the user says 'just grab the notes' or frames it as a quick task."
---
# Granola Meeting Exporter
Extract and surface the full transcript and summary notes from a Granola meeting. The output should be clean, readable, and ready to paste, share, or feed into downstream workflows.
## Parameters
All parameters are optional:
- **meeting_name**: A name, partial name, description, or keyword identifying the meeting. Defaults to the most recent meeting if omitted.
- **date**: The date of the meeting in any recognizable format ("April 15", "yesterday", "last Tuesday"). Narrows results when a name is ambiguous or not given.
- **time**: Approximate start time ("2pm", "morning", "afternoon"). Disambiguates multiple meetings on the same date.
- **save**: Whether to write notes and transcript to local markdown files. Defaults to false. Set to true when the user says "save," "write to file," or "export to disk."
## Workflow
### Step 1 -- Find the Meeting via MCP
Use the Granola MCP to locate the meeting.
**Time range:**
- If a **date** was given, use `time_range: "custom"` with `custom_start` and `custom_end` set to that date. Resolve relative dates ("yesterday", "last Tuesday") to actual calendar dates before querying.
- If no date was given but a **meeting_name** was, use `time_range: "last_30_days"`.
- If neither was given (most recent), use `time_range: "this_week"`, falling back to `time_range: "last_week"` if nothing is found.
**Selecting the meeting:**
1. Call `Granola:list_meetings` with the appropriate time range.
2. Filter by **meeting_name** if provided (fuzzy match is fine).
3. If **time** was given, use it to disambiguate: morning = before noon, afternoon = noon--5pm, evening = after 5pm.
4. If only a date was given and exactly one meeting falls on it, use it. If multiple meetings fall on that date, list them (title + start time) and ask the user to pick.
5. If multiple meetings still match after all filtering, list the top 3--5 (title + date + start time) and ask. Do not guess.
### Step 2 -- Pull Meeting Details and Transcript
With the meeting ID in hand, make two parallel calls:
1. `Granola:get_meetings` with the meeting ID -- pulls summary notes, attendees, AI-generated overview, and metadata.
2. `Granola:get_meeting_transcript` with the meeting ID -- pulls the verbatim transcript.
### Step 3 -- Format and Present
Present the content in this structure:
---
## [Meeting Title]
**Date:** [date]
**Attendees:** [list of names]
---
### Summary Notes
[Paste the AI-generated summary / structured notes here, preserving any sections like Action Items or Key Decisions.]
---
### Full Transcript
[Paste the verbatim transcript here, preserving speaker labels. Do not truncate unless the transcript exceeds 10,000 words, in which case summarize the middle and note what was cut.]
---
### Step 4 -- Save to Files (if requested)
If **save** is true (or the user asks after seeing the output), write two markdown files:
- `Notes/YYYY-MM-DD - [Meeting Name] - Notes.md`
- `Transcripts/YYYY-MM-DD - [Meeting Name] - Transcript.md`
`YYYY-MM-DD` is the meeting date. `[Meeting Name]` is the title as it appears in Granola, with any filename-invalid characters (`/ \ : * ? " < > |`) replaced with a dash. Create the `Notes/` and `Transcripts/` subdirectories if they don't already exist.
After presenting the output, offer one line: "Want me to save these as markdown files?" Don't repeat the offer.
## Edge Cases
- **Meeting not found:** Tell the user clearly. Ask if they want to try a different date range or different keywords.
- **Transcript unavailable:** Note it and present the summary notes only. Short meetings or huddles may have no transcript.
- **Summary notes empty:** Note it and present the transcript only.
- **Meeting under 5 minutes old:** Granola may not have processed it yet. Let the user know and suggest retrying in a few minutes.What it does
It queries Granola via MCP, pulls both the AI-generated summary and the full verbatim transcript, and formats them cleanly in one pass. You can ask by meeting name, date, time of day, or just say “my last call” and it figures out the rest. If you want the files on disk, tell it to save and it drops two markdown files – one for notes, one for the transcript – using a consistent naming convention.
When to use it
Any time you need meeting content somewhere else. Feeding a transcript into a follow-up email, archiving notes before a project wraps, or pulling what was decided before the next standup. It’s most useful when you’re already in Claude Code and don’t want to context-switch to Granola just to copy something out.
Make it yours
Add “and save it” to the trigger if you always want files on disk. Pair it with a follow-up or summarization skill to go from transcript to next action in one session without switching apps.
