About granola
granola is a CLI skill for accessing Joel's Granola meeting notes through an MCP server. It supports meeting discovery, detail and transcript retrieval, and search, with JSON output that includes suggested next actions.
Key features
- 01List meetings by date range
- 02Retrieve meeting details and participants
- 03Fetch full meeting transcripts
- 04Search meeting notes
- 05Return JSON with next actions
Use cases
- 01Find meetings within a selected time range
- 02Review meeting summaries and participants
- 03Retrieve or search meeting transcripts
MCP support
The granola CLI connects to the Granola MCP server through mcporter, rather than using a direct API. It wraps tools for meeting search, listing, detail retrieval, and transcript retrieval.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ joelhooks/ joelclaw --skill granolaAfter installing, type/granolain Claude Code to confirm it loaded.
Details
From the project READMEGranola Meeting Intelligence
Access Joel's Granola meeting notes via the granola CLI, which wraps the Granola MCP server through mcporter.
Setup
- Binary:
~/.local/bin/granola - Source:
~/Code/joelhooks/granola-cli - Config:
~/.config/granola-cli/mcporter.json - Transport: MCP via mcporter (NOT direct API, NOT npm package)
- Auth: Uses Granola's local credentials automatically
CLI Commands
List meetings
granola meetings [--range this_week|last_week|last_30_days|custom] [--start YYYY-MM-DD] [--end YYYY-MM-DD]
Get meeting details (summary, participants)
granola meeting <meeting-id>
Get full transcript
granola meeting <meeting-id> --transcript
Search meetings
granola search "<query>"
Check auth/connection
granola --help
Returns "connected": true if MCP transport is working.
Output Format
All commands return agent-first JSON with HATEOAS next_actions:
{
"ok": true,
"command": "granola meetings",
"result": { ... },
"next_actions": [
{ "command": "granola meeting <id>", "description": "Get details" }
]
}
Important Notes
- Timestamps are UTC. Granola returns all dates in UTC. A meeting showing "5:01 PM" on Feb 26 is actually 9:01 AM PST. Always convert when displaying to Joel or writing to Vault files.
- Discover actual access: Use Executor’s saved Granola connection and current integration contract. Historical sandbox EPERM is not a universal capability limit. Start with summaries; raw evidence needs the required scoped drilldown receipt.
Known Limitations
- Rate limiting:
get_meeting_transcriptendpoint rate-limits aggressively. Don't batch transcript pulls — space them out. - Concurrency: Keep concurrency at 1 for transcript fetches. Original concurrency of 3 overwhelmed the API.
- Granola app not required locally: The MCP server handles auth via stored creds, Granola desktop app does NOT need to be running.
MCP Tools (underlying)
The granola CLI wraps these MCP tools:
query_granola_meetings— NL search with citationslist_meetings— by time rangeget_meetings— details by ID arrayget_meeting_transcript— verbatim transcript by ID
Pipeline Integration
When a new meeting is detected, fire an Inngest event:
curl -X POST "http://localhost:8288/e/$EVENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "meeting/noted",
"data": {
"meeting_id": "<id>",
"title": "<title>",
"date": "<YYYY-MM-DD>",
"source": "granola",
"participants": ["Person A", "Person B"]
}
}'
Inngest functions that process meetings:
check/granola-meetings— event-triggered check for new meetingsgranola-check-cron— hourly cron (7 * * * *) polling for new meetingsgranola-backfill— bulk backfill all meetings
Related
- ADR-0055: Granola Meeting Intelligence Pipeline
- Source repo:
~/Code/joelhooks/granola-cli - Inngest functions:
packages/system-bus/src/inngest/functions/check-granola.ts - Meeting analysis:
packages/system-bus/src/inngest/functions/meeting-analyze.ts - Transcript indexing:
packages/system-bus/src/inngest/functions/meeting-transcript-index.ts