Building in Public: Part 4

We Thought It Was One Integration. It Was a Hundred Tools.

Why connecting an AI to ad platforms isn't one integration. Each platform exposes 20-50 distinct operations, and every reasonable user request that fails reveals another missing tool. The real surface area behind AI ad management.

J.M.7 min read

"Connect the API" is the first 5% of the work. The other 95% is a hundred little tools, each one discovered the moment a user asks for something reasonable and the agent says no.

When people imagine building an AI assistant for ad platforms, they picture one integration: connect to the Google Ads API, point an LLM at it, done. The reality is that "the API" is not one thing you connect. It is 20 to 50 separate operations per platform, and the AI needs a built, validated tool for each one. We are past 100 tools across four platforms and still filling gaps. This is the story of how you discover that surface area: one "I can't do that" at a time.

The Problem

We launched with the obvious tools. Get campaigns. Get performance. Find wasted spend. The reads that make a dashboard feel alive. Then real users started asking the agent to actually do things.

"Pause this campaign."

"Bump the budget on my best ad set to $50 a day."

"Create a new ad set targeting marketers in the US."

"Add this image as a new ad."

Every one of those is a reasonable request. Every one of those was, at some point, a flat "I'm sorry, I can't do that yet." Not because the platform didn't support it. Because we hadn't built the tool.

That is the uncomfortable truth nobody mentions when they say "just connect the API." The API exposes the capability. It does not hand you a working assistant. Between the raw endpoint and "the agent did the thing" sits a tool you have to design, validate against the platform's specific field requirements, and make discoverable to the model.

What Actually Happened

The clearest example is the one that taught us how deep this goes. A user asked the agent to update targeting on a Meta ad set. The agent couldn't. Not because updating targeting was hard, but because there was no tool to list ad sets in the first place.

You cannot update something you cannot see. Targeting tools, budget tools, status tools, they all need to first resolve "my best ad set" into a concrete ad set ID. Without a read tool to enumerate ad sets, every write tool downstream of it is dead on arrival. That single missing read (Issue #43) was blocking an entire category of writes.

So we shipped three tools in one commit: list ad sets, update status, update budget (Issues #42, #43, #44). One user request exposed three missing operations that only made sense together.

Then someone asked the agent to create an image ad. Simple, right? Here is what "add an image to an ad" actually decomposed into:

PieceWhat it doesIssue
Image storage serviceSomewhere to put the bytes(infra)
Backend upload endpointAccept the file, return a URL#55
Frontend drag-and-drop in chatLet the user actually attach it#56
create_meta_ad toolTurn a stored image into a live ad#46

Four pieces of work for what a user experiences as one sentence: "make this an ad." And that is just Meta. LinkedIn creative was its own separate build (Issue #75), because LinkedIn's creative model does not look like Meta's.

Here is what these failures look like from the inside. The agent isn't broken. It correctly understands the request. It just reaches for a tool that was never built:

user: create a meta ad set for the june retargeting campaign
agent: I don't have a tool to create Meta ad sets.
       I can list campaigns or report on performance instead.

That message is the discovery mechanism. Every time it fires, it is a feature request written by a user who didn't know they were filing one.

Why This Is Harder Than It Looks

The instinct is to think of an ad platform as having a handful of verbs: create, read, update, delete, on a campaign. If that were true, you would need maybe five tools per platform and you would be done in a week.

But ad platforms are hierarchical and dialect-specific. A single platform has campaigns, ad sets (or ad groups, or campaign groups, depending who you ask), ads, creatives, targeting specs, budgets, schedules, and bid strategies. Each level has its own read, its own write, and its own validation rules. Multiply that by the fact that you need a tool to resolve human language ("my best ad set") into platform IDs at every level, and the count explodes.

Roughly what one platform demands before an agent feels capable:

  • Reads for every level: list campaigns, list ad sets, list ads, list creatives, get performance per level
  • Writes for every level: create, update status, update budget, update targeting, update copy, update bid
  • Resolvers: name-to-ID lookups so the user never has to paste an ID
  • Creative pipeline: upload, store, attach, validate format and dimensions

That is 20 to 50 distinct operations. Now do it four times, for Google, Meta, LinkedIn, and Reddit, where none of the vocabularies match. We are over 100 tools across two dozen modules, and we still hit gaps every week.

And a tool that merely calls the endpoint is not enough. It has to validate against that platform's specific requirements before it fires, because an unvalidated write often comes back as a cheerful success that changed nothing. (That silent-failure problem is its own story, and it's why every mutation we ship now reads back the applied state.)

How We Fixed It

We stopped treating tools as a fixed list and started treating coverage as a moving target. New tools land in a catalog the agent searches semantically, so the right operation surfaces from a user's phrasing instead of an exact keyword match. Platform mutations get registered against the skill that owns them, so when a user mentions "Meta," the relevant write tools are force-loaded rather than left to chance. And every mutation tool is paired with verification, because shipping a write without a read-back is how you get the silent failures we wrote about in part one.

The honest answer to "how do you fix missing tools" is that you don't fix it once. You build the machinery that makes adding the hundred-and-first tool cheap and discoverable, and you let real user requests tell you which one to build next. That catalog-plus-verification approach is the core of what Campaign Agents is, and it is the part you cannot get by pointing an LLM at an API key.

What This Means for AI Ad Management

If you are building in this space, the number to internalize is not five tools per platform. It is closer to fifty, and you will discover them in the order your users hit the gaps, not in the order you planned. Budget for the long tail. A read tool you skipped will silently block every write that depends on it.

If you are buying, the question to ask a vendor is not "do you support Meta." Everyone supports Meta at the level of reading a campaign list. Ask instead: "Can your agent create an ad set, attach an uploaded image, update its targeting, and change its budget, and then prove to me each one applied?" The gap between reading data and reliably acting on it across four platforms is the entire product. It is a hundred tools deep, and counting.

Frequently Asked Questions

Why can't AI assistants perform every action on an ad platform?
Each platform exposes 20 to 50 distinct operations: create an ad set, update a budget, list ad sets, upload a creative, change status. An AI agent needs a separate, validated tool for each one. Connecting the API only exposes the raw surface. Every individual action still has to be built and tested.
How many tools does an AI ad management agent actually need?
In our case, more than 100 tools across two dozen modules just to cover four platforms (Google, Meta, LinkedIn, Reddit), and that count is still growing. Reading data, mutating campaigns, uploading images, and resolving human names to platform IDs each need their own tool.
Why does an AI agent say it can't do something reasonable?
Usually because the underlying operation hasn't been built as a tool yet, or a prerequisite read tool is missing. You can't update an ad set the agent can't list. Each gap surfaces the moment a user asks for something the platform supports but the agent hasn't wired up.

Keep reading