mcp-scraper 0.2.7 → 0.2.9
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/README.md +44 -5
- package/dist/bin/api-server.cjs +2417 -648
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +3 -3
- package/dist/bin/browser-agent-stdio-server.cjs +1 -1
- package/dist/bin/browser-agent-stdio-server.cjs.map +1 -1
- package/dist/bin/browser-agent-stdio-server.js +2 -2
- package/dist/bin/mcp-scraper-cli.cjs +1276 -0
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -0
- package/dist/bin/mcp-scraper-cli.d.cts +1 -0
- package/dist/bin/mcp-scraper-cli.d.ts +1 -0
- package/dist/bin/mcp-scraper-cli.js +476 -0
- package/dist/bin/mcp-scraper-cli.js.map +1 -0
- package/dist/bin/mcp-scraper-combined-stdio-server.cjs +69 -14
- package/dist/bin/mcp-scraper-combined-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-scraper-combined-stdio-server.js +3 -3
- package/dist/bin/mcp-scraper-install.cjs +5 -1
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +5 -1
- package/dist/bin/mcp-scraper-install.js.map +1 -1
- package/dist/bin/mcp-stdio-server.cjs +69 -14
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/bin/paa-harvest.cjs +42 -6
- package/dist/bin/paa-harvest.cjs.map +1 -1
- package/dist/bin/paa-harvest.js +1 -1
- package/dist/{chunk-3TF6UT2P.js → chunk-5E6KJC26.js} +2 -2
- package/dist/{chunk-D4CJBZBY.js → chunk-7GCCOT3M.js} +372 -1
- package/dist/chunk-7GCCOT3M.js.map +1 -0
- package/dist/chunk-BJDCPCIE.js +7 -0
- package/dist/chunk-BJDCPCIE.js.map +1 -0
- package/dist/{chunk-MY3S7EX7.js → chunk-CQTAKXBN.js} +43 -7
- package/dist/chunk-CQTAKXBN.js.map +1 -0
- package/dist/chunk-L6IS63WS.js +869 -0
- package/dist/chunk-L6IS63WS.js.map +1 -0
- package/dist/{chunk-IQOCZGJJ.js → chunk-ROS67BNV.js} +5 -5
- package/dist/{chunk-7SI6XIR3.js → chunk-XAY5U67D.js} +70 -15
- package/dist/chunk-XAY5U67D.js.map +1 -0
- package/dist/{db-YWCNHBLH.js → db-BVHYI57K.js} +38 -2
- package/dist/index.cjs +42 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{server-RIKRBDOI.js → server-BKJ7LULQ.js} +818 -394
- package/dist/server-BKJ7LULQ.js.map +1 -0
- package/dist/{worker-NAKGTIF5.js → worker-TDJQ6TH3.js} +8 -8
- package/docs/mcp-tool-quality-spec.md +3 -1
- package/docs/specs/agent-ready-seo-packet-spec.md +237 -0
- package/docs/specs/cli-agent-wiring-spec.md +203 -0
- package/docs/specs/deferred-work-spec.md +12 -0
- package/docs/specs/local-competitive-audit-spec.md +312 -0
- package/docs/specs/scheduled-workflows-api-spec.md +304 -0
- package/docs/specs/seo-cli-growth-roadmap-spec.md +179 -0
- package/docs/specs/seo-workflow-runner-and-reports-spec.md +241 -0
- package/package.json +3 -2
- package/dist/chunk-7SI6XIR3.js.map +0 -1
- package/dist/chunk-D4CJBZBY.js.map +0 -1
- package/dist/chunk-IZE5UW7Y.js +0 -7
- package/dist/chunk-IZE5UW7Y.js.map +0 -1
- package/dist/chunk-MY3S7EX7.js.map +0 -1
- package/dist/server-RIKRBDOI.js.map +0 -1
- /package/dist/{chunk-3TF6UT2P.js.map → chunk-5E6KJC26.js.map} +0 -0
- /package/dist/{chunk-IQOCZGJJ.js.map → chunk-ROS67BNV.js.map} +0 -0
- /package/dist/{db-YWCNHBLH.js.map → db-BVHYI57K.js.map} +0 -0
- /package/dist/{worker-NAKGTIF5.js.map → worker-TDJQ6TH3.js.map} +0 -0
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import {
|
|
3
3
|
HttpMcpToolExecutor,
|
|
4
4
|
buildPaaExtractorMcpServer
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-XAY5U67D.js";
|
|
6
6
|
import "../chunk-M2S27J6Z.js";
|
|
7
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-BJDCPCIE.js";
|
|
8
8
|
|
|
9
9
|
// bin/mcp-stdio-server.ts
|
|
10
10
|
import { readFileSync } from "fs";
|
package/dist/bin/paa-harvest.cjs
CHANGED
|
@@ -262,6 +262,8 @@ var MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X)
|
|
|
262
262
|
var DEFAULT_KERNEL_BROWSER_TIMEOUT_SECONDS = 180;
|
|
263
263
|
var KERNEL_BROWSER_CLOSE_TIMEOUT_MS = 3e3;
|
|
264
264
|
var KERNEL_SESSION_DELETE_TIMEOUT_MS = 5e3;
|
|
265
|
+
var DEFAULT_SERP_CHALLENGE_SOLVE_WAIT_MS = 2500;
|
|
266
|
+
var SERP_CHALLENGE_SOLVE_POLL_MS = 500;
|
|
265
267
|
function positiveIntFromEnv(name, fallback) {
|
|
266
268
|
const raw = process.env[name];
|
|
267
269
|
if (!raw) return fallback;
|
|
@@ -573,20 +575,20 @@ var BrowserDriver = class {
|
|
|
573
575
|
const diag = await this.captureDiagnostics(url);
|
|
574
576
|
throw new ExtractionError(`page.goto failed: ${err.message} | ${diag}`);
|
|
575
577
|
}
|
|
576
|
-
|
|
577
|
-
if (captchaCount > 0) {
|
|
578
|
+
if (await this.isSerpChallengeVisible()) {
|
|
578
579
|
await this.updateSerpNavigationDebug(navDebug, url, { hasPaa: false, captchaDetected: true });
|
|
579
|
-
|
|
580
|
+
const solved = await this.waitForSerpChallengeToClear(navDebug, url);
|
|
581
|
+
if (!solved) throw new CaptchaError(this.captchaMessage());
|
|
580
582
|
}
|
|
581
583
|
const fastFound = await this.page.waitForSelector(PAASelectors.item, { timeout: 4e3 }).catch(() => null);
|
|
582
584
|
if (fastFound) {
|
|
583
585
|
await this.updateSerpNavigationDebug(navDebug, url, { hasPaa: true, captchaDetected: false });
|
|
584
586
|
return { hasPaa: true };
|
|
585
587
|
}
|
|
586
|
-
|
|
587
|
-
if (captchaAfter > 0) {
|
|
588
|
+
if (await this.isSerpChallengeVisible()) {
|
|
588
589
|
await this.updateSerpNavigationDebug(navDebug, url, { hasPaa: false, captchaDetected: true });
|
|
589
|
-
|
|
590
|
+
const solved = await this.waitForSerpChallengeToClear(navDebug, url);
|
|
591
|
+
if (!solved) throw new CaptchaError(this.captchaMessage());
|
|
590
592
|
}
|
|
591
593
|
for (let i = 1; i <= 6; i++) {
|
|
592
594
|
await this.page.evaluate((f) => {
|
|
@@ -602,6 +604,35 @@ var BrowserDriver = class {
|
|
|
602
604
|
await this.updateSerpNavigationDebug(navDebug, url, { hasPaa: false, captchaDetected: false });
|
|
603
605
|
return { hasPaa: false };
|
|
604
606
|
}
|
|
607
|
+
async isSerpChallengeVisible() {
|
|
608
|
+
if (!this.page) return false;
|
|
609
|
+
const captchaCount = await this.page.locator(PAASelectors.captchaMarker).count().catch(() => 0);
|
|
610
|
+
if (captchaCount > 0) return true;
|
|
611
|
+
const finalUrl = this.page.url();
|
|
612
|
+
if (/google\.[^/]+\/sorry\//i.test(finalUrl)) return true;
|
|
613
|
+
const bodySnippet = await this.page.evaluate(() => {
|
|
614
|
+
const text = (document.body?.innerText ?? "").replace(/\s+/g, " ").trim();
|
|
615
|
+
return text.slice(0, 1e3);
|
|
616
|
+
}).catch(() => "");
|
|
617
|
+
return /recaptcha|unusual traffic|are you a robot|about this page|detected unusual traffic/i.test(bodySnippet);
|
|
618
|
+
}
|
|
619
|
+
async waitForSerpChallengeToClear(navDebug, requestedUrl) {
|
|
620
|
+
if (!this.kernelClient || !this.page) return false;
|
|
621
|
+
const waitMs = positiveIntFromEnv("SERP_CHALLENGE_SOLVE_WAIT_MS", DEFAULT_SERP_CHALLENGE_SOLVE_WAIT_MS);
|
|
622
|
+
const deadline = Date.now() + waitMs;
|
|
623
|
+
while (Date.now() < deadline) {
|
|
624
|
+
await this.page.waitForTimeout(Math.min(SERP_CHALLENGE_SOLVE_POLL_MS, Math.max(250, deadline - Date.now())));
|
|
625
|
+
if (!await this.isSerpChallengeVisible()) {
|
|
626
|
+
await this.page.waitForTimeout(1e3);
|
|
627
|
+
if (!await this.isSerpChallengeVisible()) {
|
|
628
|
+
await this.updateSerpNavigationDebug(navDebug, requestedUrl, { hasPaa: null, captchaDetected: false });
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
await this.updateSerpNavigationDebug(navDebug, requestedUrl, { hasPaa: false, captchaDetected: true });
|
|
634
|
+
return false;
|
|
635
|
+
}
|
|
605
636
|
async updateSerpNavigationDebug(navDebug, requestedUrl, state) {
|
|
606
637
|
if (!navDebug || !this.page) return;
|
|
607
638
|
try {
|
|
@@ -649,7 +680,12 @@ var BrowserDriver = class {
|
|
|
649
680
|
async navigateTo(url) {
|
|
650
681
|
try {
|
|
651
682
|
await this.page.goto(url, { waitUntil: "domcontentloaded", timeout: 45e3 });
|
|
683
|
+
if (/google\.[^/]+\/search\?/i.test(url) && await this.isSerpChallengeVisible()) {
|
|
684
|
+
const solved = await this.waitForSerpChallengeToClear(null, url);
|
|
685
|
+
if (!solved) throw new CaptchaError(this.captchaMessage());
|
|
686
|
+
}
|
|
652
687
|
} catch (err) {
|
|
688
|
+
if (err instanceof CaptchaError) throw err;
|
|
653
689
|
const diag = await this.captureDiagnostics(url);
|
|
654
690
|
throw new ExtractionError(`page.goto failed: ${err.message} | ${diag}`);
|
|
655
691
|
}
|