agentleFS
devaimanidevaimani/openai-ads-mcp/skills/ads-creative/SKILL.md

ads-creative

Skill0 starsChanged 2 months agoMITView on GitHub

Write and validate ad copy for OpenAI Ads — headline 3-50 characters, description up to 100, counted by visible characters rather than code points. Use this skill for ad copy, headline, description, creative, ad variants, or when copy is too long and needs shortening.

10 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use ads-test, ads-dna and 8 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • chriswesttSkill

    ads-test

    A/B test design and experiment planning for paid advertising. Structured hypothesis framework, statistical significance calculator, test duration estimator, sample size calculator, and platform-specific experiment setup guides (Meta Experiments, Google Experiments, LinkedIn A/B). Use when user says A/B test, split test, experiment design, test hypothesis, statistical significance, sample size, or test duration.

    Also in 5 projects that use this

  • chriswesttSkill

    ads-dna

    Brand DNA extractor for paid advertising. Scans a website URL to extract visual identity, tone of voice, color palette, typography, and imagery style. Outputs brand-profile.json to the current directory. Run before /ads create or /ads generate for brand-consistent creative. Triggers on: brand DNA, brand profile, extract brand, brand identity, brand colors, what is the brand voice, analyze brand, brand style guide.

    Also in 6 projects that use this

  • OpenAISkill

    gsap

    GSAP animation reference for HyperFrames. Covers gsap.to(), from(), fromTo(), easing, stagger, defaults, timelines (gsap.timeline(), position parameter, labels, nesting, playback), and performance (transforms, will-change, quickTo). Use when writing GSAP animations in HyperFrames compositions.

    Also in 3 projects that use this

  • OpenAISkill

    hyperframes-cli

    HyperFrames CLI tool — hyperframes init, lint, inspect, preview, render, transcribe, tts, doctor, browser, info, upgrade, compositions, docs, benchmark. Use when scaffolding a project, linting, validating, inspecting visual layout in compositions, previewing in the studio, rendering to video, transcribing audio, generating TTS, or troubleshooting the HyperFrames environment.

    Also in 3 projects that use this

  • StrayDragonSkill

    ui-ux-pro-max

    UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.

    Also in 3 projects that use this

  • +5 more from chriswestt

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 10 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If that is not enough, the line is trying to do too much.

    line 92
  2. Distinctive:

    Check a draft by downscaling it to 116 px and looking at it at that size.

    line 127
  3. Distinctive:

    Before creating the ad:

    line 136
  4. Distinctive:

    No redirect between click and destination — link the canonical URL

    line 138

“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Ad copy

Limits

FieldLimit
title3–50 characters
bodyup to 100 characters

The figures 35 and 67 that circulate are wrong. They come from a repository without a source and contradict the OpenAPI spec.

Check every draft:

uv run python scripts/validate_creative.py \
  --title "..." --body "..." --brand "YourBrand"

The validator counts visible characters, not code points. With composed characters — German umlauts in NFD form, emoji, flags — len() miscounts and rejects valid copy.

The reading situation

The ad appears mid-conversation as a small card. The reader is not searching; they are occupied with something else. The logo is displayed automatically.

Three consequences:

  1. The brand name does not belong in the headline. The logo already carries it. Spend those six to ten characters on substance.
  2. The first clause carries the ad. What follows a comma often goes unread.
  3. Concrete beats general. "In 4 weeks" works; "fast" does not.

What works

Contrast. Makes the difference visible in few characters. "Automation without an IT department" (35)

Proof. A number, a name, a deadline. "Prototype in 4 weeks" (20)

Imperative. Verb first, reads quickly. "Get a quote in 48 hours" (23)

Compressed promise. Subject, verb, outcome. No filler. "Invoices that file themselves" (29)

Question. Works when it names a pain the reader recognises. "Still writing quotes by hand?" (29)

What does not

  • Adjective stacks ("innovative, holistic, scalable") — burn characters, say nothing
  • Dashes — a comma or colon does the job and saves a character
  • Rules of three ("faster, better, cheaper") — read as machine-generated; two beats land harder at 50 characters
  • Empty verbs ("Discover", "Unlock", "Transform")
  • Abstract nouns ("solutions", "experiences", "journeys")
  • Brand name as headline — wasted space

Shortening

Compound nouns make a 50-character headline tighter in German than in English. Seven moves, each with the saving:

  1. Drop articles. "Die Prozesse automatisieren" → "Prozesse automatisieren" (4)
  2. Digits, not words. "vier Wochen" → "4 Wochen" (3)
  3. Collapse verb phrases. "hilft Ihnen zu sparen" → "spart" (15)
  4. Cut hedges. "oft in 4 Wochen" → "in 4 Wochen" (4)
  5. Drop the brand name. The logo carries it (6–10)
  6. Comma instead of "und". (2)
  7. Break up or replace compounds. "Geschäftsprozessautomatisierung" → "Abläufe automatisieren" (8)

If that is not enough, the line is trying to do too much. Keep one idea, cut the rest.

Variants

Two or three ads per ad group, each with a different angle — not the same claim reworded. Otherwise the comparison is worthless.

A reliable pairing: one ad built on proof, one on contrast. They address different motives, so a difference in outcome is interpretable.

Record what each variant is meant to test, otherwise the result cannot be read later.

The image

<!-- Verified: 2026-09-14 against a live account -->

Two measurements change how a motif should be drawn.

The card crops to a centre strip. A created ad carries an image_crop, and on a 16:9 upload it read width: 0.558, height: 1, x: 0.221 — the middle 56 % of the width at full height, which is square. Supplying 16:9 throws away 44 % of the image, 304 px on each side of a 1376 px file. Upload square.

It renders at about 116×116. Measured in a preview. That is roughly a thumbnail, so:

  • One object, or one relation between two objects. Anything with three or more elements turns to texture.
  • The signal colour needs area, not a line. A motif that carries it on a thin outline loses it entirely; one that fills a whole shape still reads.
  • Fine hatching, thin rules and small repeated marks disappear. Contrast between large flat areas survives.

Check a draft by downscaling it to 116 px and looking at it at that size. If you cannot tell what it is, neither can the reader.

Landing page

The headline has to match what the reader finds after the click. The most common cause of a good click rate with no conversions is a break between promise and landing page.

Before creating the ad:

  • The landing page is reachable, including for the review crawler
  • No redirect between click and destination — link the canonical URL
  • The wording of the ad appears on the page in substance

A review_status: rejected with a crawler_* reason points at the landing page, not the copy.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.