mcp-scraper 0.3.9 → 0.3.11
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 +6 -4
- package/dist/bin/api-server.cjs +138 -19
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/browser-agent-stdio-server.cjs +104 -28
- 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 +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-combined-stdio-server.cjs +110 -34
- package/dist/bin/mcp-scraper-combined-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-scraper-combined-stdio-server.js +4 -4
- package/dist/bin/mcp-scraper-install.cjs +7 -7
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +2 -2
- 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-ELI6NDEG.js → chunk-KPXMPAJ3.js} +7 -7
- package/dist/chunk-KPXMPAJ3.js.map +1 -0
- package/dist/{chunk-BRUVQRJK.js → chunk-L27GJQV7.js} +105 -29
- package/dist/chunk-L27GJQV7.js.map +1 -0
- package/dist/chunk-RRE7WVHQ.js +7 -0
- package/dist/chunk-RRE7WVHQ.js.map +1 -0
- package/dist/{chunk-KDKQ5Y7V.js → chunk-VMH7SRWY.js} +2 -2
- package/dist/{server-ZSHE4R5Z.js → server-3SA5Q4OF.js} +140 -21
- package/dist/{server-ZSHE4R5Z.js.map → server-3SA5Q4OF.js.map} +1 -1
- package/docs/mcp-tool-craft-lint.generated.md +3 -2
- package/docs/mcp-tool-manifest.generated.json +43 -13
- package/package.json +1 -1
- package/dist/chunk-7VNTN4Q7.js +0 -7
- package/dist/chunk-7VNTN4Q7.js.map +0 -1
- package/dist/chunk-BRUVQRJK.js.map +0 -1
- package/dist/chunk-ELI6NDEG.js.map +0 -1
- /package/dist/{chunk-KDKQ5Y7V.js.map → chunk-VMH7SRWY.js.map} +0 -0
|
@@ -270,7 +270,7 @@ function browserServiceProfileSaveChanges() {
|
|
|
270
270
|
}
|
|
271
271
|
|
|
272
272
|
// src/version.ts
|
|
273
|
-
var PACKAGE_VERSION = "0.3.
|
|
273
|
+
var PACKAGE_VERSION = "0.3.11";
|
|
274
274
|
|
|
275
275
|
// src/mcp/browser-agent-tool-schemas.ts
|
|
276
276
|
var import_zod = require("zod");
|
|
@@ -296,10 +296,17 @@ var BrowserOpenInputSchema = {
|
|
|
296
296
|
var BrowserProfileOnboardInputSchema = {
|
|
297
297
|
email: import_zod.z.string().optional().describe("Optional account email used to derive a stable MCP Scraper profile name. This does not import cookies or browser state."),
|
|
298
298
|
profile: import_zod.z.string().optional().describe("Optional saved MCP Scraper hosted browser profile name to create or load. If omitted, email is used to derive one."),
|
|
299
|
-
|
|
299
|
+
domain: import_zod.z.string().optional().describe("Authenticated site domain to connect to the profile. Defaults to chatgpt.com for AI visibility fan-out tracking."),
|
|
300
|
+
login_url: import_zod.z.string().url().optional().describe("Optional login URL for the target domain. Defaults to https://chatgpt.com/ when domain is omitted."),
|
|
301
|
+
url: import_zod.z.string().url().optional().describe("Deprecated alias for login_url. Use login_url for the target site login page."),
|
|
300
302
|
label: import_zod.z.string().optional().describe("Optional human label for this setup session."),
|
|
301
303
|
timeout_seconds: import_zod.z.number().int().min(60).max(259200).optional().describe("How long the direct no-proxy setup session may live before auto-termination. Defaults to 600.")
|
|
302
304
|
};
|
|
305
|
+
var BrowserProfileStatusInputSchema = {
|
|
306
|
+
connection_id: import_zod.z.string().optional().describe("Auth connection id returned by browser_profile_onboard. Prefer this when available."),
|
|
307
|
+
profile: import_zod.z.string().optional().describe("Saved hosted profile name to check when connection_id is unavailable."),
|
|
308
|
+
domain: import_zod.z.string().optional().describe("Authenticated site domain to check with profile. Defaults to chatgpt.com when omitted.")
|
|
309
|
+
};
|
|
303
310
|
var BrowserSessionInputSchema = {
|
|
304
311
|
session_id: import_zod.z.string().describe("The session id returned by browser_open or browser_list_sessions. Use only a returned session_id; do not construct one yourself.")
|
|
305
312
|
};
|
|
@@ -400,7 +407,7 @@ var BrowserCaptureFanoutInputSchema = {
|
|
|
400
407
|
wait_ms: import_zod.z.number().int().min(0).max(18e4).optional().describe("How long to wait for the answer stream to finish before parsing. Defaults to 90000 when a prompt is sent, 8000 for passive capture. Capture ends as soon as the answer stream finishes."),
|
|
401
408
|
first_party_domain: import_zod.z.string().optional().describe("The brand/site being researched, for example example.com. Sources on this domain are tagged First-party/vendor. Set this when the prompt is about a specific business."),
|
|
402
409
|
reset: import_zod.z.boolean().default(false).describe("Clear any previously buffered stream for this page before capturing. Use when re-running to avoid mixing turns."),
|
|
403
|
-
export: import_zod.z.boolean().default(false).describe("When true, write JSON, CSV, TSV exports (queries, citations, sources, domains) and a self-contained HTML report to MCP_SCRAPER_OUTPUT_DIR/fanout
|
|
410
|
+
export: import_zod.z.boolean().default(false).describe("When true, write JSON, CSV, TSV exports (queries, citations, all sources, browsed-only sources, snippets, domains) and a self-contained HTML report to MCP_SCRAPER_OUTPUT_DIR/fanout, returning paths relative to MCP_SCRAPER_OUTPUT_DIR.")
|
|
404
411
|
};
|
|
405
412
|
var FanoutSourceOutput = import_zod.z.object({
|
|
406
413
|
url: import_zod.z.string(),
|
|
@@ -442,15 +449,18 @@ var BrowserCaptureFanoutOutputSchema = {
|
|
|
442
449
|
}).describe("Objective aggregates: top sourced sites by frequency, citation order, and URL-category counts."),
|
|
443
450
|
first_party_domain: import_zod.z.string().nullable(),
|
|
444
451
|
exports: import_zod.z.object({
|
|
452
|
+
relativeTo: import_zod.z.string(),
|
|
445
453
|
dir: import_zod.z.string(),
|
|
446
454
|
json: import_zod.z.string(),
|
|
447
455
|
queriesCsv: import_zod.z.string(),
|
|
448
456
|
queriesTsv: import_zod.z.string(),
|
|
449
457
|
citationsCsv: import_zod.z.string(),
|
|
450
458
|
sourcesCsv: import_zod.z.string(),
|
|
459
|
+
browsedOnlyCsv: import_zod.z.string(),
|
|
460
|
+
snippetsCsv: import_zod.z.string(),
|
|
451
461
|
domainsCsv: import_zod.z.string(),
|
|
452
462
|
report: import_zod.z.string()
|
|
453
|
-
}).nullable().describe("
|
|
463
|
+
}).nullable().describe("Relative export paths when export=true, otherwise null. Paths are relative to MCP_SCRAPER_OUTPUT_DIR, or ~/Downloads/mcp-scraper when that env var is not set."),
|
|
454
464
|
debug: import_zod.z.object({
|
|
455
465
|
interceptorReady: import_zod.z.boolean(),
|
|
456
466
|
rawBytes: import_zod.z.number().int().min(0),
|
|
@@ -471,15 +481,36 @@ var BrowserOpenOutputSchema = {
|
|
|
471
481
|
var BrowserProfileOnboardOutputSchema = {
|
|
472
482
|
ok: import_zod.z.boolean(),
|
|
473
483
|
tool: import_zod.z.literal("browser_profile_onboard"),
|
|
474
|
-
session_id:
|
|
484
|
+
session_id: NullableString,
|
|
485
|
+
auth_connection_id: import_zod.z.string(),
|
|
475
486
|
watch_url: import_zod.z.string(),
|
|
476
487
|
live_view_url: NullableString,
|
|
477
488
|
profile: import_zod.z.string(),
|
|
489
|
+
domain: import_zod.z.string(),
|
|
478
490
|
setup_url: import_zod.z.string(),
|
|
479
491
|
account_email: NullableString,
|
|
492
|
+
status: import_zod.z.string(),
|
|
493
|
+
flow_status: NullableString,
|
|
494
|
+
flow_step: NullableString,
|
|
495
|
+
flow_expires_at: NullableString,
|
|
496
|
+
post_login_url: NullableString,
|
|
480
497
|
next_steps: import_zod.z.array(import_zod.z.string()),
|
|
481
498
|
raw: BrowserRawObject.optional()
|
|
482
499
|
};
|
|
500
|
+
var BrowserProfileStatusOutputSchema = {
|
|
501
|
+
ok: import_zod.z.boolean(),
|
|
502
|
+
tool: import_zod.z.literal("browser_profile_status"),
|
|
503
|
+
session_id: NullableString,
|
|
504
|
+
auth_connection_id: import_zod.z.string(),
|
|
505
|
+
profile: import_zod.z.string(),
|
|
506
|
+
domain: import_zod.z.string(),
|
|
507
|
+
status: import_zod.z.string(),
|
|
508
|
+
flow_status: NullableString,
|
|
509
|
+
flow_step: NullableString,
|
|
510
|
+
flow_expires_at: NullableString,
|
|
511
|
+
post_login_url: NullableString,
|
|
512
|
+
raw: BrowserRawObject.optional()
|
|
513
|
+
};
|
|
483
514
|
var BrowserScreenshotOutputSchema = {
|
|
484
515
|
...BrowserBaseOutput,
|
|
485
516
|
tool: import_zod.z.literal("browser_screenshot"),
|
|
@@ -886,10 +917,16 @@ function replayFilePath(sessionId, replayId, filename) {
|
|
|
886
917
|
const name = requested ? safeFilePart(requested).replace(/\.mp4$/i, "") : `${stamp}-${safeFilePart(sessionId)}-${safeFilePart(replayId)}`;
|
|
887
918
|
return (0, import_node_path2.join)(outputBaseDir(), "browser-replays", `${name}.mp4`);
|
|
888
919
|
}
|
|
889
|
-
function
|
|
890
|
-
const
|
|
920
|
+
function slugPart(value) {
|
|
921
|
+
const trimmed = value?.trim().toLowerCase();
|
|
922
|
+
if (!trimmed) return null;
|
|
923
|
+
return trimmed.replace(/^https?:\/\//, "").replace(/^www\./, "").replace(/\/.*$/, "").replace(/[^a-z0-9._-]+/g, "-").replace(/[._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
924
|
+
}
|
|
925
|
+
function savedProfileNameFromEmail(email, domain) {
|
|
926
|
+
const value = slugPart(email);
|
|
891
927
|
if (!value) return null;
|
|
892
|
-
|
|
928
|
+
const domainPart = slugPart(domain);
|
|
929
|
+
return `${value}${domainPart ? `-${domainPart}` : ""}`.slice(0, 80) || null;
|
|
893
930
|
}
|
|
894
931
|
function annotatedReplayFilePath(sessionId, replayId, filename) {
|
|
895
932
|
const requested = filename?.trim();
|
|
@@ -975,45 +1012,83 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
975
1012
|
"browser_profile_onboard",
|
|
976
1013
|
{
|
|
977
1014
|
title: "Connect Hosted Browser Profile",
|
|
978
|
-
description: "Create or load a saved MCP Scraper hosted browser profile and
|
|
1015
|
+
description: "Create or load a saved MCP Scraper hosted browser profile auth connection and return a user takeover login URL. This is the customer auth setup and reconnect flow for AI visibility tracking: give the user the watch_url, let them complete login for the target domain, then call browser_profile_status until status is AUTHENTICATED. If a saved profile later shows login controls, run this same setup flow again.",
|
|
979
1016
|
inputSchema: BrowserProfileOnboardInputSchema,
|
|
980
1017
|
outputSchema: BrowserProfileOnboardOutputSchema,
|
|
981
1018
|
annotations: annotations("Connect Hosted Browser Profile")
|
|
982
1019
|
},
|
|
983
1020
|
async (input) => {
|
|
984
|
-
const
|
|
1021
|
+
const domain = slugPart(input.domain) || "chatgpt.com";
|
|
1022
|
+
const setupUrl = input.login_url ?? input.url ?? (domain === "chatgpt.com" ? "https://chatgpt.com/" : `https://${domain}/`);
|
|
1023
|
+
const profile = input.profile?.trim() || savedProfileNameFromEmail(input.email, domain) || browserServiceProfileName();
|
|
985
1024
|
if (!profile) {
|
|
986
1025
|
return errorResult("browser_profile_onboard", {
|
|
987
1026
|
error: "profile or email is required when BROWSER_AGENT_PROFILE_NAME is not available"
|
|
988
1027
|
});
|
|
989
1028
|
}
|
|
990
|
-
const
|
|
991
|
-
const open = await req("POST", "/agent/sessions", {
|
|
1029
|
+
const open = await req("POST", "/agent/profiles/onboard", {
|
|
992
1030
|
label: input.label ?? `Profile setup: ${profile}`,
|
|
993
1031
|
profile,
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
timeout_seconds: input.timeout_seconds,
|
|
997
|
-
url: setupUrl
|
|
1032
|
+
domain,
|
|
1033
|
+
login_url: setupUrl
|
|
998
1034
|
});
|
|
999
1035
|
if (!open.ok) return errorResult("browser_profile_onboard", open.data);
|
|
1000
|
-
const session = open.data;
|
|
1001
1036
|
return structuredResult({
|
|
1002
1037
|
ok: true,
|
|
1003
1038
|
tool: "browser_profile_onboard",
|
|
1004
|
-
session_id:
|
|
1005
|
-
|
|
1006
|
-
|
|
1039
|
+
session_id: null,
|
|
1040
|
+
auth_connection_id: open.data.connection_id,
|
|
1041
|
+
watch_url: open.data.hosted_url,
|
|
1042
|
+
live_view_url: open.data.live_view_url ?? null,
|
|
1007
1043
|
profile,
|
|
1044
|
+
domain,
|
|
1008
1045
|
setup_url: setupUrl,
|
|
1009
1046
|
account_email: input.email?.trim() || null,
|
|
1047
|
+
status: open.data.status ?? null,
|
|
1048
|
+
flow_status: open.data.flow_status ?? null,
|
|
1049
|
+
flow_step: open.data.flow_step ?? null,
|
|
1050
|
+
flow_expires_at: open.data.flow_expires_at ?? null,
|
|
1051
|
+
post_login_url: open.data.post_login_url ?? null,
|
|
1010
1052
|
next_steps: [
|
|
1011
|
-
"Open the watch_url and let the user
|
|
1012
|
-
"
|
|
1013
|
-
"
|
|
1014
|
-
"
|
|
1053
|
+
"Open the watch_url and let the user complete login for the target domain.",
|
|
1054
|
+
"Call browser_profile_status with auth_connection_id until status is AUTHENTICATED.",
|
|
1055
|
+
"After authentication, call browser_open with this profile name and the target site URL.",
|
|
1056
|
+
"If the saved profile later shows login controls or disconnects, repeat browser_profile_onboard."
|
|
1015
1057
|
],
|
|
1016
|
-
raw:
|
|
1058
|
+
raw: open.data
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
);
|
|
1062
|
+
server2.registerTool(
|
|
1063
|
+
"browser_profile_status",
|
|
1064
|
+
{
|
|
1065
|
+
title: "Check Browser Profile Auth Status",
|
|
1066
|
+
description: "Check whether a hosted browser profile auth connection is authenticated after browser_profile_onboard. Use auth_connection_id when available. Once status is AUTHENTICATED, use browser_open with the returned profile.",
|
|
1067
|
+
inputSchema: BrowserProfileStatusInputSchema,
|
|
1068
|
+
outputSchema: BrowserProfileStatusOutputSchema,
|
|
1069
|
+
annotations: annotations("Check Browser Profile Auth Status", true)
|
|
1070
|
+
},
|
|
1071
|
+
async (input) => {
|
|
1072
|
+
const domain = slugPart(input.domain) || "chatgpt.com";
|
|
1073
|
+
const res = await req("POST", "/agent/profiles/status", {
|
|
1074
|
+
...input.connection_id ? { connection_id: input.connection_id } : {},
|
|
1075
|
+
...input.profile ? { profile: input.profile } : {},
|
|
1076
|
+
domain
|
|
1077
|
+
});
|
|
1078
|
+
if (!res.ok) return errorResult("browser_profile_status", res.data);
|
|
1079
|
+
return structuredResult({
|
|
1080
|
+
ok: true,
|
|
1081
|
+
tool: "browser_profile_status",
|
|
1082
|
+
session_id: null,
|
|
1083
|
+
auth_connection_id: res.data.connection_id,
|
|
1084
|
+
profile: res.data.profile,
|
|
1085
|
+
domain: res.data.domain,
|
|
1086
|
+
status: res.data.status,
|
|
1087
|
+
flow_status: res.data.flow_status ?? null,
|
|
1088
|
+
flow_step: res.data.flow_step ?? null,
|
|
1089
|
+
flow_expires_at: res.data.flow_expires_at ?? null,
|
|
1090
|
+
post_login_url: res.data.post_login_url ?? null,
|
|
1091
|
+
raw: res.data
|
|
1017
1092
|
});
|
|
1018
1093
|
}
|
|
1019
1094
|
);
|
|
@@ -1021,7 +1096,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
1021
1096
|
"browser_open",
|
|
1022
1097
|
{
|
|
1023
1098
|
title: "Open Browser Session",
|
|
1024
|
-
description: "Open a direct no-proxy hosted browser session you can drive. Pass a saved profile name to load an authenticated session for a site. For customer login setup or reconnects, use browser_profile_onboard first
|
|
1099
|
+
description: "Open a direct no-proxy hosted browser session you can drive. Pass a saved profile name to load an authenticated session for a site. For customer login setup or reconnects, use browser_profile_onboard first, then call browser_profile_status until status is AUTHENTICATED. Returns a session_id used by all other browser_* tools.",
|
|
1025
1100
|
inputSchema: BrowserOpenInputSchema,
|
|
1026
1101
|
outputSchema: BrowserOpenOutputSchema,
|
|
1027
1102
|
annotations: annotations("Open Browser Session")
|
|
@@ -1443,7 +1518,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
1443
1518
|
"browser_capture_fanout",
|
|
1444
1519
|
{
|
|
1445
1520
|
title: "Capture AI Search Fan-Out",
|
|
1446
|
-
description: `Capture the query fan-out behind a ChatGPT or Claude web-search answer for Answer Engine Optimization (AEO): the exact sub-queries the model issued, every researched URL split into cited vs browsed-only (with citation frequency and snippet), each source tagged by category (First-party/vendor, News/media, Reddit, Social/video, Encyclopedia, Review site, Docs, Blog), plus top sourced sites and citation order. This returns the raw structured data; YOU analyze it \u2014 classify each sub-query by funnel stage (Problem-aware, Solution-aware, Decision-aware, Retention) and type (BoFu, Branded, Comparison, How-to, Search operator), name the brands the model researched, and give AEO insights. Sample asks: "capture the fan-out for this ChatGPT answer", "what did Claude search and cite for best CRM", "show the sub-queries and sources behind this AI answer". WRITE NOTE: passing prompt submits a real message in the user's logged-in account (a new conversation turn) \u2014 only send when the user wants that; omit prompt to capture a prompt the user just ran. Setup, if not already connected or if the profile disconnected: call browser_profile_onboard, give the user the watch_url, let them
|
|
1521
|
+
description: `Capture the query fan-out behind a ChatGPT or Claude web-search answer for Answer Engine Optimization (AEO): the exact sub-queries the model issued, every researched URL split into cited vs browsed-only (with citation frequency and snippet), each source tagged by category (First-party/vendor, News/media, Reddit, Social/video, Encyclopedia, Review site, Docs, Blog), plus top sourced sites and citation order. Set export=true for durable JSON, CSV, TSV, and HTML artifacts; export paths are returned relative to MCP_SCRAPER_OUTPUT_DIR. This returns the raw structured data; YOU analyze it \u2014 classify each sub-query by funnel stage (Problem-aware, Solution-aware, Decision-aware, Retention) and type (BoFu, Branded, Comparison, How-to, Search operator), name the brands the model researched, and give AEO insights. Sample asks: "capture the fan-out for this ChatGPT answer", "what did Claude search and cite for best CRM", "show the sub-queries and sources behind this AI answer". WRITE NOTE: passing prompt submits a real message in the user's logged-in account (a new conversation turn) \u2014 only send when the user wants that; omit prompt to capture a prompt the user just ran. Setup, if not already connected or if the profile disconnected: call browser_profile_onboard, give the user the watch_url, let them complete login, then call browser_profile_status until status is AUTHENTICATED. After that, browser_open the saved direct no-proxy profile and go to chatgpt.com or claude.ai. Fan-out is captured only as it streams, so the session must be open when the prompt runs. NOT for Google AI Overview citations \u2014 use harvest_paa for those; this tool is ChatGPT and Claude only.`,
|
|
1447
1522
|
inputSchema: BrowserCaptureFanoutInputSchema,
|
|
1448
1523
|
outputSchema: BrowserCaptureFanoutOutputSchema,
|
|
1449
1524
|
annotations: annotations("Capture AI Search Fan-Out")
|
|
@@ -1472,7 +1547,8 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
1472
1547
|
prompt: input.prompt,
|
|
1473
1548
|
wait_ms: input.wait_ms,
|
|
1474
1549
|
first_party_domain: input.first_party_domain,
|
|
1475
|
-
|
|
1550
|
+
reset: input.reset,
|
|
1551
|
+
export: input.export
|
|
1476
1552
|
});
|
|
1477
1553
|
if (!res.ok) return errorResult("browser_capture_fanout", res.data, input.session_id);
|
|
1478
1554
|
const hosted = res.data?.result ?? res.data;
|
|
@@ -4607,14 +4683,14 @@ function renderInstallTerminal(options) {
|
|
|
4607
4683
|
colorize(ascii, "amber", color),
|
|
4608
4684
|
`${colorize("MCP Scraper Agent", "cyan", color)} . v${options.version} . mcpscraper.dev`,
|
|
4609
4685
|
"1/1 install surfaces ready",
|
|
4610
|
-
colorize("Newest: saved hosted browser profiles for AI visibility.
|
|
4686
|
+
colorize("Newest: saved hosted browser profiles for AI visibility. Share the watch_url, user signs in, then verify with browser_profile_status. Browser sessions are direct/no-proxy by default.", "lime", color),
|
|
4611
4687
|
"",
|
|
4612
|
-
`${colorize("Tools", "cyan", color)} ${colorize("(
|
|
4688
|
+
`${colorize("Tools", "cyan", color)} ${colorize("(44 MCP tools)", "muted", color)}`,
|
|
4613
4689
|
toolRow("search", ["harvest_paa", "search_serp", "maps_search", "maps_place_intel"], color),
|
|
4614
4690
|
toolRow("extract", ["extract_url", "map_site_urls", "extract_site", "directory_workflow"], color),
|
|
4615
4691
|
toolRow("build", ["rank_tracker_blueprint", "cron plan", "database prompt"], color),
|
|
4616
4692
|
toolRow("media", ["youtube_harvest", "youtube_transcribe", "facebook_ad_search", "facebook_page_intel", "facebook_ad_transcribe", "facebook_video_transcribe", "instagram_profile_content", "instagram_media_download"], color),
|
|
4617
|
-
toolRow("browser", ["browser_open", "browser_profile_onboard", "browser_close", "browser_screenshot", "browser_read", "browser_locate", "browser_replay_mark", "browser_replay_annotate"], color),
|
|
4693
|
+
toolRow("browser", ["browser_open", "browser_profile_onboard", "browser_profile_status", "browser_close", "browser_screenshot", "browser_read", "browser_locate", "browser_replay_mark", "browser_replay_annotate"], color),
|
|
4618
4694
|
toolRow("account", ["credits_info", "reports", "MCP resources"], color),
|
|
4619
4695
|
`${colorize("Workflows", "cyan", color)} ${colorize("(MCP + CLI + API)", "muted", color)}`,
|
|
4620
4696
|
toolRow("route", ["workflow_list", "workflow_suggest", "workflow_run", "workflow_step", "workflow_status", "workflow_artifact_read"], color),
|
|
@@ -4624,7 +4700,7 @@ function renderInstallTerminal(options) {
|
|
|
4624
4700
|
"Run mcp-scraper-install for this visible card. Run mcp-scraper-cli for setup utilities and subcommands.",
|
|
4625
4701
|
"Run mcp-scraper-combined in a human terminal to print this card; MCP clients get the same command as a silent stdio server.",
|
|
4626
4702
|
"Explicit card command: npx -y -p mcp-scraper@latest mcp-scraper-install",
|
|
4627
|
-
"Customer auth setup: run browser_profile_onboard
|
|
4703
|
+
"Customer auth setup: run browser_profile_onboard, send the watch_url, let the user sign in, then call browser_profile_status until AUTHENTICATED.",
|
|
4628
4704
|
"Reconnect setup: if a saved profile shows login controls later, run browser_profile_onboard again with the same profile name.",
|
|
4629
4705
|
"Start with workflow_suggest for broad jobs like market analysis, ICP research, CRO audits, brand briefs, content gaps, and AI visibility.",
|
|
4630
4706
|
"For MCP clients, use mcp-scraper-combined so one install can mix SERP, Maps, browser, reports, and saved MCP resources.",
|
|
@@ -4636,8 +4712,8 @@ function renderInstallTerminal(options) {
|
|
|
4636
4712
|
"npx -y -p mcp-scraper@latest mcp-scraper-cli doctor",
|
|
4637
4713
|
"",
|
|
4638
4714
|
colorize("Hosted profile setup", "amber", color),
|
|
4639
|
-
'In your MCP client, call browser_profile_onboard with
|
|
4640
|
-
"Give the returned watch_url to the user. After they sign in, call
|
|
4715
|
+
'In your MCP client, call browser_profile_onboard with email="seo@example.com" and domain="chatgpt.com".',
|
|
4716
|
+
"Give the returned watch_url to the user. After they sign in, call browser_profile_status, then browser_open with the returned profile.",
|
|
4641
4717
|
"",
|
|
4642
4718
|
colorize("Claude Code one-command setup", "amber", color),
|
|
4643
4719
|
claudeCommand,
|