Skip to content
Education
Skill

/post-meeting

Summarize a meeting transcript, extract decisions and action items, and draft a follow-up email.

From plugin
claudeblattman
48229 skills7 agents2 commands

Claude Code

$ npx -y skills add chrisblattman/claudeblattman --skill post-meeting --agent claude-code

SKILL.md

post-meeting.SKILL.md
name: post-meeting
description: "Summarize a meeting transcript, extract decisions and action items, and draft a follow-up email."

<!-- post-meeting v1.7 | sanitized from private v1.7 -->

Post-Meeting Summary & Email

*v1.7 — Recipient rule changed: default sends to the full team minus low-frequency categories (e.g., `infrequent`, `stakeholders`). Decoupled recipient-list display from send confirmation. Per-project override via `meeting_summary_recipients` in `.claude/CLAUDE.md`. Adds explicit sender choice (you vs. an AI EA identity). Includes the v1.4 hollow-transcript guard.*

Summarize a meeting transcript and draft a follow-up email to attendees. Run from a project directory after a meeting.

Prerequisites

**Required:**

  • **Gmail MCP** — for drafting the follow-up email

**Recommended:**

  • A project `.claude/CLAUDE.md` file with team roster (names + emails) and transcript folder path
  • Meeting transcripts saved as `.txt` files in a project transcripts folder

**Optional:**

  • **Granola MCP** — for pulling transcripts directly from Granola instead of local files

First-Time Setup

1. **Create a project config** at `[project-root]/.claude/CLAUDE.md` with at minimum:

   # Project Name

   ## Team
   - [Name] <email@example.com> — PI
   - [Name] <email@example.com> — Research Manager
   - [Name] <email@example.com> — RA

   ## Folders
   - transcripts: `transcripts/`

2. **Create a transcripts folder** in your project directory:

   mkdir -p transcripts/

3. **Save meeting transcripts** as `.txt` files in that folder. Most transcription tools (Granola, Otter, etc.) can export to text. Name files with dates for easy sorting (e.g., `2026-03-15_team-sync.txt`).

Arguments

`$ARGUMENTS` can include:

  • *(none)* — most recent transcript in project's transcripts folder
  • `[keyword]` — filter transcripts by keyword in filename
  • `id:DOC_ID` — specific Granola document ID (bypasses local files; requires Granola MCP)
  • `nosend` — show summary only, skip email drafting
  • `save` — also save summary as local `.md` file in transcripts folder

Instructions

Step 1: Find Project Context

Read `.claude/CLAUDE.md` at **exactly** `$(pwd)/.claude/CLAUDE.md`.

Extract:

  • Transcript folder path (e.g., `transcripts/`)
  • Team roster — names + emails (and any role/category labels you use, e.g., `pis`, `research_managers`, `field_ras`, `infrequent`, `stakeholders`)
  • Project name (from header or `project_name` field)

Fields may be inside markdown code fences (` ```yaml ``` `) — extract from inside fences.

**If not found:** Offer Granola MCP fallback (if available) — don't silently walk up directories.

No .claude/CLAUDE.md found in this directory.
I can search Granola directly — want me to list recent meetings? (y/n)

If yes and Granola MCP is available: list recent meetings, then jump to Step 3 with `id:` flow. If no Granola MCP: ask user to provide the transcript path manually.

Step 2: Fetch Latest Transcript

**If using Granola MCP:** Search for recent meetings matching this project and fetch the transcript.

**If using local files:** List `.txt` files in the transcripts folder (excluding `archive/` subfolder), sorted by date (newest first).

Step 3: Pick Meeting

If `id:DOC_ID` argument: use Granola MCP to fetch the document directly, skip to Step 4.

If keyword argument: filter `.txt` files in transcripts folder by keyword in filename.

Otherwise: show most recent transcript + 2-3 others for selection.

**Transcript-not-ready check:** If no transcript is newer than 30 minutes and the user didn't specify an older one:

Transcript may still be processing. Try again in ~10 minutes, or pick an older meeting.

Step 3.5: Confirm Selection

Summarize "[meeting title]" from [date]? (y/n)

Confirm BEFORE reading the full transcript.

Step 4: Read Transcript

Read the selected `.txt` file. If using Granola MCP (`id:` arg), fetch via the Granola transcript API.

**Hollow transcript check (REQUIRED before proceeding):**

After reading the content, classify it as full or hollow.

A transcript is **hollow (notes only)** if ANY of these are true:

  • Content is under 5,000 characters
  • Content starts with `###` markdown headers
  • Primary structure is bullet points with no speaker attribution lines (pattern: `Name: [speech text]` repeated throughout)

A transcript is **full** if it is ≥5,000 characters AND contains conversational speaker content (back-and-forth dialogue, speaker labels, or a `.vtt` Zoom format).

**If hollow:** Stop immediately. Do not proceed to Step 5. Notify:

This transcript appears to be AI-generated notes summary, not a full verbatim transcript.
Granola (or your transcription tool) may still be processing — usually ready 1-2 hours after meeting end.

Options:
  1. Try again later — run /post-meeting again once the transcript is ready
  2. Find the raw transcript in your transcription tool
  3. Proceed with notes only — summary will be less accurate (not recommended)

What would you like to do?

Do NOT proceed unless the user explicitly chooses option 3.

Step 5: Summarize

Generate structured summary with:

  • 2-3 sentence overview of topics discussed
  • Numbered decisions with context
  • Bulleted action items with owner and deadline (if mentioned)
  • Next steps

**Minimum-content gate:** If no decisions AND no action items detected:

This was a brief meeting with no tracked decisions or action items. Send summary anyway? (y/n)

**Language check:** If non-English content detected in transcript:

Draft in [detected language] or English? (default: English)

If `nosend` argument: display summary and stop here.

Step 5.5: Sender Choice

Before drafting the email, ask who should send it:

Send as:
  1. You — first person, signed with your name
  2. AI executive assistant — third person, identifies clearly as an AI assistant
  (default: 1)

If sender = **You**: Use a direct,

Read more
@chrisblattman
Ships withclaudeblattman

Claude Code for professionals who don't code — Skills, agents, and setup guides

48229 skills7 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
482
Star history of chrisblattman/claudeblattman on GitHub, a chart by star-history.com

Other skills on claudeblattman.

ask-agents

ask-agents

Ask the specific Claude, Codex, Gemini, or Grok agent the user names and automatically retrieve its response. Use for targeted…

council

council

Develop independent approaches to a task, decision, plan, or draft, then use a fresh worker to synthesize them. Use for an…

done

done

Close out current work by saving decisions, unresolved tasks, useful artifacts, a session log and a current-state handoff for the…

kit-setup

kit-setup

Discover and test optional Claude, Codex, Gemini through Antigravity, and Grok subscription connections. Help with missing CLI or…

More skills from other plugins.

lesson-quiz

lesson-quiz

Test a learner on a single Claude Code tutorial lesson (01-10) with 10 questions, scoring answers and flagging weak spots. Use…

@luongnv89@luongnv89Install Skill
build-personal-skill

build-personal-skill

Evidence-based creation of a reusable personal course-making Skill from the user's own classroom and chat history. Use when the…

@thu-maic@thu-maicInstall Skill

Questions about post-meeting.

Which coding agents can use post-meeting?
post-meeting installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.