Agent Skills: Fireflies.ai Core Workflow B -- Search, AskFred & Analytics

|

UncategorizedID: jeremylongshore/claude-code-plugins-plus-skills/fireflies-core-workflow-b

Install this agent skill to your local

pnpm dlx add-skill https://github.com/jeremylongshore/claude-code-plugins-plus-skills/tree/HEAD/plugins/saas-packs/fireflies-pack/skills/fireflies-core-workflow-b

Skill Files

Browse the full folder contents for fireflies-core-workflow-b.

Download Skill

Loading file tree…

plugins/saas-packs/fireflies-pack/skills/fireflies-core-workflow-b/SKILL.md

Skill Metadata

Name
fireflies-core-workflow-b
Description
|

Fireflies.ai Core Workflow B -- Search, AskFred & Analytics

Overview

Secondary workflow: search across transcripts with keyword and date filters, use AskFred AI for natural language Q&A over meetings, and aggregate meeting analytics for reporting.

Prerequisites

  • Completed fireflies-install-auth setup
  • Familiarity with fireflies-core-workflow-a
  • AI credits for AskFred queries (check Fireflies dashboard)

Instructions

Step 1: Search Transcripts by Keyword

const SEARCH_TRANSCRIPTS = `
  query SearchMeetings(
    $keyword: String,
    $fromDate: DateTime,
    $toDate: DateTime,
    $participants: [String],
    $limit: Int
  ) {
    transcripts(
      keyword: $keyword
      fromDate: $fromDate
      toDate: $toDate
      participants: $participants
      limit: $limit
    ) {
      id title date duration
      organizer_email
      participants
      summary { overview action_items keywords }
    }
  }
`;

// Search for "quarterly review" in the last 30 days
const results = await firefliesQuery(SEARCH_TRANSCRIPTS, {
  keyword: "quarterly review",
  fromDate: new Date(Date.now() - 30 * 86400000).toISOString(),
  limit: 20,
});

console.log(`Found ${results.transcripts.length} matching meetings`);
for (const t of results.transcripts) {
  console.log(`  ${t.title} (${t.date}) - ${t.duration}min`);
}

Step 2: AskFred -- AI Q&A Over a Single Meeting

// Create a new AskFred thread tied to a transcript
const CREATE_THREAD = `
  mutation CreateThread($input: CreateAskFredThreadInput!) {
    createAskFredThread(input: $input) {
      id
      title
      messages {
        id
        answer
        suggested_queries
      }
    }
  }
`;

const thread = await firefliesQuery(CREATE_THREAD, {
  input: {
    query: "What were the key decisions made in this meeting?",
    transcript_id: "your-transcript-id",
  },
});

console.log("Fred says:", thread.createAskFredThread.messages[0].answer);
console.log("Suggested follow-ups:", thread.createAskFredThread.messages[0].suggested_queries);

Step 3: AskFred -- Continue a Conversation

const CONTINUE_THREAD = `
  mutation ContinueThread($thread_id: String!, $query: String!) {
    continueAskFredThread(thread_id: $thread_id, query: $query) {
      id
      answer
      suggested_queries
    }
  }
`;

const followUp = await firefliesQuery(CONTINUE_THREAD, {
  thread_id: thread.createAskFredThread.id,
  query: "Who is responsible for the action items?",
});

console.log("Follow-up:", followUp.continueAskFredThread.answer);

Step 4: AskFred -- Cross-Meeting Analysis

// Query across multiple meetings (no transcript_id = searches all)
const crossMeeting = await firefliesQuery(CREATE_THREAD, {
  input: {
    query: "What topics came up repeatedly across our sprint planning meetings?",
    // filters can narrow scope without tying to a single transcript
  },
});

Step 5: Meeting Analytics Aggregation

async function meetingAnalytics(days: number = 30) {
  const since = new Date(Date.now() - days * 86400000).toISOString();

  const data = await firefliesQuery(`
    query Analytics($fromDate: DateTime) {
      transcripts(fromDate: $fromDate, limit: 100) {
        id title date duration
        organizer_email participants
        summary { action_items keywords }
        analytics {
          speakers { name duration word_count questions }
          sentiments { positive_pct negative_pct }
        }
      }
    }
  `, { fromDate: since });

  const meetings = data.transcripts;
  const totalMinutes = meetings.reduce((s: number, m: any) => s + (m.duration || 0), 0);
  const totalActions = meetings.reduce(
    (s: number, m: any) => s + (m.summary?.action_items?.length || 0), 0
  );

  // Top keywords across all meetings
  const keywordCounts: Record<string, number> = {};
  for (const m of meetings) {
    for (const kw of m.summary?.keywords || []) {
      keywordCounts[kw] = (keywordCounts[kw] || 0) + 1;
    }
  }
  const topKeywords = Object.entries(keywordCounts)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 10);

  return {
    period: `${days} days`,
    totalMeetings: meetings.length,
    totalHours: (totalMinutes / 60).toFixed(1),
    totalActionItems: totalActions,
    avgDuration: Math.round(totalMinutes / meetings.length),
    topKeywords,
  };
}

Step 6: List and Manage AskFred Threads

// List all threads
const threads = await firefliesQuery(`{
  askfred_threads {
    id title transcript_id created_at
  }
}`);

// Delete a thread (cleanup)
await firefliesQuery(`
  mutation DeleteThread($id: String!) {
    deleteAskFredThread(thread_id: $id)
  }
`, { id: "thread-id-to-delete" });

AskFred Credits

AskFred API calls consume AI credits. If you receive require_ai_credits, visit the Upgrade section in your Fireflies dashboard to add credits. Budget accordingly for production use.

Error Handling

| Error | Cause | Solution | |-------|-------|----------| | require_ai_credits | No AI credits remaining | Purchase credits in Fireflies dashboard | | Empty search results | No matching transcripts | Broaden keyword or date range | | Thread not found | Invalid thread ID | List threads first to get valid IDs | | Rate limit 429 | Too many requests | Implement backoff per fireflies-rate-limits |

Output

  • Keyword search results across transcript history
  • AskFred AI-powered Q&A threads with suggested follow-ups
  • Cross-meeting analytics report with keyword trends

Resources

Next Steps

For common errors, see fireflies-common-errors.