Meeting Notes Summarizer Skill
Drop in a raw meeting transcript, get back structured notes: decisions, action items with owners, open questions, and topics covered. The kind of notes you'd write yourself if you had time, and never do.
The Problem
Recording every meeting is now trivial. Watching the recording back to extract notes? Nobody does it. So decisions get forgotten, action items fall through the cracks, and the "we'll revisit next week" item never gets revisited because nobody remembers it existed. AI flips that — 2 minutes after the meeting ends, the team has structured notes in their inbox.
How It Works
- The meeting platform records the call and produces a transcript (Zoom, Teams, OBS, Otter.ai, etc.)
- A trigger-file or scheduled job picks up new transcripts from a folder
- The
meeting-notes-summarizerskill produces structured markdown - The
emailormessagetask delivers it to attendees and optionally appends to a meeting-log file
Setup
- Install this skill
- Configure your meeting platform to drop transcripts into a folder InTouch can read (most have an integration; otherwise periodic export)
- Create a trigger-file watching that folder
- Use the YAML below
Example YAML Job
name: meeting-notes-from-transcript
version: 1.0.0
description: Summarize a new meeting transcript and email the team
notifications:
- userNames: [intouch]
alertOnError: true
tasks:
- name: read-transcript
tool: runtimeenv
properties:
scriptContent: |
#!/bin/bash
FILE="${TRIGGER_FILE:-}"
BASENAME=$(basename "$FILE" .txt)
# Convention: filename "2026-05-15_Q3-Planning.txt" → date + title
DATE=$(echo "$BASENAME" | grep -oE '^[0-9]{4}-[0-9]{2}-[0-9]{2}')
TITLE=$(echo "$BASENAME" | sed -E 's/^[0-9]{4}-[0-9]{2}-[0-9]{2}_//' | tr '-' ' ')
echo "meetingTitle: $TITLE"
echo "meetingDate: $DATE"
echo "transcript:"
cat "$FILE"
- name: summarize
tool: skill
properties:
skillName: meeting-notes-summarizer
input: "{{read-transcript.output}}"
- name: email-team
tool: email
credentialName: smtp
properties:
operation: send
to: "[email protected]"
subject: "Meeting notes — {{read-transcript.output}}"
body: "{{summarize.answer}}"
bodyType: text
- name: archive
tool: runtimeenv
properties:
scriptContent: |
#!/bin/bash
ARCHIVE="${INTOUCH_HOME}/meetings/notes"
mkdir -p "$ARCHIVE"
BASENAME=$(basename "${TRIGGER_FILE}" .txt)
cat > "${ARCHIVE}/${BASENAME}.md" <<'EOF'
{{summarize.answer}}
EOF
mv "${TRIGGER_FILE}" "${INTOUCH_HOME}/meetings/transcripts/processed/"
Customization
- Auto-create tickets from action items — chain a task that parses
- [ ] **Name** — textlines and POSTs each as a ticket to your project tool (Linear, Jira, GitHub Issues) - Per-meeting routing — branch on the meeting title to send different summaries to different recipients (engineering all-hands → eng, exec sync → execs)
- Speaker recognition — if your transcript lacks speaker labels, the AI does its best to infer from context but quality drops; investing in a transcript source with speaker diarization is worth it
- Long meetings — for 60+ minute meetings, the prompt may exceed Claude Haiku's sweet spot; switch to Sonnet for those (the extra cost is trivial vs the value)
Cost
- AI assistant: ~$0.01-0.05 per meeting depending on length, with Claude Sonnet
- A 30-minute meeting with a clean transcript: closer to $0.01
- A 90-minute messy meeting: closer to $0.05