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.
- package/dist/bin/api-server.cjs +2464 -1134
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +3 -3
- package/dist/bin/mcp-scraper-cli.cjs +1 -1
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-install.cjs +1 -1
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.cjs +237 -6
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/bin/paa-harvest.cjs +109 -5
- package/dist/bin/paa-harvest.cjs.map +1 -1
- package/dist/bin/paa-harvest.js +2 -2
- package/dist/{chunk-TRNSXR46.js → chunk-DVRPXPYH.js} +22 -3
- package/dist/chunk-DVRPXPYH.js.map +1 -0
- package/dist/{chunk-QSSH4RCX.js → chunk-GMTS35L6.js} +111 -7
- package/dist/chunk-GMTS35L6.js.map +1 -0
- package/dist/{chunk-NGD4ITAO.js → chunk-KPF64WST.js} +238 -7
- package/dist/chunk-KPF64WST.js.map +1 -0
- package/dist/chunk-OUZZNW3I.js +7 -0
- package/dist/chunk-OUZZNW3I.js.map +1 -0
- package/dist/{chunk-H74L743B.js → chunk-RXJHXBGG.js} +40 -3
- package/dist/chunk-RXJHXBGG.js.map +1 -0
- package/dist/{db-FP2ABUU4.js → db-LYQENFPW.js} +2 -2
- package/dist/index.cjs +109 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +2 -2
- package/dist/{server-IDDX7KGT.js → server-CZT7EULY.js} +1157 -246
- package/dist/server-CZT7EULY.js.map +1 -0
- package/dist/{worker-NV4GTIRG.js → worker-FNSBPP7Y.js} +4 -4
- package/package.json +1 -1
- package/dist/chunk-7MY2NSQX.js +0 -7
- package/dist/chunk-7MY2NSQX.js.map +0 -1
- package/dist/chunk-H74L743B.js.map +0 -1
- package/dist/chunk-NGD4ITAO.js.map +0 -1
- package/dist/chunk-QSSH4RCX.js.map +0 -1
- package/dist/chunk-TRNSXR46.js.map +0 -1
- package/dist/server-IDDX7KGT.js.map +0 -1
- /package/dist/{db-FP2ABUU4.js.map → db-LYQENFPW.js.map} +0 -0
- /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-
|
|
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-
|
|
6051
|
+
//# sourceMappingURL=chunk-KPF64WST.js.map
|