Install
openclaw skills install @jeannen/google-ads-mcpCreate, edit, and report on Google Ads from an AI agent through the AdKit MCP connector: Search and Performance Max campaigns, ad groups, ads, keywords, negative keywords, keyword research, search terms, and results. Every change is saved as a draft that the user approves before it goes live. Use when the user wants to run, change, or check Google Ads. Not for Google Ads strategy: use google-ads-strategy for that.
openclaw skills install @jeannen/google-ads-mcpThis skill tells you how to create, edit, and report on Google Ads through AdKit. It covers the steps. For what to build (keywords, structure, ad copy), read the google-ads-strategy skill.
AdKit is one MCP connector for Meta, Google, TikTok, LinkedIn, Microsoft, Reddit, X, and Pinterest ads.
https://mcp.adkit.so, then sign in.claude mcp add --transport http adkit https://mcp.adkit.soFor other AI apps, see how to set up the AdKit MCP server for Google Ads. If the AdKit tools are not available, tell the user how to connect. Then stop.
| Entity | Actions |
|---|---|
campaigns | list, get, create, update, delete (Search, Display, Demand Gen, Performance Max) |
ad-groups | list, get, create, update, delete |
ads | list, get, create, update, delete |
keywords | list, get, create, update, delete, list-negatives, add-negative, remove-negative |
negative-list | create, list, get, delete, attach, detach (shared negative keyword lists) |
assets | list, get, create, update, attach, detach (sitelinks, callouts, snippets, calls) |
asset-groups | list, get, create, update, delete (Performance Max) |
media | upload (images, and existing YouTube videos) |
research | keywords (Keyword Planner ideas), topics, interests |
geo-locations | search (find location IDs by name) |
conversions | list, get, create, update, delete, upload |
change-history | list (who changed what in the last 30 days) |
results | list, search-terms, placements, keywords |
accounts | list, available, connect, disconnect |
drafts | get, publish (review your changes, then send them) |
All calls go through adkit_manage with platform: "google". Before a call you have not made in this session, read its fields with adkit_help({ path: "manage google <entity> <action>" }). Do not guess field names. In this skill, campaigns create means entity: "campaigns", action: "create".
Project: call adkit_projects and get the projectId. Every call needs it.
Account: call adkit_status. If no Google Ads account is connected, call adkit_setup with platform: "google" and give the user the link. After they sign in, use accounts available, then accounts connect.
Build from the top down. Each create saves a draft. For each level, do these steps before you start the next level:
drafts get, or the link https://app.adkit.so/manage/drafts?open=<draftId>).drafts publish.The levels, in order, for a Search campaign:
research keywords for ideas. Choose keywords and match types with the user.campaigns create with campaignType: "search", a budget, a bid strategy, locations (geo-locations search finds cities and regions by name), and status: "paused". A paused campaign spends nothing.ad-groups create with the campaignId.keywords create and ads create (responsive search ad) with the adGroupId.keywords add-negative, then sitelinks and callouts with assets create and assets attach.Go live: campaigns update with status: "enabled". Publish that draft only after the user says yes. Then check with ad-groups list and ads list that the ad groups and ads are enabled too.
Results: results list with a level and a period or a date range (from and to). For Search, results search-terms shows what people typed. Use it to suggest new keywords and negatives.
assetGroups. It has asset groups instead of ad groups and ads. Upload the images first.responsive_display ad. A targeting update replaces the whole list, so send every item that should stay.media upload. AdKit cannot upload a video file to YouTube.managerId.adGroupId.conversions upload (offline imports) runs immediately and saves no draft. First run it with validateOnly: true. Then ask the user. Run the real upload only after they say yes.change-history so you do not create the same thing twice.results.For a Google Ads feature that AdKit does not cover (for example dynamic search ad targets or page feeds), use entity: "platform-api-request" with action: "mutate". The action is always mutate, also for reads. AdKit sends the request to the Google Ads API as it is. The user must turn on Advanced Platform Access in AdKit's Agent Permissions.
adkit_feedback.{
"projectId": "<projectId>",
"entity": "platform-api-request",
"action": "mutate",
"data": {
"platform": "google",
"accountId": "<customerId>",
"endpoint": "customers/<customerId>/googleAds:mutate",
"payload": {
"mutateOperations": [
{
"adGroupAdOperation": {
"update": {
"resource_name": "customers/<customerId>/adGroupAds/<adGroupId>~<adId>",
"status": "PAUSED"
},
"update_mask": "status"
}
}
]
},
"description": "Pause one ad"
}
}
The same AdKit connector runs Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads, Reddit Ads, X Ads, and Pinterest Ads ads. Each platform has its own skill in this repo, for example meta-ads and microsoft-ads.