MCP server for ad creative generation — copy and static images from a single JSON brief
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file adclip-0.1.1.tar.gz.
File metadata
- Download URL: adclip-0.1.1.tar.gz
- Upload date:
- Size: 75.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7a48a47953289a97f52fbe4f531ab3891310071a17b1c8abc6bfa3d5265fb17
|
|
| MD5 |
01ed762251598480bfbe06a2997766db
|
|
| BLAKE2b-256 |
529265922ed0b3e98a8b67ec64d2af9dcc331ea308dfcf9e74476cc3697483d5
|
File details
Details for the file adclip-0.1.1-py3-none-any.whl.
File metadata
- Download URL: adclip-0.1.1-py3-none-any.whl
- Upload date:
- Size: 66.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e86f125aa518a9fba83e593cb09838c0ce4d3b56178d6e7b0e8526a0613a361
|
|
| MD5 |
8f71d6040aa864d3c28bd335402b0c22
|
|
| BLAKE2b-256 |
ece6c7745d344b6fd0a4c2a092bb4631a8aa928c2991383560d85a47181b5e60
|