Skip to main content
Glama
AdLoop: Google Ads, Reddit Ads & GA4

AdLoop: Google Ads, Reddit Ads & GA4

Draft a campaign

draft_campaign

Draft a complete Google Search campaign structure—budget, paused campaign, ad group, optional keywords, geo and language targeting—as a preview plan_id; nothing is created until confirmed.

Instructions

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_CPC); nothing changes until confirm_and_apply applies the returned plan_id.

Google Ads API: https://developers.google.com/google-ads/api/docs/start

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "campaign_name": "<campaign_name>",
      "daily_budget": "<daily_budget>",
      "bidding_strategy": "<bidding_strategy>",
      "geo_target_ids": "<geo_target_ids>",
      "language_ids": "<language_ids>"
    },
    "name": "draft_campaign"
  }
}

Input Schema

NameRequiredDescriptionDefault
max_cpcNoIn the account's currency: the manual CPC bid for the initial ad group when bidding_strategy is MANUAL_CPC, or the Maximize Clicks CPC cap when bidding_strategy is TARGET_SPEND. Not allowed with other strategies; 0 means none.
keywordsNoOptional list of {"text": "keyword", "match_type": "EXACT|PHRASE|BROAD"} added to the initial ad group.
target_cpaNoTarget cost per acquisition in the account's currency; required if bidding_strategy is TARGET_CPA, optional target for MAXIMIZE_CONVERSIONS. 0 means none.
customer_idNoGoogle Ads customer ID (digits, e.g. "1234567890"). Empty uses the configured default account.
target_roasNoTarget return on ad spend as a ratio (e.g. 4.0 = 400%); required if bidding_strategy is TARGET_ROAS, optional target for MAXIMIZE_CONVERSION_VALUE. 0 means none.
channel_typeNoSEARCH (default). DISPLAY, SHOPPING, VIDEO and PERFORMANCE_MAX are refused with the reason (see above).SEARCH
daily_budgetYesDaily budget in the account's currency (not micros); must be greater than 0 and at most the config's max_daily_budget.
language_idsYesREQUIRED list of language constant IDs. Common: "1001" German, "1000" English, "1002" French, "1003" Spanish, "1004" Italian, "1014" Portuguese. Full list: Google Ads API language constants.
ad_group_nameNoName of the initial ad group. Empty uses campaign_name.
campaign_nameYesName of the new campaign.
geo_target_idsYesREQUIRED list of geo target constant IDs. Common: "2276" Germany, "2040" Austria, "2756" Switzerland, "2840" USA, "2826" UK, "2250" France. Full list: Google Ads API geo target constants.
location_optionNoWho the geo targets reach. PRESENCE (people in or regularly in the locations), PRESENCE_OR_INTEREST (also people elsewhere who show interest in them) or SEARCH_INTEREST (people searching for them). Empty leaves Google's default, PRESENCE_OR_INTEREST. Anything but PRESENCE adds a warning.
bidding_strategyYesMAXIMIZE_CONVERSIONS | TARGET_CPA | TARGET_ROAS | MAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | MANUAL_CPC. BROAD keywords require a Smart Bidding strategy (MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, TARGET_CPA, TARGET_ROAS).
final_url_suffixNoParameters appended to the landing page URL, e.g. "utm_medium=cpc". Omitted leaves it unset.
tracking_url_templateNoCampaign tracking template, e.g. "{lpurl}?utm_source=google&utm_campaign={campaignid}". Must contain {lpurl} or a variant ({lpurl+2}, {unescapedlpurl}, {escapedlpurl+3}, ...). Omitted leaves it unset.
url_custom_parametersNoList of {"key": "grp", "value": "b2c"}, used as {_grp} in the template. Keys alphanumeric, max 8 characters; values up to 250.
display_network_enabledNoEnable Search campaign display expansion (SEARCH campaigns only). Defaults to off.
search_partners_enabledNoInclude ads on Search partners (SEARCH campaigns only).
negative_location_optionNoWho the location exclusions exclude. PRESENCE or PRESENCE_OR_INTEREST; empty leaves Google's default, PRESENCE_OR_INTEREST. PRESENCE excludes fewer people (only those physically there), so it widens reach and the preview warns.
display_expansion_enabledNoAlias for display_network_enabled; both must match when both are given.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv0.37.0
    • addedInput schema / properties / final_url_suffix
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Parameters appended to the landing page URL, e.g.\n\"utm_medium=cpc\". Omitted leaves it unset."
      +}
    • addedInput schema / properties / location_option
      Added value: +{
      +  "default": "",
      +  "description": "Who the geo targets reach. PRESENCE (people in or\nregularly in the locations), PRESENCE_OR_INTEREST (also people\nelsewhere who show interest in them) or SEARCH_INTEREST (people\nsearching for them). Empty leaves Google's default,\nPRESENCE_OR_INTEREST. Anything but PRESENCE adds a warning.",
      +  "type": "string"
      +}
    • addedInput schema / properties / negative_location_option
      Added value: +{
      +  "default": "",
      +  "description": "Who the location exclusions exclude.\nPRESENCE or PRESENCE_OR_INTEREST; empty leaves Google's default,\nPRESENCE_OR_INTEREST. PRESENCE excludes fewer people (only those\nphysically there), so it widens reach and the preview warns.",
      +  "type": "string"
      +}
    • addedInput schema / properties / tracking_url_template
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Campaign tracking template, e.g.\n\"{lpurl}?utm_source=google&utm_campaign={campaignid}\". Must contain\n{lpurl} or a variant ({lpurl+2}, {unescapedlpurl},\n{escapedlpurl+3}, ...). Omitted leaves it unset."
      +}
    • addedInput schema / properties / url_custom_parameters
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "List of {\"key\": \"grp\", \"value\": \"b2c\"}, used as\n{_grp} in the template. Keys alphanumeric, max 8 characters; values\nup to 250."
      +}
  2. Changed15 schema fields changedv0.27.1
    • addedInput schema / properties / ad_group_name / description
      Added value: +"Name of the initial ad group. Empty uses campaign_name."
    • addedInput schema / properties / bidding_strategy / description
      Added value: +"MAXIMIZE_CONVERSIONS | TARGET_CPA | TARGET_ROAS |\nMAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | MANUAL_CPC. BROAD\nkeywords require a Smart Bidding strategy (MAXIMIZE_CONVERSIONS,\nMAXIMIZE_CONVERSION_VALUE, TARGET_CPA, TARGET_ROAS)."
    • addedInput schema / properties / campaign_name / description
      Added value: +"Name of the new campaign."
    • addedInput schema / properties / channel_type / description
      Added value: +"SEARCH (default). DISPLAY, SHOPPING, VIDEO and\nPERFORMANCE_MAX are refused with the reason (see above)."
    • addedInput schema / properties / customer_id / description
      Added value: +"Google Ads customer ID (digits, e.g. \"1234567890\"). Empty\nuses the configured default account."
    • addedInput schema / properties / daily_budget / description
      Added value: +"Daily budget in the account's currency (not micros);\nmust be greater than 0 and at most the config's max_daily_budget."
    • addedInput schema / properties / display_expansion_enabled / description
      Added value: +"Alias for display_network_enabled; both must\nmatch when both are given."
    • addedInput schema / properties / display_network_enabled / description
      Added value: +"Enable Search campaign display expansion\n(SEARCH campaigns only). Defaults to off."
    • addedInput schema / properties / geo_target_ids / description
      Added value: +"REQUIRED list of geo target constant IDs.\nCommon: \"2276\" Germany, \"2040\" Austria, \"2756\" Switzerland, \"2840\" USA,\n\"2826\" UK, \"2250\" France. Full list: Google Ads API geo target constants."
    • addedInput schema / properties / keywords / description
      Added value: +"Optional list of {\"text\": \"keyword\", \"match_type\":\n\"EXACT|PHRASE|BROAD\"} added to the initial ad group."
    • addedInput schema / properties / language_ids / description
      Added value: +"REQUIRED list of language constant IDs.\nCommon: \"1001\" German, \"1000\" English, \"1002\" French, \"1003\" Spanish,\n\"1004\" Italian, \"1014\" Portuguese. Full list: Google Ads API\nlanguage constants."
    • addedInput schema / properties / max_cpc / description
      Added value: +"In the account's currency: the manual CPC bid for the initial\nad group when bidding_strategy is MANUAL_CPC, or the Maximize Clicks\nCPC cap when bidding_strategy is TARGET_SPEND. Not allowed with\nother strategies; 0 means none."
    • addedInput schema / properties / search_partners_enabled / description
      Added value: +"Include ads on Search partners (SEARCH\ncampaigns only)."
    • addedInput schema / properties / target_cpa / description
      Added value: +"Target cost per acquisition in the account's currency;\nrequired if bidding_strategy is TARGET_CPA, optional target for\nMAXIMIZE_CONVERSIONS. 0 means none."
    • addedInput schema / properties / target_roas / description
      Added value: +"Target return on ad spend as a ratio (e.g. 4.0 = 400%);\nrequired if bidding_strategy is TARGET_ROAS, optional target for\nMAXIMIZE_CONVERSION_VALUE. 0 means none."
  3. Addedv0.13.2
  4. Removedv0.13.0
  5. First observedv0.9.0

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses the most important behavioral fact: this is a preview that changes nothing, returns a plan_id plus warnings (e.g. budget below 5x target CPA, MANUAL_CPC), and only confirm_and_apply mutates state. The one residual tension is that readOnlyHint=false while the text says 'does NOT create anything' — harmless in practice (an internal plan record is stored), but it is not reconciled in the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the crucial preview/does-not-create fact, then layers inclusions, exclusions, and return behavior in a readable multi-line block with no repetition. The trailing Google Ads API docs URL adds little and is the only sentence that does not clearly earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 20-parameter draft tool with an output schema, the description covers everything the agent needs to decide and call correctly: supported channel, what gets staged, ads handled separately, preview-plus-plan_id return, and the confirm step. Return-value details are correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 20 parameters already carry their own documentation, including cross-parameter rules like BROAD keywords requiring Smart Bidding. The description adds no parameter-level detail beyond what the schema states, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (draft a campaign) and enumerates exactly what the draft contains: CampaignBudget, PAUSED Campaign, AdGroup, optional keywords, geo and language targeting. It also names what is excluded (ads) and which sibling adds them (draft_responsive_search_ad), so the boundary with neighbors is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (SEARCH campaigns only) and when-not-to-use with reasons (Performance Max needs a full asset group in one request; DISPLAY/SHOPPING/VIDEO need channel-specific settings), and routes the follow-up step to confirm_and_apply. This is a complete decision rule, not an implied one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools