mcp-scraper 0.3.28 → 0.3.42

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.
Files changed (44) hide show
  1. package/dist/bin/api-server.cjs +2464 -1134
  2. package/dist/bin/api-server.cjs.map +1 -1
  3. package/dist/bin/api-server.js +3 -3
  4. package/dist/bin/mcp-scraper-cli.cjs +1 -1
  5. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  6. package/dist/bin/mcp-scraper-cli.js +1 -1
  7. package/dist/bin/mcp-scraper-install.cjs +1 -1
  8. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  9. package/dist/bin/mcp-scraper-install.js +1 -1
  10. package/dist/bin/mcp-stdio-server.cjs +237 -6
  11. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  12. package/dist/bin/mcp-stdio-server.js +2 -2
  13. package/dist/bin/paa-harvest.cjs +109 -5
  14. package/dist/bin/paa-harvest.cjs.map +1 -1
  15. package/dist/bin/paa-harvest.js +2 -2
  16. package/dist/{chunk-TRNSXR46.js → chunk-DVRPXPYH.js} +22 -3
  17. package/dist/chunk-DVRPXPYH.js.map +1 -0
  18. package/dist/{chunk-QSSH4RCX.js → chunk-GMTS35L6.js} +111 -7
  19. package/dist/chunk-GMTS35L6.js.map +1 -0
  20. package/dist/{chunk-NGD4ITAO.js → chunk-KPF64WST.js} +238 -7
  21. package/dist/chunk-KPF64WST.js.map +1 -0
  22. package/dist/chunk-OUZZNW3I.js +7 -0
  23. package/dist/chunk-OUZZNW3I.js.map +1 -0
  24. package/dist/{chunk-H74L743B.js → chunk-RXJHXBGG.js} +40 -3
  25. package/dist/chunk-RXJHXBGG.js.map +1 -0
  26. package/dist/{db-FP2ABUU4.js → db-LYQENFPW.js} +2 -2
  27. package/dist/index.cjs +109 -5
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +8 -0
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.js +2 -2
  32. package/dist/{server-IDDX7KGT.js → server-CZT7EULY.js} +1157 -246
  33. package/dist/server-CZT7EULY.js.map +1 -0
  34. package/dist/{worker-NV4GTIRG.js → worker-FNSBPP7Y.js} +4 -4
  35. package/package.json +1 -1
  36. package/dist/chunk-7MY2NSQX.js +0 -7
  37. package/dist/chunk-7MY2NSQX.js.map +0 -1
  38. package/dist/chunk-H74L743B.js.map +0 -1
  39. package/dist/chunk-NGD4ITAO.js.map +0 -1
  40. package/dist/chunk-QSSH4RCX.js.map +0 -1
  41. package/dist/chunk-TRNSXR46.js.map +0 -1
  42. package/dist/server-IDDX7KGT.js.map +0 -1
  43. /package/dist/{db-FP2ABUU4.js.map → db-LYQENFPW.js.map} +0 -0
  44. /package/dist/{worker-NV4GTIRG.js.map → worker-FNSBPP7Y.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  PACKAGE_VERSION
3
- } from "./chunk-7MY2NSQX.js";
3
+ } from "./chunk-OUZZNW3I.js";
4
4
  import {
5
5
  browserServiceProfileName,
6
6
  browserServiceProfileSaveChanges,
@@ -127,6 +127,13 @@ seam is noted so you can chain them.
127
127
  - Transcribe an ad video -> **facebook_ad_transcribe** (takes a videoUrl from \`facebook_page_intel\`).
128
128
  - Transcribe an organic reel/video/post -> **facebook_video_transcribe** (takes the Facebook url directly).
129
129
 
130
+ ## Google Ads (Ads Transparency Center)
131
+ - Find advertisers by domain or brand -> **google_ads_search** (returns \`advertisers[]\` with advertiserId).
132
+ - One advertiser's ads -> **google_ads_page_intel** (takes advertiserId or domain; returns \`ads[]\` with
133
+ format, imageUrls, youtubeVideoId, and videoUrl).
134
+ - Transcribe a video ad -> **google_ads_transcribe** (takes a googlevideo \`videoUrl\` from
135
+ \`google_ads_page_intel\`), or **youtube_transcribe** for a returned \`youtubeVideoId\`.
136
+
130
137
  ## Instagram
131
138
  - Profile inventory -> **instagram_profile_content** (returns post/reel/tv urls).
132
139
  - One post or reel -> **instagram_media_download** (takes a url from \`instagram_profile_content\`, or a
@@ -1012,7 +1019,9 @@ ${paaRows}` : "## People Also Ask\n*Google did not return a People Also Ask bloc
1012
1019
  ${serpRows}` : "";
1013
1020
  const aiSection = aiOvw?.detected && aiOvw.text ? `
1014
1021
  ## AI Overview
1015
- > ${truncate(aiOvw.text, 600)}` : "";
1022
+ > ${truncate(aiOvw.text, 600)}` + (aiOvw.shareUrl ? `
1023
+
1024
+ **Shareable link:** ${aiOvw.shareUrl}` : "") : "";
1016
1025
  const statsLine = durationMs ? `
1017
1026
  ## Stats
1018
1027
  - Status: ${diagnostics?.completionStatus ?? (flat.length ? "paa_found" : "no_paa")} \xB7 Questions: ${flat.length} \xB7 Duration: ${(durationMs / 1e3).toFixed(1)}s` : "";
@@ -1045,7 +1054,7 @@ ${paaTable}${serpTable}${entityIdsSection(entityIds)}${aiSection}${statsLine}${d
1045
1054
  domain: String(r.domain ?? ""),
1046
1055
  snippet: r.snippet ?? null
1047
1056
  })),
1048
- aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null } : null,
1057
+ aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null, shareUrl: aiOvw.shareUrl ?? null } : null,
1049
1058
  entityIds: entityIds ? { entities: entityIds.entities ?? [], kgIds: entityIds.kgIds ?? [], cids: entityIds.cids ?? [], gcids: entityIds.gcids ?? [] } : null,
1050
1059
  durationMs: durationMs ?? null
1051
1060
  }
@@ -1077,7 +1086,9 @@ ${serpRows}` : "## Organic Results\n*None found*";
1077
1086
  ${localRows}` : "";
1078
1087
  const aiSection = aiOvw?.detected && aiOvw.text ? `
1079
1088
  ## AI Overview
1080
- > ${truncate(aiOvw.text, 600)}` : "";
1089
+ > ${truncate(aiOvw.text, 600)}` + (aiOvw.shareUrl ? `
1090
+
1091
+ **Shareable link:** ${aiOvw.shareUrl}` : "") : "";
1081
1092
  const tips = `
1082
1093
  ---
1083
1094
  \u{1F4A1} **Tips**
@@ -1106,7 +1117,7 @@ ${serpTable}${localSection}${entityIdsSection(entityIds)}${aiSection}${debugSect
1106
1117
  reviewCount: b.reviewCount ?? null,
1107
1118
  websiteUrl: b.websiteUrl ?? null
1108
1119
  })),
1109
- aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null } : null,
1120
+ aiOverview: aiOvw ? { detected: aiOvw.detected === true, text: aiOvw.text ?? null, shareUrl: aiOvw.shareUrl ?? null } : null,
1110
1121
  entityIds: entityIds ? { entities: entityIds.entities ?? [], kgIds: entityIds.kgIds ?? [], cids: entityIds.cids ?? [], gcids: entityIds.gcids ?? [] } : null
1111
1122
  }
1112
1123
  };
