adloop 0.19.4__tar.gz → 0.19.6__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 (64) hide show
  1. {adloop-0.19.4 → adloop-0.19.6}/PKG-INFO +2 -2
  2. {adloop-0.19.4 → adloop-0.19.6}/README.md +1 -1
  3. {adloop-0.19.4 → adloop-0.19.6}/pyproject.toml +1 -1
  4. {adloop-0.19.4 → adloop-0.19.6}/pyproject.toml.orig +1 -1
  5. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/adloop.md +5 -5
  6. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/server.py +194 -189
  7. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/__init__.py +0 -0
  8. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/__main__.py +0 -0
  9. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/_mcp_patches.py +0 -0
  10. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/__init__.py +0 -0
  11. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/ai_max.py +0 -0
  12. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/brands.py +0 -0
  13. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/client.py +0 -0
  14. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/conversion_actions.py +0 -0
  15. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/currency.py +0 -0
  16. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/custom_conversion_goals.py +0 -0
  17. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/enums.py +0 -0
  18. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/forecast.py +0 -0
  19. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/gaql.py +0 -0
  20. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/image_fetch.py +0 -0
  21. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/pmax.py +0 -0
  22. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/read.py +0 -0
  23. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/validate_only.py +0 -0
  24. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ads/write.py +0 -0
  25. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/auth.py +0 -0
  26. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/cli.py +0 -0
  27. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/config.py +0 -0
  28. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/crossref.py +0 -0
  29. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/diagnostics.py +0 -0
  30. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ga4/__init__.py +0 -0
  31. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ga4/client.py +0 -0
  32. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ga4/reports.py +0 -0
  33. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ga4/tracking.py +0 -0
  34. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/ga4/write.py +0 -0
  35. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/gsc/__init__.py +0 -0
  36. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/gsc/client.py +0 -0
  37. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/gsc/reports.py +0 -0
  38. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/gtm/__init__.py +0 -0
  39. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/gtm/client.py +0 -0
  40. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/gtm/read.py +0 -0
  41. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/merchant/__init__.py +0 -0
  42. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/merchant/client.py +0 -0
  43. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/merchant/read.py +0 -0
  44. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/pagespeed.py +0 -0
  45. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/reddit/__init__.py +0 -0
  46. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/reddit/auth.py +0 -0
  47. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/reddit/client.py +0 -0
  48. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/reddit/read.py +0 -0
  49. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/reddit/schedule.py +0 -0
  50. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/reddit/write.py +0 -0
  51. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/__init__.py +0 -0
  52. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/commands/analyze-performance.md +0 -0
  53. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/commands/budget-plan.md +0 -0
  54. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/commands/create-ad.md +0 -0
  55. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/commands/create-campaign.md +0 -0
  56. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/commands/diagnose-tracking.md +0 -0
  57. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules/commands/optimize-campaign.md +0 -0
  58. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/rules_install.py +0 -0
  59. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/runtime.py +0 -0
  60. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/safety/__init__.py +0 -0
  61. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/safety/audit.py +0 -0
  62. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/safety/guards.py +0 -0
  63. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/safety/preview.py +0 -0
  64. {adloop-0.19.4 → adloop-0.19.6}/src/adloop/tracking.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: adloop
3
- Version: 0.19.4
3
+ Version: 0.19.6
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
@@ -128,7 +128,7 @@ The best features come from real workflows. If you're using AdLoop and find your
128
128
  | `get_negative_keyword_list_campaigns` | List which campaigns a shared negative keyword list is attached to |
129
129
  | `get_recommendations` | Google's auto-generated recommendations with type, estimated impact, and campaign context |
130
130
  | `get_pmax_performance` | Performance Max campaign metrics with network breakdown + asset group ad strength |
131
- | `get_asset_performance` | Per-asset details for PMax — field type, serving status, content |
131
+ | `get_pmax_assets` | Per-asset details for PMax — field type, serving status, content |
132
132
  | `get_detailed_asset_performance` | Top-performing asset combinations — which headline+description+image combos Google selects most |
