| name | granola-meeting-notes |
| description | Use when the user asks about meeting notes, transcripts, action items, project lists from meetings, meeting prep, weekly digests, or mentions Granola. Also use when asked "what did we discuss", "who was in the meeting", "what did I commit to", "what were the decisions", "recap my meetings", "who said what", or wants to search/export meeting history. Triggers on keywords like meeting, discussed, action items, transcript, recap, digest, attendees, commitments. |
Granola Meeting Notes
Access Granola meeting notes, transcripts, and summaries from Claude Code.
Primary: Granola MCP tools (mcp__granola__*)
Fallback: Local CLI at ./bin/granola.js (relative to this skill's directory)
MCP Tools (Primary)
Granola has an official MCP server at https://mcp.granola.ai/mcp. When connected, tools appear as mcp__granola__* in your session.
Setup
claude mcp add granola --transport http https://mcp.granola.ai/mcp
You'll be prompted to authenticate via Granola on first use.
Available Tools
| Tool | Purpose | Key Parameters |
|---|
mcp__granola__list_meetings | List recent meetings with title, date, attendees | days (number) |
mcp__granola__get_meetings | Search meetings by content, notes, transcripts | search terms |
mcp__granola__get_meeting_transcript | Fetch full raw transcript for a meeting | meeting id |
mcp__granola__query_granola_meetings | Natural language queries across all meetings | query (string) |
Usage Pattern
1. mcp__granola__list_meetings({ days: 7 }) → browse recent meetings
2. mcp__granola__get_meeting_transcript({ id: "..." }) → get full transcript
3. mcp__granola__query_granola_meetings({ query: "..." }) → semantic search
Prompt Recipes
Step-by-step patterns using MCP tools as the primary method.
"What did we discuss yesterday?"
mcp__granola__list_meetings({ days: 2 }) → find yesterday's meetings
mcp__granola__get_meeting_transcript({ id }) → get full transcript for each
- Summarize: key topics, decisions made, action items
"Give me my action items from this week"
mcp__granola__list_meetings({ days: 7 }) → get all meetings this week
mcp__granola__get_meeting_transcript({ id }) for each meeting
- Scan for commitments — look for: "I'll do", "can you", "let's", "by Friday", "action item", "follow up", "need to"
- Group by owner and present as a checklist with meeting source
"Prep me for my meeting with [person]"
mcp__granola__query_granola_meetings({ query: "[person name]" }) → find meetings with that person
- Get transcripts for the most recent 2-3 matches
- Summarize: last meeting date, what was discussed, open action items, unresolved topics
"Weekly digest"
mcp__granola__list_meetings({ days: 7 }) → get all meetings
- Fetch transcripts for each meeting
- Compile: meetings by day, key decisions, action items by person, recurring themes
"Compile a project list from my meetings"
mcp__granola__list_meetings({ days: N }) (user specifies timeframe, default 14)
- Fetch transcripts for each meeting
- Produce structured markdown:
- Individual meeting summaries (title, date, attendees, key points, decisions, action items)
- Master project list (project name, description, status, key people, open items, related meetings)
- Open action items grouped by person
- Save to user's specified location (default:
~/Desktop/project-list.md)
"What decisions did we make about [topic]?"
mcp__granola__query_granola_meetings({ query: "[topic]" }) → find relevant meetings
mcp__granola__get_meeting_transcript({ id }) for each match
- Extract decision segments — look for: "let's go with", "we decided", "agreed", "the plan is"
- Present chronologically with meeting date and context
"Who said what about [topic]?"
mcp__granola__query_granola_meetings({ query: "[topic]" }) or list + fetch transcripts
- Filter for segments mentioning the topic
- Attribute by speaker:
source: "microphone" = the user, source: "system" = other speakers
- Present as attributed quotes with timestamps
"Compare meeting A vs meeting B"
- Get both transcripts via
mcp__granola__get_meeting_transcript
- Summarize each independently
- Highlight: what changed, new decisions, shifted priorities, contradictions
"Export meetings for [person/project]"
mcp__granola__query_granola_meetings({ query: "[person/project]" }) → find relevant meetings
- Fetch transcripts and compile into markdown
- Save to user-specified location or
~/Desktop/meeting-exports/
CLI Fallback
Use the CLI only if MCP tools are not available in the session (e.g., server disconnected or auth expired).
Prerequisites
- Granola desktop app installed and logged in on macOS
- Node.js 18+
ESM Fix
If you get ESM/import errors, copy the CLI to /tmp first:
cp ./bin/granola.js /tmp/granola.cjs
Then use node /tmp/granola.cjs <command> for all commands below.
CLI Reference
Location: ./bin/granola.js (relative to this skill's directory)
| Command | Description |
|---|
list [--days N] | List meetings from last N days (default: 7) |
show <id> [--transcript] | Show meeting details; --transcript fetches full transcript |
search <query> | Search by title, notes, or attendee name |
export <id> [--output DIR] [--transcript] | Export meeting to markdown file |
dump [--days N] [--output FILE] | Bulk export all meetings + transcripts to JSON |
Partial IDs work (first 8 characters).
CLI Examples
node /tmp/granola.cjs list --days 7
node /tmp/granola.cjs show abc12345 --transcript
node /tmp/granola.cjs search "Sarah"
node /tmp/granola.cjs dump --days 14 --output /tmp/meetings.json
Architecture
| Component | Source |
|---|
| All meeting data (MCP) | Granola cloud API via https://mcp.granola.ai/mcp (HTTP transport) |
| Auth (MCP) | Handled by Granola's MCP server (browser auth on first connect) |
| Metadata (CLI fallback) | Local cache: ~/Library/Application Support/Granola/cache-v*.json |
| Transcripts (CLI fallback) | API: POST https://api.granola.ai/v1/get-document-transcript |
| Auth (CLI fallback) | WorkOS token: ~/Library/Application Support/Granola/supabase.json |
Transcript segments have text, source ("microphone" = user, "system" = others), start_timestamp, end_timestamp. Transcripts are speech-to-text — names and technical terms may be misspelled.
Troubleshooting
| Problem | Fix |
|---|
| MCP tools not in session | Run claude mcp list — if granola not connected, re-add with claude mcp add |
| MCP auth expired | Remove and re-add: claude mcp remove granola && claude mcp add granola --transport http https://mcp.granola.ai/mcp |
| ESM/import errors (CLI) | cp CLI to /tmp/granola.cjs and run from there |
| API returns 401 | Auth token expired — re-open Granola desktop app to refresh |
| Empty transcript array | Meeting wasn't recorded or was too short |
| Missing attendees | Attendee data comes from Google Calendar — check calendar event |