safe-mcp sign in

For the person who runs the ads and answers for the numbers.

You already have an agent that can read Google Analytics and Search Console and could touch the ads account. You could let it. The problem is that nobody can say on Tuesday what it did on Monday night, or whether it helped. Treat it the way you would a new hire on the marketing team: a number to be judged by, keys to some doors and not others, a logbook, and feedback. Here is what that looks like across one week.

Everything below is an example. Nothing on this page is a customer.

Monday. Give it a number.

A person on the team is judged by something: cost per lead, organic clicks to the signup page, demo requests. You declare that number as the goal, in the app or by answering the agent when it asks. The gateway reads it at once for a baseline and keeps reading it every twelve hours.

Ads move in days and rankings in weeks, so the goal carries a settle time. Credit for a change lands in the interval where the effect shows, not the one where the button was pressed.

a goal, as declared
titlecost per lead under €58
directiondecrease
measurementmarketing_get_report · read-only
settle3 days
baseline71.20 · measured on declare

Example, not real data.

Tuesday. Let it read everything from day one.

Every new account starts with Marketing Reporting, our server for Google Analytics 4, Search Console and Bing Webmaster. Each person signs in with their own Google account, with read scopes only. From then on the agent can pull sessions by landing page, queries by position, a funnel from session to purchase, or last month against the month before, and ask whether a difference in conversion rate is more than noise.

Claude, Codex, Cursor and ChatGPT connect with one URL. What the agent pulls is in the project's log, readable by the team, exportable whenever you want it.

what the reporting server answers →

what it can pull
ga4sessions, users, engagement, revenue, conversions, by up to nine dimensions
search consoleclicks, impressions, CTR, position, by query and page
bingclicks, impressions, position, curated fields
funnelsordered GA4 steps, or landing-page funnels across all three
comparetwo date ranges, with a significance test on a rate

Defaults as shipped.

Wednesday. Decide what it may change, and by whose rule.

The ads account is where the agent can do damage, so that is where the rule is written. Connect your ads server as a custom entry, then narrow it with a preset: one customer account pinned into every call, pause and budget tools allowed, delete tools absent from the catalog. Assign that preset to the person whose agent will run overnight.

The agent has no permissions of its own. It runs on that person's token and gets that person's surface. Revoke the token and it stops at the next call.

presets, assignments and tokens →

who may do what
whoserverpreset
user maria@acme.coadspause-and-budget
group marketingadsread-only
group marketingreportingfull

maria's agent may pause campaigns and move budgets on one customer account. everyone else in marketing reads. nobody deletes.

Example, not real data.

Thursday. The first time it is told no.

The agent wants to pause brand search again. The last two times that was done under this goal, cost per lead went up in the intervals that followed. Instead of running, the call comes back refused with that evidence, and the agent is told to put it to Maria. A colleague would say: we tried that in March. This is the same, with the dates.

Maria can say yes. Resend the same call with the acknowledgement and it runs, stamped in the log as acknowledged. The brake is an observation, not a verdict, and it never locks anyone out.

the brake, and its two limits →

refused evidence gate

"ads.pauseCampaign" has been called this way before on this goal. The goal moved AWAY from its target over 2 of the 3 measurement interval(s) those calls sat in. Nothing about this call is invalid. This is disconfirming evidence from this account's own history. Put it to the user and let them decide.

acknowledgedEvidence: "e3f19c4a"

Example, not real data.

Friday. What the week taught it.

Every write the agent made sits between two readings of cost per lead, and shares that interval's movement. By Friday those observations are rules it is handed before it acts: do, avoid, check, expect, each with a count and a date. A model writes the sentence; the count and the date come from the log.

A new hire learns the account this way too, except that theirs is in their head and this one is in a log you can read. Where there is not enough history the answer is "nothing yet", with the threshold that was not met.

what it is told before it acts
avoid · strongpausing brand-search on this goal

cost per lead up · 12 actions (last 2026-08-14) · likely mechanical

do · moderatelowering bids on the weekend campaigns

cost per lead down · 9 actions (last 2026-08-27) · plausibly causal

check · suggestiveraising budget on weekends

confounded on review · association, not causal

nothing yetchanging bid strategy

observed 2 times · needs 3 distinct decision-days

observational, not causal

Example, not real data.

What it will not do.

no ads server yetthe library has reporting; the ads server is yours to connect as a custom entry
no changes upstreamnothing in Google Analytics, Search Console or Bing is ever modified
no dashboardsthe history page and an export; the reports live in your client's conversation
no causationevery rule is a followed-by, stated with its count; a controlled test is still yours to run
no instant answersa goal with a three-day settle time has nothing to say for three days

Start on a Monday.

Sign in with Google. A account and a project with Marketing Reporting exist at once; the goal is the first thing to declare.