Claude-skill-registry firecrawl-sdk-patterns
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/firecrawl-sdk-patterns" ~/.claude/skills/majiayu000-claude-skill-registry-firecrawl-sdk-patterns && rm -rf "$T"
manifest:
skills/data/firecrawl-sdk-patterns/SKILL.mdsource content
FireCrawl SDK Patterns
Overview
Production-ready patterns for FireCrawl SDK usage in TypeScript and Python.
Prerequisites
- Completed
setupfirecrawl-install-auth - Familiarity with async/await patterns
- Understanding of error handling best practices
Instructions
Step 1: Implement Singleton Pattern (Recommended)
// src/firecrawl/client.ts import { FireCrawlClient } from '@firecrawl/sdk'; let instance: FireCrawlClient | null = null; export function getFireCrawlClient(): FireCrawlClient { if (!instance) { instance = new FireCrawlClient({ apiKey: process.env.FIRECRAWL_API_KEY!, // Additional options }); } return instance; }
Step 2: Add Error Handling Wrapper
import { FireCrawlError } from '@firecrawl/sdk'; async function safeFireCrawlCall<T>( operation: () => Promise<T> ): Promise<{ data: T | null; error: Error | null }> { try { const data = await operation(); return { data, error: null }; } catch (err) { if (err instanceof FireCrawlError) { console.error({ code: err.code, message: err.message, }); } return { data: null, error: err as Error }; } }
Step 3: Implement Retry Logic
async function withRetry<T>( operation: () => Promise<T>, maxRetries = 3, backoffMs = 1000 ): Promise<T> { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { return await operation(); } catch (err) { if (attempt === maxRetries) throw err; const delay = backoffMs * Math.pow(2, attempt - 1); await new Promise(r => setTimeout(r, delay)); } } throw new Error('Unreachable'); }
Output
- Type-safe client singleton
- Robust error handling with structured logging
- Automatic retry with exponential backoff
- Runtime validation for API responses
Error Handling
| Pattern | Use Case | Benefit |
|---|---|---|
| Safe wrapper | All API calls | Prevents uncaught exceptions |
| Retry logic | Transient failures | Improves reliability |
| Type guards | Response validation | Catches API changes |
| Logging | All operations | Debugging and monitoring |
Examples
Factory Pattern (Multi-tenant)
const clients = new Map<string, FireCrawlClient>(); export function getClientForTenant(tenantId: string): FireCrawlClient { if (!clients.has(tenantId)) { const apiKey = getTenantApiKey(tenantId); clients.set(tenantId, new FireCrawlClient({ apiKey })); } return clients.get(tenantId)!; }
Python Context Manager
from contextlib import asynccontextmanager from firecrawl import FireCrawlClient @asynccontextmanager async def get_firecrawl_client(): client = FireCrawlClient() try: yield client finally: await client.close()
Zod Validation
import { z } from 'zod'; const firecrawlResponseSchema = z.object({ id: z.string(), status: z.enum(['active', 'inactive']), createdAt: z.string().datetime(), });
Resources
Next Steps
Apply patterns in
firecrawl-core-workflow-a for real-world usage.