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 +15 -1
- package/README.md +1 -1
- package/dist/bin/api-server.cjs +26 -3
- 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-WQBWDDT4.js → chunk-D5CX3WHG.js} +1 -1
- package/dist/{chunk-EYKIQBYR.js → chunk-XRH2DUAQ.js} +1 -1
- package/dist/{server-ORLMQHS6.js → server-LQ6TMI5W.js} +27 -4
- 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.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.
|
|
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.
|
|
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
|
|
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,
|
|
@@ -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", {
|
|
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.
|
|
54207
|
+
PACKAGE_VERSION = "0.72.6";
|
|
54185
54208
|
}
|
|
54186
54209
|
});
|
|
54187
54210
|
|
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-LQ6TMI5W.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.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-
|
|
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;
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
registerScheduledResultsMcpTools,
|
|
14
14
|
registerSerpIntelligenceCaptureTools,
|
|
15
15
|
resolveDeploymentProfile
|
|
16
|
-
} from "../chunk-
|
|
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-
|
|
29
|
+
} from "../chunk-D5CX3WHG.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-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-
|
|
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", {
|
|
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);
|