adloop 0.26.1__tar.gz → 0.27.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {adloop-0.26.1 → adloop-0.27.1}/PKG-INFO +13 -6
  2. {adloop-0.26.1 → adloop-0.27.1}/README.md +12 -5
  3. {adloop-0.26.1 → adloop-0.27.1}/pyproject.toml +1 -1
  4. {adloop-0.26.1 → adloop-0.27.1}/pyproject.toml.orig +1 -1
  5. adloop-0.27.1/src/adloop/ads/pmax.py +721 -0
  6. adloop-0.27.1/src/adloop/ads/shopping.py +284 -0
  7. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/write.py +95 -43
  8. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/cli.py +136 -58
  9. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/adloop.md +25 -7
  10. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/server.py +240 -6
  11. adloop-0.26.1/src/adloop/ads/pmax.py +0 -257
  12. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/__init__.py +0 -0
  13. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/__main__.py +0 -0
  14. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/_mcp_patches.py +0 -0
  15. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/__init__.py +0 -0
  16. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/ai_max.py +0 -0
  17. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/brands.py +0 -0
  18. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/client.py +0 -0
  19. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/conversion_actions.py +0 -0
  20. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/currency.py +0 -0
  21. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/custom_conversion_goals.py +0 -0
  22. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/enums.py +0 -0
  23. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/forecast.py +0 -0
  24. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/gaql.py +0 -0
  25. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/image_fetch.py +0 -0
  26. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/read.py +0 -0
  27. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ads/validate_only.py +0 -0
  28. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/auth.py +0 -0
  29. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/config.py +0 -0
  30. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/crossref.py +0 -0
  31. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/diagnostics.py +0 -0
  32. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ga4/__init__.py +0 -0
  33. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ga4/client.py +0 -0
  34. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ga4/reports.py +0 -0
  35. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ga4/tracking.py +0 -0
  36. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/ga4/write.py +0 -0
  37. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gsc/__init__.py +0 -0
  38. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gsc/client.py +0 -0
  39. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gsc/reports.py +0 -0
  40. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gtm/__init__.py +0 -0
  41. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gtm/client.py +0 -0
  42. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gtm/entities.py +0 -0
  43. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gtm/read.py +0 -0
  44. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/gtm/write.py +0 -0
  45. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/merchant/__init__.py +0 -0
  46. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/merchant/client.py +0 -0
  47. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/merchant/read.py +0 -0
  48. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/pagespeed.py +0 -0
  49. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/reddit/__init__.py +0 -0
  50. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/reddit/auth.py +0 -0
  51. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/reddit/client.py +0 -0
  52. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/reddit/read.py +0 -0
  53. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/reddit/schedule.py +0 -0
  54. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/reddit/write.py +0 -0
  55. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/__init__.py +0 -0
  56. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/commands/analyze-performance.md +0 -0
  57. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/commands/budget-plan.md +0 -0
  58. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/commands/create-ad.md +0 -0
  59. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/commands/create-campaign.md +0 -0
  60. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/commands/diagnose-tracking.md +0 -0
  61. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules/commands/optimize-campaign.md +0 -0
  62. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/rules_install.py +0 -0
  63. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/runtime.py +0 -0
  64. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/safety/__init__.py +0 -0
  65. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/safety/approval.py +0 -0
  66. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/safety/approval_card.html +0 -0
  67. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/safety/audit.py +0 -0
  68. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/safety/guards.py +0 -0
  69. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/safety/preview.py +0 -0
  70. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/tracking.py +0 -0
  71. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/upload_card.html +0 -0
  72. {adloop-0.26.1 → adloop-0.27.1}/src/adloop/uploads.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: adloop
3
- Version: 0.26.1
3
+ Version: 0.27.1
4
4
  Summary: The AI command center for Google Ads, Reddit Ads, GA4, and tracking code.
5
5
  Keywords: mcp,google-ads,reddit-ads,google-analytics,ga4,cursor,marketing
6
6
  Author: Daniel Klose