@@ -1664,6 +1675,136 @@ ${rows}`,
1664
1675
  }
1665
1676
  };
1666
1677
  }
1678
+ function formatGoogleAdsSearch(raw, input) {
1679
+ const parsed = parseData(raw);
1680
+ if ("error" in parsed) return { content: [{ type: "text", text: parsed.error }], isError: true };
1681
+ const d = parsed.data;
1682
+ const advertisers = d.advertisers ?? [];
1683
+ const rows = advertisers.map(
1684
+ (a, i) => `| ${i + 1} | ${cell(a.name)} | ${cell(a.domain)} | ${a.approxAdCount ?? "\u2014"} | \`${a.advertiserId ?? "\u2014"}\` |`
1685
+ ).join("\n");
1686
+ const full = [
1687
+ `# Google Ads Transparency Search: "${input.query}"`,
1688
+ `**${advertisers.length} advertisers found**${d.region ? ` \xB7 ${d.region}` : ""}`,
1689
+ `
1690
+ ## Advertisers
1691
+ | # | Name | Domain | ~Ads | Advertiser ID |
1692
+ |---|------|--------|------|---------------|
1693
+ ${rows}`,
1694
+ `
1695
+ ---
1696
+ \u{1F4A1} **Tips**
1697
+ - Pull an advertiser's ads: use \`google_ads_page_intel\` with \`advertiserId\`
1698
+ - Or pass a \`domain\` directly to \`google_ads_page_intel\``
1699
+ ].join("\n");
1700
+ return {
1701
+ ...oneBlock(full),
1702
+ structuredContent: {
1703
+ query: input.query,
1704
+ region: d.region ?? "US",
1705
+ advertiserCount: advertisers.length,
1706
+ advertisers: advertisers.map((a) => ({
1707
+ advertiserId: a.advertiserId ?? null,
1708
+ name: a.name ?? null,
1709
+ domain: a.domain ?? null,
1710
+ approxAdCount: typeof a.approxAdCount === "number" ? a.approxAdCount : null,
1711
+ detailUrl: a.detailUrl ?? null
1712
+ }))
1713
+ }
1714
+ };
1715
+ }
1716
+ function formatGoogleAdsPageIntel(raw, input) {
1717
+ const parsed = parseData(raw);
1718
+ if ("error" in parsed) return { content: [{ type: "text", text: parsed.error }], isError: true };
1719
+ const d = parsed.data;
1720
+ const ads = d.ads ?? [];
1721
+ const rows = ads.map((a, i) => {
1722
+ const media = a.youtubeVideoId ? `yt:${a.youtubeVideoId}` : a.videoUrl ? "video" : a.imageUrls.length ? `${a.imageUrls.length} img` : "\u2014";
1723
+ return `| ${i + 1} | ${cell(a.format)} | ${media} | \`${a.creativeId ?? "\u2014"}\` |`;
1724
+ }).join("\n");
1725
+ const label = d.advertiserName ?? input.advertiserId ?? input.domain ?? "";
1726
+ const full = [
1727
+ `# Google Ads Transparency: ${label}`,
1728
+ `**${ads.length} creatives** \xB7 ${d.videoCount ?? 0} video \xB7 ${d.imageCount ?? 0} image \xB7 ${d.textCount ?? 0} text${d.region ? ` \xB7 ${d.region}` : ""}`,
1729
+ `
1730
+ ## Creatives
1731
+ | # | Format | Media | Creative ID |
1732
+ |---|--------|-------|-------------|
1733
+ ${rows}`,
1734
+ `
1735
+ ---
1736
+ \u{1F4A1} **Tips**
1737
+ - Transcribe a video ad: pass its \`videoUrl\` to \`google_ads_transcribe\`, or its \`youtubeVideoId\` to \`youtube_transcribe\`
1738
+ - Full ad detail is at each creative's \`detailUrl\``
1739
+ ].join("\n");
1740
+ return {
1741
+ ...oneBlock(full),
1742
+ structuredContent: {
1743
+ advertiserId: d.advertiserId ?? null,
1744
+ advertiserName: d.advertiserName ?? null,
1745
+ domain: d.domain ?? null,
1746
+ region: d.region ?? "US",
1747
+ totalCreatives: typeof d.totalCreatives === "number" ? d.totalCreatives : ads.length,
1748
+ videoCount: d.videoCount ?? 0,
1749
+ imageCount: d.imageCount ?? 0,
1750
+ textCount: d.textCount ?? 0,
1751
+ ads: ads.map((a) => ({
1752
+ creativeId: a.creativeId ?? null,
1753
+ advertiserId: a.advertiserId ?? null,
1754
+ format: a.format ?? null,
1755
+ lastShown: a.lastShown ?? null,
1756
+ detailUrl: a.detailUrl ?? null,
1757
+ landingDomain: a.landingDomain ?? null,
1758
+ imageUrls: Array.isArray(a.imageUrls) ? a.imageUrls : [],
1759
+ youtubeVideoId: a.youtubeVideoId ?? null,
1760
+ videoUrl: a.videoUrl ?? null,
1761
+ variations: typeof a.variations === "number" ? a.variations : null
1762
+ }))
1763
+ }
1764
+ };
1765
+ }
1766
+ function formatGoogleAdsTranscribe(raw, input) {
1767
+ const parsed = parseData(raw);
1768
+ if ("error" in parsed) return { content: [{ type: "text", text: parsed.error }], isError: true };
1769
+ const d = parsed.data;
1770
+ const text = d.text ?? "";
1771
+ const chunks = d.chunks ?? [];
1772
+ const durSec = d.durationMs ? (d.durationMs / 1e3).toFixed(0) : "\u2014";
1773
+ const words = wordCount(text);
1774
+ const chunkRows = chunks.slice(0, 50).map((c) => {
1775
+ const sec = Number.isFinite(c.timestamp[0]) ? Math.floor(c.timestamp[0]) : 0;
1776
+ const mm = String(Math.floor(sec / 60)).padStart(2, "0");
1777
+ const ss = String(sec % 60).padStart(2, "0");
1778
+ return `| ${mm}:${ss} | ${cell(truncate(c.text, 120))} |`;
1779
+ }).join("\n");
1780
+ const full = [
1781
+ `# Google Ad Transcript`,
1782
+ `**Duration:** ${durSec}s \xB7 **${words} words**`,
1783
+ `
1784
+ ## Full Transcript
1785
+ ${text}`,
1786
+ chunks.length ? `
1787
+ ## Timestamped Chunks
1788
+ | Time | Text |
1789
+ |------|------|
1790
+ ${chunkRows}` : "",
1791
+ `
1792
+ ---
1793
+ \u{1F4A1} Get more ads from this advertiser: use \`google_ads_page_intel\`.`
1794
+ ].filter(Boolean).join("\n");
1795
+ return {
1796
+ ...oneBlock(full),
1797
+ structuredContent: {
1798
+ videoUrl: input.videoUrl,
1799
+ wordCount: words,
1800
+ chunkCount: chunks.length,
1801
+ durationMs: typeof d.durationMs === "number" ? d.durationMs : null,
1802
+ transcriptText: text,
1803
+ chunks: structuredTranscriptChunks(chunks),
1804
+ resolvedInputs: { videoUrl: input.videoUrl }
1805
+ }
1806
+ };
1807
+ }
1667
1808
  function normalizeMapsAttempts(value) {
1668
1809
  const attempts = Array.isArray(value) ? value : [];
1669
1810
  return attempts.map((attempt, index) => ({
@@ -2719,6 +2860,20 @@ var FacebookVideoTranscribeInputSchema = {
2719
2860
  url: z.string().url().describe("Organic Facebook reel, video, watch, post, or share URL from facebook.com, m.facebook.com, or fb.watch. The tool renders the page, extracts the best matching public Facebook CDN MP4 URL, then transcribes it. Use this when the user pastes a normal Facebook video page URL and asks for the transcript or downloadable MP4."),
2720
2861
  quality: z.enum(["best", "hd", "sd"]).default("best").describe("Preferred progressive MP4 quality. Use best by default; hd prefers the highest HD progressive URL; sd forces the SD URL.")
2721
2862
  };
2863
+ var GoogleAdsSearchInputSchema = {
2864
+ query: z.string().min(1).describe("A domain (e.g. getviktor.com) or advertiser/brand name to look up in the Google Ads Transparency Center. Domains resolve to the advertisers running ads that point to that site."),
2865
+ region: z.string().length(2).default("US").describe("Two-letter region code for where the ads are shown. Default US. Examples: US, CA, GB, AU."),
2866
+ maxResults: z.number().int().min(1).max(20).default(10).describe("Maximum advertisers to return. Default 10, maximum 20.")
2867
+ };
2868
+ var GoogleAdsPageIntelInputSchema = {
2869
+ advertiserId: z.string().optional().describe("Google Ads Transparency advertiser ID (starts with AR...). Use one returned by google_ads_search; do not construct one yourself."),
2870
+ domain: z.string().optional().describe("A domain (e.g. getviktor.com) whose primary advertiser to inspect when advertiserId is unknown. One of advertiserId or domain is required."),
2871
+ region: z.string().length(2).default("US").describe("Two-letter region code for where the ads are shown. Default US."),
2872
+ maxAds: z.number().int().min(1).max(200).default(50).describe("Maximum creatives to inspect and hydrate. Default 50, maximum 200. Prefer 25-50 for focused scans.")
2873
+ };
2874
+ var GoogleAdsTranscribeInputSchema = {
2875
+ videoUrl: z.string().url().describe("Direct googlevideo.com playback URL from a google_ads_page_intel video ad result (the videoUrl field). For YouTube-hosted ads use youtube_transcribe with the returned youtubeVideoId instead.")
2876
+ };
2722
2877
  var InstagramProfileContentInputSchema = {
2723
2878
  handle: z.string().min(1).optional().describe("Instagram handle, with or without @. Provide handle or url."),
2724
2879
  url: z.string().url().optional().describe("Instagram profile URL, e.g. https://www.instagram.com/nasaartemis/. Provide handle or url."),
@@ -2929,7 +3084,8 @@ var OrganicResultOutput = z.object({
2929
3084
  });
2930
3085
  var AiOverviewOutput = z.object({
2931
3086
  detected: z.boolean(),
2932
- text: NullableString
3087
+ text: NullableString,
3088
+ shareUrl: NullableString.optional()
2933
3089
  }).nullable();
2934
3090
  var EntityIdsOutput = z.object({
2935
3091
  entities: z.array(z.object({
@@ -3163,6 +3319,40 @@ var FacebookPageIntelOutputSchema = {
3163
3319
  variations: z.number().int().nullable()
3164
3320
  }))
3165
3321
  };
3322
+ var GoogleAdsSearchOutputSchema = {
3323
+ query: z.string(),
3324
+ region: z.string(),
3325
+ advertiserCount: z.number().int().min(0),
3326
+ advertisers: z.array(z.object({
3327
+ advertiserId: NullableString,
3328
+ name: NullableString,
3329
+ domain: NullableString,
3330
+ approxAdCount: z.number().int().nullable(),
3331
+ detailUrl: NullableString
3332
+ }))
3333
+ };
3334
+ var GoogleAdsPageIntelOutputSchema = {
3335
+ advertiserId: NullableString,
3336
+ advertiserName: NullableString,
3337
+ domain: NullableString,
3338
+ region: z.string(),
3339
+ totalCreatives: z.number().int().min(0),
3340
+ videoCount: z.number().int().min(0),
3341
+ imageCount: z.number().int().min(0),
3342
+ textCount: z.number().int().min(0),
3343
+ ads: z.array(z.object({
3344
+ creativeId: NullableString,
3345
+ advertiserId: NullableString,
3346
+ format: NullableString,
3347
+ lastShown: NullableString,
3348
+ detailUrl: NullableString,
3349
+ landingDomain: NullableString,
3350
+ imageUrls: z.array(z.string()),
3351
+ youtubeVideoId: NullableString,
3352
+ videoUrl: NullableString,
3353
+ variations: z.number().int().nullable()
3354
+ }))
3355
+ };
3166
3356
  var FacebookVideoTranscribeOutputSchema = {
3167
3357
  sourceUrl: z.string().url(),
3168
3358
  pageUrl: z.string().url(),
@@ -3305,6 +3495,17 @@ var FacebookAdTranscribeOutputSchema = {
3305
3495
  videoUrl: z.string().url()
3306
3496
  })
3307
3497
  };
3498
+ var GoogleAdsTranscribeOutputSchema = {
3499
+ videoUrl: z.string().url(),
3500
+ wordCount: z.number().int().min(0),
3501
+ chunkCount: z.number().int().min(0),
3502
+ durationMs: z.number().nullable(),
3503
+ transcriptText: z.string(),
3504
+ chunks: z.array(TranscriptChunkOutput),
3505
+ resolvedInputs: z.object({
3506
+ videoUrl: z.string().url()
3507
+ })
3508
+ };
3308
3509
  var CaptureSerpSnapshotOutputSchema = {
3309
3510
  schemaVersion: z.literal("serp-intelligence.capture.v1"),
3310
3511
  status: z.string(),
@@ -3954,6 +4155,27 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
3954
4155
  outputSchema: FacebookAdTranscribeOutputSchema,
3955
4156
  annotations: liveWebToolAnnotations("Facebook Ad Transcription")
3956
4157
  }, async (input) => formatFacebookAdTranscribe(await executor.facebookAdTranscribe(input), input));
4158
+ server.registerTool("google_ads_search", {
4159
+ title: "Google Ads Transparency Search",
4160
+ description: withReportNote("Search the Google Ads Transparency Center to find advertisers running Google ads (Search, Display, YouTube) by domain or brand/advertiser name. Pass a domain like getviktor.com to see every advertiser account pointing ads at that site, or an advertiser name. Returns advertisers with their advertiser ID and an approximate ad count. Use this to discover an advertiserId, then pass it (or the domain) to google_ads_page_intel for the actual ad creatives."),
4161
+ inputSchema: GoogleAdsSearchInputSchema,
4162
+ outputSchema: GoogleAdsSearchOutputSchema,
4163
+ annotations: liveWebToolAnnotations("Google Ads Transparency Search")
4164
+ }, async (input) => formatGoogleAdsSearch(await executor.googleAdsSearch(input), input));
4165
+ server.registerTool("google_ads_page_intel", {
4166
+ title: "Google Ads Advertiser Intel",
4167
+ description: withReportNote("Harvest an advertiser's ads from the Google Ads Transparency Center when the user wants a competitor's Google/YouTube ad creatives, copy angles, image URLs, or video ads. Accepts an advertiserId (from google_ads_search) or a domain directly. Returns each creative's format (text/image/video), image URLs, landing info, a detail URL, and \u2014 for video ads \u2014 the YouTube video ID and/or a direct video URL ready for transcription. Use google_ads_search first when you only have a brand name. Transcribe video ads with google_ads_transcribe (video URL) or youtube_transcribe (YouTube ID)."),
4168
+ inputSchema: GoogleAdsPageIntelInputSchema,
4169
+ outputSchema: GoogleAdsPageIntelOutputSchema,
4170
+ annotations: liveWebToolAnnotations("Google Ads Advertiser Intel")
4171
+ }, async (input) => formatGoogleAdsPageIntel(await executor.googleAdsPageIntel(input), input));
4172
+ server.registerTool("google_ads_transcribe", {
4173
+ title: "Google Ad Video Transcription",
4174
+ description: "Transcribe audio from a Google video ad. Use this when google_ads_page_intel returned a direct videoUrl (a googlevideo.com playback URL) for a video creative and the user asks what the ad says or wants its claims/messaging. Returns full transcript, timestamped chunks, and word count. For YouTube-hosted ads, pass the returned youtubeVideoId to youtube_transcribe instead; run google_ads_page_intel first when you only have an advertiser/domain.",
4175
+ inputSchema: GoogleAdsTranscribeInputSchema,
4176
+ outputSchema: GoogleAdsTranscribeOutputSchema,
4177
+ annotations: liveWebToolAnnotations("Google Ad Video Transcription")
4178
+ }, async (input) => formatGoogleAdsTranscribe(await executor.googleAdsTranscribe(input), input));
3957
4179
  server.registerTool("facebook_video_transcribe", {
3958
4180
  title: "Facebook Organic Video Transcription",
3959
4181
  description: withReportNote("Transcribe audio from an organic Facebook reel, video, watch, post, or share URL, including fb.watch links. Use this when the user pastes a normal Facebook video page URL and wants the transcript or downloadable MP4. Renders the Facebook page in a browser, selects the best matching public Facebook CDN MP4 URL from page state, then returns sourceUrl, resolved pageUrl, videoId, ownerName, selectedQuality, bitrate, videoDurationSec, extracted MP4 URL, full transcript, and timestamped chunks."),
@@ -4273,6 +4495,15 @@ var HttpMcpToolExecutor = class {
4273
4495
  facebookVideoTranscribe(input) {
4274
4496
  return this.call("/facebook/video-transcribe", input, this.httpTimeoutOverrideMs ?? 24e4);
4275
4497
  }
4498
+ googleAdsSearch(input) {
4499
+ return this.call("/google-ads/search", input, this.httpTimeoutOverrideMs ?? 24e4);
4500
+ }
4501
+ googleAdsPageIntel(input) {
4502
+ return this.call("/google-ads/page-intel", input, this.httpTimeoutOverrideMs ?? 3e5);
4503
+ }
4504
+ googleAdsTranscribe(input) {
4505
+ return this.call("/google-ads/transcribe", input, this.httpTimeoutOverrideMs ?? 24e4);
4506
+ }
4276
4507
  instagramProfileContent(input) {
4277
4508
  return this.call("/instagram/profile-content", withDefaultHostedProfile(input), this.httpTimeoutOverrideMs ?? 24e4);
4278
4509
  }
@@ -5817,4 +6048,4 @@ export {
5817
6048
  exportFanout,
5818
6049
  registerBrowserAgentMcpTools
5819
6050
  };
5820
- //# sourceMappingURL=chunk-NGD4ITAO.js.map
6051
+ //# sourceMappingURL=chunk-KPF64WST.js.map