guide · running it safely

Running paid media from an AI agent without losing control

The agent proposes changes, and a named person approves anything that spends money.

Pointing an AI agent at a paid media account is not risky because the model might be wrong about a headline. It is risky because the interfaces underneath it were built for a person who can read a confusing response and stop. The four controls that actually matter are: the agent uses the same routes, tenant boundary and approval records as the browser, so there is no weaker second path; its authority is a revocable, versioned mandate with an explicit money ceiling and an expiry rather than an API key; consequential actions require a single-use approval bound to the exact bytes a human approved, and fail closed when the request does not match; and an ambiguous supplier response stops the run and waits for a person, rather than being retried. On AdBuyMCP eleven consequential operations have no agent tool at all, which is a stronger guarantee than a permission the agent is asked not to use.

Free, with no card. We read your homepage, draft who buys from you and show your monthly price before you join the waitlist. Nothing is bought until you've approved the plan and the ads.

By James Rooney Updated

Human-only operations
11, with no agent tool
Authority
Mandate: ceiling, expiry
Approval
Works once, for the exact action
Length
11 min read
sources2 linked and dated
On this page

key points

Remember these points if you read nothing else

These are the points most likely to change your decision, and the full guide follows below.

  1. 01

    The strongest control is an operation with no tool behind it, because the agent cannot reach it at all.

  2. 02

    An API key grants access without limiting what an agent may spend or do. A revocable mandate that enumerates actions, currency, ceiling and expiry sets those limits.

  3. 03

    Approvals should bind to a digest of the exact action. An approval for something that merely resembles the request is not an approval.

  4. 04

    Retrying is the most expensive failure, because an agent that cannot read a supplier's response and tries again can create a second live campaign that nobody knows about.

  5. 05

    A human's web session must never be usable as an agent credential. If it is, the agent inherits everything the person can do, including approving its own work.

01

The risk sits in the interface under the model

Most discussion of agent risk in advertising is about output quality: will it write a bad headline, will it pick the wrong segment. Those are real and they are recoverable. The unrecoverable failures are operational, and they come from the fact that advertising APIs were designed for a human operator who can look at a confusing response, frown, and go and check before pressing anything else.

Given a response it cannot parse, an agent's default behaviour is to try again, and a retried activation against a vendor that did in fact accept the first one produces two live campaigns spending in parallel. That is not a hypothetical: it is the ordinary failure mode of any distributed system without idempotency, and it costs money at the exact rate the campaign was budgeted to.

So the design questions worth asking before you connect anything are boringly infrastructural. What can it reach? Whose authority does the call carry? What happens when a supplier answers ambiguously? Who can undo it?

02

Check for a second execution path

The first thing to establish about any agent integration is whether the agent's route into the system is the same one the user interface uses. Two paths mean two sets of rules, and the second set is always weaker, because it was written later and by someone thinking about tool ergonomics rather than about money.

In AdBuyMCP each of the 105 MCP tools is a thin wrapper over exactly one REST endpoint, the same endpoint the browser calls, so both routes share the same tenant boundary, spending check, approval record and audit trail. An agent can do nothing through MCP that a person could not do in the product, and nothing that a person did not authorise, because there is no second execution path to hold different rules.

Because the tool surface is a subset of the API rather than a mirror of it, operations can be omitted from it entirely. Eleven consequential operations have no MCP tool at all, among them resolving an approval, replacing or revoking a mandate, closing a mission, verifying a supplier dossier, and issuing or revoking a live execution grant. The API keeps more for people than this list. Supplier booking confirmations, managed stops, spend-lock resolution, provider-spend reconciliation, brand-lift purchases and identity-cohort imports are human-only as well, and no tool reaches any of them. An operation with no tool is a stronger guarantee than a permission the agent is asked not to exercise, because there is nothing to exercise.

03

Authority is a mandate you can revoke

An API key cannot limit what an agent does. The agent gets everything the key allows or nothing, and the only way to stop it is to revoke the key, which takes the integration down with it.

The alternative is to make authority a durable object. Here the chain is mission, mandate, run, ordered steps, decision and evidence. A mission is a named objective owned by your workspace, and agents cannot close their own. A mandate is a revocable, versioned grant enumerating exactly which actions are allowed, in which currency, for how long, and up to what money ceiling. Work proceeds as ordered steps against that mandate, each recorded, and a step cannot be skipped or a run silently restarted.

