COMPARISON AdRails 0.8.0

AdRails vs trakkr: two ChatGPT Ads MCP servers

Both are released open-source ChatGPT Ads MCP servers (trakkr openai-ads-mcp v0.1.7, MIT; AdRails 0.5.0, Apache-2.0). trakkr leads on breadth and read-only reporting; AdRails on spend governance. AdRails' live verification, verbatim: "read paths, live spend reads, the guard and validation ran against a real OpenAI Ads account in read-only mode on 2026-11-06; creates, image upload, activation and the conversion/audience commits are tested offline but have NOT yet run against a live account."

Last reviewed 2026-11-06 with AdRails 0.8.0

Short answer

Which should you use today?

Both are released and both are open source. They are not solving the same problem, so pick by what worries you more: a missing capability, or a campaign that spends past your cap at 2am.

trakkr — when breadth wins

trakkr's openai-ads-mcp v0.1.7 (MIT) is the wider toolset today: 27 tools in 8 groups covering account, campaigns, ad groups, ads with creative upload, insights, audiences with geo search, conversions, and workflow helpers. It installs via npx, uvx, Docker, Claude Desktop, Cursor, Codex or the MCP Registry, and it runs a hosted Streamable HTTP endpoint that is read-only. trakkr.ai/openai-ads-mcp, read 2026-11-06

  • Best fit. Agencies that want to touch most of the account from a chat client and report from a hosted endpoint without a local install. vendor page, read 2026-11-06
  • Built-in safety. OPENAI_ADS_MCP_READONLY=1 hides write tools; new campaigns, ad groups and ads are created paused; a budget ceiling env var defaults to $100 and budget tools reject values above it unless confirm_budget is true. vendor page, read 2026-11-06

AdRails — when the spend matters

AdRails 0.5.0 (Apache-2.0) runs on your machine with your credentials and puts every ChatGPT Ads write through one door: committed desired state, adsops_openai_plan, then an apply that is validate-only unless a single-use plan_id commits it. It ships 16 adsops_openai_* tools out of 66. selftest: all pass, 2,704 checks

  • Best fit. Teams that need caps in a file the agent cannot edit, a cumulative spend ceiling, and a human approval before any campaign activates. claims ledger O5, O6, O7
  • Trade-off. It is a local server, not a hosted endpoint, and its created/activated paths are offline-tested rather than live-tested. claims ledger O17

Running both is a legitimate configuration: trakkr's hosted endpoint answers reporting questions read-only while AdRails holds the credentials that are allowed to write. See the section below on running both.

SIDE BY SIDE

How do trakkr and AdRails compare for ChatGPT Ads?

trakkr facts are from its own page and repository, read 6 November 2026. "Not stated" means the page does not say, not that the feature is missing. AdRails facts cite its claims ledger (O1-O19).

