Joelclaw granola
Access and process Granola meeting notes and transcripts via the granola CLI (MCP-backed). Use when pulling meeting data, analyzing transcripts, backfilling meetings, or any task involving Granola meeting content.
install
source · Clone the upstream repo
git clone https://github.com/joelhooks/joelclaw
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/joelhooks/joelclaw "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/granola" ~/.claude/skills/joelhooks-joelclaw-granola && rm -rf "$T"
manifest:
skills/granola/SKILL.mdsource content
Granola 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.
- Codex cannot run Granola. The MCP transport (mcporter) requires a local socket that Codex sandboxes can't open (
). Always pull transcripts from pi/gateway sessions, not codex tasks.EPERM
Known Limitations
- Rate limiting:
endpoint rate-limits aggressively. Don't batch transcript pulls — space them out.get_meeting_transcript - 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:
— NL search with citationsquery_granola_meetings
— by time rangelist_meetings
— details by ID arrayget_meetings
— verbatim transcript by IDget_meeting_transcript
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:
— event-triggered check for new meetingscheck/granola-meetings
— hourly cron (granola-check-cron
) polling for new meetings7 * * * *
— bulk backfill all meetingsgranola-backfill
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