gamm
Allows AI agents to read Google Ads accounts freely and propose changes that require human approval via passkey. Provides tools for running Google Ads Query Language queries, listing accessible customers, proposing and applying changes (such as pausing campaigns, setting budgets, managing negative keywords, and adjusting target ROAS), managing rules, and maintaining an audit log of all actions.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
gamm: Google Ads MCP Manager
gamm lets AI agents read Google Ads freely and change it only with a person's approval. It is an MCP server you run yourself. It holds the one Google credential, gives each agent its own key, logs every call, and applies a change only after the approver confirms it with a passkey (Face ID, Touch ID or a security key).
agents ──(HTTPS, private network, per-agent key)──► gamm
├─ every call written to the audit log
├─ read tools ──► Google's google-ads-mcp (unmodified, pinned)
├─ write tools ─► Google Ads API
└─ approval page (passkey)Why
Google's official google-ads-mcp server is read-only. To manage an account with agents you also need writes, and you need them to be safe:
One credential. Agents never hold a Google login. Each gets a gamm key that can be revoked on its own.
Approval that agents can't fake. An agent that controls your browser or shares your network identity still can't produce a passkey assertion with user verification. Approval in chat or in a shared document can be faked.
Specific write tools, no "change anything" tool. Each change is checked against your rules before you see it.
One audit trail. Every call is logged with which key, which agent, when and the arguments, and each change keeps its before and after values.
Related MCP server: Google Ads MCP
How a change works
Propose. An agent calls
propose_change. gamm reads the current values, checks the rules, runs Google's validate-only dry run, and returns an approval link. The approval page shows what will change, worked out by gamm from the live account. The agent's own explanation is shown separately and labeled as the agent's.Approve. You open the link and approve or reject with your passkey. The approval covers that exact version of the change.
Apply. The agent calls
apply_change. gamm refuses if the approval has expired, a freeze window applies, or the account no longer has the values it had when the change was proposed. Then it writes everything in one atomic request and reads it back.Log and judge. Each change comes with a
change_log_rowfor your own change log, andrecord_judgementstores how it turned out.
Tools
Tool | What it does |
| Run a Google Ads Query Language query (Google's tool) |
| List the fields a resource supports (Google's tool) |
| List the accounts the credential can read (Google's tool) |
| Propose one or more changes, applied together |
| Apply an approved change and read it back |
| Status, history and the change-log row |
| Withdraw a change that hasn't been applied |
| Record how an applied change turned out |
| The rules every proposal is checked against |
Google's reference resources (metrics, segments, the API discovery document and release notes) are passed through too.
Changes a proposal can contain:
Kind | Change |
| Pause or enable a campaign |
| Pause or enable a Performance Max asset group |
| Set a campaign's daily budget (unshared budgets only) |
| Set a campaign's target ROAS |
| Add or remove a campaign's negative keywords |
| Add or remove keywords in a shared negative keyword list |
| Set a campaign's final URL suffix (UTM tags) |
| Use or stop using a conversion goal for bidding (account default or one campaign) |
| Add or remove a Performance Max asset group's headlines, long headlines, descriptions or business name |
| Add or remove YouTube videos in an asset group |
| Add or remove sitelinks (account or one campaign) |
| Add or remove callouts (account or one campaign) |
| Set the values of a structured snippet header (account or one campaign) |
| Unlink price, promotion, sitelink, callout or structured snippet assets |
Asset changes only link and unlink; gamm never deletes an asset. Images aren't supported: they need a person to look at them.
Rules
Set in the settings file. Each is optional.
min_target_roas: target ROAS is never set below this.max_budget_change_pct: the largest budget move in one change.max_daily_budget: a ceiling for any campaign's daily budget.allowed_url_hosts: the hostnames new sitelinks may link to. gamm loads each new link itself and refuses it unless it ends at HTTP 200 on one of them.one_open_change_per:campaign(default) oraccount. A change touching the whole account, such as account-default conversion goals or account-level sitelinks, blocks every other open change. Asset group changes count against their campaign.Freeze windows: date ranges, for the whole account or listed campaigns, in which nothing can be proposed or applied.
Approvals expire (48 hours by default) and so do unapproved proposals (7 days).
Rules are checked when a change is proposed and again when it is applied.
Running it
gamm is meant to run alone on a small private host reached over a private network such as Tailscale. See docs/deploy.md for a Proxmox LXC setup. You need:
A Google Cloud project with the Google Ads API enabled and an OAuth client.
Python 3.12+ and uv.
An HTTPS address for the approval page (passkeys require it).
Read docs/security.md for what gamm does and doesn't protect against. docs/updating.md covers upgrading Google's server and the Google Ads API version.
Development
uv sync
uv run pytestSee docs/development.md.
License
Apache 2.0. gamm runs Google's google-ads-mcp (also Apache 2.0) as a separate, unmodified program.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Manage Google, Microsoft, ChatGPT and Meta Ads safely: previewed, logged, revertible changes.
- AdCopilotDeprecatedcloud.adcopilot
Google Ads, GA4, Search Console and Tag Manager for AI assistants. Every change is proposed first.
Hosted Google Ads MCP for Claude and ChatGPT. Preview every write. No developer token.
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
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.72 npmMIT
- 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-
- FlicenseNot gradedqualityCmaintenanceConnects AI assistants to Google Ads, Meta Ads, ChatGPT Ads, TikTok Ads and LinkedIn Ads so users can query live campaign performance, budgets and audiences in the account's own currency and prepare changes as proposals that only take effect after explicit approval. Reads run immediately, while every write is staged as an approvable proposal with before/after values, and newly created campaigns, ad sets and ads start paused.1-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to read and safely modify Google Ads campaigns, budgets, statuses, end dates, and negative keywords by diffing a reviewed desired-state file against live account state under policy-defined caps and single-use plan IDs. A scheduled guard can pause campaigns on spend thresholds while credentials and keys remain local.1,330 PyPIApache 2.0