Create PMax Campaign
🔄 LONG-RUNNING TOOL: Creates a Google Performance Max campaign with validated images. Emits MCP progress updates during authentication, asset upload, and campaign creation (typically 15-30 seconds). Progress stages: validate → commit.
⚠️ CRITICAL PREREQUISITES:
- MUST have valid asset_bundle_id from validate_and_prepare_assets tool OR existing_image_ids from discover_existing_assets
- MUST have all campaign text details from user
- Creates REAL campaigns that cost REAL money
- Call ONLY ONCE per campaign - do NOT retry automatically
🎥 VIDEOS ARE OPTIONAL BUT RECOMMENDED:
- Videos significantly improve PMAX performance (higher CTR, better engagement)
- Always ask the user: “Would you like to add YouTube videos to this campaign?”
- If yes: validate with
validate_videotool, then includeyoutube_video_idsparameter - If no: proceed without videos (campaigns work fine either way)
- See STEP 3.5 below for complete video guidance
⚠️ GOOGLE ADS POLICY NOTE: Avoid keywords related to health conditions, medical treatments, financial hardship, or political topics. These may trigger policy violations. Use general service terms instead. Example: Use “senior care services” not “nursing care”, “home services” not “medical services”
Authorizations
API key from https://adspirer.ai/keys. Prefix sk_live_. Treat as a secret — never commit.
Headers
Client-generated UUID to make writes idempotent. Strongly recommended for write tools. A repeat call with the same key returns the cached result instead of re-executing. Example: 550e8400-e29b-41d4-a716-446655440000
Body
All tool arguments are wrapped in an arguments object. The fields accepted inside arguments are listed below — required fields are marked with a red asterisk.
Input schema for create_pmax_campaign tool.
Supports two modes:
- Single asset group (flat fields — backward compatible)
- Multiple asset groups (asset_groups array — #183)
If asset_groups is provided, it takes priority over flat fields.
Response
Tool executed successfully. data.text carries the human-readable result (markdown-friendly). data.quota shows your current usage against the plan limit. data.structured appears when the tool emits machine-parseable structured content. data.content appears for tools that return non-text blocks (images, resources).
Returned on HTTP 200. data.text is the primary human-readable output. data.quota is always present for billable calls. data.structured is set only when the tool emits machine-parseable structured content. data.content is set only when the tool emits non-text content blocks.