trakkr openai-ads-mcp v0.1.7 against AdRails 0.5.0 ChatGPT Ads, 6 Nov 2026.
Propertytrakkr openai-ads-mcpAdRails 0.5.0
Status (6 Nov 2026)Released: v0.1.7 on npm, PyPI and the MCP RegistryReleased: AdRails 0.5.0 on PyPI and the MCP Registry. Read paths, spend reads, the guard and validation verified on a live account (read-only); creates, uploads and activation not yet run live (O17)
LicenseMITApache-2.0
Where it runsHosted Streamable HTTP endpoint (read-only) or a local packageLocal only, on your machine with your own keys
Coverage27 tools: account, campaigns, ad groups, ads and creative upload, insights, audiences and geo search, conversions, workflow helpers16 tools (adsops_openai_*): account, status, insights, geo lookup, plan, apply, guard, image upload, brand, conversions setup, test event, ad check, campaign drafts, A/B report, send conversions, audiences
Read-only modeYes: OPENAI_ADS_MCP_READONLY=1 hides write toolsPer-account mode: disabled, read_only (reads, plans, validate-only, pause-only guard) or live
New items created pausedYesYes (O3)
Budget limitOPENAI_ADS_BUDGET_CEILING_USD, default $100; budget tools reject higher values unless confirm_budget is truePolicy file the agent's tools cannot edit: max daily and lifetime budget, max bid, allowed domains, required UTM (O5)
Cumulative spend capNot stated on its pagePer campaign and optionally per account, assuming 2x daily overdelivery (O6, O9)
Dry run / validation before writingNot stated on its pagePlan diff with a single-use plan_id; apply is validate-only by default, with the Bulk API validate_only when enabled
Human approval to go liveAdvises reviewing your MCP client's approval settingsActivation needs a single-use human approval block bound to the campaign (O7)
Scheduled spend guardNot stated on its pagePause-only guard; also pauses budget raises and uncapped bids made outside AdRails and orphaned campaigns; fails closed if spend can't be read (O10-O13)
Retry safetyNot stated on its pageEvery create carries an Idempotency-Key (O4)
Ad copy checksNot stated on its pageadsops_openai_ad_check: title 3-50, body ≤100, https URL, images, allowed domains, required UTM, duplicates (O19)
A/B testingbulk_ab_test_hints (context hints)adsops_openai_ab_report: leader with 95% intervals and Bonferroni-corrected comparisons (O19)
Conversionsmanage_conversions and send_conversionsPixel + lead_created setup and test event (O15); send_conversions from CRM rows, hashed locally, validate-only unless commit (O19)
Audiencesmanage_audienceadsops_openai_audience: hashed customer lists, plan-only unless commit (O19)
API key handlingPer request or env; "does not store or log API keys"Per ad account from 1Password, a file or env; never in outputs, audit or meter (O16)
The released one

What does trakkr's OpenAI Ads MCP do?

trakkr's server is a genuine, installable ChatGPT Ads integration today, described on its own page as an independent Trakkr project rather than an official OpenAI product. Everything below is vendor-stated and may change.

  • Twenty-seven tools in eight groups. Account, campaigns, ad groups, ads (including creative upload), insights, audiences (including geo search), conversions (manage and send), and workflows — build_campaign, draft_context_hints and bulk_ab_test_hints. vendor page, read 2026-11-06
  • Many ways in. npx, uvx, Docker, Claude Desktop, Cursor, Codex and the MCP Registry, plus a hosted Streamable HTTP endpoint that is read-only, and a local package where write tools are opt-in. vendor page, read 2026-11-06
  • Read-only by flag. Setting OPENAI_ADS_MCP_READONLY=1 hides the write tools entirely, which makes it usable as a pure reporting client. vendor page, read 2026-11-06
  • Creates start paused. New campaigns, ad groups and ads are created paused, so a bad agent draft does not start serving on its own. vendor page, read 2026-11-06
  • A budget ceiling you configure. OPENAI_ADS_BUDGET_CEILING_USD defaults to $100 and budget tools reject values above it "unless confirm_budget is true". vendor page, read 2026-11-06
  • Key handling as documented. API keys can be supplied per request or through the environment, and the page states it "does not store or log API keys". vendor page, read 2026-11-06
  • Approvals, validation, audit, lifetime caps, scheduled guard. Not stated on its page as of 6 Nov 2026; instead the page advises reviewing your MCP client's approval settings. Treat that as a gap in documentation, not proof of absence. vendor page, read 2026-11-06

For a first ChatGPT Ads experiment, trakkr's coverage is hard to beat: you can inspect insights, upload creative, manage audiences and stand up a campaign from a single chat session, with paused creates and a dollar ceiling as the two brakes. The brakes are real, but they are configuration-level — a ceiling value and a client approval prompt — not a governance layer with a signed approval trail.

Spend governance

What does AdRails add for ChatGPT Ads?

