Skip to content
Back to skills

Process Meeting

BSecurity

Processes a Fireflies meeting recording into a structured summary with Todoist action items and a database log entry. Use when processing meeting notes, creating tasks from meetings, or logging a recorded call.

  • 4 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 12, 2026
securitypythonshellbashsqlapidatabase

Works with

  • api
  • mcp

Security analysis

B88/100
  • criticalSends environment variables or credentials to an external URL

Pro scans all 4 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add MattVOLTA/outworkos_diy --skill process-meeting --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Process Meeting?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Process Meeting
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/mattvolta-process-meeting/badge)](https://www.skillsdirectory.com/skills/mattvolta-process-meeting)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: process-meeting
description: "Processes a Fireflies meeting recording into a structured summary with Todoist action items and a database log entry. Use when processing meeting notes, creating tasks from meetings, or logging a recorded call."
argument-hint: ["<fireflies-url-or-transcript-id>"]
---

# Process Meeting

## Purpose

Transform a Fireflies meeting recording into a structured summary, create Todoist tasks for action items, and log the meeting to the database. One command turns a recorded call into tracked work.

## Prerequisites

- Fireflies API token in Vault (label: `fireflies_token`)
- Todoist API token in Vault (label: `todoist_api_token`)
- Supabase MCP available for database writes
- SessionStart manifest in context (for project matching)

## Execution Steps

### Step 1: Accept Input

The user provides either:
- A Fireflies URL: `https://app.fireflies.ai/view/TITLE::TRANSCRIPT_ID`
- A direct transcript ID

**Parse the transcript ID** from a URL by extracting everything after the last `::`. If the user provides a raw ID, use it directly. If no input is provided, search recent Fireflies transcripts and let the user pick.

To search recent transcripts, use Fireflies MCP tools. Discover them via ToolSearch at runtime:
```
ToolSearch: "fireflies search transcript"
```

### Step 2: Fetch Transcript

Fetch the full transcript from the Fireflies GraphQL API. See `references/fireflies-api.md` for the query structure, authentication, and field details.

```bash
FIREFLIES_TOKEN=$("$OUTWORKOS_ROOT/scripts/get-secret.sh" fireflies_token)

curl -s -X POST https://api.fireflies.ai/graphql \
  -H "Authorization: Bearer $FIREFLIES_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "query { transcript(id: \"TRANSCRIPT_ID\") { title date duration participants sentences { text speaker_name } summary { action_items overview shorthand_bullet } } }"
  }'
```

Replace `TRANSCRIPT_ID` with the parsed ID from Step 1. Extract:
- `title`, `date`, `duration`, `participants`
- `summary.overview` for the meeting summary
- `summary.shorthand_bullet` for key topics
- `summary.action_items` for tasks to create

If the API returns an error or empty result, try the Fireflies MCP tools as fallback:
```
ToolSearch: "fireflies get transcript"
```

### Step 3: Identify Project

Match the meeting to a known project using the SessionStart manifest:

1. **Check participants** against project people/contacts in the manifest
2. **Check title keywords** against project names and slugs
3. **If ambiguous**, present the top matches and ask the user to confirm
4. **If no match**, ask the user which project this meeting belongs to

Extract the project's `DB ID` and `Todoist ID` from the manifest for use in Steps 5 and 6.

### Step 4: Generate Summary

Format the transcript data using the template in `references/output-template.md`. Fill in:
- **Title** from transcript title
- **Date** formatted as YYYY-MM-DD
- **Duration** converted to human-readable (e.g., "42 minutes")
- **Attendees** from participants list
- **Summary** from `summary.overview`
- **Key Topics** from `summary.shorthand_bullet` (as bullet points)
- **Decisions** extracted from the overview and action items context
- **Action Items** from `summary.action_items` with assignee and due date where mentioned

Present the formatted summary to the user for review before proceeding.

### Step 5: Create Todoist Tasks

For each action item, create a task in the matched project's Todoist project. See `references/todoist-patterns.md` for the batch API pattern.

**Build the batch payload in Python** to avoid shell escaping issues:

```python
import json, uuid

TODOIST_PROJECT_ID = "PROJECT_ID"  # From Step 3

commands = []
for item in action_items:
    commands.append({
        "type": "item_add",
        "uuid": str(uuid.uuid4()),
        "temp_id": str(uuid.uuid4()),
        "args": {
            "content": item["task"],
            "project_id": TODOIST_PROJECT_ID,
            "description": f"Fireflies: {transcript_id}. From meeting: {meeting_title}",
            "priority": 2,
            "labels": ["from-meeting"]
        }
    })

payload = {"commands": commands}
with open("/tmp/meeting-tasks.json", "w") as f:
    json.dump(payload, f)
```

Then send the batch:
```bash
TODOIST_API_TOKEN=$("$OUTWORKOS_ROOT/scripts/get-secret.sh" todoist_api_token)
curl -s -X POST "https://api.todoist.com/api/v1/sync" \
  -H "Authorization: Bearer $TODOIST_API_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Request-Id: $(uuidgen)" \
  -d @/tmp/meeting-tasks.json
```

Check `sync_status` in the response to verify each task was created. Use `temp_id_mapping` to get the real task IDs.

### Step 6: Log to Database

Insert a log entry via Supabase MCP `execute_sql`. Discover the tool at runtime:
```
ToolSearch: "supabase execute sql"
```

SQL to execute:
```sql
INSERT INTO log_entries (user_id, project_id, entry_date, session_title, content, source, metadata)
VALUES (
  auth.uid(),
  '{project_db_id}',
  '{YYYY-MM-DD}',
  'Meeting: {title}',
  '{full markdown summary from Step 4}',
  'fireflies',
  '{
    "transcript_id": "{transcript_id}",
    "attendees": [{attendees array}],
    "duration_minutes": {duration},
    "action_items_count": {count},
    "todoist_task_ids": [{created task IDs}]
  }'::jsonb
);
```

### Step 7: Present Results

Show the user:
1. The formatted meeting summary (from Step 4)
2. List of Todoist tasks created with their IDs
3. Confirmation that the log entry was written to the database

## Key Rules

- **Secrets from Vault only** via `$OUTWORKOS_ROOT/scripts/get-secret.sh <label>`. Never hardcode tokens.
- **Generic tool references** in all instructions. Never hardcode MCP tool names. Use ToolSearch to discover tools at runtime.
- **User ID for DB writes:** Use `auth.uid()` -- the authenticated user's ID from the current session.
- **Python for JSON payloads.** Build Todoist batch payloads in Python, write to temp file, then curl. Avoids shell escaping issues.
- **Present before committing.** Show the summary and proposed tasks to the user before creating Todoist tasks or writing DB entries.

## Edge Cases

- **No action items in transcript**: Skip Step 5, log the meeting summary only
- **Fireflies token expired**: Flag the error and tell the user to update via `$OUTWORKOS_ROOT/scripts/set-secret.sh fireflies_token <new_token>`
- **Todoist token expired**: Flag the 401/403 and tell the user to update via `$OUTWORKOS_ROOT/scripts/set-secret.sh todoist_api_token <new_token>`
- **No project match**: Ask the user; if truly ad-hoc, log to the Outwork OS project as a catch-all
- **Multiple meetings in one session**: Process each sequentially, one `/process-meeting` invocation per transcript

Files in this skill

  • SKILL.md6.6 KB
  • references/fireflies-api.md3.1 KB
  • references/output-template.md1.7 KB
  • references/todoist-patterns.md3.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.