Skills

Fireflies Transcript

Fetch raw Fireflies.ai meeting transcripts.

Install

npx skills add davidondrej/skills --skill fireflies-transcript -g -a claude-code -y
Repository
davidondrej/skills4.2k
Category
Engineering
Updated
3d ago
License
MIT
Context cost
Lightabout 656 tokens
Runs scripts
No, instructions only

What it does

Fetch raw Fireflies.ai meeting transcripts. Use only when the user explicitly invokes /fireflies-transcript; for YouTube, use youtube-transcript.

Fireflies Transcript

Fetch any meeting transcript from Fireflies.ai as raw text via GraphQL. Read-only.

Auth (state-check first)

Load the API key from a local environment file (mode 600, never commit or print it):

source "$SERVICE_ENV_FILE"   # exports API_KEY
[ -n "$API_KEY" ] || echo "MISSING KEY - stop and tell the user"

Every call is a POST to https://api.fireflies.ai/graphql with Authorization: Bearer <API_KEY> and a JSON body {"query": "..."}.

Step 1 - find the meeting id

curl -sS -X POST https://api.fireflies.ai/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API_KEY>" \
  -d '{"query":"{ transcripts(limit: 25) { id title date duration } }"}' \
  | jq -r '.data.transcripts[] | "\(.id) | \(.title) | \(.date)"'
  • date is epoch milliseconds. Convert on macOS: date -r $((1784127600000/1000)).
  • The transcripts(title:) filter is EXACT-match, it returns [] for partial names. List recent meetings and grep locally instead.
  • Ad-hoc meetings have no proper title (e.g. Untitled - Wed, 15 Jul 2026 17:00:55 CEST). Identify those by date/time, then confirm via content or speakers, not the title.
  • Paginate older meetings with skip: (e.g. transcripts(limit: 50, skip: 25)).

Step 2 - pull the raw transcript

QUERY='{ transcript(id: "MEETING_ID") { title sentences { speaker_name text } } }'
curl -sS -X POST https://api.fireflies.ai/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API_KEY>" \
  -d "$(jq -nc --arg query "$QUERY" '{query: $query}')" \
  > /tmp/ff.json

# speaker-labeled raw text (usual deliverable)
jq -r '.data.transcript.sentences[] | "\(.speaker_name): \(.text)"' /tmp/ff.json

# bare text only
jq -r '.data.transcript.sentences[].text' /tmp/ff.json

Transcripts run to hundreds of sentences, save to a file, never dump to stdout/chat.

Read the whole SKILL.md on GitHub

More in Engineering