GR

granola-local-dev-loop

Enables programmatic access to Granola meeting notes via local cache files or MCP servers for custom developer workflows.

Install

mkdir -p .claude/skills/granola-local-dev-loop && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/7751" && unzip -o skill.zip -d .claude/skills/granola-local-dev-loop && rm skill.zip

Installs to .claude/skills/granola-local-dev-loop

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Access Granola meeting data programmatically for developer workflows.
69 charsno explicit “when” trigger
Intermediate

Key capabilities

  • Read meeting data from local cache
  • Set up Granola MCP server
  • Extract action items from notes
  • Sync meeting outcomes to project documentation
  • Integrate meeting references into Git commits
  • List recent meetings from local cache

How it works

The skill accesses Granola meeting data from a local JSON cache file or through an MCP server integration. It provides scripts to extract information like action items and sync them with development tools or documentation.

Inputs & outputs

You give it
Granola local cache file or MCP server connection
You get back
Meeting data, extracted action items, or synced project documentation

When to use granola-local-dev-loop

  • Extract meeting data from local cache
  • Build MCP integrations for Granola
  • Sync meeting outcomes to project tools
  • Convert meeting insights into code tasks

About this skill

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:

# macOS cache location
CACHE_FILE="$HOME/Library/Application Support/Granola/cache-v3.json"

# Check if cache exists and get size
ls -lh "$CACHE_FILE"

The cache has a double-JSON structure (JSON string inside JSON):

