SuperAPI AI Directory

meetings-prep

Office & productivity

View repository

Updated 10-15 23:49

About this skill

Meeting Prep Skill

Purpose

Produce a structured, medium-length prep card before any meeting β€” sourced from Fireflies, Slack, Jira, Gmail, and Confluence. Output is shown in chat only, never written anywhere.

Tone: Direct. Like a prepared EA handing you a briefing note 10 minutes before the room. Length: Under 500 words. Structured sections. Every line must trace to a real source. Priority order: Last session context β†’ Recent Slack threads β†’ Talking points β†’ Attendees β†’ Blockers.


Key Constants

  • Jira / Confluence Cloud ID: use the Cloud ID from the user's project context (e.g. yourorg.atlassian.net). If not provided, ask the user before querying Jira/Confluence.
  • Default Fireflies scan window: last 60 days (find most recent session with same attendees/title)
  • Default Slack scan window: last 7 days

Step 0: Resolve the meeting

From the user's message, extract:

  • Meeting name / title (e.g. "weekly sync", "call with client", "refinement")
  • Timing signal β€” if the user said "in 30 minutes", "in an hour", etc., use that to look up the next calendar event in that window
  • People mentioned β€” names, emails, or client names that narrow down which meeting

Calendar lookup

Always look up Google Calendar to anchor to a real event:

Google Calendar:list_events(
  startTime: "<now>",
  endTime: "<now + 24h>",   // extend to 48h if nothing found in 24h
  timeZone: "<user's local timezone, e.g. Europe/Warsaw, America/New_York>",
  orderBy: "startTime"
)

If the user gave a meeting name: find the event whose title best matches. If the user said "in N minutes/hours": find the next event starting within that window. If multiple matches exist: show them as a quick-tap list and ask the user to pick one. Do NOT proceed without confirming. If no calendar event is found: ask "I couldn't find this on your calendar β€” can you confirm the meeting title or paste the invite details?"

Once the meeting is confirmed, extract:

  • title, start time, attendees (names + emails)
  • description / agenda from the calendar event itself (if any)
  • Derived project keyword β€” strip meeting-type words ("daily", "refinement", "call", "sync", "weekly") and use what's left (e.g. "Acme daily" β†’ Acme, "ProjectX Refinement" β†’ ProjectX)

Step 1: Scan all sources in parallel

Run all of the following simultaneously. Don't wait for one before starting another.

1a. Fireflies β€” last session with same title or attendees

fireflies_get_transcripts(
  keyword: "<meeting title or project keyword>",
  scope: "title",
  limit: 3
)

If title-based search returns nothing, retry with attendee email:

fireflies_get_transcripts(
  participantEmail: "<attendee email>",
  limit: 3
)

Call fireflies_get_summary on the most recent result. Extract:

  • Overall outcome / what was discussed
  • Decisions made
  • Action items assigned to the user (unresolved ones only)
  • Open questions that weren't resolved

If no transcript found: mark as "No previous session found" β€” do NOT invent content.

1b. Slack β€” recent threads about this topic

Tip: If channel IDs are known (e.g. from a project prompt), use them directly β€” don't search by name. Querying by ID is faster and more reliable.

slack_search_public_and_private(
  query: "<project keyword> after:<7-days-ago>",
  limit: 10,
  sort: "timestamp"
)

Also scan the channel directly if a channel ID is known:

slack_read_channel(channel_id: "<proj-channel-id>", oldest: <7d-unix-ts>, limit: 30)

For any message that looks like it has a reply thread (indicated by thread_ts), read the full thread to get the complete context β€” decisions and answers are often in replies, not in the original message:

slack_read_thread(channel_id: "<channel-id>", thread_ts: "<ts>")

Extract: unresolved questions, blockers, decisions made in Slack (not in Jira), any messages directed at the user that haven't been resolved.

1c. Jira β€” open tickets for this project

Derive Jira project key from the project keyword (look up if not known):

JQL: project = "<KEY>" AND status NOT IN (Done, Closed) ORDER BY priority DESC
fields: summary, status, assignee, priority, issuetype
maxResults: 10

Focus on: Blocked tickets, High/Critical priority, items In Review awaiting feedback, anything assigned to the user. Skip routine In-Progress tickets unless they're relevant to the meeting topic.

1d. Gmail β€” recent emails about this meeting or project

search_threads(
  query: "<project keyword> OR <attendee email> after:<YYYY/MM/DD 7 days ago>",
  maxResults: 10
)

Extract: anything with "action required", decisions communicated via email, open threads awaiting the user's reply, anything relevant to this meeting's agenda.

1e. Confluence β€” relevant documentation or decisions

searchConfluenceUsingCql(
  cql: "text ~ \"<project keyword>\" AND lastmodified >= \"<14-days-ago>\" ORDER BY lastmodified DESC",
  limit: 5
)

Also try:

