Manage advertising campaigns across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads using the Adspirer MCP server (400+ tools across Google Search/PMax/Display/Demand Gen/YouTube, Meta image/video/carousel/lead-gen, LinkedIn sponsored content/carousel/lead-gen with campaign groups, and TikTok in-feed/Spark/Carousel/App Promotion).
When to Use This Skill
Activate when the user:
- Asks about ad campaign performance ("How are my Google Ads doing?")
- Wants to research keywords ("Find keywords for my plumbing business")
- Needs to create campaigns ("Launch a Google Search campaign for...")
- Wants budget optimization ("Where am I wasting ad spend?")
- Mentions advertising platforms (Google Ads, Meta, LinkedIn, TikTok)
- Asks about ad accounts or connections ("Which ad platforms are connected?")
Required Workflow
Follow these steps in order. Do not skip steps.
Step 1: Check Connected Platforms
Always start here before any ad operation:
- Call
get_connections_status
- Shows connected platforms, primary/secondary accounts, account IDs
- If the target platform is not connected, direct the user to https://adspirer.ai/connections
Step 2: Identify the Task
| User goal |
Workflow |
Key tools |
| View campaign metrics |
Performance Analysis |
get_campaign_performance, get_meta_campaign_performance, get_linkedin_campaign_performance |
| Cross-platform overview |
Cross-Platform Dashboard |
See Cross-Platform section below |
| Find keywords |
Keyword Research |
research_keywords |
| Research before new campaign |
Campaign Research |
Web search + Adspirer tools (see Campaign Research section) |
| Research competitors |
Competitive Intelligence |
Web search, analyze_search_terms, research_keywords |
| Create a campaign |
Campaign Creation |
Campaign Research first, then platform-specific flows below |
| Reduce wasted spend |
Budget Optimization |
optimize_budget_allocation, analyze_wasted_spend, analyze_search_terms |
| Switch accounts |
Account Management |
switch_primary_account |
| Compare platforms |
Cross-Platform |
Call each platform's performance tool, present side-by-side |
| Check ad fatigue |
Creative Management |
detect_meta_creative_fatigue, analyze_linkedin_creative_performance |
| Understand audiences |
Audience Analysis |
get_meta_audience_insights, get_linkedin_audience_insights, search_audiences |
| Manage PMax search themes |
PMax Search Themes |
add_pmax_search_themes, get_pmax_search_themes, remove_pmax_search_themes |
| Manage PMax audience signals |
PMax Audience Signals |
add_pmax_audience_signal, get_pmax_audience_signals, remove_pmax_audience_signal, search_audiences |
| Create Demand Gen campaign |
Demand Gen Creation |
discover_existing_assets, search_audiences, create_demandgen_campaign |
| Create YouTube campaign |
YouTube Creation |
discover_existing_assets, validate_video, search_audiences, create_youtube_campaign |
| Add ad extensions |
Ad Extensions |
add_sitelinks, add_callout_extensions, add_structured_snippets, list_campaign_extensions |
| Change bidding strategy |
Bidding Strategy |
update_bid_strategy, get_campaign_structure |
| Add/manage keywords |
Keyword Management |
add_keywords, remove_keywords, update_keyword, add_negative_keywords, remove_negative_keywords |
| Set up alerts |
Monitoring |
create_monitor, list_monitors |
| Schedule reports |
Reporting |
schedule_brief, generate_report_now |
Step 3: Execute Tools
Follow the workflow patterns below. Always read first (performance, status), then act (create, optimize).
Step 4: Summarize and Recommend
Present results in tables with key metrics. Highlight top and underperforming items. Propose actionable next steps.
Performance Analysis
- Google Ads:
get_campaign_performance — params: lookback_days (7/30/60/90, default 30), optional customer_id
- Meta Ads:
get_meta_campaign_performance — params: lookback_days, optional ad_account_id
- LinkedIn Ads:
get_linkedin_campaign_performance — params: lookback_days
- TikTok Ads:
get_tiktok_campaign_performance — params: lookback_days
Present: impressions, clicks, CTR, spend, conversions, cost/conversion, ROAS. Default to 30-day lookback.
Cross-Platform Performance Dashboard
When the user asks for overall performance, a weekly review, or cross-platform comparison:
- Call
get_connections_status to identify active platforms
- For each connected platform, pull performance:
- Google:
get_campaign_performance
- LinkedIn:
get_linkedin_campaign_performance
- Meta:
get_meta_campaign_performance
- TikTok:
get_tiktok_campaign_performance
- For each platform, pull waste analysis:
- Google:
analyze_wasted_spend
- LinkedIn:
analyze_linkedin_wasted_spend
- Meta:
analyze_meta_wasted_spend
- TikTok:
analyze_tiktok_wasted_spend
- Present a unified scorecard:
| Platform |
Campaigns |
Spend |
CTR |
CPA |
ROAS |
Waste |
Health |
| Google |
... |
... |
... |
... |
... |
... |
... |
| LinkedIn |
... |
... |
... |
... |
... |
... |
... |
| Meta |
... |
... |
... |
... |
... |
... |
... |
| TikTok |
... |
... |
... |
... |
... |
... |
... |
| Total |
... |
... |
|
|
|
... |
|
- Highlight:
- Best performing platform and campaign
- Worst performing platform and campaign
- Total wasted spend and top waste sources
- Budget pacing (on track, under, over)
- Recommend top 3 actions across all platforms
Campaign Research (run before creating ANY new campaign)
Before creating a campaign on any platform, research the brand's market position and competitive landscape. This combines web research with ad platform data (Adspirer MCP) to inform every campaign decision — targeting, messaging, differentiation, and bidding.
Step 0: Load Strategy Directives
Read STRATEGY.md — ## Active Directives and skim ## Decision Log. If directives exist, note them
as context that will inform (not skip) the research steps that follow. Directives shape
which competitors to focus on and what positioning angles to explore.
Do NOT skip Campaign Research just because directives exist. Directives may be stale,
incomplete, or based on exploratory conversations. Fresh research validates and enriches
them. However, avoid fully redundant research — if a comprehensive analysis was done
recently (check Decision Log dates), tell the user: "Strategy directives from [date]
are available. I'll use them as a starting point and validate with fresh data. Want me
to do a full re-analysis instead?"
Step 1: Understand the brand's own website
Crawl the brand's website. Extract:
- What they sell (products, services, pricing tiers)
- Key value propositions and differentiators
- Target audience language (how they describe their customers)
- Pricing (plans, tiers, free trial availability)
- Trust signals (customer logos, testimonials, case studies, awards)
- CTAs used on the site (what actions they push visitors toward)
Step 2: Research the competitive landscape
Search for:
"[brand's product category] competitors" — find who they compete with
"[competitor name] vs [brand name]" — find comparison content
"[competitor name] pricing" — understand competitor price points
"best [product category] [current year]" — find review/comparison sites
Then crawl the top 3-5 competitor websites. Extract:
- Their positioning and messaging (how they describe themselves)
- Their pricing (cheaper? more expensive? different model?)
- Their unique claims (what do they say they do better?)
- Their target audience (who are they speaking to?)
Step 3: Identify differentiation
Combine brand website + competitor research to answer:
- What does this brand do that competitors don't? (unique features, approach, pricing)
- What language resonates in this market? (common pain points, desired outcomes)
- Where are the gaps? (underserved audiences, unaddressed pain points)
- What should ad copy emphasize to stand out?
Step 4: Pull existing ad intelligence from Adspirer
get_campaign_performance — what's already running and how it performs
analyze_search_terms — what real users search for (Google Ads)
get_campaign_structure — current ad copy and targeting
get_benchmark_context — industry benchmarks for this vertical
Step 5: Create a research brief
Present findings to the user before proceeding with campaign creation:
- Market overview (key competitors, price ranges, positioning)
- Recommended differentiation angles (what to emphasize in ads)
- Suggested audiences based on competitive gaps
- Messaging direction (informed by competitor weaknesses and brand strengths)
Get user input on the direction before proceeding to keyword research and campaign creation.
Keyword Research (Google Ads)
Always run before creating Search campaigns. Never use generic SEO keywords.
- Tool:
research_keywords
- Params:
business_description or seed_keywords, optional website_url, target_location
- Group results by intent (high/medium/low), show search volume, CPC ranges, competition
- Use insights from Campaign Research to inform seed keywords — include competitor brand terms, differentiation keywords, and pain-point language discovered during research
- Strategy directive filter (MANDATORY): After
research_keywords returns results,
cross-reference against STRATEGY.md > Google Ads directives:
- Deprioritize keywords matching AVOID directives. Note these to the user.
- Highlight keywords matching PREFER directives.
- Apply CONSTRAINT directives (match type rules, budget caps).
- Flag conflicts: "Keyword '[term]' returned by research but conflicts with active
directive: '[text]'. Deprioritizing it."
Bidding Strategy
Before creating ANY Google Ads campaign, discuss bidding strategy with the user.
- Pull past performance:
get_campaign_performance (lookback_days: 90)
- Review existing strategies:
get_campaign_structure to see what bidding strategies current campaigns use
- Recommend a strategy based on data:
| Scenario |
Recommended Strategy |
Reasoning |
| New advertiser (no conversion data) |
Maximize Clicks |
Build traffic data first. Switch to Maximize Conversions after 30+ conversions. |
| Has conversion data (30+ conversions/month) |
Maximize Conversions or Target CPA |
Enough data for Smart Bidding to optimize. |
| Known target CPA |
Target CPA |
Set CPA at or slightly above historical average. |
| E-commerce with ROAS goals |
Target ROAS |
Set ROAS target based on margins and historical performance. |
| Brand campaign |
Manual CPC or Maximize Clicks |
Control spend on branded terms. Low CPCs expected. |
| High-value B2B leads |
Target CPA |
Long sales cycles need CPA control. Start 20% above current CPA, tighten over time. |
- Present recommendation with reasoning to the user
- Get explicit approval before setting the strategy
- To change strategy on existing campaigns:
update_bid_strategy
Important: Never silently pick a bidding strategy. Always explain the trade-offs and let the user decide.
Campaign Creation
For ALL new campaigns: Run Campaign Research first (see section above) unless the user has already provided competitive context or this is a follow-up campaign for an existing brand workspace with research already done.
Google Ads Search (exact order):
- Campaign Research — crawl brand + competitor websites, present research brief
1.5. Apply strategy directives — load STRATEGY.md. Use as context for keyword selection,
bidding, targeting, and ad copy throughout this creation flow.
research_keywords — mandatory, informed by competitive research
- Discuss bidding strategy with user (see Bidding Strategy section above)
discover_existing_assets — check for existing ad assets
validate_and_prepare_assets — validate before creation (use differentiation angles from research in ad copy)
create_search_campaign — create the campaign (PAUSED status)
- Add ad extensions (see Ad Extensions section below):
- Crawl user's website to find real page URLs
add_sitelinks — add 10+ validated sitelinks
add_callout_extensions — add 4+ callouts (use value props from research)
add_structured_snippets — add relevant structured snippets
list_campaign_extensions — verify all extensions were added
- Run post-create verification on this campaign using
get_campaign_structure:
- confirm ad groups exist
- confirm keywords exist with expected match-type profile
- confirm at least one RSA exists
- If any required asset is missing, run one targeted remediation pass for the missing asset class only, then re-verify.
- Do not report success until this campaign passes Launch Definition of Done.
Google Ads Performance Max:
- Campaign Research — crawl brand + competitor websites, present research brief
1.5. Apply strategy directives — load STRATEGY.md. Use as context for bidding,
targeting, and creative direction throughout this creation flow.
- Discuss bidding strategy with user (see Bidding Strategy section above)
discover_existing_assets — check existing assets
validate_and_prepare_assets — validate creative assets (see PMax Asset Limits below)
validate_video — validate YouTube videos if user provides them (see PMax Asset Limits)
create_pmax_campaign — create the campaign
- Add ad extensions (same as Search — sitelinks, callouts, snippets)
list_campaign_extensions — verify all extensions were added
- Add search themes (recommended) — see PMax Search Themes & Audience Signals section below:
- Ask user for search themes or derive from keyword research + brand context
add_pmax_search_themes — add up to 50 themes per asset group
get_pmax_search_themes — verify themes were added
- Add audience signals (recommended) — see PMax Search Themes & Audience Signals section below:
search_audiences — find relevant in-market, affinity, and custom audiences
- Present audience recommendations to user for approval
add_pmax_audience_signal — add audience signal combining selected segments
Google Ads Demand Gen (exact order):
Demand Gen campaigns run across YouTube (In-Feed, In-Stream, Shorts), Gmail, Discover, and Display. They support two ad formats: multi_asset (image ads) and video_responsive (video ads). Demand Gen is ideal for awareness and consideration campaigns with visual, entertainment-focused creatives.
- Campaign Research — crawl brand + competitor websites, present research brief
- Discuss bidding strategy with user:
- Maximize Clicks (default, no conversion tracking needed)
- Target CPA (requires conversion tracking)
- Maximize Conversions (requires conversion tracking)
- Target ROAS (requires conversion value tracking)
discover_existing_assets — check existing images, logos, videos
- For multi_asset format: need landscape (1.91:1) OR square (1:1) images + logo
- For video_responsive format: need YouTube video IDs (validate with
validate_video) + logo
search_audiences — find relevant in-market, affinity audiences for audience_segments parameter
create_demandgen_campaign — create the campaign with:
target_locations: supports countries, states, cities globally (e.g., ["India"], ["Bangalore, India"])
audience_segments: {"in_market_audience_ids": [80463], "affinity_audience_ids": [92913]}
channels: optional channel controls (e.g., {"display": false} for YouTube + Gmail + Discover only)
call_to_action: e.g., "LEARN_MORE", "SIGN_UP", "SHOP_NOW"
existing_images: reuse from discover_existing_assets (preferred)
- Add ad extensions (sitelinks, callouts, snippets)
list_campaign_extensions — verify extensions added
Key Demand Gen details:
- Budget: minimum ~$20/day recommended
- All campaigns created PAUSED
- Location and audience targeting are set at the ad group level (not campaign level)
- Audience targeting uses grouped Audience resources with in-market, affinity, and remarketing segments
- Channel controls: all channels ON by default. Disable specific channels via
channels parameter
Google Ads YouTube Video (exact order):
YouTube campaigns are Demand Gen campaigns with YouTube-only channel controls (Gmail, Discover, Display disabled). They require at least one YouTube video.
- Get user's YouTube video URL or ID
validate_video — validate the video (must be public or unlisted)
discover_existing_assets — find existing logos
search_audiences — find relevant audiences
create_youtube_campaign — create with:
youtube_video_id: primary video (11 chars)
target_locations: city/state/country level
audience_segments: in-market + affinity targeting
logo_asset_id OR asset_bundle_id for logo
additional_video_ids: up to 4 more videos
- Add ad extensions (sitelinks, callouts, snippets)
YouTube placements enabled: In-Feed, In-Stream, Shorts
YouTube placements disabled: Gmail, Discover, Display
Google Ads Display (Standard + Smart Display):
- Campaign Research — crawl brand + competitor sites; identify visual positioning angles
1.5. Apply strategy directives — load STRATEGY.md. Use for targeting and creative direction.
- Discuss bidding strategy with user
select_google_campaign_type — confirm "display" branch (Standard vs Smart Display)
resolve_google_locations + list_google_languages — resolve geo + language inputs (rejects ambiguous strings)
discover_existing_assets + validate_and_prepare_assets
create_display_campaign — created PAUSED by default; single-flag toggle to launch live
add_display_ad_group — add ad groups (with optional schedule + frequency caps)
- Targeting via per-surface ADD tools — audiences, topics, placements, keywords, demographics. Use
remove_display_criteria for removals.
add_display_ad — Responsive Display Ads (RDA). Later edits via update_ad_creative / update_ad_headlines / update_ad_descriptions (router auto-dispatches RSA vs RDA)
Meta Ads:
- Campaign Research — crawl brand + competitor websites, understand audience positioning
1.5. Apply strategy directives — load STRATEGY.md > Meta Ads and Cross-Platform sections.
Use as context for audience targeting and creative direction.
get_connections_status — verify Meta account connected
select_meta_campaign_type — pick objective (TRAFFIC, OUTCOME_LEADS, OUTCOME_ENGAGEMENT, CONVERSIONS, app)
search_meta_targeting / browse_meta_targeting — find interest, behavior, demographic, geo (city-level supported), language; list_meta_custom_audiences for retargeting / lookalikes
discover_meta_assets + validate_and_prepare_meta_assets — validate creative
- Create campaign — pick format:
create_meta_image_campaign — single-image; supports placement-specific creatives (Feed / Stories / Reels) and emoji headlines
create_meta_video_campaign — video creative (DCO supported)
create_meta_carousel_campaign — carousel cards
- For OUTCOME_LEADS: pass
lead_form_id (auto-fetched via list_meta_lead_forms if omitted)
- App campaigns:
app_link_spec is wired end-to-end
- Optional:
add_meta_ad_set for additional ad sets — supports lifetime budgets, end_time, granular placements (publisher_platforms, facebook_positions, instagram_positions), multi_advertiser, custom_conversion_id, Advantage+ Audience and Advantage+ Creative opt-outs (degrees_of_freedom_spec)
LinkedIn Ads:
- Campaign Research — crawl brand + competitor websites, understand B2B positioning
1.5. Apply strategy directives — load STRATEGY.md > LinkedIn Ads and Cross-Platform sections.
Use as context for targeting, messaging, and budget allocation.
get_linkedin_organizations — get linked company pages
search_linkedin_targeting (typeahead) or research_business_for_linkedin_targeting — 14 facets (job functions, seniority, industries, company size, skills, member groups)
discover_linkedin_assets — check existing creatives (paginated for 22k+ creatives, deduped)
validate_and_prepare_linkedin_assets — validate single-image, video, or carousel assets
- Create campaign — pick format:
create_linkedin_image_campaign — single-image sponsored content
create_linkedin_video_campaign — video sponsored content
create_linkedin_carousel_campaign — carousel; build cards via add_linkedin_carousel_creative
- For lead gen: pass
lead_gen_form_id
- Optional: campaign groups via
campaign_group_id / campaign_group_name or add_linkedin_campaign_to_group. list_linkedin_campaigns filters by group.
TikTok Ads:
- Campaign Research — crawl brand website, research competitor video ad strategies
1.5. Apply strategy directives — load STRATEGY.md > TikTok Ads and Cross-Platform sections.
Use as context for creative direction and audience targeting.
discover_tiktok_assets — check existing video / image assets
validate_and_prepare_tiktok_assets — validate creative assets
search_tiktok_targeting — find interests, behaviors, geo (city-level)
- Create campaign — pick objective:
create_tiktok_campaign — flexible objective; pass tiktok_item_id or card_id for Spark Ads (boost organic)
create_tiktok_video_campaign — in-feed video
- APP_PROMOTION objective for app installs
- For carousel:
create_tiktok_carousel_card then add_tiktok_ad
- Optional: CBO via
budget_optimize_on (default true). add_tiktok_ad_group for additional ad groups; update_tiktok_* to adjust live campaigns
- CTAs are server-validated (defaults to LEARN_MORE if
landing_page_url provided without call_to_action). optimization_event accepts the full event taxonomy: FORM, ON_WEB_CART, ON_WEB_DETAIL, ON_WEB_REGISTER, COMPLETE_PAYMENT, CONVERSION_LEADS, PAGE_VISIT, etc.
Ad Extensions (Google Ads)
Ad extensions improve Quality Score, increase ad real estate, and boost CTR. Always add extensions after creating a Google Ads campaign.
Before Adding Extensions
Call list_campaign_extensions to check what already exists on the campaign. Never duplicate existing extensions.
Sitelinks (add_sitelinks)
Sitelinks are the most impactful extension. Target 10+ sitelinks (more is better — Google rotates the best performers).
Workflow:
- Crawl the user's website homepage — extract all navigation links and key pages
- Build a candidate list of pages to include:
- Homepage, Pricing/Plans, About Us, Contact, Key product/service pages, Blog, Case Studies/Testimonials, FAQ/Help, Free Trial/Demo, Careers
- Validate each URL — confirm it loads (no 404s, no redirects to error pages)
- For each valid sitelink, prepare:
- Link text: max 25 characters, descriptive (e.g., "View Pricing Plans")
- Description line 1: max 35 characters (e.g., "Plans starting at $29/month")
- Description line 2: max 35 characters (e.g., "Free 14-day trial included")
- Final URL: the validated page URL
- If fewer than 8 valid pages found → ask the user for additional URLs or pages to include
- Present the full sitelink list to the user for review before adding
- Call
add_sitelinks with the approved list
Callout Extensions (add_callout_extensions)
Callouts highlight value propositions. Target 8+ callouts (minimum 4).
Workflow:
- Extract value propositions from:
- Website content (crawled)
- Brand docs (AGENTS.md if it exists)
- Existing ad copy in the account
- Each callout: max 25 characters
- Examples: "Free Shipping", "24/7 Support", "No Setup Fee", "Cancel Anytime", "Money-Back Guarantee", "Same-Day Delivery", "Award-Winning", "Trusted by 10K+"
- Present to user for approval, then call
add_callout_extensions
Structured Snippets (add_structured_snippets)
Snippets show predefined categories of offerings. Pick headers relevant to the business.
Available headers: Brands, Courses, Destinations, Featured Hotels, Insurance Coverage, Models, Neighborhoods, Service Catalog, Shows, Styles, Types
Workflow:
- Review the user's website and business type to pick relevant headers
- Extract 3-10 values per header from website content
- Example: SaaS company → Header "Types" with values "Analytics, Reporting, Dashboards, API Access"
- Example: E-commerce → Header "Brands" with values "Nike, Adidas, Puma, New Balance"
- Present to user, then call
add_structured_snippets
Price Extensions
If the user's website has a pricing page:
- Crawl the pricing page
- Extract plan names, prices, and descriptions
- Present to user for confirmation before adding
Call Extensions
If the business has a phone number:
- Ask the user for their business phone number
- Discuss call tracking preferences
- Set call hours if business has limited availability
Extension Verification
After adding all extensions, always call list_campaign_extensions to verify:
- All sitelinks were added and have correct URLs
- Callouts are present
- Structured snippets are showing
- Report back to the user what was added
If list_campaign_extensions fails:
- Retry once with a corrected payload or narrower scope.
- Cross-check extension state with
get_campaign_structure.
- If extension state is still unverifiable, report
PARTIAL_SUCCESS and explicitly list what could not be confirmed.
Launch Definition of Done (Required before reporting success)
For each created campaign, all checks below must pass:
- Campaign exists and status is
PAUSED (unless user explicitly approved activation).
- Expected ad group count exists.
- Expected keywords exist, with the planned match-type profile (EXACT/PHRASE/BROAD as specified).
- At least one RSA exists with expected headline/description counts.
- Required extensions exist (sitelinks, callouts, structured snippets for Google Ads campaigns).
- Requested-vs-actual bidding strategy matches, or any drift is explicitly called out.
Status protocol (mandatory)
SUCCESS: all Launch Definition of Done checks pass for all targeted campaigns.
PARTIAL_SUCCESS: campaign shell exists, but one or more required assets are missing/unverifiable after one targeted remediation pass.
FAILED: campaign creation itself failed.
Never report SUCCESS when any verification check failed or could not be confirmed.
Per-campaign action ledger (mandatory)
For every campaign you create or edit, log and return:
- campaign name + campaign_id
- ad_group_id values touched
- keyword add/update counts
- RSA counts (headlines/descriptions)
- extension counts (sitelinks/callouts/snippets)
- verification result per campaign (
PASS/FAIL)
Ad Quality Guardrails (Google Ads)
Keyword-to-headline coverage
For each ad group, include unique high-intent target keywords in RSA headlines. At minimum:
- cover top 3-5 keyword themes from the ad group's keyword list
- avoid generic headline sets that omit core search intent terms
- when competitive terms are targeted, keep competitor names in keywords only if required by strategy and avoid naming competitors in ad copy unless user explicitly approves
Asset length validation checklist (before submission)
- RSA headline: <= 30 characters
- RSA description: <= 90 characters
- Path fields: <= 15 characters each
- Sitelink text: <= 25 characters
- Sitelink description lines: <= 35 characters each
- Callout text: <= 25 characters
- Structured snippet values: follow platform limits and keep concise
Validate lengths before create_* or add_* calls. If limits are exceeded, rewrite and re-validate before submitting.
PMax Asset Limits (CRITICAL — enforce before every PMax campaign)
Google Ads Performance Max enforces strict asset limits per asset group. Exceeding these limits causes campaign creation to fail with ENABLED_IMAGE_ASSET_LINKS_PER_ASSET_GROUP or similar errors. The agent MUST enforce these limits before calling validate_and_prepare_assets or create_pmax_campaign.
Image Asset Limits
| Asset type |
Minimum |
Maximum |
Notes |
| Landscape images (1.91:1) |
1 |
20 |
Required — at least 1 |
| Square images (1:1) |
1 |
20 |
Required — at least 1 |
| Portrait images (4:5) |
0 |
20 |
Optional |
| TOTAL marketing images |
2 |
20 |
Across ALL ratios combined |
| Square logos (1:1) |
1 |
5 |
Required — at least 1 |
| Landscape logos (4:1) |
0 |
5 |
Optional |
CRITICAL: The 20-image limit is TOTAL across landscape + square + portrait, NOT 20 per ratio. If a user provides 10 landscape + 15 square + 13 portrait = 38 images, you must reduce to 20 total.
When user provides more than 20 total marketing images:
- Inform the user: "Google Ads allows max 20 marketing images total per PMax asset group across all ratios. You provided [N]. I'll select the best 20."
- Distribute proportionally across ratios while respecting minimums (at least 1 landscape, at least 1 square)
- Prefer keeping variety across ratios over loading up one ratio
validate_and_prepare_assets handles this automatically, but you should inform the user proactively
When user provides fewer than minimums:
- Missing landscape images: Ask the user to provide at least 1 landscape image (1.91:1 ratio, 1200x628px recommended)
- Missing square images: Ask the user to provide at least 1 square image (1:1 ratio, 1200x1200px recommended)
- Missing square logo: Ask the user to provide at least 1 square logo (1:1 ratio, 128x128px minimum)
- Do NOT proceed with campaign creation until minimums are met
Text Asset Limits
| Asset type |
Minimum |
Maximum |
Max characters |
| Headlines |
3 |
15 |
30 chars each |
| Long headlines |
1 |
5 |
90 chars each |
| Descriptions |
2 |
5 |
90 chars each |
| Business name |
1 |
1 |
25 chars |
When user provides more than the maximum:
- Truncate to the limit, keeping the first N items
- Inform the user: "PMax allows max [N] [asset type]. Using the first [N]."
When user provides fewer than minimums:
- Ask for the missing assets. Example: "PMax requires at least 3 headlines. You provided 1. Please provide 2 more headlines (max 30 characters each)."
- Do NOT proceed until minimums are met
Video Asset Limits
| Asset type |
Minimum |
Maximum |
Requirements |
| YouTube videos |
0 |
5 |
Must be YouTube video IDs/URLs |
Video validation workflow:
- Call
validate_video with platform="pmax" for each video
- This validates the YouTube video ID format only (11 chars, alphanumeric)
- Google Ads API will verify the video exists, is public/unlisted, and embeddable during campaign creation
- If user provides more than 5 videos, use only the first 5 and inform them
- Videos are optional — campaigns can be created without them (Google will auto-generate video ads from images)
Asset Limit Enforcement Checklist (before calling create_pmax_campaign)
Before creating any PMax campaign, verify:
If any check fails, ask the user for the missing/corrected assets before proceeding.
PMax Search Themes & Audience Signals
Search themes and audience signals are PMax-only features — they do not apply to Search, Display, or other campaign types. Both are configured at the asset group level.
Search Themes
Search themes are short phrases (max 50 per asset group) that tell Google which search queries your PMax campaign should target. They supplement Google's automated targeting with explicit intent signals.
When to add search themes:
- During PMax campaign creation (step 9 above)
- When user wants to refine PMax targeting ("add search themes to my PMax campaign")
- When search term analysis reveals high-performing queries not yet covered
- When expanding into new market segments
Workflow:
get_pmax_search_themes — check existing themes on the campaign (requires campaign_id)
- Derive theme candidates from:
- Keyword research results (
research_keywords)
- Search term reports (
analyze_search_terms)
- Brand context and product categories
- Competitive research findings
- Present candidate themes to user for approval
add_pmax_search_themes — add approved themes (params: campaign_id, search_themes list)
get_pmax_search_themes — verify themes were added
Limits and rules:
- Max 50 search themes per asset group (Google's limit)
- Duplicates are filtered automatically (case-insensitive)
- Empty/whitespace themes are filtered automatically
- Search themes only support add and remove — no update (remove + re-add instead)
- To remove:
remove_pmax_search_themes with the theme resource names from get_pmax_search_themes
Audience Signals
Audience signals tell Google which audience segments are most likely to convert. They are signals, not hard targeting — Google uses them as starting points and expands from there. Only one audience signal is allowed per asset group (containing multiple segments).
When to add audience signals:
- During PMax campaign creation (step 10 above)
- When user wants to add targeting to a PMax campaign
- When audience analysis reveals high-value segments
- When launching PMax for a specific product/audience niche
Supported segment types:
| Type |
Tool parameter |
Description |
| In-market audiences |
in_market_audience_ids |
Users actively researching/comparing products in a category |
| Affinity audiences |
affinity_audience_ids |
Users with sustained interests and habits |
| Custom audiences |
custom_audience_ids |
Account-level custom audience segments |
| User lists (remarketing) |
user_list_ids |
First-party data — website visitors, customer lists, CRM uploads |
Workflow:
get_pmax_audience_signals — check existing signals on the campaign (requires campaign_id)
- Discover available audiences:
search_audiences — search by keyword across all audience types (in-market, affinity, custom)
- Use brand context and competitive research to inform search terms
- Present audience recommendations organized by type with rationale
- Get user approval for segment selection
add_pmax_audience_signal — add signal with selected segment IDs
get_pmax_audience_signals — verify signal was added
Limits and rules:
- Only one audience signal per asset group — it must combine all desired segments
- To change:
remove_pmax_audience_signal (with resource name), then add_pmax_audience_signal with updated segments
- Audience signals only support add and remove — no update
- Use
search_audiences to find audience IDs — do not guess or hardcode IDs
Conversion Tracking Limitation
Adspirer MCP currently does not configure Google Ads conversion action settings (primary vs secondary) directly.
When campaign goals depend on conversion action priority:
- create campaigns in PAUSED status
- tell the user exact Google Ads UI path to configure conversion actions manually
- report campaign creation as complete only after clarifying this manual step
Budget Optimization (Google Ads)
optimize_budget_allocation — suggest budget reallocations
analyze_wasted_spend — find underperforming keywords and ad groups
analyze_search_terms — review search terms for negative keyword opportunities
Creative Fatigue Detection & Refresh
When reviewing creative performance or user asks about ad fatigue:
- Meta: Call
detect_meta_creative_fatigue for fatigue scores
- LinkedIn: Call
analyze_linkedin_creative_performance for per-creative metrics
- Google: Call
get_campaign_structure to see ad-level performance
- Identify ads with:
- High frequency + declining CTR (fatigued)
- More than 30 days running with no refresh
- Below-average CTR for their campaign
- For fatigued ads:
- Call
suggest_ad_content for new headline/description ideas
- Call
generate_linkedin_ad_creatives for LinkedIn variations
- Present new creative options (filtered through brand voice if AGENTS.md exists)
- On approval: update via
update_ad_headlines, update_ad_descriptions, add_linkedin_creative, etc.
A/B Testing Workflow
When creating new ad variations for testing:
- Read current top-performing ad copy (from campaign structure)
- Generate 3-5 variations testing ONE variable:
- Headline variation (keep description same)
- Description variation (keep headline same)
- CTA variation
- Audience variation (same ad, different targeting)
- Present test plan with hypothesis:
"Testing: 'Headline A' vs 'Headline B'
Hypothesis: [why we think one may outperform]
Duration: 2 weeks, split budget 50/50
Success metric: CTR and conversion rate"
- On approval, create test variants via platform-specific tools
- Log test for follow-up analysis
Audience Analysis & Optimization
When analyzing or optimizing audiences:
- Pull audience data:
- Meta:
get_meta_audience_insights + analyze_meta_audiences
- LinkedIn:
get_linkedin_audience_insights
- Google: Review campaign targeting from
get_campaign_structure
- Identify:
- Which audience segments convert best (by age, gender, job title, interest)
- Audience overlap/saturation
- Underperforming segments (high spend, low conversion)
- For LinkedIn B2B specifically:
- Call
research_business_for_linkedin_targeting with brand's website
- Compare AI-recommended targeting vs current targeting
- Identify gaps (seniority levels, industries, company sizes not covered)
- For Meta:
- Call
optimize_meta_placements for placement-level performance
- Identify which placements to scale/reduce
- Present findings with recommendations:
- Segments to expand (high ROAS, low spend)
- Segments to cut (low ROAS, high spend)
- New segments to test
Monitoring & Alerts
When user wants alerts or ongoing monitoring:
- Understand what they want to monitor:
- Budget pacing (approaching monthly limit)
- Performance drops (ROAS below target, CPA above target)
- Opportunity alerts (keyword with sudden volume increase)
- Call
create_monitor with appropriate:
- Metric (ROAS, CTR, CPC, CPA, spend, conversions)
- Threshold and direction (below 3.0, above $150)
- Delivery (email, Slack, SMS)
- Call
list_monitors to confirm setup
- To modify:
manage_scheduled_task with monitor ID
Reporting
When user wants performance reports:
- Ask: frequency (one-time, weekly, monthly) and format preference
- For one-time: Call
generate_report_now
- For recurring: Call
schedule_brief with:
- Frequency (daily, weekly)
- Delivery method (email, Slack, webhook)
- Content scope (all platforms or specific)
- Call
list_scheduled_tasks to confirm
Competitive Intelligence
When analyzing competitors or adjusting competitive strategy:
Step 1: Identify competitors
- Read AGENTS.md for known competitors (check Competitors section)
- Sear
…(truncated)
1---2name: adspirer-ads3description: Manage ad campaigns across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads. Use when the user wants to analyze campaign performance, research keywords, create campaigns, optimize budgets, or manage ad accounts via the Adspirer MCP server.4---56Manage advertising campaigns across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads using the Adspirer MCP server (400+ tools across Google Search/PMax/Display/Demand Gen/YouTube, Meta image/video/carousel/lead-gen, LinkedIn sponsored content/carousel/lead-gen with campaign groups, and TikTok in-feed/Spark/Carousel/App Promotion).78## When to Use This Skill910Activate when the user:1112- Asks about ad campaign performance ("How are my Google Ads doing?")13- Wants to research keywords ("Find keywords for my plumbing business")14- Needs to create campaigns ("Launch a Google Search campaign for...")15- Wants budget optimization ("Where am I wasting ad spend?")16- Mentions advertising platforms (Google Ads, Meta, LinkedIn, TikTok)17- Asks about ad accounts or connections ("Which ad platforms are connected?")1819## Required Workflow2021**Follow these steps in order. Do not skip steps.**2223### Step 1: Check Connected Platforms2425Always start here before any ad operation:2627- Call `get_connections_status`28- Shows connected platforms, primary/secondary accounts, account IDs29- If the target platform is not connected, direct the user to https://adspirer.ai/connections3031### Step 2: Identify the Task3233| User goal | Workflow | Key tools |34|-----------|----------|-----------|35| View campaign metrics | Performance Analysis | `get_campaign_performance`, `get_meta_campaign_performance`, `get_linkedin_campaign_performance` |36| Cross-platform overview | Cross-Platform Dashboard | See Cross-Platform section below |37| Find keywords | Keyword Research | `research_keywords` |38| Research before new campaign | Campaign Research | Web search + Adspirer tools (see Campaign Research section) |39| Research competitors | Competitive Intelligence | Web search, `analyze_search_terms`, `research_keywords` |40| Create a campaign | Campaign Creation | Campaign Research first, then platform-specific flows below |41| Reduce wasted spend | Budget Optimization | `optimize_budget_allocation`, `analyze_wasted_spend`, `analyze_search_terms` |42| Switch accounts | Account Management | `switch_primary_account` |43| Compare platforms | Cross-Platform | Call each platform's performance tool, present side-by-side |44| Check ad fatigue | Creative Management | `detect_meta_creative_fatigue`, `analyze_linkedin_creative_performance` |45| Understand audiences | Audience Analysis | `get_meta_audience_insights`, `get_linkedin_audience_insights`, `search_audiences` |46| Manage PMax search themes | PMax Search Themes | `add_pmax_search_themes`, `get_pmax_search_themes`, `remove_pmax_search_themes` |47| Manage PMax audience signals | PMax Audience Signals | `add_pmax_audience_signal`, `get_pmax_audience_signals`, `remove_pmax_audience_signal`, `search_audiences` |48| Create Demand Gen campaign | Demand Gen Creation | `discover_existing_assets`, `search_audiences`, `create_demandgen_campaign` |49| Create YouTube campaign | YouTube Creation | `discover_existing_assets`, `validate_video`, `search_audiences`, `create_youtube_campaign` |50| Add ad extensions | Ad Extensions | `add_sitelinks`, `add_callout_extensions`, `add_structured_snippets`, `list_campaign_extensions` |51| Change bidding strategy | Bidding Strategy | `update_bid_strategy`, `get_campaign_structure` |52| Add/manage keywords | Keyword Management | `add_keywords`, `remove_keywords`, `update_keyword`, `add_negative_keywords`, `remove_negative_keywords` |53| Set up alerts | Monitoring | `create_monitor`, `list_monitors` |54| Schedule reports | Reporting | `schedule_brief`, `generate_report_now` |5556### Step 3: Execute Tools5758Follow the workflow patterns below. Always read first (performance, status), then act (create, optimize).5960### Step 4: Summarize and Recommend6162Present results in tables with key metrics. Highlight top and underperforming items. Propose actionable next steps.6364## Performance Analysis6566- **Google Ads:** `get_campaign_performance` — params: `lookback_days` (7/30/60/90, default 30), optional `customer_id`67- **Meta Ads:** `get_meta_campaign_performance` — params: `lookback_days`, optional `ad_account_id`68- **LinkedIn Ads:** `get_linkedin_campaign_performance` — params: `lookback_days`69- **TikTok Ads:** `get_tiktok_campaign_performance` — params: `lookback_days`7071Present: impressions, clicks, CTR, spend, conversions, cost/conversion, ROAS. Default to 30-day lookback.7273## Cross-Platform Performance Dashboard7475When the user asks for overall performance, a weekly review, or cross-platform comparison:76771. Call `get_connections_status` to identify active platforms782. For each connected platform, pull performance:79 - Google: `get_campaign_performance`80 - LinkedIn: `get_linkedin_campaign_performance`81 - Meta: `get_meta_campaign_performance`82 - TikTok: `get_tiktok_campaign_performance`833. For each platform, pull waste analysis:84 - Google: `analyze_wasted_spend`85 - LinkedIn: `analyze_linkedin_wasted_spend`86 - Meta: `analyze_meta_wasted_spend`87 - TikTok: `analyze_tiktok_wasted_spend`884. Present a unified scorecard:8990| Platform | Campaigns | Spend | CTR | CPA | ROAS | Waste | Health |91|----------|-----------|-------|-----|-----|------|-------|--------|92| Google | ... | ... | ... | ... | ... | ... | ... |93| LinkedIn | ... | ... | ... | ... | ... | ... | ... |94| Meta | ... | ... | ... | ... | ... | ... | ... |95| TikTok | ... | ... | ... | ... | ... | ... | ... |96| **Total**| ... | ... | | | | ... | |97985. Highlight:99 - Best performing platform and campaign100 - Worst performing platform and campaign101 - Total wasted spend and top waste sources102 - Budget pacing (on track, under, over)1036. Recommend top 3 actions across all platforms104105## Campaign Research (run before creating ANY new campaign)106107Before creating a campaign on any platform, research the brand's market position and competitive landscape. This combines web research with ad platform data (Adspirer MCP) to inform every campaign decision — targeting, messaging, differentiation, and bidding.108109### Step 0: Load Strategy Directives110Read STRATEGY.md — `## Active Directives` and skim `## Decision Log`. If directives exist, note them111as context that will inform (not skip) the research steps that follow. Directives shape112which competitors to focus on and what positioning angles to explore.113114Do NOT skip Campaign Research just because directives exist. Directives may be stale,115incomplete, or based on exploratory conversations. Fresh research validates and enriches116them. However, avoid fully redundant research — if a comprehensive analysis was done117recently (check Decision Log dates), tell the user: "Strategy directives from [date]118are available. I'll use them as a starting point and validate with fresh data. Want me119to do a full re-analysis instead?"120121### Step 1: Understand the brand's own website122Crawl the brand's website. Extract:123- What they sell (products, services, pricing tiers)124- Key value propositions and differentiators125- Target audience language (how they describe their customers)126- Pricing (plans, tiers, free trial availability)127- Trust signals (customer logos, testimonials, case studies, awards)128- CTAs used on the site (what actions they push visitors toward)129130### Step 2: Research the competitive landscape131Search for:132- `"[brand's product category] competitors"` — find who they compete with133- `"[competitor name] vs [brand name]"` — find comparison content134- `"[competitor name] pricing"` — understand competitor price points135- `"best [product category] [current year]"` — find review/comparison sites136137Then crawl the top 3-5 competitor websites. Extract:138- Their positioning and messaging (how they describe themselves)139- Their pricing (cheaper? more expensive? different model?)140- Their unique claims (what do they say they do better?)141- Their target audience (who are they speaking to?)142143### Step 3: Identify differentiation144Combine brand website + competitor research to answer:145- What does this brand do that competitors don't? (unique features, approach, pricing)146- What language resonates in this market? (common pain points, desired outcomes)147- Where are the gaps? (underserved audiences, unaddressed pain points)148- What should ad copy emphasize to stand out?149150### Step 4: Pull existing ad intelligence from Adspirer151- `get_campaign_performance` — what's already running and how it performs152- `analyze_search_terms` — what real users search for (Google Ads)153- `get_campaign_structure` — current ad copy and targeting154- `get_benchmark_context` — industry benchmarks for this vertical155156### Step 5: Create a research brief157Present findings to the user before proceeding with campaign creation:158- Market overview (key competitors, price ranges, positioning)159- Recommended differentiation angles (what to emphasize in ads)160- Suggested audiences based on competitive gaps161- Messaging direction (informed by competitor weaknesses and brand strengths)162163Get user input on the direction before proceeding to keyword research and campaign creation.164165## Keyword Research (Google Ads)166167Always run before creating Search campaigns. Never use generic SEO keywords.168169- Tool: `research_keywords`170- Params: `business_description` or `seed_keywords`, optional `website_url`, `target_location`171- Group results by intent (high/medium/low), show search volume, CPC ranges, competition172- Use insights from Campaign Research to inform seed keywords — include competitor brand terms, differentiation keywords, and pain-point language discovered during research173- **Strategy directive filter (MANDATORY):** After `research_keywords` returns results,174 cross-reference against STRATEGY.md > Google Ads directives:175 - Deprioritize keywords matching AVOID directives. Note these to the user.176 - Highlight keywords matching PREFER directives.177 - Apply CONSTRAINT directives (match type rules, budget caps).178 - Flag conflicts: "Keyword '[term]' returned by research but conflicts with active179 directive: '[text]'. Deprioritizing it."180181## Bidding Strategy182183**Before creating ANY Google Ads campaign, discuss bidding strategy with the user.**1841851. Pull past performance: `get_campaign_performance` (lookback_days: 90)1862. Review existing strategies: `get_campaign_structure` to see what bidding strategies current campaigns use1873. Recommend a strategy based on data:188189| Scenario | Recommended Strategy | Reasoning |190|----------|---------------------|-----------|191| New advertiser (no conversion data) | Maximize Clicks | Build traffic data first. Switch to Maximize Conversions after 30+ conversions. |192| Has conversion data (30+ conversions/month) | Maximize Conversions or Target CPA | Enough data for Smart Bidding to optimize. |193| Known target CPA | Target CPA | Set CPA at or slightly above historical average. |194| E-commerce with ROAS goals | Target ROAS | Set ROAS target based on margins and historical performance. |195| Brand campaign | Manual CPC or Maximize Clicks | Control spend on branded terms. Low CPCs expected. |196| High-value B2B leads | Target CPA | Long sales cycles need CPA control. Start 20% above current CPA, tighten over time. |1971984. Present recommendation with reasoning to the user1995. Get explicit approval before setting the strategy2006. To change strategy on existing campaigns: `update_bid_strategy`201202**Important:** Never silently pick a bidding strategy. Always explain the trade-offs and let the user decide.203204## Campaign Creation205206**For ALL new campaigns**: Run Campaign Research first (see section above) unless the user has already provided competitive context or this is a follow-up campaign for an existing brand workspace with research already done.207208**Google Ads Search (exact order):**2091. Campaign Research — crawl brand + competitor websites, present research brief2101.5. **Apply strategy directives** — load STRATEGY.md. Use as context for keyword selection,211 bidding, targeting, and ad copy throughout this creation flow.2122. `research_keywords` — mandatory, informed by competitive research2133. Discuss bidding strategy with user (see Bidding Strategy section above)2144. `discover_existing_assets` — check for existing ad assets2155. `validate_and_prepare_assets` — validate before creation (use differentiation angles from research in ad copy)2166. `create_search_campaign` — create the campaign (PAUSED status)2177. Add ad extensions (see Ad Extensions section below):218 - Crawl user's website to find real page URLs219 - `add_sitelinks` — add 10+ validated sitelinks220 - `add_callout_extensions` — add 4+ callouts (use value props from research)221 - `add_structured_snippets` — add relevant structured snippets2228. `list_campaign_extensions` — verify all extensions were added2239. Run post-create verification on this campaign using `get_campaign_structure`:224 - confirm ad groups exist225 - confirm keywords exist with expected match-type profile226 - confirm at least one RSA exists22710. If any required asset is missing, run one targeted remediation pass for the missing asset class only, then re-verify.22811. Do not report success until this campaign passes Launch Definition of Done.229230**Google Ads Performance Max:**2311. Campaign Research — crawl brand + competitor websites, present research brief2321.5. **Apply strategy directives** — load STRATEGY.md. Use as context for bidding,233 targeting, and creative direction throughout this creation flow.2342. Discuss bidding strategy with user (see Bidding Strategy section above)2353. `discover_existing_assets` — check existing assets2364. `validate_and_prepare_assets` — validate creative assets (see PMax Asset Limits below)2375. `validate_video` — validate YouTube videos if user provides them (see PMax Asset Limits)2386. `create_pmax_campaign` — create the campaign2397. Add ad extensions (same as Search — sitelinks, callouts, snippets)2408. `list_campaign_extensions` — verify all extensions were added2419. **Add search themes (recommended)** — see PMax Search Themes & Audience Signals section below:242 - Ask user for search themes or derive from keyword research + brand context243 - `add_pmax_search_themes` — add up to 50 themes per asset group244 - `get_pmax_search_themes` — verify themes were added24510. **Add audience signals (recommended)** — see PMax Search Themes & Audience Signals section below:246 - `search_audiences` — find relevant in-market, affinity, and custom audiences247 - Present audience recommendations to user for approval248 - `add_pmax_audience_signal` — add audience signal combining selected segments249250**Google Ads Demand Gen (exact order):**251252Demand Gen campaigns run across YouTube (In-Feed, In-Stream, Shorts), Gmail, Discover, and Display. They support two ad formats: **multi_asset** (image ads) and **video_responsive** (video ads). Demand Gen is ideal for awareness and consideration campaigns with visual, entertainment-focused creatives.2532541. Campaign Research — crawl brand + competitor websites, present research brief2552. Discuss bidding strategy with user:256 - **Maximize Clicks** (default, no conversion tracking needed)257 - **Target CPA** (requires conversion tracking)258 - **Maximize Conversions** (requires conversion tracking)259 - **Target ROAS** (requires conversion value tracking)2603. `discover_existing_assets` — check existing images, logos, videos2614. For multi_asset format: need landscape (1.91:1) OR square (1:1) images + logo2625. For video_responsive format: need YouTube video IDs (validate with `validate_video`) + logo2636. `search_audiences` — find relevant in-market, affinity audiences for `audience_segments` parameter2647. `create_demandgen_campaign` — create the campaign with:265 - `target_locations`: supports countries, states, cities globally (e.g., `["India"]`, `["Bangalore, India"]`)266 - `audience_segments`: `{"in_market_audience_ids": [80463], "affinity_audience_ids": [92913]}`267 - `channels`: optional channel controls (e.g., `{"display": false}` for YouTube + Gmail + Discover only)268 - `call_to_action`: e.g., `"LEARN_MORE"`, `"SIGN_UP"`, `"SHOP_NOW"`269 - `existing_images`: reuse from `discover_existing_assets` (preferred)2708. Add ad extensions (sitelinks, callouts, snippets)2719. `list_campaign_extensions` — verify extensions added272273**Key Demand Gen details:**274- Budget: minimum ~$20/day recommended275- All campaigns created PAUSED276- Location and audience targeting are set at the **ad group level** (not campaign level)277- Audience targeting uses grouped Audience resources with in-market, affinity, and remarketing segments278- Channel controls: all channels ON by default. Disable specific channels via `channels` parameter279280**Google Ads YouTube Video (exact order):**281282YouTube campaigns are Demand Gen campaigns with YouTube-only channel controls (Gmail, Discover, Display disabled). They require at least one YouTube video.2832841. Get user's YouTube video URL or ID2852. `validate_video` — validate the video (must be public or unlisted)2863. `discover_existing_assets` — find existing logos2874. `search_audiences` — find relevant audiences2885. `create_youtube_campaign` — create with:289 - `youtube_video_id`: primary video (11 chars)290 - `target_locations`: city/state/country level291 - `audience_segments`: in-market + affinity targeting292 - `logo_asset_id` OR `asset_bundle_id` for logo293 - `additional_video_ids`: up to 4 more videos2946. Add ad extensions (sitelinks, callouts, snippets)295296**YouTube placements enabled:** In-Feed, In-Stream, Shorts297**YouTube placements disabled:** Gmail, Discover, Display298299**Google Ads Display (Standard + Smart Display):**3001. Campaign Research — crawl brand + competitor sites; identify visual positioning angles3011.5. **Apply strategy directives** — load STRATEGY.md. Use for targeting and creative direction.3022. Discuss bidding strategy with user3033. `select_google_campaign_type` — confirm "display" branch (Standard vs Smart Display)3044. `resolve_google_locations` + `list_google_languages` — resolve geo + language inputs (rejects ambiguous strings)3055. `discover_existing_assets` + `validate_and_prepare_assets`3066. `create_display_campaign` — created PAUSED by default; single-flag toggle to launch live3077. `add_display_ad_group` — add ad groups (with optional schedule + frequency caps)3088. Targeting via per-surface ADD tools — audiences, topics, placements, keywords, demographics. Use `remove_display_criteria` for removals.3099. `add_display_ad` — Responsive Display Ads (RDA). Later edits via `update_ad_creative` / `update_ad_headlines` / `update_ad_descriptions` (router auto-dispatches RSA vs RDA)310311**Meta Ads:**3121. Campaign Research — crawl brand + competitor websites, understand audience positioning3131.5. **Apply strategy directives** — load STRATEGY.md > Meta Ads and Cross-Platform sections.314 Use as context for audience targeting and creative direction.3152. `get_connections_status` — verify Meta account connected3163. `select_meta_campaign_type` — pick objective (TRAFFIC, OUTCOME_LEADS, OUTCOME_ENGAGEMENT, CONVERSIONS, app)3174. `search_meta_targeting` / `browse_meta_targeting` — find interest, behavior, demographic, geo (city-level supported), language; `list_meta_custom_audiences` for retargeting / lookalikes3185. `discover_meta_assets` + `validate_and_prepare_meta_assets` — validate creative3196. Create campaign — pick format:320 - `create_meta_image_campaign` — single-image; supports placement-specific creatives (Feed / Stories / Reels) and emoji headlines321 - `create_meta_video_campaign` — video creative (DCO supported)322 - `create_meta_carousel_campaign` — carousel cards323 - For OUTCOME_LEADS: pass `lead_form_id` (auto-fetched via `list_meta_lead_forms` if omitted)324 - App campaigns: `app_link_spec` is wired end-to-end3257. Optional: `add_meta_ad_set` for additional ad sets — supports lifetime budgets, end_time, granular placements (publisher_platforms, facebook_positions, instagram_positions), multi_advertiser, custom_conversion_id, Advantage+ Audience and Advantage+ Creative opt-outs (`degrees_of_freedom_spec`)326327**LinkedIn Ads:**3281. Campaign Research — crawl brand + competitor websites, understand B2B positioning3291.5. **Apply strategy directives** — load STRATEGY.md > LinkedIn Ads and Cross-Platform sections.330 Use as context for targeting, messaging, and budget allocation.3312. `get_linkedin_organizations` — get linked company pages3323. `search_linkedin_targeting` (typeahead) or `research_business_for_linkedin_targeting` — 14 facets (job functions, seniority, industries, company size, skills, member groups)3334. `discover_linkedin_assets` — check existing creatives (paginated for 22k+ creatives, deduped)3345. `validate_and_prepare_linkedin_assets` — validate single-image, video, or carousel assets3356. Create campaign — pick format:336 - `create_linkedin_image_campaign` — single-image sponsored content337 - `create_linkedin_video_campaign` — video sponsored content338 - `create_linkedin_carousel_campaign` — carousel; build cards via `add_linkedin_carousel_creative`339 - For lead gen: pass `lead_gen_form_id`3407. Optional: campaign groups via `campaign_group_id` / `campaign_group_name` or `add_linkedin_campaign_to_group`. `list_linkedin_campaigns` filters by group.341342**TikTok Ads:**3431. Campaign Research — crawl brand website, research competitor video ad strategies3441.5. **Apply strategy directives** — load STRATEGY.md > TikTok Ads and Cross-Platform sections.345 Use as context for creative direction and audience targeting.3462. `discover_tiktok_assets` — check existing video / image assets3473. `validate_and_prepare_tiktok_assets` — validate creative assets3484. `search_tiktok_targeting` — find interests, behaviors, geo (city-level)3495. Create campaign — pick objective:350 - `create_tiktok_campaign` — flexible objective; pass `tiktok_item_id` or `card_id` for Spark Ads (boost organic)351 - `create_tiktok_video_campaign` — in-feed video352 - APP_PROMOTION objective for app installs353 - For carousel: `create_tiktok_carousel_card` then `add_tiktok_ad`3546. Optional: CBO via `budget_optimize_on` (default true). `add_tiktok_ad_group` for additional ad groups; `update_tiktok_*` to adjust live campaigns3557. CTAs are server-validated (defaults to LEARN_MORE if `landing_page_url` provided without `call_to_action`). `optimization_event` accepts the full event taxonomy: FORM, ON_WEB_CART, ON_WEB_DETAIL, ON_WEB_REGISTER, COMPLETE_PAYMENT, CONVERSION_LEADS, PAGE_VISIT, etc.356357## Ad Extensions (Google Ads)358359Ad extensions improve Quality Score, increase ad real estate, and boost CTR. **Always add extensions after creating a Google Ads campaign.**360361### Before Adding Extensions362363Call `list_campaign_extensions` to check what already exists on the campaign. Never duplicate existing extensions.364365### Sitelinks (`add_sitelinks`)366367Sitelinks are the most impactful extension. Target **10+ sitelinks** (more is better — Google rotates the best performers).368369**Workflow:**3701. Crawl the user's website homepage — extract all navigation links and key pages3712. Build a candidate list of pages to include:372 - Homepage, Pricing/Plans, About Us, Contact, Key product/service pages, Blog, Case Studies/Testimonials, FAQ/Help, Free Trial/Demo, Careers3733. **Validate each URL** — confirm it loads (no 404s, no redirects to error pages)3744. For each valid sitelink, prepare:375 - **Link text**: max 25 characters, descriptive (e.g., "View Pricing Plans")376 - **Description line 1**: max 35 characters (e.g., "Plans starting at $29/month")377 - **Description line 2**: max 35 characters (e.g., "Free 14-day trial included")378 - **Final URL**: the validated page URL3795. If fewer than 8 valid pages found → ask the user for additional URLs or pages to include3806. Present the full sitelink list to the user for review before adding3817. Call `add_sitelinks` with the approved list382383### Callout Extensions (`add_callout_extensions`)384385Callouts highlight value propositions. Target **8+ callouts** (minimum 4).386387**Workflow:**3881. Extract value propositions from:389 - Website content (crawled)390 - Brand docs (AGENTS.md if it exists)391 - Existing ad copy in the account3922. Each callout: max **25 characters**3933. Examples: "Free Shipping", "24/7 Support", "No Setup Fee", "Cancel Anytime", "Money-Back Guarantee", "Same-Day Delivery", "Award-Winning", "Trusted by 10K+"3944. Present to user for approval, then call `add_callout_extensions`395396### Structured Snippets (`add_structured_snippets`)397398Snippets show predefined categories of offerings. Pick headers relevant to the business.399400**Available headers:** Brands, Courses, Destinations, Featured Hotels, Insurance Coverage, Models, Neighborhoods, Service Catalog, Shows, Styles, Types401402**Workflow:**4031. Review the user's website and business type to pick relevant headers4042. Extract 3-10 values per header from website content4053. Example: SaaS company → Header "Types" with values "Analytics, Reporting, Dashboards, API Access"4064. Example: E-commerce → Header "Brands" with values "Nike, Adidas, Puma, New Balance"4075. Present to user, then call `add_structured_snippets`408409### Price Extensions410411If the user's website has a pricing page:4121. Crawl the pricing page4132. Extract plan names, prices, and descriptions4143. Present to user for confirmation before adding415416### Call Extensions417418If the business has a phone number:4191. Ask the user for their business phone number4202. Discuss call tracking preferences4213. Set call hours if business has limited availability422423### Extension Verification424425After adding all extensions, always call `list_campaign_extensions` to verify:426- All sitelinks were added and have correct URLs427- Callouts are present428- Structured snippets are showing429- Report back to the user what was added430431If `list_campaign_extensions` fails:4321. Retry once with a corrected payload or narrower scope.4332. Cross-check extension state with `get_campaign_structure`.4343. If extension state is still unverifiable, report `PARTIAL_SUCCESS` and explicitly list what could not be confirmed.435436## Launch Definition of Done (Required before reporting success)437438For each created campaign, all checks below must pass:4394401. Campaign exists and status is `PAUSED` (unless user explicitly approved activation).4412. Expected ad group count exists.4423. Expected keywords exist, with the planned match-type profile (EXACT/PHRASE/BROAD as specified).4434. At least one RSA exists with expected headline/description counts.4445. Required extensions exist (sitelinks, callouts, structured snippets for Google Ads campaigns).4456. Requested-vs-actual bidding strategy matches, or any drift is explicitly called out.446447### Status protocol (mandatory)448449- `SUCCESS`: all Launch Definition of Done checks pass for all targeted campaigns.450- `PARTIAL_SUCCESS`: campaign shell exists, but one or more required assets are missing/unverifiable after one targeted remediation pass.451- `FAILED`: campaign creation itself failed.452453Never report `SUCCESS` when any verification check failed or could not be confirmed.454455### Per-campaign action ledger (mandatory)456457For every campaign you create or edit, log and return:458- campaign name + campaign_id459- ad_group_id values touched460- keyword add/update counts461- RSA counts (headlines/descriptions)462- extension counts (sitelinks/callouts/snippets)463- verification result per campaign (`PASS`/`FAIL`)464465## Ad Quality Guardrails (Google Ads)466467### Keyword-to-headline coverage468469For each ad group, include unique high-intent target keywords in RSA headlines. At minimum:470- cover top 3-5 keyword themes from the ad group's keyword list471- avoid generic headline sets that omit core search intent terms472- when competitive terms are targeted, keep competitor names in keywords only if required by strategy and avoid naming competitors in ad copy unless user explicitly approves473474### Asset length validation checklist (before submission)475476- RSA headline: <= 30 characters477- RSA description: <= 90 characters478- Path fields: <= 15 characters each479- Sitelink text: <= 25 characters480- Sitelink description lines: <= 35 characters each481- Callout text: <= 25 characters482- Structured snippet values: follow platform limits and keep concise483484Validate lengths before `create_*` or `add_*` calls. If limits are exceeded, rewrite and re-validate before submitting.485486## PMax Asset Limits (CRITICAL — enforce before every PMax campaign)487488Google Ads Performance Max enforces strict asset limits per asset group. Exceeding these limits causes campaign creation to fail with `ENABLED_IMAGE_ASSET_LINKS_PER_ASSET_GROUP` or similar errors. **The agent MUST enforce these limits before calling `validate_and_prepare_assets` or `create_pmax_campaign`.**489490### Image Asset Limits491492| Asset type | Minimum | Maximum | Notes |493|------------|---------|---------|-------|494| Landscape images (1.91:1) | 1 | 20 | Required — at least 1 |495| Square images (1:1) | 1 | 20 | Required — at least 1 |496| Portrait images (4:5) | 0 | 20 | Optional |497| **TOTAL marketing images** | **2** | **20** | **Across ALL ratios combined** |498| Square logos (1:1) | 1 | 5 | Required — at least 1 |499| Landscape logos (4:1) | 0 | 5 | Optional |500501**CRITICAL**: The 20-image limit is TOTAL across landscape + square + portrait, NOT 20 per ratio. If a user provides 10 landscape + 15 square + 13 portrait = 38 images, you must reduce to 20 total.502503**When user provides more than 20 total marketing images:**5041. Inform the user: "Google Ads allows max 20 marketing images total per PMax asset group across all ratios. You provided [N]. I'll select the best 20."5052. Distribute proportionally across ratios while respecting minimums (at least 1 landscape, at least 1 square)5063. Prefer keeping variety across ratios over loading up one ratio5074. `validate_and_prepare_assets` handles this automatically, but you should inform the user proactively508509**When user provides fewer than minimums:**510- Missing landscape images: Ask the user to provide at least 1 landscape image (1.91:1 ratio, 1200x628px recommended)511- Missing square images: Ask the user to provide at least 1 square image (1:1 ratio, 1200x1200px recommended)512- Missing square logo: Ask the user to provide at least 1 square logo (1:1 ratio, 128x128px minimum)513- Do NOT proceed with campaign creation until minimums are met514515### Text Asset Limits516517| Asset type | Minimum | Maximum | Max characters |518|------------|---------|---------|---------------|519| Headlines | 3 | 15 | 30 chars each |520| Long headlines | 1 | 5 | 90 chars each |521| Descriptions | 2 | 5 | 90 chars each |522| Business name | 1 | 1 | 25 chars |523524**When user provides more than the maximum:**525- Truncate to the limit, keeping the first N items526- Inform the user: "PMax allows max [N] [asset type]. Using the first [N]."527528**When user provides fewer than minimums:**529- Ask for the missing assets. Example: "PMax requires at least 3 headlines. You provided 1. Please provide 2 more headlines (max 30 characters each)."530- Do NOT proceed until minimums are met531532### Video Asset Limits533534| Asset type | Minimum | Maximum | Requirements |535|------------|---------|---------|-------------|536| YouTube videos | 0 | 5 | Must be YouTube video IDs/URLs |537538**Video validation workflow:**5391. Call `validate_video` with `platform="pmax"` for each video5402. This validates the YouTube video ID format only (11 chars, alphanumeric)5413. Google Ads API will verify the video exists, is public/unlisted, and embeddable during campaign creation5424. If user provides more than 5 videos, use only the first 5 and inform them5435. Videos are optional — campaigns can be created without them (Google will auto-generate video ads from images)544545### Asset Limit Enforcement Checklist (before calling create_pmax_campaign)546547Before creating any PMax campaign, verify:548- [ ] At least 1 landscape image provided549- [ ] At least 1 square image provided550- [ ] Total marketing images (landscape + square + portrait) <= 20551- [ ] At least 1 square logo provided552- [ ] At least 3 headlines (max 30 chars each)553- [ ] At least 1 long headline (max 90 chars)554- [ ] At least 2 descriptions (max 90 chars each)555- [ ] Business name provided (max 25 chars)556- [ ] Videos (if any) validated via `validate_video`557- [ ] Videos count <= 5558559If any check fails, ask the user for the missing/corrected assets before proceeding.560561## PMax Search Themes & Audience Signals562563Search themes and audience signals are **PMax-only** features — they do not apply to Search, Display, or other campaign types. Both are configured at the asset group level.564565### Search Themes566567Search themes are short phrases (max 50 per asset group) that tell Google which search queries your PMax campaign should target. They supplement Google's automated targeting with explicit intent signals.568569**When to add search themes:**570- During PMax campaign creation (step 9 above)571- When user wants to refine PMax targeting ("add search themes to my PMax campaign")572- When search term analysis reveals high-performing queries not yet covered573- When expanding into new market segments574575**Workflow:**5761. `get_pmax_search_themes` — check existing themes on the campaign (requires `campaign_id`)5772. Derive theme candidates from:578 - Keyword research results (`research_keywords`)579 - Search term reports (`analyze_search_terms`)580 - Brand context and product categories581 - Competitive research findings5823. Present candidate themes to user for approval5834. `add_pmax_search_themes` — add approved themes (params: `campaign_id`, `search_themes` list)5845. `get_pmax_search_themes` — verify themes were added585586**Limits and rules:**587- Max **50 search themes** per asset group (Google's limit)588- Duplicates are filtered automatically (case-insensitive)589- Empty/whitespace themes are filtered automatically590- Search themes only support **add** and **remove** — no update (remove + re-add instead)591- To remove: `remove_pmax_search_themes` with the theme resource names from `get_pmax_search_themes`592593### Audience Signals594595Audience signals tell Google which audience segments are most likely to convert. They are **signals, not hard targeting** — Google uses them as starting points and expands from there. Only **one audience signal** is allowed per asset group (containing multiple segments).596597**When to add audience signals:**598- During PMax campaign creation (step 10 above)599- When user wants to add targeting to a PMax campaign600- When audience analysis reveals high-value segments601- When launching PMax for a specific product/audience niche602603**Supported segment types:**604| Type | Tool parameter | Description |605|------|---------------|-------------|606| In-market audiences | `in_market_audience_ids` | Users actively researching/comparing products in a category |607| Affinity audiences | `affinity_audience_ids` | Users with sustained interests and habits |608| Custom audiences | `custom_audience_ids` | Account-level custom audience segments |609| User lists (remarketing) | `user_list_ids` | First-party data — website visitors, customer lists, CRM uploads |610611**Workflow:**6121. `get_pmax_audience_signals` — check existing signals on the campaign (requires `campaign_id`)6132. Discover available audiences:614 - `search_audiences` — search by keyword across all audience types (in-market, affinity, custom)615 - Use brand context and competitive research to inform search terms6163. Present audience recommendations organized by type with rationale6174. Get user approval for segment selection6185. `add_pmax_audience_signal` — add signal with selected segment IDs6196. `get_pmax_audience_signals` — verify signal was added620621**Limits and rules:**622- Only **one audience signal** per asset group — it must combine all desired segments623- To change: `remove_pmax_audience_signal` (with resource name), then `add_pmax_audience_signal` with updated segments624- Audience signals only support **add** and **remove** — no update625- Use `search_audiences` to find audience IDs — do not guess or hardcode IDs626627## Conversion Tracking Limitation628629Adspirer MCP currently does not configure Google Ads conversion action settings (primary vs secondary) directly.630631When campaign goals depend on conversion action priority:6321. create campaigns in PAUSED status6332. tell the user exact Google Ads UI path to configure conversion actions manually6343. report campaign creation as complete only after clarifying this manual step635636## Budget Optimization (Google Ads)637638- `optimize_budget_allocation` — suggest budget reallocations639- `analyze_wasted_spend` — find underperforming keywords and ad groups640- `analyze_search_terms` — review search terms for negative keyword opportunities641642## Creative Fatigue Detection & Refresh643644When reviewing creative performance or user asks about ad fatigue:6456461. Meta: Call `detect_meta_creative_fatigue` for fatigue scores6472. LinkedIn: Call `analyze_linkedin_creative_performance` for per-creative metrics6483. Google: Call `get_campaign_structure` to see ad-level performance6494. Identify ads with:650 - High frequency + declining CTR (fatigued)651 - More than 30 days running with no refresh652 - Below-average CTR for their campaign6535. For fatigued ads:654 - Call `suggest_ad_content` for new headline/description ideas655 - Call `generate_linkedin_ad_creatives` for LinkedIn variations656 - Present new creative options (filtered through brand voice if AGENTS.md exists)657 - On approval: update via `update_ad_headlines`, `update_ad_descriptions`, `add_linkedin_creative`, etc.658659## A/B Testing Workflow660661When creating new ad variations for testing:6626631. Read current top-performing ad copy (from campaign structure)6642. Generate 3-5 variations testing ONE variable:665 - Headline variation (keep description same)666 - Description variation (keep headline same)667 - CTA variation668 - Audience variation (same ad, different targeting)6693. Present test plan with hypothesis:670 "Testing: 'Headline A' vs 'Headline B'671 Hypothesis: [why we think one may outperform]672 Duration: 2 weeks, split budget 50/50673 Success metric: CTR and conversion rate"6744. On approval, create test variants via platform-specific tools6755. Log test for follow-up analysis676677## Audience Analysis & Optimization678679When analyzing or optimizing audiences:6806811. Pull audience data:682 - Meta: `get_meta_audience_insights` + `analyze_meta_audiences`683 - LinkedIn: `get_linkedin_audience_insights`684 - Google: Review campaign targeting from `get_campaign_structure`6852. Identify:686 - Which audience segments convert best (by age, gender, job title, interest)687 - Audience overlap/saturation688 - Underperforming segments (high spend, low conversion)6893. For LinkedIn B2B specifically:690 - Call `research_business_for_linkedin_targeting` with brand's website691 - Compare AI-recommended targeting vs current targeting692 - Identify gaps (seniority levels, industries, company sizes not covered)6934. For Meta:694 - Call `optimize_meta_placements` for placement-level performance695 - Identify which placements to scale/reduce6965. Present findings with recommendations:697 - Segments to expand (high ROAS, low spend)698 - Segments to cut (low ROAS, high spend)699 - New segments to test700701## Monitoring & Alerts702703When user wants alerts or ongoing monitoring:7047051. Understand what they want to monitor:706 - Budget pacing (approaching monthly limit)707 - Performance drops (ROAS below target, CPA above target)708 - Opportunity alerts (keyword with sudden volume increase)7092. Call `create_monitor` with appropriate:710 - Metric (ROAS, CTR, CPC, CPA, spend, conversions)711 - Threshold and direction (below 3.0, above $150)712 - Delivery (email, Slack, SMS)7133. Call `list_monitors` to confirm setup7144. To modify: `manage_scheduled_task` with monitor ID715716## Reporting717718When user wants performance reports:7197201. Ask: frequency (one-time, weekly, monthly) and format preference7212. For one-time: Call `generate_report_now`7223. For recurring: Call `schedule_brief` with:723 - Frequency (daily, weekly)724 - Delivery method (email, Slack, webhook)725 - Content scope (all platforms or specific)7264. Call `list_scheduled_tasks` to confirm727728## Competitive Intelligence729730When analyzing competitors or adjusting competitive strategy:731732### Step 1: Identify competitors733- Read AGENTS.md for known competitors (check Competitors section)734- Sear735736…(truncated)