fireflies-sdk-patterns
Provides production-ready, typed GraphQL client wrappers for the Fireflies.ai API.
Install
mkdir -p .claude/skills/fireflies-sdk-patterns && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/2405" && unzip -o skill.zip -d .claude/skills/fireflies-sdk-patterns && rm skill.zipInstalls to .claude/skills/fireflies-sdk-patterns
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Apply production-ready Fireflies.ai GraphQL client patterns for TypeScriptKey capabilities
- →Create a typed GraphQL client for Fireflies.ai
- →Implement a singleton pattern for the Fireflies.ai client
- →Develop a multi-tenant factory for Fireflies.ai clients
- →Validate Fireflies.ai API responses using Zod
- →Implement a Python client for Fireflies.ai
How it works
The skill provides code patterns for interacting with the Fireflies.ai GraphQL API, including a typed client, error handling, and patterns for singleton and multi-tenant deployments.
Inputs & outputs
When to use fireflies-sdk-patterns
- →Building typed Fireflies.ai API clients
- →Handling GraphQL API errors
- →Establishing team coding standards for integrations
- →Refactoring existing SDK usage
About this skill
Fireflies.ai Client Patterns
Overview
Production-ready patterns for the Fireflies.ai GraphQL API. Fireflies has no official SDK -- all interaction is via HTTP POST to https://api.fireflies.ai/graphql. These patterns provide typed wrappers, error handling, caching, and multi-tenant support.
Prerequisites
FIREFLIES_API_KEYenvironment variable set- TypeScript 5+ or Python 3.10+
- Optional:
graphql-requestfor typed queries
Instructions
Step 1: Typed GraphQL Client (TypeScript)
// lib/fireflies-client.ts
const FIREFLIES_API = "https://api.fireflies.ai/graphql";
interface FirefliesError {
message: string;
code?: string;
extensions?: { status: number; helpUrls?: string[] };
}
interface FirefliesResponse<T> {
data?: T;
errors?: FirefliesError[];
}
export class FirefliesClient {
private apiKey: string;
private baseUrl: string;
constructor(apiKey?: string) {
this.apiKey = apiKey || process.env.FIREFLIES_API_KEY!;
this.baseUrl = FIREFLIES_API;
if (!this.apiKey) throw new Error("FIREFLIES_API_KEY is required");
}
async query<T = any>(gql: string, variables?: Record<string, any>): Promise<T> {
const res = await fetch(this.baseUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${this.apiKey}`,
},
body: JSON.stringify({ query: gql, variables }),
});
const json: FirefliesResponse<T> = await res.json();
if (json.errors?.length) {
const err = json.errors[0];
const error = new Error(`Fireflies: ${err.message}`) as any;
error.code = err.code;
error.status = err.extensions?.status;
throw error;
}
return json.data!;
}
// Convenience methods for common queries
async getUser() {
return this.query<{ user: any }>(`{ user { name email user_id is_admin } }`);
}
async getTranscripts(limit = 20) {
return this.query<{ transcripts: any[] }>(`
query($limit: Int) {
transcripts(limit: $limit) {
id title date duration organizer_email participants
summary { overview action_items keywords }
}
}
`, { limit });
}
async getTranscript(id: string) {
return this.query<{ transcript: any }>(`
query($id: String!) {
transcript(id: $id) {
id title date duration
speakers { id name }
sentences { speaker_name text start_time end_time }
summary { overview action_items keywords short_summary }
analytics {
sentiments { positive_pct negative_pct neutral_pct }
speakers { name duration word_count questions }
}
}
}
`, { id });
}
}
Step 2: Singleton Pattern
// lib/fireflies.ts
let instance: FirefliesClient | null = null;
export function getFirefliesClient(): FirefliesClient {
if (!instance) {
instance = new FirefliesClient();
}
return instance;
}
Step 3: Multi-Tenant Factory
const tenantClients = new Map<string, FirefliesClient>();
export function getClientForTenant(tenantId: string): FirefliesClient {
if (!tenantClients.has(tenantId)) {
const apiKey = getTenantApiKey(tenantId); // from your secret store
tenantClients.set(tenantId, new FirefliesClient(apiKey));
}
return tenantClients.get(tenantId)!;
}
Step 4: Response Validation with Zod
import { z } from "zod";
const TranscriptSchema = z.object({
id: z.string(),
title: z.string(),
date: z.string(),
duration: z.number(),
speakers: z.array(z.object({ id: z.string(), name: z.string() })),
summary: z.object({
overview: z.string().nullable(),
action_items: z.array(z.string()).nullable(),
keywords: z.array(z.string()).nullable(),
}).nullable(),
});
type Transcript = z.infer<typeof TranscriptSchema>;
async function getValidatedTranscript(id: string): Promise<Transcript> {
const client = getFirefliesClient();
const { transcript } = await client.getTranscript(id);
return TranscriptSchema.parse(transcript);
}
Step 5: Python Client
import os
from typing import Any
import requests
class FirefliesClient:
API_URL = "https://api.fireflies.ai/graphql"
def __init__(self, api_key: str | None = None):
self.api_key = api_key or os.environ["FIREFLIES_API_KEY"]
def query(self, gql: str, variables: dict | None = None) -> dict[str, Any]:
resp = requests.post(
self.API_URL,
json={"query": gql, "variables": variables},
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {self.api_key}",
},
)
data = resp.json()
if "errors" in data:
raise Exception(f"Fireflies: {data['errors'][0]['message']}")
return data["data"]
def get_transcripts(self, limit: int = 20) -> list[dict]:
result = self.query("""
query($limit: Int) {
transcripts(limit: $limit) {
id title date duration organizer_email
summary { overview action_items keywords }
}
}
""", {"limit": limit})
return result["transcripts"]
def get_transcript(self, transcript_id: str) -> dict:
result = self.query("""
query($id: String!) {
transcript(id: $id) {
id title date duration
speakers { name }
sentences { speaker_name text start_time end_time }
summary { overview action_items keywords }
}
}
""", {"id": transcript_id})
return result["transcript"]
# Usage
client = FirefliesClient()
for t in client.get_transcripts(5):
print(f"{t['title']} - {t['duration']}min")
Error Handling
| Pattern | Use Case | Benefit |
|---|---|---|
| Typed client class | All API calls | Centralized auth and error handling |
| Singleton | Single-tenant apps | Reuse connection, consistent config |
| Factory | Multi-tenant SaaS | Isolated API keys per customer |
| Zod validation | API responses | Runtime type safety, catches schema drift |
Output
- Type-safe GraphQL client with error codes
- Singleton and factory patterns for different deployment models
- Zod schemas for runtime response validation
- Python client with identical API surface
Resources
Next Steps
Apply patterns in fireflies-core-workflow-a for real-world usage.
Prerequisites
How it compares
This skill offers structured, production-ready patterns for Fireflies.ai API interaction, unlike direct HTTP requests.
Compared to similar skills
fireflies-sdk-patterns side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| fireflies-sdk-patterns (this skill) | 1 | 27d | Caution | Intermediate |
| mcp-builder | 136 | 3mo | Review | Advanced |
| stripe-integration | 48 | 2mo | No flags | Advanced |
| copilot-sdk | 7 | 4mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
mcp-builder
anthropics
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
stripe-integration
wshobson
Implement Stripe payment processing for robust, PCI-compliant payment flows including checkout, subscriptions, and webhooks. Use when integrating Stripe payments, building subscription systems, or implementing secure checkout flows.
copilot-sdk
github
Build agentic applications with GitHub Copilot SDK. Use when embedding AI agents in apps, creating custom tools, implementing streaming responses, managing sessions, connecting to MCP servers, or creating custom agents. Triggers on Copilot SDK, GitHub SDK, agentic app, embed Copilot, programmable agent, MCP server, custom agent.
openrouter-hello-world
jeremylongshore
Create your first OpenRouter API request with a simple example. Use when learning OpenRouter or testing your setup. Trigger with phrases like 'openrouter hello world', 'openrouter first request', 'openrouter quickstart', 'test openrouter'.
telegram-dev
2025Emma
Telegram 生态开发全栈指南 - 涵盖 Bot API、Mini Apps (Web Apps)、MTProto 客户端开发。包括消息处理、支付、内联模式、Webhook、认证、存储、传感器 API 等完整开发资源。
mistral-upgrade-migration
jeremylongshore
Analyze, plan, and execute Mistral AI SDK upgrades with breaking change detection. Use when upgrading Mistral SDK versions, detecting deprecations, or migrating to new API versions. Trigger with phrases like "upgrade mistral", "mistral migration", "mistral breaking changes", "update mistral SDK", "analyze mistral version".