Bring your own creative
Upload images and video you own, then register them into an advertiser's provider-side library — from your AI agent, over MCP.
Until now the MCP tools let an agent read your accounts and performance. The
asset_* tools add the first creative-side capability: bring the source media
you own — images and video — into AdCrunch, and place it in a specific ad
account’s library so ads there can use it. All of it from the same AI client you
already connected.
Two ideas
Everything here is built on two words. They mean different things, and keeping them apart is what makes the workflow legible.
- An Asset is a source media file your organization owns — an image or a video. It lives in AdCrunch, belongs to your organization (not to any one ad account), and exists before and independently of any ad. An Asset always has bytes we hold: a video hosted somewhere else is not an Asset.
- A Registration is the act — and the record — of placing one Asset’s bytes into a single advertiser’s provider-side library, in exchange for a provider identifier. One Asset can be registered to many advertisers, one per account. Registering does not make an Asset live; it makes it available for an ad in that account to reference.
Register targets an advertiser, not a provider
An organization usually has several ad accounts on the same provider. You
register an Asset into one advertiser at a time — use
list_advertisers to find the right acc_….
The workflow
Start an upload
The agent calls
asset_create_uploadwith the filename. It gets back anassetId(ast_…) and a short-liveduploadUrl— a presigned URL that accepts the bytes directly.Upload the bytes — the agent does this itself
The agent sends an HTTP
PUTtouploadUrlwith the file as the body. The bytes go straight to storage from the agent’s runtime; they never pass through the conversation. A Worker can’t receive a large upload at all — Cloudflare rejects an over-limit body before any code runs — which is why the upload is client-to-storage, not through us.Finalize
The agent calls
asset_finalizewith theassetId. Nothing is known about the file until it lands, so this is where the type and size are checked and a wrong file is rejected. On success the Asset joins your library. You can pass anadvertiser_idhere to register in the same call.Register
asset_registerplaces the Asset in an advertiser’s library. It returns immediately with arunningRegistration — the provider processes the file in the background.Poll until ready
The agent calls
asset_getto watch the Registration go fromrunningtoready. Video can stayrunningfor several minutes while the provider transcodes it — that’s normal, not a failure.
The agent needs network access to storage
The PUT in step 2 goes to *.r2.cloudflarestorage.com. If the agent’s
runtime restricts outbound network access, that host has to be allowed, or the
upload can’t complete.
What you can upload
Finalizing rejects anything ads can’t use. Accepted types today:
- Images — JPEG, PNG, WebP, GIF.
- Video — MP4 (Meta accepts files up to 4 GB).
Size can’t be enforced before the file arrives, so an oversized file is caught at finalize and discarded — upload a smaller version and try again.
Statuses you’ll see
| On | Value | Meaning |
|---|---|---|
| Asset | pending |
Reserved; the bytes haven’t landed or been finalized yet. |
| Asset | ready |
Finalized and usable. |
| Registration | running |
Sent to the provider; still processing. Poll asset_get. |
| Registration | ready |
Live in the advertiser’s library; carries the providerIdentifier. |
| Registration | failed |
The placement failed; failureReason says why. Retry asset_register. |
A failed registration is not a failed upload
If an inline registration fails during asset_finalize, the Asset is still
stored — only the placement needs retrying. Call asset_register again; do
not re-upload the file. Registering the same Asset to the same advertiser
twice is refused, not duplicated, so retries are always safe.
Scopes
The read tools need asset:read; the write tools — upload and register —
need asset:write. Registration isn’t folded into mutation:write: an Asset
landing in a library changes no delivery and spends no money, so it stays a
separate, lower-stakes grant. See Auth & scopes.
Provider support
Meta is supported today. Support is per-provider by design — TikTok uploads media by URL natively, while Google Ads video assets are YouTube references and can’t be registered at all. As more providers come online they slot in behind the same five tools.