AdRails brings the same plan → validate → commit door it uses for its Google Ads work, then adds controls aimed at one question: what stops an agent from spending money you did not approve?

  • Caps in a policy file tools cannot write. Maximum daily and lifetime budget, maximum bid, allowed destination domains, required UTM tags, and no archiving unless allowed. claims ledger O5
  • Cumulative spend caps. A cap per campaign and optionally per account, checked alongside the daily budget so a month cannot quietly run past the number you approved. claims ledger O6
  • A human approves activation. Activation needs a single-use approval block bound to that campaign, plus a fresh guard heartbeat. An agent can stage everything; it cannot switch delivery on by itself. claims ledger O7, O8
  • Room-under-cap maths that assumes 2x delivery. The check assumes the platform may deliver up to twice the daily budget, so normal overdelivery does not silently breach the cap. claims ledger O9
  • A pause-only guard. adsops_openai_guard pauses when lifetime spend reaches the pause point (cap minus 2x-overdelivery headroom), when today's spend is anomalous, or when live budgets and bids exceed policy. It never activates or raises anything, also pauses budget raises and uncapped bids made outside AdRails, pauses orphaned campaigns, and fails closed when spend cannot be read. claims ledger O10, O11, O12, O13
  • Idempotent creates. Every create carries an Idempotency-Key, so a retry cannot duplicate a campaign or ad. claims ledger O4
  • Everything is born paused. New campaigns, ad groups and ads are created paused and stay that way until the approval path clears. claims ledger O3
  • Conversion plumbing you can test first. conversions_setup ensures a web pixel and a lead_created event setting exist, and test_event sends one validate-only event, so you can confirm the wire is live before you spend into it. claims ledger O15
  • Key hygiene. The API key never appears in tool outputs, the audit chain or the usage meter. claims ledger O16
  • Creative and campaign checks before submit. ad_check enforces chat_card limits (title 3-50 characters, body up to 100, https URL up to 2048, 1 or 4-6 images), policy domains, required UTM tags and duplicates; draft_campaign turns a brief into a paused, capped desired state; ab_report gives 95% intervals with Bonferroni-corrected comparisons and recommends pausing only significantly worse ads; send_conversions and audience hash emails, phones and names locally. selftest: qa_openai_ads 160/0

Live verification, exact wording (claim O17): "read paths, live spend reads, the guard and validation ran against a real OpenAI Ads account in read-only mode on 2026-11-06; that live run found and fixed an insights rule the offline mock missed. Creates, image upload, activation and the conversion/audience commits are tested offline but have NOT yet run against a live account."

Risk

Why do spend controls matter more on ChatGPT Ads?

A new ad surface gives you no operating history to lean on, which means the guardrails have to be explicit rather than learned. Four concrete reasons the governance layer earns its place.

  • Your daily budget is not the ceiling. Platforms can deliver up to twice the daily budget. AdRails' cap check assumes exactly 2x (O9); if your own maths assumes 1x, you are budgeting for a day that will not happen.
  • Conversion setup decides what the system learns. If the pixel and the lead_created event are missing or duplicated, spend optimises toward a signal you never verified. AdRails ships a setup step and a validate-only test event for that (O15).
  • Activation is the moment money starts moving. In AdRails, activation requires a single-use approval block bound to the campaign and a fresh guard heartbeat (O7, O8) — a staging agent cannot flip the switch, and a stale guard blocks the commit rather than waving it through.
  • The guard has to work when the API is unhappy. A guard that shrugs when spend cannot be read is decoration. AdRails' guard fails closed (O13) and pauses budget raises and uncapped bids that were made outside AdRails (O11), including orphaned campaigns (O12).

trakkr covers the two basics that catch most accidents: creates are paused by default, and a budget ceiling rejects explicit values above it unless you override. That is a sensible floor. AdRails is aimed at the layer above it — approvals, cumulative caps and a pause-only guard that keeps working when the agent is not the one calling it.

Together

Can I run both?

Yes, and for a lot of agencies that is the practical answer rather than a compromise.