@@ -41,6 +41,7 @@ Description-Content-Type: text/markdown
41
41
  [![Google Ads API](https://img.shields.io/badge/Google%20Ads-API%20v25-4285F4.svg?logo=google-ads&logoColor=white)](https://developers.google.com/google-ads/api/docs/start)
42
42
  [![GA4 Data API](https://img.shields.io/badge/GA4-Data%20API-E37400.svg?logo=google-analytics&logoColor=white)](https://developers.google.com/analytics/devguides/reporting/data/v1)
43
43
  [![GitHub stars](https://img.shields.io/github/stars/kLOsk/adloop?style=social)](https://github.com/kLOsk/adloop)
44
+ [![Smithery](https://img.shields.io/badge/Smithery-adloop-FF5601.svg)](https://smithery.ai/servers/adloop/adloop)
44
45
 
45
46
  An MCP server that gives your AI assistant read + write access to Google Ads, Reddit Ads and GA4 — with safety guardrails that prevent accidental spend.
46
47
 
@@ -132,6 +133,7 @@ The best features come from real workflows. If you're using AdLoop and find your
132
133
  | `get_recommendations` | Google's auto-generated recommendations with type, estimated impact, and campaign context |
133
134
  | `get_pmax_performance` | Performance Max campaign metrics with network breakdown + asset group ad strength |
134
135
  | `get_pmax_assets` | Per-asset details for PMax — field type, serving status, content |
136
+ | `get_asset_group_signals` | A PMax asset group's search themes and audience signal, plus the audiences available for it |
135
137
  | `get_detailed_asset_performance` | Top-performing asset combinations — which headline+description+image combos Google selects most |
136
138
  | `get_audience_performance` | Audience segment performance — remarketing, in-market, affinity, demographics |
137
139
  | `get_change_history` | What changed before the drop: who changed what and when, through which client (UI, API, scripts, auto-applied recommendations), last 30 days |
@@ -289,6 +291,10 @@ All write operations follow a **draft → preview → confirm** workflow. Nothin
289
291
  | Tool | What It Does |
290
292
  |------|-------------|
291
293
  | `draft_campaign` | Create a full campaign structure — budget + campaign (PAUSED) + ad group + optional keywords. Supports Search partners, display expansion, and `max_cpc` for either MANUAL_CPC initial ad-group bids or TARGET_SPEND (Maximize Clicks) CPC caps. |
294
+ | `draft_shopping_campaign` | Create a Standard Shopping campaign for a linked Merchant Center feed — budget, campaign (PAUSED), product ad group, Shopping ad and an "All products" group in one atomic request. Manual CPC, Maximize clicks or target ROAS. |
295
+ | `draft_asset_group_assets` | Add and remove Performance Max assets (text, images incl. uploads, YouTube videos) in one change, so replacing an asset never drops a group below Google's minimums |
296
+ | `draft_asset_group_signals` | Add search themes or set the audience signal of a PMax asset group |
297
+ | `draft_pmax_product_exclusions` | Exclude products from a retail PMax asset group by item id, brand or custom label |
292
298
  | `update_campaign` | Modify existing campaign settings — bidding, budget, geo/language targeting, Search partners, display expansion, and TARGET_SPEND (Maximize Clicks) `max_cpc` caps. |
293
299
  | `draft_ad_group` | Create a paused SEARCH_STANDARD ad group inside an existing campaign, with optional MANUAL_CPC `max_cpc`. |
294
300
  | `update_ad_group` | Update an ad group name and/or MANUAL_CPC `max_cpc`. Use `pause_entity` / `enable_entity` for ad-group status changes. |
@@ -314,7 +320,7 @@ All write operations follow a **draft → preview → confirm** workflow. Nothin
314
320
  | `draft_update_custom_conversion_goal` | Rename a custom conversion goal and/or replace its action list (list replace, not append) |
315
321
  | `draft_assign_custom_conversion_goal` | Point a campaign at a custom conversion goal (`goal_config_level = CAMPAIGN`) |
316
322
  | `draft_clear_custom_conversion_goal` | Put a campaign back on the account-level goals (rollback) |
317
- | `pause_entity` | Pause a campaign, ad group, ad, or keyword |
323
+ | `pause_entity` | Pause a campaign, ad group, ad, keyword or PMax asset group |
318
324
  | `enable_entity` | Re-enable a paused entity |
319
325
  | `remove_entity` | Permanently remove an entity (irreversible — prefers pause). Supports keywords, negative keywords, ads, ad groups, campaigns. |
320
326
  | `confirm_and_apply` | Execute a previously previewed change |
@@ -398,7 +404,7 @@ uv run adloop init
398
404
 
399
405
  ### What `adloop init` does
400
406
 
401
- The wizard walks you through:
407
+ The wizard first asks whether to set up Google. Answer no to run AdLoop on Reddit Ads alone: it skips steps 1 to 6 and goes straight to the Reddit step. Otherwise it walks you through:
402
408
 
403
409
  1. **Google Cloud setup** — creates a project, enables the three APIs, generates an OAuth client (see [Custom Google Cloud Project Setup](#custom-google-cloud-project-setup) below for the exact steps the wizard refers you to)
404
410
  2. **Google Ads API access** — applied for on your Cloud project's [Google Ads API Overview page](https://console.cloud.google.com/google/ads-apis/overview); the legacy developer-token prompt can be left empty
@@ -406,9 +412,10 @@ The wizard walks you through:
406
412
  4. **OAuth sign-in** — opens a browser to sign in with Google (or prints a URL for headless servers)
407
413
  5. **Auto-discovers your accounts** — finds your GA4 properties and Ads accounts automatically
408
414
  6. **Optional services** — pin a GTM container, a Search Console property (both auto-discovered too), and a PageSpeed API key; skip any of them with Enter
409
- 7. **Safety defaults** — budget cap and dry-run preference
410
- 8. **Toolsets** — optionally expose only part of the tool catalog to your AI client (see [Toolsets](#toolsets--trim-the-context-footprint))
411
- 9. **Editor config snippets** — prints MCP configuration for both Cursor and Claude Code, including your toolset selection
415
+ 7. **Reddit Ads** — optional next to Google, required without it: your own Reddit developer app, sign-in, and the default ad account
416
+ 8. **Safety defaults** — budget cap and dry-run preference
417
+ 9. **Toolsets** — optionally expose only part of the tool catalog to your AI client (see [Toolsets](#toolsets--trim-the-context-footprint))
418
+ 10. **Editor config snippets** — prints MCP configuration for both Cursor and Claude Code, including your toolset selection
412
419
 
413
420
  ### Requirements
414
421
 
@@ -13,6 +13,7 @@
13
13
  [![Google Ads API](https://img.shields.io/badge/Google%20Ads-API%20v25-4285F4.svg?logo=google-ads&logoColor=white)](https://developers.google.com/google-ads/api/docs/start)
14
14
  [![GA4 Data API](https://img.shields.io/badge/GA4-Data%20API-E37400.svg?logo=google-analytics&logoColor=white)](https://developers.google.com/analytics/devguides/reporting/data/v1)
15
15
  [![GitHub stars](https://img.shields.io/github/stars/kLOsk/adloop?style=social)](https://github.com/kLOsk/adloop)
16
+ [![Smithery](https://img.shields.io/badge/Smithery-adloop-FF5601.svg)](https://smithery.ai/servers/adloop/adloop)
16
17
 
17
18
  An MCP server that gives your AI assistant read + write access to Google Ads, Reddit Ads and GA4 — with safety guardrails that prevent accidental spend.
18
19
 
@@ -104,6 +105,7 @@ The best features come from real workflows. If you're using AdLoop and find your
104
105
  | `get_recommendations` | Google's auto-generated recommendations with type, estimated impact, and campaign context |
105
106
  | `get_pmax_performance` | Performance Max campaign metrics with network breakdown + asset group ad strength |
106
107
  | `get_pmax_assets` | Per-asset details for PMax — field type, serving status, content |
108
+ | `get_asset_group_signals` | A PMax asset group's search themes and audience signal, plus the audiences available for it |
107
109
  | `get_detailed_asset_performance` | Top-performing asset combinations — which headline+description+image combos Google selects most |
108
110
  | `get_audience_performance` | Audience segment performance — remarketing, in-market, affinity, demographics |
109
111
  | `get_change_history` | What changed before the drop: who changed what and when, through which client (UI, API, scripts, auto-applied recommendations), last 30 days |
@@ -261,6 +263,10 @@ All write operations follow a **draft → preview → confirm** workflow. Nothin
261
263
  | Tool | What It Does |
262
264
  |------|-------------|
263
265
  | `draft_campaign` | Create a full campaign structure — budget + campaign (PAUSED) + ad group + optional keywords. Supports Search partners, display expansion, and `max_cpc` for either MANUAL_CPC initial ad-group bids or TARGET_SPEND (Maximize Clicks) CPC caps. |
266
+ | `draft_shopping_campaign` | Create a Standard Shopping campaign for a linked Merchant Center feed — budget, campaign (PAUSED), product ad group, Shopping ad and an "All products" group in one atomic request. Manual CPC, Maximize clicks or target ROAS. |
267
+ | `draft_asset_group_assets` | Add and remove Performance Max assets (text, images incl. uploads, YouTube videos) in one change, so replacing an asset never drops a group below Google's minimums |
268
+ | `draft_asset_group_signals` | Add search themes or set the audience signal of a PMax asset group |
269
+ | `draft_pmax_product_exclusions` | Exclude products from a retail PMax asset group by item id, brand or custom label |
264
270
  | `update_campaign` | Modify existing campaign settings — bidding, budget, geo/language targeting, Search partners, display expansion, and TARGET_SPEND (Maximize Clicks) `max_cpc` caps. |
265
271
  | `draft_ad_group` | Create a paused SEARCH_STANDARD ad group inside an existing campaign, with optional MANUAL_CPC `max_cpc`. |
266
272
  | `update_ad_group` | Update an ad group name and/or MANUAL_CPC `max_cpc`. Use `pause_entity` / `enable_entity` for ad-group status changes. |
@@ -286,7 +292,7 @@ All write operations follow a **draft → preview → confirm** workflow. Nothin
286
292
  | `draft_update_custom_conversion_goal` | Rename a custom conversion goal and/or replace its action list (list replace, not append) |
287
293
  | `draft_assign_custom_conversion_goal` | Point a campaign at a custom conversion goal (`goal_config_level = CAMPAIGN`) |
288
294
  | `draft_clear_custom_conversion_goal` | Put a campaign back on the account-level goals (rollback) |
289
- | `pause_entity` | Pause a campaign, ad group, ad, or keyword |
295
+ | `pause_entity` | Pause a campaign, ad group, ad, keyword or PMax asset group |
290
296
  | `enable_entity` | Re-enable a paused entity |
291
297
  | `remove_entity` | Permanently remove an entity (irreversible — prefers pause). Supports keywords, negative keywords, ads, ad groups, campaigns. |
292
298
  | `confirm_and_apply` | Execute a previously previewed change |
@@ -370,7 +376,7 @@ uv run adloop init
370
376
 
371
377
  ### What `adloop init` does
372
378
 
373
- The wizard walks you through:
379
+ The wizard first asks whether to set up Google. Answer no to run AdLoop on Reddit Ads alone: it skips steps 1 to 6 and goes straight to the Reddit step. Otherwise it walks you through:
374
380
 
375
381
  1. **Google Cloud setup** — creates a project, enables the three APIs, generates an OAuth client (see [Custom Google Cloud Project Setup](#custom-google-cloud-project-setup) below for the exact steps the wizard refers you to)
376
382
  2. **Google Ads API access** — applied for on your Cloud project's [Google Ads API Overview page](https://console.cloud.google.com/google/ads-apis/overview); the legacy developer-token prompt can be left empty
@@ -378,9 +384,10 @@ The wizard walks you through:
378
384
  4. **OAuth sign-in** — opens a browser to sign in with Google (or prints a URL for headless servers)
379
385
  5. **Auto-discovers your accounts** — finds your GA4 properties and Ads accounts automatically
380
386
  6. **Optional services** — pin a GTM container, a Search Console property (both auto-discovered too), and a PageSpeed API key; skip any of them with Enter
381
- 7. **Safety defaults** — budget cap and dry-run preference
382
- 8. **Toolsets** — optionally expose only part of the tool catalog to your AI client (see [Toolsets](#toolsets--trim-the-context-footprint))
383
- 9. **Editor config snippets** — prints MCP configuration for both Cursor and Claude Code, including your toolset selection
387
+ 7. **Reddit Ads** — optional next to Google, required without it: your own Reddit developer app, sign-in, and the default ad account
388
+ 8. **Safety defaults** — budget cap and dry-run preference
389
+ 9. **Toolsets** — optionally expose only part of the tool catalog to your AI client (see [Toolsets](#toolsets--trim-the-context-footprint))
390
+ 10. **Editor config snippets** — prints MCP configuration for both Cursor and Claude Code, including your toolset selection
384
391
 
385
392
  ### Requirements
386
393
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "adloop"
3
- version = "0.26.1"
3
+ version = "0.27.1"
4
4
  description = "The AI command center for Google Ads, Reddit Ads, GA4, and tracking code."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "adloop"
3
- version = "0.26.1"
3
+ version = "0.27.1"
4
4
  description = "The AI command center for Google Ads, Reddit Ads, GA4, and tracking code."
5
5
  readme = "README.md"
6
6
  authors = [