skills/granola/SKILL.md
Query the Granola API for full meeting notes, AI summary panels, and transcripts beyond the 3-transcript local cache window. Use when the user asks about meeting content, sentiment/praise mining, decisions, or testimonials from any past meeting — not just recent ones. Triggered by phrases like "what did Tom say", "find quotes from Sam", "praise from <client>", "what was decided in <meeting>", "pull the transcript for <date>", or any cross-meeting analysis where the local cache is too thin.
npx skillsauth add rdfitted/claude-code-setup granolaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Wraps Granola's private REST API to read meeting documents, AI-generated summary panels, and full audio transcripts directly from the server — bypassing the local cache-v6.json which only retains ~3 transcripts at a time.
/client-meetings returned "transcript not cached" or notes were emptyDo not use for the 3 most-recently-cached transcripts — /client-meetings reads them from cache-v6.json directly without an API roundtrip.
Uses the WorkOS access token from Granola's local app data (Granola desktop app must be installed and logged in). The Cognito token is rejected. The required client header is X-Client-Version: 6.4.0.
Recent Granola builds encrypt the token store as %APPDATA%/Granola/supabase.json.enc (the plain supabase.json is left behind and goes stale). The script transparently decrypts the .enc file using the per-install DEK from storage.dek, which is wrapped with the Chromium os_crypt master key from Local State (DPAPI-protected on Windows). Plain supabase.json is still used as a fallback if no .enc file exists.
Requires (Windows): pip install -r ~/.claude/skills/granola/scripts/requirements.txt (cryptography + pywin32).
If auth-check fails with 401, the token has expired — open the Granola desktop app to refresh, then retry.
All operations go through scripts/granola_api.py. Run from any cwd.
# Verify auth
python ~/.claude/skills/granola/scripts/granola_api.py auth-check
# List meetings for a client (slug from CLIENTS index: tog | gvb | ubs | scattered-ashes-maui | totum)
python ~/.claude/skills/granola/scripts/granola_api.py list-meetings ubs --limit 20 --since 2026-01-01
# Fetch the AI summary panel for a single meeting
python ~/.claude/skills/granola/scripts/granola_api.py panels <doc-id>
# Fetch the full transcript for a single meeting (microphone = Ryan, system = others)
python ~/.claude/skills/granola/scripts/granola_api.py transcript <doc-id>
# MINE SENTIMENT across many meetings — pulls transcripts for matching docs and surfaces
# positive turns from non-Ryan voices, with Ryan's preceding turn for context
python ~/.claude/skills/granola/scripts/granola_api.py mine-sentiment ubs --limit 10 --since 2026-01-01 --out output/ubs-sentiment.md
--limit caps how many meetings get transcribed (each transcript fetch is a separate API call — be polite). Default is 10.
Hardcoded inside the script. Update there if folders change:
| Slug | Granola folder ID | |---|---| | tog | dc1f2066-591a-4d12-83f1-89308a5086a2 | | gvb | 3fe358e9-0766-424b-8633-5b5d28fdc3ec | | ubs | 80697bb3-3533-48d5-b3f2-a8c4771a072e | | scattered-ashes-maui | edc01423-0020-4e41-a9ee-196c262a65e6 | | totum | c6e71316-151c-42e2-824b-87d154d591a1 |
mine-sentiment writes a Markdown file (default output/<slug>-sentiment-<date>.md) grouped by meeting, with:
After running mine-sentiment, the natural follow-up is appending the surfaced quotes to ~/.ai-docs/wiki/clients/<slug>.md under a "Client Sentiment — Positive Signals" section, then logging the add in ~/.ai-docs/wiki/log.md. See existing TOG/GVB pages for the format.
POST https://api.granola.ai/v2/get-documents {limit, offset, doc_ids?}
POST https://api.granola.ai/v1/get-document-transcript {document_id}
POST https://api.granola.ai/v1/get-document-panels {document_id}
Required headers: Authorization: Bearer <workos.access_token>, X-Client-Version: 6.4.0, Content-Type: application/json, Accept-Encoding: gzip.
development
Restore from the Kopia backup repo in one of two opinionated modes. **wikis** (frequent, default) syncs per-project `.ai-docs/` directories from backup to local project trees — used to move compound-knowledge wikis between machines via the backup drive as sneakernet. **full** (rare) restores all sources to original paths for greenfield machine rebuild. Use when the user says "restore wikis", "sync wikis from backup", "pull the wikis", "I plugged in the backup drive on this machine", "rebuild this machine", "greenfield restore", or "restore everything". For ad-hoc single-file restores, use `backup-ops restore` instead.
documentation
# /bp-iterate Iterate the Fitted Business Plan(s). Manages the **internal canonical** and the **external partner/investor variant**, snapshot-on-version-bump lineage, redaction enforcement between variants, and cross-document coupling. ## When this runs - User says `/bp-iterate`, "iterate the BP," "bump the BP," "update the business plan," "version up the BP," "create / update / refresh the external variant" - A material trigger fires per the BP's own Iteration Log (first 2 new closes / fundi
tools
Run Kopia-based backups of key Windows files and config to an external drive. Use when the user says "back up", "run a backup", "snapshot", "the backup drive is plugged in", or wants to set up / configure backups for the first time. Handles initial repo setup, drive detection by volume label, source enumeration, and snapshot creation with structured exclusions.
testing
Secondary backup operations against the Kopia repo — verify integrity, run maintenance/prune, mirror to a second destination, restore files/folders, or run a quick top-up snapshot of hot directories. Use when the user says "verify backups", "check backup integrity", "prune old snapshots", "restore from backup", "mirror backups to cloud", "quick backup", "top up the backup", or asks about backup health. For the primary backup run, use the `backup` skill instead.