Meeting Summary: turn a recorded Teams meeting into structured notes
You are turning one recorded Teams meeting into durable markdown notes: a meeting
note filed under its series folder, plus a per-project doc for each workstream it
touched. Everything you write must be grounded in the fetched transcript — the
cardinal failure here is fabricating a summary when the transcript is missing
or partial, or silently overwriting a note that already exists. If you can't
fetch the transcript, say so and stop; if the note exists, ask.
First action on every invocation — the config gate
Before replying or asking anything, resolve the notes root, silently:
- Read
~/.claude/meeting-summary.local (i.e. $HOME/.claude/meeting-summary.local).
- A line
NOTES_ROOT="<path>" with a real existing directory → proceed.
- File missing, value empty, or still a
<...> placeholder → run Setup, then stop.
Setup: Write this template to ~/.claude/meeting-summary.local (never clobber
a real value), tell the user to fill in the path to their clone of the meetings
notes repo and save, then stop:
# meeting-summary config — per-user, never committed.
# Set NOTES_ROOT to your local clone of the meetings notes repo.
NOTES_ROOT="<PATH_TO_YOUR_MEETINGS_NOTES_REPO>"
When to use this skill
- User pastes a SharePoint recording link (
https://...sharepoint.com/.../Recordings/...)
- User pastes a Teams meeting or join link
- User asks to summarize a meeting by name or date ("summarize this morning's sprint review")
- User wants decisions or action items extracted from a recorded meeting
When NOT to use this skill
- Summarizing an email thread, chat, or document — that's ad-hoc summarization, not this skill; no calendar event or transcript is involved.
- Live/future meetings — there is no transcript yet; say so and stop.
- Editing existing notes by hand ("fix the attendee list in Tuesday's note") — just edit the file directly.
Steps
Identify the meeting. Locate the calendar event with
outlook_calendar_search:
- SharePoint recording link: URL-decode the filename; extract the meeting
name (text before the
-YYYYMMDD_HHMMSS-Meeting Recording.mp4 suffix) and
the date. Search by name, narrow by date.
- Teams join link: search by any keywords in the link, or list events near
the implied date and match on the event's
onlineMeeting join URL.
- Name/date: search directly.
Multiple plausible matches → present them via AskUserQuestion and stop until
answered. Zero matches → report what you searched and stop.
Read the calendar event. read_resource with calendar:///events/{eventId}.
Record: subject, series name (recurring-series subject; for a one-off, the
subject itself), start/end + timezone, attendees, meetingTranscriptUrl, and
any agenda in the body.
Fetch the transcript. read_resource with the event's
meetingTranscriptUrl verbatim (format meeting-transcript:///events/{token}).
For a recurring series, append ?start={iso}&end={iso} to scope to the
occurrence. Delivered in chunks → fetch all chunks before summarizing.
No transcript → do not summarize. Tell the user and offer a skeleton note
(metadata only, clearly marked as untranscribed) via AskUserQuestion; only
write it if they say yes.
Resolve the user's identity. Call get_me once — the returned
name/email defines whose action items go under "My Follow-ups". Never assume
an identity from the notes or config.
Gather prior context. Glob {NOTES_ROOT}/Projects/*.md and the meeting's
series folder {NOTES_ROOT}/{Series Name}/*.md; read the docs whose names
match projects, products, or prior meetings referenced in the transcript.
Use them to separate what's NEW from what was already decided, and to spot
prior open items this meeting resolved.
Analyze the transcript. Extract: discussion topics (grouped, each with a
concise summary), decisions (stated precisely, with who confirmed them),
team follow-ups (owner + deadline when stated), the user's own follow-ups
(explicit assignments and clear volunteerings), the distinct
projects/workstreams discussed, and any callbacks to prior meetings.
Write the notes. Read references/note-formats.md for the exact file
paths, naming, and markdown templates, then write the meeting note and
create/update one project doc per project identified. If the meeting note
already exists at the target path, ask (overwrite / skip) via
AskUserQuestion before touching it. Project docs are append-only history —
add the new entry at the top of Meeting History, check off resolved items,
never rewrite prior entries.
Report and stop. Use the Output format below. Do not commit or push the
notes repo — writing the files is where this skill ends.
Output format
Meeting note: {NOTES_ROOT}\{Series Name}\{YYYY-MM-DD} {Meeting Name}.md
Project docs: {created: X, updated: Y — names}
Summary: {topics} topics, {decisions} decisions, {follow-ups} follow-ups ({n} yours)
Resolved from previous meetings: {list, or "none"}
Rules
What to do
- Ground every claim in the transcript. Decisions verbatim-precise with the
decider named; follow-ups only when actually assigned or volunteered.
- Full transcript, always. Never truncate or sample a long transcript; fetch
every chunk first.
- Ask at every fork. Ambiguous meeting match, recurring occurrence, existing
note at the target path, unclear project grouping → AskUserQuestion, never guess.
- Identity comes from
get_me, paths come from the config file. Nothing
personal is hardcoded in this skill.
What NOT to do
- NEVER fabricate a summary without a transcript. No transcript means a
clearly-marked skeleton (with consent) or nothing.
- NEVER overwrite an existing meeting note unprompted, and never rewrite or
delete prior entries in a project doc.
- NEVER commit or push the notes repo — file writes only.
- Don't paraphrase decisions loosely — a softened decision is a wrong decision.
Format discipline
- The deliverable is the note files plus the four-line report. No transcript
replay in chat, no narrating each step, no recap of the note contents beyond
the counts.
1---2name: meeting-summary3description: Use when the user provides a meeting reference — a SharePoint recording URL, a Teams meeting/join link, or a meeting named by title or date — and wants it summarized, or asks to "summarize the meeting", extract decisions, or pull action items from a recorded meeting. Fetches the calendar event and transcript via the Microsoft 365 MCP tools and writes structured markdown notes (one meeting note plus per-project docs) into the meetings notes repo, organized by meeting series then date. Transcript-grounded only — never summarizes a meeting it could not fetch a transcript for.4---56# Meeting Summary: turn a recorded Teams meeting into structured notes78You are turning one recorded Teams meeting into durable markdown notes: a meeting9note filed under its series folder, plus a per-project doc for each workstream it10touched. Everything you write must be grounded in the fetched transcript — the11cardinal failure here is **fabricating a summary** when the transcript is missing12or partial, or **silently overwriting** a note that already exists. If you can't13fetch the transcript, say so and stop; if the note exists, ask.1415## First action on every invocation — the config gate1617Before replying or asking anything, resolve the notes root, silently:18191. Read `~/.claude/meeting-summary.local` (i.e. `$HOME/.claude/meeting-summary.local`).202. A line `NOTES_ROOT="<path>"` with a real existing directory → proceed.213. File missing, value empty, or still a `<...>` placeholder → run **Setup**, then stop.2223**Setup:** Write this template to `~/.claude/meeting-summary.local` (never clobber24a real value), tell the user to fill in the path to their clone of the meetings25notes repo and save, then stop:2627```28# meeting-summary config — per-user, never committed.29# Set NOTES_ROOT to your local clone of the meetings notes repo.30NOTES_ROOT="<PATH_TO_YOUR_MEETINGS_NOTES_REPO>"31```3233## When to use this skill3435- User pastes a SharePoint recording link (`https://...sharepoint.com/.../Recordings/...`)36- User pastes a Teams meeting or join link37- User asks to summarize a meeting by name or date ("summarize this morning's sprint review")38- User wants decisions or action items extracted from a recorded meeting3940## When NOT to use this skill4142- **Summarizing an email thread, chat, or document** — that's ad-hoc summarization, not this skill; no calendar event or transcript is involved.43- **Live/future meetings** — there is no transcript yet; say so and stop.44- **Editing existing notes by hand** ("fix the attendee list in Tuesday's note") — just edit the file directly.4546## Steps47481. **Identify the meeting.** Locate the calendar event with49 `outlook_calendar_search`:50 - *SharePoint recording link:* URL-decode the filename; extract the meeting51 name (text before the `-YYYYMMDD_HHMMSS-Meeting Recording.mp4` suffix) and52 the date. Search by name, narrow by date.53 - *Teams join link:* search by any keywords in the link, or list events near54 the implied date and match on the event's `onlineMeeting` join URL.55 - *Name/date:* search directly.56 Multiple plausible matches → present them via AskUserQuestion and stop until57 answered. Zero matches → report what you searched and stop.58592. **Read the calendar event.** `read_resource` with `calendar:///events/{eventId}`.60 Record: subject, series name (recurring-series subject; for a one-off, the61 subject itself), start/end + timezone, attendees, `meetingTranscriptUrl`, and62 any agenda in the body.63643. **Fetch the transcript.** `read_resource` with the event's65 `meetingTranscriptUrl` verbatim (format `meeting-transcript:///events/{token}`).66 For a recurring series, append `?start={iso}&end={iso}` to scope to the67 occurrence. Delivered in chunks → fetch all chunks before summarizing.68 **No transcript → do not summarize.** Tell the user and offer a skeleton note69 (metadata only, clearly marked as untranscribed) via AskUserQuestion; only70 write it if they say yes.71724. **Resolve the user's identity.** Call `get_me` once — the returned73 name/email defines whose action items go under "My Follow-ups". Never assume74 an identity from the notes or config.75765. **Gather prior context.** Glob `{NOTES_ROOT}/Projects/*.md` and the meeting's77 series folder `{NOTES_ROOT}/{Series Name}/*.md`; read the docs whose names78 match projects, products, or prior meetings referenced in the transcript.79 Use them to separate what's NEW from what was already decided, and to spot80 prior open items this meeting resolved.81826. **Analyze the transcript.** Extract: discussion topics (grouped, each with a83 concise summary), decisions (stated precisely, with who confirmed them),84 team follow-ups (owner + deadline when stated), the user's own follow-ups85 (explicit assignments and clear volunteerings), the distinct86 projects/workstreams discussed, and any callbacks to prior meetings.87887. **Write the notes.** Read `references/note-formats.md` for the exact file89 paths, naming, and markdown templates, then write the meeting note and90 create/update one project doc per project identified. If the meeting note91 already exists at the target path, ask (overwrite / skip) via92 AskUserQuestion before touching it. Project docs are append-only history —93 add the new entry at the top of Meeting History, check off resolved items,94 never rewrite prior entries.95968. **Report and stop.** Use the Output format below. Do not commit or push the97 notes repo — writing the files is where this skill ends.9899## Output format100101```102Meeting note: {NOTES_ROOT}\{Series Name}\{YYYY-MM-DD} {Meeting Name}.md103Project docs: {created: X, updated: Y — names}104Summary: {topics} topics, {decisions} decisions, {follow-ups} follow-ups ({n} yours)105Resolved from previous meetings: {list, or "none"}106```107108## Rules109110### What to do111112- **Ground every claim in the transcript.** Decisions verbatim-precise with the113 decider named; follow-ups only when actually assigned or volunteered.114- **Full transcript, always.** Never truncate or sample a long transcript; fetch115 every chunk first.116- **Ask at every fork.** Ambiguous meeting match, recurring occurrence, existing117 note at the target path, unclear project grouping → AskUserQuestion, never guess.118- **Identity comes from `get_me`,** paths come from the config file. Nothing119 personal is hardcoded in this skill.120121### What NOT to do122123- **NEVER fabricate a summary without a transcript.** No transcript means a124 clearly-marked skeleton (with consent) or nothing.125- **NEVER overwrite an existing meeting note unprompted,** and never rewrite or126 delete prior entries in a project doc.127- **NEVER commit or push** the notes repo — file writes only.128- **Don't paraphrase decisions loosely** — a softened decision is a wrong decision.129130### Format discipline131132- The deliverable is the note files plus the four-line report. No transcript133 replay in chat, no narrating each step, no recap of the note contents beyond134 the counts.