adclip
Ad creative generation — copy and static images — from a single JSON brief. Runs as an MCP server (zero-config under Claude Code) or as a CLI.
Keyless by default. adclip shells out to the claude CLI for LLM calls
using your subscription auth, so no ANTHROPIC_API_KEY is needed. Paid
third-party APIs (Anthropic direct, fal.ai) are gated behind an explicit
opt-in (ADCLIP_ALLOW_LIVE_APIS=1) so a key in your environment doesn't
silently bill you.
Install
pipx install adclip
For the optional direct-Anthropic-API provider:
pipx install "adclip[anthropic]"
Requires Python 3.11+ and the claude CLI
on $PATH (for the default keyless LLM path).
From source (for contributors)
git clone https://github.com/dreliq9/adclip.git
cd adclip
python3.11 -m venv .venv
.venv/bin/pip install -e ".[dev]"
Two usage paths
1. MCP server (recommended under Claude Code)
Add to your project's .mcp.json (or ~/.claude.json):
{
"mcpServers": {
"adclip": {
"command": "adclip-mcp"
}
}
}
Then ask Claude: "Generate ad variants for examples/taichi_brief.json"
Tools exposed:
Brief + inspection
adclip_brief_validate— schema checkadclip_estimate_cost— LLM + fal cost estimateadclip_list_formats— format catalogadclip_policy_check— policy dry-run on arbitrary copyadclip_campaign_status— manifest, variants, costs, missing-file audit for a campaign dir
Generation
adclip_generate_copy— copy pool only (preview/iterate before spending on images)adclip_generate_visuals— given a list of winner copies, produce images + compositesadclip_generate_variants— full pipeline (copy → policy → image → compose → render)
Iteration on an existing campaign
adclip_render_variant— re-composite one variant (cheap; no LLM, no fal)adclip_regenerate— redo one variant's copy, visual, or bothadclip_score_variants— re-rank variants against (possibly edited) brief; heuristic or LLM judgeadclip_export_dco— emit Meta DCO modular components (deduped headlines/bodies/ctas + per-aspect images)
2. CLI
adclip formats # list format specs
adclip estimate examples/taichi_brief.json # cost preview
adclip copy examples/taichi_brief.json # copy only (no images)
adclip run examples/taichi_brief.json --image fake # full pipeline, stub images
The CLI also uses claude-cli by default — no key setup needed.
Brief schema
See src/adclip/schema.py for the full AdBrief. Minimal example:
{
"product": "Taichi crypto trading bot",
"value_prop": "Paper-trade our signals before risking real cash.",
"audience": "Skeptical retail crypto traders.",
"angles": ["credibility", "curiosity"],
"tone": "confident, dry, no hype",
"cta": "Start paper trading",
"formats": ["meta_feed_4x5", "google_rsa"],
"variants": 2,
"pool_size": 3,
"policy_profile": "crypto",
"must_avoid": ["guaranteed returns"],
"use_judge": true,
"heal_violations": 2,
"output_dir": "/tmp/adclip_out"
}
Formats
| Name | Aspect | Size | Kind |
|---|---|---|---|
meta_feed_1x1 |
1:1 | 1080x1080 | static |
meta_feed_4x5 |
4:5 | 1080x1350 | static |
google_display_square |
1:1 | 1200x1200 | static |
google_display_landscape |
1.91:1 | 1200x628 | static |
linkedin_single |
1.91:1 | 1200x627 | static |
x_promoted |
16:9 | 1200x675 | static |
google_rsa |
text | — | text |
stories_reels_9x16 |
9:16 | 1080x1920 | video¹ |
tiktok_9x16 |
9:16 | 1080x1920 | video¹ |
youtube_shorts_9x16 |
9:16 | 1080x1920 | video¹ |
¹ Video formats are declared in the schema but the pipeline does not yet
produce video assets (v0.1 is static + text only). They land with a
"video formats not yet implemented in pipeline" note in the manifest.
LLM provider modes
| Mode | Key? | Where it runs |
|---|---|---|
default / claude-cli |
none | Subprocess to the claude CLI; uses your subscription auth. |
sampling |
none | MCP sampling — asks the calling MCP client to run the LLM. Only works under clients that implement sampling (Claude Code does not today). |
anthropic |
adclip[anthropic] extra + key + ADCLIP_ALLOW_LIVE_APIS=1 |
Direct Anthropic API. ~3x faster per call. |
fake |
none | Deterministic scripted responses for tests. |
Live-API opt-in
ADCLIP_ALLOW_LIVE_APIS=1 must be set to use any paid third-party API.
This applies to anthropic and fal.ai (image + video). If a key happens
to be in your env but the gate is closed, the provider refuses with a
clear error instead of billing you.
For local dev and most MCP work you should never need to set this — the default paths are all keyless.
Self-review loops
- Judge (
use_judge: true): after policy-filtering, an LLM scores each survivor on brand fit, angle fit, and copy quality; top-N by blended score wins.judge_score,judge_rationale,judge_flagsland in the manifest. - Heal (
heal_violations: N): policy-violating candidates are sent back to the LLM with the specific violations and asked to rewrite. Successful heals gain aheal_attemptscount and ahealed_fromsnapshot of the original copy. - Semantic policy (
use_semantic_policy: true): an LLM second-pass flags paraphrases that slip past the literal blocklist (e.g. "printing money" whenmust_avoidcontains "guaranteed returns"). Feeds the same heal loop. Adds one LLM call per candidate — opt-in.
Tests
.venv/bin/python -m pytest
Status
v0.1 (current): static images + text ads, policy + heal + semantic
policy loops, full MCP tool surface (12 tools), CLI, claude-cli /
sampling / anthropic / fake LLM providers. Meta DCO modular-component
export via adclip_export_dco.
Deferred: video pipeline (stories_reels_9x16, tiktok_9x16,
youtube_shorts_9x16 are declared but not produced), adversarial
critic — see v0.x plan notes in the repo.
Release files for adclip 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| adclip-0.1.1.tar.gz | 75.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| adclip-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 142.2 kB
Release files / adclip-0.1.1.tar.gz
| Download URL | adclip-0.1.1.tar.gz |
|---|---|
| Size | 75.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b7a48a47953289a97f52fbe4f531ab3891310071a17b1c8abc6bfa3d5265fb17
|
|
BLAKE2b-256 checksum How to use checksums |
529265922ed0b3e98a8b67ec64d2af9dcc331ea308dfcf9e74476cc3697483d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / adclip-0.1.1-py3-none-any.whl
| Download URL | adclip-0.1.1-py3-none-any.whl |
|---|---|
| Size | 66.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2e86f125aa518a9fba83e593cb09838c0ce4d3b56178d6e7b0e8526a0613a361
|
|
BLAKE2b-256 checksum How to use checksums |
ece6c7745d344b6fd0a4c2a092bb4631a8aa928c2991383560d85a47181b5e60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|