firecrawl-mcp 3.20.0 → 3.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -428,6 +428,7 @@ Scrape content from a single URL with advanced options.
428
428
  ```
429
429
 
430
430
  **Branding format:** Extracts comprehensive brand identity (colors, fonts, typography, spacing, logo, UI components) for design analysis or style replication.
431
+ **Privacy:** Set `redactPII: true` to return content with personally identifiable information redacted.
431
432
 
432
433
  **Returns:**
433
434
 
@@ -565,7 +566,8 @@ Search the web and optionally extract content from search results.
565
566
  "country": "us",
566
567
  "scrapeOptions": {
567
568
  "formats": ["markdown"],
568
- "onlyMainContent": true
569
+ "onlyMainContent": true,
570
+ "redactPII": true
569
571
  }
570
572
  }
571
573
  }
package/dist/index.js CHANGED
@@ -187,11 +187,19 @@ const server = new FastMCP({
187
187
  protectedResourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(),
188
188
  },
189
189
  authenticate: async (request) => {
190
- const headerCred = await resolveCredentialFromHeaders(request.headers);
190
+ // FastMCP invokes `authenticate(undefined)` for the stdio transport
191
+ // because there is no HTTP request context. Without this null guard,
192
+ // accessing `request.headers` throws a TypeError, FastMCP silently
193
+ // swallows it, and every subsequent tool call fails with
194
+ // "Unauthorized: API key is required when not using a self-hosted
195
+ // instance" even though `FIRECRAWL_API_KEY` is set in env.
196
+ const headerCred = request?.headers
197
+ ? await resolveCredentialFromHeaders(request.headers)
198
+ : undefined;
191
199
  const envCred = resolveCredentialFromEnv();
192
200
  if (process.env.CLOUD_SERVICE === 'true') {
193
201
  if (!headerCred) {
194
- throw new Error('Firecrawl credentials required: OAuth access token (Authorization: Bearer fco_) or API key (x-firecrawl-api-key)');
202
+ throw new Error('Firecrawl credentials required: OAuth access token (Authorization: Bearer fco_...) or API key (x-firecrawl-api-key)');
195
203
  }
196
204
  return { firecrawlApiKey: headerCred };
197
205
  }
@@ -205,7 +213,7 @@ const server = new FastMCP({
205
213
  process.exit(1);
206
214
  }
207
215
  if (httpStreaming && !credential && !process.env.FIRECRAWL_API_URL) {
208
- console.error('HTTP MCP transport requires FIRECRAWL_API_URL and/or credentials (OAuth: Authorization Bearer fco_…, or FIRECRAWL_API_KEY / FIRECRAWL_OAUTH_TOKEN)');
216
+ console.error('HTTP MCP transport requires FIRECRAWL_API_URL and/or credentials (OAuth: Authorization Bearer fco_..., or FIRECRAWL_API_KEY / FIRECRAWL_OAUTH_TOKEN)');
209
217
  process.exit(1);
210
218
  }
211
219
  return { firecrawlApiKey: credential };
@@ -372,6 +380,7 @@ const scrapeParamsSchema = z.object({
372
380
  })
373
381
  .optional(),
374
382
  onlyMainContent: z.boolean().optional(),
383
+ redactPII: z.boolean().optional(),
375
384
  includeTags: z.array(z.string()).optional(),
376
385
  excludeTags: z.array(z.string()).optional(),
377
386
  waitFor: z.number().optional(),
@@ -517,6 +526,7 @@ If JSON extraction returns empty, minimal, or just navigation content, the page
517
526
  **Branding format:** Extracts comprehensive brand identity (colors, fonts, typography, spacing, logo, UI components) for design analysis or style replication.
518
527
  **Performance:** Add maxAge parameter for 500% faster scrapes using cached data.
519
528
  **Lockdown mode:** Set \`lockdown: true\` to serve the request only from the existing index/cache without any outbound network request. For air-gapped or compliance-constrained use where the request URL itself is considered sensitive. Errors on cache miss. Billed at 5 credits.
529
+ **Privacy:** Set \`redactPII: true\` to return content with personally identifiable information redacted.
520
530
  **Returns:** JSON structured data, markdown, branding profile, or other formats as specified.
521
531
  ${SAFE_MODE
522
532
  ? '**Safe Mode:** Read-only content extraction. Interactive actions (click, write, executeJavascript) are disabled for security.'
@@ -1353,6 +1363,7 @@ if (process.env.CLOUD_SERVICE !== 'true') {
1353
1363
  })
1354
1364
  .optional(),
1355
1365
  onlyMainContent: z.boolean().optional(),
1366
+ redactPII: z.boolean().optional(),
1356
1367
  includeTags: z.array(z.string()).optional(),
1357
1368
  excludeTags: z.array(z.string()).optional(),
1358
1369
  removeBase64Images: z.boolean().optional(),
@@ -1394,6 +1405,7 @@ This is the fastest and most reliable way to extract content from a document on
1394
1405
 
1395
1406
  **Supported file types:** .html, .htm, .xhtml, .pdf, .docx, .doc, .odt, .rtf, .xlsx, .xls
1396
1407
  **Unsupported options:** actions, screenshot/branding/changeTracking formats, waitFor > 0, location, mobile, proxy values other than "auto" or "basic".
1408
+ **Privacy:** Set \`redactPII: true\` to return content with personally identifiable information redacted.
1397
1409
 
1398
1410
  **CRITICAL - Format Selection (same rules as firecrawl_scrape):**
1399
1411
  When the user asks for SPECIFIC data points from a document, you MUST use JSON format with a schema. Only use markdown when the user needs the ENTIRE document content.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "firecrawl-mcp",
3
- "version": "3.20.0",
3
+ "version": "3.20.2",
4
4
  "description": "MCP server for Firecrawl — search, scrape, and interact with the web. Supports both cloud and self-hosted instances. Features include web search, scraping, page interaction, batch processing, and LLM-powered content analysis.",
5
5
  "type": "module",
6
6
  "mcpName": "io.github.firecrawl/firecrawl-mcp-server",