mcp-scraper 0.83.2 → 0.83.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 +17 -1
- package/README.md +1 -1
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-core.js +3 -3
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.js +3 -3
- package/dist/{chunk-22SQKQCO.js → chunk-52TSKUQQ.js} +2 -2
- package/dist/{chunk-I4KYWMZB.js → chunk-GMOXDXON.js} +1 -1
- package/dist/{chunk-2SUX4DKY.js → chunk-VP4FGTTS.js} +13 -5
- package/dist/{server-S7EUK25A.js → server-DMQDHAEC.js} +29 -16
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ All notable changes to MCP Scraper are documented here. The format is based on [
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.83.4] - 2026-09-01
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Collapsed repeated route-and-selector setup candidates into one runtime rule, preventing one semantic CTA interaction from emitting duplicate events.
|
|
12
|
+
- Published `data-xray-event` selectors as semantic rules so the Pixel records the element's live CTA placement, component, action, destination, plan, value, currency, and content dimensions.
|
|
13
|
+
|
|
14
|
+
## [0.83.3] - 2026-09-01
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Translated the public MCP setup vocabulary into the canonical REST preparation contract, so documented `same_origin`, consent, goal, and page-limit inputs no longer fail with a 400 response.
|
|
19
|
+
- Let the unified setup facade derive a stable retry key for ordinary non-delivering verification, keeping idempotency safe without requiring the customer to invent a key.
|
|
20
|
+
|
|
7
21
|
## [0.83.2] - 2026-09-01
|
|
8
22
|
|
|
9
23
|
### Fixed
|
|
@@ -1592,7 +1606,9 @@ All notable changes to MCP Scraper are documented here. The format is based on [
|
|
|
1592
1606
|
- Write actions remain unavailable until the account owner explicitly enables them.
|
|
1593
1607
|
- Provider-specific connection data is normalized into one agent-facing contract.
|
|
1594
1608
|
|
|
1595
|
-
[Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.83.
|
|
1609
|
+
[Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.83.3...HEAD
|
|
1610
|
+
[0.83.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.83.3...v0.83.4
|
|
1611
|
+
[0.83.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.83.2...v0.83.3
|
|
1596
1612
|
[0.83.2]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.83.1...v0.83.2
|
|
1597
1613
|
[0.83.1]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.83.0...v0.83.1
|
|
1598
1614
|
[0.83.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.82.0...v0.83.0
|
package/README.md
CHANGED
|
@@ -175,7 +175,7 @@ Build the branded one-click bundle:
|
|
|
175
175
|
npm run build:mcpb
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
-
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.83.
|
|
178
|
+
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.83.4`, SHA-256 `6c28dbd3fc92912da0965efe80e093d47de4ed209e5b7646b4a97d4cdb23fb1b`). 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.
|
|
179
179
|
|
|
180
180
|
The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
|
|
181
181
|
|
package/dist/bin/api-server.js
CHANGED
|
@@ -17,7 +17,7 @@ loadDotEnv();
|
|
|
17
17
|
async function main() {
|
|
18
18
|
const [{ serve }, { app, personalAssistantProductionStartup }, { startWorker }, { migrate }] = await Promise.all([
|
|
19
19
|
import("@hono/node-server"),
|
|
20
|
-
import("../server-
|
|
20
|
+
import("../server-DMQDHAEC.js"),
|
|
21
21
|
import("../worker-FM3ZRDY4.js"),
|
|
22
22
|
import("../db-Z34LPZNR.js")
|
|
23
23
|
]);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runMcpScraperStdio
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-52TSKUQQ.js";
|
|
5
|
+
import "../chunk-VP4FGTTS.js";
|
|
6
6
|
import "../chunk-PGJQDMC2.js";
|
|
7
7
|
import "../chunk-DNM65UCK.js";
|
|
8
8
|
import "../chunk-T3MZISOF.js";
|
|
@@ -13,7 +13,7 @@ import "../chunk-OPQIGAFB.js";
|
|
|
13
13
|
import "../chunk-UXVT7FWW.js";
|
|
14
14
|
import "../chunk-BGD7U3AE.js";
|
|
15
15
|
import "../chunk-GGZEC22A.js";
|
|
16
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-GMOXDXON.js";
|
|
17
17
|
import "../chunk-YXNDOQXN.js";
|
|
18
18
|
|
|
19
19
|
// src/mcp/thorbit-restricted-tool-surface.ts
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "../chunk-UXVT7FWW.js";
|
|
5
5
|
import {
|
|
6
6
|
PACKAGE_VERSION
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-GMOXDXON.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;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runMcpScraperStdio
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-52TSKUQQ.js";
|
|
5
|
+
import "../chunk-VP4FGTTS.js";
|
|
6
6
|
import "../chunk-PGJQDMC2.js";
|
|
7
7
|
import "../chunk-DNM65UCK.js";
|
|
8
8
|
import "../chunk-T3MZISOF.js";
|
|
@@ -13,7 +13,7 @@ import "../chunk-OPQIGAFB.js";
|
|
|
13
13
|
import "../chunk-UXVT7FWW.js";
|
|
14
14
|
import "../chunk-BGD7U3AE.js";
|
|
15
15
|
import "../chunk-GGZEC22A.js";
|
|
16
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-GMOXDXON.js";
|
|
17
17
|
import "../chunk-YXNDOQXN.js";
|
|
18
18
|
|
|
19
19
|
// bin/mcp-stdio-server.ts
|
|
@@ -12,13 +12,13 @@ import {
|
|
|
12
12
|
registerScheduledResultsMcpTools,
|
|
13
13
|
registerSerpIntelligenceCaptureTools,
|
|
14
14
|
resolveDeploymentProfile
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-VP4FGTTS.js";
|
|
16
16
|
import {
|
|
17
17
|
renderInstallTerminal
|
|
18
18
|
} from "./chunk-UXVT7FWW.js";
|
|
19
19
|
import {
|
|
20
20
|
PACKAGE_VERSION
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-GMOXDXON.js";
|
|
22
22
|
|
|
23
23
|
// src/mcp/stdio-runtime.ts
|
|
24
24
|
import { readFileSync } from "fs";
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
} from "./chunk-BGD7U3AE.js";
|
|
51
51
|
import {
|
|
52
52
|
PACKAGE_VERSION
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-GMOXDXON.js";
|
|
54
54
|
import {
|
|
55
55
|
PUBLIC_ERROR_CODES,
|
|
56
56
|
buildPublicErrorEnvelope,
|
|
@@ -18596,14 +18596,14 @@ var HttpMcpToolExecutor = class {
|
|
|
18596
18596
|
}), "facade");
|
|
18597
18597
|
}
|
|
18598
18598
|
if (input.goalAction === "verify") {
|
|
18599
|
-
if (!input.siteId || !input.revision
|
|
18600
|
-
return analyticsSetupFacadeInputError("Verify requires siteId, setupId,
|
|
18599
|
+
if (!input.siteId || !input.revision) {
|
|
18600
|
+
return analyticsSetupFacadeInputError("Verify requires siteId, setupId, and revision.");
|
|
18601
18601
|
}
|
|
18602
18602
|
return analyticsSetupMcpResult(await this.analyticsVerifySiteSetup({
|
|
18603
18603
|
siteId: input.siteId,
|
|
18604
18604
|
setupId: input.setupId,
|
|
18605
18605
|
revision: input.revision,
|
|
18606
|
-
idempotencyKey: input.idempotencyKey
|
|
18606
|
+
idempotencyKey: input.idempotencyKey ?? `verify-${input.setupId}-${input.revision}`,
|
|
18607
18607
|
...input.authority?.confirmedCanary === true ? { confirmedCanary: true } : {}
|
|
18608
18608
|
}), "facade");
|
|
18609
18609
|
}
|
|
@@ -18630,7 +18630,15 @@ var HttpMcpToolExecutor = class {
|
|
|
18630
18630
|
);
|
|
18631
18631
|
}
|
|
18632
18632
|
async analyticsPrepareSiteSetup(input) {
|
|
18633
|
-
const { siteId
|
|
18633
|
+
const { siteId } = input;
|
|
18634
|
+
const body = {
|
|
18635
|
+
startUrl: input.startUrl,
|
|
18636
|
+
scope: input.scope === "same_origin" ? "whole_site" : input.scope,
|
|
18637
|
+
maxPages: Math.min(40, input.maxPages),
|
|
18638
|
+
...input.businessModel ? { businessModel: input.businessModel } : {},
|
|
18639
|
+
...input.goal ? { desiredOutcomes: [input.goal] } : {},
|
|
18640
|
+
consentMode: input.consentMode === "required" ? "existing" : input.consentMode === "granted_test" ? "explicit" : "unknown"
|
|
18641
|
+
};
|
|
18634
18642
|
return analyticsSetupMcpResult(
|
|
18635
18643
|
await this.call(analyticsSitePath(siteId, "site-setup/prepare"), body, this.timeoutMs, "POST"),
|
|
18636
18644
|
"prepare"
|
|
@@ -373,7 +373,7 @@ import {
|
|
|
373
373
|
resolveLocalSourcebookSchemaType,
|
|
374
374
|
transcribeMediaUrl,
|
|
375
375
|
transitionAnalyticsExperiment
|
|
376
|
-
} from "./chunk-
|
|
376
|
+
} from "./chunk-VP4FGTTS.js";
|
|
377
377
|
import {
|
|
378
378
|
auditImageUrls,
|
|
379
379
|
auditImages,
|
|
@@ -494,7 +494,7 @@ import {
|
|
|
494
494
|
} from "./chunk-GGZEC22A.js";
|
|
495
495
|
import {
|
|
496
496
|
PACKAGE_VERSION
|
|
497
|
-
} from "./chunk-
|
|
497
|
+
} from "./chunk-GMOXDXON.js";
|
|
498
498
|
import {
|
|
499
499
|
CaptchaError,
|
|
500
500
|
MapsSearchIncompletePageError,
|
|
@@ -53283,6 +53283,9 @@ async function requireSetupEntitlement(userId) {
|
|
|
53283
53283
|
throw new AnalyticsRepositoryError("analytics_entitlement_required", "A current X-Ray entitlement is required for site setup.", 403);
|
|
53284
53284
|
}
|
|
53285
53285
|
}
|
|
53286
|
+
function analyticsSemanticEventName(selector) {
|
|
53287
|
+
return /^\[data-xray-event=(["'])([a-z][a-z0-9_]{1,79})\1\]$/.exec(selector)?.[2] ?? null;
|
|
53288
|
+
}
|
|
53286
53289
|
function analyticsSiteSetupService() {
|
|
53287
53290
|
const db = getAnalyticsPool();
|
|
53288
53291
|
return new AnalyticsSiteSetupService({
|
|
@@ -53295,20 +53298,30 @@ function analyticsSiteSetupService() {
|
|
|
53295
53298
|
hex[16] = ["8", "9", "a", "b"][Number.parseInt(hex[16], 16) % 4];
|
|
53296
53299
|
return `${hex.slice(0, 8).join("")}-${hex.slice(8, 12).join("")}-${hex.slice(12, 16).join("")}-${hex.slice(16, 20).join("")}-${hex.slice(20).join("")}`;
|
|
53297
53300
|
};
|
|
53298
|
-
const
|
|
53299
|
-
|
|
53300
|
-
|
|
53301
|
-
|
|
53302
|
-
|
|
53303
|
-
|
|
53304
|
-
|
|
53305
|
-
|
|
53306
|
-
|
|
53307
|
-
|
|
53308
|
-
|
|
53309
|
-
|
|
53310
|
-
|
|
53311
|
-
|
|
53301
|
+
const groupedCandidates = /* @__PURE__ */ new Map();
|
|
53302
|
+
for (const candidate of record7.candidates.filter((item) => item.disposition === "recommended" && Boolean(item.selector)).slice(0, 250)) {
|
|
53303
|
+
const key3 = `${candidate.routePath}\0${candidate.selector}`;
|
|
53304
|
+
const existing = groupedCandidates.get(key3);
|
|
53305
|
+
if (existing) existing.expectedMatches = Math.min(100, existing.expectedMatches + Math.max(1, candidate.occurrenceCount || 1));
|
|
53306
|
+
else groupedCandidates.set(key3, { candidate, expectedMatches: Math.max(1, Math.min(100, candidate.occurrenceCount || 1)) });
|
|
53307
|
+
}
|
|
53308
|
+
const eventRules = [...groupedCandidates.entries()].map(([groupKey, { candidate, expectedMatches }]) => {
|
|
53309
|
+
const semanticEventName = analyticsSemanticEventName(candidate.selector);
|
|
53310
|
+
return {
|
|
53311
|
+
id: uuidFor(groupKey),
|
|
53312
|
+
version: 1,
|
|
53313
|
+
name: `xray_${candidate.candidateId}`.slice(0, 120),
|
|
53314
|
+
eventName: semanticEventName ?? candidate.eventName,
|
|
53315
|
+
triggerKind: semanticEventName ? "semantic" : candidate.action === "submit" ? "form" : "click",
|
|
53316
|
+
selector: candidate.selector,
|
|
53317
|
+
path: candidate.routePath,
|
|
53318
|
+
pathMatch: "exact",
|
|
53319
|
+
hostnames: [hostname],
|
|
53320
|
+
metadata: candidate.context,
|
|
53321
|
+
oncePerSession: false,
|
|
53322
|
+
expectedMatches: { min: 1, max: expectedMatches }
|
|
53323
|
+
};
|
|
53324
|
+
});
|
|
53312
53325
|
const manifest = await publishAnalyticsRuntimeManifest({
|
|
53313
53326
|
pool: db,
|
|
53314
53327
|
ownerUserId: Number(record7.ownerId),
|