mcpField
M
meeting-prep

meeting-prep

github.com/glebis生产力40385 次安装3 天前更新
代码仓库

关于 meeting-prep

meeting-prep 为即将举行的 Cal.com 预约整理会议准备笔记,结合参与者调研和 Obsidian 中的历史记录。适合需要会前背景、后续事项和笔记状态管理的个人或团队。

主要功能

  1. 01获取并筛选即将举行的预约
  2. 02检索 Obsidian 中的会议历史
  3. 03整理参与者背景调研
  4. 04生成个人或群组准备笔记
  5. 05关联会议记录并同步预约状态
  6. 06查看准备笔记状态及统计

适用场景

  1. 01为即将与会者准备背景和讨论要点
  2. 02查找回访对象的过往会议及待办
  3. 03将会前笔记关联到会议记录
  4. 04检查取消或改期的预约并更新笔记

MCP 相关

通过 Cal.com MCP 工具读取预约、参与者及其状态。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/glebis/claude-skills --skill meeting-prep

安装后在 Claude Code 中输入/meeting-prep确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

config.yaml
research-workflow.js
skill.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)。然后:

  1. 调用 get_bookings,获取目标日期范围内即将到来的预约(状态:accepted)
  2. 对每个预约,调用 get_booking_attendees 获取完整的参与者列表——Cal.com 预约可能有多位参与者(例如实验室会话、头脑风暴会、群组通话)
  3. 如果提供了参数(日期、姓名),按参数筛选
  4. 如果没有找到预约,报告结果并停止
步骤 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,执行以下操作:

  1. 网页搜索参与者姓名及其公司/电子邮件域名
  2. 检查 LinkedIn 个人资料(通过网页搜索,不直接抓取)
  3. 总结其职位、公司、近期动态和共同背景
  4. 对于回访参与者:结合知识库历史记录,找出模式和可延续的讨论点
步骤 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 后过时”,提醒用户之后重新查看
    • 此笔记仍可用于背景研究,但行动事项和后续衔接需要在会面后更新

对于首次参与者(知识库中没有历史记录),将“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 调用时,扫描尚未关联会面笔记的准备笔记,并将它们关联起来。

工作原理
  1. 查找所有准备笔记:
grep -rl "type: $TYPE_TAG" $MEETINGS_DIR 2>/dev/null
  1. 对于每个 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:
    • 按日期前缀匹配,并确认文件中出现参与者姓名
  2. 找到匹配项后,更新两个文件:

    在准备笔记中:

    • 更新 frontmatter:session_note: "[[YYYYMMDD-matching-note-filename]]"
    • 将 status: prep 更新为 status: done

    在会面笔记中:

    • 在末尾追加一个 ## Prep Note 部分(如果已有 ## See also 部分,则放在其前面):
    ## Prep Note
    - [[YYYYMMDD-PREP_PREFIX-participant-slug]]
    
    • 如果会面笔记中已有 ## See also 部分,则将链接添加到该部分,而不是新建部分
  3. 报告哪些笔记已关联,以及哪些准备笔记仍未关联(会面尚未进行或尚未导入转录)

匹配规则
  • 日期必须完全匹配(相同的 YYYYMMDD 前缀)
  • 参与者姓名采用模糊匹配:检查全名和名字,不区分大小写
  • 跳过文件名中包含 -$PREP_PREFIX- 的文件(它们本身就是准备笔记)
  • 如果同一日期和参与者匹配到多个会面笔记,优先选择包含转录的笔记(文件较长者)
  • 切勿创建重复链接——添加前先检查链接是否已存在

同步:meeting-prep sync

使用 sync 调用时,根据 Cal.com 预约的当前状态核对所有有效的准备笔记。这样可以处理取消、改期和已删除的预约,避免知识库中留下过时的准备笔记。

工作原理
  1. 查找所有活跃的会前准备笔记:
grep -rl "type: $TYPE_TAG" $MEETINGS_DIR 2>/dev/null

仅筛选 status: prep 的笔记(跳过 done、cancelled、orphaned)。

  1. 从每篇会前准备笔记的 frontmatter 中提取预订标识信息:

    • date(YYYY-MM-DD)
    • participant(全名)
    • email(参会者邮箱)
    • event_type(Cal.com 事件类型名称)
  2. **检查 Cal.com 状态:**通过 ToolSearch 加载 Cal.com MCP 工具(查询:"calcom",max_results: 20)。调用 get_bookings,获取覆盖所有活跃会前准备笔记日期范围的预订。对于每篇会前准备笔记,按日期和参会者邮箱与 Cal.com 预订进行匹配。

  3. 根据预订状态进行更新:

    已取消 — 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).
    

    仍然有效 — 预订存在,日期和时间相同,且状态为已接受:

    • 无需更改。
  4. **报告变更内容:**输出一张摘要表,列出每篇会前准备笔记及所采取的操作(未更改 / 已取消 / 已改期 / 孤立)。

边缘情况
  • 在 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来自 participantprep 或 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
```

评论

支持 Markdown