| name | granola-local-dev-loop |
| description | Access Granola meeting data programmatically for developer workflows.
Use when reading notes from the local cache, building MCP integrations,
extracting action items into code, or syncing meeting outcomes to dev tools.
Trigger: "granola dev workflow", "granola MCP", "granola local cache",
"granola developer", "granola programmatic".
|
| allowed-tools | Read, Write, Edit, Bash(curl:*), Bash(jq:*), Bash(python3:*), Grep |
| version | 1.13.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","granola","workflow","developer"] |
| compatibility | Designed for Claude Code, also compatible with Codex and OpenClaw |
Granola Local Dev Loop
Overview
Access Granola meeting data programmatically using three methods: the local cache file (zero-auth, offline), the MCP server (AI agent integration), or the Enterprise API (workspace-wide access). Build developer workflows that turn meeting outcomes into code tasks, documentation, and project artifacts.
Prerequisites
- Granola installed with meetings captured
- Node.js 18+ or Python 3.10+ for scripts
- For MCP: Claude Code, Cursor, or another MCP-compatible client
- For Enterprise API: Business/Enterprise plan + API key
Instructions
Step 1 — Read the Local Cache (Zero Auth)
Granola stores meeting data in a local JSON cache file:
CACHE_FILE="$HOME/Library/Application Support/Granola/cache-v3.json"
ls -lh "$CACHE_FILE"
The cache has a double-JSON structure (JSON string inside JSON):
"""Extract meetings from Granola local cache."""
import json
from pathlib import Path
CACHE_PATH = Path.home() / "Library/Application Support/Granola/cache-v3.json"
def load_granola_cache():
raw = json.loads(CACHE_PATH.read_text())
state = json.loads(raw) if isinstance(raw, str) else raw
data = state.get("state", state)
return {
"documents": data.get("documents", {}),
"transcripts": data.get("transcripts", {}),
"meetings_metadata": data.get("meetingsMetadata", {}),
}
cache = load_granola_cache()
docs = cache[]
()
doc_id, doc (docs.items(),
key= x: x[].get(, ),
reverse=)[:]:
()