mcp-scraper 0.54.3 → 0.54.4

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/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to MCP Scraper are documented here. The format is based on [
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.54.4] - 2026-08-14
8
+
9
+ ### Fixed
10
+
11
+ - Reddit Google discovery now retries one fresh managed SERP session when the first page is unexpectedly empty or fails, before entering the slower Reddit-browser fallback. Successful discovery still uses one Google search.
12
+
7
13
  ## [0.54.3] - 2026-08-14
8
14
 
9
15
  ### Fixed
@@ -870,7 +876,8 @@ All notable changes to MCP Scraper are documented here. The format is based on [
870
876
  - Write actions remain unavailable until the account owner explicitly enables them.
871
877
  - Provider-specific connection data is normalized into one agent-facing contract.
872
878
 
873
- [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.3...HEAD
879
+ [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.4...HEAD
880
+ [0.54.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.3...v0.54.4
874
881
  [0.54.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.2...v0.54.3
875
882
  [0.54.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.1...v0.54.2
876
883
  [0.54.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.54.0...v0.54.1
package/README.md CHANGED
@@ -90,7 +90,7 @@ Build the branded one-click bundle:
90
90
  npm run build:mcpb
91
91
  ```
92
92
 
93
- The generated bundle is written to `build/mcpb/mcp-scraper-<version>.mcpb` and copied to `public/downloads/` for the hosted download. The current public bundle is `https://mcpscraper.dev/downloads/mcp-scraper.mcpb` (`0.54.3`, SHA-256 `58d38f83f74d72de330c58e2419573c7c37a02456db4b10829236cffbfd8837f`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
93
+ The generated bundle is written to `build/mcpb/mcp-scraper-<version>.mcpb` and copied to `public/downloads/` for the hosted download. The current public bundle is `https://mcpscraper.dev/downloads/mcp-scraper.mcpb` (`0.54.4`, SHA-256 `745300613bf74c87b9b78a49495c98e0380de5de3825b5caa1ac26f8782bf893`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
94
94
 
95
95
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
96
96
 
@@ -37905,33 +37905,53 @@ var init_reddit_routes = __esm({
37905
37905
  let discoverySource = "google_serp";
37906
37906
  let primaryDiscoveryDegraded = false;
37907
37907
  let primaryDegradationReasons = [];
37908
- try {
37909
- const serp = await harvest({
37910
- query: serpQuery,
37911
- serpOnly: true,
37912
- proxyMode: "none",
37913
- pages: 1,
37914
- maxAttempts: 1,
37915
- maxQuestions: 1,
37916
- recency: body.window === "all" ? void 0 : body.window,
37917
- kernelApiKey: browserServiceApiKey(),
37918
- format: "json",
37919
- outputDir: "/tmp/reddit-trending-serp",
37920
- softDeadlineMs,
37921
- forceManagedSerp: true
37922
- });
37923
- candidates = extractRedditThreadUrls(serp.organicResults, body.maxThreads);
37924
- primaryDiscoveryDegraded = serp.diagnostics?.degradedResult === true;
37925
- primaryDegradationReasons = Array.isArray(serp.diagnostics?.degradationReasons) ? serp.diagnostics.degradationReasons.filter((reason) => typeof reason === "string") : [];
37926
- } catch (error) {
37927
- console.warn(JSON.stringify({
37928
- event: "reddit_serp_discovery_failed",
37929
- error_name: error instanceof Error ? error.name : "Error",
37930
- message: error instanceof Error ? error.message : String(error)
37931
- }));
37932
- candidates = [];
37933
- primaryDiscoveryDegraded = true;
37934
- primaryDegradationReasons = ["primary_serp_failed"];
37908
+ for (let discoveryAttempt = 1; discoveryAttempt <= 2 && candidates.length === 0; discoveryAttempt++) {
37909
+ try {
37910
+ const serp = await harvest({
37911
+ query: serpQuery,
37912
+ serpOnly: true,
37913
+ proxyMode: "none",
37914
+ pages: 1,
37915
+ maxAttempts: 1,
37916
+ maxQuestions: 1,
37917
+ recency: body.window === "all" ? void 0 : body.window,
37918
+ kernelApiKey: browserServiceApiKey(),
37919
+ format: "json",
37920
+ outputDir: "/tmp/reddit-trending-serp",
37921
+ softDeadlineMs,
37922
+ forceManagedSerp: true
37923
+ });
37924
+ const attemptCandidates = extractRedditThreadUrls(serp.organicResults, body.maxThreads);
37925
+ const attemptDegradationReasons = Array.isArray(serp.diagnostics?.degradationReasons) ? serp.diagnostics.degradationReasons.filter((reason) => typeof reason === "string") : [];
37926
+ if (attemptCandidates.length > 0) {
37927
+ candidates = attemptCandidates;
37928
+ primaryDiscoveryDegraded = serp.diagnostics?.degradedResult === true;
37929
+ primaryDegradationReasons = attemptDegradationReasons;
37930
+ break;
37931
+ }
37932
+ primaryDiscoveryDegraded = true;
37933
+ primaryDegradationReasons = [.../* @__PURE__ */ new Set([
37934
+ ...primaryDegradationReasons,
37935
+ ...attemptDegradationReasons.length > 0 ? attemptDegradationReasons : ["empty_primary_serp"]
37936
+ ])];
37937
+ if (discoveryAttempt < 2) {
37938
+ console.warn(JSON.stringify({
37939
+ event: "reddit_serp_discovery_empty_retry",
37940
+ discovery_attempt: discoveryAttempt,
37941
+ next_attempt: discoveryAttempt + 1
37942
+ }));
37943
+ }
37944
+ } catch (error) {
37945
+ primaryDiscoveryDegraded = true;
37946
+ primaryDegradationReasons = [.../* @__PURE__ */ new Set([...primaryDegradationReasons, "primary_serp_failed"])];
37947
+ console.warn(JSON.stringify({
37948
+ event: "reddit_serp_discovery_failed",
37949
+ discovery_attempt: discoveryAttempt,
37950
+ will_retry: discoveryAttempt < 2,
37951
+ error_name: error instanceof Error ? error.name : "Error",
37952
+ message: error instanceof Error ? error.message : String(error)
37953
+ }));
37954
+ }
37935
37955
  }
37936
37956
  if (candidates.length === 0) {
37937
37957
  const fallback = await discoverOnReddit(body.topic, subreddit, body.window);
@@ -43982,7 +44002,7 @@ var PACKAGE_VERSION;
43982
44002
  var init_version = __esm({
43983
44003
  "src/version.ts"() {
43984
44004
  "use strict";
43985
- PACKAGE_VERSION = "0.54.3";
44005
+ PACKAGE_VERSION = "0.54.4";
43986
44006
  }
43987
44007
  });
43988
44008