OpenAI ChatGPT Ads — Manager
Manage existing campaigns, ad groups, and ads via the openai-ads MCP tools.
Request
The user's request: $ARGUMENTS
Workflow
Step 1 — Identify the target
Resolve what the user means: list_campaigns / list_ad_groups / list_ads
and match by name or id. Ambiguous match → show candidates and ask. Show the
entity's current state (get_*) before changing it.
Step 2 — Gate by action type
| Action | Gate |
|---|---|
pause_* |
Safe and reversible — do it, report old → new status. |
activate_* |
Starts spend. Show budget + targeting and ask "Activate now? Y/N" first. Remind: ads also need review_status: approved to actually deliver. |
update_* |
Show a before → after diff of exactly the fields changing, then apply. Partial nested objects (budget, creative, bidding_config) are auto-completed from current state — but say what the final object will be. Editing a creative re-triggers review. |
archive_* |
Irreversible. Quote the entity, say it can never be edited or reactivated, ask "Archive permanently? Y/N", and only then call with confirm_archive=true. |
Step 3 — Verify and report
Re-fetch the entity after the change and report its actual new state, not the intended one. For bulk requests ("pause everything"), list what matched, ask once for the whole batch, then apply sequentially and report each result.
Money reminders
Budgets and bids are micros in the account currency (get_ad_account):
1,000,000 micros = 1.00. Budgets are lifetime-only. max_bid_micros is per
impression ($60 CPM = 60,000). When the user says "set budget to $500", that is
{"budget": {"lifetime_spend_limit_micros": 500000000}}.
Anti-patterns
- Archiving without the explicit permanent-deletion confirmation.
- Activating without showing what will start spending.
- Reporting success without re-fetching the entity.
- Guessing which "summer campaign" the user meant.