with one click
cache-notes
// Fetch & embed AI transcripts as Obsidian callouts. Args: <path>, all, refresh <path>. Prompts for URLs if empty.
// Fetch & embed AI transcripts as Obsidian callouts. Args: <path>, all, refresh <path>. Prompts for URLs if empty.
Extract clean markdown content from web pages using Defuddle CLI, removing clutter and navigation to save tokens. Use instead of WebFetch when the user provides a URL to read or analyze, for online documentation, articles, blog posts, or any standard web page.
Resolve and fill Participants frontmatter + link unlinked names in body. Args: <path>, all.
Create and edit JSON Canvas files (.canvas) with nodes, edges, groups, and connections. Use when working with .canvas files, creating visual canvases, mind maps, flowcharts, or when the user mentions Canvas files in Obsidian.
Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian.
Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more. Also supports plugin and theme development with commands to reload plugins, run JavaScript, capture errors, take screenshots, and inspect the DOM. Use when the user asks to interact with their Obsidian vault, manage notes, search vault content, perform vault operations from the command line, or develop and debug Obsidian plugins and themes.
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes.
| name | cache-notes |
| description | Fetch & embed AI transcripts as Obsidian callouts. Args: <path>, all, refresh <path>. Prompts for URLs if empty. |
| license | MIT |
| compatibility | Requires qmd (CLI or MCP) and gws CLI for Google Docs/Drive (read-only). See [google-workspace-cli](../_shared/google-workspace-cli.md). |
/cache-notes all โ Scan all meetings with Notes: links that haven't been cached yet, fetch and embed them./cache-notes <path> โ Cache notes for a specific meeting file./cache-notes refresh <path> โ Re-fetch and overwrite existing cached content for a file.If the target file has an empty Notes: property (no URLs yet), prompt the user to paste the external resource URLs (Google Docs, Otter.ai, etc.). Add them to the Notes: frontmatter, then proceed with fetching and caching as normal.
External meeting resources (Google Docs, Otter.ai) linked in frontmatter Notes: are fetched, parsed by provider, and embedded as collapsible Obsidian callouts directly in the meeting note. A NotesCached: frontmatter timestamp marks the file as cached.
Before caching:
Notes:
- https://docs.google.com/document/d/{id}/edit?tab=t.{tab}
- https://otter.ai/u/{id}
After caching:
Notes:
- https://docs.google.com/document/d/{id}/edit?tab=t.{tab}
- https://otter.ai/u/{id}
NotesCached: 2026-02-25T15:00:00-06:00
Notes:.gws in the terminal to fetch the document (read-only). See google-workspace-cli for exact commands.gws docs documents get with includeTabsContent: true and parse the JSON into text (optionally inserting --- TAB: โฆ --- separators from tab titles), or gws drive files export with mimeType: text/plain for a simpler single stream. Parsed content should mirror the old tab layout where needed: --- TAB: Notes ---, --- TAB: Transcript ---.Gemini notes have a consistent structure. Parse into three sections:
| Section | Starts after | Ends before | Callout |
|---|---|---|---|
| Summary + Details | Summary heading | Suggested next steps heading | [!gemini_notes] |
| Suggested next steps | Suggested next steps heading | Gemini disclaimer footer | [!gemini_todos] |
| Transcript | --- TAB: Transcript --- | End of content | [!gemini_transcript] |
Strip the Gemini disclaimer footer โ lines starting with "You should review Gemini's" or "Please provide feedback" are noise. Do not include them.
All cached content goes under a top-level ## ๐ค AI Notes section appended after frontmatter. Each provider gets its own ### {Provider} subsection. Callouts are nested under the provider heading.
## ๐ค AI Notes
### Gemini
> [!gemini_notes]- Summary & Details
> ### Summary
> {summary text}
>
> ### Details
> {details as bullet points}
> [!gemini_todos]- Suggested Next Steps
> - {next step 1}
> - {next step 2}
> [!gemini_transcript]- Transcript
> {transcript content, if available}
### Otter
> [!otter_notes]- Summary & Details
> ...
Formatting rules for callout content:
> .- after the callout type (e.g. [!gemini_notes]-) โ this makes it collapsed by default in Obsidian.> prefix) to separate them.[!gemini_transcript] callout entirely.## AI Transcripts heading is created once. Provider subsections are added beneath it.--- and ## AI Transcripts, preserve it. Always append ## AI Transcripts at the end of the file.Status: TBD โ Otter.ai has no API/MCP integration. For now, skip Otter links silently. When available, the structure will mirror Gemini with
[!otter_notes]-,[!otter_todos]-,[!otter_transcript]-.
/cache-notes <path>)Notes: links and NotesCached:.Notes: is empty or absent, prompt the user to paste the external resource URL(s). Add them to the Notes: frontmatter property using StrReplace, then continue.NotesCached: exists and this is not a refresh, inform the user and stop.Notes:, fetch and parse by provider:
gws (see google-workspace-cli), parse into sections per Provider: Gemini.## ๐ค AI Notes after frontmatter --- (see Output Format).NotesCached: in frontmatter to current timestamp./cache-notes all)NotesCached: yet, present them, and let the user select which to process.Before caching, verify that each external resource actually corresponds to the meeting note. This prevents accidentally caching the wrong document when a user pastes an incorrect URL.
created: frontmatter timestampgws drive files get (name field), e.g. "Daily Standup - 2026/02/24 09:43 EST - Notes by Gemini" โ same string you would have seen in older MCP File: lines.YYYY-MM-DD and check equality.
โ ๏ธ Date mismatch for Meetings/PAM/Scrum/2026-02-24.md:
Note date: 2026-02-24
Doc title: "Daily Standup - 2026/02/26 09:41 EST - Notes by Gemini"
Doc date: 2026-02-26
Wrong document? [Continue anyway / Skip this URL / Replace URL]
/cache-notes all or /meeting wrap pending), collect all mismatches and present them together before proceeding, rather than interrupting one by one.See date-filter ยง "Date Parsing" for the full list of recognized formats and ambiguity rules.
Verification is skipped for:
refresh mode (the URL was already verified on first cache)Delegate to /note-status pending --step=cache. That skill handles discovery, frontmatter checks, and the dependency chain (only notes with Notes: containing a supported provider URL are considered actionable for caching). See /note-status ยง Dependency Chain for the full rules.
/cache-notes refresh <path>:
## AI Transcripts section and everything below it.NotesCached: timestamp.See /commit. Skip when called as part of a sequence (e.g. /meeting wrap).
StrReplace for edits, targeting the closing --- of frontmatter as the anchor.Notes: URLs should NOT be modified โ they remain as the canonical source links.NotesCached: is the single indicator that caching was done. No other markers.all mode, process in batches and report progress to the user./fill-participants handles name resolution separately.