Skip to content
Back to skills

Granola

ASecurity

This skill should be used when importing, listing, or exporting Granola meeting recordings and transcripts. Queries Granola's local cache and API to list meetings, extract transcripts, and export to Obsidian notes in Fathom-compatible format.

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 7, 2026
documentationpythonbashapidocumentation

Works with

  • api

Security analysis

A100/100

Pro scans all 13 files and shows the line behind each finding

Scanned September 7, 2026

npx -y skills add levalencia/agent-god-mode --skill granola --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Granola?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Granola
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/levalencia-granola/badge)](https://www.skillsdirectory.com/skills/levalencia-granola)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: granola
description: This skill should be used when importing, listing, or exporting Granola meeting recordings and transcripts. Queries Granola's local cache and API to list meetings, extract transcripts, and export to Obsidian notes in Fathom-compatible format.
---

# Granola Meeting Importer

Query Granola's local data (cache + API) to list meetings, view transcripts, and export to Obsidian vault in the same format as the Fathom skill.

## Prerequisites

- Granola desktop app installed and authenticated (macOS)
- No additional dependencies required (uses stdlib only)

## Usage

```bash
python3 ~/.claude/skills/granola/scripts/granola.py <command> [options]
```

### Commands

| Command | Description |
|---------|-------------|
| `list` | List all meetings from local cache |
| `show <id>` | Show meeting details (by ID prefix or title substring) |
| `transcript <id>` | Get transcript (local cache, falls back to API) |
| `export <id>` | Export meeting to Obsidian note (Fathom-compatible format) |
| `api-list` | List meetings via Granola API (may show more than cache) |

### Options

| Option | Applies to | Description |
|--------|-----------|-------------|
| `--format text\|json` | list, transcript | Output format (default: text) |
| `--local-only` | transcript, export | Skip API fallback, use only cached data |
| `--vault <path>` | export | Obsidian vault path (default: ~/Brains/brain) |
| `--output <path>` | export | Custom output file path |
| `--limit <n>` | api-list | Max results (default: 50) |
| `--offset <n>` | api-list | Pagination offset |

## Examples

### List meetings
```bash
python3 ~/.claude/skills/granola/scripts/granola.py list
python3 ~/.claude/skills/granola/scripts/granola.py list --format json
```

### Export to Obsidian
```bash
python3 ~/.claude/skills/granola/scripts/granola.py export bbeba240
python3 ~/.claude/skills/granola/scripts/granola.py export "Подкаст"
```

### Get transcript
```bash
python3 ~/.claude/skills/granola/scripts/granola.py transcript bbeba240
python3 ~/.claude/skills/granola/scripts/granola.py transcript "Подкаст" --format json
```

## Output Format

Exported notes match Fathom skill format for consistency:

```markdown
---
granola_id: <uuid>
title: "Meeting Title"
date: YYYY-MM-DD
participants: ['Name 1', 'Name 2']
duration: HH:MM
source: granola
---

# Meeting Title

## Summary
{AI-generated summary if available}

## Notes
{Markdown notes if available}

## Transcript
**Speaker Name**: What they said...
```

Files saved as: `YYYYMMDD-meeting-title-slug.md`

## Data Sources

The script reads from two local sources:

1. **Cache file**: `~/Library/Application Support/Granola/cache-v4.json` -- metadata for all meetings, transcripts for active/recent meetings only
2. **API token**: `~/Library/Application Support/Granola/supabase.json` -- WorkOS bearer token for API calls (auto-refreshed when app is open, ~6h expiry)

See `references/cache-structure.md` for full schema documentation.

## Known Limitations

- **Transcript content is sparse in cache** -- only the most recent/active meeting typically has a full transcript locally. Older ones require API fetch.
- **No per-utterance speaker names** -- Granola only provides `source` (microphone vs system audio). The export assigns the meeting creator to microphone utterances and "Other" to system audio.
- **Notes/summaries often empty** -- Granola stores rich content server-side; the local cache has stubs. The API also returns empty for personal (non-workspace) docs.
- **Token expiry** -- if the Granola app hasn't been open recently, the token may be expired. Open the app to refresh.

## Integration

- **transcript-analyzer**: After export, run transcript-analyzer on the output file for deeper analysis
- **Fathom skill**: Granola exports use the same frontmatter and transcript format as Fathom exports, so downstream tools work with both

Files in this skill

  • SKILL.md3.8 KB
  • references/cache-structure.md3.5 KB
  • scripts/granola.py14.7 KB
  • scripts/tests/fixtures/cache_object_state.json811 B
  • scripts/tests/fixtures/cache_string_state.json1 KB
  • scripts/tests/test_cmd_export.py1.2 KB
  • scripts/tests/test_cmd_list.py1 KB
  • scripts/tests/test_cmd_show.py1.3 KB
  • scripts/tests/test_compute_duration.py724 B
  • scripts/tests/test_extract_calendar_times.py915 B
  • scripts/tests/test_extract_people.py1.1 KB
  • scripts/tests/test_format_time.py427 B
  • scripts/tests/test_load_cache.py878 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…