Two properties of that model are worth copying whatever platform you are on. Authority is time-bounded, so an agent that is forgotten about stops being able to act rather than continuing indefinitely. And it is versioned and revocable as data, so withdrawing authority is an ordinary operation with an audit trail rather than an emergency credential rotation.

04

Approvals bind to the exact action

The weakest common form of human-in-the-loop is a confirmation dialogue: the agent asks, a person says yes, and the agent then does something. What it actually does is not necessarily what was described, and the gap between the two is where the loss lives.

The stronger form binds the approval to a digest of the exact action. A human approves a specific set of bytes; the approval is single-use; and when a request arrives, it is checked against that digest. If it does not match, it fails closed rather than proceeding on the strength of something that looks similar. That converts "the agent did something I did not expect" from a plausible incident into a structural impossibility.

Approving evidence should not enable spend: on this platform, enabling spend on a staged live line is a separately granted action that an approval alone cannot perform, so a single yes cannot cascade into money moving. And an agent credential must not be able to resolve a human approval at all: on AdBuyMCP an agent that tries to approve its own work receives a 403 response that requires a human.

05

Whose credential the agent uses

The most consequential design decision in the AdBuyMCP server is a refusal: a human's ordinary web session cannot be forwarded as an agent's credential. The attempt fails with a 401 rather than quietly working.

If a logged-in person's session can be handed to an agent, the agent inherits everything that person can do, which in most systems includes approving work. Every guarantee above evaporates at that point, and it evaporates silently, because from the server's point of view a person is acting.

The implementation is that every request carries a verified actor class that cannot be changed by adding or removing headers. Human sessions are classified as human and web; the MCP client's fixed source marker makes the human-plus-agent pairing fail rather than take the browser path. An agent credential must be either a configured service token or a verified delegated token carrying a signed agent claim and a non-empty verified client identifier. Actor, source and client attribution are then persisted on every action, so the audit log answers "who did this" rather than "which account did this".

06

Agents cost money when a step fails

Poor failure handling costs more than a poor happy path, because it can leave two live campaigns spending where you meant to launch one.

The rule that prevents the expensive version is that an ambiguous outcome stops the run. Where a supplier's response cannot be read confidently, the run raises an exception, halts, and waits for an explicit human resolution before resuming. It is never blindly retried. That single rule prevents the specific incident this whole design exists around: an agent that cannot tell whether an activation succeeded, trying again.

Underneath it sits the mechanism that makes retry safe when retry is right. Every outbound side effect writes a committed provider-attempt record before the call and settles it afterwards, keyed by a deterministic idempotency token that is passed to the vendor and reused on retry. After a crash, orphaned attempts are reconciled first: sandbox orphans close automatically, and live media or creative orphans move the line to reconciliation-required rather than being retried or assumed failed. You are given the vendor, the operation and the token, so the question "did this actually happen?" is answerable by checking rather than by guessing.

An expired or blocked supplier authority also raises a spend lock before any scheduler work runs, sends a single incident-bound emergency pause, and refuses to retry an ambiguous response. Only a signed human reconciliation clears it, and re-verifying then revoking again uses a fresh incident identifier rather than reopening the resolved one.

07

How you connect today

AdBuyMCP runs the hosted MCP server. Approved accounts sign in through Supabase, select their workspace and consent. Each compatible external client needs its own approved OAuth identity and exact callback registration. There is no public connector or registry listing. The server speaks streamable HTTP, works behind load balancers without sticky routing, and is fail-closed at the boundary: every deployment AdBuyMCP runs has to name its exact allowed hosts and browser origins, and a modern HTTP request that omits its protocol version header is rejected before dispatch.

Supabase is the hosted authorisation server. The MCP server publishes protected-resource metadata, validates short-lived grants with PKCE S256 and resource audiences, and delegates to the API under a separate audience. Server-owned claims define workspace and product access. Automatic client registration is disabled: the client's own identity and exact callbacks must be approved, and compatibility with pre-registration needs checking for each client. A human dashboard session cannot be substituted for an MCP grant.

The tool annotations are easy to over-trust. The server marks tools read-only, destructive, idempotent and open-world, and those labels look like a security control. The server's own documentation says they are not one, and the MCP specification tells clients to treat annotations as untrusted unless they come from a trusted server. They are discovery hints that help a client decide what to surface and what to confirm. The boundary is the API's fail-closed execution hook, which rejects any consequential call that does not match a registered action and an approval granted for those exact bytes.