133
133
  | `get_audience_performance` | Audience segment performance — remarketing, in-market, affinity, demographics |
134
134
  | `get_demographic_targeting` | List demographic criteria (age/gender/parental status/income) on an ad group or campaign |
@@ -101,7 +101,7 @@ The best features come from real workflows. If you're using AdLoop and find your
101
101
  | `get_negative_keyword_list_campaigns` | List which campaigns a shared negative keyword list is attached to |
102
102
  | `get_recommendations` | Google's auto-generated recommendations with type, estimated impact, and campaign context |
103
103
  | `get_pmax_performance` | Performance Max campaign metrics with network breakdown + asset group ad strength |
104
- | `get_asset_performance` | Per-asset details for PMax — field type, serving status, content |
104
+ | `get_pmax_assets` | Per-asset details for PMax — field type, serving status, content |
105
105
  | `get_detailed_asset_performance` | Top-performing asset combinations — which headline+description+image combos Google selects most |
106
106
  | `get_audience_performance` | Audience segment performance — remarketing, in-market, affinity, demographics |
107
107
  | `get_demographic_targeting` | List demographic criteria (age/gender/parental status/income) on an ad group or campaign |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "adloop"
3
- version = "0.19.4"
3
+ version = "0.19.6"
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.19.4"
3
+ version = "0.19.6"
4
4
  description = "The AI command center for Google Ads, Reddit Ads, GA4, and tracking code."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -42,7 +42,7 @@ You have access to AdLoop MCP tools that connect Google Ads, Reddit Ads and Goog
42
42
  | `get_negative_keyword_list_campaigns` | List which campaigns a shared negative keyword list is attached to | `shared_set_id` (optional) |
43
43
  | `get_recommendations` | Google's auto-generated recommendations with estimated impact — budget, keyword, bid strategy, ad copy suggestions | `recommendation_types` (optional filter), `campaign_id` (optional) |
44
44
  | `get_pmax_performance` | Performance Max campaign metrics with network breakdown + asset group ad strength | `date_range_start`, `date_range_end` |
45
- | `get_asset_performance` | Per-asset details for PMax — field type, serving status, content. Use with `get_detailed_asset_performance` for quality signals | `campaign_id` (optional) |
45
+ | `get_pmax_assets` | Per-asset details for PMax — field type, serving status, content. Use with `get_detailed_asset_performance` for quality signals | `campaign_id` (optional) |
46
46
  | `get_detailed_asset_performance` | Top-performing asset combinations — which headline+description+image combos Google selects most | `campaign_id` (optional) |
47
47
  | `get_audience_performance` | Audience segment metrics — remarketing, in-market, affinity, demographics | `date_range_start`, `date_range_end`, `campaign_id` (optional) |
48
48
  | `get_demographic_targeting` | List current demographic criteria (age/gender/parental status/income) on an ad group or campaign — returns each criterion's `remove_id` for use with `remove_entity` | exactly one of `ad_group_id` or `campaign_id` |
@@ -59,9 +59,9 @@ You have access to AdLoop MCP tools that connect Google Ads, Reddit Ads and Goog
59
59
  - Ads read tools automatically compute `metrics.cost` and `metrics.cpa` from `metrics.cost_micros` — no manual division needed. `metrics.currency` contains the account's currency code (auto-detected).
60
60
  - `metrics.average_cpc_amount` is also pre-computed where available.
61
61
  - `get_ad_performance` returns full `headlines` and `descriptions` lists for RSAs.
62
- - `get_recommendations` returns `estimated_improvement` per recommendation (potential minus base metrics) and `insights[]` that flag self-serving budget recommendations.
62
+ - `get_recommendations` returns `estimated_improvement` per recommendation (potential minus base metrics) and `insights[]` that flag budget-increase recommendations, whose projected gain comes from spending more.
63
63
  - PMax tools: `get_pmax_performance` returns `insights[]` flagging weak ad strength and zero-conversion asset groups. `segments.ad_network_type` includes MIXED — a Google catch-all for most PMax traffic. Full channel splits (Search vs YouTube vs Display vs Discover) are not available via the API.
