About fireflies-transcript
fireflies-transcript is a read-only skill for retrieving meeting transcripts from Fireflies.ai as raw, speaker-labeled text. It is intended for agents handling transcript requests and includes steps to locate, fetch, and verify a meeting transcript.
Key features
- 01List and search meeting records
- 02Fetch transcript sentences and speakers
- 03Retrieve optional summaries and participants
- 04Verify transcript content before reporting
Use cases
- 01Find a meeting by date or title
- 02Save a speaker-labeled transcript to a file
- 03Check transcript speakers and topic
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ davidondrej/ skills --skill fireflies-transcriptAfter installing, type/fireflies-transcriptin Claude Code to confirm it loaded.
Bundled filesagents/openai.yaml
Details
From the project READMEFireflies 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)"'
dateis 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.
Optional extras on the same transcript(id:) query: summary { overview short_summary keywords },
participants, duration, meeting_link.
Failure modes
sentences: null— recording still processing or no audio captured; nothing to pull.errors[]in the response instead ofdata— usually a bad field name; fix the query.- 401/invalid key — key was rotated; ask the user for a new one (Fireflies dashboard: Settings -> Developer settings), update the local environment file.
Verify before reporting done
A pull is successful only if the sentence count is > 0 and the speakers/topic match the meeting the user asked about — check the first few lines, don't trust the title alone.