Marvento Ads MCP
OfficialProvides tools for managing Google Ads campaigns, ad groups, ads, and assets, including creating budgets, campaigns, keywords, responsive search ads, sitelinks, callouts, and conversion actions, as well as GAQL search and resource metadata discovery.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Marvento Ads MCP Create a new Search campaign for hiking gear, paused, with a $50 daily budget."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Marvento Ads MCP
A fork of Google's official google-ads-mcp that adds write tools so an AI agent can build and run Google Ads campaigns, plus a one-command VPS deployment (Docker + Caddy, automatic HTTPS) so the server can be reached from any MCP client as a remote connector.
Upstream stays intact underneath: the OAuth login flow, GAQL search,
get_resource_metadata and list_accessible_customers are Google's code.
Everything below the line "Google Ads MCP Server" is the upstream README.
What this fork adds
Namespace | Tools |
|
|
|
|
|
|
|
|
Safety rails, enforced in code (ads_mcp/mutate.py):
New campaigns are always created PAUSED. Enabling is a separate call.
Anything that starts or raises spend, or removes something, needs
confirm=true. Without it the call is validated by Google and returned as a preview; nothing changes.Daily budgets are capped by
ADS_MCP_MAX_DAILY_BUDGET(server env, default 500).Every tool accepts
validate_only=truefor a dry run.Responsive search ad copy is checked against Google's limits before the API call.
Run the server read-only by setting the four write namespaces to false in tools_config.yaml.
Related MCP server: Ads MCP
Deploying
See deploy/: docker-compose.yml + Caddyfile for any Docker host,
cloud-init.yaml + create_droplet.py for a fully automated DigitalOcean droplet.
Operations, decisions and current state live in DOCUMENTATION.md
and HANDOVER.md.
Google Ads API access is granted per Google Cloud project since 2026-09-09 (developer tokens are sunset). A new project starts at Test access; production accounts need Explorer or Basic. See DOCUMENTATION.md, section "Google access levels".
Google Ads MCP Server
This repo contains the source code for running an MCP server that interacts with the Google Ads API.
Tools
The server uses the Google Ads API to provide several Tools and Resources for use with LLMs and AI agents.
Tools available
search: Retrieves information about the Google Ads account.get_resource_metadata: Retrieves metadata about a Google Ads API resource type, for example "campaign". This is useful to understand the structure of the data and what fields are available for querying.list_accessible_customers: Returns ids of customers directly accessible by the user authenticating the call.
Configuring and Namespacing Tools
The Google Ads MCP server uses the tools_config.yaml to let you selectively enable or disable individual tools or tool categories (namespaces) and customize their namespace prefixes.
A default tools_config.yaml with all tools enabled is bundled with the package, so the server works out of the box with no extra setup. To customize your installation, the server resolves the configuration in the following order:
An explicit path set via the
GOOGLE_ADS_MCP_TOOLS_CONFIGenvironment variable.A
tools_config.yamlfile in the current working directory.The default
tools_config.yamlbundled with the package.
If an explicitly requested configuration file (via the environment variable) is missing, or any resolved file is invalid, the server raises an error and fails to start.
Configuration Example:
namespaces:
# Option 1: Enable category 'customers' with default prefix -> "customers_list_accessible_customers"
customers: true
# Option 2: Enable category 'search' with a custom prefix -> "query_search"
search: "query"
# Option 3: Fine-grained control over tools in a category
metadata:
enabled: true
prefix: "metadata"
enabled_tools:
- get_resource_metadata: trueResources available
discovery-document: Retrieve the Google Ads API discovery document. Provides the discovery document for the latest version of the Google Ads API, which describes the API surface, including resources, methods, and schemas. Host LLMs should access this resource to understand the structure of the Google Ads API and discover available features.metrics: Retrieve information about the metrics available for reporting in the Google Ads API.segments: Retrieve information about the segments available for reporting in the Google Ads API.release-notes: Retrieve the release notes for the latest version of the Google Ads API.
Notes
The MCP Server will expose your data to the Agent or LLM that you connect to it.
If you have technical issues, please use the GitHub issue tracker.
To help us collect usage data, you will notice an extra header has been added to your API calls: this data is used to improve the product.
Setup instructions
Setup involves the following steps:
Configure Python.
Configure Developer Token.
Enable APIs in your project
Configure Credentials.
Configure your MCP client.
Configure Python
After a version has been published to PyPI, you can run that exact version instead of following the latest repository state:
pipx run --spec "google-ads-mcp==X.Y.Z" google-ads-mcpConfigure Developer Token (Optional)
If your setup requires a developer token, follow the instructions for Obtaining a Developer Token.
Your developer token must have at least Explorer access to query production accounts. New tokens may be automatically upgraded to Explorer access; if not, you can apply through the API Center. See the access levels documentation for details.
If you see the error "The developer token is only approved for use with test accounts", your token does not yet have access to production accounts. See the access levels documentation for how to request the access level you need.
Enable APIs in your project
Follow the instructions to enable the following APIs in your Google Cloud project:
Configure Credentials
Option 1: Using FastMCP OAuth Proxy
The server supports FastMCP's OAuth proxy feature for dynamic user authentication. This is useful when running the server as a web service.
To enable it, set the following environment variables:
GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: Your Google Cloud OAuth 2.0 Client ID.GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: Your Google Cloud OAuth 2.0 Client Secret.GOOGLE_ADS_MCP_BASE_URL: (Optional) The base URL where the server is accessible (defaults tohttp://localhost:8080).GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (Optional) Secret key used to sign FastMCP JWT tokens across multiple server instances or deployments.GOOGLE_ADS_MCP_STORAGE_TYPE: (Optional) Storage backend for OAuth state (filetree,redis,firestore, ormemory).GOOGLE_ADS_MCP_STORAGE_PATH: (Optional) Directory path forfiletreepersistent storage.GOOGLE_ADS_MCP_STORAGE_REDIS_URL: (Optional) Redis URL forredispersistent storage.GOOGLE_ADS_MCP_STORAGE_FIRESTORE_PROJECT: (Optional) Google Cloud project forfirestorepersistent storage. Defaults to the project inferred from Application Default Credentials. Setting it selects thefirestorebackend even ifGOOGLE_ADS_MCP_STORAGE_TYPEis unset.GOOGLE_ADS_MCP_STORAGE_FIRESTORE_DATABASE: (Optional) Firestore database name forfirestorepersistent storage. Defaults to(default).GOOGLE_ADS_MCP_STORAGE_ENCRYPTION_KEY: (Optional) Encryption key for stored OAuth tokens.GOOGLE_ADS_MCP_STORAGE_DISABLE_ENCRYPTION: (Optional) Set totrueto disable token encryption.
The redis and firestore backends need their storage library installed
alongside the server: pip install py-key-value-aio[redis] and
pip install google-ads-mcp[firestore] respectively.
Once this is enabled, you can authenticate to the API through your MCP client.
When these variables are set, the server automatically switches to the
streamable-http transport instead of stdio.
You will need to run the server as a separate process and configure your MCP
client to connect to the Streamable HTTP endpoint (for example,
http://localhost:8080/mcp).
Local WSL and Podman deployment
This deployment has been tested with rootless Podman in WSL and exposes a single
Streamable HTTP endpoint at http://localhost:8080/mcp. Build the image from
the repository inside WSL:
podman build --tag localhost/google-ads-mcp:latest --file Dockerfile .Keep server credentials out of MCP client configuration. The tested Quadlet
loads Google Ads and OAuth settings from a private host-side file through
EnvironmentFile= and uses a separate named volume for persistent encrypted
OAuth state:
[Container]
Image=localhost/google-ads-mcp:latest
PublishPort=127.0.0.1:8080:8080
EnvironmentFile=/absolute/host/path/google-ads-mcp.env
Volume=google-ads-mcp-oauth.volume:/var/lib/google-ads-mcp:rw
ReadOnly=true
NoNewPrivileges=true
DropCapability=allThe environment file and the OAuth-state volume serve different purposes: the
volume does not contain the .env file. Keep the environment file outside the
repository, restrict it to the service owner, and never commit it. Antigravity
and Codex then need only the MCP endpoint and their own OAuth authorization;
they do not need the server's Google Ads developer token, OAuth client secret,
or signing and storage keys. Publish port 8080 only on the loopback interface
when the server is intended for local agents.
The endpoint deliberately keeps stateful Streamable HTTP enabled. It supports
legacy MCP 2025 clients that use Mcp-Session-Id and GET SSE as well as MCP
2026 clients that use sessionless POST requests and subscriptions/listen.
Do not enable FastMCP's stateless_http option on this shared endpoint; doing
so removes the legacy GET channel.
The server runs on FastMCP 4 (fastmcp>=4.0.3) paired with mcp[cli]==2.0.0. The Docker build also applies a version-guarded
OAuth metadata workaround for Codex CLI 0.146. It stops advertising the RFC
9207 authorization-response iss parameter as mandatory while FastMCP still
includes it in redirects. The build fails if the expected FastMCP version or
patch location changes, so upgrades require explicit interoperability tests.
For Codex, configure and authenticate the server as described in the official Codex MCP documentation:
codex mcp add google_ads --url http://localhost:8080/mcp
codex mcp login google_adsFor Antigravity, configure the same URL as serverUrl in its MCP configuration.
This key is required for Streamable HTTP in Antigravity 2.8.1 and Antigravity
IDE 2.5.5; httpUrl is not accepted by those versions. After authentication,
both clients should list these namespaced tools:
customers_list_accessible_customersmetadata_get_resource_metadatasearch_search
Option 2: Configure credentials using Application Default Credentials
Configure your Application Default Credentials (ADC). Make sure the credentials are for a user with access to your Google Ads accounts or properties.
Credentials must include the Google Ads API scope:
https://www.googleapis.com/auth/adwordsCheck out Manage OAuth Clients for how to create an OAuth client.
Here are some sample gcloud commands you might find useful:
Set up ADC using user credentials and an OAuth desktop or web client after downloading the client JSON to
YOUR_CLIENT_JSON_FILE.gcloud auth application-default login \ --scopes https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \ --client-id-file=YOUR_CLIENT_JSON_FILESet up ADC using service account impersonation.
gcloud auth application-default login \ --impersonate-service-account=SERVICE_ACCOUNT_EMAIL \ --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform
When the gcloud auth application-default command completes, copy the
PATH_TO_CREDENTIALS_JSON file location printed to the console in the
following message. You will need this for a later step!
Credentials saved to file: [PATH_TO_CREDENTIALS_JSON]Option 3: Configure credentials using the Google Ads API Python client library.
Follow the instructions to setup and configure the Google Ads API Python client library
If you have already done this and have a working google-ads.yaml , you can reuse this file!
In the utils.py file, change get_googleads_client() to use the load_from_storage() method.
Configure your MCP client
Add the server to your MCP client's configuration. Below are examples for popular clients.
Antigravity / Antigravity IDE
Install Antigravity or Antigravity IDE.
Configure your server. Refer to the docs at https://antigravity.google/docs/mcp for details on setting up MCP servers.
Option 1: Using FastMCP OAuth Proxy (Streamable HTTP)
You can run the server as a separate process and configure your MCP client to connect to the Streamable HTTP endpoint (for example,
http://localhost:8080/mcp). This also allows using FastMCP's OAuth proxy feature for dynamic user authentication.Antigravity 2.8.1 and Antigravity IDE 2.5.5 require
serverUrlfor a Streamable HTTP server. Do not use the olderhttpUrlkey. Server-side credentials belong in the server process, not in this client configuration.{ "mcpServers": { "google-ads-mcp": { "serverUrl": "http://localhost:8080/mcp" } } }Option 2: the Application Default Credentials method
This remains a supported alternative, but it provides less credential isolation than the server-managed Streamable HTTP deployment above. The MCP client starts the server and its configuration contains the ADC file path and Google Ads developer token. Prefer the Quadlet deployment when several local clients share the same server or client configuration may be copied, synchronized, or inspected by other tools.
Replace
PATH_TO_CREDENTIALS_JSONwith the path you copied in the previous step.We also recommend that you add a
GOOGLE_CLOUD_PROJECTattribute to theenvobject. ReplaceYOUR_PROJECT_IDin the following example with the project ID of your Google Cloud project.{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": [ "run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp" ], "env": { "GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON", "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }Option 3: the Python client library method
{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": [ "run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp" ], "env": { "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }
Login Customer Id
If your access to the customer account is through a manager account, you can
either provide the manager account's customer ID per tool call via the optional
login_customer_id parameter, or set GOOGLE_ADS_LOGIN_CUSTOMER_ID in the
settings file as a default (the per-call login_customer_id parameter takes
precedence when specified).
See here for details.
The final file will look like this:
{
"mcpServers": {
"google-ads-mcp": {
"command": "pipx",
"args": [
"run",
"--spec",
"git+https://github.com/googleads/google-ads-mcp.git",
"google-ads-mcp"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON",
"GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID",
"GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "YOUR_MANAGER_CUSTOMER_ID"
}
}
}
}Other MCP clients (Claude Code, Cursor, VS Code, etc.)
The mcpServers block format is the same across all MCP clients. Add the configuration shown above to the appropriate settings file for your client (e.g., ~/.claude/settings.json for Claude Code, .cursor/mcp.json for Cursor, .vscode/mcp.json for VS Code with Copilot).
Deployment to Google Cloud Platform
Instead of hosting this MCP server locally, you can host it on Google Cloud Run or on any other cloud-based infrastructure. This is useful if you want to share the server across different agents or run it as a web service.
Note that this only supports authentication with an OAuth Client ID and Client Secret pair through the OAuth proxy (Option #1 above).
Prerequisites
A Google Cloud project.
The
gcloudCLI installed, authenticated, and active project set.gcloud config set project YOUR_PROJECT_ID
Step 1: Build and Push Docker Image
You can use Cloud Build to build and push the image to Artifact Registry without needing Docker installed locally.
Create a repository in Artifact Registry:
gcloud artifacts repositories create mcp-servers --repository-format=docker --location=us-central1Build and submit the image:
gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest .Replace
YOUR_PROJECT_IDwith your Google Cloud project ID.
Step 2: Deploy to Google Cloud Run
Make sure to set the required environment variables:
GOOGLE_PROJECT_ID: Your Google Cloud project ID.GOOGLE_ADS_DEVELOPER_TOKEN: (Optional) The developer token you want the MCP server to use (see above).GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: The OAuth Client ID you want the MCP server to use.GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: The OAuth Client secret you want the MCP server to use.GOOGLE_ADS_MCP_BASE_URL: The base URL where your MCP server is accessible: this will be automatically assigned by Google Cloud Run after your first deployment. You can update the environment variables after deployment.GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (Recommended for production) Persistent JWT signing key across Cloud Run instances.GOOGLE_ADS_MCP_STORAGE_TYPE: (Recommended for production) Storage backend to persist OAuth tokens across instances. Set it tofirestoreto use Firestore through Application Default Credentials, which needs no VPC connector, or toredisalong withGOOGLE_ADS_MCP_STORAGE_REDIS_URL.Using
firestorerequires three things: build the image with the extra installed (change the Dockerfile touv pip install --system .[firestore]), create a Firestore database in the project, since one is not provisioned automatically, and grant the Cloud Run service accountroles/datastore.user. Note that entries are not expired automatically: the store filters expired entries on read but never deletes them, andexpires_atis written as a string, so a Firestore TTL policy cannot collect them either. Plan on a periodic cleanup job for long-running deployments. Redis expires entries on its own.FASTMCP_HOST: Set this to0.0.0.0to allow FastMCP to accept connections from all IP addresses.GOOGLE_ADS_LOGIN_CUSTOMER_ID: Required if your access to the customer account is through a manager account. Set it to the customer ID of the manager account. See Login Customer Id above for details.
gcloud run deploy google-ads-mcp \
--image us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--set-env-vars="GOOGLE_PROJECT_ID=YOUR_PROJECT_ID,GOOGLE_ADS_DEVELOPER_TOKEN=YOUR_DEVELOPER_TOKEN,GOOGLE_ADS_MCP_OAUTH_CLIENT_ID=YOUR_CLIENT_ID,GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET=YOUR_CLIENT_SECRET,GOOGLE_ADS_MCP_BASE_URL=YOUR_BASE_URL,GOOGLE_ADS_MCP_JWT_SIGNING_KEY=YOUR_JWT_SIGNING_KEY,GOOGLE_ADS_MCP_STORAGE_TYPE=firestore,FASTMCP_HOST=0.0.0.0"Step 3: Configure MCP Client
Once deployed, update your MCP client configuration (refer to the docs at https://antigravity.google/docs/mcp) to use the Cloud Run URL.
{
"mcpServers": {
"google-ads-mcp": {
"httpUrl": "https://your-cloud-run-url.a.run.app/mcp"
}
}
}Try it out
Launch your MCP client. You should see google-ads-mcp listed in the
available servers.
Here are some sample prompts to get you started:
Ask what the server can do:
what can the ads-mcp server do?Ask about customers:
what customers do I have access to?Ask about campaigns
How many active campaigns do I have?How is my campaign performance this week?
Note about Customer ID
Your agent will need and ask for a customer id for most prompts. If you are moving between multiple customers, including the customer ID in the prompt may be simpler.
How many active campaigns do I have for customer id 1234567890Contributing
Changes to the read-only core belong upstream at googleads/google-ads-mcp (see its CONTRIBUTING.md). Changes to the write tools and the deployment kit go through this repository; AGENTS.md has the working rules.
Available Tools
23 toolsad_groups_add_ad_group_negative_keywordsAd Groups Add Ad Group Negative KeywordsA
Adds negative keywords to one ad group. For campaign-wide negatives use campaigns.add_campaign_targeting.
Inputs: ad_group_id (required), customer_id (required), negative_keywords (required), match_type, +2 more. Returns: object
ad_groups_add_keywordsAd Groups Add KeywordsB
Adds keywords to an ad group.
Inputs: keywords (required), ad_group_id (required), customer_id (required), status, +2 more. Returns: object
ad_groups_create_ad_groupAd Groups Create Ad GroupA
Creates a Search ad group inside a campaign.
Ad groups default to ENABLED because the campaign itself is created PAUSED; nothing serves until the campaign is enabled with confirm=true.
Inputs: name (required), campaign_id (required), customer_id (required), status, +3 more. Returns: object
ad_groups_set_ad_group_statusAd Groups Set Ad Group StatusADestructive
Enables, pauses or removes an ad group. REMOVED needs confirm=true.
Inputs: status (required), ad_group_id (required), customer_id (required), confirm, +2 more. Returns: object
ad_groups_set_keyword_statusAd Groups Set Keyword StatusADestructive
Pauses, enables or removes keywords (ad group criteria). REMOVED needs confirm=true.
Find criterion ids with search on ad_group_criterion (ad_group_criterion.criterion_id).
Inputs: status (required), ad_group_id (required), customer_id (required), criterion_ids (required), +3 more. Returns: object
ad_groups_update_ad_group_cpc_bidAd Groups Update Ad Group Cpc BidADestructive
Changes an ad group's default max CPC (MANUAL_CPC campaigns). Needs confirm=true.
Inputs: ad_group_id (required), customer_id (required), default_cpc_bid (required), confirm, +2 more. Returns: object
ads_create_responsive_search_adAds Create Responsive Search AdA
Creates a responsive search ad in an ad group.
Copy is checked locally against Google's limits before the API call: 3-15 headlines of max 30 chars, 2-4 descriptions of max 90 chars, display paths of max 15 chars, no duplicate lines, no all-caps, no '!' in headlines. Aim for 8-15 distinct headlines and 4 descriptions; Google rates ad strength on variety.
The ad defaults to ENABLED because the campaign is PAUSED until confirmed.
Inputs: headlines (required), final_urls (required), ad_group_id (required), customer_id (required), +6 more. Returns: object
ads_set_ad_statusAds Set Ad StatusADestructive
Enables, pauses or removes an ad. REMOVED needs confirm=true.
Inputs: ad_id (required), status (required), ad_group_id (required), customer_id (required), +3 more. Returns: object
ads_update_responsive_search_adAds Update Responsive Search AdA
Replaces the copy of an existing responsive search ad.
Headlines and descriptions are replaced as whole sets (pass the full list you want to end up with). Editing an ad resets its performance history in the UI; for A/B tests prefer creating a second ad in the same ad group.
Inputs: ad_id (required), customer_id (required), path1, path2, +5 more. Returns: object
assets_add_calloutsAssets Add CalloutsA
Creates callout assets ("Free Quote", "24/7 Support") and attaches them to a campaign.
Inputs: callouts (required), campaign_id (required), customer_id (required), validate_only, +1 more. Returns: object
assets_add_sitelinksAssets Add SitelinksA
Creates sitelink assets and attaches them to a campaign. Add at least 4 for full effect.
Inputs: sitelinks (required), campaign_id (required), customer_id (required), validate_only, +1 more. Returns: object
assets_create_conversion_actionAssets Create Conversion ActionA
Creates a website conversion action (the thing bidding optimises for).
After creating it, fetch the tag with search on conversion_action selecting conversion_action.tag_snippets and install the event snippet on the site, or fire it through Google Tag Manager.
Inputs: name (required), customer_id (required), category, counting_type, +6 more. Returns: object
campaigns_add_campaign_targetingCampaigns Add Campaign TargetingA
Adds locations, languages and campaign-level negative keywords to a campaign.
Inputs: campaign_id (required), customer_id (required), locations, validate_only, +4 more. Returns: object
campaigns_create_campaignCampaigns Create CampaignA
Creates a Search campaign, always PAUSED. Enable it later with set_campaign_status.
Typical order: create_campaign_budget -> create_campaign -> add_campaign_targeting -> ad_groups.create_ad_group -> ad_groups.add_keywords -> ads.create_responsive_search_ad -> review -> set_campaign_status(ENABLED, confirm=true).
Inputs: name (required), budget_id (required), customer_id (required), bidding, +11 more. Returns: object
campaigns_create_campaign_budgetCampaigns Create Campaign BudgetA
Creates a campaign budget. Do this before create_campaign.
Inputs: name (required), customer_id (required), daily_amount (required), validate_only, +3 more. Returns: object
campaigns_remove_campaign_criteriaCampaigns Remove Campaign CriteriaADestructive
Removes campaign criteria (locations, languages, negatives) by criterion id. Needs confirm=true.
Find criterion ids with search on campaign_criterion (campaign_criterion.criterion_id).
Inputs: campaign_id (required), customer_id (required), criterion_ids (required), confirm, +2 more. Returns: object
campaigns_set_campaign_statusCampaigns Set Campaign StatusADestructive
Enables, pauses or removes a campaign.
PAUSED applies immediately (it only stops spend). ENABLED starts spend and REMOVED is permanent, so both need confirm=true; without it you get a validated preview.
Inputs: status (required), campaign_id (required), customer_id (required), confirm, +2 more. Returns: object
campaigns_suggest_geo_targetsCampaigns Suggest Geo TargetsARead-only
Looks up geo target ids for place names. Use before add_campaign_targeting.
Inputs: location_names (required), locale, country_code, login_customer_id. Returns: result
campaigns_update_campaignCampaigns Update CampaignA
Renames a campaign, changes its dates, or points it at another budget.
Bidding strategy changes are deliberately not exposed here; create a new campaign instead so the learning history is not disturbed by accident.
Inputs: campaign_id (required), customer_id (required), name, end_date, +4 more. Returns: object
campaigns_update_campaign_budgetCampaigns Update Campaign BudgetADestructive
Changes the daily amount of an existing budget. Needs confirm=true to apply.
Inputs: budget_id (required), customer_id (required), daily_amount (required), confirm, +2 more. Returns: object
customers_list_accessible_customersCustomers List Accessible CustomersARead-only
Returns ids of customers directly accessible by the user authenticating the call.
Use this tool first to discover available customer IDs if the user hasn't provided one. Most other tools require a valid customer ID as input.
Returns: List[str]: A list of customer IDs.
Inputs: no named parameters. Returns: result
metadata_get_resource_metadataMetadata Get Resource MetadataARead-only
Retrieves the selectable, filterable, and sortable fields for a specific Google Ads resource, including compatible metrics and segments.
Use this tool to find out which fields you can select, filter by, or sort by when querying a specific resource (e.g., 'campaign', 'ad_group'). This tool also returns metrics and segments that can be selected with the resource. Their names start with 'metrics.' and 'segments.' respectively.
Do not guess fields, you MUST use this tool to discover them before constructing a query for the
search tool.
The responses of this tool should be cached, as they don't change frequently.
Inputs: resource_name (required), login_customer_id. Returns: object
search_searchSearch SearchCRead-only
Fetches data from the Google Ads API using the search method
Inputs: fields (required), resource (required), customer_id (required), limit, +3 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 23 tools
Each tool targets a distinct resource and action, from campaign lifecycle to ad group keywords, ads, assets, and search. Even similar asset tools (callouts vs. sitelinks) are clearly separated by asset type, and status/update/remove actions are scoped to specific objects.
Tool names mostly follow a predictable snake_case pattern grouped by resource prefix, such as campaigns_*, ad_groups_*, ads_*, and assets_*. Minor redundancy like search_search and metadata_get_resource_metadata slightly breaks the verb_noun ideal but does not hinder usability.
With 23 tools, the server is on the heavier side and exceeds the typical 15-tool sweet spot, but the count is defensible for a Google Ads management surface spanning campaigns, ad groups, ads, assets, targeting, and metadata. It feels broad rather than bloated, though some tools could potentially be consolidated.
The tool set covers the core Search campaign lifecycle well: budgets, campaigns, targeting, ad groups, keywords, ads, and conversion actions. Minor gaps exist, such as lacking direct asset removal/update and ad group rename, but the generic search and metadata tools allow agents to query resources and work around most omissions.
Maintenance
Related MCP Connectors
Open-source ad agent for LinkedIn Ads and Google Ads. Drafts campaigns, audiences and reports.
Run Google Ads and Meta Ads from ChatGPT or Claude: audit wasted spend, create and manage campaigns.
Hosted Google Ads MCP for Claude and ChatGPT. Preview every write. No developer token.
Build and grow Google Ads with AdeptAds multi-agent workflows.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage, report, and analyze Google Ads campaigns securely with encrypted multi-client support, real-time API integrations, and audit trail logging.69 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to create, analyze, and optimize ad campaigns across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Amazon Ads, and ChatGPT Ads through natural language using 400+ tools.107MIT
- FlicenseAqualityDmaintenanceEnables AI agents to manage Google Ads campaigns (Search and UAC) through natural language, with read tools always available and guarded write operations for budgets, campaigns, ad groups, and keywords.3-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage and analyze Google Ads campaigns through tools for listing campaigns, retrieving settings, performance metrics, ad groups, and running custom GAQL queries.145 npmMIT