mcp-scraper 0.1.9 → 0.2.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../bin/mcp-stdio-server.ts","../../src/harvest-timeout.ts","../../src/mcp/http-mcp-tool-executor.ts","../../src/mcp/paa-mcp-server.ts","../../src/version.ts","../../src/mcp/mcp-response-formatter.ts","../../src/errors.ts","../../src/mcp/mcp-tool-schemas.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { HttpMcpToolExecutor } from '../src/mcp/http-mcp-tool-executor.js'\nimport { buildPaaExtractorMcpServer } from '../src/mcp/paa-mcp-server.js'\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.MCP_SCRAPER_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.mcp-scraper-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {}\n }\n return undefined\n}\n\nconst apiKey = (\n process.env.MCP_SCRAPER_API_KEY ??\n process.env.MCP_SCRAPER_KEY ??\n process.env.MCP_API_KEY ??\n readApiKeyFile()\n)?.trim()\nif (!apiKey) {\n process.stderr.write('MCP_SCRAPER_API_KEY env var or ~/.mcp-scraper-key is required\\n')\n process.exit(1)\n}\n\nconst baseUrl = process.env.MCP_SCRAPER_BASE_URL?.trim() ?? process.env.MCP_BASE_URL?.trim() ?? 'https://mcpscraper.dev'\nconst executor = new HttpMcpToolExecutor(baseUrl, apiKey)\nconst server = buildPaaExtractorMcpServer(executor)\nconst transport = new StdioServerTransport()\n\nasync function main() {\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n process.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n","export const VERCEL_FUNCTION_MAX_MS = 300_000\n\nexport const CLIENT_OVER_SERVER_MARGIN_MS = 15_000\n\nexport interface HarvestTimeoutBudget {\n serverMs: number\n clientMs: number\n}\n\nexport function harvestTimeoutBudget(maxQuestions: number, serpOnly = false): HarvestTimeoutBudget {\n const requested = Number.isFinite(maxQuestions) && maxQuestions > 0 ? Math.trunc(maxQuestions) : 30\n let serverMs: number\n if (serpOnly || requested <= 50) serverMs = 110_000\n else if (requested <= 100) serverMs = 180_000\n else if (requested <= 150) serverMs = 240_000\n else serverMs = 280_000\n const clientMs = Math.min(serverMs + CLIENT_OVER_SERVER_MARGIN_MS, VERCEL_FUNCTION_MAX_MS - 5_000)\n return { serverMs, clientMs }\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { IMcpToolExecutor, ISerpIntelligenceToolExecutor } from './IMcpToolExecutor.js'\nimport { harvestTimeoutBudget } from '../harvest-timeout.js'\nimport type {\n HarvestPaaInput,\n SearchSerpInput,\n ExtractUrlInput,\n MapSiteUrlsInput,\n ExtractSiteInput,\n YoutubeHarvestInput,\n YoutubeTranscribeInput,\n FacebookPageIntelInput,\n FacebookAdSearchInput,\n FacebookAdTranscribeInput,\n MapsPlaceIntelInput,\n MapsSearchInput,\n CreditsInfoInput,\n CaptureSerpSnapshotInput,\n CaptureSerpPageSnapshotsInput,\n} from './mcp-tool-schemas.js'\n\nexport class HttpMcpToolExecutor implements IMcpToolExecutor, ISerpIntelligenceToolExecutor {\n private readonly baseUrl: string\n private readonly apiKey: string\n private readonly timeoutMs: number\n private readonly httpTimeoutOverrideMs: number | null\n private readonly serpIntelligenceTimeoutMs: number\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n this.apiKey = apiKey\n const rawOverride = process.env.MCP_SCRAPER_HTTP_TIMEOUT_MS\n const parsedOverride = rawOverride === undefined ? NaN : Number(rawOverride)\n this.httpTimeoutOverrideMs = Number.isFinite(parsedOverride) && parsedOverride > 0 ? parsedOverride : null\n this.timeoutMs = this.httpTimeoutOverrideMs ?? 110_000\n const configuredSerpIntelligenceTimeoutMs = Number(process.env.MCP_SCRAPER_SERP_INTELLIGENCE_HTTP_TIMEOUT_MS ?? this.timeoutMs)\n this.serpIntelligenceTimeoutMs = Number.isFinite(configuredSerpIntelligenceTimeoutMs) && configuredSerpIntelligenceTimeoutMs > 0\n ? configuredSerpIntelligenceTimeoutMs\n : this.timeoutMs\n }\n\n private async call(path: string, body: Record<string, unknown>, timeoutMs = this.timeoutMs): Promise<CallToolResult> {\n try {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n })\n const data = await res.json()\n if (!res.ok) {\n return { content: [{ type: 'text', text: JSON.stringify(data) }], isError: true }\n }\n return { content: [{ type: 'text', text: JSON.stringify(data) }] }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (err instanceof DOMException && err.name === 'TimeoutError') {\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n error: 'mcp_request_timeout',\n error_type: 'timeout',\n retryable: true,\n path,\n timeoutMs,\n message: `MCP Scraper request exceeded ${Math.round(timeoutMs / 1000)}s and was cancelled. Retry with fewer results or use the async API for deep harvests.`,\n }),\n }],\n isError: true,\n }\n }\n return { content: [{ type: 'text', text: msg }], isError: true }\n }\n }\n\n harvestPaa(input: HarvestPaaInput): Promise<CallToolResult> {\n const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(input.maxQuestions ?? 30).clientMs\n return this.call('/harvest/sync', input as Record<string, unknown>, timeoutMs)\n }\n\n searchSerp(input: SearchSerpInput): Promise<CallToolResult> {\n const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(0, true).clientMs\n return this.call('/harvest/sync', { ...input, serpOnly: true } as Record<string, unknown>, timeoutMs)\n }\n\n extractUrl(input: ExtractUrlInput): Promise<CallToolResult> {\n return this.call('/extract-url', input as Record<string, unknown>)\n }\n\n mapSiteUrls(input: MapSiteUrlsInput): Promise<CallToolResult> {\n return this.call('/map-urls', input as Record<string, unknown>)\n }\n\n extractSite(input: ExtractSiteInput): Promise<CallToolResult> {\n return this.call('/extract-site', input as Record<string, unknown>)\n }\n\n youtubeHarvest(input: YoutubeHarvestInput): Promise<CallToolResult> {\n return this.call('/youtube/harvest', input as Record<string, unknown>)\n }\n\n youtubeTranscribe(input: YoutubeTranscribeInput): Promise<CallToolResult> {\n return this.call('/youtube/transcribe', input as Record<string, unknown>)\n }\n\n facebookPageIntel(input: FacebookPageIntelInput): Promise<CallToolResult> {\n return this.call('/facebook/page-intel', input as Record<string, unknown>)\n }\n\n facebookAdSearch(input: FacebookAdSearchInput): Promise<CallToolResult> {\n return this.call('/facebook/search', input as Record<string, unknown>)\n }\n\n facebookAdTranscribe(input: FacebookAdTranscribeInput): Promise<CallToolResult> {\n return this.call('/facebook/transcribe', input as Record<string, unknown>)\n }\n\n mapsPlaceIntel(input: MapsPlaceIntelInput): Promise<CallToolResult> {\n return this.call('/maps/place', input as Record<string, unknown>)\n }\n\n mapsSearch(input: MapsSearchInput): Promise<CallToolResult> {\n return this.call('/maps/search', input as Record<string, unknown>)\n }\n\n creditsInfo(input: CreditsInfoInput): Promise<CallToolResult> {\n return this.call('/billing/credits', input as Record<string, unknown>)\n }\n\n captureSerpSnapshot(input: CaptureSerpSnapshotInput): Promise<CallToolResult> {\n return this.call('/serp-intelligence/capture', input as Record<string, unknown>, this.serpIntelligenceTimeoutMs)\n }\n\n captureSerpPageSnapshots(input: CaptureSerpPageSnapshotsInput): Promise<CallToolResult> {\n return this.call('/serp-intelligence/page-snapshots', input as Record<string, unknown>, this.serpIntelligenceTimeoutMs)\n }\n\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join } from 'node:path'\nimport type { IMcpToolExecutor } from './IMcpToolExecutor.js'\nimport { PACKAGE_VERSION } from '../version.js'\nimport { outputBaseDir } from './mcp-response-formatter.js'\nimport {\n HarvestPaaInputSchema,\n SearchSerpInputSchema,\n ExtractUrlInputSchema,\n HarvestPaaOutputSchema,\n SearchSerpOutputSchema,\n ExtractUrlOutputSchema,\n ExtractSiteOutputSchema,\n MapsPlaceIntelOutputSchema,\n CreditsInfoOutputSchema,\n MapSiteUrlsInputSchema,\n MapSiteUrlsOutputSchema,\n ExtractSiteInputSchema,\n YoutubeHarvestInputSchema,\n YoutubeHarvestOutputSchema,\n YoutubeTranscribeInputSchema,\n FacebookPageIntelInputSchema,\n FacebookPageIntelOutputSchema,\n FacebookAdSearchInputSchema,\n FacebookAdSearchOutputSchema,\n FacebookAdTranscribeInputSchema,\n MapsPlaceIntelInputSchema,\n MapsSearchInputSchema,\n MapsSearchOutputSchema,\n CreditsInfoInputSchema,\n} from './mcp-tool-schemas.js'\nimport {\n formatHarvestPaa,\n formatSearchSerp,\n formatExtractUrl,\n formatMapSiteUrls,\n formatExtractSite,\n formatYoutubeHarvest,\n formatYoutubeTranscribe,\n formatFacebookPageIntel,\n formatFacebookAdSearch,\n formatFacebookAdTranscribe,\n formatMapsPlaceIntel,\n formatMapsSearch,\n formatCreditsInfo,\n} from './mcp-response-formatter.js'\n\nexport interface BuildMcpServerOptions {\n savesReportsLocally?: boolean\n}\n\nexport function liveWebToolAnnotations(title: string) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n }\n}\n\nfunction listSavedReports(): Array<{ filename: string; mtimeMs: number }> {\n try {\n const dir = outputBaseDir()\n return readdirSync(dir)\n .filter(f => f.endsWith('.md'))\n .map(f => ({ filename: f, mtimeMs: statSync(join(dir, f)).mtimeMs }))\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, 100)\n } catch {\n return []\n }\n}\n\nfunction registerSavedReportResources(server: McpServer): void {\n server.registerResource(\n 'saved-report',\n new ResourceTemplate('report://{filename}', {\n list: () => ({\n resources: listSavedReports().map(r => ({\n uri: `report://${encodeURIComponent(r.filename)}`,\n name: r.filename,\n mimeType: 'text/markdown',\n })),\n }),\n }),\n {\n title: 'Saved MCP Scraper Reports',\n description: 'Markdown research reports saved by previous MCP Scraper tool calls. Read a report to reuse prior research without re-scraping or spending credits.',\n mimeType: 'text/markdown',\n },\n async (uri, variables) => {\n const requested = Array.isArray(variables.filename) ? variables.filename[0] : variables.filename\n const filename = basename(decodeURIComponent(String(requested ?? '')))\n if (!filename.endsWith('.md')) throw new Error('Only saved .md reports can be read')\n const text = readFileSync(join(outputBaseDir(), filename), 'utf8')\n return { contents: [{ uri: uri.href, mimeType: 'text/markdown', text }] }\n },\n )\n}\n\nexport function buildPaaExtractorMcpServer(\n executor: IMcpToolExecutor,\n options: BuildMcpServerOptions = {},\n): McpServer {\n const savesReports = options.savesReportsLocally !== false\n const reportNote = savesReports\n ? ' Saves a full Markdown report locally.'\n : ' Reports are returned inline; no files are saved on this hosted endpoint.'\n const withReportNote = (description: string) => `${description}${reportNote}`\n\n const server = new McpServer({ name: 'mcp-scraper', version: PACKAGE_VERSION })\n\n if (savesReports) registerSavedReportResources(server)\n\n server.registerTool('harvest_paa', {\n title: 'Google PAA + SERP Harvest',\n description: withReportNote('Best default tool for Google search research. Extracts People Also Ask questions plus answers/source URLs, organic SERP, local pack when present, entity IDs (CID/GCID/KG MID), and AI Overview. Infer the user language: split topic from location (e.g. \"best hvac company in Denver CO\" => query \"best hvac company\", location \"Denver, CO\", gl \"us\", hl \"en\"). Use maxQuestions 30 normally, 100-200 for \"full\", \"deep\", \"all\", or comprehensive research. Deep harvests above 100 questions can run for several minutes with no interim progress — warn the user before starting one and keep maxQuestions at or below 100 unless they explicitly want a deep harvest. Credits are charged by extracted question; unused request hold is refunded.'),\n inputSchema: HarvestPaaInputSchema,\n outputSchema: HarvestPaaOutputSchema,\n annotations: liveWebToolAnnotations('Google PAA + SERP Harvest'),\n }, async (input) => formatHarvestPaa(await executor.harvestPaa(input), input))\n\n server.registerTool('search_serp', {\n title: 'Google SERP Lookup',\n description: withReportNote('Fast Google SERP lookup without PAA expansion. Use when the user asks for rankings, organic results, local pack, quick SERP, or positions. Split topic from location and infer gl/hl from the user request.'),\n inputSchema: SearchSerpInputSchema,\n outputSchema: SearchSerpOutputSchema,\n annotations: liveWebToolAnnotations('Google SERP Lookup'),\n }, async (input) => formatSearchSerp(await executor.searchSerp(input), input))\n\n server.registerTool('extract_url', {\n title: 'Single URL Extract',\n description: withReportNote('Extract structured data from one public URL: page content as Markdown, heading structure, JSON-LD schema, entity details, NAP score, metadata, and missing schema fields. Use when the user provides a single URL or asks to inspect/scrape one page.'),\n inputSchema: ExtractUrlInputSchema,\n outputSchema: ExtractUrlOutputSchema,\n annotations: liveWebToolAnnotations('Single URL Extract'),\n }, async (input) => formatExtractUrl(await executor.extractUrl(input), input))\n\n server.registerTool('map_site_urls', {\n title: 'Site URL Map',\n description: withReportNote('Map/crawl a public website to build a URL inventory with HTTP status codes, broken links, redirects, and site scope. Use before extract_site for audits or when the user asks for a sitemap/URL inventory.'),\n inputSchema: MapSiteUrlsInputSchema,\n outputSchema: MapSiteUrlsOutputSchema,\n annotations: liveWebToolAnnotations('Site URL Map'),\n }, async (input) => formatMapSiteUrls(await executor.mapSiteUrls(input), input))\n\n server.registerTool('extract_site', {\n title: 'Multi-Page Site Extract',\n description: withReportNote('Run multi-page extraction across a public website. Returns per-page titles, H1s, metadata, headings, schema/entity data, canonical URLs, and content. Use for website audits, competitor audits, and full-site extraction.'),\n inputSchema: ExtractSiteInputSchema,\n outputSchema: ExtractSiteOutputSchema,\n annotations: liveWebToolAnnotations('Multi-Page Site Extract'),\n }, async (input) => formatExtractSite(await executor.extractSite(input), input))\n\n server.registerTool('youtube_harvest', {\n title: 'YouTube Video Harvest',\n description: withReportNote('Harvest YouTube video metadata by search query or channel handle/ID/URL. Use mode \"search\" for keyword/topic requests and mode \"channel\" for @handles, channel IDs, or channel URLs. Returns titles, views, dates, durations, URLs, thumbnails, and videoIds for follow-up transcription.'),\n inputSchema: YoutubeHarvestInputSchema,\n outputSchema: YoutubeHarvestOutputSchema,\n annotations: liveWebToolAnnotations('YouTube Video Harvest'),\n }, async (input) => formatYoutubeHarvest(await executor.youtubeHarvest(input), input))\n\n server.registerTool('youtube_transcribe', {\n title: 'YouTube Transcription',\n description: withReportNote('Fetch and transcribe captions from a YouTube video. Returns full transcript, timestamped chunks, and word count. Pass a videoId from youtube_harvest results or infer it from a YouTube URL if the user provided one.'),\n inputSchema: YoutubeTranscribeInputSchema,\n annotations: liveWebToolAnnotations('YouTube Transcription'),\n }, async (input) => formatYoutubeTranscribe(await executor.youtubeTranscribe(input), input))\n\n server.registerTool('facebook_page_intel', {\n title: 'Facebook Advertiser Ad Intel',\n description: withReportNote('Harvest ads from a Facebook advertiser. Returns ad copy, headlines, CTAs, creative type, status, landing URLs, and video URLs ready for transcription. Accepts pageId, libraryId, or a brand/advertiser name as query. Use after facebook_ad_search when possible.'),\n inputSchema: FacebookPageIntelInputSchema,\n outputSchema: FacebookPageIntelOutputSchema,\n annotations: liveWebToolAnnotations('Facebook Advertiser Ad Intel'),\n }, async (input) => formatFacebookPageIntel(await executor.facebookPageIntel(input), input))\n\n server.registerTool('facebook_ad_search', {\n title: 'Facebook Ad Library Search',\n description: withReportNote('Search Facebook Ad Library by brand, advertiser, competitor, niche, or keyword. Returns advertisers with ad counts and library IDs. Use to discover competitors, then pass libraryId to facebook_page_intel.'),\n inputSchema: FacebookAdSearchInputSchema,\n outputSchema: FacebookAdSearchOutputSchema,\n annotations: liveWebToolAnnotations('Facebook Ad Library Search'),\n }, async (input) => formatFacebookAdSearch(await executor.facebookAdSearch(input), input))\n\n server.registerTool('facebook_ad_transcribe', {\n title: 'Facebook Ad Transcription',\n description: 'Transcribe audio from a Facebook ad video. Returns full transcript and timestamped chunks. Use the videoUrl value from facebook_page_intel results.',\n inputSchema: FacebookAdTranscribeInputSchema,\n annotations: liveWebToolAnnotations('Facebook Ad Transcription'),\n }, async (input) => formatFacebookAdTranscribe(await executor.facebookAdTranscribe(input), input))\n\n server.registerTool('maps_place_intel', {\n title: 'Google Maps Business Profile Details',\n description: withReportNote('Extract Google Maps business intelligence for one known/named business: rating, review count, category, address, phone, website, hours, booking URL, review histogram, review topics, about attributes, entity IDs, and optional review cards. Do not use this for category searches, local market prospect lists, or requests for multiple GMB/GBP profiles; use maps_search first for those. Split business name from location (e.g. \"Elite Roofing Denver CO\" => businessName \"Elite Roofing\", location \"Denver, CO\"). Pass includeReviews true when the user asks for reviews/customer pain.'),\n inputSchema: MapsPlaceIntelInputSchema,\n outputSchema: MapsPlaceIntelOutputSchema,\n annotations: liveWebToolAnnotations('Google Maps Business Profile Details'),\n }, async (input) => formatMapsPlaceIntel(await executor.mapsPlaceIntel(input), input))\n\n server.registerTool('maps_search', {\n title: 'Google Maps Business Search',\n description: withReportNote('Search Google Maps for multiple businesses/profiles by category, niche, keyword, or local market. Use this when the user asks for several Google Business Profiles, GMBs, GBPs, leads, prospects, competitors, or \"more than the 3-pack.\" Returns up to 50 candidates with names, place URLs, CIDs when available, ratings, review counts, and profile metadata. Default maxResults is 10; maximum is 50. Use maps_place_intel afterward only when a selected business needs full details and reviews.'),\n inputSchema: MapsSearchInputSchema,\n outputSchema: MapsSearchOutputSchema,\n annotations: liveWebToolAnnotations('Google Maps Business Search'),\n }, async (input) => formatMapsSearch(await executor.mapsSearch(input), input))\n\n server.registerTool('credits_info', {\n title: 'MCP Scraper Credits & Costs',\n description: 'Answer questions about MCP Scraper credits: current credit balance, what a specific tool/action costs, the full cost table, and optionally recent credit ledger entries. Does not expose payment methods or credit card information.',\n inputSchema: CreditsInfoInputSchema,\n outputSchema: CreditsInfoOutputSchema,\n annotations: {\n title: 'MCP Scraper Credits & Costs',\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n }, async (input) => formatCreditsInfo(await executor.creditsInfo(input), input))\n\n return server\n}\n","export const PACKAGE_VERSION = '0.1.9'\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { sanitizeVendorName } from '../errors.js'\n\nlet reportSavingEnabled = true\n\nexport function configureReportSaving(enabled: boolean): void {\n reportSavingEnabled = enabled\n}\n\nfunction sanitizeVendorText(text: string): string {\n return sanitizeVendorName(\n text\n .replace(/kernel_session_id/gi, 'browser_session_id')\n .replace(/kernel_delete_succeeded/gi, 'session_cleanup_succeeded')\n .replace(/kernel_delete_started/gi, 'session_cleanup_started')\n .replace(/kernel_delete_error/gi, 'session_cleanup_error')\n .replace(/kernelSessionId/g, 'browserSessionId')\n .replace(/kernelProxyId/g, 'proxyId')\n .replace(/KERNEL_API_KEY/g, 'BROWSER_SERVICE_API_KEY')\n .replace(/\"kernel\"\\s*:/gi, '\"browserRuntime\":'),\n )\n}\n\nfunction slugifyReportName(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80) || 'mcp-scraper-report'\n}\n\nfunction reportTitle(full: string): string {\n const title = full.split('\\n').find(line => line.startsWith('# '))\n return title?.replace(/^#\\s+/, '').trim() || 'MCP Scraper Report'\n}\n\nexport function outputBaseDir(): string {\n return process.env.MCP_SCRAPER_OUTPUT_DIR?.trim() || join(homedir(), 'Downloads', 'mcp-scraper')\n}\n\nfunction saveFullReport(full: string): string | null {\n if (!reportSavingEnabled || process.env.MCP_SCRAPER_SAVE_REPORTS === 'false') return null\n const outDir = outputBaseDir()\n try {\n mkdirSync(outDir, { recursive: true })\n const stamp = new Date().toISOString().replace(/[:.]/g, '-')\n const file = join(outDir, `${stamp}-${slugifyReportName(reportTitle(full))}.md`)\n writeFileSync(file, full, 'utf8')\n return file\n } catch {\n return null\n }\n}\n\nfunction persistScreenshotLocally(base64: string, url: string): string | null {\n if (!reportSavingEnabled || process.env.MCP_SCRAPER_SAVE_REPORTS === 'false') return null\n try {\n const dir = join(outputBaseDir(), 'screenshots')\n mkdirSync(dir, { recursive: true })\n const stamp = new Date().toISOString().replace(/[:.]/g, '-')\n const slug = url.replace(/^https?:\\/\\//, '').replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '').slice(0, 60)\n const filePath = join(dir, `${stamp}-${slug}.png`)\n writeFileSync(filePath, Buffer.from(base64, 'base64'))\n return filePath\n } catch {\n return null\n }\n}\n\nfunction oneBlock(content: string): CallToolResult {\n const filePath = saveFullReport(content)\n const text = filePath ? `${content}\\n\\n📄 Saved: \\`${filePath}\\`` : content\n return { content: [{ type: 'text', text }] }\n}\n\nexport function passthrough(raw: CallToolResult): CallToolResult {\n return raw\n}\n\nfunction checkInsufficientBalance(raw: CallToolResult): CallToolResult | null {\n const first = raw.content.find(b => b.type === 'text')\n const text = first?.type === 'text' ? first.text : ''\n try {\n const body = JSON.parse(text || '{}') as Record<string, unknown>\n if (body.error === 'insufficient_balance') {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `Insufficient credits. Balance: ${body.balance_credits} credits. This call requires ${body.required_credits} credits. Top up at ${body.topup_url}`,\n }],\n }\n }\n } catch { }\n return null\n}\n\nfunction formatStructuredError(body: Record<string, unknown>, fallback: string): string {\n if (body.error === 'insufficient_balance') {\n return `Insufficient credits. Balance: ${body.balance_credits} credits. This call requires ${body.required_credits} credits. Top up at ${body.topup_url}`\n }\n if (body.error === 'mcp_request_timeout') {\n return typeof body.message === 'string' ? body.message : 'MCP Scraper request timed out and was cancelled.'\n }\n if (typeof body.error_code === 'string') {\n const message = typeof body.error === 'string'\n ? body.error\n : typeof body.message === 'string'\n ? body.message\n : fallback\n const retryable = body.retryable === true ? ' Retryable: yes.' : ''\n return `${body.error_code}: ${message}${retryable}${errorAttemptsSection(body)}`\n }\n if (typeof body.error === 'string') return body.error\n return fallback || 'Tool error'\n}\n\nfunction parseData(raw: CallToolResult): { data: Record<string, unknown> } | { error: string } {\n const first = raw.content.find(b => b.type === 'text')\n const text = first?.type === 'text' ? first.text : ''\n try {\n const parsed = JSON.parse(text || '{}') as Record<string, unknown>\n if (raw.isError || parsed.error || parsed.error_code) return { error: sanitizeVendorText(formatStructuredError(parsed, text)) }\n const data = (parsed.result as Record<string, unknown>) ?? parsed\n return { data }\n } catch {\n if (raw.isError) return { error: sanitizeVendorText(text || 'Tool error') }\n return { error: 'Failed to parse tool response' }\n }\n}\n\nfunction entityIdsSection(ids?: { kgIds?: string[]; cids?: string[]; gcids?: string[] }): string {\n if (!ids) return ''\n const lines: string[] = []\n if (ids.kgIds?.length) lines.push(`- **Knowledge Graph MID:** ${ids.kgIds.join(', ')}`)\n if (ids.cids?.length) lines.push(`- **CID:** ${ids.cids.join(', ')}`)\n if (ids.gcids?.length) lines.push(`- **GCID:** ${ids.gcids.join(', ')}`)\n return lines.length ? `\\n## Entity IDs\\n${lines.join('\\n')}` : ''\n}\n\nfunction truncate(s: string | null | undefined, max: number): string {\n if (!s) return ''\n return s.length > max ? s.slice(0, max) + '…' : s\n}\n\nexport function cell(s: string | null | undefined): string {\n return String(s ?? '')\n .replace(/\\r?\\n+/g, ' ')\n .replace(/\\|/g, '\\\\|')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\nfunction debugSection(debug: any): string {\n if (!debug || typeof debug !== 'object') return ''\n const request = debug.request ?? {}\n const browser = debug.browser ?? {}\n const kernel = browser.browserRuntime ?? browser.kernel ?? {}\n const network = browser.networkLocation ?? {}\n const nav = browser.serpNavigation ?? {}\n const proxyResolution = kernel.proxyResolution ?? {}\n const locationEvidence = debug.locationEvidence\n const candidates = Array.isArray(locationEvidence?.candidates)\n ? locationEvidence.candidates.slice(0, 4).map((c: any) => `${c.city}, ${c.regionCode} (${c.count})`).join(', ')\n : ''\n const lines = [\n '\\n## Debug',\n `- Proxy mode: ${request.proxyMode ?? kernel.proxyMode ?? 'unknown'} · requested proxy: ${kernel.requestedProxyIdPresent === true ? `yes (${kernel.requestedProxyIdSuffix ?? 'redacted'})` : 'no'}`,\n `- Proxy resolution: ${proxyResolution.source ?? 'unknown'}${proxyResolution.target ? ` · ${proxyResolution.target.level ?? 'city'} ${proxyResolution.target.city}, ${proxyResolution.target.state}` : ''}${proxyResolution.error ? ` · ${truncate(proxyResolution.error, 180)}` : ''}`,\n `- Browser session: ${kernel.sessionId ?? 'unknown'} · retrieved proxy: ${kernel.retrievedProxyIdPresent === true ? `yes (${kernel.retrievedProxyIdSuffix ?? 'redacted'})` : kernel.retrievedProxyIdPresent === false ? 'no' : 'unknown'}`,\n `- Browser IP geo: ${[network.ip, network.city, network.region, network.country].filter(Boolean).join(' · ') || network.error || 'unknown'}`,\n `- Google URL: ${truncate(nav.requestedUrl, 240) || 'unknown'}`,\n `- Final URL: ${truncate(nav.finalUrl, 240) || 'unknown'} · CAPTCHA: ${nav.captchaDetected === true ? 'yes' : nav.captchaDetected === false ? 'no' : 'unknown'} · redirected: ${nav.redirected === true ? 'yes' : nav.redirected === false ? 'no' : 'unknown'}`,\n ]\n if (locationEvidence) {\n lines.push(`- Location evidence: ${locationEvidence.status}${locationEvidence.expected ? ` · expected ${locationEvidence.expected.city}${locationEvidence.expected.regionCode ? `, ${locationEvidence.expected.regionCode}` : ''}` : ''}${candidates ? ` · candidates ${candidates}` : ''}`)\n }\n return sanitizeVendorText(lines.join('\\n'))\n}\n\nfunction errorAttemptsSection(body: Record<string, unknown>): string {\n const attempts = Array.isArray(body.attempts) ? body.attempts as Array<Record<string, any>> : []\n if (attempts.length === 0) return ''\n const lines = attempts.slice(0, 5).map((attempt) => {\n const debug = attempt.debug ?? {}\n const browser = debug.browser ?? {}\n const kernel = browser.browserRuntime ?? browser.kernel ?? {}\n const proxyResolution = kernel.proxyResolution ?? {}\n const network = browser.networkLocation ?? {}\n const nav = browser.serpNavigation ?? {}\n const geo = [network.ip, network.city, network.region].filter(Boolean).join(' / ') || 'geo unknown'\n const sessionId = attempt.browser_session_id ?? attempt.kernel_session_id ?? kernel.sessionId ?? 'unknown'\n const cleanupSucceeded = attempt.session_cleanup_succeeded ?? attempt.kernel_delete_succeeded\n return `- Attempt ${attempt.attempt_number ?? '?'}: ${attempt.outcome ?? attempt.status ?? 'unknown'} · session ${sessionId} · proxy ${debug.request?.proxyMode ?? kernel.proxyMode ?? 'unknown'}${proxyResolution.source ? `/${proxyResolution.source}` : ''} · ${geo} · CAPTCHA ${nav.captchaDetected === true ? 'yes' : nav.captchaDetected === false ? 'no' : 'unknown'} · cleanup ${cleanupSucceeded === true ? 'yes' : cleanupSucceeded === false ? 'no' : 'unknown'}`\n })\n return `\\n\\nAttempts:\\n${lines.join('\\n')}`\n}\n\ninterface FlatRow { question: string; answer?: string; source_site?: string; source_title?: string }\ninterface OrganicResult { position: number; title: string; url: string; domain: string; snippet?: string | null }\ninterface AIOverview { detected: boolean; text?: string | null }\ninterface HarvestDiagnostics { completionStatus?: string; debug?: unknown }\n\nexport function formatHarvestPaa(\n raw: CallToolResult,\n input: { query: string; maxQuestions?: number; location?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data\n\n const flat = (d.flat as FlatRow[]) ?? []\n const organic = (d.organicResults as OrganicResult[]) ?? []\n const entityIds = d.entityIds as { kgIds?: string[]; cids?: string[]; gcids?: string[] } | undefined\n const aiOvw = d.aiOverview as AIOverview | undefined\n const diagnostics = d.diagnostics as HarvestDiagnostics | undefined\n const durationMs = (d.stats as { durationMs?: number } | undefined)?.durationMs\n\n const paaRows = flat.map((r, i) =>\n `| ${i + 1} | ${cell(r.question)} | ${cell(truncate(r.answer, 120))} | ${cell(r.source_title || r.source_site || '')} |`,\n ).join('\\n')\n\n const paaTable = flat.length\n ? `## People Also Ask (${flat.length} questions)\\n| # | Question | Answer | Source |\\n|---|----------|--------|--------|\\n${paaRows}`\n : '## People Also Ask\\n*Google did not return a People Also Ask block for this query/location. SERP data was extracted successfully when available.*'\n\n const serpRows = organic.map(r =>\n `| ${r.position} | ${cell(r.title)} | [${cell(r.domain)}](${r.url}) | ${cell(truncate(r.snippet, 100))} |`,\n ).join('\\n')\n\n const serpTable = organic.length\n ? `\\n## Organic Results (${organic.length})\\n| # | Title | URL | Snippet |\\n|---|-------|-----|----------|\\n${serpRows}`\n : ''\n\n const aiSection = aiOvw?.detected && aiOvw.text\n ? `\\n## AI Overview\\n> ${truncate(aiOvw.text, 600)}`\n : ''\n\n const statsLine = durationMs\n ? `\\n## Stats\\n- Status: ${diagnostics?.completionStatus ?? (flat.length ? 'paa_found' : 'no_paa')} · Questions: ${flat.length} · Duration: ${(durationMs / 1000).toFixed(1)}s`\n : ''\n\n const tips = `\\n---\\n💡 **Tips**\\n- Max questions: \\`maxQuestions: 200\\` (current: ${input.maxQuestions ?? 30})\\n- Organic results only: use \\`search_serp\\`\\n- Dig into a result: use \\`extract_url\\` on any organic URL`\n\n const full = `# PAA Report: \"${input.query}\"${input.location ? ` · ${input.location}` : ''}\\n\\n${paaTable}${serpTable}${entityIdsSection(entityIds)}${aiSection}${statsLine}${debugSection(diagnostics?.debug)}${tips}`\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: input.query,\n location: input.location ?? null,\n questionCount: flat.length,\n completionStatus: diagnostics?.completionStatus ?? null,\n questions: flat.map(r => ({\n question: String(r.question ?? ''),\n answer: r.answer ?? null,\n sourceTitle: r.source_title ?? null,\n sourceSite: r.source_site ?? null,\n })),\n organicResults: organic.map(r => ({\n position: Number(r.position) || 0,\n title: String(r.title ?? ''),\n url: String(r.url ?? ''),\n domain: String(r.domain ?? ''),\n snippet: r.snippet ?? null,\n })),\n aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null } : null,\n entityIds: entityIds\n ? { kgIds: entityIds.kgIds ?? [], cids: entityIds.cids ?? [], gcids: entityIds.gcids ?? [] }\n : null,\n durationMs: durationMs ?? null,\n },\n }\n}\n\ninterface LocalBusiness { position: number; name: string; rating?: string | null; reviewCount?: string | null; websiteUrl?: string | null }\n\nexport function formatSearchSerp(\n raw: CallToolResult,\n input: { query: string; location?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data\n\n const organic = (d.organicResults as OrganicResult[]) ?? []\n const localPack = (d.localPack as LocalBusiness[]) ?? []\n const entityIds = d.entityIds as { kgIds?: string[]; cids?: string[]; gcids?: string[] } | undefined\n const aiOvw = d.aiOverview as AIOverview | undefined\n const diagnostics = d.diagnostics as HarvestDiagnostics | undefined\n\n const serpRows = organic.map(r =>\n `| ${r.position} | ${cell(r.title)} | [${cell(r.domain)}](${r.url}) | ${cell(truncate(r.snippet, 100))} |`,\n ).join('\\n')\n\n const serpTable = organic.length\n ? `## Organic Results (${organic.length})\\n| # | Title | URL | Snippet |\\n|---|-------|-----|----------|\\n${serpRows}`\n : '## Organic Results\\n*None found*'\n\n const localRows = localPack.map(b =>\n `| ${b.position} | ${cell(b.name)} | ${b.rating ?? '—'} (${b.reviewCount ?? '0'}) | ${b.websiteUrl ? `[link](${b.websiteUrl})` : '—'} |`,\n ).join('\\n')\n\n const localSection = localPack.length\n ? `\\n## Local Pack (${localPack.length})\\n| # | Name | Rating | Website |\\n|---|------|--------|---------|\\n${localRows}`\n : ''\n\n const aiSection = aiOvw?.detected && aiOvw.text\n ? `\\n## AI Overview\\n> ${truncate(aiOvw.text, 600)}`\n : ''\n\n const tips = `\\n---\\n💡 **Tips**\\n- Get PAA questions: use \\`harvest_paa\\` for this query\\n- Scrape any result: use \\`extract_url\\`\\n- Business entity IDs (CID/GCID/KG MID) shown above if found`\n\n const full = `# SERP Report: \"${input.query}\"${input.location ? ` · ${input.location}` : ''}\\n\\n${serpTable}${localSection}${entityIdsSection(entityIds)}${aiSection}${debugSection(diagnostics?.debug)}${tips}`\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: input.query,\n location: input.location ?? null,\n organicResults: organic.map(r => ({\n position: Number(r.position) || 0,\n title: String(r.title ?? ''),\n url: String(r.url ?? ''),\n domain: String(r.domain ?? ''),\n snippet: r.snippet ?? null,\n })),\n localPack: localPack.map(b => ({\n position: Number(b.position) || 0,\n name: String(b.name ?? ''),\n rating: b.rating ?? null,\n reviewCount: b.reviewCount ?? null,\n websiteUrl: b.websiteUrl ?? null,\n })),\n aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null } : null,\n entityIds: entityIds\n ? { kgIds: entityIds.kgIds ?? [], cids: entityIds.cids ?? [], gcids: entityIds.gcids ?? [] }\n : null,\n },\n }\n}\n\ninterface Heading { level: number; text: string }\ninterface KpoResult {\n entityName?: string | null; type?: string[]; napScore?: number\n address?: string | null; phone?: string | null; email?: string | null\n sameAs?: string[]; missingFields?: string[]; faqCount?: number\n}\n\nexport function formatExtractUrl(raw: CallToolResult, input: { url: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data\n\n const url = (d.url as string) ?? input.url\n const title = (d.title as string | null) ?? 'Untitled'\n const headings = (d.headings as Heading[]) ?? []\n const kpo = d.kpo as KpoResult | undefined\n const bodyMd = (d.bodyMarkdown as string | null) ?? ''\n const schema = d.schema as unknown[]\n const screenshotMeta = d.screenshot as { base64: string; sizeBytes: number; device: string } | null | undefined\n const screenshotPath = screenshotMeta?.base64 ? persistScreenshotLocally(screenshotMeta.base64, url) : null\n const branding = d.branding as { colorScheme: string | null; colors: Record<string, string | null>; fonts: Record<string, string | null>; assets: Record<string, string | null> } | null | undefined\n const media = d.media as { outputDir: string | null; assets: unknown[]; filteredCount: number; totalFound: number } | null | undefined\n\n const h1Lines = headings.filter(h => h.level === 1).map(h => `- ${h.text}`).join('\\n')\n const h2Lines = headings.filter(h => h.level === 2).map(h => ` - ${h.text}`).join('\\n')\n const headingSection = (h1Lines || h2Lines)\n ? `\\n## Heading Structure\\n${[h1Lines, h2Lines].filter(Boolean).join('\\n')}`\n : ''\n\n const kpoSection = kpo ? [\n `\\n## Entity / Schema`,\n kpo.entityName ? `- **Entity:** ${kpo.entityName}` : '',\n kpo.type?.length ? `- **@type:** ${kpo.type.join(', ')}` : '',\n kpo.napScore !== undefined ? `- **NAP Score:** ${kpo.napScore}/5` : '',\n kpo.address ? `- **Address:** ${kpo.address}` : '',\n kpo.phone ? `- **Phone:** ${kpo.phone}` : '',\n kpo.email ? `- **Email:** ${kpo.email}` : '',\n kpo.faqCount ? `- **FAQ items:** ${kpo.faqCount}` : '',\n kpo.sameAs?.length ? `- **sameAs:** ${kpo.sameAs.slice(0, 5).join(', ')}` : '',\n kpo.missingFields?.length ? `\\n**Missing schema fields:** ${kpo.missingFields.slice(0, 5).join(', ')}` : '',\n ].filter(Boolean).join('\\n') : ''\n\n const bodySection = bodyMd\n ? `\\n## Page Content\\n${bodyMd.slice(0, 3000)}${bodyMd.length > 3000 ? '\\n\\n*(truncated)*' : ''}`\n : ''\n\n const screenshotSection = screenshotMeta\n ? `\\n## Screenshot\\n- **File:** ${screenshotPath ?? '(returned inline only — disk write unavailable in this environment)'}\\n- **Size:** ${(screenshotMeta.sizeBytes / 1024).toFixed(1)} KB\\n- **Device:** ${screenshotMeta.device}`\n : ''\n\n const brandingSection = branding\n ? [\n `\\n## Branding`,\n branding.colorScheme ? `- **Color scheme:** ${branding.colorScheme}` : '',\n `- **Colors:**${Object.entries(branding.colors ?? {}).filter(([,v]) => v).map(([k,v]) => ` ${k}=${v}`).join(',') || ' (none extracted)'}`,\n `- **Fonts:**${Object.entries(branding.fonts ?? {}).filter(([,v]) => v).map(([k,v]) => ` ${k}=${v}`).join(',') || ' (none extracted)'}`,\n branding.assets?.logo ? `- **Logo:** ${branding.assets.logo}` : '',\n branding.assets?.favicon ? `- **Favicon:** ${branding.assets.favicon}` : '',\n ].filter(Boolean).join('\\n')\n : ''\n\n const mediaSection = media\n ? [\n `\\n## Media Assets`,\n `- **Found:** ${media.totalFound} total, ${media.filteredCount} filtered (ads/noise), ${media.assets.length} downloaded`,\n media.outputDir ? `- **Saved to:** ${media.outputDir}` : '',\n ].filter(Boolean).join('\\n')\n : ''\n\n const schemaCount = Array.isArray(schema) ? schema.length : 0\n const tips = `\\n---\\n💡 **Tips**\\n- Crawl entire site: use \\`extract_site\\`\\n- Map all URLs: use \\`map_site_urls\\`\\n- ${schemaCount} JSON-LD schema block(s) detected`\n\n const full = `# URL Extract: ${url}\\n**${title}**\\n${headingSection}${kpoSection}${brandingSection}${bodySection}${screenshotSection}${mediaSection}${tips}`\n\n const textResult = oneBlock(full)\n const structuredContent = {\n url,\n title: (d.title as string | null) ?? null,\n headings: headings.map(h => ({ level: Number(h.level) || 0, text: String(h.text ?? '') })),\n schemaBlockCount: schemaCount,\n entityName: kpo?.entityName ?? null,\n entityTypes: kpo?.type ?? [],\n napScore: kpo?.napScore ?? null,\n missingSchemaFields: kpo?.missingFields ?? [],\n screenshotSaved: screenshotPath ?? null,\n }\n\n if (screenshotMeta?.base64) {\n return {\n content: [\n ...(textResult.content),\n { type: 'image', data: screenshotMeta.base64, mimeType: 'image/png' },\n ],\n structuredContent,\n }\n }\n\n return { ...textResult, structuredContent }\n}\n\ninterface DiscoveredUrl { url: string; status: number | null }\ninterface SpiderResult { startUrl: string; urls: DiscoveredUrl[]; totalFound: number; durationMs: number; truncated: boolean }\n\nexport function formatMapSiteUrls(raw: CallToolResult, input: { url: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as SpiderResult\n\n const urls = d.urls ?? []\n const ok = urls.filter(u => (u.status ?? 0) >= 200 && (u.status ?? 0) < 300)\n const broken = urls.filter(u => u.status !== null && u.status >= 400)\n const redirects = urls.filter(u => u.status !== null && u.status >= 300 && u.status < 400)\n\n const urlRows = urls.slice(0, 200).map((u, i) => `| ${i + 1} | ${u.url} | ${u.status ?? '—'} |`).join('\\n')\n\n const full = [\n `# URL Map: ${input.url}`,\n `**${d.totalFound} URLs** · ${(d.durationMs / 1000).toFixed(1)}s${d.truncated ? ' · *truncated*' : ''}`,\n `\\n## Summary\\n- ✅ 2xx: ${ok.length}\\n- 🔀 3xx: ${redirects.length}\\n- ❌ 4xx+: ${broken.length}`,\n `\\n## URL Inventory\\n| # | URL | Status |\\n|---|-----|--------|\\n${urlRows}`,\n broken.length ? `\\n## Broken URLs\\n${broken.map(u => `- ${u.url} (${u.status})`).join('\\n')}` : '',\n `\\n---\\n💡 **Tips**\\n- Extract content from all pages: use \\`extract_site\\`\\n- Scrape a single page: use \\`extract_url\\``,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n startUrl: d.startUrl ?? input.url,\n totalFound: d.totalFound ?? urls.length,\n truncated: d.truncated === true,\n okCount: ok.length,\n redirectCount: redirects.length,\n brokenCount: broken.length,\n urls: urls.map(u => ({ url: u.url, status: u.status ?? null })),\n durationMs: d.durationMs ?? 0,\n },\n }\n}\n\ninterface SitePageResult { url: string; title?: string | null; kpo?: KpoResult; schema?: unknown[] }\ninterface ExtractSiteResult { pages: SitePageResult[]; durationMs?: number }\n\nexport function formatExtractSite(raw: CallToolResult, input: { url: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as ExtractSiteResult\n\n const pages = d.pages ?? []\n\n const pageRows = pages.map((p, i) => {\n const schemaInfo = p.kpo?.type?.join(', ') ?? (Array.isArray(p.schema) && p.schema.length ? `${p.schema.length} block(s)` : '—')\n return `| ${i + 1} | ${cell(p.title ?? 'Untitled')} | ${p.url} | ${schemaInfo} |`\n }).join('\\n')\n\n const full = [\n `# Site Extract: ${input.url}`,\n `**${pages.length} pages** · ${(((d.durationMs ?? 0)) / 1000).toFixed(1)}s`,\n `\\n## Pages\\n| # | Title | URL | Schema |\\n|---|-------|-----|--------|\\n${pageRows}`,\n `\\n---\\n💡 **Tips**\\n- Map URLs first: use \\`map_site_urls\\`\\n- Inspect a single page: use \\`extract_url\\``,\n ].join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n url: input.url,\n pageCount: pages.length,\n pages: pages.map(p => ({\n url: String(p.url ?? ''),\n title: p.title ?? null,\n schemaTypes: p.kpo?.type ?? [],\n })),\n durationMs: d.durationMs ?? 0,\n },\n }\n}\n\ninterface YTVideo { videoId: string; title: string; channelName: string; views?: string | null; duration?: string | null; url: string }\ninterface YTHarvestResult { videos: YTVideo[]; channelMeta?: { title?: string; subscriberCount?: string | null } | null; stats: { durationMs: number } }\n\nexport function formatYoutubeHarvest(\n raw: CallToolResult,\n input: { mode: string; query?: string; channelHandle?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as YTHarvestResult\n\n const videos = d.videos ?? []\n const label = input.mode === 'channel' ? (input.channelHandle ?? 'channel') : `\"${input.query ?? ''}\"`\n\n const videoRows = videos.map((v, i) =>\n `| ${i + 1} | ${cell(truncate(v.title, 70))} | ${cell(v.channelName)} | ${v.views ?? '—'} | ${v.duration ?? '—'} | \\`${v.videoId}\\` |`,\n ).join('\\n')\n\n const channelSection = d.channelMeta\n ? `\\n## Channel\\n- **Name:** ${d.channelMeta.title ?? '—'}\\n- **Subscribers:** ${d.channelMeta.subscriberCount ?? '—'}`\n : ''\n\n const full = [\n `# YouTube Harvest: ${label}`,\n `**${videos.length} videos** · ${(d.stats.durationMs / 1000).toFixed(1)}s`,\n channelSection,\n `\\n## Videos\\n| # | Title | Channel | Views | Duration | Video ID |\\n|---|-------|---------|-------|----------|----------|\\n${videoRows}`,\n `\\n---\\n💡 **Tips**\\n- Transcribe a video: use \\`youtube_transcribe\\` with the \\`videoId\\` above\\n- Switch mode: \\`mode: \"channel\"\\` with \\`channelHandle\\` or \\`mode: \"search\"\\` with \\`query\\``,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n mode: input.mode,\n videoCount: videos.length,\n channel: d.channelMeta\n ? { title: d.channelMeta.title ?? null, subscriberCount: d.channelMeta.subscriberCount ?? null }\n : null,\n videos: videos.map(v => ({\n videoId: String(v.videoId ?? ''),\n title: String(v.title ?? ''),\n channelName: v.channelName ?? null,\n views: v.views ?? null,\n duration: v.duration ?? null,\n url: v.url ?? null,\n })),\n },\n }\n}\n\ninterface TranscriptChunk { timestamp: [number, number]; text: string }\ninterface TranscriptResult { text: string; chunks?: TranscriptChunk[]; durationMs?: number }\n\nexport function formatYoutubeTranscribe(raw: CallToolResult, input: { videoId: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as TranscriptResult\n\n const text = d.text ?? ''\n const chunks = d.chunks ?? []\n const durSec = d.durationMs ? (d.durationMs / 1000).toFixed(0) : '—'\n\n const chunkRows = chunks.slice(0, 50).map(c => {\n const sec = Number.isFinite(c.timestamp[0]) ? Math.floor(c.timestamp[0]) : 0\n const mm = String(Math.floor(sec / 60)).padStart(2, '0')\n const ss = String(sec % 60).padStart(2, '0')\n return `| ${mm}:${ss} | ${cell(truncate(c.text, 120))} |`\n }).join('\\n')\n\n const full = [\n `# YouTube Transcript: \\`${input.videoId}\\``,\n `**Duration:** ${durSec}s · **${text.split(' ').length} words**`,\n `\\n## Full Transcript\\n${text}`,\n chunks.length ? `\\n## Timestamped Chunks\\n| Time | Text |\\n|------|------|\\n${chunkRows}` : '',\n `\\n---\\n💡 Harvest more from this channel: use \\`youtube_harvest\\` with \\`mode: \"channel\"\\``,\n ].filter(Boolean).join('\\n')\n\n return oneBlock(full)\n}\n\ninterface FbAd {\n libraryId?: string; status?: string; creativeType?: string\n headline?: string | null; primaryText?: string | null; cta?: string | null\n startDate?: string | null; videoUrl?: string | null; variations?: number\n}\ninterface FbPageResult {\n advertiserName?: string | null\n summary: { totalAds: number; activeCount: number; videoCount: number; imageCount: number }\n ads: FbAd[]\n}\n\nexport function formatFacebookPageIntel(\n raw: CallToolResult,\n input: { pageId?: string; libraryId?: string; query?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as FbPageResult\n\n const advertiser = d.advertiserName ?? input.query ?? input.pageId ?? input.libraryId ?? 'Advertiser'\n const ads = d.ads ?? []\n const s = d.summary ?? { totalAds: 0, activeCount: 0, videoCount: 0, imageCount: 0 }\n\n const adBlocks = ads.map((ad, i) => [\n `### Ad ${i + 1}${ad.libraryId ? ` · \\`${ad.libraryId}\\`` : ''} — ${ad.status ?? '—'} · ${ad.creativeType ?? '—'} · ${ad.startDate ?? '—'}`,\n ad.headline ? `**Headline:** ${ad.headline}` : '',\n ad.primaryText ? `**Copy:** ${truncate(ad.primaryText, 200)}` : '',\n ad.cta ? `**CTA:** ${ad.cta}` : '',\n ad.videoUrl ? `**Video URL:** \\`${ad.videoUrl}\\`` : '',\n ad.variations ? `**Variations:** ${ad.variations}` : '',\n ].filter(Boolean).join('\\n')).join('\\n\\n---\\n\\n')\n\n const full = [\n `# Facebook Ad Intel: ${advertiser}`,\n `**${s.totalAds} ads** · ${s.activeCount} active · ${s.videoCount} video · ${s.imageCount} image`,\n `\\n${adBlocks}`,\n `\\n---\\n💡 **Tips**\\n- Transcribe video ads: use \\`facebook_ad_transcribe\\` with the \\`videoUrl\\` above\\n- Find other advertisers: use \\`facebook_ad_search\\``,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n advertiserName: d.advertiserName ?? null,\n totalAds: s.totalAds ?? 0,\n activeCount: s.activeCount ?? 0,\n videoCount: s.videoCount ?? 0,\n imageCount: s.imageCount ?? 0,\n ads: ads.map(ad => ({\n libraryId: ad.libraryId ?? null,\n status: ad.status ?? null,\n creativeType: ad.creativeType ?? null,\n headline: ad.headline ?? null,\n cta: ad.cta ?? null,\n startDate: ad.startDate ?? null,\n videoUrl: ad.videoUrl ?? null,\n variations: typeof ad.variations === 'number' ? ad.variations : null,\n })),\n },\n }\n}\n\ninterface FbAdvertiserResult { name?: string; pageName?: string; adCount?: number; libraryId?: string; sampleLibraryId?: string }\ninterface FbSearchResult { results?: FbAdvertiserResult[]; advertisers?: FbAdvertiserResult[] }\n\nexport function formatFacebookAdSearch(raw: CallToolResult, input: { query: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as FbSearchResult\n\n const advertisers = d.results ?? d.advertisers ?? []\n\n const rows = advertisers.map((a, i) =>\n `| ${i + 1} | ${cell(a.pageName ?? a.name)} | ${a.adCount ?? '—'} | \\`${a.sampleLibraryId ?? a.libraryId ?? '—'}\\` |`,\n ).join('\\n')\n\n const full = [\n `# Facebook Ad Library Search: \"${input.query}\"`,\n `**${advertisers.length} advertisers found**`,\n `\\n## Advertisers\\n| # | Name | Ad Count | Library ID |\\n|---|------|----------|------------|\\n${rows}`,\n `\\n---\\n💡 **Tips**\\n- Scan all ads: use \\`facebook_page_intel\\` with \\`libraryId\\`\\n- Or pass the advertiser name as \\`query\\` in \\`facebook_page_intel\\``,\n ].join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: input.query,\n advertiserCount: advertisers.length,\n advertisers: advertisers.map(a => ({\n name: a.pageName ?? a.name ?? null,\n adCount: typeof a.adCount === 'number' ? a.adCount : null,\n libraryId: a.sampleLibraryId ?? a.libraryId ?? null,\n })),\n },\n }\n}\n\ninterface MapsReviewCard { author: string | null; stars: string | null; date: string | null; text: string | null }\ntype ReviewsStatus = 'collected' | 'none_exist' | 'unavailable' | 'not_requested'\ninterface MapsHistogramEntry { stars: number; count: string }\ninterface MapsTopicEntry { label: string; count: string }\ninterface MapsAboutEntry { section: string; attribute: string }\ninterface MapsSearchBusiness {\n position: number\n name: string\n placeUrl: string\n cidDecimal: string | null\n rating: string | null\n reviewCount: string | null\n category: string | null\n address: string | null\n websiteUrl: string | null\n directionsUrl: string | null\n metadata: string[]\n}\ninterface CreditCostEntry { key: string; label: string; credits: number; unit: string; notes?: string }\ninterface CreditLedgerEntry { amount_mc: number; operation: string; description: string | null; created_at: string }\n\nexport function formatCreditsInfo(raw: CallToolResult, input: { item?: string; includeLedger?: boolean }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as Record<string, unknown>\n\n const balance = d.balance_credits as number | undefined\n const costs = (d.costs as CreditCostEntry[] | undefined) ?? []\n const matched = d.matched_cost as CreditCostEntry | null\n const ledger = (d.ledger as CreditLedgerEntry[] | undefined) ?? []\n\n const costRows = costs.map(c => {\n const notes = c.notes ? ` ${c.notes}` : ''\n return `| ${c.label} | ${c.credits} | ${c.unit}${notes} |`\n }).join('\\n')\n\n const ledgerRows = ledger.map(row => {\n const credits = row.amount_mc / 1000\n return `| ${row.created_at} | ${row.operation} | ${credits} | ${row.description ?? ''} |`\n }).join('\\n')\n\n const matchedSection = matched\n ? `\\n## Matched Cost\\n**${matched.label}:** ${matched.credits} credits ${matched.unit}${matched.notes ? `\\n\\n${matched.notes}` : ''}`\n : input.item\n ? `\\n## Matched Cost\\nNo exact cost match found for \"${input.item}\". See the full cost table below.`\n : ''\n\n const full = [\n `# Credits`,\n `**Balance:** ${balance ?? 'unknown'} credits`,\n matchedSection,\n costs.length ? `\\n## Cost Table\\n| Item | Credits | Unit |\\n|------|---------|------|\\n${costRows}` : '',\n ledger.length ? `\\n## Recent Ledger\\n| Date | Operation | Credits | Description |\\n|------|-----------|---------|-------------|\\n${ledgerRows}` : '',\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n balanceCredits: typeof balance === 'number' ? balance : null,\n matchedCost: matched\n ? { label: matched.label, credits: matched.credits, unit: matched.unit, notes: matched.notes ?? null }\n : null,\n costs: costs.map(c => ({\n key: c.key,\n label: c.label,\n credits: c.credits,\n unit: c.unit,\n notes: c.notes ?? null,\n })),\n ledger: ledger.map(row => ({\n createdAt: String(row.created_at ?? ''),\n operation: String(row.operation ?? ''),\n credits: row.amount_mc / 1000,\n description: row.description ?? null,\n })),\n },\n }\n}\n\nexport function formatMapsSearch(\n raw: CallToolResult,\n input: { query: string; location?: string; maxResults?: number },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as Record<string, unknown>\n const results = (d.results as MapsSearchBusiness[]) ?? []\n const searchQuery = (d.searchQuery as string | undefined) ?? [input.query, input.location].filter(Boolean).join(' ')\n const requestedMax = (d.requestedMaxResults as number | undefined) ?? input.maxResults ?? 10\n const durationMs = d.durationMs as number | undefined\n\n const rows = results.map((r) => {\n const rating = [r.rating, r.reviewCount ? `(${r.reviewCount})` : null].filter(Boolean).join(' ')\n return `| ${r.position} | ${cell(r.name)} | ${cell(r.category)} | ${cell(rating)} | ${cell(r.address)} | ${r.cidDecimal ? `\\`${r.cidDecimal}\\`` : '—'} | ${r.websiteUrl ? `[site](${r.websiteUrl})` : '—'} | [maps](${r.placeUrl}) |`\n }).join('\\n')\n\n const metadataSection = results.length\n ? `\\n## Candidate Metadata\\n${results.map(r => {\n const meta = r.metadata?.length ? r.metadata.slice(0, 8).map(m => ` - ${m}`).join('\\n') : ' - none'\n return `### ${r.position}. ${r.name}\\n${meta}`\n }).join('\\n\\n')}`\n : ''\n\n const full = [\n `# Google Maps Search: \"${searchQuery}\"`,\n `**Returned:** ${results.length} profile candidate${results.length === 1 ? '' : 's'} · **Requested max:** ${requestedMax} · **Limit:** 50`,\n `\\n## Results\\n| # | Name | Category | Rating | Address | CID | Website | Maps |\\n|---|------|----------|--------|---------|-----|---------|------|\\n${rows}`,\n metadataSection,\n `\\n---\\n💡 **Next step:** use \\`maps_place_intel\\` with a selected business name and location to hydrate full hours, phone, review topics, and optional review cards.`,\n durationMs != null ? `\\n*Extracted in ${(durationMs / 1000).toFixed(1)}s*` : null,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: d.query,\n location: d.location ?? null,\n searchQuery: d.searchQuery,\n searchUrl: d.searchUrl,\n extractedAt: d.extractedAt,\n requestedMaxResults: requestedMax,\n resultCount: results.length,\n results,\n durationMs: durationMs ?? 0,\n },\n }\n}\n\nexport function formatMapsPlaceIntel(\n raw: CallToolResult,\n input: { businessName: string; location: string; includeReviews?: boolean },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as Record<string, unknown>\n\n const name = (d.name as string | null) ?? input.businessName\n const rating = d.rating as string | null\n const reviewCount = d.reviewCount as string | null\n const category = d.category as string | null\n const address = d.address as string | null\n const phone = d.phoneDisplay as string | null\n const website = d.website as string | null\n const hoursSummary = d.hoursSummary as string | null\n const plusCode = d.plusCode as string | null\n const bookingUrl = d.bookingUrl as string | null\n const kgmid = d.kgmid as string | null\n const cidDecimal = d.cidDecimal as string | null\n const cidUrl = d.cidUrl as string | null\n const lat = d.lat as number | null\n const lng = d.lng as number | null\n const durationMs = d.durationMs as number | null\n\n const histogram = (d.reviewHistogram as MapsHistogramEntry[]) ?? []\n const topics = (d.reviewTopics as MapsTopicEntry[]) ?? []\n const about = (d.aboutAttributes as MapsAboutEntry[]) ?? []\n const reviews = (d.reviews as MapsReviewCard[]) ?? []\n const reviewsStatus = (d.reviewsStatus as ReviewsStatus | undefined) ?? 'not_requested'\n\n const hoursTable = (d.hoursTable as Array<{ day: string; hours: string }>) ?? []\n\n const ratingLine = [rating, reviewCount ? `(${reviewCount} reviews)` : null].filter(Boolean).join(' ')\n\n const basicLines = [\n address ? `- **Address:** ${address}` : null,\n phone ? `- **Phone:** ${phone}` : null,\n website ? `- **Website:** ${website}` : null,\n hoursSummary ? `- **Hours:** ${hoursSummary}` : null,\n plusCode ? `- **Plus Code:** ${plusCode}` : null,\n bookingUrl ? `- **Book:** ${bookingUrl}` : null,\n ].filter(Boolean).join('\\n')\n\n const hoursSection = hoursTable.length\n ? `\\n## Hours\\n| Day | Hours |\\n|-----|-------|\\n${hoursTable.map(r => `| ${r.day} | ${r.hours} |`).join('\\n')}`\n : ''\n\n const histSection = histogram.length\n ? `\\n## Rating Distribution\\n| Stars | Count |\\n|-------|-------|\\n${histogram.map(r => `| ${'★'.repeat(r.stars)}${'☆'.repeat(5 - r.stars)} | ${r.count} |`).join('\\n')}`\n : ''\n\n const topicsSection = topics.length\n ? `\\n## Review Topics\\n${topics.map(t => `- **${t.label}:** ${t.count} mentions`).join('\\n')}`\n : ''\n\n const aboutBySection: Record<string, string[]> = {}\n for (const a of about) {\n if (!aboutBySection[a.section]) aboutBySection[a.section] = []\n aboutBySection[a.section].push(a.attribute)\n }\n const aboutSection = Object.keys(aboutBySection).length\n ? `\\n## About\\n${Object.entries(aboutBySection).map(([s, attrs]) => `**${s}**\\n${attrs.map(a => `- ${a}`).join('\\n')}`).join('\\n\\n')}`\n : ''\n\n const entitySection = [\n kgmid ? `- **KGMID:** \\`${kgmid}\\`` : null,\n cidDecimal ? `- **CID:** \\`${cidDecimal}\\`` : null,\n cidUrl ? `- **Maps CID URL:** ${cidUrl}` : null,\n lat != null && lng != null ? `- **Coordinates:** ${lat}, ${lng}` : null,\n ].filter(Boolean).join('\\n')\n\n const reviewsSection = (() => {\n if (reviewsStatus === 'not_requested') return ''\n if (reviewsStatus === 'unavailable') return '\\n## Reviews\\n> Reviews could not be retrieved this run — retry with `includeReviews: true`.'\n if (reviewsStatus === 'none_exist') return '\\n## Reviews\\n*This business has no reviews on Google Maps.*'\n if (reviews.length === 0) return '\\n## Reviews\\n*0 reviews collected.*'\n return `\\n## Reviews (${reviews.length})\\n${reviews.map((r, i) => {\n const starsN = parseInt(r.stars ?? '0')\n const stars = '★'.repeat(starsN) + '☆'.repeat(5 - starsN)\n return `### ${i + 1}. ${r.author ?? 'Anonymous'} — ${stars}\\n*${r.date ?? ''}*\\n\\n${r.text ?? ''}`\n }).join('\\n\\n')}`\n })()\n\n const full = [\n `# ${name}`,\n category ? `*${category}*` : null,\n ratingLine ? `\\n**Rating:** ${ratingLine}` : null,\n basicLines ? `\\n${basicLines}` : null,\n hoursSection,\n histSection,\n topicsSection,\n aboutSection,\n entitySection ? `\\n## Entity IDs\\n${entitySection}` : null,\n reviewsSection,\n durationMs != null ? `\\n---\\n*Extracted in ${(durationMs / 1000).toFixed(1)}s*` : null,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n name,\n rating: rating ?? null,\n reviewCount: reviewCount ?? null,\n category: category ?? null,\n address: address ?? null,\n phone: phone ?? null,\n website: website ?? null,\n hoursSummary: hoursSummary ?? null,\n bookingUrl: bookingUrl ?? null,\n kgmid: kgmid ?? null,\n cidDecimal: cidDecimal ?? null,\n cidUrl: cidUrl ?? null,\n lat: lat ?? null,\n lng: lng ?? null,\n reviewsStatus,\n reviewsCollected: reviews.length,\n reviewTopics: topics.map(t => ({ label: String(t.label ?? ''), count: String(t.count ?? '') })),\n },\n }\n}\n\nexport function formatFacebookAdTranscribe(raw: CallToolResult, input: { videoUrl: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as TranscriptResult\n\n const text = d.text ?? ''\n const chunks = d.chunks ?? []\n const durSec = d.durationMs ? (d.durationMs / 1000).toFixed(0) : '—'\n\n const chunkRows = chunks.slice(0, 50).map(c => {\n const sec = Number.isFinite(c.timestamp[0]) ? Math.floor(c.timestamp[0]) : 0\n const mm = String(Math.floor(sec / 60)).padStart(2, '0')\n const ss = String(sec % 60).padStart(2, '0')\n return `| ${mm}:${ss} | ${cell(truncate(c.text, 120))} |`\n }).join('\\n')\n\n const full = [\n `# Facebook Ad Transcript`,\n `**Duration:** ${durSec}s · **${text.split(' ').length} words**`,\n `\\n## Full Transcript\\n${text}`,\n chunks.length ? `\\n## Timestamped Chunks\\n| Time | Text |\\n|------|------|\\n${chunkRows}` : '',\n `\\n---\\n💡 Get more ads from this advertiser: use \\`facebook_page_intel\\``,\n ].filter(Boolean).join('\\n')\n\n return oneBlock(full)\n}\n","export const RECAPTCHA_INSTRUCTIONS = 'Google returned a CAPTCHA. Run with --headless=false to re-warm the browser profile, then retry.'\n\nexport function sanitizeVendorName(message: string): string {\n return message\n .replace(/kernel\\.sh\\s+sessions?/gi, 'sessions')\n .replace(/kernel\\.sh\\s+session/gi, 'this session')\n .replace(/kernel\\.sh/gi, 'the service')\n .replace(/kernel\\s+sessions?/gi, 'sessions')\n .replace(/kernel\\s+session/gi, 'this session')\n .replace(/\\bkernel\\b/gi, 'the service')\n .replace(/ +/g, ' ')\n .trim()\n}\n\nexport class CaptchaError extends Error {\n readonly name = 'CaptchaError'\n constructor(public readonly instructions: string) {\n super(`CAPTCHA detected. ${instructions}`)\n }\n}\n\nexport class ExtractionError extends Error {\n readonly name = 'ExtractionError'\n constructor(message: string, public readonly cause?: unknown) {\n super(message)\n }\n}\n\nexport class RequestAbortedError extends Error {\n readonly name = 'RequestAbortedError'\n constructor(message = 'Request aborted before harvest completed') {\n super(message)\n }\n}\n","import { z } from 'zod'\n\nexport const HarvestPaaInputSchema = {\n query: z.string().min(1).describe('Core search topic only. If the user says \"best hvac company in Denver CO\", use query=\"best hvac company\" and location=\"Denver, CO\". Do not include the location in query when it can be separated.'),\n location: z.string().optional().describe('City, region, or country for geo-targeted results, inferred from the user request when present, e.g. \"Denver, CO\", \"Tokyo, Japan\", \"London, UK\".'),\n maxQuestions: z.number().int().min(1).max(200).default(30).describe('Number of PAA questions to extract. Default 30. Maximum 200. Use 10 for quick probes, 30 for normal research, 100-200 when the user asks for everything/full/deep research. Larger harvests get a longer server time budget (151-200 questions → up to 280s). Credits are charged by extracted question; unused request hold is refunded.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location or user language. Examples: United States us, United Kingdom gb, Japan jp, Canada ca, Australia au.'),\n hl: z.string().default('en').describe('Google interface/content language inferred from the user request. Use en unless the user asks for another language or locale.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('SERP device context. Use desktop by default; use mobile only when the user asks for mobile rankings.'),\n proxyMode: z.enum(['location', 'configured', 'none']).default('location').describe('Proxy targeting mode. Use location by default so city/state searches create or reuse a matching residential proxy. Use configured for the static configured proxy. Use none only for direct-network debugging.'),\n proxyZip: z.string().regex(/^\\d{5}$/).optional().describe('Optional US ZIP override for residential location proxy targeting. Use only when the user gives a specific ZIP or city-center proxy targeting needs to be forced.'),\n debug: z.boolean().default(false).describe('Include sanitized browser/session/location diagnostics in the response. Use true when debugging localization, CAPTCHA, or proxy behavior.'),\n}\nexport type HarvestPaaInput = z.infer<ReturnType<typeof z.object<typeof HarvestPaaInputSchema>>>\n\nexport const ExtractUrlInputSchema = {\n url: z.string().url().describe('Public http/https URL to extract. Use this when the user provides one specific page URL.'),\n screenshot: z.boolean().default(false).describe('Also capture a full-page screenshot of the URL. Saved to ~/Downloads/mcp-scraper/screenshots/ and returned inline. Use when the user asks to see or capture the page visually.'),\n screenshotDevice: z.enum(['desktop', 'mobile']).default('desktop').describe('Viewport for screenshot. desktop = 1440×900. mobile = 390×844. Default desktop.'),\n extractBranding: z.boolean().default(false).describe('Extract brand colors, fonts, logo, and favicon using a rendered browser session. Returns colorScheme (light/dark), colors (primary/accent/background/text/heading as hex), fonts (heading/body family names), and assets (logo URL, favicon URL). Use when the user asks about brand colors, site theme, or brand assets.'),\n downloadMedia: z.boolean().default(false).describe('Extract and download all page media (images, video, audio) to ~/Downloads/mcp-scraper/media/. Ad networks, tracking pixels, and noise URLs are filtered automatically. Use when the user asks to download or harvest assets from a page.'),\n mediaTypes: z.array(z.enum(['image', 'video', 'audio'])).default(['image', 'video', 'audio']).describe('Which media types to download. Default all three.'),\n allowLocal: z.boolean().default(false).describe('Allow localhost and private-network URLs. For local development only.'),\n}\nexport type ExtractUrlInput = z.infer<ReturnType<typeof z.object<typeof ExtractUrlInputSchema>>>\n\nexport const MapSiteUrlsInputSchema = {\n url: z.string().url().describe('Public website URL or domain to crawl for internal URLs. Use before extract_site when the user asks to audit/map/crawl a site.'),\n maxUrls: z.number().int().min(1).max(500).optional().describe('Maximum URLs to discover. Use 100 for normal maps, higher when the user asks for a full inventory.'),\n}\nexport type MapSiteUrlsInput = z.infer<ReturnType<typeof z.object<typeof MapSiteUrlsInputSchema>>>\n\nexport const ExtractSiteInputSchema = {\n url: z.string().url().describe('Public website URL or domain to extract across multiple pages. Use when the user asks for a site audit, website crawl, or full-site content/schema extraction.'),\n maxPages: z.number().int().min(1).max(50).optional().describe('Maximum pages to extract. Use 50 when the user asks for full results or a complete crawl within MCP limits.'),\n}\nexport type ExtractSiteInput = z.infer<ReturnType<typeof z.object<typeof ExtractSiteInputSchema>>>\n\nexport const YoutubeHarvestInputSchema = {\n mode: z.enum(['search', 'channel']).describe('Use search for topic/keyword requests. Use channel when the user provides @handle, channel ID, or channel URL.'),\n query: z.string().optional().describe('Required when mode is search. The YouTube search topic in the user’s words.'),\n channelHandle: z.string().optional().describe('YouTube channel handle, channel ID, or URL. Examples: @mkbhd, UC..., https://youtube.com/@mkbhd.'),\n maxVideos: z.number().int().min(1).max(500).default(50).describe('Number of videos to return. Default 50. Increase when user asks for full channel/history.'),\n}\nexport type YoutubeHarvestInput = z.infer<ReturnType<typeof z.object<typeof YoutubeHarvestInputSchema>>>\n\nexport const YoutubeTranscribeInputSchema = {\n videoId: z.string().min(1).describe('YouTube video ID, e.g. dQw4w9WgXcQ'),\n}\nexport type YoutubeTranscribeInput = z.infer<ReturnType<typeof z.object<typeof YoutubeTranscribeInputSchema>>>\n\nexport const FacebookPageIntelInputSchema = {\n pageId: z.string().optional(),\n libraryId: z.string().optional(),\n query: z.string().optional().describe('Advertiser or brand name when pageId/libraryId is not known. One of pageId, libraryId, or query is required.'),\n maxAds: z.number().int().min(1).max(200).default(50),\n country: z.string().length(2).default('US'),\n}\nexport type FacebookPageIntelInput = z.infer<ReturnType<typeof z.object<typeof FacebookPageIntelInputSchema>>>\n\nexport const FacebookAdSearchInputSchema = {\n query: z.string().min(1).describe('Advertiser, brand, competitor, niche, or keyword to search in Facebook Ad Library.'),\n country: z.string().length(2).default('US'),\n maxResults: z.number().int().min(1).max(20).default(10),\n}\nexport type FacebookAdSearchInput = z.infer<ReturnType<typeof z.object<typeof FacebookAdSearchInputSchema>>>\n\nexport const FacebookAdTranscribeInputSchema = {\n videoUrl: z.string().url().describe('Facebook CDN video URL from a facebook_page_intel result'),\n}\nexport type FacebookAdTranscribeInput = z.infer<ReturnType<typeof z.object<typeof FacebookAdTranscribeInputSchema>>>\n\nexport const MapsPlaceIntelInputSchema = {\n businessName: z.string().min(1).describe('Business name only. If user says \"Elite Roofing Denver CO\", use businessName=\"Elite Roofing\" and location=\"Denver, CO\".'),\n location: z.string().min(1).describe('City/region/country where the business should be searched, e.g. \"Denver, CO\". Infer from the user request when possible.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location.'),\n hl: z.string().length(2).default('en').describe('Language inferred from user request.'),\n includeReviews: z.boolean().default(false).describe('Whether to fetch individual review cards'),\n maxReviews: z.number().int().min(1).max(500).default(50).describe('Max review cards to return (requires includeReviews: true)'),\n}\nexport type MapsPlaceIntelInput = z.infer<ReturnType<typeof z.object<typeof MapsPlaceIntelInputSchema>>>\n\nexport const MapsSearchInputSchema = {\n query: z.string().min(1).describe('Business category, niche, keyword, or search term. If the user says \"roofers in Denver CO\", use query=\"roofers\" and location=\"Denver, CO\". Do not put the location here when it can be separated.'),\n location: z.string().optional().describe('City, region, country, or service area for the Maps search, e.g. \"Denver, CO\". Infer from the user request when present.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location.'),\n hl: z.string().length(2).default('en').describe('Language inferred from user request.'),\n maxResults: z.number().int().min(1).max(50).default(10).describe('Number of Google Maps business/profile candidates to return. Default 10. Maximum 50. Use 10 unless the user asks for more.'),\n}\nexport type MapsSearchInput = z.infer<ReturnType<typeof z.object<typeof MapsSearchInputSchema>>>\n\nconst NullableString = z.string().nullable()\n\nexport const MapsSearchOutputSchema = {\n query: z.string(),\n location: z.string().nullable(),\n searchQuery: z.string(),\n searchUrl: z.string().url(),\n extractedAt: z.string(),\n requestedMaxResults: z.number().int().min(1).max(50),\n resultCount: z.number().int().min(0).max(50),\n results: z.array(z.object({\n position: z.number().int().min(1),\n name: z.string(),\n placeUrl: z.string().url(),\n cid: NullableString,\n cidDecimal: NullableString,\n rating: NullableString,\n reviewCount: NullableString,\n category: NullableString,\n address: NullableString,\n websiteUrl: NullableString,\n directionsUrl: NullableString,\n metadata: z.array(z.string()),\n })),\n durationMs: z.number().int().min(0),\n}\n\nconst OrganicResultOutput = z.object({\n position: z.number().int(),\n title: z.string(),\n url: z.string(),\n domain: z.string(),\n snippet: NullableString,\n})\n\nconst AiOverviewOutput = z.object({\n detected: z.boolean(),\n text: NullableString,\n}).nullable()\n\nconst EntityIdsOutput = z.object({\n kgIds: z.array(z.string()),\n cids: z.array(z.string()),\n gcids: z.array(z.string()),\n}).nullable()\n\nexport const HarvestPaaOutputSchema = {\n query: z.string(),\n location: NullableString,\n questionCount: z.number().int().min(0),\n completionStatus: NullableString,\n questions: z.array(z.object({\n question: z.string(),\n answer: NullableString,\n sourceTitle: NullableString,\n sourceSite: NullableString,\n })),\n organicResults: z.array(OrganicResultOutput),\n aiOverview: AiOverviewOutput,\n entityIds: EntityIdsOutput,\n durationMs: z.number().min(0).nullable(),\n}\n\nexport const SearchSerpOutputSchema = {\n query: z.string(),\n location: NullableString,\n organicResults: z.array(OrganicResultOutput),\n localPack: z.array(z.object({\n position: z.number().int(),\n name: z.string(),\n rating: NullableString,\n reviewCount: NullableString,\n websiteUrl: NullableString,\n })),\n aiOverview: AiOverviewOutput,\n entityIds: EntityIdsOutput,\n}\n\nexport const ExtractUrlOutputSchema = {\n url: z.string(),\n title: NullableString,\n headings: z.array(z.object({\n level: z.number().int(),\n text: z.string(),\n })),\n schemaBlockCount: z.number().int().min(0),\n entityName: NullableString,\n entityTypes: z.array(z.string()),\n napScore: z.number().nullable(),\n missingSchemaFields: z.array(z.string()),\n screenshotSaved: NullableString,\n}\n\nexport const ExtractSiteOutputSchema = {\n url: z.string(),\n pageCount: z.number().int().min(0),\n pages: z.array(z.object({\n url: z.string(),\n title: NullableString,\n schemaTypes: z.array(z.string()),\n })),\n durationMs: z.number().min(0),\n}\n\nexport const MapsPlaceIntelOutputSchema = {\n name: z.string(),\n rating: NullableString,\n reviewCount: NullableString,\n category: NullableString,\n address: NullableString,\n phone: NullableString,\n website: NullableString,\n hoursSummary: NullableString,\n bookingUrl: NullableString,\n kgmid: NullableString,\n cidDecimal: NullableString,\n cidUrl: NullableString,\n lat: z.number().nullable(),\n lng: z.number().nullable(),\n reviewsStatus: z.string(),\n reviewsCollected: z.number().int().min(0),\n reviewTopics: z.array(z.object({\n label: z.string(),\n count: z.string(),\n })),\n}\n\nexport const CreditsInfoOutputSchema = {\n balanceCredits: z.number().nullable(),\n matchedCost: z.object({\n label: z.string(),\n credits: z.number(),\n unit: z.string(),\n notes: NullableString,\n }).nullable(),\n costs: z.array(z.object({\n key: z.string(),\n label: z.string(),\n credits: z.number(),\n unit: z.string(),\n notes: NullableString,\n })),\n ledger: z.array(z.object({\n createdAt: z.string(),\n operation: z.string(),\n credits: z.number(),\n description: NullableString,\n })),\n}\n\nexport const MapSiteUrlsOutputSchema = {\n startUrl: z.string(),\n totalFound: z.number().int().min(0),\n truncated: z.boolean(),\n okCount: z.number().int().min(0),\n redirectCount: z.number().int().min(0),\n brokenCount: z.number().int().min(0),\n urls: z.array(z.object({\n url: z.string(),\n status: z.number().int().nullable(),\n })),\n durationMs: z.number().min(0),\n}\n\nexport const YoutubeHarvestOutputSchema = {\n mode: z.string(),\n videoCount: z.number().int().min(0),\n channel: z.object({\n title: NullableString,\n subscriberCount: NullableString,\n }).nullable(),\n videos: z.array(z.object({\n videoId: z.string(),\n title: z.string(),\n channelName: NullableString,\n views: NullableString,\n duration: NullableString,\n url: NullableString,\n })),\n}\n\nexport const FacebookAdSearchOutputSchema = {\n query: z.string(),\n advertiserCount: z.number().int().min(0),\n advertisers: z.array(z.object({\n name: NullableString,\n adCount: z.number().int().nullable(),\n libraryId: NullableString,\n })),\n}\n\nexport const FacebookPageIntelOutputSchema = {\n advertiserName: NullableString,\n totalAds: z.number().int().min(0),\n activeCount: z.number().int().min(0),\n videoCount: z.number().int().min(0),\n imageCount: z.number().int().min(0),\n ads: z.array(z.object({\n libraryId: NullableString,\n status: NullableString,\n creativeType: NullableString,\n headline: NullableString,\n cta: NullableString,\n startDate: NullableString,\n videoUrl: NullableString,\n variations: z.number().int().nullable(),\n })),\n}\n\nexport const CreditsInfoInputSchema = {\n item: z.string().optional().describe('Optional tool, action, or feature to look up, e.g. \"maps reviews\", \"extract_url\", or \"YouTube transcription\"'),\n includeLedger: z.boolean().default(false).describe('Whether to include recent credit ledger entries'),\n}\nexport type CreditsInfoInput = z.infer<ReturnType<typeof z.object<typeof CreditsInfoInputSchema>>>\n\nexport const SearchSerpInputSchema = {\n query: z.string().min(1).describe('Core search topic only. Separate location when possible. If user says \"best dentist in Brooklyn NY serp\", use query=\"best dentist\" and location=\"Brooklyn, NY\".'),\n location: z.string().optional().describe('City, region, or country for geo-targeted results, inferred from user request when present.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location or user language.'),\n hl: z.string().default('en').describe('Google interface/content language inferred from user request.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('SERP device context. Use desktop by default; use mobile only when the user asks for mobile rankings.'),\n proxyMode: z.enum(['location', 'configured', 'none']).default('location').describe('Proxy targeting mode. Use location by default so city/state searches create or reuse a matching residential proxy. Use configured for the static configured proxy. Use none only for direct-network debugging.'),\n proxyZip: z.string().regex(/^\\d{5}$/).optional().describe('Optional US ZIP override for residential location proxy targeting. Use only when the user gives a specific ZIP or city-center proxy targeting needs to be forced.'),\n debug: z.boolean().default(false).describe('Include sanitized browser/session/location diagnostics in the response. Use true when debugging localization, CAPTCHA, or proxy behavior.'),\n pages: z.number().int().min(1).max(2).default(1).describe('Number of result pages to fetch (1–2)'),\n}\nexport type SearchSerpInput = z.infer<ReturnType<typeof z.object<typeof SearchSerpInputSchema>>>\n\nexport const CaptureSerpSnapshotInputSchema = {\n query: z.string().min(1).describe('Core search query to capture as a structured SERP Intelligence snapshot. Separate the place into location when the user gives a city, region, country, or ZIP.'),\n location: z.string().optional().describe('City, region, country, or service area used for localized Google results. MCP Scraper records location evidence; UULE alone is not proof of localization.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from the requested market, e.g. us, gb, ca, au.'),\n hl: z.string().default('en').describe('Google interface/content language inferred from the user request.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('SERP device context. Use mobile only when the user asks for mobile rankings or mobile SERP evidence.'),\n proxyMode: z.enum(['location', 'configured', 'none']).default('location').describe('Proxy behavior for capture. Use location for localized residential proxy targeting, configured for the static residential proxy, and none only for direct-network debugging.'),\n proxyZip: z.string().regex(/^\\d{5}$/).optional().describe('Optional US ZIP override for residential location proxy targeting when a precise city-center or ZIP proxy is needed.'),\n pages: z.number().int().min(1).max(2).default(1).describe('Number of Google result pages to capture. Use 1 normally and 2 only when the user needs deeper ranking evidence.'),\n debug: z.boolean().default(false).describe('Include sanitized browser, proxy, and location diagnostics. Use true when debugging localization, CAPTCHA, proxy selection, or capture reliability.'),\n includePageSnapshots: z.boolean().default(false).describe('Also capture ranking-page snapshots for selected SERP URLs through the same product capture path.'),\n pageSnapshotLimit: z.number().int().min(0).max(10).default(0).describe('Maximum ranking-page snapshots to capture when includePageSnapshots is true. Use 0 when only SERP evidence is needed.'),\n}\nexport type CaptureSerpSnapshotInput = z.infer<ReturnType<typeof z.object<typeof CaptureSerpSnapshotInputSchema>>>\n\nexport const ScreenshotInputSchema = {\n url: z.string().url().describe('URL to capture as a full-page screenshot. Use http or https. Pass allowLocal: true to capture localhost or private-network URLs during development.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('Viewport profile. desktop = 1440×900. mobile = 390×844. Use desktop by default; use mobile when the user asks for a mobile view.'),\n allowLocal: z.boolean().default(false).describe('Allow localhost and private-network URLs (127.x, 192.168.x, 10.x, etc.). For local development only — not for production use.'),\n}\nexport type ScreenshotInput = z.infer<ReturnType<typeof z.object<typeof ScreenshotInputSchema>>>\n\nexport const CaptureSerpPageSnapshotsInputSchema = {\n urls: z.array(z.string().url()).min(1).max(25).describe('Public HTTP/HTTPS URLs to capture as SERP Intelligence page snapshots. Do not pass localhost, private IPs, file URLs, or internal admin URLs.'),\n targets: z.array(z.object({\n url: z.string().url().describe('Public HTTP/HTTPS URL to capture.'),\n sourceKind: z.enum(['organic', 'ai_citation', 'local_pack_website', 'configured_target', 'site_subject']).default('configured_target').describe('Why this page is being captured for SERP Intelligence evidence.'),\n sourcePosition: z.number().int().min(1).optional().describe('Ranking or citation position when the page came from SERP evidence.'),\n }).strict()).min(1).max(25).optional().describe('Structured page snapshot targets. Use this instead of urls when source kind or position should be preserved.'),\n maxConcurrency: z.number().int().min(1).max(5).default(2).describe('Parallel page captures. Use 2 normally; higher values can increase proxy/browser pressure.'),\n timeoutMs: z.number().int().min(1_000).max(60_000).default(15_000).describe('Per-page capture timeout in milliseconds. Increase for slow pages; timeout artifacts are returned as structured capture failures.'),\n debug: z.boolean().default(false).describe('Include sanitized browser/proxy diagnostics for page snapshot debugging. Use true for capture, network, or proxy troubleshooting.'),\n}\nexport type CaptureSerpPageSnapshotsInput = z.infer<ReturnType<typeof z.object<typeof CaptureSerpPageSnapshotsInputSchema>>>\n"],"mappings":"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","names":["import_node_fs","import_node_os","import_node_path","baseUrl","apiKey","import_node_fs","import_node_path","server","executor"]}
1
+ {"version":3,"sources":["../../bin/mcp-stdio-server.ts","../../src/harvest-timeout.ts","../../src/mcp/http-mcp-tool-executor.ts","../../src/mcp/paa-mcp-server.ts","../../src/version.ts","../../src/mcp/mcp-response-formatter.ts","../../src/errors.ts","../../src/mcp/mcp-tool-schemas.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { HttpMcpToolExecutor } from '../src/mcp/http-mcp-tool-executor.js'\nimport { buildPaaExtractorMcpServer } from '../src/mcp/paa-mcp-server.js'\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.MCP_SCRAPER_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.mcp-scraper-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {}\n }\n return undefined\n}\n\nconst apiKey = (\n process.env.MCP_SCRAPER_API_KEY ??\n process.env.MCP_SCRAPER_KEY ??\n process.env.MCP_API_KEY ??\n readApiKeyFile()\n)?.trim()\nif (!apiKey) {\n process.stderr.write('MCP_SCRAPER_API_KEY env var or ~/.mcp-scraper-key is required\\n')\n process.exit(1)\n}\n\nconst baseUrl = process.env.MCP_SCRAPER_BASE_URL?.trim() ?? process.env.MCP_BASE_URL?.trim() ?? 'https://mcpscraper.dev'\nconst executor = new HttpMcpToolExecutor(baseUrl, apiKey)\nconst server = buildPaaExtractorMcpServer(executor)\nconst transport = new StdioServerTransport()\n\nasync function main() {\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n process.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n","export const VERCEL_FUNCTION_MAX_MS = 300_000\n\nexport const CLIENT_OVER_SERVER_MARGIN_MS = 15_000\n\nexport interface HarvestTimeoutBudget {\n serverMs: number\n clientMs: number\n}\n\nexport function harvestTimeoutBudget(maxQuestions: number, serpOnly = false): HarvestTimeoutBudget {\n const requested = Number.isFinite(maxQuestions) && maxQuestions > 0 ? Math.trunc(maxQuestions) : 30\n let serverMs: number\n if (serpOnly || requested <= 50) serverMs = 110_000\n else if (requested <= 100) serverMs = 180_000\n else if (requested <= 150) serverMs = 240_000\n else serverMs = 280_000\n const clientMs = Math.min(serverMs + CLIENT_OVER_SERVER_MARGIN_MS, VERCEL_FUNCTION_MAX_MS - 5_000)\n return { serverMs, clientMs }\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { IMcpToolExecutor, ISerpIntelligenceToolExecutor } from './IMcpToolExecutor.js'\nimport { harvestTimeoutBudget } from '../harvest-timeout.js'\nimport type {\n HarvestPaaInput,\n SearchSerpInput,\n ExtractUrlInput,\n MapSiteUrlsInput,\n ExtractSiteInput,\n YoutubeHarvestInput,\n YoutubeTranscribeInput,\n FacebookPageIntelInput,\n FacebookAdSearchInput,\n FacebookAdTranscribeInput,\n MapsPlaceIntelInput,\n MapsSearchInput,\n CreditsInfoInput,\n CaptureSerpSnapshotInput,\n CaptureSerpPageSnapshotsInput,\n} from './mcp-tool-schemas.js'\n\nexport class HttpMcpToolExecutor implements IMcpToolExecutor, ISerpIntelligenceToolExecutor {\n private readonly baseUrl: string\n private readonly apiKey: string\n private readonly timeoutMs: number\n private readonly httpTimeoutOverrideMs: number | null\n private readonly serpIntelligenceTimeoutMs: number\n\n constructor(baseUrl: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n this.apiKey = apiKey\n const rawOverride = process.env.MCP_SCRAPER_HTTP_TIMEOUT_MS\n const parsedOverride = rawOverride === undefined ? NaN : Number(rawOverride)\n this.httpTimeoutOverrideMs = Number.isFinite(parsedOverride) && parsedOverride > 0 ? parsedOverride : null\n this.timeoutMs = this.httpTimeoutOverrideMs ?? 110_000\n const configuredSerpIntelligenceTimeoutMs = Number(process.env.MCP_SCRAPER_SERP_INTELLIGENCE_HTTP_TIMEOUT_MS ?? this.timeoutMs)\n this.serpIntelligenceTimeoutMs = Number.isFinite(configuredSerpIntelligenceTimeoutMs) && configuredSerpIntelligenceTimeoutMs > 0\n ? configuredSerpIntelligenceTimeoutMs\n : this.timeoutMs\n }\n\n private async call(path: string, body: Record<string, unknown>, timeoutMs = this.timeoutMs): Promise<CallToolResult> {\n try {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n })\n const data = await res.json()\n if (!res.ok) {\n return { content: [{ type: 'text', text: JSON.stringify(data) }], isError: true }\n }\n return { content: [{ type: 'text', text: JSON.stringify(data) }] }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (err instanceof DOMException && err.name === 'TimeoutError') {\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n error: 'mcp_request_timeout',\n error_type: 'timeout',\n retryable: true,\n path,\n timeoutMs,\n message: `MCP Scraper request exceeded ${Math.round(timeoutMs / 1000)}s and was cancelled. Retry with fewer results or use the async API for deep harvests.`,\n }),\n }],\n isError: true,\n }\n }\n return { content: [{ type: 'text', text: msg }], isError: true }\n }\n }\n\n harvestPaa(input: HarvestPaaInput): Promise<CallToolResult> {\n const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(input.maxQuestions ?? 30).clientMs\n return this.call('/harvest/sync', input as Record<string, unknown>, timeoutMs)\n }\n\n searchSerp(input: SearchSerpInput): Promise<CallToolResult> {\n const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(0, true).clientMs\n return this.call('/harvest/sync', { ...input, serpOnly: true } as Record<string, unknown>, timeoutMs)\n }\n\n extractUrl(input: ExtractUrlInput): Promise<CallToolResult> {\n return this.call('/extract-url', input as Record<string, unknown>)\n }\n\n mapSiteUrls(input: MapSiteUrlsInput): Promise<CallToolResult> {\n return this.call('/map-urls', input as Record<string, unknown>)\n }\n\n extractSite(input: ExtractSiteInput): Promise<CallToolResult> {\n return this.call('/extract-site', input as Record<string, unknown>)\n }\n\n youtubeHarvest(input: YoutubeHarvestInput): Promise<CallToolResult> {\n return this.call('/youtube/harvest', input as Record<string, unknown>)\n }\n\n youtubeTranscribe(input: YoutubeTranscribeInput): Promise<CallToolResult> {\n return this.call('/youtube/transcribe', input as Record<string, unknown>)\n }\n\n facebookPageIntel(input: FacebookPageIntelInput): Promise<CallToolResult> {\n return this.call('/facebook/page-intel', input as Record<string, unknown>)\n }\n\n facebookAdSearch(input: FacebookAdSearchInput): Promise<CallToolResult> {\n return this.call('/facebook/search', input as Record<string, unknown>)\n }\n\n facebookAdTranscribe(input: FacebookAdTranscribeInput): Promise<CallToolResult> {\n return this.call('/facebook/transcribe', input as Record<string, unknown>)\n }\n\n mapsPlaceIntel(input: MapsPlaceIntelInput): Promise<CallToolResult> {\n return this.call('/maps/place', input as Record<string, unknown>)\n }\n\n mapsSearch(input: MapsSearchInput): Promise<CallToolResult> {\n return this.call('/maps/search', input as Record<string, unknown>)\n }\n\n creditsInfo(input: CreditsInfoInput): Promise<CallToolResult> {\n return this.call('/billing/credits', input as Record<string, unknown>)\n }\n\n captureSerpSnapshot(input: CaptureSerpSnapshotInput): Promise<CallToolResult> {\n return this.call('/serp-intelligence/capture', input as Record<string, unknown>, this.serpIntelligenceTimeoutMs)\n }\n\n captureSerpPageSnapshots(input: CaptureSerpPageSnapshotsInput): Promise<CallToolResult> {\n return this.call('/serp-intelligence/page-snapshots', input as Record<string, unknown>, this.serpIntelligenceTimeoutMs)\n }\n\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join } from 'node:path'\nimport type { IMcpToolExecutor } from './IMcpToolExecutor.js'\nimport { PACKAGE_VERSION } from '../version.js'\nimport { outputBaseDir } from './mcp-response-formatter.js'\nimport {\n HarvestPaaInputSchema,\n SearchSerpInputSchema,\n ExtractUrlInputSchema,\n HarvestPaaOutputSchema,\n SearchSerpOutputSchema,\n ExtractUrlOutputSchema,\n ExtractSiteOutputSchema,\n MapsPlaceIntelOutputSchema,\n CreditsInfoOutputSchema,\n MapSiteUrlsInputSchema,\n MapSiteUrlsOutputSchema,\n ExtractSiteInputSchema,\n YoutubeHarvestInputSchema,\n YoutubeHarvestOutputSchema,\n YoutubeTranscribeInputSchema,\n FacebookPageIntelInputSchema,\n FacebookPageIntelOutputSchema,\n FacebookAdSearchInputSchema,\n FacebookAdSearchOutputSchema,\n FacebookAdTranscribeInputSchema,\n MapsPlaceIntelInputSchema,\n MapsSearchInputSchema,\n MapsSearchOutputSchema,\n CreditsInfoInputSchema,\n} from './mcp-tool-schemas.js'\nimport {\n formatHarvestPaa,\n formatSearchSerp,\n formatExtractUrl,\n formatMapSiteUrls,\n formatExtractSite,\n formatYoutubeHarvest,\n formatYoutubeTranscribe,\n formatFacebookPageIntel,\n formatFacebookAdSearch,\n formatFacebookAdTranscribe,\n formatMapsPlaceIntel,\n formatMapsSearch,\n formatCreditsInfo,\n} from './mcp-response-formatter.js'\n\nexport interface BuildMcpServerOptions {\n savesReportsLocally?: boolean\n}\n\nexport function liveWebToolAnnotations(title: string) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n }\n}\n\nfunction listSavedReports(): Array<{ filename: string; mtimeMs: number }> {\n try {\n const dir = outputBaseDir()\n return readdirSync(dir)\n .filter(f => f.endsWith('.md'))\n .map(f => ({ filename: f, mtimeMs: statSync(join(dir, f)).mtimeMs }))\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, 100)\n } catch {\n return []\n }\n}\n\nfunction registerSavedReportResources(server: McpServer): void {\n server.registerResource(\n 'saved-report',\n new ResourceTemplate('report://{filename}', {\n list: () => ({\n resources: listSavedReports().map(r => ({\n uri: `report://${encodeURIComponent(r.filename)}`,\n name: r.filename,\n mimeType: 'text/markdown',\n })),\n }),\n }),\n {\n title: 'Saved MCP Scraper Reports',\n description: 'Markdown research reports saved by previous MCP Scraper tool calls. Read a report to reuse prior research without re-scraping or spending credits.',\n mimeType: 'text/markdown',\n },\n async (uri, variables) => {\n const requested = Array.isArray(variables.filename) ? variables.filename[0] : variables.filename\n const filename = basename(decodeURIComponent(String(requested ?? '')))\n if (!filename.endsWith('.md')) throw new Error('Only saved .md reports can be read')\n const text = readFileSync(join(outputBaseDir(), filename), 'utf8')\n return { contents: [{ uri: uri.href, mimeType: 'text/markdown', text }] }\n },\n )\n}\n\nexport function buildPaaExtractorMcpServer(\n executor: IMcpToolExecutor,\n options: BuildMcpServerOptions = {},\n): McpServer {\n const savesReports = options.savesReportsLocally !== false\n const reportNote = savesReports\n ? ' Saves a full Markdown report locally.'\n : ' Reports are returned inline; no files are saved on this hosted endpoint.'\n const withReportNote = (description: string) => `${description}${reportNote}`\n\n const server = new McpServer({ name: 'mcp-scraper', version: PACKAGE_VERSION })\n\n if (savesReports) registerSavedReportResources(server)\n\n server.registerTool('harvest_paa', {\n title: 'Google PAA + SERP Harvest',\n description: withReportNote('Best default tool for Google search research. Extracts People Also Ask questions plus answers/source URLs, organic SERP, local pack when present, entity IDs (CID/GCID/KG MID), and AI Overview. Infer the user language: split topic from location (e.g. \"best hvac company in Denver CO\" => query \"best hvac company\", location \"Denver, CO\", gl \"us\", hl \"en\"). Use maxQuestions 30 normally, 100-200 for \"full\", \"deep\", \"all\", or comprehensive research. Deep harvests above 100 questions can run for several minutes with no interim progress — warn the user before starting one and keep maxQuestions at or below 100 unless they explicitly want a deep harvest. Credits are charged by extracted question; unused request hold is refunded.'),\n inputSchema: HarvestPaaInputSchema,\n outputSchema: HarvestPaaOutputSchema,\n annotations: liveWebToolAnnotations('Google PAA + SERP Harvest'),\n }, async (input) => formatHarvestPaa(await executor.harvestPaa(input), input))\n\n server.registerTool('search_serp', {\n title: 'Google SERP Lookup',\n description: withReportNote('Fast Google SERP lookup without PAA expansion. Use when the user asks for rankings, organic results, local pack, quick SERP, or positions. Split topic from location and infer gl/hl from the user request.'),\n inputSchema: SearchSerpInputSchema,\n outputSchema: SearchSerpOutputSchema,\n annotations: liveWebToolAnnotations('Google SERP Lookup'),\n }, async (input) => formatSearchSerp(await executor.searchSerp(input), input))\n\n server.registerTool('extract_url', {\n title: 'Single URL Extract',\n description: withReportNote('Extract structured data from one public URL: page content as Markdown, heading structure, JSON-LD schema, entity details, NAP score, metadata, and missing schema fields. Use when the user provides a single URL or asks to inspect/scrape one page.'),\n inputSchema: ExtractUrlInputSchema,\n outputSchema: ExtractUrlOutputSchema,\n annotations: liveWebToolAnnotations('Single URL Extract'),\n }, async (input) => formatExtractUrl(await executor.extractUrl(input), input))\n\n server.registerTool('map_site_urls', {\n title: 'Site URL Map',\n description: withReportNote('Map/crawl a public website to build a URL inventory with HTTP status codes, broken links, redirects, and site scope. Use before extract_site for audits or when the user asks for a sitemap/URL inventory.'),\n inputSchema: MapSiteUrlsInputSchema,\n outputSchema: MapSiteUrlsOutputSchema,\n annotations: liveWebToolAnnotations('Site URL Map'),\n }, async (input) => formatMapSiteUrls(await executor.mapSiteUrls(input), input))\n\n server.registerTool('extract_site', {\n title: 'Multi-Page Site Extract',\n description: withReportNote('Run multi-page extraction across a public website. Returns per-page titles, H1s, metadata, headings, schema/entity data, canonical URLs, and content. Use for website audits, competitor audits, and full-site extraction.'),\n inputSchema: ExtractSiteInputSchema,\n outputSchema: ExtractSiteOutputSchema,\n annotations: liveWebToolAnnotations('Multi-Page Site Extract'),\n }, async (input) => formatExtractSite(await executor.extractSite(input), input))\n\n server.registerTool('youtube_harvest', {\n title: 'YouTube Video Harvest',\n description: withReportNote('Harvest YouTube video metadata by search query or channel handle/ID/URL. Use mode \"search\" for keyword/topic requests and mode \"channel\" for @handles, channel IDs, or channel URLs. Returns titles, views, dates, durations, URLs, thumbnails, and videoIds for follow-up transcription.'),\n inputSchema: YoutubeHarvestInputSchema,\n outputSchema: YoutubeHarvestOutputSchema,\n annotations: liveWebToolAnnotations('YouTube Video Harvest'),\n }, async (input) => formatYoutubeHarvest(await executor.youtubeHarvest(input), input))\n\n server.registerTool('youtube_transcribe', {\n title: 'YouTube Transcription',\n description: withReportNote('Fetch and transcribe captions from a YouTube video. Returns full transcript, timestamped chunks, and word count. Pass a videoId from youtube_harvest results or infer it from a YouTube URL if the user provided one.'),\n inputSchema: YoutubeTranscribeInputSchema,\n annotations: liveWebToolAnnotations('YouTube Transcription'),\n }, async (input) => formatYoutubeTranscribe(await executor.youtubeTranscribe(input), input))\n\n server.registerTool('facebook_page_intel', {\n title: 'Facebook Advertiser Ad Intel',\n description: withReportNote('Harvest ads from a Facebook advertiser. Returns ad copy, headlines, CTAs, creative type, status, landing URLs, and video URLs ready for transcription. Accepts pageId, libraryId, or a brand/advertiser name as query. Use after facebook_ad_search when possible.'),\n inputSchema: FacebookPageIntelInputSchema,\n outputSchema: FacebookPageIntelOutputSchema,\n annotations: liveWebToolAnnotations('Facebook Advertiser Ad Intel'),\n }, async (input) => formatFacebookPageIntel(await executor.facebookPageIntel(input), input))\n\n server.registerTool('facebook_ad_search', {\n title: 'Facebook Ad Library Search',\n description: withReportNote('Search Facebook Ad Library by brand, advertiser, competitor, niche, or keyword. Returns advertisers with ad counts and library IDs. Use to discover competitors, then pass libraryId to facebook_page_intel.'),\n inputSchema: FacebookAdSearchInputSchema,\n outputSchema: FacebookAdSearchOutputSchema,\n annotations: liveWebToolAnnotations('Facebook Ad Library Search'),\n }, async (input) => formatFacebookAdSearch(await executor.facebookAdSearch(input), input))\n\n server.registerTool('facebook_ad_transcribe', {\n title: 'Facebook Ad Transcription',\n description: 'Transcribe audio from a Facebook ad video. Returns full transcript and timestamped chunks. Use the videoUrl value from facebook_page_intel results.',\n inputSchema: FacebookAdTranscribeInputSchema,\n annotations: liveWebToolAnnotations('Facebook Ad Transcription'),\n }, async (input) => formatFacebookAdTranscribe(await executor.facebookAdTranscribe(input), input))\n\n server.registerTool('maps_place_intel', {\n title: 'Google Maps Business Profile Details',\n description: withReportNote('Extract Google Maps business intelligence for one known/named business: rating, review count, category, address, phone, website, hours, booking URL, review histogram, review topics, about attributes, entity IDs, and optional review cards. Do not use this for category searches, local market prospect lists, or requests for multiple GMB/GBP profiles; use maps_search first for those. Split business name from location (e.g. \"Elite Roofing Denver CO\" => businessName \"Elite Roofing\", location \"Denver, CO\"). Pass includeReviews true when the user asks for reviews/customer pain.'),\n inputSchema: MapsPlaceIntelInputSchema,\n outputSchema: MapsPlaceIntelOutputSchema,\n annotations: liveWebToolAnnotations('Google Maps Business Profile Details'),\n }, async (input) => formatMapsPlaceIntel(await executor.mapsPlaceIntel(input), input))\n\n server.registerTool('maps_search', {\n title: 'Google Maps Business Search',\n description: withReportNote('Search Google Maps for multiple businesses/profiles by category, niche, keyword, or local market. Use this when the user asks for several Google Business Profiles, GMBs, GBPs, leads, prospects, competitors, or \"more than the 3-pack.\" Returns up to 50 candidates with names, place URLs, CIDs when available, ratings, review counts, and profile metadata. Default maxResults is 10; maximum is 50. Use maps_place_intel afterward only when a selected business needs full details and reviews.'),\n inputSchema: MapsSearchInputSchema,\n outputSchema: MapsSearchOutputSchema,\n annotations: liveWebToolAnnotations('Google Maps Business Search'),\n }, async (input) => formatMapsSearch(await executor.mapsSearch(input), input))\n\n server.registerTool('credits_info', {\n title: 'MCP Scraper Credits & Costs',\n description: 'Answer questions about MCP Scraper credits: current credit balance, what a specific tool/action costs, the full cost table, and optionally recent credit ledger entries. Does not expose payment methods or credit card information.',\n inputSchema: CreditsInfoInputSchema,\n outputSchema: CreditsInfoOutputSchema,\n annotations: {\n title: 'MCP Scraper Credits & Costs',\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n }, async (input) => formatCreditsInfo(await executor.creditsInfo(input), input))\n\n return server\n}\n","export const PACKAGE_VERSION = '0.2.0'\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { sanitizeVendorName } from '../errors.js'\n\nlet reportSavingEnabled = true\n\nexport function configureReportSaving(enabled: boolean): void {\n reportSavingEnabled = enabled\n}\n\nfunction sanitizeVendorText(text: string): string {\n return sanitizeVendorName(\n text\n .replace(/kernel_session_id/gi, 'browser_session_id')\n .replace(/kernel_delete_succeeded/gi, 'session_cleanup_succeeded')\n .replace(/kernel_delete_started/gi, 'session_cleanup_started')\n .replace(/kernel_delete_error/gi, 'session_cleanup_error')\n .replace(/kernelSessionId/g, 'browserSessionId')\n .replace(/kernelProxyId/g, 'proxyId')\n .replace(/KERNEL_API_KEY/g, 'BROWSER_SERVICE_API_KEY')\n .replace(/\"kernel\"\\s*:/gi, '\"browserRuntime\":'),\n )\n}\n\nfunction slugifyReportName(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80) || 'mcp-scraper-report'\n}\n\nfunction reportTitle(full: string): string {\n const title = full.split('\\n').find(line => line.startsWith('# '))\n return title?.replace(/^#\\s+/, '').trim() || 'MCP Scraper Report'\n}\n\nexport function outputBaseDir(): string {\n return process.env.MCP_SCRAPER_OUTPUT_DIR?.trim() || join(homedir(), 'Downloads', 'mcp-scraper')\n}\n\nfunction saveFullReport(full: string): string | null {\n if (!reportSavingEnabled || process.env.MCP_SCRAPER_SAVE_REPORTS === 'false') return null\n const outDir = outputBaseDir()\n try {\n mkdirSync(outDir, { recursive: true })\n const stamp = new Date().toISOString().replace(/[:.]/g, '-')\n const file = join(outDir, `${stamp}-${slugifyReportName(reportTitle(full))}.md`)\n writeFileSync(file, full, 'utf8')\n return file\n } catch {\n return null\n }\n}\n\nfunction persistScreenshotLocally(base64: string, url: string): string | null {\n if (!reportSavingEnabled || process.env.MCP_SCRAPER_SAVE_REPORTS === 'false') return null\n try {\n const dir = join(outputBaseDir(), 'screenshots')\n mkdirSync(dir, { recursive: true })\n const stamp = new Date().toISOString().replace(/[:.]/g, '-')\n const slug = url.replace(/^https?:\\/\\//, '').replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '').slice(0, 60)\n const filePath = join(dir, `${stamp}-${slug}.png`)\n writeFileSync(filePath, Buffer.from(base64, 'base64'))\n return filePath\n } catch {\n return null\n }\n}\n\nfunction oneBlock(content: string): CallToolResult {\n const filePath = saveFullReport(content)\n const text = filePath ? `${content}\\n\\n📄 Saved: \\`${filePath}\\`` : content\n return { content: [{ type: 'text', text }] }\n}\n\nexport function passthrough(raw: CallToolResult): CallToolResult {\n return raw\n}\n\nfunction checkInsufficientBalance(raw: CallToolResult): CallToolResult | null {\n const first = raw.content.find(b => b.type === 'text')\n const text = first?.type === 'text' ? first.text : ''\n try {\n const body = JSON.parse(text || '{}') as Record<string, unknown>\n if (body.error === 'insufficient_balance') {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `Insufficient credits. Balance: ${body.balance_credits} credits. This call requires ${body.required_credits} credits. Top up at ${body.topup_url}`,\n }],\n }\n }\n } catch { }\n return null\n}\n\nfunction formatStructuredError(body: Record<string, unknown>, fallback: string): string {\n if (body.error === 'insufficient_balance') {\n return `Insufficient credits. Balance: ${body.balance_credits} credits. This call requires ${body.required_credits} credits. Top up at ${body.topup_url}`\n }\n if (body.error === 'mcp_request_timeout') {\n return typeof body.message === 'string' ? body.message : 'MCP Scraper request timed out and was cancelled.'\n }\n if (typeof body.error_code === 'string') {\n const message = typeof body.error === 'string'\n ? body.error\n : typeof body.message === 'string'\n ? body.message\n : fallback\n const retryable = body.retryable === true ? ' Retryable: yes.' : ''\n return `${body.error_code}: ${message}${retryable}${errorAttemptsSection(body)}`\n }\n if (typeof body.error === 'string') return body.error\n return fallback || 'Tool error'\n}\n\nfunction parseData(raw: CallToolResult): { data: Record<string, unknown> } | { error: string } {\n const first = raw.content.find(b => b.type === 'text')\n const text = first?.type === 'text' ? first.text : ''\n try {\n const parsed = JSON.parse(text || '{}') as Record<string, unknown>\n if (raw.isError || parsed.error || parsed.error_code) return { error: sanitizeVendorText(formatStructuredError(parsed, text)) }\n const data = (parsed.result as Record<string, unknown>) ?? parsed\n return { data }\n } catch {\n if (raw.isError) return { error: sanitizeVendorText(text || 'Tool error') }\n return { error: 'Failed to parse tool response' }\n }\n}\n\nfunction entityIdsSection(ids?: { kgIds?: string[]; cids?: string[]; gcids?: string[] }): string {\n if (!ids) return ''\n const lines: string[] = []\n if (ids.kgIds?.length) lines.push(`- **Knowledge Graph MID:** ${ids.kgIds.join(', ')}`)\n if (ids.cids?.length) lines.push(`- **CID:** ${ids.cids.join(', ')}`)\n if (ids.gcids?.length) lines.push(`- **GCID:** ${ids.gcids.join(', ')}`)\n return lines.length ? `\\n## Entity IDs\\n${lines.join('\\n')}` : ''\n}\n\nfunction truncate(s: string | null | undefined, max: number): string {\n if (!s) return ''\n return s.length > max ? s.slice(0, max) + '…' : s\n}\n\nexport function cell(s: string | null | undefined): string {\n return String(s ?? '')\n .replace(/\\r?\\n+/g, ' ')\n .replace(/\\|/g, '\\\\|')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\nfunction debugSection(debug: any): string {\n if (!debug || typeof debug !== 'object') return ''\n const request = debug.request ?? {}\n const browser = debug.browser ?? {}\n const kernel = browser.browserRuntime ?? browser.kernel ?? {}\n const network = browser.networkLocation ?? {}\n const nav = browser.serpNavigation ?? {}\n const proxyResolution = kernel.proxyResolution ?? {}\n const locationEvidence = debug.locationEvidence\n const candidates = Array.isArray(locationEvidence?.candidates)\n ? locationEvidence.candidates.slice(0, 4).map((c: any) => `${c.city}, ${c.regionCode} (${c.count})`).join(', ')\n : ''\n const lines = [\n '\\n## Debug',\n `- Proxy mode: ${request.proxyMode ?? kernel.proxyMode ?? 'unknown'} · requested proxy: ${kernel.requestedProxyIdPresent === true ? `yes (${kernel.requestedProxyIdSuffix ?? 'redacted'})` : 'no'}`,\n `- Proxy resolution: ${proxyResolution.source ?? 'unknown'}${proxyResolution.target ? ` · ${proxyResolution.target.level ?? 'city'} ${proxyResolution.target.city}, ${proxyResolution.target.state}` : ''}${proxyResolution.error ? ` · ${truncate(proxyResolution.error, 180)}` : ''}`,\n `- Browser session: ${kernel.sessionId ?? 'unknown'} · retrieved proxy: ${kernel.retrievedProxyIdPresent === true ? `yes (${kernel.retrievedProxyIdSuffix ?? 'redacted'})` : kernel.retrievedProxyIdPresent === false ? 'no' : 'unknown'}`,\n `- Browser IP geo: ${[network.ip, network.city, network.region, network.country].filter(Boolean).join(' · ') || network.error || 'unknown'}`,\n `- Google URL: ${truncate(nav.requestedUrl, 240) || 'unknown'}`,\n `- Final URL: ${truncate(nav.finalUrl, 240) || 'unknown'} · CAPTCHA: ${nav.captchaDetected === true ? 'yes' : nav.captchaDetected === false ? 'no' : 'unknown'} · redirected: ${nav.redirected === true ? 'yes' : nav.redirected === false ? 'no' : 'unknown'}`,\n ]\n if (locationEvidence) {\n lines.push(`- Location evidence: ${locationEvidence.status}${locationEvidence.expected ? ` · expected ${locationEvidence.expected.city}${locationEvidence.expected.regionCode ? `, ${locationEvidence.expected.regionCode}` : ''}` : ''}${candidates ? ` · candidates ${candidates}` : ''}`)\n }\n return sanitizeVendorText(lines.join('\\n'))\n}\n\nfunction errorAttemptsSection(body: Record<string, unknown>): string {\n const attempts = Array.isArray(body.attempts) ? body.attempts as Array<Record<string, any>> : []\n if (attempts.length === 0) return ''\n const lines = attempts.slice(0, 5).map((attempt) => {\n const debug = attempt.debug ?? {}\n const browser = debug.browser ?? {}\n const kernel = browser.browserRuntime ?? browser.kernel ?? {}\n const proxyResolution = kernel.proxyResolution ?? {}\n const network = browser.networkLocation ?? {}\n const nav = browser.serpNavigation ?? {}\n const geo = [network.ip, network.city, network.region].filter(Boolean).join(' / ') || 'geo unknown'\n const sessionId = attempt.browser_session_id ?? attempt.kernel_session_id ?? kernel.sessionId ?? 'unknown'\n const cleanupSucceeded = attempt.session_cleanup_succeeded ?? attempt.kernel_delete_succeeded\n return `- Attempt ${attempt.attempt_number ?? '?'}: ${attempt.outcome ?? attempt.status ?? 'unknown'} · session ${sessionId} · proxy ${debug.request?.proxyMode ?? kernel.proxyMode ?? 'unknown'}${proxyResolution.source ? `/${proxyResolution.source}` : ''} · ${geo} · CAPTCHA ${nav.captchaDetected === true ? 'yes' : nav.captchaDetected === false ? 'no' : 'unknown'} · cleanup ${cleanupSucceeded === true ? 'yes' : cleanupSucceeded === false ? 'no' : 'unknown'}`\n })\n return `\\n\\nAttempts:\\n${lines.join('\\n')}`\n}\n\ninterface FlatRow { question: string; answer?: string; source_site?: string; source_title?: string }\ninterface OrganicResult { position: number; title: string; url: string; domain: string; snippet?: string | null }\ninterface AIOverview { detected: boolean; text?: string | null }\ninterface HarvestDiagnostics { completionStatus?: string; debug?: unknown }\n\nexport function formatHarvestPaa(\n raw: CallToolResult,\n input: { query: string; maxQuestions?: number; location?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data\n\n const flat = (d.flat as FlatRow[]) ?? []\n const organic = (d.organicResults as OrganicResult[]) ?? []\n const entityIds = d.entityIds as { kgIds?: string[]; cids?: string[]; gcids?: string[] } | undefined\n const aiOvw = d.aiOverview as AIOverview | undefined\n const diagnostics = d.diagnostics as HarvestDiagnostics | undefined\n const durationMs = (d.stats as { durationMs?: number } | undefined)?.durationMs\n\n const paaRows = flat.map((r, i) =>\n `| ${i + 1} | ${cell(r.question)} | ${cell(truncate(r.answer, 120))} | ${cell(r.source_title || r.source_site || '')} |`,\n ).join('\\n')\n\n const paaTable = flat.length\n ? `## People Also Ask (${flat.length} questions)\\n| # | Question | Answer | Source |\\n|---|----------|--------|--------|\\n${paaRows}`\n : '## People Also Ask\\n*Google did not return a People Also Ask block for this query/location. SERP data was extracted successfully when available.*'\n\n const serpRows = organic.map(r =>\n `| ${r.position} | ${cell(r.title)} | [${cell(r.domain)}](${r.url}) | ${cell(truncate(r.snippet, 100))} |`,\n ).join('\\n')\n\n const serpTable = organic.length\n ? `\\n## Organic Results (${organic.length})\\n| # | Title | URL | Snippet |\\n|---|-------|-----|----------|\\n${serpRows}`\n : ''\n\n const aiSection = aiOvw?.detected && aiOvw.text\n ? `\\n## AI Overview\\n> ${truncate(aiOvw.text, 600)}`\n : ''\n\n const statsLine = durationMs\n ? `\\n## Stats\\n- Status: ${diagnostics?.completionStatus ?? (flat.length ? 'paa_found' : 'no_paa')} · Questions: ${flat.length} · Duration: ${(durationMs / 1000).toFixed(1)}s`\n : ''\n\n const tips = `\\n---\\n💡 **Tips**\\n- Max questions: \\`maxQuestions: 200\\` (current: ${input.maxQuestions ?? 30})\\n- Organic results only: use \\`search_serp\\`\\n- Dig into a result: use \\`extract_url\\` on any organic URL`\n\n const full = `# PAA Report: \"${input.query}\"${input.location ? ` · ${input.location}` : ''}\\n\\n${paaTable}${serpTable}${entityIdsSection(entityIds)}${aiSection}${statsLine}${debugSection(diagnostics?.debug)}${tips}`\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: input.query,\n location: input.location ?? null,\n questionCount: flat.length,\n completionStatus: diagnostics?.completionStatus ?? null,\n questions: flat.map(r => ({\n question: String(r.question ?? ''),\n answer: r.answer ?? null,\n sourceTitle: r.source_title ?? null,\n sourceSite: r.source_site ?? null,\n })),\n organicResults: organic.map(r => ({\n position: Number(r.position) || 0,\n title: String(r.title ?? ''),\n url: String(r.url ?? ''),\n domain: String(r.domain ?? ''),\n snippet: r.snippet ?? null,\n })),\n aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null } : null,\n entityIds: entityIds\n ? { kgIds: entityIds.kgIds ?? [], cids: entityIds.cids ?? [], gcids: entityIds.gcids ?? [] }\n : null,\n durationMs: durationMs ?? null,\n },\n }\n}\n\ninterface LocalBusiness { position: number; name: string; rating?: string | null; reviewCount?: string | null; websiteUrl?: string | null }\n\nexport function formatSearchSerp(\n raw: CallToolResult,\n input: { query: string; location?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data\n\n const organic = (d.organicResults as OrganicResult[]) ?? []\n const localPack = (d.localPack as LocalBusiness[]) ?? []\n const entityIds = d.entityIds as { kgIds?: string[]; cids?: string[]; gcids?: string[] } | undefined\n const aiOvw = d.aiOverview as AIOverview | undefined\n const diagnostics = d.diagnostics as HarvestDiagnostics | undefined\n\n const serpRows = organic.map(r =>\n `| ${r.position} | ${cell(r.title)} | [${cell(r.domain)}](${r.url}) | ${cell(truncate(r.snippet, 100))} |`,\n ).join('\\n')\n\n const serpTable = organic.length\n ? `## Organic Results (${organic.length})\\n| # | Title | URL | Snippet |\\n|---|-------|-----|----------|\\n${serpRows}`\n : '## Organic Results\\n*None found*'\n\n const localRows = localPack.map(b =>\n `| ${b.position} | ${cell(b.name)} | ${b.rating ?? '—'} (${b.reviewCount ?? '0'}) | ${b.websiteUrl ? `[link](${b.websiteUrl})` : '—'} |`,\n ).join('\\n')\n\n const localSection = localPack.length\n ? `\\n## Local Pack (${localPack.length})\\n| # | Name | Rating | Website |\\n|---|------|--------|---------|\\n${localRows}`\n : ''\n\n const aiSection = aiOvw?.detected && aiOvw.text\n ? `\\n## AI Overview\\n> ${truncate(aiOvw.text, 600)}`\n : ''\n\n const tips = `\\n---\\n💡 **Tips**\\n- Get PAA questions: use \\`harvest_paa\\` for this query\\n- Scrape any result: use \\`extract_url\\`\\n- Business entity IDs (CID/GCID/KG MID) shown above if found`\n\n const full = `# SERP Report: \"${input.query}\"${input.location ? ` · ${input.location}` : ''}\\n\\n${serpTable}${localSection}${entityIdsSection(entityIds)}${aiSection}${debugSection(diagnostics?.debug)}${tips}`\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: input.query,\n location: input.location ?? null,\n organicResults: organic.map(r => ({\n position: Number(r.position) || 0,\n title: String(r.title ?? ''),\n url: String(r.url ?? ''),\n domain: String(r.domain ?? ''),\n snippet: r.snippet ?? null,\n })),\n localPack: localPack.map(b => ({\n position: Number(b.position) || 0,\n name: String(b.name ?? ''),\n rating: b.rating ?? null,\n reviewCount: b.reviewCount ?? null,\n websiteUrl: b.websiteUrl ?? null,\n })),\n aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null } : null,\n entityIds: entityIds\n ? { kgIds: entityIds.kgIds ?? [], cids: entityIds.cids ?? [], gcids: entityIds.gcids ?? [] }\n : null,\n },\n }\n}\n\ninterface Heading { level: number; text: string }\ninterface KpoResult {\n entityName?: string | null; type?: string[]; napScore?: number\n address?: string | null; phone?: string | null; email?: string | null\n sameAs?: string[]; missingFields?: string[]; faqCount?: number\n}\n\nexport function formatExtractUrl(raw: CallToolResult, input: { url: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data\n\n const url = (d.url as string) ?? input.url\n const title = (d.title as string | null) ?? 'Untitled'\n const headings = (d.headings as Heading[]) ?? []\n const kpo = d.kpo as KpoResult | undefined\n const bodyMd = (d.bodyMarkdown as string | null) ?? ''\n const schema = d.schema as unknown[]\n const screenshotMeta = d.screenshot as { base64: string; sizeBytes: number; device: string } | null | undefined\n const screenshotPath = screenshotMeta?.base64 ? persistScreenshotLocally(screenshotMeta.base64, url) : null\n const branding = d.branding as { colorScheme: string | null; colors: Record<string, string | null>; fonts: Record<string, string | null>; assets: Record<string, string | null> } | null | undefined\n const media = d.media as { outputDir: string | null; assets: unknown[]; filteredCount: number; totalFound: number } | null | undefined\n\n const h1Lines = headings.filter(h => h.level === 1).map(h => `- ${h.text}`).join('\\n')\n const h2Lines = headings.filter(h => h.level === 2).map(h => ` - ${h.text}`).join('\\n')\n const headingSection = (h1Lines || h2Lines)\n ? `\\n## Heading Structure\\n${[h1Lines, h2Lines].filter(Boolean).join('\\n')}`\n : ''\n\n const kpoSection = kpo ? [\n `\\n## Entity / Schema`,\n kpo.entityName ? `- **Entity:** ${kpo.entityName}` : '',\n kpo.type?.length ? `- **@type:** ${kpo.type.join(', ')}` : '',\n kpo.napScore !== undefined ? `- **NAP Score:** ${kpo.napScore}/5` : '',\n kpo.address ? `- **Address:** ${kpo.address}` : '',\n kpo.phone ? `- **Phone:** ${kpo.phone}` : '',\n kpo.email ? `- **Email:** ${kpo.email}` : '',\n kpo.faqCount ? `- **FAQ items:** ${kpo.faqCount}` : '',\n kpo.sameAs?.length ? `- **sameAs:** ${kpo.sameAs.slice(0, 5).join(', ')}` : '',\n kpo.missingFields?.length ? `\\n**Missing schema fields:** ${kpo.missingFields.slice(0, 5).join(', ')}` : '',\n ].filter(Boolean).join('\\n') : ''\n\n const bodySection = bodyMd\n ? `\\n## Page Content\\n${bodyMd.slice(0, 3000)}${bodyMd.length > 3000 ? '\\n\\n*(truncated)*' : ''}`\n : ''\n\n const screenshotSection = screenshotMeta\n ? `\\n## Screenshot\\n- **File:** ${screenshotPath ?? '(returned inline only — disk write unavailable in this environment)'}\\n- **Size:** ${(screenshotMeta.sizeBytes / 1024).toFixed(1)} KB\\n- **Device:** ${screenshotMeta.device}`\n : ''\n\n const brandingSection = branding\n ? [\n `\\n## Branding`,\n branding.colorScheme ? `- **Color scheme:** ${branding.colorScheme}` : '',\n `- **Colors:**${Object.entries(branding.colors ?? {}).filter(([,v]) => v).map(([k,v]) => ` ${k}=${v}`).join(',') || ' (none extracted)'}`,\n `- **Fonts:**${Object.entries(branding.fonts ?? {}).filter(([,v]) => v).map(([k,v]) => ` ${k}=${v}`).join(',') || ' (none extracted)'}`,\n branding.assets?.logo ? `- **Logo:** ${branding.assets.logo}` : '',\n branding.assets?.favicon ? `- **Favicon:** ${branding.assets.favicon}` : '',\n ].filter(Boolean).join('\\n')\n : ''\n\n const mediaSection = media\n ? [\n `\\n## Media Assets`,\n `- **Found:** ${media.totalFound} total, ${media.filteredCount} filtered (ads/noise), ${media.assets.length} downloaded`,\n media.outputDir ? `- **Saved to:** ${media.outputDir}` : '',\n ].filter(Boolean).join('\\n')\n : ''\n\n const schemaCount = Array.isArray(schema) ? schema.length : 0\n const tips = `\\n---\\n💡 **Tips**\\n- Crawl entire site: use \\`extract_site\\`\\n- Map all URLs: use \\`map_site_urls\\`\\n- ${schemaCount} JSON-LD schema block(s) detected`\n\n const full = `# URL Extract: ${url}\\n**${title}**\\n${headingSection}${kpoSection}${brandingSection}${bodySection}${screenshotSection}${mediaSection}${tips}`\n\n const textResult = oneBlock(full)\n const structuredContent = {\n url,\n title: (d.title as string | null) ?? null,\n headings: headings.map(h => ({ level: Number(h.level) || 0, text: String(h.text ?? '') })),\n schemaBlockCount: schemaCount,\n entityName: kpo?.entityName ?? null,\n entityTypes: kpo?.type ?? [],\n napScore: kpo?.napScore ?? null,\n missingSchemaFields: kpo?.missingFields ?? [],\n screenshotSaved: screenshotPath ?? null,\n }\n\n if (screenshotMeta?.base64) {\n return {\n content: [\n ...(textResult.content),\n { type: 'image', data: screenshotMeta.base64, mimeType: 'image/png' },\n ],\n structuredContent,\n }\n }\n\n return { ...textResult, structuredContent }\n}\n\ninterface DiscoveredUrl { url: string; status: number | null }\ninterface SpiderResult { startUrl: string; urls: DiscoveredUrl[]; totalFound: number; durationMs: number; truncated: boolean }\n\nexport function formatMapSiteUrls(raw: CallToolResult, input: { url: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as SpiderResult\n\n const urls = d.urls ?? []\n const ok = urls.filter(u => (u.status ?? 0) >= 200 && (u.status ?? 0) < 300)\n const broken = urls.filter(u => u.status !== null && u.status >= 400)\n const redirects = urls.filter(u => u.status !== null && u.status >= 300 && u.status < 400)\n\n const urlRows = urls.slice(0, 200).map((u, i) => `| ${i + 1} | ${u.url} | ${u.status ?? '—'} |`).join('\\n')\n\n const full = [\n `# URL Map: ${input.url}`,\n `**${d.totalFound} URLs** · ${(d.durationMs / 1000).toFixed(1)}s${d.truncated ? ' · *truncated*' : ''}`,\n `\\n## Summary\\n- ✅ 2xx: ${ok.length}\\n- 🔀 3xx: ${redirects.length}\\n- ❌ 4xx+: ${broken.length}`,\n `\\n## URL Inventory\\n| # | URL | Status |\\n|---|-----|--------|\\n${urlRows}`,\n broken.length ? `\\n## Broken URLs\\n${broken.map(u => `- ${u.url} (${u.status})`).join('\\n')}` : '',\n `\\n---\\n💡 **Tips**\\n- Extract content from all pages: use \\`extract_site\\`\\n- Scrape a single page: use \\`extract_url\\``,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n startUrl: d.startUrl ?? input.url,\n totalFound: d.totalFound ?? urls.length,\n truncated: d.truncated === true,\n okCount: ok.length,\n redirectCount: redirects.length,\n brokenCount: broken.length,\n urls: urls.map(u => ({ url: u.url, status: u.status ?? null })),\n durationMs: d.durationMs ?? 0,\n },\n }\n}\n\ninterface SitePageResult { url: string; title?: string | null; kpo?: KpoResult; schema?: unknown[] }\ninterface ExtractSiteResult { pages: SitePageResult[]; durationMs?: number }\n\nexport function formatExtractSite(raw: CallToolResult, input: { url: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as ExtractSiteResult\n\n const pages = d.pages ?? []\n\n const pageRows = pages.map((p, i) => {\n const schemaInfo = p.kpo?.type?.join(', ') ?? (Array.isArray(p.schema) && p.schema.length ? `${p.schema.length} block(s)` : '—')\n return `| ${i + 1} | ${cell(p.title ?? 'Untitled')} | ${p.url} | ${schemaInfo} |`\n }).join('\\n')\n\n const full = [\n `# Site Extract: ${input.url}`,\n `**${pages.length} pages** · ${(((d.durationMs ?? 0)) / 1000).toFixed(1)}s`,\n `\\n## Pages\\n| # | Title | URL | Schema |\\n|---|-------|-----|--------|\\n${pageRows}`,\n `\\n---\\n💡 **Tips**\\n- Map URLs first: use \\`map_site_urls\\`\\n- Inspect a single page: use \\`extract_url\\``,\n ].join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n url: input.url,\n pageCount: pages.length,\n pages: pages.map(p => ({\n url: String(p.url ?? ''),\n title: p.title ?? null,\n schemaTypes: p.kpo?.type ?? [],\n })),\n durationMs: d.durationMs ?? 0,\n },\n }\n}\n\ninterface YTVideo { videoId: string; title: string; channelName: string; views?: string | null; duration?: string | null; url: string }\ninterface YTHarvestResult { videos: YTVideo[]; channelMeta?: { title?: string; subscriberCount?: string | null } | null; stats: { durationMs: number } }\n\nexport function formatYoutubeHarvest(\n raw: CallToolResult,\n input: { mode: string; query?: string; channelHandle?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as YTHarvestResult\n\n const videos = d.videos ?? []\n const label = input.mode === 'channel' ? (input.channelHandle ?? 'channel') : `\"${input.query ?? ''}\"`\n\n const videoRows = videos.map((v, i) =>\n `| ${i + 1} | ${cell(truncate(v.title, 70))} | ${cell(v.channelName)} | ${v.views ?? '—'} | ${v.duration ?? '—'} | \\`${v.videoId}\\` |`,\n ).join('\\n')\n\n const channelSection = d.channelMeta\n ? `\\n## Channel\\n- **Name:** ${d.channelMeta.title ?? '—'}\\n- **Subscribers:** ${d.channelMeta.subscriberCount ?? '—'}`\n : ''\n\n const full = [\n `# YouTube Harvest: ${label}`,\n `**${videos.length} videos** · ${(d.stats.durationMs / 1000).toFixed(1)}s`,\n channelSection,\n `\\n## Videos\\n| # | Title | Channel | Views | Duration | Video ID |\\n|---|-------|---------|-------|----------|----------|\\n${videoRows}`,\n `\\n---\\n💡 **Tips**\\n- Transcribe a video: use \\`youtube_transcribe\\` with the \\`videoId\\` above\\n- Switch mode: \\`mode: \"channel\"\\` with \\`channelHandle\\` or \\`mode: \"search\"\\` with \\`query\\``,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n mode: input.mode,\n videoCount: videos.length,\n channel: d.channelMeta\n ? { title: d.channelMeta.title ?? null, subscriberCount: d.channelMeta.subscriberCount ?? null }\n : null,\n videos: videos.map(v => ({\n videoId: String(v.videoId ?? ''),\n title: String(v.title ?? ''),\n channelName: v.channelName ?? null,\n views: v.views ?? null,\n duration: v.duration ?? null,\n url: v.url ?? null,\n })),\n },\n }\n}\n\ninterface TranscriptChunk { timestamp: [number, number]; text: string }\ninterface TranscriptResult { text: string; chunks?: TranscriptChunk[]; durationMs?: number }\n\nexport function formatYoutubeTranscribe(raw: CallToolResult, input: { videoId: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as TranscriptResult\n\n const text = d.text ?? ''\n const chunks = d.chunks ?? []\n const durSec = d.durationMs ? (d.durationMs / 1000).toFixed(0) : '—'\n\n const chunkRows = chunks.slice(0, 50).map(c => {\n const sec = Number.isFinite(c.timestamp[0]) ? Math.floor(c.timestamp[0]) : 0\n const mm = String(Math.floor(sec / 60)).padStart(2, '0')\n const ss = String(sec % 60).padStart(2, '0')\n return `| ${mm}:${ss} | ${cell(truncate(c.text, 120))} |`\n }).join('\\n')\n\n const full = [\n `# YouTube Transcript: \\`${input.videoId}\\``,\n `**Duration:** ${durSec}s · **${text.split(' ').length} words**`,\n `\\n## Full Transcript\\n${text}`,\n chunks.length ? `\\n## Timestamped Chunks\\n| Time | Text |\\n|------|------|\\n${chunkRows}` : '',\n `\\n---\\n💡 Harvest more from this channel: use \\`youtube_harvest\\` with \\`mode: \"channel\"\\``,\n ].filter(Boolean).join('\\n')\n\n return oneBlock(full)\n}\n\ninterface FbAd {\n libraryId?: string; status?: string; creativeType?: string\n headline?: string | null; primaryText?: string | null; cta?: string | null\n startDate?: string | null; videoUrl?: string | null; variations?: number\n}\ninterface FbPageResult {\n advertiserName?: string | null\n summary: { totalAds: number; activeCount: number; videoCount: number; imageCount: number }\n ads: FbAd[]\n}\n\nexport function formatFacebookPageIntel(\n raw: CallToolResult,\n input: { pageId?: string; libraryId?: string; query?: string },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as FbPageResult\n\n const advertiser = d.advertiserName ?? input.query ?? input.pageId ?? input.libraryId ?? 'Advertiser'\n const ads = d.ads ?? []\n const s = d.summary ?? { totalAds: 0, activeCount: 0, videoCount: 0, imageCount: 0 }\n\n const adBlocks = ads.map((ad, i) => [\n `### Ad ${i + 1}${ad.libraryId ? ` · \\`${ad.libraryId}\\`` : ''} — ${ad.status ?? '—'} · ${ad.creativeType ?? '—'} · ${ad.startDate ?? '—'}`,\n ad.headline ? `**Headline:** ${ad.headline}` : '',\n ad.primaryText ? `**Copy:** ${truncate(ad.primaryText, 200)}` : '',\n ad.cta ? `**CTA:** ${ad.cta}` : '',\n ad.videoUrl ? `**Video URL:** \\`${ad.videoUrl}\\`` : '',\n ad.variations ? `**Variations:** ${ad.variations}` : '',\n ].filter(Boolean).join('\\n')).join('\\n\\n---\\n\\n')\n\n const full = [\n `# Facebook Ad Intel: ${advertiser}`,\n `**${s.totalAds} ads** · ${s.activeCount} active · ${s.videoCount} video · ${s.imageCount} image`,\n `\\n${adBlocks}`,\n `\\n---\\n💡 **Tips**\\n- Transcribe video ads: use \\`facebook_ad_transcribe\\` with the \\`videoUrl\\` above\\n- Find other advertisers: use \\`facebook_ad_search\\``,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n advertiserName: d.advertiserName ?? null,\n totalAds: s.totalAds ?? 0,\n activeCount: s.activeCount ?? 0,\n videoCount: s.videoCount ?? 0,\n imageCount: s.imageCount ?? 0,\n ads: ads.map(ad => ({\n libraryId: ad.libraryId ?? null,\n status: ad.status ?? null,\n creativeType: ad.creativeType ?? null,\n headline: ad.headline ?? null,\n cta: ad.cta ?? null,\n startDate: ad.startDate ?? null,\n videoUrl: ad.videoUrl ?? null,\n variations: typeof ad.variations === 'number' ? ad.variations : null,\n })),\n },\n }\n}\n\ninterface FbAdvertiserResult { name?: string; pageName?: string; adCount?: number; libraryId?: string; sampleLibraryId?: string }\ninterface FbSearchResult { results?: FbAdvertiserResult[]; advertisers?: FbAdvertiserResult[] }\n\nexport function formatFacebookAdSearch(raw: CallToolResult, input: { query: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as FbSearchResult\n\n const advertisers = d.results ?? d.advertisers ?? []\n\n const rows = advertisers.map((a, i) =>\n `| ${i + 1} | ${cell(a.pageName ?? a.name)} | ${a.adCount ?? '—'} | \\`${a.sampleLibraryId ?? a.libraryId ?? '—'}\\` |`,\n ).join('\\n')\n\n const full = [\n `# Facebook Ad Library Search: \"${input.query}\"`,\n `**${advertisers.length} advertisers found**`,\n `\\n## Advertisers\\n| # | Name | Ad Count | Library ID |\\n|---|------|----------|------------|\\n${rows}`,\n `\\n---\\n💡 **Tips**\\n- Scan all ads: use \\`facebook_page_intel\\` with \\`libraryId\\`\\n- Or pass the advertiser name as \\`query\\` in \\`facebook_page_intel\\``,\n ].join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: input.query,\n advertiserCount: advertisers.length,\n advertisers: advertisers.map(a => ({\n name: a.pageName ?? a.name ?? null,\n adCount: typeof a.adCount === 'number' ? a.adCount : null,\n libraryId: a.sampleLibraryId ?? a.libraryId ?? null,\n })),\n },\n }\n}\n\ninterface MapsReviewCard { author: string | null; stars: string | null; date: string | null; text: string | null }\ntype ReviewsStatus = 'collected' | 'none_exist' | 'unavailable' | 'not_requested'\ninterface MapsHistogramEntry { stars: number; count: string }\ninterface MapsTopicEntry { label: string; count: string }\ninterface MapsAboutEntry { section: string; attribute: string }\ninterface MapsSearchBusiness {\n position: number\n name: string\n placeUrl: string\n cidDecimal: string | null\n rating: string | null\n reviewCount: string | null\n category: string | null\n address: string | null\n websiteUrl: string | null\n directionsUrl: string | null\n metadata: string[]\n}\ninterface CreditCostEntry { key: string; label: string; credits: number; unit: string; notes?: string }\ninterface CreditLedgerEntry { amount_mc: number; operation: string; description: string | null; created_at: string }\n\nexport function formatCreditsInfo(raw: CallToolResult, input: { item?: string; includeLedger?: boolean }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as Record<string, unknown>\n\n const balance = d.balance_credits as number | undefined\n const costs = (d.costs as CreditCostEntry[] | undefined) ?? []\n const matched = d.matched_cost as CreditCostEntry | null\n const ledger = (d.ledger as CreditLedgerEntry[] | undefined) ?? []\n\n const costRows = costs.map(c => {\n const notes = c.notes ? ` ${c.notes}` : ''\n return `| ${c.label} | ${c.credits} | ${c.unit}${notes} |`\n }).join('\\n')\n\n const ledgerRows = ledger.map(row => {\n const credits = row.amount_mc / 1000\n return `| ${row.created_at} | ${row.operation} | ${credits} | ${row.description ?? ''} |`\n }).join('\\n')\n\n const matchedSection = matched\n ? `\\n## Matched Cost\\n**${matched.label}:** ${matched.credits} credits ${matched.unit}${matched.notes ? `\\n\\n${matched.notes}` : ''}`\n : input.item\n ? `\\n## Matched Cost\\nNo exact cost match found for \"${input.item}\". See the full cost table below.`\n : ''\n\n const full = [\n `# Credits`,\n `**Balance:** ${balance ?? 'unknown'} credits`,\n matchedSection,\n costs.length ? `\\n## Cost Table\\n| Item | Credits | Unit |\\n|------|---------|------|\\n${costRows}` : '',\n ledger.length ? `\\n## Recent Ledger\\n| Date | Operation | Credits | Description |\\n|------|-----------|---------|-------------|\\n${ledgerRows}` : '',\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n balanceCredits: typeof balance === 'number' ? balance : null,\n matchedCost: matched\n ? { label: matched.label, credits: matched.credits, unit: matched.unit, notes: matched.notes ?? null }\n : null,\n costs: costs.map(c => ({\n key: c.key,\n label: c.label,\n credits: c.credits,\n unit: c.unit,\n notes: c.notes ?? null,\n })),\n ledger: ledger.map(row => ({\n createdAt: String(row.created_at ?? ''),\n operation: String(row.operation ?? ''),\n credits: row.amount_mc / 1000,\n description: row.description ?? null,\n })),\n },\n }\n}\n\nexport function formatMapsSearch(\n raw: CallToolResult,\n input: { query: string; location?: string; maxResults?: number },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as Record<string, unknown>\n const results = (d.results as MapsSearchBusiness[]) ?? []\n const searchQuery = (d.searchQuery as string | undefined) ?? [input.query, input.location].filter(Boolean).join(' ')\n const requestedMax = (d.requestedMaxResults as number | undefined) ?? input.maxResults ?? 10\n const durationMs = d.durationMs as number | undefined\n\n const rows = results.map((r) => {\n const rating = [r.rating, r.reviewCount ? `(${r.reviewCount})` : null].filter(Boolean).join(' ')\n return `| ${r.position} | ${cell(r.name)} | ${cell(r.category)} | ${cell(rating)} | ${cell(r.address)} | ${r.cidDecimal ? `\\`${r.cidDecimal}\\`` : '—'} | ${r.websiteUrl ? `[site](${r.websiteUrl})` : '—'} | [maps](${r.placeUrl}) |`\n }).join('\\n')\n\n const metadataSection = results.length\n ? `\\n## Candidate Metadata\\n${results.map(r => {\n const meta = r.metadata?.length ? r.metadata.slice(0, 8).map(m => ` - ${m}`).join('\\n') : ' - none'\n return `### ${r.position}. ${r.name}\\n${meta}`\n }).join('\\n\\n')}`\n : ''\n\n const full = [\n `# Google Maps Search: \"${searchQuery}\"`,\n `**Returned:** ${results.length} profile candidate${results.length === 1 ? '' : 's'} · **Requested max:** ${requestedMax} · **Limit:** 50`,\n `\\n## Results\\n| # | Name | Category | Rating | Address | CID | Website | Maps |\\n|---|------|----------|--------|---------|-----|---------|------|\\n${rows}`,\n metadataSection,\n `\\n---\\n💡 **Next step:** use \\`maps_place_intel\\` with a selected business name and location to hydrate full hours, phone, review topics, and optional review cards.`,\n durationMs != null ? `\\n*Extracted in ${(durationMs / 1000).toFixed(1)}s*` : null,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n query: d.query,\n location: d.location ?? null,\n searchQuery: d.searchQuery,\n searchUrl: d.searchUrl,\n extractedAt: d.extractedAt,\n requestedMaxResults: requestedMax,\n resultCount: results.length,\n results,\n durationMs: durationMs ?? 0,\n },\n }\n}\n\nexport function formatMapsPlaceIntel(\n raw: CallToolResult,\n input: { businessName: string; location: string; includeReviews?: boolean },\n): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as Record<string, unknown>\n\n const name = (d.name as string | null) ?? input.businessName\n const rating = d.rating as string | null\n const reviewCount = d.reviewCount as string | null\n const category = d.category as string | null\n const address = d.address as string | null\n const phone = d.phoneDisplay as string | null\n const website = d.website as string | null\n const hoursSummary = d.hoursSummary as string | null\n const plusCode = d.plusCode as string | null\n const bookingUrl = d.bookingUrl as string | null\n const kgmid = d.kgmid as string | null\n const cidDecimal = d.cidDecimal as string | null\n const cidUrl = d.cidUrl as string | null\n const lat = d.lat as number | null\n const lng = d.lng as number | null\n const durationMs = d.durationMs as number | null\n\n const histogram = (d.reviewHistogram as MapsHistogramEntry[]) ?? []\n const topics = (d.reviewTopics as MapsTopicEntry[]) ?? []\n const about = (d.aboutAttributes as MapsAboutEntry[]) ?? []\n const reviews = (d.reviews as MapsReviewCard[]) ?? []\n const reviewsStatus = (d.reviewsStatus as ReviewsStatus | undefined) ?? 'not_requested'\n\n const hoursTable = (d.hoursTable as Array<{ day: string; hours: string }>) ?? []\n\n const ratingLine = [rating, reviewCount ? `(${reviewCount} reviews)` : null].filter(Boolean).join(' ')\n\n const basicLines = [\n address ? `- **Address:** ${address}` : null,\n phone ? `- **Phone:** ${phone}` : null,\n website ? `- **Website:** ${website}` : null,\n hoursSummary ? `- **Hours:** ${hoursSummary}` : null,\n plusCode ? `- **Plus Code:** ${plusCode}` : null,\n bookingUrl ? `- **Book:** ${bookingUrl}` : null,\n ].filter(Boolean).join('\\n')\n\n const hoursSection = hoursTable.length\n ? `\\n## Hours\\n| Day | Hours |\\n|-----|-------|\\n${hoursTable.map(r => `| ${r.day} | ${r.hours} |`).join('\\n')}`\n : ''\n\n const histSection = histogram.length\n ? `\\n## Rating Distribution\\n| Stars | Count |\\n|-------|-------|\\n${histogram.map(r => `| ${'★'.repeat(r.stars)}${'☆'.repeat(5 - r.stars)} | ${r.count} |`).join('\\n')}`\n : ''\n\n const topicsSection = topics.length\n ? `\\n## Review Topics\\n${topics.map(t => `- **${t.label}:** ${t.count} mentions`).join('\\n')}`\n : ''\n\n const aboutBySection: Record<string, string[]> = {}\n for (const a of about) {\n if (!aboutBySection[a.section]) aboutBySection[a.section] = []\n aboutBySection[a.section].push(a.attribute)\n }\n const aboutSection = Object.keys(aboutBySection).length\n ? `\\n## About\\n${Object.entries(aboutBySection).map(([s, attrs]) => `**${s}**\\n${attrs.map(a => `- ${a}`).join('\\n')}`).join('\\n\\n')}`\n : ''\n\n const entitySection = [\n kgmid ? `- **KGMID:** \\`${kgmid}\\`` : null,\n cidDecimal ? `- **CID:** \\`${cidDecimal}\\`` : null,\n cidUrl ? `- **Maps CID URL:** ${cidUrl}` : null,\n lat != null && lng != null ? `- **Coordinates:** ${lat}, ${lng}` : null,\n ].filter(Boolean).join('\\n')\n\n const reviewsSection = (() => {\n if (reviewsStatus === 'not_requested') return ''\n if (reviewsStatus === 'unavailable') return '\\n## Reviews\\n> Reviews could not be retrieved this run — retry with `includeReviews: true`.'\n if (reviewsStatus === 'none_exist') return '\\n## Reviews\\n*This business has no reviews on Google Maps.*'\n if (reviews.length === 0) return '\\n## Reviews\\n*0 reviews collected.*'\n return `\\n## Reviews (${reviews.length})\\n${reviews.map((r, i) => {\n const starsN = parseInt(r.stars ?? '0')\n const stars = '★'.repeat(starsN) + '☆'.repeat(5 - starsN)\n return `### ${i + 1}. ${r.author ?? 'Anonymous'} — ${stars}\\n*${r.date ?? ''}*\\n\\n${r.text ?? ''}`\n }).join('\\n\\n')}`\n })()\n\n const full = [\n `# ${name}`,\n category ? `*${category}*` : null,\n ratingLine ? `\\n**Rating:** ${ratingLine}` : null,\n basicLines ? `\\n${basicLines}` : null,\n hoursSection,\n histSection,\n topicsSection,\n aboutSection,\n entitySection ? `\\n## Entity IDs\\n${entitySection}` : null,\n reviewsSection,\n durationMs != null ? `\\n---\\n*Extracted in ${(durationMs / 1000).toFixed(1)}s*` : null,\n ].filter(Boolean).join('\\n')\n\n return {\n ...oneBlock(full),\n structuredContent: {\n name,\n rating: rating ?? null,\n reviewCount: reviewCount ?? null,\n category: category ?? null,\n address: address ?? null,\n phone: phone ?? null,\n website: website ?? null,\n hoursSummary: hoursSummary ?? null,\n bookingUrl: bookingUrl ?? null,\n kgmid: kgmid ?? null,\n cidDecimal: cidDecimal ?? null,\n cidUrl: cidUrl ?? null,\n lat: lat ?? null,\n lng: lng ?? null,\n reviewsStatus,\n reviewsCollected: reviews.length,\n reviewTopics: topics.map(t => ({ label: String(t.label ?? ''), count: String(t.count ?? '') })),\n },\n }\n}\n\nexport function formatFacebookAdTranscribe(raw: CallToolResult, input: { videoUrl: string }): CallToolResult {\n const parsed = parseData(raw)\n if ('error' in parsed) return { content: [{ type: 'text', text: parsed.error }], isError: true }\n const d = parsed.data as unknown as TranscriptResult\n\n const text = d.text ?? ''\n const chunks = d.chunks ?? []\n const durSec = d.durationMs ? (d.durationMs / 1000).toFixed(0) : '—'\n\n const chunkRows = chunks.slice(0, 50).map(c => {\n const sec = Number.isFinite(c.timestamp[0]) ? Math.floor(c.timestamp[0]) : 0\n const mm = String(Math.floor(sec / 60)).padStart(2, '0')\n const ss = String(sec % 60).padStart(2, '0')\n return `| ${mm}:${ss} | ${cell(truncate(c.text, 120))} |`\n }).join('\\n')\n\n const full = [\n `# Facebook Ad Transcript`,\n `**Duration:** ${durSec}s · **${text.split(' ').length} words**`,\n `\\n## Full Transcript\\n${text}`,\n chunks.length ? `\\n## Timestamped Chunks\\n| Time | Text |\\n|------|------|\\n${chunkRows}` : '',\n `\\n---\\n💡 Get more ads from this advertiser: use \\`facebook_page_intel\\``,\n ].filter(Boolean).join('\\n')\n\n return oneBlock(full)\n}\n","export const RECAPTCHA_INSTRUCTIONS = 'Google returned a CAPTCHA. Run with --headless=false to re-warm the browser profile, then retry.'\n\nexport function sanitizeVendorName(message: string): string {\n return message\n .replace(/kernel\\.sh\\s+sessions?/gi, 'sessions')\n .replace(/kernel\\.sh\\s+session/gi, 'this session')\n .replace(/kernel\\.sh/gi, 'the service')\n .replace(/kernel\\s+sessions?/gi, 'sessions')\n .replace(/kernel\\s+session/gi, 'this session')\n .replace(/\\bkernel\\b/gi, 'the service')\n .replace(/ +/g, ' ')\n .trim()\n}\n\nexport class CaptchaError extends Error {\n readonly name = 'CaptchaError'\n constructor(public readonly instructions: string) {\n super(`CAPTCHA detected. ${instructions}`)\n }\n}\n\nexport class ExtractionError extends Error {\n readonly name = 'ExtractionError'\n constructor(message: string, public readonly cause?: unknown) {\n super(message)\n }\n}\n\nexport class RequestAbortedError extends Error {\n readonly name = 'RequestAbortedError'\n constructor(message = 'Request aborted before harvest completed') {\n super(message)\n }\n}\n","import { z } from 'zod'\n\nexport const HarvestPaaInputSchema = {\n query: z.string().min(1).describe('Core search topic only. If the user says \"best hvac company in Denver CO\", use query=\"best hvac company\" and location=\"Denver, CO\". Do not include the location in query when it can be separated.'),\n location: z.string().optional().describe('City, region, or country for geo-targeted results, inferred from the user request when present, e.g. \"Denver, CO\", \"Tokyo, Japan\", \"London, UK\".'),\n maxQuestions: z.number().int().min(1).max(200).default(30).describe('Number of PAA questions to extract. Default 30. Maximum 200. Use 10 for quick probes, 30 for normal research, 100-200 when the user asks for everything/full/deep research. Larger harvests get a longer server time budget (151-200 questions → up to 280s). Credits are charged by extracted question; unused request hold is refunded.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location or user language. Examples: United States us, United Kingdom gb, Japan jp, Canada ca, Australia au.'),\n hl: z.string().default('en').describe('Google interface/content language inferred from the user request. Use en unless the user asks for another language or locale.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('SERP device context. Use desktop by default; use mobile only when the user asks for mobile rankings.'),\n proxyMode: z.enum(['location', 'configured', 'none']).default('location').describe('Proxy targeting mode. Use location by default so city/state searches create or reuse a matching residential proxy. Use configured for the static configured proxy. Use none only for direct-network debugging.'),\n proxyZip: z.string().regex(/^\\d{5}$/).optional().describe('Optional US ZIP override for residential location proxy targeting. Use only when the user gives a specific ZIP or city-center proxy targeting needs to be forced.'),\n debug: z.boolean().default(false).describe('Include sanitized browser/session/location diagnostics in the response. Use true when debugging localization, CAPTCHA, or proxy behavior.'),\n}\nexport type HarvestPaaInput = z.infer<ReturnType<typeof z.object<typeof HarvestPaaInputSchema>>>\n\nexport const ExtractUrlInputSchema = {\n url: z.string().url().describe('Public http/https URL to extract. Use this when the user provides one specific page URL.'),\n screenshot: z.boolean().default(false).describe('Also capture a full-page screenshot of the URL. Saved to ~/Downloads/mcp-scraper/screenshots/ and returned inline. Use when the user asks to see or capture the page visually.'),\n screenshotDevice: z.enum(['desktop', 'mobile']).default('desktop').describe('Viewport for screenshot. desktop = 1440×900. mobile = 390×844. Default desktop.'),\n extractBranding: z.boolean().default(false).describe('Extract brand colors, fonts, logo, and favicon using a rendered browser session. Returns colorScheme (light/dark), colors (primary/accent/background/text/heading as hex), fonts (heading/body family names), and assets (logo URL, favicon URL). Use when the user asks about brand colors, site theme, or brand assets.'),\n downloadMedia: z.boolean().default(false).describe('Extract and download all page media (images, video, audio) to ~/Downloads/mcp-scraper/media/. Ad networks, tracking pixels, and noise URLs are filtered automatically. Use when the user asks to download or harvest assets from a page.'),\n mediaTypes: z.array(z.enum(['image', 'video', 'audio'])).default(['image', 'video', 'audio']).describe('Which media types to download. Default all three.'),\n allowLocal: z.boolean().default(false).describe('Allow localhost and private-network URLs. For local development only.'),\n}\nexport type ExtractUrlInput = z.infer<ReturnType<typeof z.object<typeof ExtractUrlInputSchema>>>\n\nexport const MapSiteUrlsInputSchema = {\n url: z.string().url().describe('Public website URL or domain to crawl for internal URLs. Use before extract_site when the user asks to audit/map/crawl a site.'),\n maxUrls: z.number().int().min(1).max(500).optional().describe('Maximum URLs to discover. Use 100 for normal maps, higher when the user asks for a full inventory.'),\n}\nexport type MapSiteUrlsInput = z.infer<ReturnType<typeof z.object<typeof MapSiteUrlsInputSchema>>>\n\nexport const ExtractSiteInputSchema = {\n url: z.string().url().describe('Public website URL or domain to extract across multiple pages. Use when the user asks for a site audit, website crawl, or full-site content/schema extraction.'),\n maxPages: z.number().int().min(1).max(50).optional().describe('Maximum pages to extract. Use 50 when the user asks for full results or a complete crawl within MCP limits.'),\n}\nexport type ExtractSiteInput = z.infer<ReturnType<typeof z.object<typeof ExtractSiteInputSchema>>>\n\nexport const YoutubeHarvestInputSchema = {\n mode: z.enum(['search', 'channel']).describe('Use search for topic/keyword requests. Use channel when the user provides @handle, channel ID, or channel URL.'),\n query: z.string().optional().describe('Required when mode is search. The YouTube search topic in the user’s words.'),\n channelHandle: z.string().optional().describe('YouTube channel handle, channel ID, or URL. Examples: @mkbhd, UC..., https://youtube.com/@mkbhd.'),\n maxVideos: z.number().int().min(1).max(500).default(50).describe('Number of videos to return. Default 50. Increase when user asks for full channel/history.'),\n}\nexport type YoutubeHarvestInput = z.infer<ReturnType<typeof z.object<typeof YoutubeHarvestInputSchema>>>\n\nexport const YoutubeTranscribeInputSchema = {\n videoId: z.string().min(1).describe('YouTube video ID, e.g. dQw4w9WgXcQ'),\n}\nexport type YoutubeTranscribeInput = z.infer<ReturnType<typeof z.object<typeof YoutubeTranscribeInputSchema>>>\n\nexport const FacebookPageIntelInputSchema = {\n pageId: z.string().optional(),\n libraryId: z.string().optional(),\n query: z.string().optional().describe('Advertiser or brand name when pageId/libraryId is not known. One of pageId, libraryId, or query is required.'),\n maxAds: z.number().int().min(1).max(200).default(50),\n country: z.string().length(2).default('US'),\n}\nexport type FacebookPageIntelInput = z.infer<ReturnType<typeof z.object<typeof FacebookPageIntelInputSchema>>>\n\nexport const FacebookAdSearchInputSchema = {\n query: z.string().min(1).describe('Advertiser, brand, competitor, niche, or keyword to search in Facebook Ad Library.'),\n country: z.string().length(2).default('US'),\n maxResults: z.number().int().min(1).max(20).default(10),\n}\nexport type FacebookAdSearchInput = z.infer<ReturnType<typeof z.object<typeof FacebookAdSearchInputSchema>>>\n\nexport const FacebookAdTranscribeInputSchema = {\n videoUrl: z.string().url().describe('Facebook CDN video URL from a facebook_page_intel result'),\n}\nexport type FacebookAdTranscribeInput = z.infer<ReturnType<typeof z.object<typeof FacebookAdTranscribeInputSchema>>>\n\nexport const MapsPlaceIntelInputSchema = {\n businessName: z.string().min(1).describe('Business name only. If user says \"Elite Roofing Denver CO\", use businessName=\"Elite Roofing\" and location=\"Denver, CO\".'),\n location: z.string().min(1).describe('City/region/country where the business should be searched, e.g. \"Denver, CO\". Infer from the user request when possible.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location.'),\n hl: z.string().length(2).default('en').describe('Language inferred from user request.'),\n includeReviews: z.boolean().default(false).describe('Whether to fetch individual review cards'),\n maxReviews: z.number().int().min(1).max(500).default(50).describe('Max review cards to return (requires includeReviews: true)'),\n}\nexport type MapsPlaceIntelInput = z.infer<ReturnType<typeof z.object<typeof MapsPlaceIntelInputSchema>>>\n\nexport const MapsSearchInputSchema = {\n query: z.string().min(1).describe('Business category, niche, keyword, or search term. If the user says \"roofers in Denver CO\", use query=\"roofers\" and location=\"Denver, CO\". Do not put the location here when it can be separated.'),\n location: z.string().optional().describe('City, region, country, or service area for the Maps search, e.g. \"Denver, CO\". Infer from the user request when present.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location.'),\n hl: z.string().length(2).default('en').describe('Language inferred from user request.'),\n maxResults: z.number().int().min(1).max(50).default(10).describe('Number of Google Maps business/profile candidates to return. Default 10. Maximum 50. Use 10 unless the user asks for more.'),\n}\nexport type MapsSearchInput = z.infer<ReturnType<typeof z.object<typeof MapsSearchInputSchema>>>\n\nconst NullableString = z.string().nullable()\n\nexport const MapsSearchOutputSchema = {\n query: z.string(),\n location: z.string().nullable(),\n searchQuery: z.string(),\n searchUrl: z.string().url(),\n extractedAt: z.string(),\n requestedMaxResults: z.number().int().min(1).max(50),\n resultCount: z.number().int().min(0).max(50),\n results: z.array(z.object({\n position: z.number().int().min(1),\n name: z.string(),\n placeUrl: z.string().url(),\n cid: NullableString,\n cidDecimal: NullableString,\n rating: NullableString,\n reviewCount: NullableString,\n category: NullableString,\n address: NullableString,\n websiteUrl: NullableString,\n directionsUrl: NullableString,\n metadata: z.array(z.string()),\n })),\n durationMs: z.number().int().min(0),\n}\n\nconst OrganicResultOutput = z.object({\n position: z.number().int(),\n title: z.string(),\n url: z.string(),\n domain: z.string(),\n snippet: NullableString,\n})\n\nconst AiOverviewOutput = z.object({\n detected: z.boolean(),\n text: NullableString,\n}).nullable()\n\nconst EntityIdsOutput = z.object({\n kgIds: z.array(z.string()),\n cids: z.array(z.string()),\n gcids: z.array(z.string()),\n}).nullable()\n\nexport const HarvestPaaOutputSchema = {\n query: z.string(),\n location: NullableString,\n questionCount: z.number().int().min(0),\n completionStatus: NullableString,\n questions: z.array(z.object({\n question: z.string(),\n answer: NullableString,\n sourceTitle: NullableString,\n sourceSite: NullableString,\n })),\n organicResults: z.array(OrganicResultOutput),\n aiOverview: AiOverviewOutput,\n entityIds: EntityIdsOutput,\n durationMs: z.number().min(0).nullable(),\n}\n\nexport const SearchSerpOutputSchema = {\n query: z.string(),\n location: NullableString,\n organicResults: z.array(OrganicResultOutput),\n localPack: z.array(z.object({\n position: z.number().int(),\n name: z.string(),\n rating: NullableString,\n reviewCount: NullableString,\n websiteUrl: NullableString,\n })),\n aiOverview: AiOverviewOutput,\n entityIds: EntityIdsOutput,\n}\n\nexport const ExtractUrlOutputSchema = {\n url: z.string(),\n title: NullableString,\n headings: z.array(z.object({\n level: z.number().int(),\n text: z.string(),\n })),\n schemaBlockCount: z.number().int().min(0),\n entityName: NullableString,\n entityTypes: z.array(z.string()),\n napScore: z.number().nullable(),\n missingSchemaFields: z.array(z.string()),\n screenshotSaved: NullableString,\n}\n\nexport const ExtractSiteOutputSchema = {\n url: z.string(),\n pageCount: z.number().int().min(0),\n pages: z.array(z.object({\n url: z.string(),\n title: NullableString,\n schemaTypes: z.array(z.string()),\n })),\n durationMs: z.number().min(0),\n}\n\nexport const MapsPlaceIntelOutputSchema = {\n name: z.string(),\n rating: NullableString,\n reviewCount: NullableString,\n category: NullableString,\n address: NullableString,\n phone: NullableString,\n website: NullableString,\n hoursSummary: NullableString,\n bookingUrl: NullableString,\n kgmid: NullableString,\n cidDecimal: NullableString,\n cidUrl: NullableString,\n lat: z.number().nullable(),\n lng: z.number().nullable(),\n reviewsStatus: z.string(),\n reviewsCollected: z.number().int().min(0),\n reviewTopics: z.array(z.object({\n label: z.string(),\n count: z.string(),\n })),\n}\n\nexport const CreditsInfoOutputSchema = {\n balanceCredits: z.number().nullable(),\n matchedCost: z.object({\n label: z.string(),\n credits: z.number(),\n unit: z.string(),\n notes: NullableString,\n }).nullable(),\n costs: z.array(z.object({\n key: z.string(),\n label: z.string(),\n credits: z.number(),\n unit: z.string(),\n notes: NullableString,\n })),\n ledger: z.array(z.object({\n createdAt: z.string(),\n operation: z.string(),\n credits: z.number(),\n description: NullableString,\n })),\n}\n\nexport const MapSiteUrlsOutputSchema = {\n startUrl: z.string(),\n totalFound: z.number().int().min(0),\n truncated: z.boolean(),\n okCount: z.number().int().min(0),\n redirectCount: z.number().int().min(0),\n brokenCount: z.number().int().min(0),\n urls: z.array(z.object({\n url: z.string(),\n status: z.number().int().nullable(),\n })),\n durationMs: z.number().min(0),\n}\n\nexport const YoutubeHarvestOutputSchema = {\n mode: z.string(),\n videoCount: z.number().int().min(0),\n channel: z.object({\n title: NullableString,\n subscriberCount: NullableString,\n }).nullable(),\n videos: z.array(z.object({\n videoId: z.string(),\n title: z.string(),\n channelName: NullableString,\n views: NullableString,\n duration: NullableString,\n url: NullableString,\n })),\n}\n\nexport const FacebookAdSearchOutputSchema = {\n query: z.string(),\n advertiserCount: z.number().int().min(0),\n advertisers: z.array(z.object({\n name: NullableString,\n adCount: z.number().int().nullable(),\n libraryId: NullableString,\n })),\n}\n\nexport const FacebookPageIntelOutputSchema = {\n advertiserName: NullableString,\n totalAds: z.number().int().min(0),\n activeCount: z.number().int().min(0),\n videoCount: z.number().int().min(0),\n imageCount: z.number().int().min(0),\n ads: z.array(z.object({\n libraryId: NullableString,\n status: NullableString,\n creativeType: NullableString,\n headline: NullableString,\n cta: NullableString,\n startDate: NullableString,\n videoUrl: NullableString,\n variations: z.number().int().nullable(),\n })),\n}\n\nexport const CreditsInfoInputSchema = {\n item: z.string().optional().describe('Optional tool, action, or feature to look up, e.g. \"maps reviews\", \"extract_url\", or \"YouTube transcription\"'),\n includeLedger: z.boolean().default(false).describe('Whether to include recent credit ledger entries'),\n}\nexport type CreditsInfoInput = z.infer<ReturnType<typeof z.object<typeof CreditsInfoInputSchema>>>\n\nexport const SearchSerpInputSchema = {\n query: z.string().min(1).describe('Core search topic only. Separate location when possible. If user says \"best dentist in Brooklyn NY serp\", use query=\"best dentist\" and location=\"Brooklyn, NY\".'),\n location: z.string().optional().describe('City, region, or country for geo-targeted results, inferred from user request when present.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from location or user language.'),\n hl: z.string().default('en').describe('Google interface/content language inferred from user request.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('SERP device context. Use desktop by default; use mobile only when the user asks for mobile rankings.'),\n proxyMode: z.enum(['location', 'configured', 'none']).default('location').describe('Proxy targeting mode. Use location by default so city/state searches create or reuse a matching residential proxy. Use configured for the static configured proxy. Use none only for direct-network debugging.'),\n proxyZip: z.string().regex(/^\\d{5}$/).optional().describe('Optional US ZIP override for residential location proxy targeting. Use only when the user gives a specific ZIP or city-center proxy targeting needs to be forced.'),\n debug: z.boolean().default(false).describe('Include sanitized browser/session/location diagnostics in the response. Use true when debugging localization, CAPTCHA, or proxy behavior.'),\n pages: z.number().int().min(1).max(2).default(1).describe('Number of result pages to fetch (1–2)'),\n}\nexport type SearchSerpInput = z.infer<ReturnType<typeof z.object<typeof SearchSerpInputSchema>>>\n\nexport const CaptureSerpSnapshotInputSchema = {\n query: z.string().min(1).describe('Core search query to capture as a structured SERP Intelligence snapshot. Separate the place into location when the user gives a city, region, country, or ZIP.'),\n location: z.string().optional().describe('City, region, country, or service area used for localized Google results. MCP Scraper records location evidence; UULE alone is not proof of localization.'),\n gl: z.string().length(2).default('us').describe('Google country code inferred from the requested market, e.g. us, gb, ca, au.'),\n hl: z.string().default('en').describe('Google interface/content language inferred from the user request.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('SERP device context. Use mobile only when the user asks for mobile rankings or mobile SERP evidence.'),\n proxyMode: z.enum(['location', 'configured', 'none']).default('location').describe('Proxy behavior for capture. Use location for localized residential proxy targeting, configured for the static residential proxy, and none only for direct-network debugging.'),\n proxyZip: z.string().regex(/^\\d{5}$/).optional().describe('Optional US ZIP override for residential location proxy targeting when a precise city-center or ZIP proxy is needed.'),\n pages: z.number().int().min(1).max(2).default(1).describe('Number of Google result pages to capture. Use 1 normally and 2 only when the user needs deeper ranking evidence.'),\n debug: z.boolean().default(false).describe('Include sanitized browser, proxy, and location diagnostics. Use true when debugging localization, CAPTCHA, proxy selection, or capture reliability.'),\n includePageSnapshots: z.boolean().default(false).describe('Also capture ranking-page snapshots for selected SERP URLs through the same product capture path.'),\n pageSnapshotLimit: z.number().int().min(0).max(10).default(0).describe('Maximum ranking-page snapshots to capture when includePageSnapshots is true. Use 0 when only SERP evidence is needed.'),\n}\nexport type CaptureSerpSnapshotInput = z.infer<ReturnType<typeof z.object<typeof CaptureSerpSnapshotInputSchema>>>\n\nexport const ScreenshotInputSchema = {\n url: z.string().url().describe('URL to capture as a full-page screenshot. Use http or https. Pass allowLocal: true to capture localhost or private-network URLs during development.'),\n device: z.enum(['desktop', 'mobile']).default('desktop').describe('Viewport profile. desktop = 1440×900. mobile = 390×844. Use desktop by default; use mobile when the user asks for a mobile view.'),\n allowLocal: z.boolean().default(false).describe('Allow localhost and private-network URLs (127.x, 192.168.x, 10.x, etc.). For local development only — not for production use.'),\n}\nexport type ScreenshotInput = z.infer<ReturnType<typeof z.object<typeof ScreenshotInputSchema>>>\n\nexport const CaptureSerpPageSnapshotsInputSchema = {\n urls: z.array(z.string().url()).min(1).max(25).describe('Public HTTP/HTTPS URLs to capture as SERP Intelligence page snapshots. Do not pass localhost, private IPs, file URLs, or internal admin URLs.'),\n targets: z.array(z.object({\n url: z.string().url().describe('Public HTTP/HTTPS URL to capture.'),\n sourceKind: z.enum(['organic', 'ai_citation', 'local_pack_website', 'configured_target', 'site_subject']).default('configured_target').describe('Why this page is being captured for SERP Intelligence evidence.'),\n sourcePosition: z.number().int().min(1).optional().describe('Ranking or citation position when the page came from SERP evidence.'),\n }).strict()).min(1).max(25).optional().describe('Structured page snapshot targets. Use this instead of urls when source kind or position should be preserved.'),\n maxConcurrency: z.number().int().min(1).max(5).default(2).describe('Parallel page captures. Use 2 normally; higher values can increase proxy/browser pressure.'),\n timeoutMs: z.number().int().min(1_000).max(60_000).default(15_000).describe('Per-page capture timeout in milliseconds. Increase for slow pages; timeout artifacts are returned as structured capture failures.'),\n debug: z.boolean().default(false).describe('Include sanitized browser/proxy diagnostics for page snapshot debugging. Use true for capture, network, or proxy troubleshooting.'),\n}\nexport type CaptureSerpPageSnapshotsInput = z.infer<ReturnType<typeof z.object<typeof CaptureSerpPageSnapshotsInputSchema>>>\n"],"mappings":"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","names":["import_node_fs","import_node_os","import_node_path","baseUrl","apiKey","import_node_fs","import_node_path","server","executor"]}