helpers/skills/email-meeting-summary/SKILL.md
Use when the user wants to summarize a Google Meet meeting and send the summary by email. Reviews a Google Meet transcript for a specific meeting topic, then composes a Gmail draft summarizing decisions and action items for that topic. Prompts for meeting selection if not specified, and for topic selection before drafting. Stops with a message if the transcript is not yet available.
npx skillsauth add opendatahub-io/ai-helpers email-meeting-summaryInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read a Google Meet transcript, identify discussion topics, summarize decisions and action items for the chosen topic, and compose a Gmail draft for review.
gws binary must be on $PATHgws auth login if not already logged in. The --readonly flag is sufficient for reading calendar/docs/drive, but draft creation requires the gmail.compose scope which is included in the default (non-readonly) login.If gws is not installed or authentication fails, tell the user to follow the
setup instructions in the google-workspace skill.
Helper scripts are located in ${CLAUDE_SKILL_DIR} and require Python 3.10+.
Run the search once and save the result to a temp file:
EVENT_FILE=$(mktemp /tmp/meeting_event.XXXXXX)
# With a keyword (argument provided):
python3 "${CLAUDE_SKILL_DIR}/scripts/find_meeting.py" --days 7 "<keyword>" > "$EVENT_FILE"
# With keyword + specific date (recurring meeting):
python3 "${CLAUDE_SKILL_DIR}/scripts/find_meeting.py" --days 7 --date "<YYYY-MM-DD>" "<keyword>" > "$EVENT_FILE"
# No argument — list all recent events:
python3 "${CLAUDE_SKILL_DIR}/scripts/find_meeting.py" --days 7 > "$EVENT_FILE"
The script always outputs JSON. Read EVENT_FILE and display the result(s) to
the user as a human-readable list.
The script searches the past 7 days (up to now). When a keyword matches
multiple occurrences of a recurring meeting, it automatically picks the best
one: the occurrence on --date if given, otherwise today's, otherwise the most
recent past one.
Always confirm with the user before proceeding, regardless of how many
results were found. Use AskUserQuestion:
"I found: <title> on <date> at <time>. Is this the meeting you want to summarize? (yes / no — if no, describe the meeting you meant)"
If the user says no, ask for clarification and re-run find_meeting.py with a
corrected keyword or --date, overwriting EVENT_FILE. If multiple events were
returned, list them and ask the user to pick one by number, then re-run with
--date to narrow to that occurrence.
Pass the event JSON to find_transcript.py on stdin:
python3 "${CLAUDE_SKILL_DIR}/scripts/find_transcript.py" < "$EVENT_FILE"
The script returns JSON with a source field:
| source | Meaning | What to use |
|---|---|---|
| "attachment" | Found in event attachments | fileId field |
| "drive" | Found via Drive search | pick from files array |
| "none" | Not found anywhere | inform user and stop |
If source is "none": tell the user the transcript is not yet available
(Gemini may take several minutes after the meeting ends) and stop.
If source is "drive" and files has more than one entry: present a
numbered list (name, created date, link) and use AskUserQuestion to ask which
file to use.
If exactly one result: proceed automatically.
Store the chosen document ID as DOC_ID.
python3 "${CLAUDE_SKILL_DIR}/scripts/read_doc.py" "<DOC_ID>"
The script outputs the document as plain text. Store this as TRANSCRIPT. If
the script exits with an error or the output is empty, inform the user and stop.
Analyze TRANSCRIPT to identify 3–8 distinct discussion topics or agenda
items. For each topic, write a one-sentence description of what was discussed.
Present the topics as a numbered list, for example:
1. Sprint planning — The team aligned on story point allocations for the
upcoming two-week sprint.
2. CI pipeline failures — Discussed root cause of the nightly test failures
and assigned investigation owners.
3. Q3 roadmap review — Reviewed progress against Q3 milestones and flagged
three items at risk.
Use AskUserQuestion:
"Which topic would you like to summarize for the team email? Enter the number."
For the selected topic, extract from TRANSCRIPT:
Key decisions — concrete choices or conclusions reached (bullet list).
Action items — tasks assigned, including owner name and due date where
mentioned (bullet list; format each as [Owner] Task description — due DATE
when dates are present).
Present the formatted summary inline:
## Summary: <TOPIC NAME>
### Key Decisions
- ...
### Action Items
- [Alice] Investigate nightly test failures in module X — due Friday
- [Bob] Update the roadmap slide deck before next week's review
Ask the user:
"Does this summary look correct? Reply with any edits, or say 'approved' to draft the email."
Incorporate any requested edits and re-present until the user approves.
Invoke the gmail-draft skill, passing:
[Meeting Summary] <EVENT_TITLE> — <selected topic name>find_transcript.py returns "none", wait a few minutes and try again.gws auth login --readonly is sufficient for reading calendar, Drive, and Docs, but draft creation requires the gmail.compose scope included in the default (non-readonly) login. If draft creation fails with a 403, re-authenticate without --readonly.find_meeting.py only searches the past 7 days by default. For older meetings, pass a larger --days N value or specify --date YYYY-MM-DD.| Situation | Action |
|---|---|
| gws not found | Tell user to install gws and add it to PATH |
| Auth error (401/403) | Tell user to run gws auth login |
| No calendar events found | Widen search with --days N or ask user for the exact date |
| find_transcript.py returns "none" | Inform user; transcript may not be ready yet |
| read_doc.py returns empty output | Inform user; doc may be empty or wrong file |
| Draft creation fails | See error guidance in the gmail-draft skill |
tools
Use this skill to filter a pre-fetched set of Hacker News stories down to those that report supply-chain security threats relevant to software developers — including malicious packages on npm or PyPI, compromised developer tooling, and attacks targeting source code repositories or CI/CD infrastructure. Reads stories from stories.json in the workspace, performs semantic analysis (fetching HN threads when the title alone is ambiguous), and writes the stories worth alerting on to findings.json.
development
Run hexora static analysis on a Python package repository to detect suspicious code patterns, then triage findings with deterministic rules and AI reasoning to produce a structured risk report section.
development
Inspect recent git history of a Python package repository for suspicious commits touching supply-chain-sensitive files, then triage findings with AI reasoning to produce a structured risk report section.
development
Scan a Python package repository for compiled/binary files using Fromager-style detection and malcontent YARA analysis, then triage findings with deterministic rules and AI reasoning to produce a structured risk report section.