# AdLoop MCP server

> Lets an AI client read and change Google Ads, Reddit Ads and GA4 campaigns, with a preview shown before every change.

- Repository: https://github.com/kLOsk/adloop
- Page: https://hostedmcp.org/servers/klosk/adloop
- Transport: stdio, remote
- Stars: 301
- License: MIT
- Latest version: 0.42.0

## Install

### Claude Code

```sh
claude mcp add adloop -- uvx adloop
```

### Cursor (`~/.cursor/mcp.json`)

```json
{
  "mcpServers": {
    "adloop": {
      "command": "uvx",
      "args": [
        "adloop"
      ]
    }
  }
}
```

### VS Code (`.vscode/mcp.json`)

```json
{
  "servers": {
    "adloop": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "adloop"
      ]
    }
  }
}
```

### Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "adloop": {
      "command": "uvx",
      "args": [
        "adloop"
      ]
    }
  }
}
```

### Codex (`~/.codex/config.toml`)

```toml
[mcp_servers.adloop]
command = "uvx"
args = ["adloop"]
```

### Gemini CLI (`~/.gemini/settings.json`)

```json
{
  "mcpServers": {
    "adloop": {
      "command": "uvx",
      "args": [
        "adloop"
      ]
    }
  }
}
```

## Environment variables

| Name | Required | Secret | Description |
|---|---|---|---|
| `ADLOOP_TOOLSETS` | no | no |  |

## Tools (127)

- `health_check`
- `get_account_summaries`
- `run_ga4_report`
- `run_realtime_report`
- `get_tracking_events`
- `list_key_events`
- `list_ga4_dimensions_and_metrics`
- `list_accounts`
- `get_campaign_performance`
- `get_ad_performance`
- `get_keyword_performance`
- `get_search_terms`
- `get_negative_keywords`
- `get_negative_keyword_lists`
- `get_negative_keyword_list_keywords`
- `get_negative_keyword_list_campaigns`
- `get_recommendations`
- `get_recommendation_subscriptions`
- `get_pmax_performance`
- `get_pmax_assets`
- `get_asset_group_signals`
- `get_detailed_asset_performance`
- `get_audience_performance`
- `get_shopping_product_performance`
- `get_change_history`
- `get_demographic_targeting`
- `get_audience_lists`
- `search_audience_segments`
- `get_audience_targeting`
- `suggest_brands`
- `check_brand_names`
- `get_brand_lists`
- `get_brand_list_brands`
- `get_brand_list_campaigns`
- `get_ai_max_settings`
- `get_campaign_settings`
- `get_custom_conversion_goals`
- `run_gaql`
- `analyze_campaign_conversions`
- `landing_page_analysis`
- `attribution_check`
- `validate_tracking`
- `generate_tracking_code`
- `audit_event_coverage`
- `list_gtm_accounts`
- `list_gtm_containers`
- `list_gtm_tags`
- `get_gtm_tag`
- `list_gtm_triggers`
- `get_gtm_trigger`
- `list_gtm_variables`
- `list_gtm_workspaces`
- `get_gtm_workspace_diff`
- `list_gtm_versions`
- `get_gtm_version`
- `get_gtm_version_diff`
- `draft_gtm_tag`
- `draft_gtm_trigger`
- `draft_gtm_variable`
- `draft_delete_gtm_entity`
- `draft_publish_gtm_workspace`
- `draft_rollback_gtm_version`
- `list_gsc_sites`
- `run_gsc_report`
- `analyze_page_speed`
- `list_merchant_accounts`
- `get_merchant_feed_health`
- `get_merchant_product_issues`
- `list_reddit_accounts`
- `list_reddit_funding_instruments`
- `get_reddit_performance`
- `run_reddit_report`
- `get_reddit_pixels`
- `get_reddit_audiences`
- `search_reddit_targeting`
- `get_reddit_account_history`
- `estimate_reddit_ad_group`
- `draft_reddit_custom_audience`
- `list_microsoft_ads_accounts`
- `get_microsoft_performance`
- `get_microsoft_search_terms`
- `get_microsoft_location_performance`
- `get_microsoft_conversion_setup`
- `search_microsoft_locations`
- `discover_keywords`
- `estimate_budget`
- `draft_campaign`
- `draft_shopping_campaign`
- `draft_asset_group_assets`
- `draft_asset_group_signals`
- `draft_pmax_product_exclusions`
- `update_campaign`
- `draft_ad_group`
- `update_ad_group`
- `draft_responsive_search_ad`
- `draft_callouts`
- `draft_structured_snippets`
- `draft_business_name_asset`
- `link_asset_to_customer`
- `add_ad_schedule`
- `draft_price_asset`
- `draft_image_assets`
- `draft_keywords`
- `add_negative_keywords`
- `add_negative_locations`
- `draft_key_event`
- `draft_delete_key_event`
- `draft_demographic_targeting`
- `draft_audience_attachment`
- `propose_negative_keyword_list`
- `propose_brand_list`
- `add_to_brand_list`
- `remove_from_brand_list`
- `attach_brand_list_to_campaigns`
- `detach_brand_list_from_campaigns`
- `draft_ai_max_settings`
- `draft_prepare_brand_exclusions`
- `draft_custom_conversion_goal`
- `draft_update_custom_conversion_goal`
- `draft_assign_custom_conversion_goal`
- `draft_clear_custom_conversion_goal`
- `draft_dismiss_recommendations`
- `draft_recommendation_subscriptions`
- `pause_entity`
- `enable_entity`
- `remove_entity`
- `confirm_and_apply`

## FAQ

### What can I do with the AdLoop MCP server?

It gives an AI assistant read and write access to Google Ads, Reddit Ads and GA4, including campaign performance, search terms, audiences and reports.

### Are changes applied without my approval?

No. Every change is previewed first, and only your click on Apply changes the account; the AI cannot press it.

### Do new campaigns start paused?

Yes, new ads and campaigns are created paused so they cannot spend until you enable them.

### How do I install AdLoop?

Install it from PyPI with pip install adloop, or clone the repository and run adloop init with uv.

### Does AdLoop work with GA4 and Tag Manager?

Yes, it reads GA4 reports, key events and tracking events, and audits your live Google Tag Manager container against your codebase.
