granola

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Granola Meeting Importer

Granola 会议导入工具

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.
查询Granola的本地数据(缓存+API)以列出会议、查看文字稿,并以与Fathom技能相同的格式导出到Obsidian库中。

Prerequisites

前置条件

  • Granola desktop app installed and authenticated (macOS)
  • No additional dependencies required (uses stdlib only)
  • 已安装并完成认证的Granola桌面应用(macOS系统)
  • 无需额外依赖(仅使用标准库)

Usage

使用方法

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

Commands

命令

CommandDescription
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)
命令描述
list
列出本地缓存中的所有会议
show <id>
查看会议详情(通过ID前缀或标题子串)
transcript <id>
获取文字稿(优先本地缓存,缓存无数据时回退到API)
export <id>
将会议导出为Obsidian笔记(兼容Fathom格式)
api-list
通过Granola API列出会议(可能显示比缓存更多的内容)

Options

选项

OptionApplies toDescription
--format text|json
list, transcriptOutput format (default: text)
--local-only
transcript, exportSkip API fallback, use only cached data
--vault <path>
exportObsidian vault path (default: ~/Brains/brain)
--output <path>
exportCustom output file path
--limit <n>
api-listMax results (default: 50)
--offset <n>
api-listPagination offset
选项适用命令描述
--format text|json
list, transcript输出格式(默认:text)
--local-only
transcript, export跳过API回退,仅使用缓存数据
--vault <path>
exportObsidian库路径(默认:~/Brains/brain)
--output <path>
export自定义输出文件路径
--limit <n>
api-list最大结果数(默认:50)
--offset <n>
api-list分页偏移量

Examples

示例

List meetings

列出会议

bash
python3 ~/.claude/skills/granola/scripts/granola.py list
python3 ~/.claude/skills/granola/scripts/granola.py list --format json
bash
python3 ~/.claude/skills/granola/scripts/granola.py list
python3 ~/.claude/skills/granola/scripts/granola.py list --format json

Export to Obsidian

导出到Obsidian

bash
python3 ~/.claude/skills/granola/scripts/granola.py export bbeba240
python3 ~/.claude/skills/granola/scripts/granola.py export "Подкаст"
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
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
---
导出的笔记与Fathom技能格式保持一致,以确保兼容性:
markdown
---
granola_id: <uuid>
title: "Meeting Title"
date: YYYY-MM-DD
participants: ['Name 1', 'Name 2']
duration: HH:MM
source: granola
---

Meeting Title

Meeting Title

Summary

Summary

{AI-generated summary if available}
{AI-generated summary if available}

Notes

Notes

{Markdown notes if available}
{Markdown notes if available}

Transcript

Transcript

Speaker Name: What they said...

Files saved as: `YYYYMMDD-meeting-title-slug.md`
Speaker Name: What they said...

文件保存格式为:`YYYYMMDD-meeting-title-slug.md`

Data Sources

数据源

The script reads from two local sources:
  1. Cache file:
    ~/Library/Application Support/Granola/cache-v*.json
    (currently v6) -- metadata for all meetings, transcripts for active/recent meetings only. The script auto-detects the latest version.
  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.
该脚本从两个本地源读取数据:
  1. 缓存文件
    ~/Library/Application Support/Granola/cache-v*.json
    (当前为v6版本)——包含所有会议的元数据,仅活跃/近期会议有完整文字稿。脚本会自动检测最新版本。
  2. API令牌
    ~/Library/Application Support/Granola/supabase.json
    ——用于API调用的WorkOS承载令牌(当应用打开时会自动刷新,有效期约6小时)
完整的架构文档请查看
references/cache-structure.md

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.
  • 缓存中的文字稿内容不完整——通常只有最新的活跃会议在本地有完整文字稿,旧会议需要通过API获取。
  • 无逐句发言者名称——Granola仅提供
    source
    (麦克风音频vs系统音频)。导出时会将会议创建者分配给麦克风发言,系统音频则标记为“其他”。
  • 笔记/摘要通常为空——Granola在服务器端存储丰富内容,本地缓存仅存存根。API对于个人(非工作区)文档也会返回空内容。
  • 令牌过期——如果Granola应用近期未打开,令牌可能已过期,打开应用即可刷新。

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
  • transcript-analyzer:导出后,可对输出文件运行transcript-analyzer进行深度分析
  • Fathom技能:Granola导出使用与Fathom导出相同的前置元数据和文字稿格式,因此下游工具可同时兼容两者