mcp-scraper 0.57.0 → 0.57.2
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 +16 -0
- package/README.md +1 -1
- package/dist/bin/api-server.cjs +35 -9
- 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 +1 -1
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/{chunk-ULAJAZQF.js → chunk-67JUTUQD.js} +2 -2
- package/dist/chunk-QN4W5SX6.js +7 -0
- package/dist/chunk-QN4W5SX6.js.map +1 -0
- package/dist/{server-NBGZJX4P.js → server-OZJXK7AB.js} +36 -10
- package/dist/{server-NBGZJX4P.js.map → server-OZJXK7AB.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-QQ6ZBYZZ.js +0 -7
- package/dist/chunk-QQ6ZBYZZ.js.map +0 -1
- /package/dist/{chunk-ULAJAZQF.js.map → chunk-67JUTUQD.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ All notable changes to MCP Scraper are documented here. The format is based on [
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.57.2] - 2026-08-16
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Blob storage no longer falls back to the local filesystem on a serverless deployment. `BLOB_READ_WRITE_TOKEN` was empty in production, so `getBlobStore()` returned a local store and every write through it — the scrape-vault fallback document and Instagram media downloads — was saved to an ephemeral path inside the function and handed back as a `file://` URL no request could read. Without a token a serverless deployment now returns a store that refuses to write and says why.
|
|
12
|
+
|
|
13
|
+
## [0.57.1] - 2026-08-16
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Commons image hosting resolves the dedicated public store token and refuses to store anything unless the resolved store is Vercel Blob. `BLOB_READ_WRITE_TOKEN` is empty in production, so the previous release would have written a `file://` path into a public wiki entity instead of failing; hosting now fails loudly with `image_storage_unconfigured`.
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- `scripts/backfill-commons-images.ts` hosts the still-reachable featured images and article media on Commons storage, rewrites the entity, and records a contribution-ledger entry per rewrite. Dry run by default; `--apply` to write. Run against production: 15 featured images and 20 media sets moved onto Commons hosting; 26 sources were already dead 404s and one SVG is rejected by policy.
|
|
22
|
+
|
|
7
23
|
## [0.57.0] - 2026-08-16
|
|
8
24
|
|
|
9
25
|
### 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.2`, SHA-256 `1c7ae1f1acf54fc91bc44a8dae29b1da20542a63b168f496ae91a67be9caaf33`). 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
|
@@ -37303,16 +37303,21 @@ function byteLength(data) {
|
|
|
37303
37303
|
function localBaseDir2() {
|
|
37304
37304
|
return process.env.MCP_SCRAPER_OUTPUT_DIR?.trim() || (0, import_node_path11.join)((0, import_node_os7.homedir)(), "Downloads", "mcp-scraper");
|
|
37305
37305
|
}
|
|
37306
|
+
function runsWithoutLocalDisk(env = process.env) {
|
|
37307
|
+
return Boolean(env.VERCEL || env.AWS_LAMBDA_FUNCTION_NAME);
|
|
37308
|
+
}
|
|
37309
|
+
function resolveBlobStore(env = process.env) {
|
|
37310
|
+
const token6 = env.BLOB_READ_WRITE_TOKEN?.trim();
|
|
37311
|
+
if (token6) return new VercelBlobStore(token6);
|
|
37312
|
+
if (runsWithoutLocalDisk(env)) return new UnconfiguredBlobStore();
|
|
37313
|
+
return new LocalBlobStore(localBaseDir2());
|
|
37314
|
+
}
|
|
37306
37315
|
function getBlobStore() {
|
|
37307
37316
|
if (cached) return cached;
|
|
37308
|
-
|
|
37309
|
-
cached = new VercelBlobStore(process.env.BLOB_READ_WRITE_TOKEN);
|
|
37310
|
-
} else {
|
|
37311
|
-
cached = new LocalBlobStore(localBaseDir2());
|
|
37312
|
-
}
|
|
37317
|
+
cached = resolveBlobStore();
|
|
37313
37318
|
return cached;
|
|
37314
37319
|
}
|
|
37315
|
-
var import_node_fs7, import_node_os7, import_node_path11, LocalBlobStore, cached, VercelBlobStore;
|
|
37320
|
+
var import_node_fs7, import_node_os7, import_node_path11, LocalBlobStore, cached, UnconfiguredBlobStore, VercelBlobStore;
|
|
37316
37321
|
var init_blob_store = __esm({
|
|
37317
37322
|
"src/api/blob-store.ts"() {
|
|
37318
37323
|
"use strict";
|
|
@@ -37342,6 +37347,15 @@ var init_blob_store = __esm({
|
|
|
37342
37347
|
}
|
|
37343
37348
|
};
|
|
37344
37349
|
cached = null;
|
|
37350
|
+
UnconfiguredBlobStore = class {
|
|
37351
|
+
kind = "unconfigured";
|
|
37352
|
+
async put() {
|
|
37353
|
+
throw new Error("Blob storage is not configured on this deployment: set BLOB_READ_WRITE_TOKEN. Refusing to write to a local path that no request can read back.");
|
|
37354
|
+
}
|
|
37355
|
+
async get() {
|
|
37356
|
+
return null;
|
|
37357
|
+
}
|
|
37358
|
+
};
|
|
37345
37359
|
VercelBlobStore = class {
|
|
37346
37360
|
constructor(token6) {
|
|
37347
37361
|
this.token = token6;
|
|
@@ -44624,7 +44638,7 @@ var PACKAGE_VERSION;
|
|
|
44624
44638
|
var init_version = __esm({
|
|
44625
44639
|
"src/version.ts"() {
|
|
44626
44640
|
"use strict";
|
|
44627
|
-
PACKAGE_VERSION = "0.57.
|
|
44641
|
+
PACKAGE_VERSION = "0.57.2";
|
|
44628
44642
|
}
|
|
44629
44643
|
});
|
|
44630
44644
|
|
|
@@ -64399,8 +64413,12 @@ function decodeBase64Image(value) {
|
|
|
64399
64413
|
}
|
|
64400
64414
|
return bytes;
|
|
64401
64415
|
}
|
|
64416
|
+
function commonsImageBlobStore() {
|
|
64417
|
+
const token6 = process.env.COMMONS_IMAGE_READ_WRITE_TOKEN?.trim() || process.env.COMMONS_IMAGE_BLOB_READ_WRITE_TOKEN?.trim() || process.env.BLOB_READ_WRITE_TOKEN?.trim();
|
|
64418
|
+
return token6 ? new VercelBlobStore(token6) : getBlobStore();
|
|
64419
|
+
}
|
|
64402
64420
|
function isCommonsHostedImageUrl(url) {
|
|
64403
|
-
return /^https:\/\/[^/]*(\.public\.blob\.vercel-storage\.com|blob\.vercel-storage\.com)\//i.test(url)
|
|
64421
|
+
return /^https:\/\/[^/]*(\.public\.blob\.vercel-storage\.com|blob\.vercel-storage\.com)\//i.test(url);
|
|
64404
64422
|
}
|
|
64405
64423
|
async function hostCommonsImage(input) {
|
|
64406
64424
|
if (hostOverride) return hostOverride(input);
|
|
@@ -64436,7 +64454,15 @@ async function hostCommonsImage(input) {
|
|
|
64436
64454
|
}
|
|
64437
64455
|
const extension = contentType.split("/")[1] === "jpeg" ? "jpg" : contentType.split("/")[1];
|
|
64438
64456
|
const storageKey = `commons/images/${digest2.slice(0, 2)}/${digest2}.${extension}`;
|
|
64439
|
-
const
|
|
64457
|
+
const store = commonsImageBlobStore();
|
|
64458
|
+
if (store.kind !== "vercel-blob") {
|
|
64459
|
+
throw new CommonsImageError(
|
|
64460
|
+
"image_storage_unconfigured",
|
|
64461
|
+
"Commons image hosting needs a Vercel Blob token. Refusing to write a local file path into a public wiki entity.",
|
|
64462
|
+
422
|
|
64463
|
+
);
|
|
64464
|
+
}
|
|
64465
|
+
const stored = await store.put(storageKey, bytes, contentType);
|
|
64440
64466
|
const id = `TPW-IMG-${digest2.slice(0, 16).toUpperCase()}`;
|
|
64441
64467
|
await getDb().execute({
|
|
64442
64468
|
sql: `
|