mcp-scraper 0.72.5 → 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 +15 -1
- package/README.md +1 -1
- package/dist/bin/api-server.cjs +22 -6
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.cjs +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-install.cjs +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.cjs +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/{chunk-WHXNA6GK.js → chunk-RRZAYUEX.js} +1 -1
- package/dist/{chunk-3SECYTNB.js → chunk-ZSVXNLLM.js} +1 -1
- package/dist/{server-IABKDP7V.js → server-M5FLUWYD.js} +23 -7
- package/package.json +1 -1
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.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
|
+
|
|
13
|
+
## [0.72.6] - 2026-08-27
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- 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.
|
|
18
|
+
|
|
7
19
|
## [0.72.5] - 2026-08-27
|
|
8
20
|
|
|
9
21
|
### Fixed
|
|
@@ -1272,7 +1284,9 @@ All notable changes to MCP Scraper are documented here. The format is based on [
|
|
|
1272
1284
|
- Write actions remain unavailable until the account owner explicitly enables them.
|
|
1273
1285
|
- Provider-specific connection data is normalized into one agent-facing contract.
|
|
1274
1286
|
|
|
1275
|
-
[Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.
|
|
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
|
|
1289
|
+
[0.72.6]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.5...v0.72.6
|
|
1276
1290
|
[0.72.5]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.4...v0.72.5
|
|
1277
1291
|
[0.72.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.3...v0.72.4
|
|
1278
1292
|
[0.72.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.72.2...v0.72.3
|
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.
|
|
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
|
|
package/dist/bin/api-server.cjs
CHANGED
|
@@ -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,
|
|
@@ -45082,6 +45090,13 @@ function normalizeProgress(value) {
|
|
|
45082
45090
|
function errorCode2(error) {
|
|
45083
45091
|
return error && typeof error === "object" && typeof error.code === "string" ? String(error.code) : "import_step_failed";
|
|
45084
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
|
+
}
|
|
45085
45100
|
function gmailAttachmentSourceIdentity(messageId, messageDigest, partId, attachmentDigest) {
|
|
45086
45101
|
return `gmail:${messageId}:${messageDigest}:${partId}:${attachmentDigest}`;
|
|
45087
45102
|
}
|
|
@@ -45225,7 +45240,7 @@ var init_gmail_memory_ingest = __esm({
|
|
|
45225
45240
|
});
|
|
45226
45241
|
progress.checkpoints[attachmentKey] = receipt;
|
|
45227
45242
|
progress.attachmentsStored += 1;
|
|
45228
|
-
if (
|
|
45243
|
+
if (gmailMemoryReceiptIndexed(receipt)) progress.attachmentsIndexed += 1;
|
|
45229
45244
|
job = await checkpoint({ progress });
|
|
45230
45245
|
}
|
|
45231
45246
|
}
|
|
@@ -45475,17 +45490,18 @@ function publicImportStatus(job, plan) {
|
|
|
45475
45490
|
const errors = Array.isArray(progress.errors) ? progress.errors : [];
|
|
45476
45491
|
const storedMessages = Number(progress.messagesStored ?? 0);
|
|
45477
45492
|
const storedAttachments = Number(progress.attachmentsStored ?? 0);
|
|
45478
|
-
const
|
|
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);
|
|
45479
45495
|
const terminal = job.status === "complete" || job.status === "partial" || job.status === "failed";
|
|
45480
45496
|
return {
|
|
45481
45497
|
ingestId: job.ingestId,
|
|
45482
45498
|
importPlanId: job.importPlanId,
|
|
45483
45499
|
status: job.status,
|
|
45484
|
-
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 },
|
|
45485
45501
|
attachments: { planned: plan?.attachmentCount ?? storedAttachments, stored: storedAttachments, indexed: indexedAttachments, storedUnindexed: Math.max(0, storedAttachments - indexedAttachments), failed: 0 },
|
|
45486
45502
|
manifestStored: !!checkpoints.manifest,
|
|
45487
45503
|
complete: job.status === "complete",
|
|
45488
|
-
samples: Object.entries(checkpoints).slice(0, 25).map(([sourceKey, receipt]) => ({ sourceKey, state: sourceKey === "manifest" ||
|
|
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 } : {} })),
|
|
45489
45505
|
nextAction: terminal ? job.status === "complete" ? "complete" : "inspect_failures" : job.leaseExpiresAt ? "call_gmail_import_status" : "call_gmail_import_to_memory"
|
|
45490
45506
|
};
|
|
45491
45507
|
}
|
|
@@ -45603,7 +45619,7 @@ function errorResponse(c, error) {
|
|
|
45603
45619
|
if (retryAfterMs) c.header("Retry-After", String(Math.max(1, Math.ceil(retryAfterMs / 1e3))));
|
|
45604
45620
|
return c.json({ ok: false, code: error.code, error: error.message, retryable: "retryable" in error ? error.retryable : false }, error.status);
|
|
45605
45621
|
}
|
|
45606
|
-
console.error("[gmail-route]", error instanceof Error ? error.name : "unknown_error");
|
|
45622
|
+
console.error("[gmail-route]", error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : { name: "unknown_error" });
|
|
45607
45623
|
return c.json({ ok: false, code: "gmail_unavailable", error: "The Gmail workflow is temporarily unavailable.", retryable: true }, 503);
|
|
45608
45624
|
}
|
|
45609
45625
|
function schedulerAuthError(c, error) {
|
|
@@ -54196,7 +54212,7 @@ var PACKAGE_VERSION;
|
|
|
54196
54212
|
var init_version = __esm({
|
|
54197
54213
|
"src/version.ts"() {
|
|
54198
54214
|
"use strict";
|
|
54199
|
-
PACKAGE_VERSION = "0.72.
|
|
54215
|
+
PACKAGE_VERSION = "0.72.7";
|
|
54200
54216
|
}
|
|
54201
54217
|
});
|
|
54202
54218
|
|
package/dist/bin/api-server.js
CHANGED
|
@@ -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-
|
|
20
|
+
import("../server-M5FLUWYD.js"),
|
|
21
21
|
import("../worker-JQORPCFQ.js"),
|
|
22
22
|
import("../db-566MOHHD.js")
|
|
23
23
|
]);
|
|
@@ -112,7 +112,7 @@ function renderInstallTerminal(options) {
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
// src/version.ts
|
|
115
|
-
var PACKAGE_VERSION = "0.72.
|
|
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-
|
|
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;
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
registerScheduledResultsMcpTools,
|
|
14
14
|
registerSerpIntelligenceCaptureTools,
|
|
15
15
|
resolveDeploymentProfile
|
|
16
|
-
} from "../chunk-
|
|
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-
|
|
29
|
+
} from "../chunk-RRZAYUEX.js";
|
|
30
30
|
import "../chunk-DNM65UCK.js";
|
|
31
31
|
import "../chunk-FVL4GUTP.js";
|
|
32
32
|
import "../chunk-WEFPBAAG.js";
|
|
@@ -271,7 +271,7 @@ import {
|
|
|
271
271
|
resolveDeploymentProfile,
|
|
272
272
|
resolveLocalSourcebookSchemaType,
|
|
273
273
|
transcribeMediaUrl
|
|
274
|
-
} from "./chunk-
|
|
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-
|
|
339
|
+
} from "./chunk-RRZAYUEX.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,
|
|
@@ -21623,7 +21631,7 @@ var GmailMemoryIngestService = class {
|
|
|
21623
21631
|
});
|
|
21624
21632
|
progress.checkpoints[attachmentKey] = receipt;
|
|
21625
21633
|
progress.attachmentsStored += 1;
|
|
21626
|
-
if (
|
|
21634
|
+
if (gmailMemoryReceiptIndexed(receipt)) progress.attachmentsIndexed += 1;
|
|
21627
21635
|
job = await checkpoint({ progress });
|
|
21628
21636
|
}
|
|
21629
21637
|
}
|
|
@@ -21667,6 +21675,13 @@ function normalizeProgress(value) {
|
|
|
21667
21675
|
function errorCode(error) {
|
|
21668
21676
|
return error && typeof error === "object" && typeof error.code === "string" ? String(error.code) : "import_step_failed";
|
|
21669
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
|
+
}
|
|
21670
21685
|
function gmailAttachmentSourceIdentity(messageId, messageDigest, partId, attachmentDigest) {
|
|
21671
21686
|
return `gmail:${messageId}:${messageDigest}:${partId}:${attachmentDigest}`;
|
|
21672
21687
|
}
|
|
@@ -21889,17 +21904,18 @@ function publicImportStatus(job, plan) {
|
|
|
21889
21904
|
const errors = Array.isArray(progress.errors) ? progress.errors : [];
|
|
21890
21905
|
const storedMessages = Number(progress.messagesStored ?? 0);
|
|
21891
21906
|
const storedAttachments = Number(progress.attachmentsStored ?? 0);
|
|
21892
|
-
const
|
|
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);
|
|
21893
21909
|
const terminal = job.status === "complete" || job.status === "partial" || job.status === "failed";
|
|
21894
21910
|
return {
|
|
21895
21911
|
ingestId: job.ingestId,
|
|
21896
21912
|
importPlanId: job.importPlanId,
|
|
21897
21913
|
status: job.status,
|
|
21898
|
-
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 },
|
|
21899
21915
|
attachments: { planned: plan?.attachmentCount ?? storedAttachments, stored: storedAttachments, indexed: indexedAttachments, storedUnindexed: Math.max(0, storedAttachments - indexedAttachments), failed: 0 },
|
|
21900
21916
|
manifestStored: !!checkpoints.manifest,
|
|
21901
21917
|
complete: job.status === "complete",
|
|
21902
|
-
samples: Object.entries(checkpoints).slice(0, 25).map(([sourceKey, receipt]) => ({ sourceKey, state: sourceKey === "manifest" ||
|
|
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 } : {} })),
|
|
21903
21919
|
nextAction: terminal ? job.status === "complete" ? "complete" : "inspect_failures" : job.leaseExpiresAt ? "call_gmail_import_status" : "call_gmail_import_to_memory"
|
|
21904
21920
|
};
|
|
21905
21921
|
}
|
|
@@ -22017,7 +22033,7 @@ function errorResponse(c, error) {
|
|
|
22017
22033
|
if (retryAfterMs) c.header("Retry-After", String(Math.max(1, Math.ceil(retryAfterMs / 1e3))));
|
|
22018
22034
|
return c.json({ ok: false, code: error.code, error: error.message, retryable: "retryable" in error ? error.retryable : false }, error.status);
|
|
22019
22035
|
}
|
|
22020
|
-
console.error("[gmail-route]", error instanceof Error ? error.name : "unknown_error");
|
|
22036
|
+
console.error("[gmail-route]", error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : { name: "unknown_error" });
|
|
22021
22037
|
return c.json({ ok: false, code: "gmail_unavailable", error: "The Gmail workflow is temporarily unavailable.", retryable: true }, 503);
|
|
22022
22038
|
}
|
|
22023
22039
|
gmailApp.use("/api/gmail/*", auth);
|