Skip to content

Bug: tools.web.fetch.firecrawl missing from Zod schema in v2026.3.8 #42570

@lmarostegam

Description

@lmarostegam

Description

Since version 2026.3.8, the firecrawl configuration key under tools.web.fetch is missing from the Zod runtime schema (ToolsWebFetchSchema), causing the gateway to crash on startup with a config validation error when the key is present in openclaw.json.

Steps to Reproduce

  1. Upgrade to OpenClaw 2026.3.8
  2. Have tools.web.fetch.firecrawl configured in ~/.openclaw/openclaw.json
  3. Start/restart the gateway

Expected Behavior

Gateway starts normally. tools.web.fetch.firecrawl should be a valid config key as documented in /docs/tools/firecrawl.md and defined in the TypeScript types (plugin-sdk/config/types.tools.d.ts).

Actual Behavior

Gateway crashes at startup with:

Config invalid
File: ~/.openclaw/openclaw.json
Problem:
  - tools.web.fetch: Unrecognized key: "firecrawl"
Run: openclaw doctor --fix

Root Cause

In dist/config-fNYFO3AL.js, ToolsWebFetchSchema is defined with .strict() and does not include the firecrawl property:

const ToolsWebFetchSchema = z.object({
    enabled: z.boolean().optional(),
    maxChars: z.number().int().positive().optional(),
    maxCharsCap: z.number().int().positive().optional(),
    timeoutSeconds: z.number().int().positive().optional(),
    cacheTtlMinutes: z.number().nonnegative().optional(),
    maxRedirects: z.number().int().nonnegative().optional(),
    userAgent: z.string().optional()
    // ⚠️ firecrawl is MISSING here
}).strict().optional();

The same issue exists in dist/plugin-sdk/config-DiiPndBn.js.

However, the TypeScript types in dist/plugin-sdk/config/types.tools.d.ts correctly include firecrawl:

firecrawl?: {
    enabled?: boolean;
    apiKey?: string;
    baseUrl?: string;
    onlyMainContent?: boolean;
    maxAgeMs?: number;
    timeoutSeconds?: number;
};

Suggested Fix

Add the firecrawl sub-schema to ToolsWebFetchSchema:

const ToolsWebFetchSchema = z.object({
    // ... existing fields ...
    userAgent: z.string().optional(),
    firecrawl: z.object({
        enabled: z.boolean().optional(),
        apiKey: z.string().optional(),
        baseUrl: z.string().optional(),
        onlyMainContent: z.boolean().optional(),
        maxAgeMs: z.number().optional(),
        timeoutSeconds: z.number().optional()
    }).strict().optional()
}).strict().optional();

Environment

  • OpenClaw version: 2026.3.8
  • OS: Linux 6.17.0-14-generic (x64)
  • Node: v22.22.1
  • Self-hosted Firecrawl at http://localhost:3002

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions