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.svg" alt="Measured on agentmods" 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.00076 | $0.01201 |
| Opus 5 | $0.00038 | $0.00600 |
| Sonnet 5 | $0.00015 | $0.00240 |
| Haiku 4.5 | $0.00008 | $0.00120 |
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 7d 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 — 52 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).
About & contact
Built and battle-tested at Palo Alto AI Research Lab — a fleet of Claude Code machines running 24/7 as a second brain and synthetic cofounder. Every skill here survived real production use before publication.
- 📦 All 101 skills: https://github.com/tonydzi/second-brain-starter-kit
- 👤 Author: Anton Dziatkovskii — Telegram @tonydzi · WhatsApp +1 341 222 9178 · X @Tony_Stef_
- 🧪 Engineers: want to test-drive this setup? Message me — I hand out free starter seeds to engineers who test and report back. Custom skill requests welcome.
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.
- 7d 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 (5 stars, last pushed 8d ago), licensed MIT. It adds 76 tokens to every session and 1,201 once invoked, about $0.0004 per session on Opus 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.
query
Interactive knowledge assistant via Telegram. Can read, create, and modify documents. Destructive actions require user approval.
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.