Skip to content
Agentmart
Submit a tool

AdLoop

Google Ads, Reddit Ads, GA4 and Tag Manager in your AI client, with a preview before every change.

Connector by getadloop.com · Domain verified by the MCP Registry

IndexedMITLocal (stdio)Remote (HTTP)★ 286
Write a review

Install

Works with Claude Code, VS Code, Codex, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.

npx agentmarket install connector/getadloop-com-adloop

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Remote endpoint

  • https://mcp.getadloop.com/mcp Remote (HTTP)

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Google Ads, Reddit Ads, GA4 and Tag Manager in your AI client, with a preview before every change.

Use cases: marketing-content, data-analysis, seo

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.

Tools
68 read · 68 write · 7 delete · 8 not yet classified
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Tools by what they do 151

Read from the source code; the running server may list different tools.

Read 68 · Look things up without changing anything.

  • analyze_campaign_conversions
  • attribution_check
  • audit_event_coverage
  • check_brand_names
  • discover_keywords
  • estimate_budget
  • estimate_reddit_ad_group
  • get_account_summaries
  • get_ad_performance
  • get_ai_max_settings
  • get_asset_group_signals
  • get_audience_lists
Show 56 more tools
  • get_audience_performance
  • get_audience_targeting
  • get_brand_list_brands
  • get_brand_list_campaigns
  • get_brand_lists
  • get_campaign_performance
  • get_change_history
  • get_custom_conversion_goals
  • get_demographic_targeting
  • get_detailed_asset_performance
  • get_gtm_tag
  • get_gtm_trigger
  • get_gtm_version
  • get_gtm_version_diff
  • get_gtm_workspace_diff
  • get_keyword_performance
  • get_merchant_feed_health
  • get_merchant_product_issues
  • get_negative_keyword_list_campaigns
  • get_negative_keyword_list_keywords
  • get_negative_keyword_lists
  • get_negative_keywords
  • get_pmax_assets
  • get_pmax_performance
  • get_recommendations
  • get_reddit_account_history
  • get_reddit_ad_groups
  • get_reddit_ads
  • get_reddit_audiences
  • get_reddit_campaigns
  • get_reddit_performance
  • get_reddit_pixels
  • get_search_terms
  • get_shopping_product_performance
  • get_tracking_events
  • health_check
  • landing_page_analysis
  • list_accounts
  • list_ga4_dimensions_and_metrics
  • list_gsc_sites
  • list_gtm_accounts
  • list_gtm_containers
  • list_gtm_tags
  • list_gtm_triggers
  • list_gtm_variables
  • list_gtm_versions
  • list_gtm_workspaces
  • list_key_events
  • list_merchant_accounts
  • list_reddit_accounts
  • list_reddit_funding_instruments
  • list_uploads
  • search_audience_segments
  • search_reddit_targeting
  • suggest_brands
  • validate_tracking

Write 68 · Create, change, send or run things.

  • add_ad_schedule
  • add_negative_keywords
  • add_negative_locations
  • add_to_brand_list
  • add_to_negative_keyword_list
  • approve_change
  • attach_brand_list_to_campaigns
  • attach_shared_set_to_campaigns
  • confirm_and_apply
  • detach_brand_list_from_campaigns
  • detach_shared_set_from_campaigns
  • draft_ad_group
Show 56 more tools
  • draft_ai_max_settings
  • draft_assign_custom_conversion_goal
  • draft_audience_attachment
  • draft_business_name_asset
  • draft_call_asset
  • draft_callouts
  • draft_campaign
  • draft_clear_custom_conversion_goal
  • draft_create_conversion_action
  • draft_custom_conversion_goal
  • draft_demographic_targeting
  • draft_gtm_tag
  • draft_gtm_trigger
  • draft_gtm_variable
  • draft_image_assets
  • draft_key_event
  • draft_keywords
  • draft_pmax_product_exclusions
  • draft_prepare_brand_exclusions
  • draft_price_asset
  • draft_promotion
  • draft_publish_gtm_workspace
  • draft_reddit_ad
  • draft_reddit_ad_group
  • draft_reddit_campaign
  • draft_reddit_custom_audience
  • draft_remove_conversion_action
  • draft_responsive_search_ad
  • draft_rollback_gtm_version
  • draft_shopping_campaign
  • draft_sitelinks
  • draft_structured_snippets
  • draft_update_conversion_action
  • draft_update_custom_conversion_goal
  • draft_upload_call_conversions
  • draft_upload_enhanced_conversions_for_leads
  • enable_entity
  • enable_reddit_entity
  • link_asset_to_customer
  • pause_entity
  • pause_reddit_entity
  • run_gaql
  • store_image_upload
  • update_ad_group
  • update_call_asset
  • update_callout
  • update_campaign
  • update_promotion
  • update_reddit_ad
  • update_reddit_ad_group
  • update_reddit_campaign
  • update_responsive_search_ad
  • update_sitelink
  • update_structured_snippet
  • upload_conversion_csv
  • upload_images

Delete 7 · Delete, drop, revoke or wipe things.

  • draft_asset_group_assets
  • draft_asset_group_signals
  • draft_delete_gtm_entity
  • draft_delete_key_event
  • remove_entity
  • remove_from_brand_list
  • remove_reddit_entity

Not yet classified 8 · We could not tell from the name and description.

  • analyze_page_speed
  • generate_tracking_code
  • propose_brand_list
  • propose_negative_keyword_list
  • run_ga4_report
  • run_gsc_report
  • run_realtime_report
  • run_reddit_report

Network hosts it talks to 1

  • mcp.getadloop.com · found in remote endpoint, install command

