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.
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| adclip-0.1.1.tar.gz | 75.6 kB | Without provenance | Details for adclip-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| adclip-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for adclip-0.1.1-py3-none-any.whl |
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
|
Security for adclip 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.