The two servers do not fight over the account as long as you decide which one writes. A workable split: point reporting and exploration at trakkr, ideally through its hosted read-only endpoint or with OPENAI_ADS_MCP_READONLY=1 set locally, and point the agent that makes changes at AdRails, where every write is a plan with a single-use plan_id and an approval gate for activation.

  • Reporting on one side. trakkr's breadth — insights, audiences, conversion tooling, workflow helpers — makes it a good reader and a good drafter. vendor page, read 2026-11-06
  • Writes on the other. AdRails holds the key that may change budgets and statuses, with policy caps and a guard that pauses rather than enables. claims ledger O5, O10
  • No licence conflict. trakkr is MIT, AdRails is Apache-2.0, and both run locally or as you prefer. vendor page, read 2026-11-06; AdRails release notes

If you only want one server today and you need to do everything — audiences, creative upload, A/B context hints — start with trakkr. If you only want one server and the account has a real budget on it, start with AdRails and accept narrower coverage while keeping a hard stop on spend. Background on the platform itself is at the ChatGPT Ads hub, and the same governance argument for Google's ecosystem is at Google Ads MCP safety.

Limits

What neither tool can prevent

Two failure modes sit below the MCP layer, and no server-side policy file reaches them. Knowing where your guardrails end is part of running them honestly.

Platform overdelivery

AdRails does not bound what the platform delivers. Delivery can run up to 2x the daily budget, and the cap check simply assumes that when it computes room under the cap. trakkr's ceiling is likewise a client-side rejection of a value, not a platform setting.

Practical consequence: set caps low enough that a 2x delivery day is still a number you can defend, and read live spend rather than assuming yesterday's budget held.

An agent with your shell

An agent with shell access as the same OS user can bypass local rails unless you run the hardened install with a separate OS user. That privilege-boundary item is still open in AdRails' threat model, and AdRails' own enterprise documentation says so.

Practical consequence: run the server under its own user, keep the policy file out of the agent's write path, and treat human approval as a separate channel from the chat the agent is in.

Both statements come from AdRails' published limits: the 2x delivery assumption is baked into the cap check (claim O9), and the same-OS-user bypass is the open privilege-boundary item in the threat model. Full comparison set at the compare index.

FAQ

Straight answers.

Is AdRails' ChatGPT Ads support actually released?

Yes. AdRails 0.5.0 is on PyPI, on the MCP Registry as dev.adrails/adrails 0.5.0, and tagged as GitHub release v0.5.0, with 16 adsops_openai_* tools. Its selftest reports 2,704 checks all passing and the qa_openai_ads suite 160/0. The scope of the live run is narrower: read paths, live spend reads, the guard and validation ran against a real OpenAI Ads account in read-only mode on 2026-11-06; creates, image upload, activation and the conversion/audience commits are tested offline but have not yet run against a live account (claim O17).

Does trakkr have an approval queue or an audit log?

Not stated on its page as of 6 Nov 2026. What trakkr does document: a read-only environment flag that hides write tools, new campaigns, ad groups and ads created paused, and a budget ceiling environment variable (default $100) that rejects values above it unless confirm_budget is true. Its page instead advises reviewing your MCP client's own approval settings. Validate/dry-run, a tamper-evident audit log, a cumulative spend cap and a scheduled guard are likewise not stated there as of that date.

Can both servers use the same OpenAI Ads API key?

Both authenticate to the OpenAI Ads API with your credentials. trakkr accepts a key per request or from the environment and states it does not store or log API keys. AdRails keeps the key out of tool outputs, the audit chain and the usage meter (claim O16). Running both against one account works: point trakkr at its hosted read-only endpoint for reporting, and let AdRails hold the key that writes.

What happens if an agent tries to push a budget above the cap?

On AdRails the plan is blocked before commit: caps live in a policy file the tools cannot write (O5), the cumulative cap is checked separately (O6), and adsops_openai_guard pauses budget raises and uncapped bids made outside AdRails (O11), failing closed when spend cannot be read (O13). On trakkr, budget tools reject values above the ceiling environment variable unless confirm_budget is true.

Is a policy file really different from an environment variable?

They fail differently. AdRails' caps sit in a founder-owned policy file that MCP tools have no write path to (claim O5), and the guard reads live budgets and bids against it (O11). trakkr's ceiling is an environment variable with a documented confirm_budget override, which is a simpler control to operate. Neither is a platform limit, so keep your own alerting on top of either.