Aller au contenu principal
Automation

Upload Ad Creatives to GAM Without the UI:
MCP Inline vs CLI Multipart

The Google Ad Manager API has no single "file upload" endpoint. OrbiAds exposes two surfaces for programmatic creative uploads — with very different size limits and use cases.

OA
OrbiAds Engineering
Published May 28, 2026 · 6 min read

Why Upload Creatives Programmatically?

The Google Ad Manager UI is designed for manual, one-at-a-time use. As soon as you need to push dozens of banners — A/B variants, format-specific cuts, multi-language sets — the UI becomes a bottleneck. CI/CD workflows and AI agents need a reliable programmatic surface.

OrbiAds exposes two surfaces for this capability, each suited to a different context:

MCP Inline base64

The creative_assets tool encodes the file as base64 and sends it directly in the JSON payload. Ideal for AI agents that generate or modify creatives on-the-fly inside Claude or another LLM.

  • Zero shell dependency
  • Native to Claude agents
  • Images ≤ 1.1 MB · HTML5 ZIP ≤ 2.25 MB
  • Video / audio not supported
CLI Multipart

The orbiads creatives upload command uses a standard multipart request (Content-Type: multipart/form-data) to stream files directly without base64 overhead. Designed for CI/CD scripts and large files.

  • PNG / JPG / GIF / WebP ≤ 5 MB
  • HTML5 ZIP ≤ 9.5 MB
  • Video MP4 / WebM / MOV and audio MP3 / OGG / AAC
  • 300 s timeout for large files

Format & Size Limit Comparison

FormatMCP (base64)CLI (multipart)
PNG / JPG / GIF / WebP≤ 1.1 MB≤ 5 MB
SVG≤ 1.1 MB≤ 5 MB
HTML5 ZIP≤ 2.25 MB≤ 9.5 MB
MP4 / WebM / MOV✓ (server-side limit)
MP3 / OGG / AAC✓ (server-side limit)

MCP Example: Inline Image Upload via Claude

In a Claude session with the OrbiAds plugin installed, ask the agent to upload a creative. The agent calls creative_assets with action="create_image". The file is read locally, base64-encoded, and transmitted in the JSON payload to the GAM API.

# In Claude — OrbiAds MCP plugin
creative_assets(
  action="create_image",
  params={
    "name": "Banner 300x250 — Summer Campaign",
    "advertiser_id": 12345,
    "image_bytes": "<base64-encoded PNG>",   # max ~1.1 MB decoded
    "width": 300,
    "height": 250,
    "destination_url": "https://example.com/landing"
  }
)
MCP base64 limit — The payload is capped at 1,500,000 characters (~1.1 MB decoded) for images and 3,000,000 characters (~2.25 MB) for HTML5 ZIPs. Beyond those limits, use the CLI.

CLI Example: Multipart Upload in One Command

The OrbiAds CLI auto-detects the creative type from the file extension. For an image banner, specify the size with --size WxH:

# Standard image banner
orbiads creatives upload ./banner-300x250.png \
  --name "Banner 300x250 — Summer Campaign" \
  --advertiser-id 12345 \
  --size 300x250 \
  --destination-url "https://example.com/landing"

# HTML5 ZIP (auto-detected from .zip extension)
orbiads creatives upload ./rich-media.zip \
  --name "Rich Media 970x250 — Summer Campaign" \
  --advertiser-id 12345 \
  --size 970x250

# Video pre-roll (requires --duration-ms)
orbiads creatives upload ./preroll-30s.mp4 \
  --name "Pre-roll 30s — Summer Campaign" \
  --advertiser-id 12345 \
  --duration-ms 30000

Which Tool Should You Use?

The decision rule is straightforward:

  • MCP (Claude / LLM) — When you're already in an AI agent session, the file is under 1 MB, and you don't want to open a terminal.
  • CLI — As soon as the file exceeds 1 MB, you're uploading video or audio, or you're integrating the upload into a CI/CD pipeline (GitHub Actions, Bash scripts).

Both surfaces go through the same OrbiAds backend and produce the same GAM creative object. The difference is purely in transport: base64 JSON vs multipart/form-data.

OrbiAds handles GAM API compatibility for you

GAM API v202605 removed the legacy CreativeAssetService. OrbiAds transparently handles both paths — inline bytes via createCreatives for MCP, multipart upload via a dedicated REST endpoint for the CLI — without requiring you to know the underlying SOAP API details.

Start Uploading Creatives Programmatically

Install OrbiAds as a Claude Code plugin (claude plugin install orbiads) or the PyPI CLI (pip install orbiads-cli). Both tools share the same OrbiAds account and credit balance.