Tools (151)

Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].

  • add_ad_scheduleDraft a campaign ad schedule

    Draft ad schedule windows for a campaign — returns a PREVIEW. Adds the windows; existing ones stay. The preview lists the current windows (each with the remove_id that remove_entity takes as a campaign_criterion) and the account time zone the hours are in. Overlapping windows and more than six a day are refused. A campaign without any window serves at all hours, so its first windows restrict it to them: that preview needs a double confirmation. Args: campaign_id: Numeric ID of the campaign. schedule: Windows to add, each {day_of_week: MONDAY..SUNDAY, start_hour: 0-23, end_hou…

  • add_negative_keywordsDraft negative keywords

    Draft negative keyword additions — returns a PREVIEW. Negative keywords prevent your ads from showing for irrelevant searches. They are added at campaign level. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: campaign_id: Numeric ID of the campaign that gets the negatives. keywords: Negative keyword texts; at least one is required. All share the same match_type. customer_id: Google Ads customer ID (digits, e.g. "1234567890"). Empty uses the configured default account. match_type: "EXACT" (default), "PHRASE", or "BROA…

  • add_negative_locationsDraft negative locations

    Draft negative geo location additions — returns a PREVIEW. Excludes cities/regions from a campaign while keeping broader positive targets such as State of Sao Paulo. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: campaign_id: Numeric ID of the campaign to add the location exclusions to. geo_target_ids: Numeric Google geo target constant IDs to exclude (e.g. "1001773"). Duplicates are collapsed; non-numeric IDs are rejected. customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured account…

  • add_to_brand_listDraft additions to a brand list

    Append brands to an EXISTING brand list — returns a PREVIEW. For a list that already exists and only needs more brands (propose_brand_list creates a new list instead). The shared_set_id comes from get_brand_lists; get_brand_list_brands shows the brands already in the list, which makes a brand that would be added twice visible. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Args: shared_set_id: Numeric list ID from get_brand_lists. brand_ids: Commercial Knowledge Graph MIDs from suggest_brands. customer_id: Ads acco…

  • add_to_negative_keyword_listDraft additions to a negative keyword list

    Append keywords to an EXISTING shared negative keyword list — returns a PREVIEW. Adds terms to a list that already exists (propose_negative_keyword_list creates a new list instead); get_negative_keyword_list_keywords shows the terms already in a list. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: shared_set_id: Numeric ID of the list (shared_set.id from get_negative_keyword_lists). keywords: Keyword strings to append. Blank entries are dropped and duplicates in the input list are collapsed (case-insensitive). customer_…

  • analyze_campaign_conversionsCampaign conversions against Analytics

    Campaign clicks → GA4 conversions mapping — the real cost-per-conversion. Combines Google Ads campaign metrics with GA4 session/conversion data to reveal click-to-session ratios (GDPR indicator), compare Ads-reported vs GA4-reported conversions, and compute cost-per-GA4-conversion. Also returns non-paid channel conversion rates for comparison context. GA4 conversions are the property's key events (GA4 metric keyEvents). Args: date_range_start: Start date as "YYYY-MM-DD". Both dates must be set to apply a range; if either is empty, the last 30 days are used. date_range_end: En…

  • analyze_page_speedPageSpeed analysis

    Run PageSpeed Insights for a landing page — Lighthouse + real-user data. Returns the performance score (0-100), lab Core Web Vitals (LCP, CLS, TBT, FCP), CrUX field data from real Chrome users where available (p75 LCP/INP/CLS/FCP/TTFB + FAST/AVERAGE/SLOW ratings), and the top improvement opportunities with estimated savings. When the page itself has too little traffic for field data, the origin-wide field data is returned instead, marked field.scope="origin". Typical input is an ad final_url: slow landing pages depress Quality Score and waste paid clicks. Takes 10-30s; that is normal for a L…

  • approve_changeApprove a change on its card

    Run, apply or discard a previewed change from its approval card. Called only by the AdLoop approval card when the user clicks a button; AI apps keep this tool out of the model's tool list. Args: plan_id: The plan shown on the card. code: The card's approval code for this plan. action: "test" (dry run), "apply" (real change) or "discard". acknowledged: The user ticked "cannot be undone"; required to apply a plan that needs double confirmation.

  • attach_brand_list_to_campaignsDraft attaching a brand list

    Attach an existing brand list to one or more campaigns — returns a PREVIEW. Creates a CampaignCriterion.brand_list per campaign. This is NOT the CampaignSharedSet linkage used for negative keyword lists — brand lists are criteria, and `negative` decides the role. The shared_set_id comes from get_brand_lists; get_brand_list_campaigns lists existing attachments. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Args: shared_set_id: Numeric list ID from get_brand_lists. campaign_ids: Numeric campaign IDs to attach the list t…

  • attach_shared_set_to_campaignsDraft attaching a shared set

    Attach an existing shared set to one or more campaigns — returns a PREVIEW. Creates CampaignSharedSet linkages so the campaigns inherit the shared set's criteria (e.g. negative keywords). Most commonly used to attach a shared negative keyword list to newly-built campaigns; get_negative_keyword_list_campaigns lists existing attachments. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: shared_set_id: Numeric ID of the shared set (from get_negative_keyword_lists). campaign_ids: Numeric campaign IDs to attach the set to (at least one). …

  • attribution_checkAttribution check

    Compare Ads-reported conversions vs GA4 — find tracking discrepancies. Checks whether conversions reported by Google Ads match what GA4 records, diagnoses GDPR consent gaps, attribution model differences, and missing conversion event configuration. Returns both sides' totals with the discrepancy and diagnostic insights. GA4 conversions are the property's key events (GA4 metric keyEvents). Args: date_range_start: Start date as "YYYY-MM-DD". Both dates must be set to apply a range; if either is empty, the last 30 days are used. date_range_end: End date as "YYYY-MM-DD" (inclusiv…

  • audit_event_coverageTracking coverage audit

    Three-way audit: codebase events ↔ GTM tags ↔ GA4 actual fires. Fetches the LIVE GTM container, joins it against GA4 event counts for the date range, and returns a per-event matrix with one of these statuses: ok — tag active and event firing ok_auto_collected — GA4 Enhanced Measurement event, no tag needed no_tag_no_fire — codebase event, no GTM tag, never fires tag_paused — GTM tag exists but is paused tag_active_but_not_firing — tag is active but no GA4 hits gtm_only_firing — GA4 event from a tag, not…

  • check_brand_namesCheck brand names

    Check a list of brand names against Google's brand knowledge graph. One SuggestBrands call per name, for the case where a shortlist has to be triaged instead of a single name resolved: which of these brands does Google know at all, and what is the ID of each? Returns checked / matched / no_match counts and one result per name with status "matched" (with a best-match brand plus all candidates) or "no_match" (empty candidate list — a normal answer, not an error). exact_match marks a candidate whose name matches the query apart from case and punctuation; anything else is a Google suggestion, no…

  • confirm_and_applyApply a previewed change

    Execute a previously previewed change. IMPORTANT: Defaults to dry_run=True (validate only). Only an explicit dry_run=false applies the change to the ad account (Google Ads or Reddit Ads — the plan knows which platform it targets). Forced dry runs: when real changes are switched off (live changes off for the workspace in AdLoop Cloud, or safety.require_dry_run in a self-hosted config), dry_run=false is IGNORED and the result is still DRY_RUN_SUCCESS, with 'dry_run_forced_by' and 'remediation' fields. 'remediation' says how the user switches that setting; until it is changed, repeated calls wi…

  • detach_brand_list_from_campaignsDraft detaching a brand list

    Detach a brand list from one or more campaigns — returns a PREVIEW. Removes the CampaignCriterion rows linking the list to those campaigns; the list itself and its brands are unchanged. get_brand_list_campaigns lists the existing attachments. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Args: shared_set_id: Numeric list ID from get_brand_lists. campaign_ids: Numeric campaign IDs to detach the list from. Campaigns that do not carry the list are reported as `not_attached` in the apply result instead of …

Show 136 more tools
  • detach_shared_set_from_campaignsDraft detaching a shared set

    Detach a shared set from one or more campaigns — returns a PREVIEW. Removes CampaignSharedSet linkages so the campaigns no longer inherit the shared set's criteria. The shared set itself is unchanged; only the per-campaign attachment is removed. get_negative_keyword_list_campaigns lists the existing attachments. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: shared_set_id: Numeric ID of the shared set (from get_negative_keyword_lists). campaign_ids: Numeric campaign IDs to detach the set from (at least one). Blank entries a…

  • discover_keywordsKeyword ideas

    Discover new keyword ideas using Google Ads Keyword Planner. Mirrors the "Discover new keywords" UI in Keyword Planner: start with keywords (seed_keywords), start with a website (url), or both together for more targeted ideas. At least one of seed_keywords or url is required. Returns keyword ideas sorted by avg monthly search volume, with competition level (LOW/MEDIUM/HIGH) and top-of-page bid range, plus the seeds used and insights. Args: seed_keywords: Seed terms, e.g. ["running shoes", "trail running"]. url: A landing page or site URL to extract ideas from, e.g. "https://…

  • draft_ad_groupDraft an ad group

    Draft a new ad group within an existing campaign — returns a PREVIEW, does NOT create. Creates an ad group (ENABLED, type SEARCH_STANDARD) in the specified campaign, optionally with keywords in the same atomic operation. Only SEARCH campaigns are supported. Ads are not included, so the ad group cannot serve until one of its ads is created and enabled. Returns a preview with a plan_id plus warnings (BROAD keywords on a non-Smart-Bidding campaign, a duplicate ad group name, a CPC bid that Smart Bidding ignores); nothing changes until confirm_and_apply applies it. Args: campaign_id: The ca…

  • draft_ai_max_settingsDraft AI Max settings

    Draft AI Max controls for a Search campaign — returns a PREVIEW. AI Max is the container that makes brand exclusions usable in Search: Google rejects a brand list on a plain Search campaign ("For search advertising channel, brand lists can only be applied to exclusive targeting, broad match campaigns for inclusive targeting or PMax generated campaigns"). Turning AI Max on while leaving its automations running is the trap, so both belong to the same plan. An automation the caller never mentioned is refused outright (the plan says which switch to pass); one named explicitly (disable_search_term…

  • draft_asset_group_assetsDraft Performance Max asset changes

    Draft adding and/or removing assets of a Performance Max asset group — returns a PREVIEW. Adds new text, image and YouTube assets and unlinks existing ones in one atomic request, so an asset is replaced without the group dropping below Google's minimums (3 headlines, 1 long headline, 2 descriptions, one of them at most 60 characters). Texts already in the group are skipped. Images are checked and sorted by aspect ratio; removed assets stay in the account's asset library. The preview lists the asset counts per type after the change. Nothing changes until confirm_and_apply applies the plan_id; …

  • draft_asset_group_signalsDraft Performance Max signal changes

    Draft adding search themes or an audience signal to a Performance Max asset group, or removing signals — PREVIEW. Signals are hints that steer Performance Max, not targeting. A group has at most one audience signal and up to 50 search themes; replacing the audience means removing the current one in the same draft. Themes already on the group are skipped. Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Args: asset_group_id: Numeric asset group id (from get_pmax_performance). add_search_themes: Search themes to add, short phrases people se…

  • draft_assign_custom_conversion_goalDraft assigning a custom conversion goal

    Point a campaign at a custom conversion goal — returns a PREVIEW. Sets goal_config_level=CAMPAIGN and the goal on that campaign's conversion goal config. Nothing else changes: conversion actions, bidding, budgets and the account-level goals stay as they are. A campaign must have at least one goal configured when it switches to campaign level — Google answers EMPTY_CONVERSION_GOALS otherwise. That is why this tool assigns a goal instead of clearing goals; draft_clear_custom_conversion_goal goes back to the account level. If the campaign already uses exactly this goal, nothing is planned and …

  • draft_audience_attachmentDraft audience attachment

    Draft attaching audiences to a campaign or ad group as observation, targeting or exclusion: returns a PREVIEW. Observation (the default) keeps the reach: the audiences adjust bids and show up in reports. Targeting narrows delivery to the audiences and needs a double confirmation. Exclusions keep the people out and leave the mode alone. The draft refuses combinations Google does not allow (custom segments on Search, combined segments outside Search, audiences at both campaign and ad group level) and lists that cannot serve; Performance Max is refused with a pointer to draft_asset_group_signals…

  • draft_business_name_assetDraft a business name asset

    Draft a business name asset for a campaign or the account — returns a PREVIEW. Creates a text asset and links it as the business name shown with the ads. Google links business names at campaign or account level only. Account-wide needs scope="account" and no campaign_id. Returns a preview with a plan_id. Args: business_name: The name, at most 25 characters. campaign_id: Numeric ID of the campaign to link it to. scope: Empty (campaign, from campaign_id), "campaign" or "account". customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured a…

  • draft_call_assetDraft a call asset

    Draft a call asset (a phone number shown with the ads) — returns a PREVIEW. Creates the call asset and links it where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. Google reviews the number before it serves. Returns a preview with a plan_id. Args: phone_number: The number, national ("030 1234567", "(916) 555-0142") or international ("+49 30 1234567"). Normalised to E.164. country_code: ISO 3166-1 alpha-2 country of the number ("DE", "US"). Required; it decides how a national numbe…

  • draft_calloutsDraft callouts

    Draft callout assets for an ad group, a campaign or the account — returns a PREVIEW. Creates callout assets and links them where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking (every campaign without callouts of its own) needs scope="account" and no id. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: callouts: Callout texts (at least one), each non-empty and at most 25 characters after trimming. campaign_id: Numeric ID of the campaign to link the callouts to. ad_group_id: Nu…

  • draft_campaignDraft a campaign

    Draft a full campaign structure — returns a PREVIEW, does NOT create anything. Creates: CampaignBudget + Campaign (PAUSED) + AdGroup + optional Keywords + geo targeting + language targeting. Ads are NOT included — draft_responsive_search_ad adds them once the campaign exists. Only SEARCH campaigns can be created: Performance Max needs an asset group with all its assets in one request, and DISPLAY, SHOPPING and VIDEO need channel-specific settings and ad group types, so the draft refuses them. Returns a preview with a plan_id plus any warnings (e.g. a daily budget below 5x target CPA, MANUAL_…

  • draft_clear_custom_conversion_goalDraft clearing a custom conversion goal

    Put a campaign back on the account-level goals — returns a PREVIEW. Sets goal_config_level=CUSTOMER and clears the custom goal: the rollback for draft_assign_custom_conversion_goal. The account-level goals themselves are not touched. The returned plan_id is applied with confirm_and_apply. Args: campaign_id: Numeric campaign ID to reset. customer_id: Ads account ID. Defaults to the configured account.

  • draft_create_conversion_actionDraft a conversion action

    Draft a new Google Ads ConversionAction — returns a PREVIEW. Returns a preview with a plan_id (plus warnings where relevant); nothing changes until confirm_and_apply applies it. SMART_CAMPAIGN_* and GOOGLE_HOSTED types are auto-managed by Google and rejected with MUTATE_NOT_ALLOWED. Args: name: Conversion action name as it appears in Google Ads. Required. type_: ConversionActionType enum value, e.g. AD_CALL, WEBSITE_CALL, WEBPAGE, WEBPAGE_CODELESS, GOOGLE_ANALYTICS_4_CUSTOM, GOOGLE_ANALYTICS_4_PURCHASE, UPLOAD_CALLS, UPLOAD_CLICKS. category: ConversionActionCatego…

  • draft_custom_conversion_goalDraft a custom conversion goal

    Create a custom conversion goal — returns a PREVIEW. The goal bundles conversion actions into a named set that campaigns can then be pointed at with draft_assign_custom_conversion_goal. Only the goal is created: conversion actions are read for validation and never modified. It is always created ENABLED — a goal created as REMOVED would be invisible to every other tool, so there is nothing to plan. If a goal with the same name and exactly the same conversion actions already exists, nothing is planned and the result says `already_exists` with that goal's ID (REMOVED goals do not count). A name…

  • draft_delete_gtm_entityDraft deleting a Tag Manager tag, trigger or variable

    Draft deleting a Tag Manager tag, trigger or variable — returns a PREVIEW. The entity is removed from a workspace and stays on the site until the workspace is published. A trigger that any tag still references, or a variable that a tag, trigger or other variable uses as {{name}}, is refused up front, with the references named. Refused unless gtm.write_enabled is set. Returns the entity that would be deleted, the resolved workspace and a plan_id. Args: entity_type: "tag", "trigger" or "variable". entity_id: Numeric ID of the entity (see list_gtm_tags, list_gtm_triggers and lis…

  • draft_delete_key_eventDraft removing an Analytics key event

    Draft removing a GA4 key event so the event no longer counts as a conversion, returning a PREVIEW. The event itself keeps firing and stays in event reports; only its key-event status goes, for future data (key events already recorded are not reclassified). The draft resolves the event name against the property's key events (keyEvents.list), so the preview names the exact key event, its counting method and create time; an unknown name returns the existing key events, and one GA4 marks as not deletable is refused. Returns a preview with a plan_id and warnings; nothing changes until confirm_and_…

  • draft_demographic_targetingDraft demographic targeting

    Draft demographic targeting (age/gender/parental status/income) — returns a PREVIEW. By default, Google Ads serves to all demographic segments. This tool adds criteria that EXCLUDE a segment (negative=True, default) or NARROW targeting to it (negative=False — uncommon). Takes exactly one of ad_group_id or campaign_id, and at least one of the four demographic lists must contain a value. Returns a preview with a plan_id, plus warnings when the change narrows targeting, excludes 'undetermined' users, or excludes nearly a whole dimension; nothing changes until confirm_and_apply applies it. Args…

  • draft_gtm_tagDraft a Tag Manager tag

    Draft creating or updating a Tag Manager tag — returns a PREVIEW. Without tag_id this creates a tag in a workspace; with tag_id it updates the existing tag. The edit lands in the workspace and changes nothing on the site until the workspace is published. Refused unless gtm.write_enabled is set, and Custom HTML (html) is refused as well unless gtm.allow_custom_html is set. Returns the resolved workspace, the tag type, the fields that would change and a plan_id. Args: name: Tag name, 1-200 characters. Required when creating a tag. tag_type: Tag type, required when creating a tag becaus…

  • draft_gtm_triggerDraft a Tag Manager trigger

    Draft creating or updating a Tag Manager trigger — returns a PREVIEW. Without trigger_id this creates a trigger in a workspace; with trigger_id it updates the existing one. The edit lands in the workspace and changes nothing on the site until the workspace is published. Refused unless gtm.write_enabled is set. Returns the resolved workspace, the trigger fields that would change and a plan_id. Args: name: Trigger name, 1-200 characters. Required when creating a trigger. trigger_type: Trigger type, required when creating a trigger and rejected on an existing one, becaus…

  • draft_gtm_variableDraft a Tag Manager variable

    Draft creating or updating a Tag Manager variable: returns a PREVIEW. Without variable_id this creates a variable in a workspace; with variable_id it updates the existing one. Data Layer Variables, the usual source for GA4 ecommerce values, take data_layer_key (e.g. "ecommerce.value") instead of raw parameters. Tags and triggers use a variable as {{name}}; renaming one they reference is refused, because the references would break (the GTM UI renames safely). Custom JavaScript variables run code on the site and are refused unless gtm.allow_custom_html is set. The edit lands in the workspace an…

  • draft_image_assetsDraft image assets

    Draft campaign image assets from local files, public image URLs or uploads — returns a PREVIEW. At least one image in total is required across image_paths, image_urls and upload_ids. Images must be PNG, JPEG or GIF and at most 5120 KB (Google's limit). URL images are downloaded now and checked; applying re-downloads them and refuses if the image changed since the preview. Returns a preview with a plan_id and a per-image summary; nothing changes until confirm_and_apply applies it. Args: campaign_id: Numeric ID of the campaign to attach the images to. image_paths: Local PNG/JPEG/GIF fi…

  • draft_key_eventDraft an Analytics key event

    Draft marking a GA4 event as a key event (conversion) — returns a PREVIEW. The fix for "the event fires but isn't tracked as a conversion": attribution_check / validate_tracking diagnose it, this closes the loop. Applies to future data only. Returns a preview with a plan_id and warnings; nothing changes until confirm_and_apply applies it. Args: event_name: Name of the GA4 event to mark as a key event, exactly as it fires (e.g. "sign_up", "purchase"). Required. counting_method: ONCE_PER_EVENT (counts every occurrence, e.g. purchases) or ONCE_PER_SESSION (counts once pe…

  • draft_keywordsDraft keywords

    Draft keyword additions — returns a PREVIEW, does NOT add keywords. Returns a preview with a plan_id, plus a warning when BROAD keywords go into a campaign without Smart Bidding; nothing changes until confirm_and_apply applies the returned plan_id. Args: ad_group_id: Numeric ID of the ad group that gets the keywords. keywords: List of {"text": "keyword phrase", "match_type": "EXACT|PHRASE|BROAD"}; at least one is required. customer_id: Google Ads customer ID (digits, e.g. "1234567890"). Empty uses the configured default account.

  • draft_pmax_product_exclusionsDraft Performance Max product exclusions

    Draft which products a retail Performance Max asset group excludes — returns a PREVIEW. Sets the full list of excluded values on one product dimension (item id, brand or a custom label); everything else stays included. Pass the complete list each time: values left out are included again, and an empty list includes all products. Works on asset groups that advertise all products or are already split on that one dimension; more complex product filters are refused and stay a job for Google Ads. The filter is rebuilt in one atomic request. Nothing changes until confirm_and_apply applies the plan_i…

  • draft_prepare_brand_exclusionsPrepare a campaign for brand exclusions

    Draft the safe standard state for brand exclusions — returns a PREVIEW. Exactly one combination, nothing else: enable_ai_max = true, disable_search_term_matching = true (all non-removed ad groups), TEXT_ASSET_AUTOMATION = OPTED_OUT and FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION = OPTED_OUT. No bidding, keyword, match type, ad, URL or budget change, and no brand list is attached — attaching stays a separate step with propose_brand_list / attach_brand_list_to_campaigns once this state is verified in the account. Returns a preview with a plan_id (purpose brand_exclusions); nothing changes until…

  • draft_price_assetDraft a price asset

    Draft a price asset (the row of prices under an ad) — returns a PREVIEW. Creates a price asset with 3-8 offerings and links it where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. Every offering URL is checked for reachability. Google disapproves prices that differ from the landing page. Returns a preview with a plan_id. Args: offerings: 3-8 dicts, each with header and description (at most 25 characters each, headers unique), price (greater than 0), final_url, and optional final_mobile…

  • draft_promotionDraft a promotion asset

    Draft a promotion asset ("20% off winter tyres") — returns a PREVIEW. Creates the promotion and links it where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. The final_url is checked for reachability. Returns a preview with a plan_id. Args: promotion_target: What the promotion is for, shown in the ad (at most 20 characters). final_url: Landing page of the promotion. language_code: Language of the promotion's text ("de", "en"). Required: Google shows the promotion in that langua…

  • draft_publish_gtm_workspaceDraft publishing a Tag Manager workspace

    Draft publishing a Tag Manager workspace LIVE — returns a PREVIEW. Every pending change in the workspace goes live, including changes other people made in the GTM UI; the preview lists them all. Apply refuses when the workspace changed after the preview, has merge conflicts, or reports compiler errors in a quick preview, and it refuses a Custom HTML tag being added or changed while gtm.allow_custom_html is off. Refused unless gtm.write_enabled is set. Returns the pending changes, the version that is live now (for a one-step rollback), the version name that would be created and a plan_id. That…

  • draft_reddit_adDraft a Reddit ad

    Draft a Reddit ad: creates a post on the profile, then the ad (PAUSED) — PREVIEW. click_url and the media URLs are checked before drafting, so ads do not point at unverified pages and Reddit gets real image and video files. Comments are public on Reddit ads. With post_id an EXISTING post is promoted instead, keeping its upvotes and comments: no post is created and the copy arguments are ignored. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Once enabled, the ad goes through Reddit policy review (PENDING_APPROVAL). Args: ad_group_id: Reddit ad group…

  • draft_reddit_ad_groupDraft a Reddit ad group

    Draft a new Reddit ad group (created PAUSED) — returns a PREVIEW. Required: campaign_id, ad_group_name, conversion_pixel_id and at least one targeting list (geolocations, communities, interests or keywords — ids/names from search_reddit_targeting). For non-CBO campaigns also daily_budget (or lifetime_budget + end_time), bid_strategy and bid_type. Budgets are checked against max_daily_budget; keywords and geolocations are pre-validated with Reddit. Returns a preview with a plan_id, the payload and warnings; nothing changes until confirm_and_apply applies it. Args: campaign_id: Reddit camp…

  • draft_reddit_campaignDraft a Reddit campaign

    Draft a new Reddit campaign (created PAUSED) — returns a PREVIEW. By default the budget lives on the ad groups; campaign_budget_optimization holds it on the campaign. Budgets are checked against max_daily_budget. Ad groups are added with draft_reddit_ad_group. Returns a preview with a plan_id, the payload and warnings; nothing changes until confirm_and_apply applies it. Args: campaign_name: Name of the new campaign. objective: CLICKS, CONVERSIONS, IMPRESSIONS, LEAD_GENERATION, APP_INSTALLS, CATALOG_SALES or VIDEO_VIEWABLE_IMPRESSIONS. Other values only produce a warni…

  • draft_reddit_custom_audienceDraft a Reddit retargeting audience

    Draft a Reddit retargeting audience (website visitors or engaged people) — PREVIEW. Builds the audience from data Reddit already has: people the pixel saw on the website, or people who saw or engaged with the account's campaigns. No personal data is uploaded. Nothing changes until confirm_and_apply applies the plan_id; Reddit then fills the audience (status PENDING, up to a day), and an ad group uses it through update_reddit_ad_group custom_audience_ids (target) or excluded_custom_audience_ids (exclude). Args: name: Audience name, 3 to 500 characters. audience_type: PIXEL_RETARGETING…

  • draft_remove_conversion_actionDraft removing a conversion action

    Draft a REMOVAL of a ConversionAction — returns a PREVIEW. Removal stops counting and drops the action from goal lists; historical data is preserved but the action is irreversible. SMART_CAMPAIGN_* and GOOGLE_HOSTED types reject removal with MUTATE_NOT_ALLOWED. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: conversion_action_id: Numeric ConversionAction ID, e.g. from SELECT conversion_action.id, conversion_action.name FROM conversion_action. customer_id: Google Ads customer ID (digits, dashes allowed). Defaults to the confi…

  • draft_responsive_search_adDraft a responsive search ad

    Draft a Responsive Search Ad — returns a PREVIEW, does NOT create the ad. The preview shows exactly what will be created; confirm_and_apply executes the returned plan_id. The ad is created PAUSED. final_url is checked for reachability first and an unreachable URL is refused. Several headlines may pin to the same position (Google rotates them there) as long as every position stays fillable, by an asset pinned to it or by a distinct unpinned one. Mixed plain-string and dict entries are allowed within a single call (e.g. brand pinned to HEADLINE_1, the rest unpinned). Warnings note fewer than 8 …

  • draft_rollback_gtm_versionDraft rolling back Tag Manager to a version

    Draft republishing an older Tag Manager version LIVE; returns a PREVIEW. A rollback publishes an existing container version again. The preview diffs the live version against the target, so it lists every tag, trigger and variable that changes on the site, and it pins the live version: apply refuses when another version went live after the preview, or when the target was modified or archived. Workspaces are not changed. Refused unless gtm.write_enabled is set, and refused when the target adds or changes a Custom HTML tag while gtm.allow_custom_html is off. Returns the diff, previous_live_versi…

  • draft_shopping_campaignDraft a Shopping campaign

    Draft a Standard Shopping campaign that advertises a Merchant Center feed — returns a PREVIEW. Creates the budget, the campaign (PAUSED), a product ad group with its Shopping ad, and one "All products" product group, in one atomic request. The Merchant Center account must be linked to the Google Ads account; the draft checks that. Shopping campaigns take no keywords and no language targeting (the feed's language applies). Nothing changes until confirm_and_apply applies the plan_id; a dry run has Google validate it. Args: campaign_name: Name of the new campaign. daily_budget: Daily bu…

  • draft_sitelinksDraft sitelinks

    Draft sitelink extensions for a campaign — returns a PREVIEW. Sitelinks appear as additional links below your ad, increasing click area and directing users to specific pages. Every final_url is fetched and an unreachable URL (HTTP 4xx/5xx) blocks the draft. Google recommends at least 4 sitelinks per campaign; fewer than 2 may not show. Returns a preview with a plan_id and any warnings; nothing changes until confirm_and_apply applies it. Args: campaign_id: Numeric ID of the campaign to attach sitelinks to. sitelinks: List of dicts (at least one), each with link_text (str, requ…

  • draft_structured_snippetsDraft structured snippets

    Draft structured snippet assets for an ad group, a campaign or the account — returns a PREVIEW. Creates structured snippet assets and links them where the id points: ad_group_id links to that ad group, campaign_id to that campaign. Account-wide linking needs scope="account" and no id. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: snippets: At least one dict with "header" and "values". header is one of Google's snippet headers, in the language of the values: Amenities, Brands, Courses, Degree programs, Destinations, Featured Ho…

  • draft_update_conversion_actionDraft conversion action changes

    Draft a partial UPDATE of an existing ConversionAction — returns PREVIEW. Only parameters passed non-empty/non-default are sent to the API. Covers renaming, demoting a Primary to Secondary, changing value, adjusting the call-duration threshold, or changing attribution. SMART_CAMPAIGN_* and GOOGLE_HOSTED types reject mutations with MUTATE_NOT_ALLOWED at apply time. Returns a preview with a plan_id (plus warnings where relevant); nothing changes until confirm_and_apply applies it. Args: conversion_action_id: Numeric ConversionAction ID. It comes from: SELECT conversion_action.id, c…

  • draft_update_custom_conversion_goalDraft changes to a custom conversion goal

    Rename and/or re-scope an existing custom conversion goal — PREVIEW. conversion_action_ids REPLACES the whole action list, it does not append. An empty parameter stays unchanged. The preview shows the action list before and after. The returned plan_id is applied with confirm_and_apply. Args: custom_conversion_goal_id: Numeric goal ID from get_custom_conversion_goals. name: New name. Empty leaves the name unchanged. conversion_action_ids: The complete new action list. Empty leaves the actions unchanged. customer_id: Ads account ID. Defaults to the configured account.

  • draft_upload_call_conversionsDraft call conversion upload

    Draft an offline CALL-conversion upload from a CSV — returns a PREVIEW. Uploads call conversions via ConversionUploadService.UploadCallConversions, matching the call against the ad click by the caller's phone number. The CSV must have columns: Caller's Phone Number, Call Start Time, Conversion Name, Conversion Time, Conversion Value, Conversion Currency. The Conversion Name must match an existing UPLOAD_CALLS-type conversion action — verified against the account while drafting, so a typo fails here rather than after the upload. Optional `Ad User Data` and `Ad Personalization` columns carry co…

  • draft_upload_enhanced_conversions_for_leadsDraft enhanced conversions upload

    Draft an Enhanced Conversions for LEADS upload from a CSV — PREVIEW. Uploads lead conversions via ConversionUploadService.UploadClickConversions with user_identifiers, matching hashed customer PII back to the Google users who clicked the ads. The CSV holds RAW PII in columns: Email, Phone Number, First Name, Last Name (plus Conversion Name, Conversion Time, Conversion Value, Conversion Currency; optional Order ID dedup key, and optional `Ad User Data` / `Ad Personalization` consent columns). PII is normalized and SHA-256-hashed AT PREVIEW TIME — only the hashes are stored in the plan. Raw em…

  • enable_entityDraft enabling an entity

    Draft enabling a paused campaign, ad group, ad, or keyword — returns a PREVIEW. Returns a preview with a plan_id (target status ENABLED); nothing changes until confirm_and_apply applies it. Args: entity_type: "campaign", "ad_group", "ad", "keyword" or "asset_group" (Performance Max). entity_id: ID in the format for its type. campaign: campaign ID (e.g. "12345678"); ad_group: ad group ID (e.g. "12345678"); ad: "adGroupId~adId" (e.g. "12345678~987654"; a bare ad ID is resolved to its ad group at apply time); keyword: "adGroupId~criterionId" (e.g.…

  • enable_reddit_entityDraft enabling a Reddit entity

    Draft enabling (configured_status=ACTIVE) a Reddit campaign, ad group or ad — PREVIEW. Enabling a new ad sends it to Reddit policy review (PENDING_APPROVAL). Returns a preview with a plan_id, the current and target status and warnings (e.g. an effective_status of REJECTED or PENDING_BILLING_INFO that keeps it from serving); nothing changes until confirm_and_apply applies the plan_id. Args: entity_type: "campaign", "ad_group" or "ad". entity_id: Reddit id of the entity, from the read tools (get_reddit_campaigns, get_reddit_ad_groups, get_reddit_ads). ad_account_id: Reddit …

  • estimate_budgetBudget forecast

    Forecast clicks, cost, and conversions for a set of keywords. Uses Google Ads Keyword Planner to estimate campaign performance without creating anything. Essential for budget planning before launching campaigns. Per-keyword max_cpc values are collapsed to a campaign-level manual CPC cap (the highest one) — the Ads API forecast takes no per-keyword bids. Returns estimated clicks, cost, avg CPC, conversions and avg CPA for the forecast period, daily estimates, and insights. Args: keywords: List of {"text": "keyword", "match_type": "EXACT|PHRASE|BROAD", "max_cpc": 1.50}. match_type …

  • estimate_reddit_ad_groupEstimate a Reddit ad group

    Audience size, delivery estimate and Reddit's suggested bid for a planned ad group — read-only. Reddit's counterpart of estimate_budget: takes the same targeting and budget as draft_reddit_ad_group, ahead of drafting. Returns the reachable and targetable audience (fixed 30-day basis), estimated impressions/clicks/reach for the schedule, the minimum/suggested bid range for bid_type in account currency, and insights (audience under 10,000 people, bid_value below the suggested minimum). Nothing is created. At least one of geolocations, communities, interests or keywords is required. Args: d…

  • generate_tracking_codeGenerate tracking code

    Generate a GA4 event tracking JavaScript snippet. Produces ready-to-paste gtag code for the specified event. Includes recommended parameters for well-known GA4 events (sign_up, purchase, etc.). Optionally checks GA4 to warn if the event already fires. Returns the javascript snippet, already_exists / existing_count from GA4, and notes (duplicates, marking it as a key event, GDPR consent). Args: event_name: GA4 event name for the snippet, e.g. "sign_up" or "generate_lead". event_params: Event parameters as a name-to-value object, e.g. {"method": "email"}. Missing recomm…

  • get_account_summariesList Analytics properties

    List all GA4 accounts and properties accessible by the authenticated user. Serves as the discovery step for which GA4 properties are available. Returns account names, property names, and property IDs.

  • get_ad_performanceAd performance

    Get ad-level performance data including headlines, descriptions, and metrics. Returns ad type, headlines, descriptions, final URL, impressions, clicks, CTR, conversions, cost for each ad, plus its policy approval status, review status and policy topic names. Disapproved and limited-by-policy ads are listed under policy_issues with their spend. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. date_range_start: Start date as "YYYY-MM-DD". Both dates must be set to apply a range; i…

  • get_ai_max_settingsAI Max settings

    Read the AI Max controls of Search campaigns, per campaign and ad group. Returns for every campaign: id, name, status, advertising channel type, campaign.ai_max_setting.enable_ai_max, campaign.ai_max_setting.bundling_required (output only) and the full campaign.asset_automation_settings list. Each campaign also carries its non-REMOVED ad groups with ad_group.ai_max_ad_group_setting.disable_search_term_matching. Shows the current state ahead of draft_ai_max_settings, and what the account actually looks like after confirm_and_apply. Args: campaign_id: Numeric campaign ID. When omitted, ev…

  • get_asset_group_signalsAsset group signals

    Search themes and the audience signal of a Performance Max asset group, plus the account's audiences. Returns each search theme and audience signal with its signal_id and approval status, the enabled audiences of the account that can become the group's audience signal (audience_id, name), and insights when a group has no themes or no audience signal. Args: asset_group_id: Numeric asset group id (from get_pmax_performance). customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured account.

  • get_audience_listsAudience lists

    The account's own audiences: remarketing and customer lists, custom segments, combined segments. Each user list comes with its type, membership status (OPEN or CLOSED), size for Search and Display, eligibility and membership duration; custom and combined segments with their id and description. Insights flag lists below the 1,000 users Search needs and closed lists. Use the ids with draft_audience_attachment; for Google's in-market and affinity segments use search_audience_segments. Args: customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured acc…

  • get_audience_performanceAudience performance

    Get audience segment performance metrics. Returns performance by audience type — remarketing lists (USER_LIST), in-market segments (USER_INTEREST), affinity, demographics (AGE_RANGE, GENDER), etc. Shows display_name, impressions, clicks, cost, conversions, CTR, and CPC for each audience. Works for campaigns with explicit audience targeting (Search, Display). PMax audience targeting is automatic and may not appear in this report. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. date_ran…

  • get_audience_targetingAudience targeting

    Audiences attached to one campaign or ad group, its exclusions, and the audience mode. audience_mode is "observation" (audiences only adjust bids and report), "targeting" (ads only reach the audiences) or "not set". Every audience and exclusion carries a remove_id for remove_entity (entity_type "campaign_criterion" or "ad_group_criterion"). Args: campaign_id: Numeric campaign id. Pass this or ad_group_id. ad_group_id: Numeric ad group id. Pass this or campaign_id. customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured account.

  • get_brand_list_brandsBrands in a brand list

    List the brands inside a brand list. Returns the brands and their total. Each entry carries brand.entity_id (the Commercial KG MID that suggest_brands returns as id), the display name, primary URL, status and a criterion_id — the latter is what remove_from_brand_list needs. Args: shared_set_id: Numeric list ID from get_brand_lists (shared_set.id). customer_id: Ads account ID. Defaults to the configured account.

  • get_brand_list_campaignsCampaigns using a brand list

    List which campaigns a brand list is attached to. Brand lists attach as CampaignCriterion rows of type BRAND_LIST (not as CampaignSharedSet like negative keyword lists). Returns each attachment's campaign ID, name and status, the criterion, and `role`: "excluded" when the criterion is negative, "targeted" when it restricts targeting to the list. Args: shared_set_id: Numeric list ID from get_brand_lists. When omitted, all brand-list attachments in the account are returned. customer_id: Ads account ID. Defaults to the configured account.

  • get_brand_listsList brand lists

    List all brand lists (SharedSets of type BRANDS) in the account. Returns each list's ID, name, status, and member count, plus the total — the basis for reusing an existing list with add_to_brand_list instead of duplicating it with propose_brand_list. Args: customer_id: Ads account ID. Defaults to the configured account.

  • get_campaign_performanceCampaign performance

    Get campaign-level performance metrics for a date range. Returns campaign name, status, type, impressions, clicks, cost, conversions, CPA, ROAS, CTR for each campaign, plus Search impression share and the share lost to budget and to ad rank (fractions with matching *_pct percentages; null for campaigns that do not serve on Search or had no impressions). Insights flag converting campaigns that lose a significant share of impressions to budget. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id.…

  • get_change_historyChange history

    List recent account changes: who changed what, when, and through which tool. Answers "what changed before the drop?". Returns each change newest first with its time, the user's email, the client it came through (Google Ads UI, API, Google Ads scripts, Editor, automated rules, auto-applied recommendations, ...), the changed resource type, the operation (CREATE, UPDATE, REMOVE), the changed field paths, and the campaign and ad group names. Also returns counts by resource type, client, user and day, plus insights on auto-applied recommendations and budget or bidding changes. Google Ads keeps cha…

  • get_custom_conversion_goalsCustom conversion goals

    Read the custom conversion goals and the campaign goal configuration. Returns every custom goal with its name, status and conversion actions, plus — optionally for one campaign — the goal config the campaign uses (`goal_config_level` CUSTOMER or CAMPAIGN and the assigned custom goal). A custom conversion goal bundles conversion actions into a named set that a campaign can be pointed at. Ahead of drafting, this shows which goals exist, which actions they contain and what a campaign currently uses. Args: campaign_id: Numeric campaign ID. When omitted, the campaign config is skippe…

  • get_demographic_targetingDemographic targeting

    List demographic targeting criteria (age, gender, parental status, income). Takes exactly one of ad_group_id or campaign_id. Returns each criterion's value, whether it's negative (excluded) or positive (narrowing), status, and a remove_id (composite resource ID) that can be passed directly to remove_entity with entity_type='ad_group_criterion' or 'campaign_criterion'. By default, Google Ads serves ads to ALL demographic segments — a criterion only appears here once a segment has been actively excluded or narrowed. Args: ad_group_id: Numeric ad group ID. Mutually exclusive with campaign_…

  • get_detailed_asset_performancePerformance Max asset combinations

    Get top-performing asset combinations for Performance Max campaigns. Shows which headline + description + image combinations Google selects most often. Returns each combination with the assets used and their field types. This data helps identify which creative elements work well together. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. campaign_id: Optional numeric ID to filter to a single PMax campaign.

  • get_gtm_tagTag Manager tag details

    Get the full RAW configuration for a single GTM tag. Includes every parameter, firing/blocking triggers (with their filter conditions resolved to text), priority, pause status, sampling, and monitoring metadata. Suited to inspecting a tag flagged by audit_event_coverage. An unknown tag_id returns an error with the available tag IDs. Reads the live container, or a workspace's unpublished state when workspace_id is set. Args: tag_id: Numeric GTM tag ID, as listed by list_gtm_tags. gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the…

  • get_gtm_triggerTag Manager trigger details

    Get the full RAW configuration for a single GTM trigger. Includes filters, auto-event filters, custom-event filters, validation settings, and a list of every tag that uses this trigger. Helps diagnose why a tag with a specific trigger ID does or doesn't fire. An unknown trigger_id returns an error with the available trigger IDs. Reads the live container, or a workspace's unpublished state when workspace_id is set. Args: trigger_id: Numeric GTM trigger ID, as listed by list_gtm_triggers or a tag's firing/blocking triggers. gtm_account_id: Numeric GTM account ID (see list_gtm_a…

  • get_gtm_versionTag Manager version details

    Get metadata + entity counts for a single GTM container version. Returns name, description (the version notes), fingerprint, and lists of tag/trigger/variable names at that point in time. The API returns no timestamps or author for a version. Args: container_version_id: Numeric container version ID from list_gtm_versions. gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: Numeric GTM container ID (see list_gtm_containers). Empty uses gtm.container_id from the config.

  • get_gtm_version_diffTag Manager version diff

    Compare two GTM container versions: what a publish changed. Returns added, removed and changed tags, triggers and variables (with names, types and the changed fields; parameters and trigger conditions are diffed key by key), plus built-in variables enabled or disabled. By default compares the live version with the version created before it. The Tag Manager API does not mark which versions were published, so that default "before" version may never have been live. Makes two or three Tag Manager API calls. Args: from_version_id: Older version ID (see list_gtm_versions). Empty uses t…

  • get_gtm_workspace_diffTag Manager workspace changes

    Show drafted-but-not-published changes in a GTM workspace. Returns the list of entities (tags, triggers, variables) added, modified, or deleted relative to the live published version, plus any merge conflicts. Common cause of "I edited a tag but nothing happened" — the workspace was never published. is_clean=true means no pending changes and no conflicts. Args: workspace_id: Numeric GTM workspace ID from list_gtm_workspaces. gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: Numeric GTM container ID…

  • get_keyword_performanceKeyword performance

    Get keyword metrics including quality scores and competitive data. Returns keyword text, match type, quality score, impressions, clicks, CTR, CPC, conversions for each keyword. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. date_range_start: Start date as "YYYY-MM-DD". Both dates must be set to apply a range; if either is empty, the last 30 days are used. date_range_end: End date as "YYYY-MM-DD" (inclusive). compact: When true (for audits/overviews), returns totals, ma…

  • get_merchant_feed_healthMerchant Center feed health

    Merchant Center feed health — disapproved products + account issues. Disapproved feed items silently starve Shopping and Performance Max campaigns; this reports approved/pending/disapproved counts per reporting context (Shopping ads, free listings, ...), the top product issues by affected products (with documentation links), and account-level issues — CRITICAL ones stop offers serving entirely. Product-status data lags reality by ~30 minutes. Args: account_id: Numeric Merchant Center ID from list_merchant_accounts. Defaults to merchant.account_id in the config.

  • get_merchant_product_issuesMerchant Center product issues

    The products behind the feed-health counts, each with its issues. Lists products by status with offer id, title, brand, click potential and every item issue: its code, the attribute it concerns, severity per reporting context with the affected countries, and whether the merchant has to act or Google is still processing. Products with high click potential come first, because fixing them recovers the most traffic. issues_by_code counts the products per issue. Data lags feed changes by about 30 minutes. Args: account_id: Numeric Merchant Center ID from list_merchant_accounts. Defaul…

  • get_negative_keyword_list_campaignsCampaigns using a negative keyword list

    List which campaigns a shared negative keyword list is attached to. Returns each list-to-campaign attachment with the list and campaign IDs and names. Args: shared_set_id: Numeric ID from get_negative_keyword_lists. When omitted, returns all list-to-campaign attachments across the account. customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id.

  • get_negative_keyword_list_keywordsKeywords in a negative keyword list

    List the keywords inside a shared negative keyword list. Returns each negative keyword's text, match type, and a resource_id ("sharedSetId~criterionId"), with the total keyword count. Args: shared_set_id: Numeric ID from get_negative_keyword_lists (shared_set.id). customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id.

  • get_negative_keyword_listsList shared negative keyword lists

    List all shared negative keyword lists (SharedSets) in the account. Returns each list's ID, name, status, and keyword count. Useful before propose_negative_keyword_list: a suitable list may already exist and just need attaching to a campaign. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id.

  • get_negative_keywordsList negative keywords

    List existing negative keywords for a campaign or all campaigns. Shows the existing negatives, which reveals duplicates before new negative keywords are added. Returns each negative's campaign, keyword text, match type, and a resource_id ("campaignId~criterionId") as taken by remove_entity, plus the total count. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. campaign_id: Numeric campaign ID to filter by. If empty, returns negatives across all campaigns.

  • get_pmax_assetsPerformance Max assets

    List the assets of Performance Max campaigns with type, status and content. Returns each asset's field_type (HEADLINE, DESCRIPTION, MARKETING_IMAGE, YOUTUBE_VIDEO, etc.), primary_status (ELIGIBLE, NOT_ELIGIBLE, PAUSED, PENDING), and content (text or image URL), plus by_status and by_field_type summaries. Per-asset performance labels (BEST/GOOD/LOW) are not available for PMax assets in the Google Ads API. get_detailed_asset_performance reports which asset combinations Google selects most — the closest proxy for individual asset quality. Args: customer_id: Google Ads customer ID, digits w…

  • get_pmax_performancePerformance Max performance

    Get Performance Max campaign and asset group performance. Returns two result sets. campaigns: PMax campaign metrics broken down by ad_network_type (SEARCH, CONTENT, YOUTUBE_SEARCH, YOUTUBE_WATCH, MIXED). MIXED is a catch-all that Google uses for most PMax traffic — full channel splits are not available via the API. asset_groups: per-asset-group metrics including ad_strength (EXCELLENT, GOOD, AVERAGE, POOR). Includes insights flagging weak ad strength, zero-conversion asset groups, and network type distribution. Args: customer_id: Google Ads customer ID, digits with or without dashes …

  • get_recommendationsGoogle Ads recommendations

    Retrieve Google's auto-generated recommendations with estimated impact. Returns each recommendation's type, associated campaign/ad group, current (base) and projected (potential) metrics, and the estimated improvement. Includes insights that flag budget-increase recommendations (their projected gain comes from spending more) and highlight high-impact suggestions. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. recommendation_types: Optional filter of Google Ads RecommendationType …

  • get_reddit_account_historyReddit account change history

    Who changed what in the Reddit ad account: field, before/after, member, time. Returns the changes, most recent first, with changed_at, by, entity type, id and name, field, and before/after values. The first thing to check when performance moves. Child entities are included when filtering by entity. Changes made through AdLoop show under the connected Reddit user, like changes made in Ads Manager. Money fields are in account currency. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config. date_range_start: First …

  • get_reddit_ad_groupsReddit ad groups

    List Reddit ad groups (budget, bid, pixel, weekly schedule, targeting summary), optionally per campaign. Returns the account currency, the ad groups, and insights. Reddit requires conversion_pixel_id on every ad group; insights flag ad groups without one and name ad groups that run on a weekly schedule. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config. campaign_id: Reddit campaign id (from get_reddit_campaigns) to limit the list to; empty lists every ad group of the account.

  • get_reddit_adsReddit ads

    List Reddit ads with status, rejection_reason, post and click URL. Returns the ads and insights: insights flag REJECTED ads (policy review) and ads still PENDING_APPROVAL. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config. ad_group_id: Reddit ad group id (from get_reddit_ad_groups) to limit the list to; empty means no ad group filter. campaign_id: Reddit campaign id (from get_reddit_campaigns) to limit the list to; empty means no campaign filter. include_copy: When true, adds each ad'…

  • get_reddit_audiencesReddit audiences

    Reddit custom and saved audiences of the account, and which ad groups use them. Returns each custom audience's audience_id, name, type (PIXEL_RETARGETING, ENGAGEMENT_RETARGETING, CUSTOMER_LIST, LOOKALIKE, ...), status, estimated size_range, its source (pixel events or campaigns, lookback days) and the ad groups that target or exclude it; saved audiences with their targeting; and insights that flag audiences Reddit cannot use yet or that are too small to deliver. The audience_id goes into custom_audience_ids or excluded_custom_audience_ids on an ad group. Args: ad_account_id: Reddit ad ac…

  • get_reddit_campaignsReddit campaigns

    List Reddit campaigns with status, objective, budget mode and bids. Returns the account currency, the campaigns, and insights for campaigns blocked by account state. Each campaign carries configured_status (what was set) and effective_status (what Reddit computes: PENDING_APPROVAL, REJECTED, PENDING_BILLING_INFO, ...). Money is in account currency. Budgets live on ad groups unless is_campaign_budget_optimization is true. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config. include_archived: Include ARCHIVED an…

  • get_reddit_performanceReddit performance

    Reddit Ads performance: spend, impressions, clicks, CTR, CPC, conversions, CPA, ROAS. Returns rows per entity for the chosen level with names joined, plus totals and insights[] (zero-conversion spenders, rejected ads, empty windows). 'conversions' is the account's key conversion event. Money is in account currency. Data lags up to 6 hours. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config. level: Row granularity: "account", "campaign" (default), "ad_group" or "ad". date_range_start: First day, YY…

  • get_reddit_pixelsReddit pixels

    Reddit pixels of the account and when each event (purchase, sign_up, lead, ...) last fired. Returns each pixel's pixel_id, name, last_fired_at per standard event, custom events and a never_fired flag, plus insights. Relevant before conversion-optimized campaigns: insights flag pixels that never fired and ad groups optimizing for an event their pixel has never sent. Every new ad group needs a conversion_pixel_id from here. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config.

  • get_search_termsSearch terms report

    Get search terms report — what users actually typed before clicking your ads. Critical for finding negative keyword opportunities and understanding user intent. Returns search term, campaign, ad group, impressions, clicks, conversions. Args: customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults to the configured ads.customer_id. date_range_start: Start date as "YYYY-MM-DD". Both dates must be set to apply a range; if either is empty, the last 30 days are used. date_range_end: End date as "YYYY-MM-DD" (inclusive). co…

  • get_shopping_product_performanceShopping product performance

    Spend, clicks, conversions, CPA and ROAS per product across Shopping and Performance Max. Each product (item id) is summed over the campaigns it ran in. Returns the account totals, the top products by spend, and the products that spent without a conversion, with insights on what to do with them. Args: date_range_start: Start date "YYYY-MM-DD". Both dates empty means the last 30 days. date_range_end: End date "YYYY-MM-DD" (inclusive). campaign_id: Optional numeric campaign id to limit the report to. limit: Maximum number of products to return (1-200, default 50). c…

  • get_tracking_eventsList Analytics events

    List all GA4 events and their volume for the given date range. Returns every distinct event name with its total event count, sorted by count (highest first). Shows what tracking is configured and active. Args: date_range_start: Start date: "today", "yesterday", "NdaysAgo" (e.g. "28daysAgo"), or "YYYY-MM-DD". date_range_end: End date, same formats as date_range_start. property_id: GA4 property as "properties/123456789" (see get_account_summaries). If empty, uses the default from config.

  • health_checkConnection health check

    Test AdLoop connectivity — checks OAuth token, GA4 API, Google Ads API, and (when configured) the Reddit Ads API. Returns the status of each service and actionable guidance when something is broken, which makes it the diagnostic for failures in other tools.

  • landing_page_analysisLanding page analysis

    Analyze which landing pages convert and which don't. Combines ad final URLs with GA4 page-level data. Returns paid traffic sessions, conversion rates, bounce rates, and engagement per landing page, and identifies pages that get ad clicks but zero conversions and orphaned URLs. Args: date_range_start: Start date as "YYYY-MM-DD". Both dates must be set to apply a range; if either is empty, the last 30 days are used. date_range_end: End date as "YYYY-MM-DD" (inclusive). customer_id: Google Ads customer ID, digits with or without dashes (e.g. "123-456-7890"). Defaults…

  • link_asset_to_customerDraft account-level asset links

    Draft linking existing assets at account level — returns a PREVIEW. Account-level assets serve on every eligible campaign that has no asset of the same type linked at campaign or ad-group level. Each asset is checked to exist and to match its field type. Returns a preview with a plan_id. Args: links: Dicts with "asset_id" (numeric) and "field_type", one of BUSINESS_NAME, BUSINESS_LOGO, CALL, CALLOUT, HOTEL_CALLOUT, MOBILE_APP, PRICE, PROMOTION, SITELINK, STRUCTURED_SNIPPET. customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configur…

  • list_accountsList Google Ads accounts

    List accessible Google Ads accounts. Returns account names, IDs, status, and whether each is a manager account. When more accounts exist than `limit`, the response has 'truncated: true'; a much higher limit (e.g. list_accounts(limit=1000)) returns the full list. Workflows that target a specific account need no enumeration at all: get_campaign_performance, run_gaql, etc. take customer_id directly. Args: limit: Maximum number of accounts listed under the manager (MCC) account. The default cap of 200 covers the vast majority of agency MCCs in one call.

  • list_ga4_dimensions_and_metricsAnalytics dimensions and metrics

    List the dimensions and metrics a GA4 property can report on, including custom ones. Returns the exact API names valid in run_ga4_report for this property: each with its UI name, category, whether it is a custom definition (customEvent:..., customUser:...), and deprecated API names; metrics also carry their type and, for calculated metrics, the expression. Reads the GA4 Data API metadata (properties.getMetadata), which uses no report quota. Args: search: Case-insensitive text matched against API name, UI name, category, description and deprecated API names (e.g. "channel", …

  • list_gsc_sitesList Search Console properties

    List all Google Search Console properties the authenticated user can access. Serves as the discovery step for the site URLs that search analytics reports (run_gsc_report) take. Returns the site URL and permission level for each property.

  • list_gtm_accountsList Tag Manager accounts

    List all GTM accounts the AdLoop service account / OAuth user can read. The first-time discovery step: provides the account_id that audit_event_coverage takes. Returns each account's ID and name. An empty list means the service account hasn't been added to any GTM container with at least Read permission.

  • list_gtm_containersList Tag Manager containers

    List all containers under a GTM account. Returns container_id (the numeric ID needed by audit_event_coverage), public_id (the GTM-XXXXXXX string shown in the UI), name, and usage context (web / iOS / Android / amp / server). Args: gtm_account_id: Numeric GTM account ID from list_gtm_accounts. Empty uses gtm.account_id from the config; the tool errors when neither is set.

  • list_gtm_tagsList Tag Manager tags

    List every tag in the LIVE GTM container, or in one workspace. Each tag includes type, status, parsed parameters, the GA4 event name (for GA4 event tags), and resolved firing/blocking trigger names. Complements audit_event_coverage for inspecting specific tags. With workspace_id the list shows that workspace's unpublished state, so a just-drafted tag is visible; `source` says which state was read. Args: gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: Numeric GTM container ID (see list_gtm_containers)…

  • list_gtm_triggersList Tag Manager triggers

    List every trigger in the LIVE GTM container, or in one workspace. Each trigger has its filter conditions parsed to readable text (e.g. "{{Page Path}} matches RegExp ^/service-promotions/"). Helps diagnose why a tag fires or doesn't fire on specific pages. With workspace_id the list shows that workspace's unpublished state. Args: gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: Numeric GTM container ID (see list_gtm_containers). Empty uses gtm.container_id from the config. workspace_id: Wo…

  • list_gtm_variablesList Tag Manager variables

    List GTM variables — both custom and enabled built-in. Without workspace_id both come from the live container version (the Default Workspace supplies the built-ins only when the live version lists none; built_in_source names where they came from). With workspace_id both come from that workspace's unpublished state. Variables matter because triggers reference them: if a trigger uses {{Form ID}} but Form ID isn't enabled, the trigger never matches. Args: gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: …

  • list_gtm_versionsTag Manager version history

    List GTM container version headers (newest first). Version headers include version_id, name, archived flag and entity counts. The Tag Manager API returns no creation or publish time and no author for a version, and does not mark which versions were published; get_gtm_version returns a version's notes and get_gtm_version_diff what changed between two versions. Args: gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: Numeric GTM container ID (see list_gtm_containers). Empty uses gtm.container_id f…

  • list_gtm_workspacesList Tag Manager workspaces

    List workspaces (drafts) under a GTM container. Returns each workspace's ID, name and description; the IDs are what `get_gtm_workspace_diff` takes. Most containers have a single Default Workspace; multiple workspaces appear when the team uses parallel drafts. Args: gtm_account_id: Numeric GTM account ID (see list_gtm_accounts). Empty uses gtm.account_id from the config. gtm_container_id: Numeric GTM container ID (see list_gtm_containers). Empty uses gtm.container_id from the config.

  • list_key_eventsList Analytics key events

    List the key events (conversions) configured on a GA4 property. Returns each key event's event name, counting method (ONCE_PER_EVENT or ONCE_PER_SESSION), create time, whether GA4 allows deleting it, whether it is a custom event, and its resource name, sorted by event name, plus the total. Reads the GA4 Admin API (keyEvents.list). Args: property_id: GA4 property as "properties/123456789" or the bare numeric ID (see get_account_summaries). If empty, uses the default from config.

  • list_merchant_accountsList Merchant Center accounts

    List Google Merchant Center accounts the connected user can access. Returns each account's numeric ID, name and whether it is a test account. Provides the account_id used by get_merchant_feed_health; not needed when merchant.account_id is set in the config.

  • list_reddit_accountsList Reddit ad accounts

    List Reddit businesses and ad accounts the connected Reddit user can access. Returns the Reddit username, the businesses, and per ad account the ad_account_id values (plus currency, time zone and approval state) that every other Reddit tool takes. Requires the Reddit Ads connection (adloop init → Reddit step, or Settings → Reddit Ads in Cloud).

  • list_reddit_funding_instrumentsReddit billing + posting profiles

    Funding instruments (billing) and posting profiles of a Reddit ad account. Returns funding_instruments (funding_instrument_id, currency, is_servable, reasons_not_servable, credit limit and billable amount in account currency) and profiles (profile_id, username). draft_reddit_campaign needs a servable funding_instrument_id; draft_reddit_ad needs the profile_id that authors the post. Both come from here. Args: ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config.

  • list_uploadsList uploads

    List the files the user uploaded to AdLoop that have not expired. Returns each upload's upload_id, kind (image or csv), name, type, size, dimensions (images) or lines (CSVs) and hours until it expires: images last a day, conversion CSVs two hours or until a draft reads them. The ids of files the user sent through an upload link show up here.

  • pause_entityDraft pausing an entity

    Draft pausing a campaign, ad group, ad, or keyword — returns a PREVIEW. Pausing is reversible with enable_entity. Returns a preview with a plan_id (target status PAUSED); nothing changes until confirm_and_apply applies it. Args: entity_type: "campaign", "ad_group", "ad", "keyword" or "asset_group" (Performance Max). entity_id: ID in the format for its type. campaign: campaign ID (e.g. "12345678"); ad_group: ad group ID (e.g. "12345678"); ad: "adGroupId~adId" (e.g. "12345678~987654"; a bare ad ID is resolved to its ad group at apply time); keyword: "adG…

  • pause_reddit_entityDraft pausing a Reddit entity

    Draft pausing a Reddit campaign, ad group or ad — returns a PREVIEW. Returns a preview with a plan_id, the current and target status (PAUSED) and warnings (e.g. already paused); nothing changes until confirm_and_apply applies the plan_id. Args: entity_type: "campaign", "ad_group" or "ad". entity_id: Reddit id of the entity, from the read tools (get_reddit_campaigns, get_reddit_ad_groups, get_reddit_ads). ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config.

  • propose_brand_listDraft a brand list

    Draft a brand list and optionally attach it to campaigns — returns a PREVIEW. Creates a SharedSet of type BRANDS, fills it with brands, and — when campaign_ids is given — attaches it to those campaigns. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Args: list_name: Name for the new list, as it should appear in Google Ads. brand_ids: Commercial Knowledge Graph MIDs — the `id` field from suggest_brands / check_brand_names, which resolve names; a display name alone cannot be written. Duplicates are droppe…

  • propose_negative_keyword_listDraft a shared negative keyword list

    Draft a shared negative keyword list and attach it to a campaign — returns a PREVIEW. Creates a reusable negative keyword list (shared set) that can later be applied to multiple campaigns, whereas add_negative_keywords adds negatives directly to one campaign. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: campaign_id: Numeric ID of the campaign the new list is attached to. list_name: Name of the new shared negative keyword list. keywords: Negative keyword texts to put in the list (at least one). customer_id: Google Ads customer ID …

  • remove_entityDraft removing an entity

    Draft REMOVING an entity — returns a PREVIEW. This is IRREVERSIBLE. Removed entities cannot be re-enabled; pause_entity is the reversible way to temporarily disable something. Returns a preview with a plan_id and requires_double_confirm=true; nothing changes until confirm_and_apply applies it. Args: entity_type: "campaign", "ad_group", "ad", "keyword", "asset_group", "negative_keyword", "shared_criterion", "campaign_asset", "ad_group_asset", "asset", "customer_asset", "ad_group_criterion", or "campaign_criterion". entity_id: The resource ID. campaign / ad_grou…

  • remove_from_brand_listDraft removing brands from a list

    Remove brands from a brand list — returns a PREVIEW. SharedCriteria have no status field, so removal is the only way to take a brand out of a list — there is nothing to pause. Removing a brand does not detach the list from any campaign. Returns a preview with a plan_id; nothing changes until the returned plan_id is applied with confirm_and_apply. Args: shared_set_id: Numeric list ID from get_brand_lists. criterion_ids: Numeric criterion_id values from get_brand_list_brands. This is irreversible — the brand leaves the list immediately. customer_id: Ads account ID. Default…

  • remove_reddit_entityDraft archiving a Reddit entity

    Draft ARCHIVING a Reddit campaign, ad group or ad — irreversible, PREVIEW. Reddit has no hard delete for entities that ran; ARCHIVED is permanent. pause_reddit_entity is the reversible alternative when the entity does not need to be gone. Returns a preview with a plan_id that requires double confirmation; confirm_and_apply executes it. Args: entity_type: "campaign", "ad_group" or "ad". entity_id: Reddit id of the entity, from the read tools (get_reddit_campaigns, get_reddit_ad_groups, get_reddit_ads). ad_account_id: Reddit ad account id (from list_reddit_accounts). …

  • run_ga4_reportAnalytics report

    Run a custom GA4 report with optional filters, ordering, paging and a comparison period. Returns the property, the date range, the dimension and metric headers, one row per dimension combination (values as strings), row_count and total_row_count (plus next_offset while more rows remain). At least one dimension or metric is required. With compare_start/compare_end the comparison period is a second date range: every row then carries a dateRange value of "current" or "comparison", and date_ranges maps both labels to their dates. Invalid filters or ordering return "Validation failed" with details…

  • run_gaqlCustom Google Ads query

    Execute an arbitrary GAQL (Google Ads Query Language) query. For queries beyond the dedicated report tools. Returns the result rows in the requested format with the query echoed back; cost fields stay in raw micros (cost_micros / 1,000,000 = account currency). A failing query returns an error with a hint. Queries the Google Ads API. GAQL syntax and fields: https://developers.google.com/google-ads/api/docs/query/overview Args: query: The GAQL query, e.g. "SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS". customer_id: Google Ads custom…

  • run_gsc_reportSearch Console report

    Run a Google Search Console search analytics report. Returns clicks, impressions, CTR, and average position broken down by the requested dimensions. Useful for diagnosing organic traffic drops, finding keyword opportunities, and cross-referencing with GA4 and Ads data. One request returns at most 25,000 rows; a full page carries next_start_row for the following request. With data_state "all" the response metadata names the first date whose data is still incomplete. Queries the Search Console API: https://developers.google.com/webmaster-tools/v1/searchanalytics/query Args: site_url: The …

  • run_realtime_reportAnalytics realtime report

    Run a GA4 realtime report showing current active users and events. Useful for checking if tracking is firing correctly after code changes. Returns the dimension and metric headers and one row per dimension combination over the realtime window (the last 30 minutes). Args: dimensions: GA4 realtime dimension API names, e.g. unifiedScreenName, eventName, country, deviceCategory. metrics: GA4 realtime metric API names, e.g. activeUsers, eventCount. Defaults to ["activeUsers"]. property_id: GA4 property as "properties/123456789" (see get_account_summaries). If e…

  • run_reddit_reportRaw Reddit report

    Run a custom Reddit Ads report for metrics get_reddit_performance omits. Returns the requested fields per breakdown row, the date range and the account currency. Microcurrency and cent fields are converted to currency amounts. Queries the Reddit Ads API: https://ads-api.reddit.com/docs/v3/ Args: fields: Reddit report field names (required), e.g. ["SPEND", "CLICKS", "REACH", "VIDEO_STARTED", "CONVERSION_PURCHASE_TOTAL_VALUE", "KEY_CONVERSION_TOTAL_COUNT"]. breakdowns: Up to 3 of DATE, HOUR, CAMPAIGN_ID, AD_GROUP_ID, AD_ID, COUNTRY, REGION, COMMUNITY, KEYWORD, …

  • search_audience_segmentsSearch audience segments

    Find Google's in-market and affinity segments by name, with the segment_id to attach. In-market segments are people actively researching a purchase; affinity segments are long-term interests. Matching is on the segment name, in English, e.g. "running", "insurance", "travel". Args: query: Part of the segment name to look for (at least 2 characters). kind: "in_market", "affinity" or "all" (default). limit: Maximum number of segments to return (1-100, default 25). customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured account.

  • search_reddit_targetingSearch Reddit targeting

    Look up targeting options for draft_reddit_ad_group. Returns ids/names to pass into the targeting lists, with the kind, the query and the total number of matches. Communities target by name, interests by id, geolocations by id (e.g. "DE" or "DE:2874225"), languages by code (e.g. "DE"), carriers by id (e.g. "O2_DEUTSCHLAND"). Devices come back as make/model pairs for the label_map of a device target. Keyword suggestions carry Reddit-wide monthly views, not search volume. Args: kind: What to look up: "communities" (subreddits; query required), "interests" (query filters by name), "…

  • store_image_uploadStore an uploaded image

    Store a file dropped on the AdLoop upload card. Called only by the upload card; AI apps keep this tool out of the model's tool list. Returns the upload's id, type and size (dimensions for images, lines for CSVs). Args: name: The file name, used for the asset name. data_base64: The file content, base64-encoded. code: The upload card's code from upload_images or upload_conversion_csv. kind: "image" (default) or "csv" for a conversion CSV.

  • suggest_brandsSuggest brands

    Resolve a brand name to the brands Google recognizes for it. Mirrors the brand picker in the Google Ads UI (BrandSuggestionService.SuggestBrands): takes a free-text name such as "EscapeGame München" or "NoWayOut" and returns the matching brands with their ID, display name, state, and associated URLs. The returned brand ID is the Commercial Knowledge Graph ID. Brand criteria — brand lists, brand exclusions — target that ID, not a display name, so a name is resolved here before it can go into a brand list. Args: brand_prefix: The brand name to look up, free text (e.g. "NoWayOut"). sel…

  • update_ad_groupDraft ad group changes

    Draft an ad group update for name and/or manual CPC bid — returns a PREVIEW. A bid change applies only when the campaign uses MANUAL_CPC: automated bidding strategies ignore ad-group CPC bids, so such a change is refused (for Maximize Clicks the campaign cpc_bid_ceiling, set through update_campaign, is the active constraint). Bid increases above the configured safety.max_bid_increase_pct are refused. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Args: ad_group_id: Numeric ID of the ad group to update. customer_id: Google Ads customer ID (digits…

  • update_call_assetDraft a call asset edit

    Draft changing a call asset in place — returns a PREVIEW. Only the fields passed change. The asset keeps its ID and its links, so the change shows everywhere it is linked. The preview shows the current values and pins them; an edit in Google Ads before the apply stops it. Args: asset_id: Numeric ID of the CALL asset. phone_number: New number, national or international; needs country_code. country_code: ISO 3166-1 alpha-2 country of the new number. Required with phone_number, and only accepted together with it. call_conversion_action_id: Numeric ID of the conve…

  • update_calloutDraft a callout edit

    Draft changing a callout asset's text in place — returns a PREVIEW. The asset keeps its ID and performance history, and the new text shows everywhere it is linked. The preview pins the current text; if someone edits the asset in Google Ads before the apply, nothing is sent. Args: asset_id: Numeric ID of the callout asset. callout_text: The new text, at most 25 characters. customer_id: Google Ads customer ID (digits, dashes optional). Defaults to the configured account.

  • update_campaignDraft campaign changes

    Draft an update to an existing campaign — returns a PREVIEW, does NOT apply. Only the parameters passed are changed; omitted ones stay as they are, and at least one change is required. Replacing geo targets keeps the campaign's negative geo exclusions (the preview lists them). A budget change shows the current amount; when the budget is shared with other campaigns, the preview names them and needs a double confirmation, because the new amount covers all of them. A bidding change on a campaign in a portfolio bid strategy takes it out of the portfolio, also with a double confirmation. Returns …

  • update_promotionDraft a promotion edit

    Draft changing a promotion asset in place — returns a PREVIEW. Only the fields passed change; everything else stays as it is. The asset keeps its ID and history, and the change shows everywhere it is linked. Passing money_off replaces a percent_off (and the other way round); passing promotion_code replaces an orders_over_amount (and the other way round). The preview shows old and new values; an edit in Google Ads before the apply stops it. Args: asset_id: Numeric ID of the PROMOTION asset. promotion_target: New target text, at most 20 characters. final_url: New landing page; must…

  • update_reddit_adDraft Reddit ad changes

    Draft changes to a Reddit ad — name, landing URL (click_url), comments on/off. The headline and body of a live Reddit post cannot be edited; new copy means a new ad via draft_reddit_ad, with the old ad paused. Returns a preview with a plan_id showing old → new; nothing changes until confirm_and_apply executes it. Args: ad_id: Reddit ad id (from get_reddit_ads). ad_account_id: Reddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config. name: New ad name; empty keeps the current one. click_url: New landing URL (http:// or https://)…

  • update_reddit_ad_groupDraft Reddit ad group changes

    Draft changes to a Reddit ad group — budget, bid, run dates, weekly schedule, targeting. Budget (daily_budget or lifetime_budget + end_time) is checked against max_daily_budget; bid_value against max_bid_increase_pct. Targeting lists REPLACE the current value of each key passed (each takes the full list); omitted keys are preserved. Ids/names come from search_reddit_targeting. Budget and schedule of an ad group in a campaign-budget-optimization campaign are set on the campaign (update_reddit_campaign). Returns a preview with a plan_id showing old → new per field; nothing changes until confirm…

  • update_reddit_campaignDraft Reddit campaign changes

    Draft changes to a Reddit campaign — name, run dates, spend cap, and (CBO only) budget/bid/schedule. daily_budget / lifetime_budget / bid_* / schedule apply only when the campaign uses campaign budget optimization; otherwise the budget lives on its ad groups (changed via update_reddit_ad_group). Budgets are in account currency and checked against max_daily_budget; bid_value against max_bid_increase_pct. Returns a preview with a plan_id showing old → new per field; nothing changes until confirm_and_apply applies it. Args: campaign_id: Reddit campaign id (from get_reddit_campaigns). ad…

  • update_responsive_search_adUpdate a responsive search ad

    Update mutable fields on an existing RSA in place — returns a PREVIEW. Edits an existing RSA without creating a new ad; the ad keeps its ID. Google Ads API v23 (``AdService.MutateAds``) permits in-place mutation of ``final_urls``, ``path1``, ``path2``, ``headlines``, and ``descriptions``. At least one mutation must be requested. IMPORTANT: replacing headlines or descriptions is NOT a free in-place edit. Even though the ad ID is preserved, swapping the creative text RESETS the ad's asset-combination learning and performance history and sends the ad BACK THROUGH Google policy review — Google t…

  • update_sitelinkDraft a sitelink edit

    Draft changing a sitelink asset in place — returns a PREVIEW. Only the fields passed change; empty fields stay as they are. The asset keeps its ID and performance history everywhere it is linked. A new final_url is checked for reachability. The preview pins the current values; an edit in Google Ads before the apply stops it. Args: asset_id: Numeric ID of the sitelink asset. link_text: New link text, at most 25 characters. final_url: New landing page URL; must be reachable. description1: New first description line, at most 35 characters. description2: New second descriptio…

  • update_structured_snippetDraft a structured snippet edit

    Draft changing a structured snippet asset in place — returns a PREVIEW. Replaces the snippet's values (and header, if given). The asset keeps its ID and performance history everywhere it is linked. The preview pins the current header and values; an edit in Google Ads before the apply stops it. Args: asset_id: Numeric ID of the structured snippet asset. values: The complete new list of 3-10 values, each at most 25 characters. header: New header (English or translated, as in draft_structured_snippets); empty keeps the current one as Google stores it, whateve…

  • upload_conversion_csvUpload a conversion CSV

    Let the user upload a conversion CSV for an offline conversion upload. For the CSV behind draft_upload_call_conversions or draft_upload_enhanced_conversions_for_leads when the file is not on the machine running AdLoop, as on AdLoop Cloud. Apps that show AdLoop's cards display an upload card where the user drops the .csv file; the card then posts the upload id into the chat. Other apps on AdLoop Cloud get an upload link for the user (or a coding agent, with curl). The file holds personal data (phone numbers, emails), so it is kept for two hours at most and deleted as soon as a draft has read i…

  • upload_imagesUpload images

    Let the user upload images (PNG, JPEG, GIF up to 5 MB) for ad assets. For images without a public URL, such as a file on the user's computer or an image attached in the chat. An attached image cannot reach a tool, so the user drops the same file on the card. Apps that show AdLoop's cards display an upload card where the user drops the files; the card then posts the upload ids into the chat. On AdLoop Cloud in other apps the result carries an upload link for the user (or a coding agent, with curl). Uploads expire after a day. The ids go into upload_ids of draft_image_assets, or as "upload:<id>…

  • validate_trackingValidate tracking

    Compare tracking events found in the codebase against actual GA4 data. Takes the event names found in the codebase's gtag('event', ...) or dataLayer.push calls and checks which ones actually fire in GA4. Returns matched events with their GA4 counts, events missing from GA4, unexpected GA4 events, auto-collected events (page_view, session_start, etc.), insights on likely causes, and the date range. Args: expected_events: Event names found in the codebase, e.g. ["sign_up", "purchase"]. property_id: GA4 property as "properties/123456789" (see get_account_summaries). If …

Compare and alternatives

Featured in

Signals

Stars
286
Forks
66
Open issues
2
Contributors
14
Weekly downloads
1,635
Last commit
Oct 23, 2026 (4 days ago)
Last release
Oct 23, 2026 (4 days ago)
Last package publish
Oct 23, 2026 (4 days ago)

From GitHub (fetched Oct 24, 2026) and the package registry.

Details

Registry name
com.getadloop/adloop
Version
0.35.1
Auth
Auth not stated
Packages
pypi adloop
License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026
Cite this page

AdLoop MCP server. Agent Mart. https://agentmart.dev/connectors/getadloop-com-adloop (last updated 2026-10-24)