Sources: Model Context Protocol, Specification 2025-06-18: Authorization (standard); Model Context Protocol, Specification 2025-06-18: Tools (standard).

08

The questions to ask any agent-operated media product

Whatever you end up using, these are the questions worth asking before a budget is attached, and they are all answerable in a sentence by anyone who has thought about it.

Is there a second execution path?
If the agent's route is not the same one the interface uses, ask which rules the second one enforces and who wrote them.
What can the agent not reach at all?
A list of operations with no tool behind them is worth more than a page about permissions.
What bounds the authority?
A mandate should set a currency, a money ceiling and an expiry, and you should be able to revoke it. If the answer is an API key, there is no bound.
What is an approval bound to?
It should be bound to the exact action, because an approval bound to a description lets an improvising agent do something different.
What happens on an ambiguous response?
The run should stop and wait for a person. An integration that retries instead can launch the same campaign twice.
Can the agent approve its own work?
Ask for the test that proves it cannot, rather than the policy that says it should not.

Type your company website or work email to see who we think buys from you, how big your market is and what it costs at 3, 5 or 12 times a week.

Get my plan and price

Free, with no card.

limits

These limits apply to everything above

There is no public AdBuyMCP connector or registry listing. AdBuyMCP runs the hosted server, and approved workspaces connect through Supabase OAuth with PKCE and consent. Every external client needs its own approved registration and exact callbacks. The controls described here are properties of this platform's design rather than certifications, and the security page lists the assurances AdBuyMCP holds and the ones it does not. AdBuyMCP has not yet executed a live media buy, so none of these controls has been exercised against real spend at a real vendor.

A 30-minute call with the founder will tell you whether any of these limits matters for your market.

where this came from

Every figure above comes from one of these

Outside figures link to the page that published them, with the day each was opened. Product facts name the part of AdBuyMCP they come from.

Published sources

  1. 01Model Context Protocol, Specification 2025-06-18: AuthorizationStandard · opened 24 September 2026
  2. 02Model Context Protocol, Specification 2025-06-18: ToolsStandard · opened 24 September 2026

AdBuyMCP’s own product facts

  • 01AdBuyMCP's MCP server: the tool list, the protocol negotiation, the transport boundary and the annotation counts
  • 02This site's MCP page: the eleven human-only operations, the authority chain, the actor-class refusal and the availability statement, all read off the MCP server
  • 03AdBuyMCP's API: the provider-attempt record, the idempotency token and the orphan reconciliation behaviour
  • 04This site's security page and supply ledger: the tenant boundary, the agent approval restrictions, the supplier spend lock and what is not held on assurance

bring your market

We'll price an awareness plan for your own market.

In a 30-minute call with the founder, we work out how big your market is, price 3, 5 and 12 times a week, and talk through how we'd balance the four channels for your market.

Free, with no card.

Talk your market and your plan through with James Rooney, who built AdBuyMCP and wrote its code.

Questions this guide gets asked

Can an AI agent spend money without a human approving it?

Not on this platform, and the block is structural rather than a setting. Consequential calls fail closed unless the incoming request matches an approval a human granted for those exact bytes; spend runs against a mandate carrying an explicit money ceiling and an expiry; and enabling spend on a live line is a separately granted action that an approval alone cannot perform. Agents also cannot revoke or replace authority, close missions, or resolve approvals: those operations have no agent tool at all.

What actually goes wrong when an agent runs advertising?

The costly failures happen in operations, and the most common is a retried activation after an ambiguous supplier response, which produces two live campaigns spending in parallel. The others are an agent inheriting a human's session and approving its own work, an authority that never expires and is forgotten, and an approval granted for one action being spent on a different one. All four are prevented by design decisions rather than by prompting, which is why the questions worth asking of a vendor are infrastructural.

Do I need to trust the model to use an agent safely?

Less than you would expect, and that is the point of putting the controls in the product rather than in the prompt. The model extracts semantics, drafts creative, explains plans and proposes optimisations. It does not compute budgets (deterministic code does the arithmetic against adapter forecasts), and it never emits a vendor segment identifier, because registry tables do that. Where its output has consequences, a human approval bound to the exact action stands between the proposal and the money.