# Meeting Summarizer

> Summarize a meeting from transcript artifacts and inject "## Notes by Claude" into an Obsidian meeting file

- **Type:** Skill
- **Install:** `agentstack add skill-jlaska-obsidian-claude-plugins-meeting-summarizer`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [jlaska](https://agentstack.voostack.com/s/jlaska)
- **Installs:** 0
- **Category:** [Productivity](https://agentstack.voostack.com/c/productivity)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [jlaska](https://github.com/jlaska)
- **Source:** https://github.com/jlaska/obsidian-claude-plugins/tree/main/skills/meeting-summarizer

## Install

```sh
agentstack add skill-jlaska-obsidian-claude-plugins-meeting-summarizer
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Meeting Summarizer

Reads a meeting transcript (VTT, TXT, SRT) and optional agenda/prep notes, then
generates a structured "## Notes by Claude" summary and injects it into the
corresponding Obsidian meeting file.

## When to Use

Invoke `/meeting-summarizer` when you want to:
- Summarize a recorded meeting from a transcript file
- Add or refresh AI-generated notes in an existing meeting Obsidian file
- Replace a `## Notes by Gemini` section with `## Notes by Claude`

## Workflow

### Step 1 — Discover Vault Root

Read Obsidian configuration to find the active vault:

```bash
cat ~/Library/Application\ Support/obsidian/obsidian.json
```

Parse the JSON to find the vault with `"open": true`. Extract `vault_root`.

### Step 2 — Identify the Meeting File

If invoked with an argument (e.g., `/meeting-summarizer 2026-04-09`), use it to
locate the meeting file:

```bash
find "/MEETINGS" -name "*.md" | head -5
```

If multiple matches or no argument: use AskUserQuestion to let the user select
or provide the meeting file path. Show the matched file and confirm before proceeding.

### Step 3 — Collect Artifacts

Ask the user to provide (or confirm auto-discovered paths):

- **Transcript** (`.vtt`, `.txt`, `.srt`) — required
- **Agenda / prep notes** (`.md`) — optional, used only as framing context
- **Recording** (`.m4a`, `.m4v`) — noted in the summary output but not processed

Auto-discovery: check `~/Projects/coaching/sessions//` where the date
matches the meeting file date. Show any found artifacts and ask the user to confirm.

### Step 4 — Parse the Transcript

Read the transcript file. Strip VTT formatting if needed:

```bash
# For .vtt files: strip timestamp lines (00:00:00.000 --> 00:00:01.040)
# and sequence numbers, keeping Speaker: text lines only
```

Use this Python snippet (via uv) to parse VTT into clean diarised text:

```bash
uv run --with webvtt-py python3 - "
```

If `.txt` format: read directly.

Output: clean text with speaker labels preserved (e.g., `JP: Smart.\nJames L: Continue feeding...`).

### Step 5 — Confirm Speakers

1. Extract unique speaker labels from the transcript (prefix before first `:` on each line).
2. Display the found labels to the user.
3. Use AskUserQuestion: "Map speaker labels to PEOPLE/ notes?"
   - If yes: search `PEOPLE/*.md` for name candidates (check `aliases:` frontmatter)
   - Present candidates per label; user confirms match or selects "keep as-is"
   - On confirmed match: add the VTT label as an alias in the PEOPLE note's frontmatter
   - Build a speaker map: `{"JP": "John Poelstra", "James L": "James Laska"}`
4. Apply the speaker map to the clean transcript text before summarization.
5. Always show the confirmed speaker list and ask for final confirmation before generating.

### Step 6 — Read Agenda (if provided)

Read the agenda/prep notes file. Use this as framing context in the summary prompt
(it helps identify expected topics and decision points) but do NOT quote it directly
in the "## Notes by Claude" output — the summary must be grounded in the transcript.

### Step 7 — Generate "## Notes by Claude"

Generate the summary using the full transcript text (with resolved speaker names)
and optional agenda as context. Follow the intellectronica Task 2 structure:

```markdown
## Notes by Claude

### Summary

### Key Discussion Points
#### 
- Specific detail or sub-point
- _"Verbatim quote from transcript"_ — Speaker Name

#### 
- ...

### Decisions Made
- Concrete decision reached (or "None recorded" if none)

### Action Items
- **Task description** — Owner — Deadline (if mentioned)
(or "None recorded" if none explicitly stated)

### Key Quotes
- _"Verbatim quote that captures a key moment"_ — Speaker Name
```

**Formatting rules:**
- Use `##` for the section heading, `###` for sub-sections, `####` for topic headings
- Integrate verbatim quotes (italicised, attributed) within Key Discussion Points
- Keep Key Quotes to 3-5 standout moments
- Action items: bold the task, name the owner, include deadline only if explicitly stated
- If a section has nothing to report, write "None recorded."

### Step 8 — Inject into Meeting File

Read the current meeting file content and inject the generated section:

- If `## Notes by Claude` already exists → replace it (idempotent re-runs)
- If `## Notes by Gemini` exists → replace it with `## Notes by Claude`
- Otherwise → append at the end of the file

Use the Edit tool to make the change.

### Step 9 — Confirm to User

Report:
- Meeting file updated (path relative to vault root)
- Speaker mapping used
- First few lines of the generated summary

## Output Format Reference

```markdown
## Notes by Claude

### Summary
James Laska and John Poelstra met for their bi-weekly coaching session, focusing
on [primary topics]. Key outcomes included [decisions/commitments].

### Key Discussion Points
#### Leadership & Org Changes
- Appointed Deepika as lead for a new engineering team
- _"This is you leading. Not grinding, not shoveling."_ — John Poelstra

#### Career & Networking
- LinkedIn outreach still deferred; June remains the soft deadline
- _"You don't need the resume to be amazing. It just has to be good enough."_ — John Poelstra

### Decisions Made
- None recorded.

### Action Items
- **Schedule LinkedIn/resume work block** — James Laska — Thursday April 16, 2-5pm
- **Follow up with Tailscale contacts** — James Laska

### Key Quotes
- _"What's the life you want to live?"_ — John Poelstra
- _"June is still the soft deadline. It's April 9. That's 8 weeks."_ — John Poelstra
```

## Related Skills

- **obsidian-vault-discovery**: Used to discover vault configuration
- **meeting-planner**: Creates and hydrates meeting files from Google Calendar
- **daily-planner**: Orchestrates daily note creation and meeting file hydration

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [jlaska](https://github.com/jlaska)
- **Source:** [jlaska/obsidian-claude-plugins](https://github.com/jlaska/obsidian-claude-plugins)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-jlaska-obsidian-claude-plugins-meeting-summarizer
- Seller: https://agentstack.voostack.com/s/jlaska
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
