mcpField
M
meeting-prep

meeting-prep

github.com/glebis生産性40385 回インストール3 日前に更新
リポジトリ

meeting-prep について

meeting-prepは、参加者の調査とObsidian内の過去の記録をまとめ、Cal.comの予約に向けた準備ノートを作成するスキルです。会議前の情報整理、フォローアップ、ノートの状態管理に使えます。

主な機能

  1. 01今後の予約の取得と絞り込み
  2. 02Obsidian内の会議履歴検索
  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

詳細

ミーティング準備

Obsidian Vault の参加者を調査し、セッション履歴を監査して、今後の Cal.com 予約に向けた包括的なミーティング準備メモを作成します。

設定

すべてのパスと設定は、このファイルと同じディレクトリにある 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:Vault でセッション履歴を検索

参加者ごとに、過去のセッションメモを MEETINGS_DIR で検索します。

grep -rl "PARTICIPANT_NAME" $MEETINGS_DIR 2>/dev/null

一致するファイルを最大5件、最近のものから読み込み、以下を抽出します。

  • 各過去セッションの日付と所要時間
  • 話し合った主なトピック(見出し、要約セクション、またはトランスクリプトの抜粋から)
  • 記載されているアクションアイテムやフォローアップ
  • セッションのソース(Fathom、Granola、手動)

Vault 内の人物メモも検索します。

find $VAULT_ROOT -maxdepth $PEOPLE_DEPTH -name "*PARTICIPANT_NAME*" -not -path "*/Meetings/*" 2>/dev/null
ステップ 3:参加者の調査(ワークフロー)

Workflow ツールを使って参加者の調査を並列化します。サブエージェントが検索先を把握できるよう、ワークフローの引数として MEETINGS_DIR と VAULT_ROOT を渡します。

参加者ごとに、以下を行うエージェントを起動します。

  1. 参加者の名前と会社名/メールドメインを組み合わせてウェブ検索します
  2. LinkedIn プロフィールを確認します(直接スクレイピングせず、ウェブ検索を利用)
  3. 役職、会社、最近の活動、共通の背景を要約します
  4. 再度参加する人については、Vault の履歴と照合し、傾向や継続性のある話題を特定します
ステップ 4:Obsidian で準備メモを作成

参加者の人数に応じて、2つのモードがあります。

  • 個別セッション(参加者1人):以下の説明どおり、セッションごとに準備メモを1つ作成します。ファイル名:YYYYMMDD-$PREP_PREFIX-PARTICIPANT_SLUG.md
  • グループセッション(参加者2人以上):セッション全体の準備メモを1つ作成します。ファイル名:YYYYMMDD-$PREP_PREFIX-EVENT_SLUG.md(EVENT_SLUG は Cal.com のイベントタイプのスラッグを小文字のケバブケースにしたもの)。メモには全参加者の簡単なプロフィールを記載し、調査セクションでは全参加者を扱います。

その日付とセッションの準備メモがすでにある場合は、重複して作成せずに更新してください。

個別セッションのテンプレート

以下のテンプレートを使用します。

---
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日)、日付順に並べて、次のように処理します。

  • 最初の予約:通常の準備メモを作成し、変更は加えません。
  • 2回目以降の予約:準備メモで、先に行われるセッションに言及します。
    • フロントマターに prior_prep: "[[YYYYMMDD-prep-participant]]" を追加し、先に行われる準備メモを指定します。
    • Session Info の後に ## Prior Session セクションを追加します。
      ## Prior Session
      A session with FIRST_NAME is scheduled for PRIOR_DATE — it will have happened by the time this session occurs.
      Update this note after the PRIOR_DATE session with fresh context.
      
    • 調査/履歴のセクションはすべて残しつつ、「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 で簡単に絞り込めるよう、初参加者にタグを付けます。
  • グループセッションでは、参加者名ではなくイベント種別のスラッグをファイル名に使用します。

リンク:meeting-prep link

link を指定して実行した場合、セッションメモがまだリンクされていない準備メモを検索し、両者をリンクします。

動作の仕組み
  1. すべての準備メモを検索します。
grep -rl "type: $TYPE_TAG" $MEETINGS_DIR 2>/dev/null
  1. session_note: ""(未リンク)の準備メモごとに、次の処理を行います。

    • フロントマターから date と participant を抽出します。
    • 日付と参加者名で一致するミーティング後のメモを検索します。
    find $MEETINGS_DIR -name "YYYYMMDD-*" -not -name "*$PREP_PREFIX*" | xargs grep -l "PARTICIPANT_NAME" 2>/dev/null
    
    • Fathom のメモと Granola のメモには、どちらも YAML フロントマターに participants: があります。
    • 日付の接頭辞と、ファイル内に参加者名が含まれているかで照合します。
  2. 一致するものが見つかったら、両方のファイルを更新します。

    準備メモ内:

    • フロントマターを更新します: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. 各準備メモのフロントマターから予約識別情報を抽出します:

    • 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 に存在し、キャンセル済みのステータスになっている予約:

    • フロントマターを更新します:status: prep → status: cancelled
    • メモにセクションを追記します:
    ## Cancelled
    Booking was cancelled on YYYY-MM-DD (detected during sync).
    

    日程変更済み — 予約は存在するものの、日時が異なる場合:

    • フロントマターの 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 の保存期間を過ぎている可能性があります):フロントマターの 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 を指定して実行すると、すべての準備メモをスキャンして現在の状態を報告します。また、ユーザーが自分の Vault に貼り付けられる便利な Dataview クエリも出力します。

ステータスレポート

$MEETINGS_DIR で *-$PREP_PREFIX-*.md に一致するファイルを検索します。それぞれのフロントマターを読み取り、次のように報告します:

日付参加者ステータスセッションメモ
date の値participant の値prep または doneリンクされたメモ、または —

表の後に、Vault 内のすべての準備メモをスキャンし、参加者ごとの登場回数を数えて、セッション回数と最終ミーティング日を添えた上位 5 名を一覧表示する参加回数の多い上位 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
```

コメント