adloop 0.26.1__tar.gz → 0.27.0__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.0}/PKG-INFO +8 -2
  2. {adloop-0.26.1 → adloop-0.27.0}/README.md +7 -1
  3. {adloop-0.26.1 → adloop-0.27.0}/pyproject.toml +1 -1
  4. {adloop-0.26.1 → adloop-0.27.0}/pyproject.toml.orig +1 -1
  5. adloop-0.27.0/src/adloop/ads/pmax.py +721 -0
  6. adloop-0.27.0/src/adloop/ads/shopping.py +284 -0
  7. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/write.py +95 -43
  8. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/adloop.md +25 -7
  9. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/server.py +240 -6
  10. adloop-0.26.1/src/adloop/ads/pmax.py +0 -257
  11. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/__init__.py +0 -0
  12. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/__main__.py +0 -0
  13. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/_mcp_patches.py +0 -0
  14. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/__init__.py +0 -0
  15. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/ai_max.py +0 -0
  16. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/brands.py +0 -0
  17. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/client.py +0 -0
  18. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/conversion_actions.py +0 -0
  19. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/currency.py +0 -0
  20. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/custom_conversion_goals.py +0 -0
  21. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/enums.py +0 -0
  22. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/forecast.py +0 -0
  23. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/gaql.py +0 -0
  24. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/image_fetch.py +0 -0
  25. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/read.py +0 -0
  26. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ads/validate_only.py +0 -0
  27. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/auth.py +0 -0
  28. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/cli.py +0 -0
  29. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/config.py +0 -0
  30. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/crossref.py +0 -0
  31. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/diagnostics.py +0 -0
  32. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ga4/__init__.py +0 -0
  33. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ga4/client.py +0 -0
  34. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ga4/reports.py +0 -0
  35. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ga4/tracking.py +0 -0
  36. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/ga4/write.py +0 -0
  37. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gsc/__init__.py +0 -0
  38. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gsc/client.py +0 -0
  39. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gsc/reports.py +0 -0
  40. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gtm/__init__.py +0 -0
  41. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gtm/client.py +0 -0
  42. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gtm/entities.py +0 -0
  43. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gtm/read.py +0 -0
  44. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/gtm/write.py +0 -0
  45. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/merchant/__init__.py +0 -0
  46. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/merchant/client.py +0 -0
  47. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/merchant/read.py +0 -0
  48. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/pagespeed.py +0 -0
  49. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/reddit/__init__.py +0 -0
  50. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/reddit/auth.py +0 -0
  51. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/reddit/client.py +0 -0
  52. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/reddit/read.py +0 -0
  53. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/reddit/schedule.py +0 -0
  54. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/reddit/write.py +0 -0
  55. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/__init__.py +0 -0
  56. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/commands/analyze-performance.md +0 -0
  57. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/commands/budget-plan.md +0 -0
  58. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/commands/create-ad.md +0 -0
  59. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/commands/create-campaign.md +0 -0
  60. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/commands/diagnose-tracking.md +0 -0
  61. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules/commands/optimize-campaign.md +0 -0
  62. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/rules_install.py +0 -0
  63. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/runtime.py +0 -0
  64. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/safety/__init__.py +0 -0
  65. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/safety/approval.py +0 -0
  66. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/safety/approval_card.html +0 -0
  67. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/safety/audit.py +0 -0
  68. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/safety/guards.py +0 -0
  69. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/safety/preview.py +0 -0
  70. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/tracking.py +0 -0
  71. {adloop-0.26.1 → adloop-0.27.0}/src/adloop/upload_card.html +0 -0
  72. {adloop-0.26.1 → adloop-0.27.0}/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.0
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 |
@@ -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 |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "adloop"
3
- version = "0.26.1"
3
+ version = "0.27.0"
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.0"
4
4
  description = "The AI command center for Google Ads, Reddit Ads, GA4, and tracking code."
5
5
  readme = "README.md"
6
6
  authors = [