# Meeting Followup

> Draft a follow-up email after a call. Pulls meeting context from Granola (MCP), recent email history from Gmail (MCP), and pending tasks from Attio. Triggers on: "follow up", "draft follow-up", "write follow-up", "post-call email", "meeting follow-up", "follow up email".

- Skill: `extruct-ai/meeting-followup` (Agent Skill)
- Install (CLI): `npx skillmds@latest add extruct-ai/meeting-followup`
- Raw SKILL.md: https://api.skillmd.com/api/skills/extruct-ai/meeting-followup/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: extruct-ai (https://skillmd.com/u/extruct-ai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/extruct-ai/meeting-followup

---


# Meeting Follow-Up Email

Draft a follow-up email after a call by combining meeting notes, email history, and CRM context.

## Inputs

The user provides one or more of:
- A contact name or email address
- A meeting reference (title, date, or Granola meeting ID)
- Specific points to include in the follow-up

If the user provides a Granola meeting context (summary, endTime), use that directly.
If not provided, ask for the contact name or email.

## Workflow

### Step 1: Gather meeting context (Granola MCP)

Use Granola MCP tools to find and extract the meeting:

1. **If meeting context is provided inline** (summary, endTime): use it directly.
2. **If contact name is known:** call `query_granola_meetings` with
   "meeting with {contact_name}" to find the most recent meeting.
3. **If no match:** call `list_meetings` with `time_range: "last_30_days"` and scan
   for a matching title or attendee.
4. **Once meeting ID is found:** call `get_meetings` with the ID to get full details.

Extract:
- Summary and key discussion points
- Action items and next steps
- Decisions made
- Commitments from either side

If more detail is needed, call `get_meeting_transcript` with the meeting ID.

### Step 2: Gather email history (Gmail MCP)

Use Gmail MCP tools to get conversation context:

1. Resolve the contact email. Sources (try in order):
   - User provides it directly
   - Extract from meeting attendees (Granola)
   - Search Attio: use `search-records` with `object = "people"` and the contact name as query
   - Ask the user

2. Call `gmail_search_messages` with query:
   `from:{contact_email} OR to:{contact_email}`
   Limit to 10 most recent messages.

3. Identify the most relevant thread (most recent exchange or matching meeting topic).

4. Call `gmail_read_thread` with the thread ID to get full email bodies.

Extract:
- What was last discussed over email
- Open questions or proposals
- Tone and formality level of the conversation
- Prior commitments or offers

### Step 3: Check pending CRM tasks (Attio MCP)

Query Attio for open tasks linked to this contact:

- Use `list-tasks` with `is_completed = false`.
- Filter results for tasks whose `linked_records` match the contact's record ID

Note any overdue or pending tasks to reference in the follow-up.

### Step 4: Draft the follow-up

**Structure:**
1. Thank them for their time (1 sentence, reference the specific meeting topic)
2. Summarize key discussion points (2-3 bullets from meeting + emails)
3. List next steps or action items (explicit, with owners if discussed)
4. Clear call-to-action (one specific ask or proposal)

**Tone rules:**
- Match the tone of the existing email thread (formal ↔ casual)
- Professional but warm
- No filler phrases ("I hope this email finds you well")
- Use the same greeting style as previous emails in the thread
- Reference specific things discussed, not generic pleasantries

**Constraints:**
- Under 200 words
- No emojis unless the contact uses them
- If a proposal or price was mentioned, reference it naturally

### Step 5: Save artifacts locally

After gathering context, persist to `revops/customers/{company-slug}/`:

1. **Meeting notes:** Save Granola meeting data to `meetings/YYYY-MM-DD_{title-slug}.md`
   using the template from `revops/customers/README.md`
2. **Context update:** If `context.md` exists, update the Deal History and Current Status.
   If it doesn't exist, create it from the template.
3. **Check first:** Read existing files before writing to avoid overwriting.

This is non-optional — Granola data can be deleted, the local copy is the source of truth.

### Step 6: Present and act

Show the draft with:
- **To:** address
- **Subject:** line (reply to existing thread or new subject)
- **Body**
- **Context used:** brief note on sources (meeting summary, email thread, tasks)

Ask the user if they want to:
1. Edit the draft
2. Create a Gmail draft via `gmail_create_draft`
3. Start over with different context

## Attio MCP Tool Reference

Use these MCP tools (NOT raw API calls):

| Task | Tool | Key parameters |
|------|------|---------------|
| Search people or companies | `search-records` | `object`, `query` |
| Get pending tasks | `list-tasks` | `is_completed=false` |

## Environment

| Variable | Source | Purpose |
|----------|--------|---------|
| Attio | MCP (Attio connector) | CRM — people, tasks |
| Gmail | MCP (`claude.ai Gmail`) | Email search, read threads, create drafts |
| Granola | MCP (`Granola`) | Meeting notes, transcripts, summaries |

## Reference

- CRM enrichment context: `revops/CRM_ENRICHMENT.md`
- Customer artifacts: `revops/customers/` (see README.md for structure and templates)

