关于 meeting-prep
meeting-prep 为即将举行的 Cal.com 预约整理会议准备笔记,结合参与者调研和 Obsidian 中的历史记录。适合需要会前背景、后续事项和笔记状态管理的个人或团队。
主要功能
- 01获取并筛选即将举行的预约
- 02检索 Obsidian 中的会议历史
- 03整理参与者背景调研
- 04生成个人或群组准备笔记
- 05关联会议记录并同步预约状态
- 06查看准备笔记状态及统计
适用场景
- 01为即将与会者准备背景和讨论要点
- 02查找回访对象的过往会议及待办
- 03将会前笔记关联到会议记录
- 04检查取消或改期的预约并更新笔记
MCP 相关
通过 Cal.com MCP 工具读取预约、参与者及其状态。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ glebis/ claude-skills --skill meeting-prep安装后在 Claude Code 中输入/meeting-prep确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
config.yamlresearch-workflow.jsskill.json详细介绍
会议准备
为即将到来的 Cal.com 预约准备全面的会议资料,包括调研参与者并审查 Obsidian 知识库中的历史会话记录。
配置
所有路径和设置都在此文件旁边的 config.yaml 中。执行任何步骤前,请先读取该文件。
# config.yaml — key fields:
vault.root # Obsidian vault root
vault.meetings # Where meeting notes live
vault.people_search_depth # How deep to search for person notes
prep_notes.prefix # Filename prefix (default: "prep")
prep_notes.type_tag # Frontmatter type value (default: "meeting-prep")
calcom.lookahead_days # Default booking lookahead
calcom.timezone # Display timezone
calcom.time_format # 12h or 24h
首次运行时: 读取与此 SKILL.md 文件位于同一目录中的 config.yaml。将 ~ 解析为用户的主目录。以下所有路径引用均使用这些值,切勿硬编码路径。
使用时机
- 用户调用
/meeting-prep - 用户要求为即将举行的会议/会话/通话做准备
- 用户询问“我接下来有哪些安排”或“为我的下一次会话做准备”
参数
- 无参数 → 为接下来
calcom.lookahead_days天内的所有预约做准备 - 日期(
2026-06-03)→ 为该日期的预约做准备 - 姓名(
Greg)→ 仅为有该参与者的预约做准备 tomorrow/today/this week→ 自然日期范围link→ 查找未关联的准备笔记↔会话笔记对并将其关联sync→ 根据 Cal.com 预约状态(已取消、已改期、已删除)核对准备笔记status→ 显示所有准备笔记及其关联状态的 Dataview 风格概览
工作流
步骤 0:加载配置
从技能目录读取 config.yaml。解析所有路径(展开 ~)。将其存储为变量,以供后续步骤使用:
VAULT_ROOT = config.vault.root
MEETINGS_DIR = config.vault.meetings
PEOPLE_DEPTH = config.vault.people_search_depth
PREP_PREFIX = config.prep_notes.prefix
TYPE_TAG = config.prep_notes.type_tag
LOOKAHEAD = config.calcom.lookahead_days
TIMEZONE = config.calcom.timezone
步骤 1:获取预约
通过 ToolSearch 加载 Cal.com MCP 工具(查询:"calcom",max_results:20)。然后:
- 调用
get_bookings,获取目标日期范围内即将到来的预约(状态:accepted) - 对每个预约,调用
get_booking_attendees获取完整的参与者列表——Cal.com 预约可能有多位参与者(例如实验室会话、头脑风暴会、群组通话) - 如果提供了参数(日期、姓名),按参数筛选
- 如果没有找到预约,报告结果并停止
步骤 2:在知识库中搜索会话历史
对于每位不重复的参与者,在 MEETINGS_DIR 中搜索之前的会话笔记:
grep -rl "PARTICIPANT_NAME" $MEETINGS_DIR 2>/dev/null
读取匹配的文件(最近最多 5 个),提取以下信息:
- 每次过往会话的日期和时长
- 讨论的关键主题(来自标题、摘要部分或转录摘录)
- 提及的任何行动项或后续事项
- 会话来源(Fathom、Granola、手动记录)
同时在知识库中搜索此人的笔记:
find $VAULT_ROOT -maxdepth $PEOPLE_DEPTH -name "*PARTICIPANT_NAME*" -not -path "*/Meetings/*" 2>/dev/null
步骤 3:调研参与者(工作流)
使用 Workflow 工具并行开展参与者调研。通过工作流参数传入 MEETINGS_DIR 和 VAULT_ROOT,以便子 Agent 知道搜索位置。
为每位不重复的参与者启动一个 Agent,执行以下操作:
- 网页搜索参与者姓名及其公司/电子邮件域名
- 检查 LinkedIn 个人资料(通过网页搜索,不直接抓取)
- 总结其职位、公司、近期动态和共同背景
- 对于回访参与者:结合知识库历史记录,找出模式和可延续的讨论点
步骤 4:在 Obsidian 中创建准备笔记
根据参与者人数,有两种模式:
- 单人会话(1 位参与者):每场会话创建一篇准备笔记,格式严格如下。文件名:
YYYYMMDD-$PREP_PREFIX-PARTICIPANT_SLUG.md - 群组会话(2 位或更多参与者):为整场会话创建一篇准备笔记。文件名:
YYYYMMDD-$PREP_PREFIX-EVENT_SLUG.md(其中EVENT_SLUG是 Cal.com 活动类型 slug,采用小写 kebab-case 格式)。笔记列出所有参与者及其简要资料,调研部分涵盖所有参与者。
如果该日期和会话已有准备笔记,请更新现有笔记,不要创建重复笔记。
单人会话模板
使用此模板:
---
type: $TYPE_TAG
date: YYYY-MM-DD
participant: "Full Name"
email: [email protected]
event_type: "Cal.com event type name"
duration: X min
time: "HH:MM $TIMEZONE"
zoom_link: "https://..."
status: prep
session_note: ""
tags:
- $TYPE_TAG
- SESSION_TYPE
---
# Prep: Full Name — YYYY-MM-DD
## Session Info
- **Time**: HH:MM–HH:MM $TIMEZONE (Day of week)
- **Type**: Event type name (X min)
- **Location**: Zoom link
- **Participant timezone**: Timezone
## About FIRST_NAME
RESEARCH_SUMMARY
## Previous Sessions (N total)
### Most Recent: YYYY-MM-DD — Event Type
KEY_TOPICS_AND_OUTCOMES
### Earlier Sessions
BRIEF_LIST_WITH_DATES_AND_TOPICS
## Continuity & Follow-ups
- Outstanding action items from previous sessions
- Recurring themes or patterns
- Progress on previously discussed goals
## Prep Ideas
- Conversation starters from research
- Topics to revisit based on session history
- Questions to explore
## Notes
_Space for pre-meeting thoughts and during-meeting notes_
同一参与者的连续预约
当同一参与者在前瞻时间窗口内有多个预约时(例如,6 月 3 日和 6 月 9 日),按日期排序并按以下方式处理:
- 首次预约:使用标准准备笔记,不做更改。
- 第二次及之后的预约:准备笔记应提及之前的会面:
- 在 frontmatter 中添加
prior_prep: "[[YYYYMMDD-prep-participant]]",指向之前的准备笔记 - 在 Session Info 后添加 ## Prior Session 部分:
## Prior Session 与 FIRST_NAME 的会面安排在 PRIOR_DATE——本次会面开始时,该会面已经结束。 请在 PRIOR_DATE 的会面结束后更新此笔记,补充最新背景信息。 - 保留完整的研究/历史部分,但标注为“将在 PRIOR_DATE 后过时”,提醒用户之后重新查看
- 此笔记仍可用于背景研究,但行动事项和后续衔接需要在会面后更新
- 在 frontmatter 中添加
对于首次参与者(知识库中没有历史记录),将“Previous Sessions”和“Continuity”部分替换为:
## First Meeting
No previous sessions found in vault.
## Context & Talking Points
- Research-based conversation starters
- Questions to understand their goals and needs
- How they likely found you / booking context
小组会面模板
对于有 2 位或更多与会者的预约,改用此模板:
---
type: $TYPE_TAG
date: YYYY-MM-DD
participants:
- name: "Full Name 1"
email: [email protected]
- name: "Full Name 2"
email: [email protected]
event_type: "Cal.com event type name"
duration: X min
time: "HH:MM $TIMEZONE"
zoom_link: "https://..."
status: prep
session_note: ""
tags:
- $TYPE_TAG
- SESSION_TYPE
---
# Prep: Event Type Name — YYYY-MM-DD
## Session Info
- **Time**: HH:MM–HH:MM $TIMEZONE (Day of week)
- **Type**: Event type name (X min)
- **Location**: Zoom link
- **Attendees**: N participants
## Attendees
### FIRST_NAME_1 LAST_NAME_1
BRIEF_PROFILE_AND_RESEARCH_SUMMARY
### FIRST_NAME_2 LAST_NAME_2
BRIEF_PROFILE_AND_RESEARCH_SUMMARY
## Previous Sessions per Attendee
SUMMARY_OF_VAULT_HISTORY_PER_ATTENDEE (grouped by person, skip if no history)
## Prep Ideas
- Group dynamics to consider
- Topics to cover with the full group
- Individual follow-ups to weave in
## Notes
_Space for pre-meeting thoughts and during-meeting notes_
第 5 步:报告
创建所有准备笔记后,输出简洁的摘要:
- 已准备会面的列表(日期、时间、参与者、事件类型)
- 关键亮点(标记首次参与者、历史记录中的重要后续事项)
- 创建的准备笔记链接,格式为
[[YYYYMMDD-PREP_PREFIX-participant-slug]]
注意事项
- 显示时间时,始终转换为配置的
TIMEZONE - 参与者研究应保持尊重——仅涉及专业背景
- 如果参与者有许多过往会面(>5),重点关注最近的 3 次会面和整体规律
- 准备笔记应具有可操作性:列出要讨论的事项,而不只是背景档案
- 为首次参与者添加标签,便于在 Obsidian 中筛选
- 对于小组会面,使用事件类型 slug 作为文件名,而不是参与者姓名
链接:meeting-prep link
使用 link 调用时,扫描尚未关联会面笔记的准备笔记,并将它们关联起来。
工作原理
- 查找所有准备笔记:
grep -rl "type: $TYPE_TAG" $MEETINGS_DIR 2>/dev/null
-
对于每个
session_note: ""(未关联)的准备笔记:- 从 frontmatter 中提取
date和participant - 按日期和参与者姓名搜索匹配的会后笔记:
find $MEETINGS_DIR -name "YYYYMMDD-*" -not -name "*$PREP_PREFIX*" | xargs grep -l "PARTICIPANT_NAME" 2>/dev/null- Fathom 笔记的 YAML frontmatter 中包含
participants:;Granola 笔记中也包含participants: - 按日期前缀匹配,并确认文件中出现参与者姓名
- 从 frontmatter 中提取
-
找到匹配项后,更新两个文件:
在准备笔记中:
- 更新 frontmatter:
session_note: "[[YYYYMMDD-matching-note-filename]]" - 将
status: prep更新为status: done
在会面笔记中:
- 在末尾追加一个
## Prep Note部分(如果已有## See also部分,则放在其前面):
## Prep Note - [[YYYYMMDD-PREP_PREFIX-participant-slug]]- 如果会面笔记中已有
## See also部分,则将链接添加到该部分,而不是新建部分
- 更新 frontmatter:
-
报告哪些笔记已关联,以及哪些准备笔记仍未关联(会面尚未进行或尚未导入转录)
匹配规则
- 日期必须完全匹配(相同的 YYYYMMDD 前缀)
- 参与者姓名采用模糊匹配:检查全名和名字,不区分大小写
- 跳过文件名中包含
-$PREP_PREFIX-的文件(它们本身就是准备笔记) - 如果同一日期和参与者匹配到多个会面笔记,优先选择包含转录的笔记(文件较长者)
- 切勿创建重复链接——添加前先检查链接是否已存在
同步:meeting-prep sync
使用 sync 调用时,根据 Cal.com 预约的当前状态核对所有有效的准备笔记。这样可以处理取消、改期和已删除的预约,避免知识库中留下过时的准备笔记。
工作原理
- 查找所有活跃的会前准备笔记:
grep -rl "type: $TYPE_TAG" $MEETINGS_DIR 2>/dev/null
仅筛选 status: prep 的笔记(跳过 done、cancelled、orphaned)。
-
从每篇会前准备笔记的 frontmatter 中提取预订标识信息:
date(YYYY-MM-DD)participant(全名)email(参会者邮箱)event_type(Cal.com 事件类型名称)
-
**检查 Cal.com 状态:**通过 ToolSearch 加载 Cal.com MCP 工具(查询:
"calcom",max_results: 20)。调用get_bookings,获取覆盖所有活跃会前准备笔记日期范围的预订。对于每篇会前准备笔记,按日期和参会者邮箱与 Cal.com 预订进行匹配。 -
根据预订状态进行更新:
已取消 — Cal.com 上存在该预订,且状态为已取消:
- 更新 frontmatter:
status: prep→status: cancelled - 在笔记中追加一个章节:
## Cancelled Booking was cancelled on YYYY-MM-DD (detected during sync).已改期 — 预订仍存在,但日期或时间不同:
- 将 frontmatter 中的
date字段更新为新日期 - 将
time字段更新为新时间 - 将文件从
YYYYMMDD-$PREP_PREFIX-participant-slug.md重命名为NEW_YYYYMMDD-$PREP_PREFIX-participant-slug.md - 在笔记中追加一个章节:
## Rescheduled Moved from ORIGINAL_DATE to NEW_DATE (detected during sync on YYYY-MM-DD).仍然有效 — 预订存在,日期和时间相同,且状态为已接受:
- 无需更改。
- 更新 frontmatter:
-
**报告变更内容:**输出一张摘要表,列出每篇会前准备笔记及所采取的操作(未更改 / 已取消 / 已改期 / 孤立)。
边缘情况
- 在 Cal.com 上找不到预订(可能已被彻底删除,或超出 Cal.com 的保留期限):将 frontmatter 中的
status: prep更新为status: orphaned。追加:## Orphaned No matching booking found on Cal.com (detected during sync on YYYY-MM-DD). The booking may have been deleted. - 同一天有多笔预订,且参会者相同:除日期和参会者邮箱外,还要按
event_type匹配以消除歧义。如果仍有歧义,则跳过该笔记,并在报告中标记以供人工审核。 status: done的会前准备笔记:完全跳过——这些笔记已关联到会议笔记,不应在同步时修改。
状态与查询:meeting-prep status
使用 status 调用时,扫描所有会前准备笔记并报告其当前状态。同时输出实用的 Dataview 查询,供用户粘贴到自己的 vault 中。
状态报告
扫描 $MEETINGS_DIR,查找符合 *-$PREP_PREFIX-*.md 的文件。读取每个文件的 frontmatter 并报告:
| 日期 | 参会者 | 状态 | 会议笔记 |
|---|---|---|---|
来自 date | 来自 participant | prep 或 done | 链接的笔记或 — |
在表格后,通过扫描 vault 中所有会前准备笔记,统计每位参会者的出现次数,并列出会议次数最多的 5 位参会者及其会议次数和最近一次会议日期。
Dataview 查询
在状态输出中包含以下可直接粘贴的查询:
即将到来的会前准备(未关联):
```dataview
TABLE participant AS "Who", time AS "Time", event_type AS "Type", duration + " min" AS "Duration"
FROM "Meetings"
WHERE type = "$TYPE_TAG" AND status = "prep"
SORT date ASC
```
已完成的会前准备(已关联到会议笔记):
```dataview
TABLE participant AS "Who", date AS "Date", session_note AS "Session Note"
FROM "Meetings"
WHERE type = "$TYPE_TAG" AND status = "done"
SORT date DESC
```
会前准备覆盖情况——没有会前准备笔记的会议:
```dataview
TABLE title AS "Session", date AS "Date", participants AS "Participants"
FROM "Meetings"
WHERE !contains(file.name, "$PREP_PREFIX") AND !contains(file.inlinks.file.name, "$PREP_PREFIX")
SORT date DESC
LIMIT 20
```
按参会者列出所有会前准备:
```dataview
TABLE date AS "Date", status AS "Status", event_type AS "Type", session_note AS "Linked"
FROM "Meetings"
WHERE type = "$TYPE_TAG"
SORT participant ASC, date DESC
```
关系与活动查询
按参会者统计会议频率:
```dataview
TABLE length(rows) AS "Sessions", min(rows.date) AS "First", max(rows.date) AS "Last"
FROM "Meetings"
WHERE type = "$TYPE_TAG"
GROUP BY participant
SORT length(rows) DESC
```
参会者时间线(嵌入参会者的个人笔记中——使用 this.participant 作为上下文):
```dataview
TABLE date AS "Date", event_type AS "Type", status AS "Status", session_note AS "Linked"
FROM "Meetings"
WHERE type = "$TYPE_TAG" AND participant = this.participant
SORT date DESC
```
近期会议活动(最近 30 天的所有会议,并与会前准备覆盖情况交叉引用):
```dataview
TABLE title AS "Session", participants AS "With",
choice(contains(file.inlinks.file.name, "prep"), "✓", "—") AS "Prepped"
FROM "Meetings"
WHERE date >= date(today) - dur(30 days) AND !contains(file.name, "prep")
SORT date DESC
```
初次见面者列表(只见过一次的人——潜在的后续跟进对象):
```dataview
TABLE participant AS "Who", date AS "Met On", event_type AS "Type"
FROM "Meetings"
WHERE type = "$TYPE_TAG"
GROUP BY participant
FLATTEN length(rows) AS count
WHERE count = 1
FLATTEN rows.date AS date
FLATTEN rows.event_type AS event_type
SORT date DESC
```