cql: "title ~ \"<project keyword>\" ORDER BY lastmodified DESC"
limit: 3

Extract: recent page updates, decision logs, specs, or architecture docs that are relevant to what's likely to come up.


Step 2: Synthesise

Cross-reference all sources. Build the talking points section like this:

Sourced talking points β€” items that directly emerge from Fireflies/Slack/Jira/Gmail/Confluence:

  • Unresolved action item from last session β†’ raise it
  • Blocked ticket β†’ flag it
  • Open Slack question β†’ resolve it
  • Email thread waiting for input β†’ address it

AI-inferred talking points (labelled clearly) β€” based on the meeting type and context, what a prepared PM would logically raise:

  • For a daily/standup: what's the sprint velocity, any impediments?
  • For a refinement: are requirements clear, any edge cases?
  • For a client call: what did we commit to last time, what's the status?
  • For a 1:1: any feedback loops, blockers, career/team topics?

Label all AI-inferred points with πŸ’‘ suggested: so the user knows they're not sourced.


Output Format

πŸ“… Meeting Prep β€” [Meeting Title]
πŸ•™ [HH:MM today / date if not today] Β· [Duration if known] Β· [Location/link if in calendar]
πŸ‘₯ [Attendee 1, Attendee 2, + N others]

---

**πŸ—£οΈ Last session** *(Fireflies β€” [date])*
β€’ [1–2 sentence outcome summary]
β€’ [Decision made: ...]
β€’ βœ… Your open item from last time: [action item β€” if any]
β€’ ❓ Unresolved question: [if any]

**πŸ’¬ Recent Slack** *(last 7 days)*
β€’ [Unresolved thread or message β€” from whom, about what]
β€’ [Another one if relevant]

**πŸ“‹ Jira** *(open items)*
β€’ πŸ”΄ [PROJ-123] [Blocked ticket title]
β€’ ⚠️ [PROJ-456] [High priority item]

**πŸ“§ Email**
β€’ [Thread subject] β€” [what's pending]

**πŸ“ Confluence**
β€’ [Page title] updated [date] β€” [1-line relevance note]

---

**🎯 Talking points**
β€’ [Sourced: raise unresolved action item X]
β€’ [Sourced: address blocked ticket PROJ-123]
β€’ πŸ’‘ suggested: [AI-inferred point β€” clearly labelled]
β€’ πŸ’‘ suggested: [another inferred point]

---

**πŸ‘₯ Who's in the room**
β€’ [Name] β€” [role / what they own on this project, if known from Slack/Jira/Fireflies]

Section Rules

πŸ—£οΈ Last session β€” mandatory if Fireflies found anything. One session only (most recent). Max 4 bullets. If no transcript: No previous session found in Fireflies.

πŸ’¬ Recent Slack β€” only unresolved threads or direct questions. Skip emoji reactions, casual banter, resolved threads. If nothing: omit section.

πŸ“‹ Jira β€” only Blocked, High/Critical, or In Review items. Skip routine In-Progress. If nothing relevant: omit section.

πŸ“§ Email β€” only threads awaiting action or directly about this meeting. If nothing: omit.

πŸ“ Confluence β€” only if a page update is directly relevant to what's likely to come up. If nothing recent: omit.

🎯 Talking points β€” always present. Minimum 2 bullets. Max 6. Sourced ones first, πŸ’‘ suggested: ones last. Never fabricate sourced bullets β€” if you can't point to a source, label it as suggested.

πŸ‘₯ Who's in the room β€” list attendees from the calendar event. Add role/context only if found in Slack, Jira, or Fireflies. Never invent roles. If there are only two attendees: skip section (already obvious).

Sections with nothing to report are omitted entirely β€” never write "Nothing found."


Step 3: Proactive follow-up suggestions

After presenting the prep card, always append a short block:

---
**πŸ’¬ Want me to:**
β€’ [ ] Create a Jira ticket for [unresolved item]?
β€’ [ ] Draft a Slack message to [attendee] about [open question]?
β€’ [ ] Pull the full Fireflies transcript from last session?
β€’ [ ] Search Confluence for [topic] in more depth?

Only suggest actions that are grounded in what was actually found. Don't invent suggestions. Max 3–4 suggestions. If nothing actionable: skip this block.


Scan Caveats

If a source fails or returns nothing, skip it silently and note at the bottom: *(Confluence not scanned β€” no access)*

If the meeting is more than 2 hours away, add a note: *(Prep generated [X] hours before the meeting β€” Slack/email may update before then.)*


Quality Checks

Before presenting, verify:

  • Every sourced bullet traces to a real tool result
  • All AI-inferred points are labelled πŸ’‘ suggested:
  • No section says "Nothing found" β€” omit instead
  • Talking points section always present, min 2 bullets
  • Total under 500 words
  • Follow-up suggestions are grounded, not generic
  • Meeting confirmed from calendar before scanning (never prepped from name alone)