[{"data":1,"prerenderedAt":1814},["ShallowReactive",2],{"\u002Fresources\u002Fgoogle-ads-mcp-setup":3,"mdc--krvxex-key":1747,"mdc--90f5mf-key":1758,"mdc--v0ml6r-key":1766,"mdc--z81ts3-key":1774,"mdc--v8g2j-key":1782,"mdc--ixsdko-key":1790,"mdc-q09qks-key":1798,"mdc--o64dut-key":1806},{"doc":4,"parent":1702},{"id":5,"title":6,"body":7,"breadcrumbLabel":1702,"category":1703,"cover":1704,"createdAt":1705,"description":1706,"extension":1707,"faqs":1708,"meta":1733,"navigation":1734,"noAiBadge":1704,"og":1704,"ogDescription":1735,"ogIcon":1702,"path":1736,"seo":1737,"slug":1738,"stem":1738,"tags":1739,"updatedAt":1702,"wip":1704,"__hash__":1746},"resources\u002Fresources\u002Fgoogle-ads-mcp-setup.md","How to Set Up the Google Ads MCP (Claude Code, Cursor & Gemini)",{"type":8,"value":9,"toc":1687},"minimark",[10,25,28,37,42,45,75,79,89,96,103,127,138,141,145,154,160,163,175,181,184,188,191,208,214,231,237,250,256,259,263,277,280,333,340,377,388,395,401,411,414,418,425,468,471,474,499,502,1250,1256,1266,1269,1273,1276,1290,1296,1299,1310,1317,1321,1335,1338,1358,1361,1387,1390,1394,1397,1400,1403,1408,1435,1500,1503,1507,1539,1557,1569,1583,1591,1615,1619,1627,1634,1647,1652,1683],[11,12,13],"blockquote",{},[14,15,16,20,21,24],"p",{},[17,18,19],"strong",{},"TL;DR:"," Google's official Google Ads MCP is free and ",[17,22,23],{},"read-only",": your AI can pull reports from Google Ads but can't change a thing. Setup runs on your own computer and takes 30 to 45 minutes. It works in Claude Code, Cursor, Gemini, and VS Code, not on claude.ai or ChatGPT web.",[14,26,27],{},"Fair warning: this is more involved than most MCP setups. You'll build your own Google sign-in, request a developer token, and run a terminal command, all so your AI can read your campaigns without being able to change them.",[14,29,30,31,36],{},"There's a shortcut. A hosted version like ",[32,33,35],"a",{"href":34},"\u002Ffeatures\u002Fads-mcp\u002Fgoogle","AdKit"," (the one we make) connects in about three clicks with no technical setup, and it can safely make changes too, only with your approval. Otherwise, here's the full walkthrough.",[38,39,41],"h2",{"id":40},"what-youll-need","What you'll need",[14,43,44],{},"The official Google Ads MCP is a bit technical, but I'll walk you through all of it. This guide handles the Google login, the Google Cloud project, and the access token as you go. To actually start, you only need three things:",[46,47,48,56,68],"ul",{},[49,50,51,52,55],"li",{},"A ",[17,53,54],{},"Google Ads account"," with the campaigns you want to read (thanks captain obvious!)",[49,57,58,59,62,63,67],{},"One ",[17,60,61],{},"AI tool that runs on your computer",": Claude Code, Cursor, Gemini, or VS Code. Web agents like Claude and ChatGPT can't use the official Google Ads MCP, because it runs locally on your machine instead of in a browser. See ",[32,64,66],{"href":65},"#what-it-can-and-cannot-do","what it can and cannot do"," for more.",[49,69,70,71,74],{},"About ",[17,72,73],{},"30 to 45 minutes",".",[38,76,78],{"id":77},"_1-get-a-developer-token","1. Get a developer token",[14,80,81,82,88],{},"Your developer token is the key that lets the API talk to Google Ads, and it only lives on a manager account. Sign in to Google Ads, then open the ",[32,83,87],{"href":84,"rel":85},"https:\u002F\u002Fads.google.com\u002Faw\u002Fapicenter",[86],"nofollow","API Center",". If you don't have a manager account yet, create one first; it's free and takes a minute. (Not sure whether you have one? See the FAQ at the end.)",[14,90,91],{},[92,93],"img",{"alt":94,"src":95},"Google Ads API Center showing the developer token and its access level","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Fapi-center-token.png",[14,97,98,99,102],{},"In the API Center, complete the API access form, accept the terms, and note your token's ",[17,100,101],{},"access level",". That one field decides whether this works:",[46,104,105,111,117],{},[49,106,107,110],{},[17,108,109],{},"Test access"," reads test accounts only. It can't touch your real campaigns, so it's the one level that won't work here.",[49,112,113,116],{},[17,114,115],{},"Explorer access"," reads your real accounts, with a daily limit well beyond what reporting needs. Google's automatic review grants this to most people the moment they submit the access form.",[49,118,119,122,123,126],{},[17,120,121],{},"Basic"," or ",[17,124,125],{},"Standard access"," also read real accounts, with higher limits.",[14,128,129,130,133,134,137],{},"When you submit that access form, Google reviews it automatically and usually grants ",[17,131,132],{},"Explorer"," access on the spot, which is all you need here. You only hit a wall if that automatic review can't clear you and your token lands on ",[17,135,136],{},"Test"," access instead. If that happens, apply for Basic access in the API Center and wait; Google targets a couple of business days, but the queue can run longer. Once your token shows Explorer, Basic, or Standard, you're clear to continue.",[14,139,140],{},"You now have a token. Next it needs an API to call.",[38,142,144],{"id":143},"_2-create-a-cloud-project","2. Create a Cloud project",[14,146,147,148,153],{},"The MCP talks to Google Ads through the Google Ads API, which lives in a Google Cloud project. Open the ",[32,149,152],{"href":150,"rel":151},"https:\u002F\u002Fconsole.cloud.google.com",[86],"Google Cloud console",", create a new project (or pick one), and note the project ID.",[14,155,156],{},[92,157],{"alt":158,"src":159},"Google Cloud New Project page showing the project name and project ID","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Fgcp-project-created.png",[14,161,162],{},"One rule from Google's setup docs: a project can use only one developer token, so don't reuse a project that was tied to a different token before. A fresh project is the safe choice.",[14,164,165,166,171,172,74],{},"Now enable the API. Go to the ",[32,167,170],{"href":168,"rel":169},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fgoogleads.googleapis.com",[86],"Google Ads API library page"," and click ",[17,173,174],{},"Enable",[14,176,177],{},[92,178],{"alt":179,"src":180},"Google Ads API library page with the Enable button","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Fenable-google-ads-api.png",[14,182,183],{},"The API is live. Now you need a way to prove you're allowed to use it, which means an OAuth client.",[38,185,187],{"id":186},"_3-build-the-oauth-client","3. Build the OAuth client",[14,189,190],{},"You need your own OAuth client because gcloud's built-in one is now blocked for the Google Ads scope. This is three small parts: the consent screen, the test users, and the client itself. Skipping the test-user part is the single most common cause of a failed first login, so don't.",[14,192,193,194,199,200,203,204,207],{},"First, the consent screen. Open the ",[32,195,198],{"href":196,"rel":197},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fbranding",[86],"Cloud console branding page",", fill in an app name and your email, and set the user type to ",[17,201,202],{},"External"," with publishing status ",[17,205,206],{},"Testing",". Testing is fine; you don't need Google to verify the app for your own use.",[14,209,210],{},[92,211],{"alt":212,"src":213},"Google Cloud OAuth branding page showing app name, support email, and Testing status","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Foauth-consent-branding.png",[14,215,216,217,222,223,226,227,74],{},"Now the part everyone forgets. Go to the ",[32,218,221],{"href":219,"rel":220},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Faudience",[86],"Audience page"," and add ",[17,224,225],{},"test users",". Add two emails: the Google account you're authenticating with, and your Google Ads login email. If those aren't both on the list, your login fails with ",[228,229,230],"code",{},"Error 403: access_denied, app is being tested",[14,232,233],{},[92,234],{"alt":235,"src":236},"Google Cloud Audience page showing the test users list with two emails added","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Ftest-users-list.png",[14,238,239,240,245,246,249],{},"Finally, create the client. Go to the ",[32,241,244],{"href":242,"rel":243},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fclients",[86],"Clients page",", create an OAuth client, choose application type ",[17,247,248],{},"Desktop app",", and download the JSON. Save it somewhere you'll remember; you'll point at it in the next step.",[14,251,252],{},[92,253],{"alt":254,"src":255},"Creating a Desktop app OAuth client and downloading the client secret JSON","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Fdesktop-oauth-client.png",[14,257,258],{},"You have a client and a JSON file. Now you use it to authenticate.",[38,260,262],{"id":261},"_4-authenticate-with-gcloud","4. Authenticate with gcloud",[14,264,265,266,269,270,273,274,276],{},"This step generates the credentials the MCP will read, using your own OAuth client. From here on you'll use your computer's ",[17,267,268],{},"terminal",". To open it: on Mac, press Cmd+Space, type \"terminal,\" and press Enter; on Windows, open the Start menu, type \"powershell,\" and press Enter. One Windows note for the rest of the guide: commands that break across lines with ",[228,271,272],{},"\\"," need to go on a single line, because PowerShell doesn't read ",[228,275,272],{}," that way.",[14,278,279],{},"If you don't already have the gcloud CLI, install it first:",[281,282,283,317],"os-tabs",{},[284,285,287,290],"template",{"v-slot:mac":286},"",[14,288,289],{},"Paste this into Terminal. It uses Homebrew; if you don't have it, install Homebrew from brew.sh first.",[291,292,296],"pre",{"className":293,"code":294,"language":295,"meta":286,"style":286},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","brew install --cask google-cloud-sdk\n","bash",[228,297,298],{"__ignoreMap":286},[299,300,303,307,311,314],"span",{"class":301,"line":302},"line",1,[299,304,306],{"class":305},"sBMFI","brew",[299,308,310],{"class":309},"sfazB"," install",[299,312,313],{"class":309}," --cask",[299,315,316],{"class":309}," google-cloud-sdk\n",[284,318,319,322],{"v-slot:windows":286},[14,320,321],{},"Paste this into PowerShell to download and run Google's installer.",[291,323,327],{"className":324,"code":325,"language":326,"meta":286,"style":286},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","(New-Object Net.WebClient).DownloadFile(\"https:\u002F\u002Fdl.google.com\u002Fdl\u002Fcloudsdk\u002Fchannels\u002Frapid\u002FGoogleCloudSDKInstaller.exe\", \"$env:Temp\\GoogleCloudSDKInstaller.exe\") & $env:Temp\\GoogleCloudSDKInstaller.exe\n","powershell",[228,328,329],{"__ignoreMap":286},[299,330,331],{"class":301,"line":302},[299,332,325],{},[14,334,335,336,339],{},"Then run the command below, pointing ",[228,337,338],{},"--client-id-file"," at the JSON you downloaded in step 3:",[291,341,343],{"className":293,"code":342,"language":295,"meta":286,"style":286},"gcloud auth application-default login \\\n  --client-id-file=\u002Fpath\u002Fto\u002Fclient_secret.json \\\n  --scopes=https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fadwords,https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fcloud-platform\n",[228,344,345,363,371],{"__ignoreMap":286},[299,346,347,350,353,356,359],{"class":301,"line":302},[299,348,349],{"class":305},"gcloud",[299,351,352],{"class":309}," auth",[299,354,355],{"class":309}," application-default",[299,357,358],{"class":309}," login",[299,360,362],{"class":361},"sTEyZ"," \\\n",[299,364,366,369],{"class":301,"line":365},2,[299,367,368],{"class":309},"  --client-id-file=\u002Fpath\u002Fto\u002Fclient_secret.json",[299,370,362],{"class":361},[299,372,374],{"class":301,"line":373},3,[299,375,376],{"class":309},"  --scopes=https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fadwords,https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fcloud-platform\n",[14,378,379,380,383,384,387],{},"Two things to change before you run it. Replace ",[228,381,382],{},"\u002Fpath\u002Fto\u002Fclient_secret.json"," with the real location of the OAuth client file you downloaded in step 3. Leave the ",[228,385,386],{},"--scopes"," line exactly as written; those two long entries are the permissions the server needs, one for Google Ads and one for your Google Cloud project.",[14,389,390,391,394],{},"Your browser opens and shows a warning: \"Google hasn't verified this app.\" That's expected, because it's your own test app. Click ",[17,392,393],{},"Continue"," (you're the developer it's asking you to trust), then allow the permissions on the next screen.",[14,396,397],{},[92,398],{"alt":399,"src":400},"Browser warning that Google hasn't verified this app, with the Advanced link","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002Funverified-app-warning.png",[14,402,403,404,407,408,74],{},"When it finishes, gcloud prints a line like ",[228,405,406],{},"Credentials saved to file: [PATH]",". Copy that path. The MCP config reads it as ",[228,409,410],{},"GOOGLE_APPLICATION_CREDENTIALS",[14,412,413],{},"Credentials are saved. The last step is connecting your AI client.",[38,415,417],{"id":416},"_5-install-and-connect-the-mcp-server","5. Install and connect the MCP server",[14,419,420,421,424],{},"The Google Ads MCP isn't a website you log into. It's a small program that runs on your own computer, and your AI tool starts it up when it needs it. To run it, you first install a little helper called ",[17,422,423],{},"pipx"," (it installs and runs tools like this one).",[281,426,427,454],{},[284,428,429,431],{"v-slot:mac":286},[14,430,289],{},[291,432,434],{"className":293,"code":433,"language":295,"meta":286,"style":286},"brew install pipx && pipx ensurepath\n",[228,435,436],{"__ignoreMap":286},[299,437,438,440,442,445,449,451],{"class":301,"line":302},[299,439,306],{"class":305},[299,441,310],{"class":309},[299,443,444],{"class":309}," pipx",[299,446,448],{"class":447},"sMK4o"," &&",[299,450,444],{"class":305},[299,452,453],{"class":309}," ensurepath\n",[284,455,456,459],{"v-slot:windows":286},[14,457,458],{},"pipx needs Python. If you don't have it, install Python from python.org (tick \"Add to PATH\" during setup), then paste this into PowerShell:",[291,460,462],{"className":324,"code":461,"language":326,"meta":286,"style":286},"py -m pip install --user pipx && py -m pipx ensurepath\n",[228,463,464],{"__ignoreMap":286},[299,465,466],{"class":301,"line":302},[299,467,461],{},[14,469,470],{},"Either way, close and reopen your terminal afterward so the change takes effect.",[14,472,473],{},"Now you point your AI tool at the server. The block below has four CAPITALIZED slots to fill in. They look cryptic, but each one is just something you already collected:",[46,475,476,481,487,493],{},[49,477,478,480],{},[228,479,410],{}," is the path to the credentials file from step 4.",[49,482,483,486],{},[228,484,485],{},"GOOGLE_PROJECT_ID"," is your Cloud project ID from step 2.",[49,488,489,492],{},[228,490,491],{},"GOOGLE_ADS_DEVELOPER_TOKEN"," is your developer token from step 1.",[49,494,495,498],{},[228,496,497],{},"GOOGLE_ADS_LOGIN_CUSTOMER_ID"," is your manager account ID, digits only.",[14,500,501],{},"Pick your tool, swap those four values into the example, and paste it in:",[503,504,506,598,842,1048],"agent-tabs",{"default":505},"claude",[284,507,508,515],{"v-slot:claude":286},[14,509,510,511,514],{},"Run this in your terminal. Swap in your real values, and use ",[17,512,513],{},"digits only"," for the manager ID (no dashes):",[291,516,518],{"className":293,"code":517,"language":295,"meta":286,"style":286},"claude mcp add google-ads \\\n  --env GOOGLE_APPLICATION_CREDENTIALS=\u002Fpath\u002Fto\u002Fapplication_default_credentials.json \\\n  --env GOOGLE_PROJECT_ID=your-project-id \\\n  --env GOOGLE_ADS_DEVELOPER_TOKEN=your-developer-token \\\n  --env GOOGLE_ADS_LOGIN_CUSTOMER_ID=1234567890 \\\n  -- pipx run --spec git+https:\u002F\u002Fgithub.com\u002Fgoogleads\u002Fgoogle-ads-mcp.git google-ads-mcp\n",[228,519,520,535,545,554,564,578],{"__ignoreMap":286},[299,521,522,524,527,530,533],{"class":301,"line":302},[299,523,505],{"class":305},[299,525,526],{"class":309}," mcp",[299,528,529],{"class":309}," add",[299,531,532],{"class":309}," google-ads",[299,534,362],{"class":361},[299,536,537,540,543],{"class":301,"line":365},[299,538,539],{"class":309},"  --env",[299,541,542],{"class":309}," GOOGLE_APPLICATION_CREDENTIALS=\u002Fpath\u002Fto\u002Fapplication_default_credentials.json",[299,544,362],{"class":361},[299,546,547,549,552],{"class":301,"line":373},[299,548,539],{"class":309},[299,550,551],{"class":309}," GOOGLE_PROJECT_ID=your-project-id",[299,553,362],{"class":361},[299,555,557,559,562],{"class":301,"line":556},4,[299,558,539],{"class":309},[299,560,561],{"class":309}," GOOGLE_ADS_DEVELOPER_TOKEN=your-developer-token",[299,563,362],{"class":361},[299,565,567,569,572,576],{"class":301,"line":566},5,[299,568,539],{"class":309},[299,570,571],{"class":309}," GOOGLE_ADS_LOGIN_CUSTOMER_ID=",[299,573,575],{"class":574},"sbssI","1234567890",[299,577,362],{"class":361},[299,579,581,584,586,589,592,595],{"class":301,"line":580},6,[299,582,583],{"class":309},"  --",[299,585,444],{"class":309},[299,587,588],{"class":309}," run",[299,590,591],{"class":309}," --spec",[299,593,594],{"class":309}," git+https:\u002F\u002Fgithub.com\u002Fgoogleads\u002Fgoogle-ads-mcp.git",[299,596,597],{"class":309}," google-ads-mcp\n",[284,599,600,607],{"v-slot:cursor":286},[14,601,602,603,606],{},"Edit ",[228,604,605],{},".cursor\u002Fmcp.json"," in your project (or the global Cursor MCP file) and add:",[291,608,612],{"className":609,"code":610,"language":611,"meta":286,"style":286},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n    \"mcpServers\": {\n        \"google-ads\": {\n            \"command\": \"pipx\",\n            \"args\": [\"run\", \"--spec\", \"git+https:\u002F\u002Fgithub.com\u002Fgoogleads\u002Fgoogle-ads-mcp.git\", \"google-ads-mcp\"],\n            \"env\": {\n                \"GOOGLE_APPLICATION_CREDENTIALS\": \"\u002Fpath\u002Fto\u002Fapplication_default_credentials.json\",\n                \"GOOGLE_PROJECT_ID\": \"your-project-id\",\n                \"GOOGLE_ADS_DEVELOPER_TOKEN\": \"your-developer-token\",\n                \"GOOGLE_ADS_LOGIN_CUSTOMER_ID\": \"1234567890\"\n            }\n        }\n    }\n}\n","json",[228,613,614,619,637,651,673,725,738,760,780,800,818,824,830,836],{"__ignoreMap":286},[299,615,616],{"class":301,"line":302},[299,617,618],{"class":447},"{\n",[299,620,621,624,628,631,634],{"class":301,"line":365},[299,622,623],{"class":447},"    \"",[299,625,627],{"class":626},"spNyl","mcpServers",[299,629,630],{"class":447},"\"",[299,632,633],{"class":447},":",[299,635,636],{"class":447}," {\n",[299,638,639,642,645,647,649],{"class":301,"line":373},[299,640,641],{"class":447},"        \"",[299,643,644],{"class":305},"google-ads",[299,646,630],{"class":447},[299,648,633],{"class":447},[299,650,636],{"class":447},[299,652,653,656,659,661,663,666,668,670],{"class":301,"line":556},[299,654,655],{"class":447},"            \"",[299,657,658],{"class":574},"command",[299,660,630],{"class":447},[299,662,633],{"class":447},[299,664,665],{"class":447}," \"",[299,667,423],{"class":309},[299,669,630],{"class":447},[299,671,672],{"class":447},",\n",[299,674,675,677,680,682,684,687,689,692,694,697,699,702,704,706,708,711,713,715,717,720,722],{"class":301,"line":566},[299,676,655],{"class":447},[299,678,679],{"class":574},"args",[299,681,630],{"class":447},[299,683,633],{"class":447},[299,685,686],{"class":447}," [",[299,688,630],{"class":447},[299,690,691],{"class":309},"run",[299,693,630],{"class":447},[299,695,696],{"class":447},",",[299,698,665],{"class":447},[299,700,701],{"class":309},"--spec",[299,703,630],{"class":447},[299,705,696],{"class":447},[299,707,665],{"class":447},[299,709,710],{"class":309},"git+https:\u002F\u002Fgithub.com\u002Fgoogleads\u002Fgoogle-ads-mcp.git",[299,712,630],{"class":447},[299,714,696],{"class":447},[299,716,665],{"class":447},[299,718,719],{"class":309},"google-ads-mcp",[299,721,630],{"class":447},[299,723,724],{"class":447},"],\n",[299,726,727,729,732,734,736],{"class":301,"line":580},[299,728,655],{"class":447},[299,730,731],{"class":574},"env",[299,733,630],{"class":447},[299,735,633],{"class":447},[299,737,636],{"class":447},[299,739,741,744,747,749,751,753,756,758],{"class":301,"line":740},7,[299,742,743],{"class":447},"                \"",[299,745,410],{"class":746},"swJcz",[299,748,630],{"class":447},[299,750,633],{"class":447},[299,752,665],{"class":447},[299,754,755],{"class":309},"\u002Fpath\u002Fto\u002Fapplication_default_credentials.json",[299,757,630],{"class":447},[299,759,672],{"class":447},[299,761,763,765,767,769,771,773,776,778],{"class":301,"line":762},8,[299,764,743],{"class":447},[299,766,485],{"class":746},[299,768,630],{"class":447},[299,770,633],{"class":447},[299,772,665],{"class":447},[299,774,775],{"class":309},"your-project-id",[299,777,630],{"class":447},[299,779,672],{"class":447},[299,781,783,785,787,789,791,793,796,798],{"class":301,"line":782},9,[299,784,743],{"class":447},[299,786,491],{"class":746},[299,788,630],{"class":447},[299,790,633],{"class":447},[299,792,665],{"class":447},[299,794,795],{"class":309},"your-developer-token",[299,797,630],{"class":447},[299,799,672],{"class":447},[299,801,803,805,807,809,811,813,815],{"class":301,"line":802},10,[299,804,743],{"class":447},[299,806,497],{"class":746},[299,808,630],{"class":447},[299,810,633],{"class":447},[299,812,665],{"class":447},[299,814,575],{"class":309},[299,816,817],{"class":447},"\"\n",[299,819,821],{"class":301,"line":820},11,[299,822,823],{"class":447},"            }\n",[299,825,827],{"class":301,"line":826},12,[299,828,829],{"class":447},"        }\n",[299,831,833],{"class":301,"line":832},13,[299,834,835],{"class":447},"    }\n",[299,837,839],{"class":301,"line":838},14,[299,840,841],{"class":447},"}\n",[284,843,844,856],{"v-slot:gemini":286},[14,845,602,846,849,850,852,853,633],{},[228,847,848],{},"~\u002F.gemini\u002Fsettings.json"," and add the same ",[228,851,627],{}," block. Gemini CLI is the client Google documents first, and you can trigger its auth flow with ",[228,854,855],{},"\u002Fmcp auth google-ads",[291,857,858],{"className":609,"code":610,"language":611,"meta":286,"style":286},[228,859,860,864,876,888,906,950,962,980,998,1016,1032,1036,1040,1044],{"__ignoreMap":286},[299,861,862],{"class":301,"line":302},[299,863,618],{"class":447},[299,865,866,868,870,872,874],{"class":301,"line":365},[299,867,623],{"class":447},[299,869,627],{"class":626},[299,871,630],{"class":447},[299,873,633],{"class":447},[299,875,636],{"class":447},[299,877,878,880,882,884,886],{"class":301,"line":373},[299,879,641],{"class":447},[299,881,644],{"class":305},[299,883,630],{"class":447},[299,885,633],{"class":447},[299,887,636],{"class":447},[299,889,890,892,894,896,898,900,902,904],{"class":301,"line":556},[299,891,655],{"class":447},[299,893,658],{"class":574},[299,895,630],{"class":447},[299,897,633],{"class":447},[299,899,665],{"class":447},[299,901,423],{"class":309},[299,903,630],{"class":447},[299,905,672],{"class":447},[299,907,908,910,912,914,916,918,920,922,924,926,928,930,932,934,936,938,940,942,944,946,948],{"class":301,"line":566},[299,909,655],{"class":447},[299,911,679],{"class":574},[299,913,630],{"class":447},[299,915,633],{"class":447},[299,917,686],{"class":447},[299,919,630],{"class":447},[299,921,691],{"class":309},[299,923,630],{"class":447},[299,925,696],{"class":447},[299,927,665],{"class":447},[299,929,701],{"class":309},[299,931,630],{"class":447},[299,933,696],{"class":447},[299,935,665],{"class":447},[299,937,710],{"class":309},[299,939,630],{"class":447},[299,941,696],{"class":447},[299,943,665],{"class":447},[299,945,719],{"class":309},[299,947,630],{"class":447},[299,949,724],{"class":447},[299,951,952,954,956,958,960],{"class":301,"line":580},[299,953,655],{"class":447},[299,955,731],{"class":574},[299,957,630],{"class":447},[299,959,633],{"class":447},[299,961,636],{"class":447},[299,963,964,966,968,970,972,974,976,978],{"class":301,"line":740},[299,965,743],{"class":447},[299,967,410],{"class":746},[299,969,630],{"class":447},[299,971,633],{"class":447},[299,973,665],{"class":447},[299,975,755],{"class":309},[299,977,630],{"class":447},[299,979,672],{"class":447},[299,981,982,984,986,988,990,992,994,996],{"class":301,"line":762},[299,983,743],{"class":447},[299,985,485],{"class":746},[299,987,630],{"class":447},[299,989,633],{"class":447},[299,991,665],{"class":447},[299,993,775],{"class":309},[299,995,630],{"class":447},[299,997,672],{"class":447},[299,999,1000,1002,1004,1006,1008,1010,1012,1014],{"class":301,"line":782},[299,1001,743],{"class":447},[299,1003,491],{"class":746},[299,1005,630],{"class":447},[299,1007,633],{"class":447},[299,1009,665],{"class":447},[299,1011,795],{"class":309},[299,1013,630],{"class":447},[299,1015,672],{"class":447},[299,1017,1018,1020,1022,1024,1026,1028,1030],{"class":301,"line":802},[299,1019,743],{"class":447},[299,1021,497],{"class":746},[299,1023,630],{"class":447},[299,1025,633],{"class":447},[299,1027,665],{"class":447},[299,1029,575],{"class":309},[299,1031,817],{"class":447},[299,1033,1034],{"class":301,"line":820},[299,1035,823],{"class":447},[299,1037,1038],{"class":301,"line":826},[299,1039,829],{"class":447},[299,1041,1042],{"class":301,"line":832},[299,1043,835],{"class":447},[299,1045,1046],{"class":301,"line":838},[299,1047,841],{"class":447},[284,1049,1050,1056],{"v-slot:vscode":286},[14,1051,602,1052,1055],{},[228,1053,1054],{},".vscode\u002Fmcp.json"," in your project and add:",[291,1057,1059],{"className":609,"code":1058,"language":611,"meta":286,"style":286},"{\n    \"servers\": {\n        \"google-ads\": {\n            \"command\": \"pipx\",\n            \"args\": [\"run\", \"--spec\", \"git+https:\u002F\u002Fgithub.com\u002Fgoogleads\u002Fgoogle-ads-mcp.git\", \"google-ads-mcp\"],\n            \"env\": {\n                \"GOOGLE_APPLICATION_CREDENTIALS\": \"\u002Fpath\u002Fto\u002Fapplication_default_credentials.json\",\n                \"GOOGLE_PROJECT_ID\": \"your-project-id\",\n                \"GOOGLE_ADS_DEVELOPER_TOKEN\": \"your-developer-token\",\n                \"GOOGLE_ADS_LOGIN_CUSTOMER_ID\": \"1234567890\"\n            }\n        }\n    }\n}\n",[228,1060,1061,1065,1078,1090,1108,1152,1164,1182,1200,1218,1234,1238,1242,1246],{"__ignoreMap":286},[299,1062,1063],{"class":301,"line":302},[299,1064,618],{"class":447},[299,1066,1067,1069,1072,1074,1076],{"class":301,"line":365},[299,1068,623],{"class":447},[299,1070,1071],{"class":626},"servers",[299,1073,630],{"class":447},[299,1075,633],{"class":447},[299,1077,636],{"class":447},[299,1079,1080,1082,1084,1086,1088],{"class":301,"line":373},[299,1081,641],{"class":447},[299,1083,644],{"class":305},[299,1085,630],{"class":447},[299,1087,633],{"class":447},[299,1089,636],{"class":447},[299,1091,1092,1094,1096,1098,1100,1102,1104,1106],{"class":301,"line":556},[299,1093,655],{"class":447},[299,1095,658],{"class":574},[299,1097,630],{"class":447},[299,1099,633],{"class":447},[299,1101,665],{"class":447},[299,1103,423],{"class":309},[299,1105,630],{"class":447},[299,1107,672],{"class":447},[299,1109,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150],{"class":301,"line":566},[299,1111,655],{"class":447},[299,1113,679],{"class":574},[299,1115,630],{"class":447},[299,1117,633],{"class":447},[299,1119,686],{"class":447},[299,1121,630],{"class":447},[299,1123,691],{"class":309},[299,1125,630],{"class":447},[299,1127,696],{"class":447},[299,1129,665],{"class":447},[299,1131,701],{"class":309},[299,1133,630],{"class":447},[299,1135,696],{"class":447},[299,1137,665],{"class":447},[299,1139,710],{"class":309},[299,1141,630],{"class":447},[299,1143,696],{"class":447},[299,1145,665],{"class":447},[299,1147,719],{"class":309},[299,1149,630],{"class":447},[299,1151,724],{"class":447},[299,1153,1154,1156,1158,1160,1162],{"class":301,"line":580},[299,1155,655],{"class":447},[299,1157,731],{"class":574},[299,1159,630],{"class":447},[299,1161,633],{"class":447},[299,1163,636],{"class":447},[299,1165,1166,1168,1170,1172,1174,1176,1178,1180],{"class":301,"line":740},[299,1167,743],{"class":447},[299,1169,410],{"class":746},[299,1171,630],{"class":447},[299,1173,633],{"class":447},[299,1175,665],{"class":447},[299,1177,755],{"class":309},[299,1179,630],{"class":447},[299,1181,672],{"class":447},[299,1183,1184,1186,1188,1190,1192,1194,1196,1198],{"class":301,"line":762},[299,1185,743],{"class":447},[299,1187,485],{"class":746},[299,1189,630],{"class":447},[299,1191,633],{"class":447},[299,1193,665],{"class":447},[299,1195,775],{"class":309},[299,1197,630],{"class":447},[299,1199,672],{"class":447},[299,1201,1202,1204,1206,1208,1210,1212,1214,1216],{"class":301,"line":782},[299,1203,743],{"class":447},[299,1205,491],{"class":746},[299,1207,630],{"class":447},[299,1209,633],{"class":447},[299,1211,665],{"class":447},[299,1213,795],{"class":309},[299,1215,630],{"class":447},[299,1217,672],{"class":447},[299,1219,1220,1222,1224,1226,1228,1230,1232],{"class":301,"line":802},[299,1221,743],{"class":447},[299,1223,497],{"class":746},[299,1225,630],{"class":447},[299,1227,633],{"class":447},[299,1229,665],{"class":447},[299,1231,575],{"class":309},[299,1233,817],{"class":447},[299,1235,1236],{"class":301,"line":820},[299,1237,823],{"class":447},[299,1239,1240],{"class":301,"line":826},[299,1241,829],{"class":447},[299,1243,1244],{"class":301,"line":832},[299,1245,835],{"class":447},[299,1247,1248],{"class":301,"line":838},[299,1249,841],{"class":447},[14,1251,1252,1253,1255],{},"Drop the ",[228,1254,497],{}," line if you access your ad account directly, without a manager.",[14,1257,1258,1261,1262,1265],{},[17,1259,1260],{},"On Windows",", write file paths in the JSON with forward slashes (",[228,1263,1264],{},"C:\u002FUsers\u002Fyou\u002Fgcloud\u002F...","), because a single backslash breaks the file.",[14,1267,1268],{},"That's everything wired up.",[38,1270,1272],{"id":1271},"verify-it-works","Verify it works",[14,1274,1275],{},"Confirm the server connected before you trust any answer. In Claude Code, run:",[291,1277,1279],{"className":293,"code":1278,"language":295,"meta":286,"style":286},"claude mcp list\n",[228,1280,1281],{"__ignoreMap":286},[299,1282,1283,1285,1287],{"class":301,"line":302},[299,1284,505],{"class":305},[299,1286,526],{"class":309},[299,1288,1289],{"class":309}," list\n",[14,1291,1292,1293,1295],{},"You want to see ",[228,1294,644],{}," marked connected. The first run is slow because pipx clones and builds the server from GitHub, so give it a minute.",[14,1297,1298],{},"Then ask your agent the cleanest connectivity check there is:",[291,1300,1304],{"className":1301,"code":1302,"language":1303,"meta":286,"style":286},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","What ad accounts do I have access to via Google Ads MCP?\n","txt",[228,1305,1306],{"__ignoreMap":286},[299,1307,1308],{"class":301,"line":302},[299,1309,1302],{},[14,1311,1312,1313,1316],{},"That runs ",[228,1314,1315],{},"list_accessible_customers"," and returns your accessible customer IDs. If you get a list back, you're connected to real data.",[38,1318,1320],{"id":1319},"what-it-can-and-cannot-do","What it can and cannot do",[14,1322,1323,1324,1327,1328,1331,1332,1334],{},"The server has exactly three tools, and all three only pull data out of your account, never change it: ",[228,1325,1326],{},"search"," (runs a report), ",[228,1329,1330],{},"get_resource_metadata"," (tells the agent what fields exist), and ",[228,1333,1315],{}," (lists your accounts). None of them creates, edits, or pauses anything. Google says it plainly: the server \"cannot modify bids, pause campaigns, or create new assets.\"",[14,1336,1337],{},"So it handles the reporting you'd normally click through the Ads dashboard to get. For example:",[46,1339,1340,1346,1352],{},[49,1341,1342,1345],{},[17,1343,1344],{},"Search terms report:"," \"Show search terms from the last 30 days that spent over $50 with zero conversions.\" Wasted spend and negative-keyword candidates in one pass.",[49,1347,1348,1351],{},[17,1349,1350],{},"Performance by campaign:"," \"Compare spend, conversions, and cost per conversion by campaign, this month versus last.\"",[49,1353,1354,1357],{},[17,1355,1356],{},"Across every account at once:"," \"Which campaigns have the worst cost per conversion right now, across all my accounts?\" No clicking into each one.",[14,1359,1360],{},"Four limits decide whether that's enough for you. None are bugs; they're the design:",[46,1362,1363,1369,1375,1381],{},[49,1364,1365,1368],{},[17,1366,1367],{},"It can only read."," It can show you a campaign that's wasting budget in seconds, but you still switch to the Ads dashboard to pause it yourself. Good for analysis, only half of an actual workflow.",[49,1370,1371,1374],{},[17,1372,1373],{},"Not in the browser."," It runs as a program on your computer, so it only works in AI tools you install: Claude Code, Cursor, Gemini, VS Code. The browser versions of Claude (claude.ai) and ChatGPT can't reach it.",[49,1376,1377,1380],{},[17,1378,1379],{},"The same question can return different numbers."," You ask in plain English, and the AI translates that into a precise report query on its own, a little differently each time. So a figure it gives you is a quick read, not a final number. Confirm anything you'll report on against the Ads dashboard first.",[49,1382,1383,1386],{},[17,1384,1385],{},"Google only."," No Meta, no LinkedIn. Every other platform is a separate setup.",[14,1388,1389],{},"The first one is the dealbreaker for most people: you can ask, but you can't act.",[38,1391,1393],{"id":1392},"when-you-need-to-make-changes","When you need to make changes",[14,1395,1396],{},"If you want your agent to actually change things, pause a campaign, shift a budget, push a new asset, the official server can't do it, at least not yet. It's read-only by design, and Google hasn't announced anything about write support.",[14,1398,1399],{},"The only way to get write access today is a hosted MCP: a remote server that holds the keys to your account and makes changes for you.",[14,1401,1402],{},"That access is broad. A hosted MCP can see your spend, your performance, and your customer data, and it can make changes to your live account. Give that to some random server you found online and you've handed a stranger real access, with no idea who runs it or where your data goes.",[14,1404,1405,1407],{},[32,1406,35],{"href":34}," is the one we make, and it's built for exactly that worry:",[46,1409,1410,1417,1424],{},[49,1411,1412,1413,1416],{},"It's an ",[17,1414,1415],{},"official Google tech partner",", vetted to work with the Ads API. Not an unknown endpoint.",[49,1418,1419,1420,1423],{},"Every change is ",[17,1421,1422],{},"draft-first",": the agent proposes the edit, and nothing goes live until you approve it.",[49,1425,1426,1429,1430,1434],{},[17,1427,1428],{},"One connection covers Google and Meta",", so a cross-platform ",[32,1431,1433],{"href":1432},"\u002Fglossary\u002Froas","ROAS"," view isn't two separate setups.",[1436,1437,1438,1452],"table",{},[1439,1440,1441],"thead",{},[1442,1443,1444,1447,1450],"tr",{},[1445,1446],"th",{},[1445,1448,1449],{},"Official Google Ads MCP",[1445,1451,35],{},[1453,1454,1455,1467,1478,1489],"tbody",{},[1442,1456,1457,1461,1464],{},[1458,1459,1460],"td",{},"Access",[1458,1462,1463],{},"Read-only",[1458,1465,1466],{},"Read and write, with your approval",[1442,1468,1469,1472,1475],{},[1458,1470,1471],{},"Setup",[1458,1473,1474],{},"30 to 45 minutes, on your machine",[1458,1476,1477],{},"About 3 clicks",[1442,1479,1480,1483,1486],{},[1458,1481,1482],{},"Platforms",[1458,1484,1485],{},"Google only",[1458,1487,1488],{},"Google, Meta, and more",[1442,1490,1491,1494,1497],{},[1458,1492,1493],{},"Cost",[1458,1495,1496],{},"Free",[1458,1498,1499],{},"Starting at $29\u002Fmonth",[14,1501,1502],{},"Two honest options: free and read-only, or write access through a service you can actually trust.",[38,1504,1506],{"id":1505},"troubleshooting","Troubleshooting",[1508,1509,1510,1514],"details",{},[1511,1512,1513],"summary",{},"\"This app is blocked\" or \"cloud-platform scope required\"",[14,1515,1516,1517,1519,1520,1523,1524,1527,1528,1530,1531,1523,1535,74],{},"You tried to authenticate with gcloud's built-in OAuth client, which Google no longer permits for the Google Ads scope. Create your own OAuth client (Desktop type), download its JSON, and pass it with ",[228,1518,338],{},". Make sure both ",[228,1521,1522],{},"adwords"," and ",[228,1525,1526],{},"cloud-platform"," are in your ",[228,1529,386],{}," flag. See ",[32,1532,1534],{"href":1533},"#3-build-the-oauth-client","step 3",[32,1536,1538],{"href":1537},"#4-authenticate-with-gcloud","step 4",[1508,1540,1541,1544,1551],{},[1511,1542,1543],{},"\"Error 403: access_denied, app is being tested\"",[14,1545,1546,1547,1550],{},"Your OAuth consent screen is in Testing mode and the email you signed in with isn't on the test users list. Go to the ",[32,1548,221],{"href":219,"rel":1549},[86]," and add both your own Google account and your Google Ads login email as test users, then retry the gcloud login.",[14,1552,1553],{},[92,1554],{"alt":1555,"src":1556},"The 403 access_denied 'app is being tested' block screen","\u002Fimages\u002Fblog\u002Fgoogle-mcp-setup\u002F403-access-denied.png",[1508,1558,1559,1562],{},[1511,1560,1561],{},"\"The developer token is only approved for use with test accounts\"",[14,1563,1564,1565,1568],{},"Your token has Test Account access, which can't read production data. Most people get Explorer access instead (it reads real accounts and is enough for this MCP) when Google auto-approves the API access form. A Test result means that auto-review couldn't clear you, so open the ",[32,1566,87],{"href":84,"rel":1567},[86]," on your manager account and apply for Basic access. Google targets a couple of business days, but the queue can run longer.",[1508,1570,1571,1574],{},[1511,1572,1573],{},"Manager account: \"can't find the account\"",[14,1575,1576,1577,1579,1580,1582],{},"If you reach your ad account through a manager (MCC), the server needs to know which manager to log in through. Set ",[228,1578,497],{}," to the manager account's customer ID, ",[17,1581,513],{},", no dashes. Without it, the server can't resolve accounts under the manager.",[1508,1584,1585,1588],{},[1511,1586,1587],{},"Service account dead-end: \"zero Google Ads access\"",[14,1589,1590],{},"Service accounts can't be added as users in Google Ads, so they have no access to your campaigns no matter how the permissions look in Cloud. The official server uses user OAuth with your own client, which is what this guide sets up. If you went hunting for a service-account route, this is the dead-end it saves you from.",[1508,1592,1593,1596],{},[1511,1594,1595],{},"Server doesn't appear in `claude mcp list`",[14,1597,1598,1599,1602,1603,1606,1607,1610,1611,1614],{},"The first ",[228,1600,1601],{},"pipx run"," clones and builds the server from GitHub, which is slow and needs network plus git. Give it a minute and re-check. If it still doesn't appear, confirm pipx is installed and on your PATH (",[228,1604,1605],{},"pipx ensurepath",", then restart your terminal), and that Python is available. On macOS, ",[228,1608,1609],{},"python"," vs ",[228,1612,1613],{},"python3"," mismatches are a common cause.",[38,1616,1618],{"id":1617},"final-thoughts","Final thoughts",[14,1620,1621,1622,1626],{},"The two platforms are far apart right now. ",[32,1623,1625],{"href":1624},"\u002Fresources\u002Fmeta-ads-mcp-setup","Meta's official MCP"," is a paste-a-URL, two-minute setup with full write access. Google's is a 30-to-45-minute local build, longer if your token needs approval, and at the end it can only read. Neither is wrong; it's just where each one sits today.",[14,1628,1629,1630,1633],{},"If you want free, first-party Google reporting and don't mind the setup, the official server is the right call, and this guide gets you there. If you need to make changes, or you also run Meta, that's where a hosted option like ",[32,1631,1632],{"href":34},"AdKit's Google Ads MCP"," fits.",[14,1635,1636,1637,122,1642,74],{},"If you get stuck, ping me on ",[32,1638,1641],{"href":1639,"rel":1640},"https:\u002F\u002Fx.com\u002Fnico_jeannen",[86],"X",[32,1643,1646],{"href":1644,"rel":1645},"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnico-jeannen\u002F",[86],"LinkedIn",[1648,1649,1651],"h3",{"id":1650},"sources","Sources",[1653,1654,1655,1662,1669,1676],"ol",{},[49,1656,1657],{},[32,1658,1661],{"href":1659,"rel":1660},"https:\u002F\u002Fgithub.com\u002Fgoogleads\u002Fgoogle-ads-mcp",[86],"Official Google Ads MCP server (GitHub)",[49,1663,1664],{},[32,1665,1668],{"href":1666,"rel":1667},"https:\u002F\u002Fdevelopers.google.com\u002Fgoogle-ads\u002Fapi\u002Fdocs\u002Fdeveloper-toolkit\u002Fmcp-server",[86],"Google Ads MCP Server documentation",[49,1670,1671],{},[32,1672,1675],{"href":1673,"rel":1674},"https:\u002F\u002Fdevelopers.google.com\u002Fgoogle-ads\u002Fapi\u002Fdocs\u002Fget-started\u002Fdev-token",[86],"Google Ads developer token guide",[49,1677,1678],{},[32,1679,1682],{"href":1680,"rel":1681},"https:\u002F\u002Fdevelopers.google.com\u002Fgoogle-ads\u002Fapi\u002Fdocs\u002Foauth\u002Fcloud-project",[86],"Google Ads API: Cloud project and OAuth setup",[1684,1685,1686],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":286,"searchDepth":365,"depth":365,"links":1688},[1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699],{"id":40,"depth":365,"text":41},{"id":77,"depth":365,"text":78},{"id":143,"depth":365,"text":144},{"id":186,"depth":365,"text":187},{"id":261,"depth":365,"text":262},{"id":416,"depth":365,"text":417},{"id":1271,"depth":365,"text":1272},{"id":1319,"depth":365,"text":1320},{"id":1392,"depth":365,"text":1393},{"id":1505,"depth":365,"text":1506},{"id":1617,"depth":365,"text":1618,"children":1700},[1701],{"id":1650,"depth":373,"text":1651},null,"guides",false,"2026-06-09","Google's official Ads MCP is read-only and takes ~30-45 min to wire up. Step-by-step setup for Claude Code, Cursor, and Gemini, with the gotchas.","md",[1709,1712,1715,1718,1721,1724,1727,1730],{"question":1710,"answer":1711},"Is the Google Ads MCP free?","Yes. Google's official server (github.com\u002Fgoogleads\u002Fgoogle-ads-mcp) is open-source and free. You run it locally via pipx. There is no hosted version and no subscription. Your only cost is the time it takes to set up, which is real.",{"question":1713,"answer":1714},"Can the Google Ads MCP create or pause campaigns?","No. The official server is strictly read-only. Google's docs say it 'cannot modify bids, pause campaigns, or create new assets.' It has three tools, all for reading data. If you need to make changes, you need a different tool with write access.",{"question":1716,"answer":1717},"Does the Google Ads MCP work with claude.ai or ChatGPT on the web?","No. The official server runs locally on your machine, so it only works with clients that launch local processes: Claude Code (the CLI), Cursor, Gemini CLI, Gemini Code Assist, and VS Code. claude.ai web and ChatGPT web connect to hosted URLs only, and Google does not host this server.",{"question":1719,"answer":1720},"Why do I get 'this app is being tested' when I authenticate?","Your OAuth consent screen is in Testing mode and the Google account you signed in with is not on the test users list. Add both your own email and your Google Ads login email as test users in the Google Cloud console, then try again.",{"question":1722,"answer":1723},"My developer token only works on test accounts. How do I fix it?","Your token has Test Account access, which can't read real campaigns. Google's automatic review usually grants Explorer access (which reads real accounts) the moment you submit the API access form, so a Test result means that auto-review couldn't clear you. Apply for Basic access in the Google Ads API Center and wait; Google targets a couple of business days, but the queue can run longer.",{"question":1725,"answer":1726},"Do I need a Google Ads manager (MCC) account?","Yes, to get a developer token. The API Center only appears on a manager account, and the token request form lives there. Creating a manager account is free. If you access your ad account through that manager, set GOOGLE_ADS_LOGIN_CUSTOMER_ID to the manager's ID, digits only.",{"question":1728,"answer":1729},"Can I use a service account instead of OAuth?","Not for Google Ads. Service accounts can't be added as users in Google Ads, so they have zero access to your campaigns. Use user OAuth with your own client, which is what this guide walks through.",{"question":1731,"answer":1732},"Will the official Google Ads MCP ever support writing or editing campaigns?","Google hasn't committed to it. There is clear demand for write access, but no date and no promise. If you need to make changes today, you need a hosted MCP that already has write access, such as AdKit.",{},true,"Read-only. Local setup. Claude Code, Cursor, Gemini only.","\u002Fresources\u002Fgoogle-ads-mcp-setup",{"title":6,"description":1706},"resources\u002Fgoogle-ads-mcp-setup",[1740,1741,1742,1743,1744,1745],"google ads","mcp","ai agents","automation","tutorial","claude code","KSEBNmtCYRfEZuQFgOvSf2TfRhMZ_c1AQKjKlWz4KFs",{"data":1748,"body":1749},{},{"type":1750,"children":1751},"root",[1752],{"type":1753,"tag":14,"props":1754,"children":1755},"element",{},[1756],{"type":1757,"value":1711},"text",{"data":1759,"body":1760},{},{"type":1750,"children":1761},[1762],{"type":1753,"tag":14,"props":1763,"children":1764},{},[1765],{"type":1757,"value":1714},{"data":1767,"body":1768},{},{"type":1750,"children":1769},[1770],{"type":1753,"tag":14,"props":1771,"children":1772},{},[1773],{"type":1757,"value":1717},{"data":1775,"body":1776},{},{"type":1750,"children":1777},[1778],{"type":1753,"tag":14,"props":1779,"children":1780},{},[1781],{"type":1757,"value":1720},{"data":1783,"body":1784},{},{"type":1750,"children":1785},[1786],{"type":1753,"tag":14,"props":1787,"children":1788},{},[1789],{"type":1757,"value":1723},{"data":1791,"body":1792},{},{"type":1750,"children":1793},[1794],{"type":1753,"tag":14,"props":1795,"children":1796},{},[1797],{"type":1757,"value":1726},{"data":1799,"body":1800},{},{"type":1750,"children":1801},[1802],{"type":1753,"tag":14,"props":1803,"children":1804},{},[1805],{"type":1757,"value":1729},{"data":1807,"body":1808},{},{"type":1750,"children":1809},[1810],{"type":1753,"tag":14,"props":1811,"children":1812},{},[1813],{"type":1757,"value":1732},1781012496734]