Camberstack: Google Ads

io.camberstackv0.1.0Updated Oct 1, 2026

Google Ads MCP that acts: finds wasted spend, applies only the changes you approve, undoes them.

VerifiedStreamable HTTPWeb executableBusiness & CommerceData & Analytics

Overview

AI-generated overview

Lets an assistant audit Google Ads accounts, propose fixes for wasted spend, and apply only approved changes that can be undone.

What it does
Connects an MCP client to Google Ads so the assistant can list reachable accounts including MCC client accounts, summarize spend and conversions per campaign, and run read-only GAQL queries. It finds wasted spend by checking conversion tracking, campaigns with no conversions, costly search terms, and low-intent patterns, then returns ready-to-propose negatives. Changes are resolved against the live account and dry-run with Google before being stored as a proposal with a plain-English summary; applying a stored proposal records each change's inverse so it can be reversed.
When to use it
Useful when you manage Google Ads spend and want an assistant to diagnose wasted budget and prepare concrete changes for review. Suited to users who want a human approval step before anything is modified and the ability to undo applied changes.
Requirements
Remote endpoint at camberstack.io over streamable HTTP; no local runtime needed. Sign-in goes through Google OAuth for adwords and openid email scopes. A free plan allows unlimited diagnosis and three applied changes; Pro is $49/mo. Self-hosting needs Node.js and environment variables such as ENCRYPTION_KEY, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_ADS_DEVELOPER_TOKEN and BASE_URL.
Before you install
Applying a proposal writes to the live Google Ads account: it can add negative keywords, pause or enable campaigns, ad groups or keywords, and set a campaign daily budget. Enabling a campaign and more-than-doubling a budget are flagged in the proposal summary. Proposals are the user's own, un-applied and under 24 hours old. Self-hosting stores Google refresh tokens encrypted under ENCRYPTION_KEY; leaking that key exposes stored Google tokens. Pro upgrade links involve Stripe billing.

Installation

In SourceWeft

  1. Open Camberstack: Google Ads in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "google-ads": {
      "type": "http",
      "url": "https://camberstack.io/mcp"
    }
  }
}

README

Camberstack: a Google Ads MCP server that acts

Connect Google Ads to Claude, ChatGPT, Cursor or any MCP client. Your AI checks conversion tracking, finds where the budget goes with nothing to show for it, and proposes fixes. Nothing changes in the account until you approve a specific proposal, and every applied change can be undone.

Hosted: https://camberstack.io/mcp (free plan: unlimited diagnosis + 3 applied changes; Pro $49/mo unlimited). Setup: https://camberstack.io/#setup

Tools

toolwrites?what it does
list_accountsnoevery account the login reaches, including client accounts under a manager (MCC)
account_overviewnospend, conversions, cost per conversion per campaign
find_wasted_spendnotracking check → campaigns with no conversions → search terms over their campaign's cost per conversion → low-intent patterns (free, jobs, how-to, login) that never converted in that campaign → keywords to review. Returns ready-to-propose negatives
run_gaqlnoany read-only GAQL SELECT
propose_changesnoresolves changes against the live account, dry-runs them with Google (validateOnly), stores a proposal with a plain-English summary
apply_changesyesapplies a stored proposal (the user's own, un-applied, under 24h old); records each change's inverse
undo_changesnobuilds the reversing proposal for an applied one
billingnoplan, free applies left, and a personal upgrade or manage-billing link
discard_proposal, change_history, disconnect

Writes are limited to: add negative keywords, pause/enable a campaign, ad group or keyword, set a campaign's daily budget (never a shared budget). Enabling a campaign and more-than-doubling a budget carry a ⚠ line in the proposal summary. No campaign creation, bid strategy changes or deletions of anything the user built.

How auth works

Camberstack is an OAuth 2.1 authorization server for MCP clients (dynamic client registration, PKCE). Its /authorize sends the user to Google for adwords + openid email. The Google refresh token is stored AES-256-GCM encrypted and never leaves the server. The MCP client gets Camberstack's own tokens, which are stored only as SHA-256 hashes.

Run it

bash
npm ci && npm testENCRYPTION_KEY=$(openssl rand -hex 32) \GOOGLE_CLIENT_ID=… GOOGLE_CLIENT_SECRET=… GOOGLE_ADS_DEVELOPER_TOKEN=… \BASE_URL=https://your.host npm run dev
env
ENCRYPTION_KEY32 bytes, hex or base64. Losing it only forces users to reconnect; leaking it exposes stored Google tokens
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETOAuth client from a dedicated Google Cloud project with Google Ads API access. Redirect URI: <BASE_URL>/oauth/google/callback. Unset = pages only, sign-in reports "not open yet"
GOOGLE_ADS_DEVELOPER_TOKENsent when set
BASE_URLpublic origin, the OAuth issuer (default https://camberstack.io)
DATA_DIRSQLite location (default ./data)
FREE_APPLIES / PRO_EMAILSapplied proposals on the free plan (default 3; undo never counts) / emails treated as Pro
STRIPE_SECRET_KEY / STRIPE_PRO_PRICE_IDPro subscription via Stripe Checkout; unset = no upgrade links

scripts/try-account.ts runs the read tools against a real account from an existing refresh token, skipping OAuth. Use it for dogfooding.

License

MIT

Source: README.md at commit 1e73d28

Tools

0
Tool metadata has not been indexed yet.

Version history

1
  1. v0.1.0LatestOct 1, 2026