From 31b1e5815aa7bb02317df72a4a2438c41dae6063 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 6 Aug 2026 21:55:15 -0400 Subject: [PATCH] docs: fix verified SDK, CLI, and MCP drift --- mcp-server/tools.mdx | 12 ++-- migrate-to-v2.mdx | 4 +- quickstarts/nodejs.mdx | 2 +- quickstarts/python.mdx | 2 +- reconciliation/INITIAL_DRIFT_REPORT.md | 89 ++++++++++++++++++++++++++ sdks/cli.mdx | 4 +- sdks/node.mdx | 2 +- 7 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 reconciliation/INITIAL_DRIFT_REPORT.md diff --git a/mcp-server/tools.mdx b/mcp-server/tools.mdx index 06e5e30cf..37a565cde 100644 --- a/mcp-server/tools.mdx +++ b/mcp-server/tools.mdx @@ -193,7 +193,7 @@ The upload command sends the file bytes to a short-lived signed upload target. I ### 5. Crawl Tool (`firecrawl_crawl`) -Start an asynchronous crawl with advanced options. +Start a crawl with advanced options. This MCP call blocks while the server polls the crawl to a terminal state, then returns the final status and collected data. ```json { @@ -249,24 +249,22 @@ Extract structured information from web pages using LLM capabilities. Supports b } ``` -Example response: +Example MCP response (`content[0].text` contains serialized JSON): ```json { "content": [ { "type": "text", - "text": { - "name": "Example Product", - "price": 99.99, - "description": "This is an example product description" - } + "text": "{\n \"name\": \"Example Product\",\n \"price\": 99.99,\n \"description\": \"This is an example product description\"\n}" } ], "isError": false } ``` +Parse `content[0].text` as JSON to access the decoded extracted payload. + #### Extract Tool Options: - `urls`: Array of URLs to extract information from diff --git a/migrate-to-v2.mdx b/migrate-to-v2.mdx index 07d4101f9..63feb28f8 100644 --- a/migrate-to-v2.mdx +++ b/migrate-to-v2.mdx @@ -85,8 +85,8 @@ og:description: "Key changes, mappings, and before/after snippets to upgrade you |------------------------------------|-------------------| | `generateLLMsText(...)` | (not in v2 SDK) | | `checkGenerateLLMsTextStatus(id)` | (not in v2 SDK) | -| `crawlUrlAndWatch(...)` | `watcher(jobId, ...)` | -| `batchScrapeUrlsAndWatch(...)` | `watcher(jobId, ...)` | +| `crawlUrlAndWatch(...)` | `watcher(jobId, options?)` | +| `batchScrapeUrlsAndWatch(...)` | `watcher(jobId, options?)` | --- diff --git a/quickstarts/nodejs.mdx b/quickstarts/nodejs.mdx index d6afb6818..dfae19db2 100644 --- a/quickstarts/nodejs.mdx +++ b/quickstarts/nodejs.mdx @@ -7,7 +7,7 @@ og:description: "Get started with Firecrawl in Node.js. Scrape, search, and inte ## Prerequisites -- Node.js 18+ +- Node.js 22+ - A Firecrawl API key — [get one free](https://www.firecrawl.dev/app/api-keys) ## Install the SDK diff --git a/quickstarts/python.mdx b/quickstarts/python.mdx index 0647f17a9..60c106afe 100644 --- a/quickstarts/python.mdx +++ b/quickstarts/python.mdx @@ -41,7 +41,7 @@ print(result.markdown) "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...", "metadata": { "title": "Example Domain", - "sourceURL": "https://example.com" + "source_url": "https://example.com" } } ``` diff --git a/reconciliation/INITIAL_DRIFT_REPORT.md b/reconciliation/INITIAL_DRIFT_REPORT.md new file mode 100644 index 000000000..0985b8340 --- /dev/null +++ b/reconciliation/INITIAL_DRIFT_REPORT.md @@ -0,0 +1,89 @@ +# Initial documentation drift report + +Initial verification date: 2026-08-02
+Narrowed pull-request verification date: 2026-08-06
+Documentation scope: base English/source files
+Publication state: [PR #1195](https://github.com/firecrawl/firecrawl-docs/pull/1195) is open; the six documentation fixes are not active until merge. Reconciliation automation is deferred to a follow-up change. + +## TL;DR + +- The first reconciliation pass classified **26 candidates**: 11 confirmed drifts, 8 generated-source lags, 2 Cloud/open-source differences, 2 contradictory documentation cases, and 3 items requiring owner decisions. +- This change fixes six high-confidence mismatches across Node.js, Python, CLI, and MCP documentation. +- This report records the source revisions and evidence used to verify those fixes; executable reconciliation is intentionally deferred. +- The remaining 20 candidates stay open or decision-dependent and provide the initial coverage backlog. + +## Classification totals + +| Classification | Count | +| --- | ---: | +| Confirmed drift | 11 | +| Generated-source lag | 8 | +| Intentional Cloud/open-source difference | 2 | +| Duplicate or contradictory documentation | 2 | +| Requires owner input | 3 | + +Severity totals are 6 high, 18 medium, and 2 low. + +## Source revisions + +- Docs base inspected during the initial pass: `firecrawl/firecrawl-docs@74685645ef42be41278f18278c708ab7547f3bb6` +- Product and bundled SDKs: `firecrawl/firecrawl@9554ad079840b0d405d5b1e5b1c57e577b4249cb` +- CLI: `firecrawl/cli@a151277b48a95f5728dc4dbc0dc7bd6d18709408` +- MCP: `firecrawl/firecrawl-mcp-server@41c257161d6b29a849fb66e097d5e5beccefdf2a` + +These revisions are evidence snapshots for the initial classification, not a claim that the repositories have remained unchanged. + +The six fixed findings were reverified against the published JavaScript SDK `4.32.0`, Python SDK `4.34.0`, CLI `1.19.29`, and MCP server `3.23.4` packages on 2026-08-06. + +## Candidate index + +| ID | Severity | Classification | Disposition | Affected documentation | Finding | +| --- | --- | --- | --- | --- | --- | +| API-001 | High | Requires owner input | Open | v2 OpenAPI | The configured product comparator is a v1 spec, so an owner-approved production v2 source is required before operation parity can be judged. | +| API-002 | High | Confirmed drift | Open | v1/v2 OpenAPI; failed webhook snippet | Crawl and batch webhook schemas advertise job-level `failed` events, while the inspected runtime completes with failed pages instead. | +| API-003 | Medium | Generated-source lag | Open | v2 OpenAPI; advanced Scrape guide | The public `attributes` format is implemented and documented in the guide but absent from the v2 request and response schemas. | +| API-004 | Medium | Generated-source lag | Open | v1 OpenAPI; account endpoint pages | Three documented account operations are registered in product routes but absent from the product v1 OpenAPI artifact. | +| API-005 | Medium | Contradictory documentation | Open | Webhook events guide; callback OpenAPI | The shared payload guide omits the always-emitted `webhookId` required by the callback schema. | +| API-006 | High | Cloud/open-source difference | Open | Webhook security; self-hosting | Self-hosted delivery is unsigned unless an HMAC secret is configured, while the security guide states signatures universally. | +| API-007 | Medium | Cloud/open-source difference | Open | Webhook overview; self-hosting | Direct self-hosted delivery is single-attempt, so the universal retry schedule does not apply to that path. | +| API-008 | Medium | Generated-source lag | Open | Webhook callback OpenAPI | The callback specification omits implemented Extract started, completed, and failed events. | +| API-009 | Low | Contradictory documentation | Open | Webhook overview and events guide | The overview omits implemented `monitor.page`, while the detailed guide and callback spec include it. | +| API-010 | Medium | Confirmed drift | Open | Webhook overview and testing | The docs require HTTPS, but the inspected request validation and delivery paths do not enforce the protocol. | +| JS-001 | High | Confirmed drift | **Fixed** | `quickstarts/nodejs.mdx` | The quickstart allowed Node.js 18+, while the pinned JavaScript SDK requires Node.js 22+. | +| JS-002 | Medium | Confirmed drift | **Fixed** | `sdks/node.mdx`; `migrate-to-v2.mdx` | V2 prose named the v1-only `crawlUrlAndWatch`; the v2 method is `watcher(jobId, options)`. | +| JS-003 | Medium | Generated-source lag | Open | Node agent source-of-truth page | The page version marker lags the pinned source manifest; published-package status was not queried. | +| JS-004 | Medium | Requires owner input | Open | Node install snippets and source-of-truth page | Workspace manifests do not unambiguously identify the canonical published package artifact. | +| PY-001 | Medium | Confirmed drift | **Fixed** | `quickstarts/python.mdx` | The quickstart used `metadata.sourceURL`, while the SDK normalizes it to `metadata.source_url`. | +| PY-002 | Medium | Generated-source lag | Open | Python agent source-of-truth page | The page version marker lags the pinned source declaration; published-package status was not queried. | +| CLI-001 | High | Confirmed drift | **Fixed** | `sdks/cli.mdx` | Single-format links output is newline-delimited, so the JSON pipeline must explicitly request JSON. | +| CLI-002 | Medium | Confirmed drift | Open | CLI Search page and snippets | Search `--pretty` is documented, but its option registration is disabled. | +| CLI-003 | Medium | Confirmed drift | Open | CLI option tables | Tables labeled “Available Options” omit implemented Scrape, Search, and Monitor flags. | +| CLI-004 | Low | Generated-source lag | Open | CLI status example | Illustrative output pins an older CLI version than the inspected source. | +| MCP-001 | High | Confirmed drift | **Fixed** | `mcp-server/tools.mdx` | `firecrawl_crawl` was described as asynchronous, but it polls to a terminal state before returning. | +| MCP-002 | Medium | Confirmed drift | **Fixed** | `mcp-server/tools.mdx` | The example showed `content[0].text` as an object, while the implementation returns a JSON-serialized string. | +| MCP-003 | Medium | Confirmed drift | Open | Local MCP guide | Local stdio supports bounded keyless Search and Scrape, although the guide states a key or self-hosted URL is always required. | +| DD-001 | Medium | Requires owner input | Open | Keyless Scrape snippets; v2 OpenAPI security | Docs and product support bounded keyless Scrape, while the OpenAPI operation declares bearer authentication. | +| DD-002 | Medium | Generated-source lag | Open | v2 OpenAPI `Formats`; Scrape snippet | The schema permits object formats only, while its description, default, docs, and verified runtime accept strings. | +| DD-003 | Medium | Generated-source lag | Open | v2 OpenAPI response metadata | `nullable` is combined with `oneOf` without a sibling `type`, preventing strict response-schema compilation. | + +## Verification status + +- JS-001 and JS-002 passed against JavaScript SDK `4.32.0`: its package requires Node.js 22 or newer, v2 exposes `watcher(jobId, opts)`, and `crawlUrlAndWatch` remains under v1. +- PY-001 passed against Python SDK `4.34.0`: v2 normalization maps `sourceURL` to `source_url`. +- CLI-001 passed against CLI `1.19.29`: single-format links output is newline-delimited, while `--json` returns a JSON object whose `links` field is an array. +- MCP-001 and MCP-002 passed against MCP server `3.23.4`: the crawl tool polls to a terminal state, and tool data is JSON-serialized into text. +- All six edited routes rendered the corrected content at 1440-by-900 desktop and 390-by-844 mobile viewports with visible main content and no horizontal overflow or browser errors. +- `mint validate` reported the same 17 pre-existing missing-import warnings as a clean checkout of current docs `main`; the narrowed change introduced no validation warning. +- `git diff --check` passed. +- No live request is required to verify the six documentation fixes in this change. + +## Coverage boundaries + +- The six fixes do not claim coverage of all 26 candidates or every documentation statement. +- Narrative claims outside the six fixed items were inventoried but are not verified by this pull request. +- Package-registry verification was limited to the four released artifacts supporting the six fixed findings; unresolved version candidates remain classified as generated-source lag rather than release verdicts. +- Cloud webhook retry behavior lives outside the pinned product repository. +- Localized documentation was not audited or edited. +- The dependency-free reconciler and any scheduling are deferred to a separately reviewed follow-up. +- Doc Detective and its npm dependency graph are deferred to a separate proposal. +- Broader semantic PR review, agent-proposed repairs, automatic branches, and automatic pull requests remain deferred to dependent changes with separate permission and security review. diff --git a/sdks/cli.mdx b/sdks/cli.mdx index bef8f84b8..d48948903 100644 --- a/sdks/cli.mdx +++ b/sdks/cli.mdx @@ -479,8 +479,8 @@ jq -r '.data.web[].url' search-results.json # Get titles from search results jq -r '.data.web[] | "\(.title): \(.url)"' search-results.json -# Extract links and process with jq -firecrawl https://example.com --format links | jq '.links[].url' +# Extract links as JSON and print one URL per line +firecrawl https://example.com --format links --json | jq -r '.links[]' # Count URLs from map firecrawl map https://example.com | wc -l diff --git a/sdks/node.mdx b/sdks/node.mdx index 30e1b350b..9888ebc68 100644 --- a/sdks/node.mdx +++ b/sdks/node.mdx @@ -111,7 +111,7 @@ To extract structured data from websites with error handling, use the `extractUr ### Crawling a Website with WebSockets -Stream crawl results in real time with the `crawlUrlAndWatch` method. You receive each page as it is crawled instead of waiting for the entire job to finish. +Stream crawl results in real time with `watcher(jobId, options)`. You receive each page as it is crawled instead of waiting for the entire job to finish.