64
- - `get_asset_performance` returns `by_status` and `by_field_type` summaries. Note: per-asset performance labels (BEST/GOOD/LOW) are not available for PMax assets in the Google Ads API. Use `get_detailed_asset_performance` for quality signals via top combinations.
64
+ - `get_pmax_assets` returns `by_status` and `by_field_type` summaries. Note: per-asset performance labels (BEST/GOOD/LOW) are not available for PMax assets in the Google Ads API. Use `get_detailed_asset_performance` for quality signals via top combinations.
65
65
  - `get_audience_performance` works for campaigns with explicit audience targeting. PMax audience targeting is automatic and may not appear in this report. When the results include SEARCH campaigns, `insights[]` reminds you that custom segments cannot be attached to them (see the compatibility matrix below) — relay that constraint instead of proposing impossible pairings.
66
66
  - `get_demographic_targeting` returns an empty list when no demographics have been excluded or narrowed — that is the DEFAULT state (Google serves to all segments). Each criterion includes a composite `remove_id` (`adGroupId~criterionId` or `campaignId~criterionId`) that can be passed straight to `remove_entity`.
67
67
  - **Compact mode for audits**: `get_campaign_performance`, `get_keyword_performance`, `get_search_terms`, and `get_ad_performance` accept `compact=true`, returning account totals, breakdowns, the top-10 rows, and pre-computed offender lists (zero-conversion spenders, low-QS keywords, negative-keyword waste candidates, thin RSAs, single-ad ad groups) instead of every row; compact `get_ad_performance` keeps `final_urls` on its rows and adds `landing_pages` (every final URL across all ads with its ad count), so landing-page checks need no extra GAQL — roughly 90% smaller. Use it for account audits and overviews so raw tables don't flood the context; use the default full mode when you need a specific entity's exact rows before drafting a change. In harnesses with subagents, heavy multi-tool audits can additionally be delegated to a subagent that returns only the summary.
@@ -506,7 +506,7 @@ Reddit's structure is campaign → ad group (budget, bid, pixel, targeting) →
506
506
 
507
507
  1. Call `get_pmax_performance` for campaign-level metrics with network breakdown and asset group ad strength
508
508
  2. Review `insights[]` — weak ad strength and zero-conversion asset groups are the most actionable findings
509
- 3. If ad strength is POOR or AVERAGE, call `get_asset_performance` to see which specific assets are underperforming (LOW label) and which asset types are missing
509
+ 3. If ad strength is POOR or AVERAGE, call `get_pmax_assets` to see each asset's type and serving status and which asset types are missing (per-asset LOW/GOOD/BEST labels don't exist for PMax; `get_detailed_asset_performance` shows which combinations Google serves most)
510
510
  4. Call `get_detailed_asset_performance` to see which headline+description+image combinations Google selects most — this reveals what's actually working
511
511
  5. If the user wants to improve PMax performance:
512
512
  - Replace LOW-performing assets with new ones
@@ -517,7 +517,7 @@ Reddit's structure is campaign → ad group (budget, bid, pixel, targeting) →
517
517
  ### When user asks about Google's recommendations or "what does Google suggest"
518
518
 
519
519
  1. Call `get_recommendations` to retrieve all active (non-dismissed) recommendations
520
- 2. Review the `by_type` summary and `insights[]` — these flag self-serving budget recommendations
520
+ 2. Review the `by_type` summary and `insights[]` — these flag budget-increase recommendations, whose projected gain comes from spending more
521
521
  3. **NEVER blindly endorse Google's recommendations.** Cross-reference each recommendation against actual account data:
522
522
  - If Google says "raise budget" but the campaign has zero conversions → bad advice. Fix tracking/landing pages first.
523
523
  - If Google says "add keywords" but existing keywords have quality score < 5 → bad advice. Fix relevance first.