mcp-scraper 0.57.2 → 0.57.3
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 +8 -0
- package/README.md +1 -1
- package/dist/bin/api-server.cjs +16 -4
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.cjs +1 -1
- package/dist/bin/mcp-scraper-cli.cjs.map +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.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.cjs +3 -3
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/chunk-LHH3GX3W.js +7 -0
- package/dist/chunk-LHH3GX3W.js.map +1 -0
- package/dist/{chunk-67JUTUQD.js → chunk-QSUSTYB3.js} +4 -4
- package/dist/chunk-QSUSTYB3.js.map +1 -0
- package/dist/{server-OZJXK7AB.js → server-EP2SK2ID.js} +16 -4
- package/dist/server-EP2SK2ID.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-67JUTUQD.js.map +0 -1
- package/dist/chunk-QN4W5SX6.js +0 -7
- package/dist/chunk-QN4W5SX6.js.map +0 -1
- package/dist/server-OZJXK7AB.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes to MCP Scraper are documented here. The format is based on [
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.57.3] - 2026-08-16
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Local Sourcebook exact-place matching no longer rejects a Google listing that appends a service tagline to the business name. `nameOverlap` divided the intersection by the larger token set, so "Meljestic Spa" against "Meljestic Spa: Laser hair removal and Skincare" scored 0.33 against a 0.6 threshold and could never publish — even though the submitted name is fully contained in the Google name and Maps linked the same domain. Identity now also accepts containment of the smaller token set (which must carry two distinctive tokens) or a Maps listing that links the submitted domain. Wrong domain, wrong state, missing address, and single-generic-token still reject.
|
|
12
|
+
- `acquisition_error` is now returned as `acquisitionError` on the submission. It was written on every failure and never selected back, so no response explained why a listing failed.
|
|
13
|
+
- `local_sourcebook_submission_status` and `local_sourcebook_refresh` now state what a failed status means, that coverage counters are only written on success (so zeroed counters do not mean the crawl never ran), and that a replayed refresh still re-runs acquisition.
|
|
14
|
+
|
|
7
15
|
## [0.57.2] - 2026-08-16
|
|
8
16
|
|
|
9
17
|
### Fixed
|
package/README.md
CHANGED
|
@@ -90,7 +90,7 @@ Build the branded one-click bundle:
|
|
|
90
90
|
npm run build:mcpb
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
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.57.
|
|
93
|
+
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.57.3`, SHA-256 `b1edddd21790e7e5f24bacad85d992d8e995199c5d7e1d314500ba0abaab117c`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
|
|
94
94
|
|
|
95
95
|
The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
|
|
96
96
|
|
package/dist/bin/api-server.cjs
CHANGED
|
@@ -29050,6 +29050,7 @@ function mapSubmission(row) {
|
|
|
29050
29050
|
businessName: String(rowValue(row, "business_name")),
|
|
29051
29051
|
websiteUrl: String(rowValue(row, "website_url")),
|
|
29052
29052
|
status: String(rowValue(row, "status")),
|
|
29053
|
+
acquisitionError: rowValue(row, "acquisition_error") == null ? null : String(rowValue(row, "acquisition_error")),
|
|
29053
29054
|
draftRevision: Number(rowValue(row, "draft_revision")),
|
|
29054
29055
|
publishedRevision: rowValue(row, "published_revision") == null ? null : Number(rowValue(row, "published_revision")),
|
|
29055
29056
|
coverage: parseJson2(rowValue(row, "coverage_json")),
|
|
@@ -30915,6 +30916,15 @@ function nameOverlap(left, right) {
|
|
|
30915
30916
|
const intersection = [...a].filter((token6) => b.has(token6)).length;
|
|
30916
30917
|
return intersection / Math.max(a.size, b.size);
|
|
30917
30918
|
}
|
|
30919
|
+
function nameContainment(left, right) {
|
|
30920
|
+
const a = tokens(left);
|
|
30921
|
+
const b = tokens(right);
|
|
30922
|
+
if (!a.size || !b.size) return 0;
|
|
30923
|
+
const smaller = a.size <= b.size ? a : b;
|
|
30924
|
+
if (smaller.size < 2) return 0;
|
|
30925
|
+
const intersection = [...a].filter((token6) => b.has(token6)).length;
|
|
30926
|
+
return intersection / smaller.size;
|
|
30927
|
+
}
|
|
30918
30928
|
function validateLocalSourcebookMapsIdentity(submission, maps) {
|
|
30919
30929
|
const expectedHost = host(submission.websiteUrl);
|
|
30920
30930
|
const mapsHost = host(maps.website);
|
|
@@ -30924,7 +30934,9 @@ function validateLocalSourcebookMapsIdentity(submission, maps) {
|
|
|
30924
30934
|
if (mapsHost && expectedHost && mapsHost !== expectedHost && !mapsHost.endsWith(`.${expectedHost}`) && !expectedHost.endsWith(`.${mapsHost}`)) {
|
|
30925
30935
|
throw new Error(`Exact-place match rejected: Google Maps linked ${mapsHost}, not the submitted domain ${expectedHost}.`);
|
|
30926
30936
|
}
|
|
30927
|
-
|
|
30937
|
+
const containment = nameContainment(submission.businessName, actualName);
|
|
30938
|
+
const domainConfirmsIdentity = Boolean(mapsHost && expectedHost);
|
|
30939
|
+
if (overlap < 0.6 && containment < 0.9 && !domainConfirmsIdentity) {
|
|
30928
30940
|
throw new Error(`Exact-place match rejected: Google Maps returned \u201C${actualName},\u201D which does not sufficiently match \u201C${submission.businessName}.\u201D`);
|
|
30929
30941
|
}
|
|
30930
30942
|
if (addressState && addressState !== submission.state.toLowerCase()) {
|
|
@@ -44638,7 +44650,7 @@ var PACKAGE_VERSION;
|
|
|
44638
44650
|
var init_version = __esm({
|
|
44639
44651
|
"src/version.ts"() {
|
|
44640
44652
|
"use strict";
|
|
44641
|
-
PACKAGE_VERSION = "0.57.
|
|
44653
|
+
PACKAGE_VERSION = "0.57.3";
|
|
44642
44654
|
}
|
|
44643
44655
|
});
|
|
44644
44656
|
|
|
@@ -50647,14 +50659,14 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
|
|
|
50647
50659
|
}, async (input) => executor.localSourcebookCapture(input));
|
|
50648
50660
|
server.registerTool("local_sourcebook_submission_status", {
|
|
50649
50661
|
title: "Local Sourcebook Submission Status",
|
|
50650
|
-
description: "Read the authenticated caller\u2019s listing draft, enrichment coverage, immutable revision number, publication state, and exact live LocalSourcebook.com profile and reviews URLs.",
|
|
50662
|
+
description: "Read the authenticated caller\u2019s listing draft, enrichment coverage, immutable revision number, publication state, and exact live LocalSourcebook.com profile and reviews URLs. When status is failed, acquisitionError states why in plain language \u2014 read it before retrying, because a refresh repeats the same acquisition and will fail the same way until the cause is fixed. Coverage counters are written only when acquisition succeeds, so a failed listing still shows the pre-run crawl block; zeroed counters do not mean the crawl never ran.",
|
|
50651
50663
|
inputSchema: LocalSourcebookSubmissionStatusInputSchema,
|
|
50652
50664
|
outputSchema: recordOutputSchema("local_sourcebook_submission_status", LocalSourcebookOutputSchema),
|
|
50653
50665
|
annotations: localPlanningToolAnnotations("Local Sourcebook Submission Status")
|
|
50654
50666
|
}, async (input) => executor.localSourcebookSubmissionStatus(input));
|
|
50655
50667
|
server.registerTool("local_sourcebook_refresh", {
|
|
50656
50668
|
title: "Refresh a Local Sourcebook Listing",
|
|
50657
|
-
description: "Queue a new broad crawl and review/media acquisition pass for a listing owned by the authenticated MCP Scraper account. A refresh costs 2 Credits total, including acquisition; idempotent retries are not charged twice. The last published revision remains public until the refreshed evidence revision completes and auto-publishes.",
|
|
50669
|
+
description: "Queue a new broad crawl and review/media acquisition pass for a listing owned by the authenticated MCP Scraper account. A refresh costs 2 Credits total, including acquisition; idempotent retries are not charged twice, and a replayed retry still re-runs the acquisition, so a failed listing is always recoverable. Read local_sourcebook_submission_status first: a refresh repeats the same acquisition, so fix whatever acquisitionError reports before spending another pass. The last published revision remains public until the refreshed evidence revision completes and auto-publishes.",
|
|
50658
50670
|
inputSchema: LocalSourcebookRefreshInputSchema,
|
|
50659
50671
|
outputSchema: recordOutputSchema("local_sourcebook_refresh", LocalSourcebookOutputSchema),
|
|
50660
50672
|
annotations: liveWebToolAnnotations("Refresh a Local Sourcebook Listing")
|