granola
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGranola 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
命令
| Command | Description |
|---|---|
| List all meetings from local cache |
| Show meeting details (by ID prefix or title substring) |
| Get transcript (local cache, falls back to API) |
| Export meeting to Obsidian note (Fathom-compatible format) |
| List meetings via Granola API (may show more than cache) |
| 命令 | 描述 |
|---|---|
| 列出本地缓存中的所有会议 |
| 查看会议详情(通过ID前缀或标题子串) |
| 获取文字稿(优先本地缓存,缓存无数据时回退到API) |
| 将会议导出为Obsidian笔记(兼容Fathom格式) |
| 通过Granola API列出会议(可能显示比缓存更多的内容) |
Options
选项
| Option | Applies to | Description |
|---|---|---|
| list, transcript | Output format (default: text) |
| transcript, export | Skip API fallback, use only cached data |
| export | Obsidian vault path (default: ~/Brains/brain) |
| export | Custom output file path |
| api-list | Max results (default: 50) |
| api-list | Pagination offset |
| 选项 | 适用命令 | 描述 |
|---|---|---|
| list, transcript | 输出格式(默认:text) |
| transcript, export | 跳过API回退,仅使用缓存数据 |
| export | Obsidian库路径(默认:~/Brains/brain) |
| export | 自定义输出文件路径 |
| api-list | 最大结果数(默认:50) |
| api-list | 分页偏移量 |
Examples
示例
List meetings
列出会议
bash
python3 ~/.claude/skills/granola/scripts/granola.py list
python3 ~/.claude/skills/granola/scripts/granola.py list --format jsonbash
python3 ~/.claude/skills/granola/scripts/granola.py list
python3 ~/.claude/skills/granola/scripts/granola.py list --format jsonExport 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 jsonbash
python3 ~/.claude/skills/granola/scripts/granola.py transcript bbeba240
python3 ~/.claude/skills/granola/scripts/granola.py transcript "Подкаст" --format jsonOutput 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:
- Cache file: (currently v6) -- metadata for all meetings, transcripts for active/recent meetings only. The script auto-detects the latest version.
~/Library/Application Support/Granola/cache-v*.json - API token: -- WorkOS bearer token for API calls (auto-refreshed when app is open, ~6h expiry)
~/Library/Application Support/Granola/supabase.json
See for full schema documentation.
references/cache-structure.md该脚本从两个本地源读取数据:
- 缓存文件:(当前为v6版本)——包含所有会议的元数据,仅活跃/近期会议有完整文字稿。脚本会自动检测最新版本。
~/Library/Application Support/Granola/cache-v*.json - API令牌:——用于API调用的WorkOS承载令牌(当应用打开时会自动刷新,有效期约6小时)
~/Library/Application Support/Granola/supabase.json
完整的架构文档请查看。
references/cache-structure.mdKnown 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 (microphone vs system audio). The export assigns the meeting creator to microphone utterances and "Other" to system audio.
source - 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仅提供(麦克风音频vs系统音频)。导出时会将会议创建者分配给麦克风发言,系统音频则标记为“其他”。
source - 笔记/摘要通常为空——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导出相同的前置元数据和文字稿格式,因此下游工具可同时兼容两者