Search Console MCP
Search Console, Bing Webmaster Tools, GA4 and AdSense data and SEO analysis in one MCP server
Google Ads, Reddit Ads, GA4, Tag Manager and Search Console reports and edits from an AI client
By Daniel Klose (individual) Python Remote (hosted) · Streamable HTTPLocal · stdio CRM and salesData and analytics
59 popularity score ★ 296 ↓ 2.5k/mo
Opens the app, which asks before it adds the server.
claude mcp add --transport http adloop https://mcp.getadloop.com/mcp{
"mcpServers": {
"adloop": {
"url": "https://mcp.getadloop.com/mcp"
}
}
}{
"servers": {
"adloop": {
"type": "http",
"url": "https://mcp.getadloop.com/mcp"
}
}
}codex mcp add adloop --url https://mcp.getadloop.com/mcphttps://mcp.getadloop.com/mcphttps://mcp.getadloop.com/mcpOpens the app, which asks before it adds the server.
pip install adloop
adloop initclaude mcp add adloop -- python -m adloop{
"mcpServers": {
"adloop": {
"command": "python",
"args": [
"-m",
"adloop"
]
}
}
}{
"mcpServers": {
"adloop": {
"command": "python",
"args": [
"-m",
"adloop"
]
}
}
}{
"servers": {
"adloop": {
"type": "stdio",
"command": "python",
"args": [
"-m",
"adloop"
]
}
}
}[mcp_servers.adloop]
command = "python"
args = ["-m", "adloop"]gemini mcp add --scope user adloop python -- -m adloopOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/kLOsk/adloop.git
cd adloop
uv sync
uv run adloop initclaude mcp add adloop -- '<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python' -m adloop{
"mcpServers": {
"adloop": {
"command": "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python",
"args": [
"-m",
"adloop"
]
}
}
}{
"mcpServers": {
"adloop": {
"command": "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python",
"args": [
"-m",
"adloop"
]
}
}
}{
"servers": {
"adloop": {
"type": "stdio",
"command": "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python",
"args": [
"-m",
"adloop"
]
}
}
}[mcp_servers.adloop]
command = "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python"
args = ["-m", "adloop"]gemini mcp add --scope user adloop '<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python' -- -m adloopADLOOP_TOOLSETS |
Optional: Comma-separated toolsets to expose: ads, ads:read, ads:write, ads:plan, ga4, tracking, gtm, gsc, web, merchant, reddit. Unset exposes the full catalog. |
|---|---|
ADLOOP_CONFIG |
Optional: Path to the config file holding accounts and safety settings. |
AdLoop connects an AI client to the accounts a paid-ads marketer works in every day. It reads Google Ads, GA4, Tag Manager, Search Console, Merchant Center and PageSpeed Insights, and it can also manage Reddit Ads. The useful part is the joins. You can line up Ads clicks with GA4 sessions and conversions per campaign, find landing pages that take paid traffic but never convert, or compare the event names in your site's code with your GTM tags and with what GA4 actually receives. EU consent gaps are allowed for, so the usual shortfall from people rejecting cookies does not show up as broken tracking.
Edits never happen in one step. A draft tool returns a preview with a plan id, and confirm_and_apply carries it out. That call is a dry run unless dry_run=false is passed, and even then config.py ships with safety.require_dry_run set to true, so a fresh self-hosted install refuses real writes until you turn that off. Other checks in the code: new campaigns are created paused, daily budgets above safety.max_daily_budget (50 by default) are refused, and bid raises are capped at 100 percent by max_bid_increase_pct. Each operation goes to ~/.adloop/audit.log. In clients that render MCP Apps an approval card appears, and the model's own confirm_and_apply(dry_run=false) is turned away so only your click applies the change.
Version 0.37.0 registers 155 tools in server.py. Two of them, approve_change and store_image_upload, are only visible to the approval and upload cards, which leaves 153 for the model. The README's tables group most but not all of them. Recent additions cover more Google Ads asset types: price, promotion, call and business name assets, edits to existing sitelinks, callouts and snippets, ad schedules, and GTM variables.
The same tools run in two places. This MIT package runs on your machine against your own Google Cloud project. AdLoop Cloud at https://mcp.getadloop.com/mcp is the maker's hosted service in Germany, with a free tier and paid plans.
| To run it yourself | Python 3.11+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Google Ads | Ads API access granted to your own Google Cloud project, Explorer level or higher for live accounts |
| Google Cloud | Free tierYour own project with billing set up and an OAuth desktop client or service account key |
| Reddit Ads | Optional. Needs your own Reddit developer app |
| AdLoop Cloud | Free tierOnly for the hosted endpoint. Free plan, paid plans for more volume and accounts |
Self-hosted: save the OAuth client JSON or service account key as ~/.adloop/credentials.json, enable the Analytics Data, Analytics Admin and Google Ads APIs, then run adloop init once to sign in and write ~/.adloop/config.yaml. Since 9 September 2026 a developer token and a Manager Account are no longer needed. Tag Manager, Search Console and Merchant Center tools each need their own API enabled. Hosted: Codex needs codex mcp login adloop after adding the server, and ChatGPT needs a paid plan with developer mode on.
At the Test access level the Google Ads API reaches only test accounts; Explorer allows 2,880 operations a day, Basic 15,000. GTM writes stay off until gtm.write_enabled is set and the account re-consents; Custom HTML tags also need gtm.allow_custom_html. Reddit has no validate-only mode, so a Reddit dry run only re-reads and re-checks caps, and its reporting is limited to 60 requests a minute. Images from upload_images are kept 24 hours, up to 5 MB each. AdLoop Cloud's free plan caps Google and Reddit Ads calls at 100 a day, with one Ads account and one GA4 property. Sign-ins from versions 0.9 and older no longer work; run adloop init again.
For advertisers and agencies who run Google Ads next to GA4 and Tag Manager and want audits, reports and edits from Claude Code, Cursor or a similar client, with a preview before anything changes. Self-host when account data should stay on your machine and you can set up a Google Cloud project with billing. Choose AdLoop Cloud to skip that setup or to work from claude.ai or ChatGPT, which can only reach the hosted endpoint. It is a third-party project, not made by Google or Reddit. For read-only use, set ADLOOP_TOOLSETS to ads:read and ga4 so the write tools never reach the client.
29 only read, 27 change things, 4 can delete or overwrite. A ? marks an optional parameter.
health_checklist_accountslimit?: integerget_campaign_performancecustomer_id?: stringdate_range_start?: stringdate_range_end?: stringcompact?: booleanget_ad_performancecustomer_id?: stringdate_range_start?: stringdate_range_end?: stringcompact?: booleanget_keyword_performancecustomer_id?: stringdate_range_start?: stringdate_range_end?: stringcompact?: booleanget_search_termscustomer_id?: stringdate_range_start?: stringdate_range_end?: stringcompact?: booleanget_recommendationscustomer_id?: stringrecommendation_types?: arraycampaign_id?: stringget_pmax_performancecustomer_id?: stringdate_range_start?: stringdate_range_end?: stringget_change_historycustomer_id?: stringdate_range_start?: stringdate_range_end?: stringcampaign_id?: stringresource_types?: arraylimit?: integerrun_gaqlquery: stringcustomer_id?: stringformat?: stringrun_ga4_reportdimensions?: arraymetrics?: arraydate_range_start?: stringdate_range_end?: stringproperty_id?: stringlimit?: integerdimension_filter?: arraymetric_filter?: arrayorder_by?: arrayoffset?: integercompare_start?: stringcompare_end?: stringrun_realtime_reportdimensions?: arraymetrics?: arrayproperty_id?: stringget_tracking_eventsdate_range_start?: stringdate_range_end?: stringproperty_id?: stringanalyze_campaign_conversionsdate_range_start?: stringdate_range_end?: stringcustomer_id?: stringproperty_id?: stringcampaign_name?: stringlanding_page_analysisdate_range_start?: stringdate_range_end?: stringcustomer_id?: stringproperty_id?: stringattribution_checkdate_range_start?: stringdate_range_end?: stringcustomer_id?: stringproperty_id?: stringconversion_events?: arrayvalidate_trackingexpected_events: arrayproperty_id?: stringdate_range_start?: stringdate_range_end?: stringaudit_event_coverageexpected_events: arraygtm_account_id?: stringgtm_container_id?: stringproperty_id?: stringdate_range_start?: stringdate_range_end?: stringgenerate_tracking_codeevent_name: stringevent_params?: objecttrigger?: stringproperty_id?: stringcheck_existing?: booleanlist_gtm_tagsgtm_account_id?: stringgtm_container_id?: stringworkspace_id?: stringget_gtm_workspace_diffworkspace_id: stringgtm_account_id?: stringgtm_container_id?: stringdraft_gtm_tag changesname?: stringtag_type?: stringparameters?: arrayfiring_trigger_ids?: arrayblocking_trigger_ids?: arraypaused?: booleannotes?: stringtag_id?: stringworkspace_id?: stringgtm_account_id?: stringgtm_container_id?: stringdraft_gtm_variable changesname?: stringvariable_type?: stringdata_layer_key?: stringdefault_value?: stringparameters?: arraynotes?: stringvariable_id?: stringworkspace_id?: stringgtm_account_id?: stringgtm_container_id?: stringdraft_publish_gtm_workspace deletesversion_name?: stringversion_notes?: stringworkspace_id?: stringgtm_account_id?: stringgtm_container_id?: stringrun_gsc_reportsite_url?: stringdimensions?: arraydate_range_start?: stringdate_range_end?: stringlimit?: integersearch_type?: stringdimension_filter_groups?: arraydata_state?: stringaggregation_type?: stringstart_row?: integeranalyze_page_speedurl: stringstrategy?: stringget_merchant_feed_healthaccount_id?: stringdiscover_keywordsseed_keywords?: arrayurl?: stringgeo_target_id?: stringlanguage_id?: stringpage_size?: integercustomer_id?: stringinclude_monthly_volumes?: booleanestimate_budgetkeywords: arraydaily_budget?: numbergeo_target_id?: stringlanguage_id?: stringforecast_days?: integercustomer_id?: stringdraft_campaign changescampaign_name: stringdaily_budget: numberbidding_strategy: stringgeo_target_ids: arraylanguage_ids: arraycustomer_id?: stringtarget_cpa?: numbertarget_roas?: numberchannel_type?: stringad_group_name?: stringkeywords?: arraysearch_partners_enabled?: booleandisplay_network_enabled?: booleandisplay_expansion_enabled?: booleanmax_cpc?: numberlocation_option?: stringnegative_location_option?: stringtracking_url_template?: stringfinal_url_suffix?: stringurl_custom_parameters?: arraydraft_shopping_campaign changescampaign_name: stringdaily_budget: numbermerchant_id: stringproduct_bid: numbergeo_target_ids: arraybidding_strategy?: stringtarget_roas?: numbermax_cpc?: numbercampaign_priority?: stringfeed_label?: stringad_group_name?: stringsearch_partners_enabled?: booleancustomer_id?: stringupdate_campaign changescampaign_id: stringcustomer_id?: stringbidding_strategy?: stringtarget_cpa?: numbertarget_roas?: numberdaily_budget?: numbergeo_target_ids?: arraylanguage_ids?: arraysearch_partners_enabled?: booleandisplay_network_enabled?: booleandisplay_expansion_enabled?: booleanmax_cpc?: numberlocation_option?: stringnegative_location_option?: stringtracking_url_template?: stringfinal_url_suffix?: stringurl_custom_parameters?: arraydraft_responsive_search_ad changesad_group_id: stringheadlines: arraydescriptions: arrayfinal_url: stringcustomer_id?: stringpath1?: stringpath2?: stringdraft_keywords changesad_group_id: stringkeywords: arraycustomer_id?: stringadd_negative_keywords changescampaign_id: stringkeywords: arraycustomer_id?: stringmatch_type?: stringdraft_sitelinks changescampaign_id: stringsitelinks: arraycustomer_id?: stringupdate_sitelink changesasset_id: stringlink_text?: stringfinal_url?: stringdescription1?: stringdescription2?: stringcustomer_id?: stringdraft_callouts changescallouts: arraycampaign_id?: stringad_group_id?: stringscope?: stringcustomer_id?: stringupdate_callout changesasset_id: stringcallout_text: stringcustomer_id?: stringdraft_structured_snippets changessnippets: arraycampaign_id?: stringad_group_id?: stringscope?: stringcustomer_id?: stringupdate_structured_snippet changesasset_id: stringvalues: arrayheader?: stringcustomer_id?: stringdraft_call_asset changesphone_number: stringcountry_code: stringcampaign_id?: stringad_group_id?: stringscope?: stringcall_conversion_action_id?: stringad_schedule?: arraycustomer_id?: stringupdate_call_asset changesasset_id: stringphone_number?: stringcountry_code?: stringcall_conversion_action_id?: stringcall_conversion_reporting_state?: stringad_schedule?: arrayclear_ad_schedule?: booleancustomer_id?: stringdraft_promotion changespromotion_target: stringfinal_url: stringlanguage_code: stringmoney_off?: numberpercent_off?: numbercampaign_id?: stringad_group_id?: stringscope?: stringcurrency_code?: stringpromotion_code?: stringorders_over_amount?: numberoccasion?: stringdiscount_modifier?: stringstart_date?: stringend_date?: stringredemption_start_date?: stringredemption_end_date?: stringad_schedule?: arraycustomer_id?: stringupdate_promotion changesasset_id: stringpromotion_target?: stringfinal_url?: stringmoney_off?: numberpercent_off?: numbercurrency_code?: stringpromotion_code?: stringorders_over_amount?: numberoccasion?: stringdiscount_modifier?: stringlanguage_code?: stringstart_date?: stringend_date?: stringredemption_start_date?: stringredemption_end_date?: stringclear_fields?: arrayad_schedule?: arraycustomer_id?: stringdraft_price_asset changesofferings: arrayprice_type: stringlanguage_code: stringcampaign_id?: stringad_group_id?: stringscope?: stringprice_qualifier?: stringcurrency_code?: stringcustomer_id?: stringdraft_business_name_asset changesbusiness_name: stringcampaign_id?: stringscope?: stringcustomer_id?: stringlink_asset_to_customer changeslinks: arraycustomer_id?: stringadd_ad_schedule changescampaign_id: stringschedule: arraycustomer_id?: stringdraft_key_event changesevent_name: stringcounting_method?: stringproperty_id?: stringpause_entity changesentity_type: stringentity_id: stringcustomer_id?: stringremove_entity deletesentity_type: stringentity_id: stringcustomer_id?: stringconfirm_and_apply deletesplan_id: stringdry_run?: booleanupload_imageslist_reddit_accountsget_reddit_performancead_account_id?: stringlevel?: stringdate_range_start?: stringdate_range_end?: stringbreakdown?: stringcompact?: booleandraft_reddit_campaign changescampaign_name: stringobjective: stringfunding_instrument_id: stringad_account_id?: stringcampaign_budget_optimization?: booleandaily_budget?: numberlifetime_budget?: numberbid_strategy?: stringbid_type?: stringbid_value?: numberoptimization_goal?: stringconversion_pixel_id?: stringspend_cap?: numberstart_time?: stringend_time?: stringschedule?: arrayview_through_conversion_type?: stringdraft_reddit_ad changesad_group_id: stringprofile_id?: stringheadline?: stringclick_url?: stringad_account_id?: stringad_name?: stringpost_type?: stringbody?: stringimage_url?: stringcall_to_action?: stringdisplay_url?: stringallow_comments?: booleanpost_id?: stringvideo_url?: stringthumbnail_url?: stringcarousel_cards?: arrayupdate_reddit_campaign changescampaign_id: stringad_account_id?: stringname?: stringdaily_budget?: numberlifetime_budget?: numberspend_cap?: numberbid_strategy?: stringbid_type?: stringbid_value?: numberstart_time?: stringend_time?: stringschedule?: arrayremove_reddit_entity deletesentity_type: stringentity_id: stringad_account_id?: string