mcp-scraper 0.72.4 → 0.72.6

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,18 @@ All notable changes to MCP Scraper are documented here. The format is based on [
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.72.6] - 2026-08-27
8
+
9
+ ### Fixed
10
+
11
+ - Gmail Memory import cold starts now probe the released import tables before attempting additive schema creation, avoiding production DDL contention before a resumable job can acquire its lease.
12
+
13
+ ## [0.72.5] - 2026-08-27
14
+
15
+ ### Fixed
16
+
17
+ - Gmail Memory imports now provide deterministic descriptions for newly encountered import tags, allowing complete messages, manifests, and attachments to enter the selected vault instead of stopping at the first note write.
18
+
7
19
  ## [0.72.4] - 2026-08-27
8
20
 
9
21
  ### Fixed
@@ -1266,7 +1278,9 @@ All notable changes to MCP Scraper are documented here. The format is based on [
1266
1278
  - Write actions remain unavailable until the account owner explicitly enables them.
1267
1279
  - Provider-specific connection data is normalized into one agent-facing contract.
1268
1280
 
1269
- [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.4...HEAD
1281
+ [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.6...HEAD
1282
+ [0.72.6]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.5...v0.72.6
1283
+ [0.72.5]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.4...v0.72.5
1270
1284
  [0.72.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.3...v0.72.4
1271
1285
  [0.72.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.2...v0.72.3
1272
1286
  [0.72.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.1...v0.72.2
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.4`, SHA-256 `9faa985332dde8253e96a10640870d4161806a9407ac56e2effe0697bb34a0d1`). 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.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.
163
163
 
164
164
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
165
165
 
@@ -44937,6 +44937,14 @@ async function ensureGmailImportSchema() {
44937
44937
  if (schemaReady3 && schemaDb7 === db) return schemaReady3;
44938
44938
  schemaDb7 = db;
44939
44939
  schemaReady3 = (async () => {
44940
+ try {
44941
+ await db.batch([
44942
+ `SELECT 1 FROM gmail_import_plans LIMIT 1`,
44943
+ `SELECT 1 FROM gmail_import_jobs LIMIT 1`
44944
+ ], "read");
44945
+ return;
44946
+ } catch {
44947
+ }
44940
44948
  await db.execute(`CREATE TABLE IF NOT EXISTS gmail_import_plans (
44941
44949
  import_plan_id TEXT PRIMARY KEY, owner_identity TEXT NOT NULL, plan_fingerprint TEXT NOT NULL,
44942
44950
  plan_json TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT NOT NULL,
@@ -45524,6 +45532,21 @@ function gmailFileAssetSaveArguments(args) {
45524
45532
  idempotencyKey: args.idempotencyKey
45525
45533
  };
45526
45534
  }
45535
+ function gmailMemoryNoteArguments(args) {
45536
+ const descriptions = {
45537
+ gmail: "Content preserved from an owner-authorized Gmail connection.",
45538
+ "email-import": "A complete email source captured through the Gmail import workflow.",
45539
+ "import-manifest": "A durable manifest recording a completed or partial source import."
45540
+ };
45541
+ return {
45542
+ vault: args.vault,
45543
+ path: args.path,
45544
+ title: args.title,
45545
+ content: args.content,
45546
+ props: { sourceKey: args.sourceKey, capturedAt: args.capturedAt, tags: args.tags, references: args.references ?? [] },
45547
+ tagDescriptions: Object.fromEntries(args.tags.map((tag) => [tag, descriptions[tag] ?? `Gmail import tag: ${tag}.`]))
45548
+ };
45549
+ }
45527
45550
  function gmailMemoryAssetToolsForMime(mimeType) {
45528
45551
  return mimeType.startsWith("image/") ? { saveTool: "image_asset_save", getTool: "image_asset_get" } : { saveTool: "file_asset_save", getTool: "file_asset_get" };
45529
45552
  }
@@ -45562,7 +45585,7 @@ async function memoryPort(c) {
45562
45585
  },
45563
45586
  async saveNote(args) {
45564
45587
  const path6 = `gmail/${(0, import_node_crypto29.createHash)("sha256").update(args.sourceKey).digest("hex")}.md`;
45565
- const result2 = await memoryCall("putTool", { vault: args.vault, path: path6, title: args.title, content: args.content, props: { sourceKey: args.sourceKey, capturedAt: args.capturedAt, tags: args.tags, references: args.references ?? [] } }, key2);
45588
+ const result2 = await memoryCall("putTool", gmailMemoryNoteArguments({ ...args, path: path6 }), key2);
45566
45589
  if (!result2.ok) throw new GmailMemoryIngestError("memory_note_failed", String(result2.error ?? "Memory note write failed."), 503, true);
45567
45590
  return { ...result2, path: path6 };
45568
45591
  },
@@ -45588,7 +45611,7 @@ function errorResponse(c, error) {
45588
45611
  if (retryAfterMs) c.header("Retry-After", String(Math.max(1, Math.ceil(retryAfterMs / 1e3))));
45589
45612
  return c.json({ ok: false, code: error.code, error: error.message, retryable: "retryable" in error ? error.retryable : false }, error.status);
45590
45613
  }
45591
- console.error("[gmail-route]", error instanceof Error ? error.name : "unknown_error");
45614
+ console.error("[gmail-route]", error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : { name: "unknown_error" });
45592
45615
  return c.json({ ok: false, code: "gmail_unavailable", error: "The Gmail workflow is temporarily unavailable.", retryable: true }, 503);
45593
45616
  }
45594
45617
  function schedulerAuthError(c, error) {
@@ -54181,7 +54204,7 @@ var PACKAGE_VERSION;
54181
54204
  var init_version = __esm({
54182
54205
  "src/version.ts"() {
54183
54206
  "use strict";
54184
- PACKAGE_VERSION = "0.72.4";
54207
+ PACKAGE_VERSION = "0.72.6";
54185
54208
  }
54186
54209
  });
54187
54210
 
@@ -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-ORLMQHS6.js"),
20
+ import("../server-LQ6TMI5W.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.4";
33
+ var PACKAGE_VERSION = "0.72.6";
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-WQBWDDT4.js";
16
+ } from "../chunk-D5CX3WHG.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.4";
115
+ var PACKAGE_VERSION = "0.72.6";
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-WQBWDDT4.js";
7
+ } from "../chunk-D5CX3WHG.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.4";
6953
+ var PACKAGE_VERSION = "0.72.6";
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-EYKIQBYR.js";
16
+ } from "../chunk-XRH2DUAQ.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-WQBWDDT4.js";
29
+ } from "../chunk-D5CX3WHG.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.4";
2
+ var PACKAGE_VERSION = "0.72.6";
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-WQBWDDT4.js";
35
+ } from "./chunk-D5CX3WHG.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-EYKIQBYR.js";
274
+ } from "./chunk-XRH2DUAQ.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-WQBWDDT4.js";
339
+ } from "./chunk-D5CX3WHG.js";
340
340
  import {
341
341
  SITE_EXTRACT_ARTIFACT_PREFIX,
342
342
  abandonExtractSettlement,
@@ -21385,6 +21385,14 @@ async function ensureGmailImportSchema() {
21385
21385
  if (schemaReady && schemaDb3 === db) return schemaReady;
21386
21386
  schemaDb3 = db;
21387
21387
  schemaReady = (async () => {
21388
+ try {
21389
+ await db.batch([
21390
+ `SELECT 1 FROM gmail_import_plans LIMIT 1`,
21391
+ `SELECT 1 FROM gmail_import_jobs LIMIT 1`
21392
+ ], "read");
21393
+ return;
21394
+ } catch {
21395
+ }
21388
21396
  await db.execute(`CREATE TABLE IF NOT EXISTS gmail_import_plans (
21389
21397
  import_plan_id TEXT PRIMARY KEY, owner_identity TEXT NOT NULL, plan_fingerprint TEXT NOT NULL,
21390
21398
  plan_json TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT NOT NULL,
@@ -21938,6 +21946,21 @@ function gmailFileAssetSaveArguments(args) {
21938
21946
  idempotencyKey: args.idempotencyKey
21939
21947
  };
21940
21948
  }
21949
+ function gmailMemoryNoteArguments(args) {
21950
+ const descriptions = {
21951
+ gmail: "Content preserved from an owner-authorized Gmail connection.",
21952
+ "email-import": "A complete email source captured through the Gmail import workflow.",
21953
+ "import-manifest": "A durable manifest recording a completed or partial source import."
21954
+ };
21955
+ return {
21956
+ vault: args.vault,
21957
+ path: args.path,
21958
+ title: args.title,
21959
+ content: args.content,
21960
+ props: { sourceKey: args.sourceKey, capturedAt: args.capturedAt, tags: args.tags, references: args.references ?? [] },
21961
+ tagDescriptions: Object.fromEntries(args.tags.map((tag) => [tag, descriptions[tag] ?? `Gmail import tag: ${tag}.`]))
21962
+ };
21963
+ }
21941
21964
  function gmailMemoryAssetToolsForMime(mimeType) {
21942
21965
  return mimeType.startsWith("image/") ? { saveTool: "image_asset_save", getTool: "image_asset_get" } : { saveTool: "file_asset_save", getTool: "file_asset_get" };
21943
21966
  }
@@ -21976,7 +21999,7 @@ async function memoryPort(c) {
21976
21999
  },
21977
22000
  async saveNote(args) {
21978
22001
  const path5 = `gmail/${createHash6("sha256").update(args.sourceKey).digest("hex")}.md`;
21979
- const result2 = await memoryCall("putTool", { vault: args.vault, path: path5, title: args.title, content: args.content, props: { sourceKey: args.sourceKey, capturedAt: args.capturedAt, tags: args.tags, references: args.references ?? [] } }, key2);
22002
+ const result2 = await memoryCall("putTool", gmailMemoryNoteArguments({ ...args, path: path5 }), key2);
21980
22003
  if (!result2.ok) throw new GmailMemoryIngestError("memory_note_failed", String(result2.error ?? "Memory note write failed."), 503, true);
21981
22004
  return { ...result2, path: path5 };
21982
22005
  },
@@ -22002,7 +22025,7 @@ function errorResponse(c, error) {
22002
22025
  if (retryAfterMs) c.header("Retry-After", String(Math.max(1, Math.ceil(retryAfterMs / 1e3))));
22003
22026
  return c.json({ ok: false, code: error.code, error: error.message, retryable: "retryable" in error ? error.retryable : false }, error.status);
22004
22027
  }
22005
- console.error("[gmail-route]", error instanceof Error ? error.name : "unknown_error");
22028
+ console.error("[gmail-route]", error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : { name: "unknown_error" });
22006
22029
  return c.json({ ok: false, code: "gmail_unavailable", error: "The Gmail workflow is temporarily unavailable.", retryable: true }, 503);
22007
22030
  }
22008
22031
  gmailApp.use("/api/gmail/*", auth);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-scraper",
3
- "version": "0.72.4",
3
+ "version": "0.72.6",
4
4
  "description": "MCP server for MCP Scraper web intelligence tools",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",