A Claude Code skill that syncs and queries Granola meeting transcripts. Gives Claude access to your meeting notes, attendees, and transcripts through a Python CLI with structured JSON output.
- Incremental sync from Granola API to local disk
- Full-text regex search across all meeting transcripts
- Filter by date, title, or participant
- Download specific meetings into project folders
- JSON output optimized for Claude Code integration
- Uses Granola app's existing auth (no API keys to manage)
- macOS (auth relies on the Granola desktop app's local storage)
- Python 3.8+
- Granola desktop app installed and signed in
- Claude Code CLI
git clone https://github.com/asenkovskiy/skill-granola.git ~/.claude/skills/granola
cd ~/.claude/skills/granola
uv venv && uv pip install -r requirements.txtmkdir -p .claude/skills
git clone https://github.com/asenkovskiy/skill-granola.git .claude/skills/granola
cd .claude/skills/granola
uv venv && uv pip install -r requirements.txt~/.claude/skills/granola/.venv/bin/python ~/.claude/skills/granola/scripts/granola.py --version-
Sync your meetings:
~/.claude/skills/granola/.venv/bin/python ~/.claude/skills/granola/scripts/granola.py sync
-
Ask Claude naturally:
- "What meetings did I have today?"
- "Find the standup where we discussed the migration"
- "Search my meetings for action items about the budget"
- "Download yesterday's planning meeting into this project"
-
Or use the CLI directly:
# List today's meetings granola.py list --date today --compact --pretty # Search transcripts granola.py search "action items" --context 2 --pretty # Show a specific meeting granola.py show MEETING_ID --transcript --pretty
Meetings sync to ~/Documents/granola-meetings/ by default. Override with:
| Method | Example |
|---|---|
| CLI flag | --storage /path/to/meetings |
| Env var | GRANOLA_SYNC_FOLDER=/path/to/meetings |
| Config file | ~/.config/granola/config.json with {"storage": "/path"} |
~/Documents/granola-meetings/
2025-01-15_Team-Standup/
metadata.json # ID, title, dates, attendees, calendar event
transcript.md # Human-readable markdown transcript
transcript.json # Raw transcript data from API
document.json # Full API response
notes.md # AI-generated summary (if available)
# Sync every hour (add to crontab -e)
0 * * * * ~/.claude/skills/granola/.venv/bin/python ~/.claude/skills/granola/scripts/granola.py sync --quietqmd adds semantic/natural-language search on top of the synced meetings. While this skill provides regex-based keyword search, qmd enables queries like "what did we decide about pricing?" using vector embeddings.
See docs/qmd-integration.md for setup instructions.
The skill reads authentication tokens from ~/Library/Application Support/Granola/supabase.json, which the Granola desktop app creates when you sign in. Tokens expire after ~6 hours — just open Granola to refresh them. No API keys or manual token management needed.
| Problem | Fix |
|---|---|
| "Auth file not found" | Sign into the Granola desktop app |
| "Token may be expired" | Open Granola to refresh (tokens last ~6 hours) |
| "requests module not found" | Run uv pip install requests in the skill's venv |
| Empty search results | Run sync first to download meetings |
MIT