Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add tonydzi/second-brain-starter-kit --skill granola-syncgit clone --depth 1 https://github.com/tonydzi/second-brain-starter-kitWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/tonydzi/second-brain-starter-kit/granola-sync)<a href="https://agentmods.dev/skills/tonydzi/second-brain-starter-kit/granola-sync"><img src="https://agentmods.dev/badge/skills/tonydzi/second-brain-starter-kit/granola-sync/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/tonydzi/second-brain-starter-kit/granola-sync"><img src="https://agentmods.dev/badge/skills/tonydzi/second-brain-starter-kit/granola-sync.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00067 | $0.01304 |
| Opus 5.5 | $0.00027 | $0.00522 |
| Sonnet 5.5 | $0.00013 | $0.00261 |
| Haiku 4.5 | $0.00007 | $0.00130 |
Grade A, and why
granola-sync scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 49 lines — stays where its author put it; the contents beside it link to each section on GitHub.
OBJECTIVE: Incrementally pull fresh meetings/calls from Granola into the vault (summary + full transcript + participants + a calendar match), on demand. Idempotent: the script downloads only what is new or changed (state.json: note id → updated_at).
CONTEXT:
- Transport: the official Granola public API
https://public-api.granola.ai/v1(List Notes / Get Note ?include=transcript; page_size <= 30; 5 rps). Key:%WORKDIR%\secrets\granola.env(account [email protected], Workspace2, scopes personal+public, created 2026-07-02). - ⛔ The MCP transport is NO LONGER used for syncing (browser OAuth, it dies after ~10 days) — only for interactive questions, and only if re-authorized.
- Engine (all the logic lives there, this skill is a thin wrapper):
$IMPORTS_ROOT/granola/granola_pull.py. The same script does both backfill and increment. - Home for notes:
$OBSIDIAN_VAULT/04-Projects/granola-meetings/(auto_generated: true — never hand-edit, they get overwritten). Raw JSON:_imports\granola\raw\. Nightly task log:_imports\granola\pull.log. - ⚠️ Granola does NOT start recording by itself: it records only when a human opens the note or clicks the notification. "The app is running" is not "it is recording".
STEPS:
- BACKUP FIRST ([[vault-backup-rule]]):
python $IMPORTS_ROOT/vault_backup.pyBEFORE running anything. - Run it:
python $IMPORTS_ROOT/granola/granola_pull.py(options:--dryto count without writing,--limit Nto cap). - Read the stdout counters:
DONE new=X updated=Y errors=Z state_total=N. errors>0 → look into it; usually network or 429 (the script retries by itself). - If new>0 — report the list of fresh meetings (titles/dates from the state or the new files).
- Distill (if new>0):
python $IMPORTS_ROOT/granola/call_distill.py— it breaks each new call into Commitments/Facts/Objections/Alpha with quotes →04-Projects\granola-meetings\_distilled\+commitments.jsonl. Counters:DONE distilled=M commitments=C errors=Z. (The nightly twin is the "Granola Call Distill" task at 03:50; it also eats the Fireflies raw files.) - The RAG reindex picks it up overnight ([[reindex-routine]]); after the FIRST big backfill, run
python $IMPORTS_ROOT/brain_embed_update.pymanually. ⚠️_distilledis not in the curated index yet (04-Projects is the evidence layer) — closed by task RUSL-1 (layer: essence).
CONSTRAINTS:
- Windows cp1252: do not print non-ASCII to stdout (the script is already ASCII-only).
- INCREMENTAL ONLY — never delete state.json (it would re-download everything).
- Provenance: origin: mixed, authored_by: hybrid — NOT #anton-original (someone else's speech).
- Tier-2: nothing goes outside; API reads and vault writes only.
- A 401/403 from the API means the key was revoked: create a new one in the Granola desktop app (Settings → Connectors → Personal API keys, scopes Personal+Public) and update granola.env. I can do this myself through computer-use (verified 2026-07-02).
OUTPUT: the new/updated/errors counters + the period; if empty, "no new meetings". Finish with an "In plain words" recap.
RELATION (do not duplicate): the Fireflies rail (auto-recording, real speaker names) = skill [[fireflies-sync]]; access and history = memory [[granola-mcp-integration]]; the architecture decision = the vault note decision-granola-extraction-official-api; the post-call follow-up SOP = memory [[call-followup-group-sop]] (a separate pipeline); the FAAA sync goes the other way (finished follow-ups out of Telegram).
Like this skill? It is part of second-brain-starter-kit: the second brain we built for ourselves and run every day at Palo Alto AI Research Lab. Install the whole set with npx skills add tonydzi/second-brain-starter-kit. Everything is open source and free, so take what you need.
Flagships worth a look on their own: secondop-panel (a second opinion from a panel of external models), claude-memory-tidy (stop your agent's memory from rotting), telegram-mcp-kit (your own Telegram over MCP in about 15 minutes).
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago Changed 089f0283d625
- 15d ago Changed · -1 lines 9b40b3ce284c
- 19d ago Changed · +16 lines · -46 tokens per session 522c43c8b96b
- 28d ago Changed · -19 lines · +46 tokens per session 9cb426e15872
- 1mo ago Changed · +1 lines · -9 tokens per session 50573751a95f
- 1mo ago First seen · 52 lines · 76 tokens per session scan A 4de8a56b324b
granola-sync is a skill published in the GitHub repository tonydzi/second-brain-starter-kit (12 stars, last pushed 3d ago), licensed MIT. It adds 67 tokens to every session and 1,304 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
setup-vault-types
Use when configuring which document types a vault tracks: after installing ai-brain-starter, when a new kind of note appears (journals, books, meetings, clients, podcasts, travel, WhatsApp/Slack/iMessage exports), when extraction skips files because no extractor matches their type, or to add, list, or remove a custom…
ingest-health
Use when the user says /ingest-health, asks to import, sync, ingest, or load Apple Health / Apple Watch / HealthKit data, has a fresh export.zip from the iPhone Health app, a Simple Health Export CSV folder, or a Health Auto Export TCP live feed, or when health-mcp queries return empty because no data was ever…
superbrain-distill
Internal SuperBrain skill — run by the detached capture child to distill a session-event delta into routed Obsidian notes. Not for direct user invocation.
email-sorting
Customize and use a human-reviewed email sorting system for Gmail, Google Workspace, Outlook, Microsoft 365 or another connected mailbox. Use for first-time setup, folder or label recommendations from a read-only email sample, inbox triage, and applying approved sorting batches. Not for sending, replying to or…
ingest
A tool for adding a URL, file, text, or Inbox item to the LLM Wiki. It checks the material's purpose, preserves the original source, compiles a wiki page, updates indexes and logs, and reviews the result.
inbox
An inbox-management skill for scanning an LLM Wiki inbox, previewing pending files, choosing how to process them, and sending selected material through an import step.