#!/usr/bin/env python3
"""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())
    # Cache contains a JSON string that needs secondary parsing
    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["documents"]
print(f"Found {len(docs)} meetings in local cache")

# List recent meetings
for doc_id, doc in sorted(docs.items(),
                          key=lambda x: x[1].get("updated_at", ""),
                          reverse=True)[:10]:
    print(f"  {doc.get('title', 'Untitled')} — {doc.get('updated_at', 'N/A')}")

Step 2 — Set Up Granola MCP Server

Granola's official MCP integration connects meeting context to AI tools:

// claude_desktop_config.json or .mcp.json
{
  "mcpServers": {
    "granola": {
      "command": "npx",
      "args": ["-y", "granola-mcp-server"]
    }
  }
}

With MCP connected, Claude Code and Cursor can:

  • Search across all your meetings by topic or person
  • Pull context from specific meetings into coding sessions
  • Create tickets based on discussed bugs or features
  • Scaffold code based on architectural decisions from meetings

Community MCP servers with additional features:

  • pedramamini/GranolaMCP — CLI + programmatic + MCP access, reads local cache
  • mishkinf/granola-mcp — semantic search with LanceDB vector embeddings
  • proofgeist/granola-mcp-server — lightweight local cache reader

Step 3 — Extract Action Items to Dev Tools

#!/usr/bin/env python3
"""Extract action items from Granola notes and create GitHub issues."""
import json, re, subprocess
from pathlib import Path

def extract_action_items(note_content: str) -> list[dict]:
    """Parse action items from enhanced Granola notes."""
    items = []
    # Matches: - [ ] @person: task description
    pattern = r'- \[ \] @?(\w+):?\s+(.+)'
    for match in re.finditer(pattern, note_content):
        items.append({
            "assignee": match.group(1),
            "task": match.group(2).strip(),
        })
    return items

def create_github_issue(repo: str, title: str, body: str, assignee: str):
    """Create a GitHub issue using gh CLI."""
    cmd = [
        "gh", "issue", "create",
        "--repo", repo,
        "--title", title,
        "--body", body,
        "--assignee", assignee,
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode == 0:
        print(f"  Created: {result.stdout.strip()}")
    else:
        print(f"  Error: {result.stderr.strip()}")

# Usage with cache data
cache = load_granola_cache()  # from Step 1
for doc_id, doc in cache["documents"].items():
    content = doc.get("last_viewed_panel", {})
    # ProseMirror content needs text extraction
    text = json.dumps(content)  # simplified — parse nodes for production
    actions = extract_action_items(text)
    for action in actions:
        print(f"[{action['assignee']}] {action['task']}")

Step 4 — Sync Meeting Outcomes to Project Docs

#!/bin/bash
set -euo pipefail
# Sync latest Granola meeting notes to project documentation

NOTES_DIR="$HOME/dev/meeting-notes"
mkdir -p "$NOTES_DIR"

# Extract recent meeting titles and dates using Python
python3 -c "
import json
from pathlib import Path

cache_path = Path.home() / 'Library/Application Support/Granola/cache-v3.json'
if cache_path.exists():
    raw = json.loads(cache_path.read_text())
    state = json.loads(raw) if isinstance(raw, str) else raw
    data = state.get('state', state)
    docs = data.get('documents', {})
    for doc_id, doc in sorted(docs.items(),
                              key=lambda x: x[1].get('updated_at', ''),
                              reverse=True)[:5]:
        title = doc.get('title', 'Untitled').replace(' ', '-').lower()
        date = doc.get('created_at', 'unknown')[:10]
        print(f'{date}_{title}')
"

Step 5 — Git Integration Pattern

Reference Granola meetings in commits and PRs:

# Reference meeting in commit message
git commit -m "feat: implement user onboarding flow

Per meeting 2026-03-22 'Sprint Planning Q1':
- Agreed on 3-step wizard approach
- Sarah approved the design mockups
- Due by April 15

Action items from Granola note: [link]"

Output

  • Local cache accessible for offline meeting data reads
  • MCP server connected for AI-assisted meeting context
  • Action item extraction pipeline ready
  • Meeting-to-dev-tools sync established

Error Handling

ErrorCauseFix
Cache file not foundGranola not installed or never launchedInstall Granola and capture at least one meeting
JSON parse errorDouble-JSON structure not handledParse the outer string first, then parse the inner object
MCP server not connectingWrong config pathVerify claude_desktop_config.json location for your OS
Empty transcriptsTranscript stored separately from documentCheck cache["transcripts"] keyed by document ID
Stale cache dataCache not refreshedRestart Granola to force cache update

Resources

Next Steps

Proceed to granola-sdk-patterns for Zapier automation workflows.

When not to use it

  • When Granola is not installed
  • When meeting data is not stored locally
  • When not building developer workflows

Prerequisites

Granola installed with meetings capturedNode.js 18+ or Python 3.10+ for scriptsFor MCP: Claude Code, Cursor, or another MCP-compatible clientFor Enterprise API: Business/Enterprise plan + API key

Limitations

  • Cache file not found if Granola is not installed or launched
  • JSON parse error if double-JSON structure is not handled
  • MCP server not connecting if config path is wrong

How it compares

This skill enables programmatic access and integration of Granola meeting data into developer workflows, which is different from using the Granola UI.

Compared to similar skills

granola-local-dev-loop side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
granola-local-dev-loop (this skill)127dReviewIntermediate
diary03moReviewAdvanced
audio-transcription05moReviewBeginner
telegram-bot-builder1066moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

More by jeremylongshore

View all by jeremylongshore

analyzing-logs

jeremylongshore

Analyze application logs to detect performance issues, identify error patterns, and improve stability by extracting key insights.

14123

ollama-setup

jeremylongshore

Configure auto-configure Ollama when user needs local LLM deployment, free AI alternatives, or wants to eliminate hosted API costs. Trigger phrases: "install ollama", "local AI", "free LLM", "self-hosted AI", "replace OpenAI", "no API costs". Use when appropriate context detected. Trigger with relevant phrases based on skill purpose.

1167

backtesting-trading-strategies

jeremylongshore

Backtest crypto and traditional trading strategies against historical data. Calculates performance metrics (Sharpe, Sortino, max drawdown), generates equity curves, and optimizes strategy parameters. Use when user wants to test a trading strategy, validate signals, or compare approaches. Trigger with phrases like "backtest strategy", "test trading strategy", "historical performance", "simulate trades", "optimize parameters", or "validate signals".

1071

generating-database-seed-data

jeremylongshore

Process this skill enables AI assistant to generate realistic test data and database seed scripts for development and testing environments. it uses faker libraries to create realistic data, maintains relational integrity, and allows configurable data volumes. u... Use when working with databases or data models. Trigger with phrases like 'database', 'query', or 'schema'.

1033

cursor-codebase-indexing

jeremylongshore

Execute set up and optimize Cursor codebase indexing. Triggers on "cursor index setup", "codebase indexing", "index codebase", "cursor semantic search". Use when working with cursor codebase indexing functionality. Trigger with phrases like "cursor codebase indexing", "cursor indexing", "cursor".

885

testing-mobile-apps

jeremylongshore

Execute mobile app testing on iOS and Android devices/simulators. Use when performing specialized testing. Trigger with phrases like "test mobile app", "run iOS tests", or "validate Android functionality".

810

You might also like

diary

Anhvu1107

ALWAYS use this when the request matches Diary: Unified Diary System: A context-preserving automated logger for multi-project development.

00

audio-transcription

matthewkeilbot

Transcribe inbound audio clips to text using local Whisper (faster-whisper). Use when the user sends voice notes/audio files and asks what was said, asks for transcript/summary/action items, or asks to process audio privately on-host. Default model is small.en for better English accuracy on constrai

00

telegram-bot-builder

davila7

Expert in building Telegram bots that solve real problems - from simple automation to complex AI-powered bots. Covers bot architecture, the Telegram Bot API, user experience, monetization strategies, and scaling bots to thousands of users. Use when: telegram bot, bot api, telegram automation, chat bot telegram, tg bot.

106130

codex-cli-bridge

alirezarezvani

Bridge between Claude Code and OpenAI Codex CLI - generates AGENTS.md from CLAUDE.md, provides Codex CLI execution helpers, and enables seamless interoperability between both tools

9180

code-to-music

Cam10001110101

Tools, patterns, and utilities for creating music with code. Output as a .mp3 file with realistic instrument sounds. Write custom compositions to bring creativity to life through music. This skill should be used whenever the user asks for music to be created. Never use this skill for replicating songs, beats, riffs, or other sensitive works. The skill is not suitable for vocal/lyrical music, audio mixing/mastering (reverb, EQ, compression), real-time MIDI playback, or professional studio recording quality.

17164

jianying-editor

luoluoluo22

剪映 (JianYing) AI自动化剪辑的高级封装 API (JyWrapper)。提供开箱即用的 Python 接口,支持录屏、素材导入、字幕生成、Web 动效合成及项目导出。

38110

Search skills

Search the agent skills registry