mcp-scraper 0.72.6 → 0.72.7

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.72.7] - 2026-08-27
8
+
9
+ ### Fixed
10
+
11
+ - Completed Gmail Memory imports now report recovered historical errors as resolved and derive attachment indexing from the verified nested file-asset receipts, keeping counts and sample states consistent with durable Memory state.
12
+
7
13
  ## [0.72.6] - 2026-08-27
8
14
 
9
15
  ### Fixed
@@ -1278,7 +1284,8 @@ All notable changes to MCP Scraper are documented here. The format is based on [
1278
1284
  - Write actions remain unavailable until the account owner explicitly enables them.
1279
1285
  - Provider-specific connection data is normalized into one agent-facing contract.
1280
1286
 
1281
- [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.6...HEAD
1287
+ [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.7...HEAD
1288
+ [0.72.7]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.6...v0.72.7
1282
1289
  [0.72.6]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.5...v0.72.6
1283
1290
  [0.72.5]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.4...v0.72.5
1284
1291
  [0.72.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.3...v0.72.4
package/README.md CHANGED
@@ -159,7 +159,7 @@ Build the branded one-click bundle:
159
159
  npm run build:mcpb
160
160
  ```
161
161
 
162
- 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.72.6`, SHA-256 `dfcf80fa18e14a314d19d459f6c3e1fa0ba0f03eb8eca6f35ca0b0fae8e267ec`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, API-key configuration field, and manually curated current-release message from the bundle manifest.
162
+ 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.72.7`, SHA-256 `f33e2aa375a3a9e4a497bd03306db559a7c40282bd741b241c65b688d21e1dc2`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, API-key configuration field, and manually curated current-release message from the bundle manifest.
163
163
 
164
164
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
165
165
 
@@ -45090,6 +45090,13 @@ function normalizeProgress(value) {
45090
45090
  function errorCode2(error) {
45091
45091
  return error && typeof error === "object" && typeof error.code === "string" ? String(error.code) : "import_step_failed";
45092
45092
  }
45093
+ function gmailMemoryReceiptIndexed(receipt) {
45094
+ const object2 = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
45095
+ const asset = object2(receipt.asset);
45096
+ const verified = object2(receipt.verified);
45097
+ const verifiedAsset = object2(verified.asset);
45098
+ return [receipt.extractionStatus, receipt.status, asset.extractionStatus, asset.status, verified.extractionStatus, verified.status, verifiedAsset.extractionStatus, verifiedAsset.status].some((value) => value === "indexed");
45099
+ }
45093
45100
  function gmailAttachmentSourceIdentity(messageId, messageDigest, partId, attachmentDigest) {
45094
45101
  return `gmail:${messageId}:${messageDigest}:${partId}:${attachmentDigest}`;
45095
45102
  }
@@ -45233,7 +45240,7 @@ var init_gmail_memory_ingest = __esm({
45233
45240
  });
45234
45241
  progress.checkpoints[attachmentKey] = receipt;
45235
45242
  progress.attachmentsStored += 1;
45236
- if (String(receipt.extractionStatus ?? receipt.status) === "indexed") progress.attachmentsIndexed += 1;
45243
+ if (gmailMemoryReceiptIndexed(receipt)) progress.attachmentsIndexed += 1;
45237
45244
  job = await checkpoint({ progress });
45238
45245
  }
45239
45246
  }
@@ -45483,17 +45490,18 @@ function publicImportStatus(job, plan) {
45483
45490
  const errors = Array.isArray(progress.errors) ? progress.errors : [];
45484
45491
  const storedMessages = Number(progress.messagesStored ?? 0);
45485
45492
  const storedAttachments = Number(progress.attachmentsStored ?? 0);
45486
- const indexedAttachments = Number(progress.attachmentsIndexed ?? 0);
45493
+ const indexedAttachmentCheckpoints = Object.entries(checkpoints).filter(([sourceKey, receipt]) => sourceKey.startsWith("attachment:") && gmailMemoryReceiptIndexed(object(receipt))).length;
45494
+ const indexedAttachments = Math.max(Number(progress.attachmentsIndexed ?? 0), indexedAttachmentCheckpoints);
45487
45495
  const terminal = job.status === "complete" || job.status === "partial" || job.status === "failed";
45488
45496
  return {
45489
45497
  ingestId: job.ingestId,
45490
45498
  importPlanId: job.importPlanId,
45491
45499
  status: job.status,
45492
- messages: { planned: plan?.messageCount ?? storedMessages, stored: storedMessages, indexed: storedMessages, failed: errors.length },
45500
+ messages: { planned: plan?.messageCount ?? storedMessages, stored: storedMessages, indexed: storedMessages, failed: job.status === "failed" ? Math.max(1, errors.length) : 0 },
45493
45501
  attachments: { planned: plan?.attachmentCount ?? storedAttachments, stored: storedAttachments, indexed: indexedAttachments, storedUnindexed: Math.max(0, storedAttachments - indexedAttachments), failed: 0 },
45494
45502
  manifestStored: !!checkpoints.manifest,
45495
45503
  complete: job.status === "complete",
45496
- samples: Object.entries(checkpoints).slice(0, 25).map(([sourceKey, receipt]) => ({ sourceKey, state: sourceKey === "manifest" || String(object(receipt).extractionStatus ?? object(receipt).status) === "indexed" ? "indexed" : "stored_unindexed", ...string(object(receipt).path) ? { path: object(receipt).path } : {} })),
45504
+ samples: Object.entries(checkpoints).slice(0, 25).map(([sourceKey, receipt]) => ({ sourceKey, state: sourceKey === "manifest" || sourceKey.startsWith("message:") || gmailMemoryReceiptIndexed(object(receipt)) ? "indexed" : "stored_unindexed", ...string(object(receipt).path) ? { path: object(receipt).path } : {} })),
45497
45505
  nextAction: terminal ? job.status === "complete" ? "complete" : "inspect_failures" : job.leaseExpiresAt ? "call_gmail_import_status" : "call_gmail_import_to_memory"
45498
45506
  };
45499
45507
  }
@@ -54204,7 +54212,7 @@ var PACKAGE_VERSION;
54204
54212
  var init_version = __esm({
54205
54213
  "src/version.ts"() {
54206
54214
  "use strict";
54207
- PACKAGE_VERSION = "0.72.6";
54215
+ PACKAGE_VERSION = "0.72.7";
54208
54216
  }
54209
54217
  });
54210
54218
 
@@ -17,7 +17,7 @@ loadDotEnv();
17
17
  async function main() {
18
18
  const [{ serve }, { app }, { startWorker }, { migrate }] = await Promise.all([
19
19
  import("@hono/node-server"),
20
- import("../server-LQ6TMI5W.js"),
20
+ import("../server-M5FLUWYD.js"),
21
21
  import("../worker-JQORPCFQ.js"),
22
22
  import("../db-566MOHHD.js")
23
23
  ]);
@@ -30,7 +30,7 @@ var import_promises5 = require("fs/promises");
30
30
  var import_node_path3 = require("path");
31
31
 
32
32
  // src/version.ts
33
- var PACKAGE_VERSION = "0.72.6";
33
+ var PACKAGE_VERSION = "0.72.7";
34
34
 
35
35
  // src/cli/agent-config.ts
36
36
  function apiKeyValue(options) {
@@ -13,7 +13,7 @@ import "../chunk-VXLU74YZ.js";
13
13
  import "../chunk-GGZEC22A.js";
14
14
  import {
15
15
  PACKAGE_VERSION
16
- } from "../chunk-D5CX3WHG.js";
16
+ } from "../chunk-RRZAYUEX.js";
17
17
 
18
18
  // src/cli/human-cli.ts
19
19
  import { Command } from "commander";
@@ -112,7 +112,7 @@ function renderInstallTerminal(options) {
112
112
  }
113
113
 
114
114
  // src/version.ts
115
- var PACKAGE_VERSION = "0.72.6";
115
+ var PACKAGE_VERSION = "0.72.7";
116
116
 
117
117
  // bin/mcp-scraper-install.ts
118
118
  var noColor = process.argv.includes("--no-color") || process.env.NO_COLOR !== void 0 || process.env.FORCE_COLOR === "0" || !process.stdout.isTTY;
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-RAFQEPJ4.js";
5
5
  import {
6
6
  PACKAGE_VERSION
7
- } from "../chunk-D5CX3WHG.js";
7
+ } from "../chunk-RRZAYUEX.js";
8
8
 
9
9
  // bin/mcp-scraper-install.ts
10
10
  var noColor = process.argv.includes("--no-color") || process.env.NO_COLOR !== void 0 || process.env.FORCE_COLOR === "0" || !process.stdout.isTTY;
@@ -6950,7 +6950,7 @@ render();
6950
6950
  }
6951
6951
 
6952
6952
  // src/version.ts
6953
- var PACKAGE_VERSION = "0.72.6";
6953
+ var PACKAGE_VERSION = "0.72.7";
6954
6954
 
6955
6955
  // src/mcp/input-field-descriptions.ts
6956
6956
  var import_zod2 = require("zod");
@@ -13,7 +13,7 @@ import {
13
13
  registerScheduledResultsMcpTools,
14
14
  registerSerpIntelligenceCaptureTools,
15
15
  resolveDeploymentProfile
16
- } from "../chunk-XRH2DUAQ.js";
16
+ } from "../chunk-ZSVXNLLM.js";
17
17
  import "../chunk-PGJQDMC2.js";
18
18
  import "../chunk-T3MZISOF.js";
19
19
  import "../chunk-7RQULQF3.js";
@@ -26,7 +26,7 @@ import "../chunk-VXLU74YZ.js";
26
26
  import "../chunk-GGZEC22A.js";
27
27
  import {
28
28
  PACKAGE_VERSION
29
- } from "../chunk-D5CX3WHG.js";
29
+ } from "../chunk-RRZAYUEX.js";
30
30
  import "../chunk-DNM65UCK.js";
31
31
  import "../chunk-FVL4GUTP.js";
32
32
  import "../chunk-WEFPBAAG.js";
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var PACKAGE_VERSION = "0.72.6";
2
+ var PACKAGE_VERSION = "0.72.7";
3
3
 
4
4
  export {
5
5
  PACKAGE_VERSION
@@ -32,7 +32,7 @@ import {
32
32
  } from "./chunk-VXLU74YZ.js";
33
33
  import {
34
34
  PACKAGE_VERSION
35
- } from "./chunk-D5CX3WHG.js";
35
+ } from "./chunk-RRZAYUEX.js";
36
36
  import {
37
37
  createPrivateArtifact,
38
38
  privateArtifactOwnerId,
@@ -271,7 +271,7 @@ import {
271
271
  resolveDeploymentProfile,
272
272
  resolveLocalSourcebookSchemaType,
273
273
  transcribeMediaUrl
274
- } from "./chunk-XRH2DUAQ.js";
274
+ } from "./chunk-ZSVXNLLM.js";
275
275
  import {
276
276
  auditImageUrls,
277
277
  auditImages,
@@ -336,7 +336,7 @@ import {
336
336
  } from "./chunk-GGZEC22A.js";
337
337
  import {
338
338
  PACKAGE_VERSION
339
- } from "./chunk-D5CX3WHG.js";
339
+ } from "./chunk-RRZAYUEX.js";
340
340
  import {
341
341
  SITE_EXTRACT_ARTIFACT_PREFIX,
342
342
  abandonExtractSettlement,
@@ -21631,7 +21631,7 @@ var GmailMemoryIngestService = class {
21631
21631
  });
21632
21632
  progress.checkpoints[attachmentKey] = receipt;
21633
21633
  progress.attachmentsStored += 1;
21634
- if (String(receipt.extractionStatus ?? receipt.status) === "indexed") progress.attachmentsIndexed += 1;
21634
+ if (gmailMemoryReceiptIndexed(receipt)) progress.attachmentsIndexed += 1;
21635
21635
  job = await checkpoint({ progress });
21636
21636
  }
21637
21637
  }
@@ -21675,6 +21675,13 @@ function normalizeProgress(value) {
21675
21675
  function errorCode(error) {
21676
21676
  return error && typeof error === "object" && typeof error.code === "string" ? String(error.code) : "import_step_failed";
21677
21677
  }
21678
+ function gmailMemoryReceiptIndexed(receipt) {
21679
+ const object2 = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
21680
+ const asset = object2(receipt.asset);
21681
+ const verified = object2(receipt.verified);
21682
+ const verifiedAsset = object2(verified.asset);
21683
+ return [receipt.extractionStatus, receipt.status, asset.extractionStatus, asset.status, verified.extractionStatus, verified.status, verifiedAsset.extractionStatus, verifiedAsset.status].some((value) => value === "indexed");
21684
+ }
21678
21685
  function gmailAttachmentSourceIdentity(messageId, messageDigest, partId, attachmentDigest) {
21679
21686
  return `gmail:${messageId}:${messageDigest}:${partId}:${attachmentDigest}`;
21680
21687
  }
@@ -21897,17 +21904,18 @@ function publicImportStatus(job, plan) {
21897
21904
  const errors = Array.isArray(progress.errors) ? progress.errors : [];
21898
21905
  const storedMessages = Number(progress.messagesStored ?? 0);
21899
21906
  const storedAttachments = Number(progress.attachmentsStored ?? 0);
21900
- const indexedAttachments = Number(progress.attachmentsIndexed ?? 0);
21907
+ const indexedAttachmentCheckpoints = Object.entries(checkpoints).filter(([sourceKey, receipt]) => sourceKey.startsWith("attachment:") && gmailMemoryReceiptIndexed(object(receipt))).length;
21908
+ const indexedAttachments = Math.max(Number(progress.attachmentsIndexed ?? 0), indexedAttachmentCheckpoints);
21901
21909
  const terminal = job.status === "complete" || job.status === "partial" || job.status === "failed";
21902
21910
  return {
21903
21911
  ingestId: job.ingestId,
21904
21912
  importPlanId: job.importPlanId,
21905
21913
  status: job.status,
21906
- messages: { planned: plan?.messageCount ?? storedMessages, stored: storedMessages, indexed: storedMessages, failed: errors.length },
21914
+ messages: { planned: plan?.messageCount ?? storedMessages, stored: storedMessages, indexed: storedMessages, failed: job.status === "failed" ? Math.max(1, errors.length) : 0 },
21907
21915
  attachments: { planned: plan?.attachmentCount ?? storedAttachments, stored: storedAttachments, indexed: indexedAttachments, storedUnindexed: Math.max(0, storedAttachments - indexedAttachments), failed: 0 },
21908
21916
  manifestStored: !!checkpoints.manifest,
21909
21917
  complete: job.status === "complete",
21910
- samples: Object.entries(checkpoints).slice(0, 25).map(([sourceKey, receipt]) => ({ sourceKey, state: sourceKey === "manifest" || String(object(receipt).extractionStatus ?? object(receipt).status) === "indexed" ? "indexed" : "stored_unindexed", ...string(object(receipt).path) ? { path: object(receipt).path } : {} })),
21918
+ samples: Object.entries(checkpoints).slice(0, 25).map(([sourceKey, receipt]) => ({ sourceKey, state: sourceKey === "manifest" || sourceKey.startsWith("message:") || gmailMemoryReceiptIndexed(object(receipt)) ? "indexed" : "stored_unindexed", ...string(object(receipt).path) ? { path: object(receipt).path } : {} })),
21911
21919
  nextAction: terminal ? job.status === "complete" ? "complete" : "inspect_failures" : job.leaseExpiresAt ? "call_gmail_import_status" : "call_gmail_import_to_memory"
21912
21920
  };
21913
21921
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-scraper",
3
- "version": "0.72.6",
3
+ "version": "0.72.7",
4
4
  "description": "MCP server for MCP Scraper web intelligence tools",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",