mcp-scraper 0.3.3 → 0.3.5
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 +17 -29
- package/dist/bin/api-server.cjs +10 -5
- 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 +32 -29
- 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 +10 -11
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +10 -11
- package/dist/bin/mcp-scraper-cli.js.map +1 -1
- package/dist/bin/mcp-scraper-combined-stdio-server.cjs +39 -36
- 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 +8 -8
- 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-RLBJ3QNC.js → chunk-CMK5MMEE.js} +33 -30
- package/dist/chunk-CMK5MMEE.js.map +1 -0
- package/dist/chunk-GHBU5SGQ.js +7 -0
- package/dist/chunk-GHBU5SGQ.js.map +1 -0
- package/dist/{chunk-C3FGVJWH.js → chunk-RVYHP7QN.js} +8 -8
- package/dist/chunk-RVYHP7QN.js.map +1 -0
- package/dist/{chunk-MGWGZBL5.js → chunk-WZT3XKES.js} +2 -2
- package/dist/{server-D3XHIEQN.js → server-BC4Z2L4P.js} +12 -7
- package/dist/{server-D3XHIEQN.js.map → server-BC4Z2L4P.js.map} +1 -1
- package/docs/mcp-tool-craft-lint.generated.md +1 -1
- package/docs/mcp-tool-manifest.generated.json +21 -24
- package/package.json +1 -1
- package/dist/chunk-C3FGVJWH.js.map +0 -1
- package/dist/chunk-PVXDEREW.js +0 -7
- package/dist/chunk-PVXDEREW.js.map +0 -1
- package/dist/chunk-RLBJ3QNC.js.map +0 -1
- /package/dist/{chunk-MGWGZBL5.js.map → chunk-WZT3XKES.js.map} +0 -0
|
@@ -1679,7 +1679,7 @@ var LocalBrowserAgentService = class {
|
|
|
1679
1679
|
};
|
|
1680
1680
|
|
|
1681
1681
|
// src/version.ts
|
|
1682
|
-
var PACKAGE_VERSION = "0.3.
|
|
1682
|
+
var PACKAGE_VERSION = "0.3.5";
|
|
1683
1683
|
|
|
1684
1684
|
// src/mcp/browser-agent-tool-schemas.ts
|
|
1685
1685
|
var import_zod = require("zod");
|
|
@@ -1698,21 +1698,21 @@ var BrowserReplayBaseOutput = {
|
|
|
1698
1698
|
var BrowserOpenInputSchema = {
|
|
1699
1699
|
label: import_zod.z.string().optional().describe("Optional human label for this session, shown in the watch console."),
|
|
1700
1700
|
url: import_zod.z.string().url().optional().describe("Optional URL to navigate to immediately after opening."),
|
|
1701
|
-
profile: import_zod.z.string().optional().describe("Optional saved profile name to load a logged-in session for a site."),
|
|
1701
|
+
profile: import_zod.z.string().optional().describe("Optional saved hosted profile name to load a logged-in session for a site."),
|
|
1702
1702
|
save_profile_changes: import_zod.z.boolean().optional().describe("Persist cookies and local storage back to the named profile when the session is closed. Use this for profile setup or intentional auth refreshes; avoid parallel sessions writing to the same profile."),
|
|
1703
|
-
timeout_seconds: import_zod.z.number().int().min(60).max(259200).optional().describe("How long the session may live before auto-termination. Defaults to 600. The browser idles into a zero-cost standby between actions, so a longer timeout is cheap.")
|
|
1703
|
+
timeout_seconds: import_zod.z.number().int().min(60).max(259200).optional().describe("How long the direct no-proxy browser session may live before auto-termination. Defaults to 600. The browser idles into a zero-cost standby between actions, so a longer timeout is cheap.")
|
|
1704
1704
|
};
|
|
1705
1705
|
var BrowserProfileListInputSchema = {
|
|
1706
1706
|
email: import_zod.z.string().optional().describe("Optional Chrome account email or displayed profile name to filter for, for example seo@example.com."),
|
|
1707
1707
|
user_data_dir: import_zod.z.string().optional().describe("Optional Chrome user data directory. Defaults to the current OS Chrome profile root.")
|
|
1708
1708
|
};
|
|
1709
1709
|
var BrowserProfileOnboardInputSchema = {
|
|
1710
|
-
email: import_zod.z.string().optional().describe("Optional
|
|
1711
|
-
profile: import_zod.z.string().optional().describe("Optional
|
|
1712
|
-
user_data_dir: import_zod.z.string().optional().describe("Optional Chrome
|
|
1713
|
-
url: import_zod.z.string().url().optional().describe("Setup URL to open after creating the browser. Defaults to https://
|
|
1710
|
+
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."),
|
|
1711
|
+
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."),
|
|
1712
|
+
user_data_dir: import_zod.z.string().optional().describe("Optional Chrome metadata directory for deriving a profile name only. This is not a local browser setup path."),
|
|
1713
|
+
url: import_zod.z.string().url().optional().describe("Setup URL to open after creating the direct no-proxy browser. Defaults to https://google.com/ so the user can click Sign in."),
|
|
1714
1714
|
label: import_zod.z.string().optional().describe("Optional human label for this setup session."),
|
|
1715
|
-
timeout_seconds: import_zod.z.number().int().min(60).max(259200).optional().describe("How long the setup session may live before auto-termination. Defaults to 600.")
|
|
1715
|
+
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.")
|
|
1716
1716
|
};
|
|
1717
1717
|
var BrowserProfileImportInputSchema = {
|
|
1718
1718
|
email: import_zod.z.string().optional().describe("Optional Chrome account email or displayed profile name to select from Chrome Local State."),
|
|
@@ -1823,7 +1823,7 @@ var BrowserListInputSchema = {
|
|
|
1823
1823
|
include_closed: import_zod.z.boolean().default(false).describe("Include closed sessions in the list.")
|
|
1824
1824
|
};
|
|
1825
1825
|
var BrowserCaptureFanoutInputSchema = {
|
|
1826
|
-
session_id: import_zod.z.string().describe("The session id returned by browser_open or browser_list_sessions. The session must be
|
|
1826
|
+
session_id: import_zod.z.string().describe("The session id returned by browser_open or browser_list_sessions. The session must be on chatgpt.com or claude.ai and logged in through a saved hosted profile. Use only a returned session_id; do not construct one yourself."),
|
|
1827
1827
|
prompt: import_zod.z.string().optional().describe("Optional prompt to type into the chat composer and submit before capturing. Omit to passively capture the fan-out of a prompt the user just ran in the visible browser. The prompt must trigger web search for there to be a fan-out."),
|
|
1828
1828
|
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."),
|
|
1829
1829
|
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."),
|
|
@@ -2434,11 +2434,11 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2434
2434
|
server2.registerTool(
|
|
2435
2435
|
"browser_profile_list",
|
|
2436
2436
|
{
|
|
2437
|
-
title: "List Local Chrome Profiles",
|
|
2438
|
-
description: "List local Chrome profile metadata visible to this MCP server: account email, Chrome profile directory, local path, and a suggested managed browser profile name. This reads Chrome Local State only; it does not read cookies, passwords, browsing history, or copy local browser state.
|
|
2437
|
+
title: "Developer: List Local Chrome Profiles",
|
|
2438
|
+
description: "Developer/local-machine helper only. List local Chrome profile metadata visible to this MCP server: account email, Chrome profile directory, local path, and a suggested managed browser profile name. This reads Chrome Local State only; it does not read cookies, passwords, browsing history, or copy local browser state. Do not use this for customer AI visibility setup or reconnects; use browser_profile_onboard at Google and provide the hosted watch_url instead.",
|
|
2439
2439
|
inputSchema: BrowserProfileListInputSchema,
|
|
2440
2440
|
outputSchema: BrowserProfileListOutputSchema,
|
|
2441
|
-
annotations: annotations("List Local Chrome Profiles", true)
|
|
2441
|
+
annotations: annotations("Developer: List Local Chrome Profiles", true)
|
|
2442
2442
|
},
|
|
2443
2443
|
async (input) => {
|
|
2444
2444
|
try {
|
|
@@ -2449,7 +2449,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2449
2449
|
session_id: null,
|
|
2450
2450
|
profiles,
|
|
2451
2451
|
count: profiles.length,
|
|
2452
|
-
hint: "
|
|
2452
|
+
hint: "For customer auth setup, use browser_profile_onboard so the user signs in through the hosted watch_url. Local import is only for developer/local-machine mode."
|
|
2453
2453
|
});
|
|
2454
2454
|
} catch (err) {
|
|
2455
2455
|
return errorResult("browser_profile_list", { error: err instanceof Error ? err.message : String(err) });
|
|
@@ -2459,11 +2459,11 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2459
2459
|
server2.registerTool(
|
|
2460
2460
|
"browser_profile_import",
|
|
2461
2461
|
{
|
|
2462
|
-
title: "Import Local Chrome Profile",
|
|
2463
|
-
description: "Clone one local Chrome profile into MCP Scraper managed storage for local browser mode. This copies browser state files such as cookies, history, local storage, session storage, and password database metadata into ~/.mcp-scraper/browser-profiles by default; it skips cache and lock files and never prints cookie or password values.
|
|
2462
|
+
title: "Developer: Import Local Chrome Profile",
|
|
2463
|
+
description: "Developer/local-machine helper only. Clone one local Chrome profile into MCP Scraper managed storage for local browser mode. This copies browser state files such as cookies, history, local storage, session storage, and password database metadata into ~/.mcp-scraper/browser-profiles by default; it skips cache and lock files and never prints cookie or password values. Do not use this for customer AI visibility setup or reconnects; use browser_profile_onboard at Google and provide the hosted watch_url instead.",
|
|
2464
2464
|
inputSchema: BrowserProfileImportInputSchema,
|
|
2465
2465
|
outputSchema: BrowserProfileImportOutputSchema,
|
|
2466
|
-
annotations: { title: "Import Local Chrome Profile", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }
|
|
2466
|
+
annotations: { title: "Developer: Import Local Chrome Profile", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }
|
|
2467
2467
|
},
|
|
2468
2468
|
async (input) => {
|
|
2469
2469
|
try {
|
|
@@ -2488,7 +2488,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2488
2488
|
"Restart the MCP client so it starts the local browser mode process.",
|
|
2489
2489
|
"Call browser_open with the same MCP server; it will open a local Chrome window using the cloned profile."
|
|
2490
2490
|
],
|
|
2491
|
-
hint: "
|
|
2491
|
+
hint: "Developer-only local clone. For customer auth setup, use browser_profile_onboard at Google, provide the hosted watch_url, then browser_close to save the hosted profile."
|
|
2492
2492
|
});
|
|
2493
2493
|
} catch (err) {
|
|
2494
2494
|
return errorResult("browser_profile_import", { error: err instanceof Error ? err.message : String(err) });
|
|
@@ -2498,11 +2498,11 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2498
2498
|
server2.registerTool(
|
|
2499
2499
|
"browser_profile_sync",
|
|
2500
2500
|
{
|
|
2501
|
-
title: "Sync Local Chrome Profile",
|
|
2502
|
-
description: "Refresh an existing MCP Scraper managed local browser profile from the source Chrome profile recorded in its manifest. This overwrites the managed clone, copies browser state files again, skips cache and lock files, and never prints cookie or password values.",
|
|
2501
|
+
title: "Developer: Sync Local Chrome Profile",
|
|
2502
|
+
description: "Developer/local-machine helper only. Refresh an existing MCP Scraper managed local browser profile from the source Chrome profile recorded in its manifest. This overwrites the managed clone, copies browser state files again, skips cache and lock files, and never prints cookie or password values. Do not use this for customer AI visibility setup or reconnects; use browser_profile_onboard at Google and provide the hosted watch_url instead.",
|
|
2503
2503
|
inputSchema: BrowserProfileSyncInputSchema,
|
|
2504
2504
|
outputSchema: BrowserProfileSyncOutputSchema,
|
|
2505
|
-
annotations: { title: "Sync Local Chrome Profile", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }
|
|
2505
|
+
annotations: { title: "Developer: Sync Local Chrome Profile", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }
|
|
2506
2506
|
},
|
|
2507
2507
|
async (input) => {
|
|
2508
2508
|
try {
|
|
@@ -2516,7 +2516,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2516
2516
|
session_id: null,
|
|
2517
2517
|
profile: result.profile,
|
|
2518
2518
|
source_profile: result.sourceProfile,
|
|
2519
|
-
hint: `
|
|
2519
|
+
hint: `Developer-only local clone refreshed for ${result.profile.name}. Customer reconnects should use browser_profile_onboard with the same hosted profile name.`
|
|
2520
2520
|
});
|
|
2521
2521
|
} catch (err) {
|
|
2522
2522
|
return errorResult("browser_profile_sync", { error: err instanceof Error ? err.message : String(err) });
|
|
@@ -2526,11 +2526,11 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2526
2526
|
server2.registerTool(
|
|
2527
2527
|
"browser_profile_onboard",
|
|
2528
2528
|
{
|
|
2529
|
-
title: "
|
|
2530
|
-
description: "Create or load a saved hosted
|
|
2529
|
+
title: "Connect Hosted Browser Profile",
|
|
2530
|
+
description: "Create or load a saved MCP Scraper hosted browser profile and open a direct no-proxy setup browser with profile saving enabled. This is the customer auth setup and reconnect flow: open Google, give the user the watch_url, have them click Sign in and complete login, then call browser_close to save cookies and local storage. If a saved profile later shows login controls, run this same setup flow again. Do not use local Chrome import for this customer setup.",
|
|
2531
2531
|
inputSchema: BrowserProfileOnboardInputSchema,
|
|
2532
2532
|
outputSchema: BrowserProfileOnboardOutputSchema,
|
|
2533
|
-
annotations: annotations("
|
|
2533
|
+
annotations: annotations("Connect Hosted Browser Profile")
|
|
2534
2534
|
},
|
|
2535
2535
|
async (input) => {
|
|
2536
2536
|
let chromeProfile = null;
|
|
@@ -2547,11 +2547,12 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2547
2547
|
error: "profile is required when no email match or BROWSER_AGENT_PROFILE_NAME is available"
|
|
2548
2548
|
});
|
|
2549
2549
|
}
|
|
2550
|
-
const setupUrl = input.url ?? "https://
|
|
2550
|
+
const setupUrl = input.url ?? "https://google.com/";
|
|
2551
2551
|
const open = await req("POST", "/agent/sessions", {
|
|
2552
2552
|
label: input.label ?? `Profile setup: ${profile}`,
|
|
2553
2553
|
profile,
|
|
2554
2554
|
save_profile_changes: true,
|
|
2555
|
+
disable_default_proxy: true,
|
|
2555
2556
|
timeout_seconds: input.timeout_seconds
|
|
2556
2557
|
});
|
|
2557
2558
|
if (!open.ok) return errorResult("browser_profile_onboard", open.data);
|
|
@@ -2568,8 +2569,9 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2568
2569
|
setup_url: setupUrl,
|
|
2569
2570
|
chrome_profile: chromeProfile,
|
|
2570
2571
|
next_steps: [
|
|
2571
|
-
"Open the watch_url and
|
|
2572
|
-
"After login is complete, call browser_close with this session_id to persist cookies and local storage to the
|
|
2572
|
+
"Open the watch_url and let the user click Sign in on Google.",
|
|
2573
|
+
"After the user confirms login is complete, call browser_close with this session_id to persist cookies and local storage to the saved profile.",
|
|
2574
|
+
"If the saved profile later shows login controls or disconnects, repeat browser_profile_onboard and close the setup session again.",
|
|
2573
2575
|
"Use BROWSER_AGENT_PROFILE_NAME or browser_open.profile with this profile name for future authenticated sessions."
|
|
2574
2576
|
],
|
|
2575
2577
|
raw: session
|
|
@@ -2580,7 +2582,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2580
2582
|
"browser_open",
|
|
2581
2583
|
{
|
|
2582
2584
|
title: "Open Browser Session",
|
|
2583
|
-
description: "Open a browser you can drive.
|
|
2585
|
+
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 so the user signs in through a watch_url, then call browser_close to save the profile. Returns a session_id used by all other browser_* tools.",
|
|
2584
2586
|
inputSchema: BrowserOpenInputSchema,
|
|
2585
2587
|
outputSchema: BrowserOpenOutputSchema,
|
|
2586
2588
|
annotations: annotations("Open Browser Session")
|
|
@@ -2609,6 +2611,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
2609
2611
|
label: input.label,
|
|
2610
2612
|
...profile ? { profile } : {},
|
|
2611
2613
|
...profile && typeof saveProfileChanges === "boolean" ? { save_profile_changes: saveProfileChanges } : {},
|
|
2614
|
+
disable_default_proxy: true,
|
|
2612
2615
|
timeout_seconds: input.timeout_seconds
|
|
2613
2616
|
});
|
|
2614
2617
|
if (!open.ok) return errorResult("browser_open", open.data);
|
|
@@ -3146,7 +3149,7 @@ function registerBrowserAgentMcpTools(server2, opts) {
|
|
|
3146
3149
|
"browser_capture_fanout",
|
|
3147
3150
|
{
|
|
3148
3151
|
title: "Capture AI Search Fan-Out",
|
|
3149
|
-
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
|
|
3152
|
+
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 click Sign in on Google, then call browser_close after they confirm login. 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.`,
|
|
3150
3153
|
inputSchema: BrowserCaptureFanoutInputSchema,
|
|
3151
3154
|
outputSchema: BrowserCaptureFanoutOutputSchema,
|
|
3152
3155
|
annotations: annotations("Capture AI Search Fan-Out")
|
|
@@ -6325,14 +6328,14 @@ function renderInstallTerminal(options) {
|
|
|
6325
6328
|
colorize(ascii, "amber", color),
|
|
6326
6329
|
`${colorize("MCP Scraper Agent", "cyan", color)} . v${options.version} . mcpscraper.dev`,
|
|
6327
6330
|
"1/1 install surfaces ready",
|
|
6328
|
-
colorize("Newest:
|
|
6331
|
+
colorize("Newest: saved hosted browser profiles for AI visibility. Open Google, share the watch_url, user signs in, close to save. Browser sessions are direct/no-proxy by default.", "lime", color),
|
|
6329
6332
|
"",
|
|
6330
6333
|
`${colorize("Tools", "cyan", color)} ${colorize("(46 MCP tools)", "muted", color)}`,
|
|
6331
6334
|
toolRow("search", ["harvest_paa", "search_serp", "maps_search", "maps_place_intel"], color),
|
|
6332
6335
|
toolRow("extract", ["extract_url", "map_site_urls", "extract_site", "directory_workflow"], color),
|
|
6333
6336
|
toolRow("build", ["rank_tracker_blueprint", "cron plan", "database prompt"], color),
|
|
6334
6337
|
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),
|
|
6335
|
-
toolRow("browser", ["browser_open", "
|
|
6338
|
+
toolRow("browser", ["browser_open", "browser_profile_onboard", "browser_close", "browser_screenshot", "browser_read", "browser_locate", "browser_replay_mark", "browser_replay_annotate"], color),
|
|
6336
6339
|
toolRow("account", ["credits_info", "local reports", "MCP resources"], color),
|
|
6337
6340
|
`${colorize("Workflows", "cyan", color)} ${colorize("(MCP + CLI + API)", "muted", color)}`,
|
|
6338
6341
|
toolRow("route", ["workflow_list", "workflow_suggest", "workflow_run", "workflow_step", "workflow_status", "workflow_artifact_read"], color),
|
|
@@ -6342,8 +6345,8 @@ function renderInstallTerminal(options) {
|
|
|
6342
6345
|
"Run mcp-scraper-install for this visible card. Run mcp-scraper-cli for setup utilities and subcommands.",
|
|
6343
6346
|
"Run mcp-scraper-combined in a human terminal to print this card; MCP clients get the same command as a silent stdio server.",
|
|
6344
6347
|
"Explicit card command: npx -y -p mcp-scraper@latest mcp-scraper-install",
|
|
6345
|
-
"
|
|
6346
|
-
"
|
|
6348
|
+
"Customer auth setup: run browser_profile_onboard at https://google.com/, send the watch_url, let the user click Sign in, then browser_close to save.",
|
|
6349
|
+
"Reconnect setup: if a saved profile shows login controls later, run browser_profile_onboard again with the same profile name.",
|
|
6347
6350
|
"Start with workflow_suggest for broad jobs like market analysis, ICP research, CRO audits, brand briefs, content gaps, and AI visibility.",
|
|
6348
6351
|
"For MCP clients, use mcp-scraper-combined so one install can mix SERP, Maps, browser, reports, and saved MCP resources.",
|
|
6349
6352
|
"If you hit the concurrency limit, add an extra slot for $5/month with mcp-scraper-cli billing concurrency checkout.",
|
|
@@ -6353,9 +6356,9 @@ function renderInstallTerminal(options) {
|
|
|
6353
6356
|
colorize("Setup doctor", "amber", color),
|
|
6354
6357
|
"npx -y -p mcp-scraper@latest mcp-scraper-cli doctor",
|
|
6355
6358
|
"",
|
|
6356
|
-
colorize("
|
|
6357
|
-
|
|
6358
|
-
"
|
|
6359
|
+
colorize("Hosted profile setup", "amber", color),
|
|
6360
|
+
'In your MCP client, call browser_profile_onboard with profile="seo-example-com" and url="https://google.com/".',
|
|
6361
|
+
"Give the returned watch_url to the user. After they sign in, call browser_close to persist the saved hosted profile.",
|
|
6359
6362
|
"",
|
|
6360
6363
|
colorize("Claude Code one-command setup", "amber", color),
|
|
6361
6364
|
claudeCommand,
|