COMPARE Write path · read path

AdRails vs Google's read-only Ads MCP vs write servers

AdRails is the write path beside Google's official read-only google-ads-mcp, which answers ad-hoc GAQL exploration and never writes. AdRails runs locally over stdio, takes changes only through a reviewed desired-state file, and enforces caps in a policy file its own tools cannot write. Generic write-capable MCP servers differ from vendor to vendor: check each rail below before trusting one with spend.

Last reviewed with AdRails 0.2.2

The three things being compared

One writes, one reads, one is a category.

ADRails

Local write path

Apache-2.0, local MCP server for Google Ads, JSON-RPC 2.0 over stdio, running on your machine against your own Google Cloud project and credentials. Writes go through plan → validate → commit.

GOOGLE

Official google-ads-mcp

Read-only. It answers ad-hoc GAQL exploration and never writes. Both servers speak JSON-RPC over stdio, so one .mcp.json entry each runs them side by side in the same client.

GENERIC

Write-capable MCP servers

A category, not a specific product. What each one does about caps, plan IDs, validation, git review and a spend guard is unknown here, so treat every cell as "verify before use".

Feature table

Row by row, in plain words.

A dash means the fact is not stated here. That is not a "no" — it means check the other product's own documentation.

AdRails 0.2.2 against Google's read-only Ads MCP and generic write-capable MCP servers.
PropertyAdRailsGoogle's official google-ads MCPGeneric write servers
Runs on your machineYes, nothing is hosted——
TransportJSON-RPC 2.0 over stdioJSON-RPC over stdio—
Reads campaigns, status, search termsYes (adsops_campaigns, adsops_status, adsops_terms)Ad-hoc GAQL exploration—
Writes to the accountYes, through plan → validate → commitread-only (no writes)Only if it exposes write tools — verify
Change expressed as a git-committed desired-state fileYes——
Dry-run diff against live stateYes, adsops_plan writes nothing——
Single-use, expiring plan_id bound to the planYes——
Caps in a policy file no AdRails tool can writeYes——
Validate-only pass before every commitYes——
Refuses to act on an uncommitted state fileYes, require_clean_git defaults to true——
Blocks exposure increases when the guard heartbeat is staleYes, when max_guard_age_min is set——
Pause-only scheduled spend guardYes, guard-all every 15 minutes——
Enables campaigns by defaultNo, allow_enable defaults to false——
Reconciles a timed-out commit instead of retryingYes——
Hosted SaaS optionNone, ever——
LicenceApache-2.0——
PriceFree core, no subscriptions——
Why there is no hosted column for AdRails. AdRails is designed to run only on the customer's own machine, with their own Google Cloud project, so it is never hosted. Install from GitHub: pipx install git+https://github.com/antonioac1/adrails
Why the split exists

Reads and writes want different trade-offs.

Exploration is safe to run freely and awkward to constrain, so the official server owns it. A write is where money moves, so AdRails makes every write pass a diff, a validate-only call to Google, an account lock, an audit line, and a commit that quotes the exact plan the agent was shown. In practice: the agent reads with the official server, proposes a change to a desired-state or policy file, and applies it through adsops_plan / adsops_apply.

When NOT to use AdRails

If any line below describes you, a different tool — or no tool — is the better answer.

  • You want a hosted service or an API to call. AdRails does not host anything and does not proxy Google calls. You need a machine, a Python runtime and your own credentials.
  • You only need ad-hoc GAQL exploration. Use Google's read-only server; AdRails is the write path.
  • You want a platform-level billing control. AdRails is a threshold with automatic pause attempts, not billing control. Keep platform-side billing limits as the real limit.
  • Your machine sleeps and you cannot schedule the guard. The guard only acts when it is scheduled and the machine is awake. A chat-session MCP process is not a monitor.
  • Your agent has shell access as the same OS user. Such an agent can edit files or call Google directly. AdRails constrains the tool calls it serves, not the machine underneath.
  • You need to remove negative keywords or re-enable campaigns routinely. Negatives are append-only, and enabling needs allow_enable turned on in the policy file.
  • You need a pip install from PyPI today. The PyPI release is coming soon; install from GitHub meanwhile.
FAQ

Straight answers.

Does AdRails replace Google's official google-ads MCP?

No. Google's server answers ad-hoc GAQL exploration and never writes; AdRails is the write path. They run side by side in the same MCP client, one stdio entry each.

Is AdRails hosted?

No, and it is never hosted. It runs on your machine against your own Google Cloud project and credentials, and the only endpoint it talks to is the Google Ads API.

Can I run AdRails and another write-capable MCP server on the same account?

AdRails takes account locks (lease files in lock_dir) so two AdRails writers cannot collide, but that lock covers AdRails processes and not other software. Whether another write-capable server is safe on the same account depends on what that server does, so check its own guardrails before trusting it with spend.

Install from GitHub today. pipx install git+https://github.com/antonioac1/adrails — the console script is adsops, the server runs as python3 -m adsops --config /absolute/path/config.json, and the PyPI release is coming soon. Free core · Apache-2.0 · no AdRails account

Read the rails.
Then decide.

Open source, Apache-2.0. Your keys, your caps, and the limits written down.