Claude Code
Claude Code, pointed at your ad accounts
One command adds the server, a scoped key decides what it may do, and every change it proposes is a change request with a review link rather than an edit.
Point your MCP client at your workspace for 68 scoped tools, with separate keys to read, draft and approve.
Illustrative exchange
Illustrative exchange
Illustrative exchange
Connecting it
- 01
Mint a workspace key
In the app, open Settings and then MCP, and mint a key. Choose its scopes as you mint it: read on its own, read and draft together, or approve as well. The key is shown once, hashed at rest, revocable, and scoped to one workspace — which is taken from the verified key rather than from anything a tool is asked for.
- 02
Add the server
One command adds it over streamable HTTP with the key in an Authorization header. There is no SSE transport and no separate REST API to configure.
- 03
Choose where the config lives
The default scope keeps the server private to you for this project; user scope makes it available across all of your projects, still private; project scope writes it into the repository, where version control shares it — the wrong home for a bearer key. Use the default or user scope for a key.
- 04
Check the handshake
List the configured servers from the command line, or run the MCP command inside a session. Either shows whether this one connected and which tools it exposed. What the list shows is the surface chosen at the mint rather than the scopes: compact registers two tools, explicit one per capability. The scopes are proved by asking — a capability outside them answers with the scope it needs and the scopes the key holds.
- 05
Ask the first question
Start with the account brief rather than a change. It returns ninety days of context per connected account, so the agent has a baseline before it calls any number good or bad, and it says when it was computed.
Objections, answered
I do not want an agent with credentials to my ad accounts.
It does not get any. The platform grants live in the workspace; the key the client holds addresses Tempio and carries only the scopes you chose. A read-and-draft key can fill a review queue and cannot apply a single change.
A terminal is a strange place to run advertising.
It is the same shape as the work: read the state, propose a change, write it down, have it checked, apply it, verify it landed. What was missing was an ad platform with a review step in it, not a better tab.
We would lose the audit trail we have in the platform.
You gain one. Every change request records what it changes, the state the entity was in before it, the guardrails it passed and the authority that cleared it, which is more than a platform's change history carries and it is queryable from the same client.
See the gate on your own accounts
Every change is written as a draft and held at the gate. Publishing to live accounts is in private beta.
Request early accessWhy a terminal
Claude Code runs in a terminal and holds a project's context, which makes it an odd place to run advertising until you notice that most ad work is the same shape as most engineering work: read the state, decide on a change, write it down, have someone check it, apply it, verify it landed. The gap has always been that ad platforms have no such workflow. This one does.
What the connection is
Tempio's programmatic surface is a Model Context Protocol server over streamable HTTP. There is no separate REST API to learn: the in-app agent and your own client call the same org-scoped tool layer, so a tool behaves identically whichever one is holding it. The endpoint takes a bearer key you mint in the app, and the workspace is read from the verified key rather than from anything a tool is asked for — which is the whole of the multi-tenancy story, and the reason a key cannot be talked into reaching a workspace it was not minted for.
Keys carry scopes. Reading covers connections, ad accounts, campaigns, structure, media assets, metrics, drafts and media plans. Drafting creates change requests, edits them, undoes applied changes by drafting their inverse, and edits plans; nothing it writes reaches a live ad account. Approving applies or rejects a pending draft and is opt-in at the moment the key is minted. Scopes are enforced on the call rather than by hiding it: a read-only key asked to draft is refused by name, with the scope the capability needs and the scopes the key holds, so an agent is told what to ask for instead of concluding the capability does not exist.
Setting it up, and where the key lives
Mint the key first, under Settings and then MCP in the app. It is shown once, hashed at rest, revocable, and scoped to one workspace. Then add the server:
claude mcp add --transport http tempio https://app.tempio.ai/api/mcp \
--header "Authorization: Bearer YOUR_KEY"
Where that configuration is written is a decision worth making deliberately. The default scope keeps it private to you for the current project; user scope makes the server available across all of your projects, still private; project scope writes it into a file in the repository root, which is shared through version control and is the wrong home for a bearer key. For a key, use the default or:
claude mcp add --transport http tempio https://app.tempio.ai/api/mcp --scope user \
--header "Authorization: Bearer YOUR_KEY"
Then check the handshake rather than assuming it. Listing the configured servers from the command line shows whether this one connected; the same check inside a session shows the server and the tools it exposed. What the tool list itself shows is the surface chosen at the mint: compact registers two tools, one that describes the catalogue and one that runs it, and explicit registers each capability as a tool of its own. Both reach the same capabilities under the same scopes, so the list is a context-cost decision and the refusal is the gate.
What the first prompts return
Start with the account brief. It is ninety days of context per connected ad account — coverage, totals, a twenty-eight day period against the one before it, the objective mix, how concentrated spend is, which campaigns rank on return and which rank worst on cost per acquisition, and which weekdays are cheapest — and it exists so that an agent has a baseline before it calls a number good or bad. It says when it was computed, and it says so out loud when it is more than a week old.
After that, the reads compose the way you would expect. Blended KPIs with a per-platform breakdown for a date range. Per-campaign rows highest spend first, each in its own account's currency, carrying a marker that says whether the order is a true ranking or several currencies laid side by side. The structure beneath any campaign or ad group, each row carrying the operations that level can actually express on the platform it lives on. The media library, each asset with the id the platform holds those bytes under.
Two rules run through all of it. Money is integer minor units with an explicit currency, so nothing is divided by a hundred on a hunch. Ratios are computed when they are read from base counts, and a ratio with a zero denominator is null rather than zero — a campaign with spend and no conversions has no ROAS, and an agent that reports zero is reporting something that did not happen.
What a draft looks like from inside the client
Ask for a change and you get a change request. One call writes a whole batch in the order it applies, each entry able to name the earlier entry that creates its parent, so a campaign, an ad group and an ad arrive as one reviewable group rather than three acts that can half-succeed. What comes back is the batch, one review link for the group, and the authority that cleared it: waiting for a person, or cleared on the way in by a rule the workspace wrote.
The client's job at that point is to hand you the link rather than to keep going. A draft that needs an edit has its payload replaced whole, which re-validates it, re-stamps the currency from the target account and re-runs the guardrails — so a stopped batch is resumed rather than written again from scratch. A change that already landed is undone by drafting its exact inverse at the same gate, which means an undo is a change request like any other rather than something happening behind you.
Approving is deliberately not the same permission as drafting. Most workspaces hand their agent a key that can read and draft, and keep approval for a person or for a rule they wrote. The record says which of those cleared each row, and it never pretends a policy was a person.
The same setup run on one platform, end to end is the walkthrough for one platform, with the reads and the drafts that platform actually accepts.
What the client cannot do
It cannot see another workspace. It cannot approve anything with a key that was not minted with that permission. It cannot upload a file into an ad account's media library — the library lists what is there, and a creative references an asset by the id the platform already holds it under. And it cannot make a change take effect without something clearing it, which is the point rather than a limitation: a queue of drafts with a review link is a smaller problem than a change nobody remembers making.
The approval gate is where those drafts wait, the media plan is where a flight is shaped before any of them exist, and the MCP server page is the same story from the product's side rather than the client's.
Questions
Put frontier AI to work on every ad account you run.
Tempio connects your ad accounts into one workspace and hands your own AI the numbers and the tools. Every change it writes is a draft until you approve it, or until a rule you wrote does.
Request early access- Read and draft by default. Approve is a separate permission you grant.