{
  "markdown": "<!-- mcp-name: io.github.Lulu-The-Narwhal/dali -->\n# Dali by Lulu\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Lulu-The-Narwhal/dali-mcp/main/assets/dali-lulu-scorer.png\" alt=\"Dali by Lulu — creative intelligence MCP\" width=\"100%\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://dali.getlulu.dev\"><strong>dali.getlulu.dev</strong></a> &nbsp;·&nbsp;\n  <a href=\"https://dali.getlulu.dev/#install\">Install</a> &nbsp;·&nbsp;\n  <a href=\"https://dali.getlulu.dev/dashboard\">Live stats</a> &nbsp;·&nbsp;\n  <a href=\"https://getlulu.dev\">Lulu</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.producthunt.com/products/dali-by-lulu?utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-dali-by-lulu\" target=\"_blank\"><img src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1191380&theme=light&t=1783534343769\" alt=\"Dali by Lulu — featured on Product Hunt\" width=\"250\" height=\"54\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://pypi.org/project/dali-mcp/\"><img src=\"https://img.shields.io/pypi/v/dali-mcp.svg\" alt=\"PyPI version\"></a>\n  <a href=\"https://pypi.org/project/dali-mcp/\"><img src=\"https://img.shields.io/pypi/dm/dali-mcp.svg\" alt=\"PyPI downloads\"></a>\n  <a href=\"https://www.npmjs.com/package/dali-mcp\"><img src=\"https://img.shields.io/npm/v/dali-mcp.svg\" alt=\"npm version\"></a>\n  <a href=\"https://www.npmjs.com/package/dali-mcp\"><img src=\"https://img.shields.io/npm/dm/dali-mcp.svg\" alt=\"npm downloads\"></a>\n  <a href=\"https://github.com/Lulu-The-Narwhal/dali-mcp/blob/main/LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT License\"></a>\n  <a href=\"https://modelcontextprotocol.io\"><img src=\"https://img.shields.io/badge/MCP-server-6b5bff.svg\" alt=\"MCP Server\"></a>\n  <a href=\"https://dali.getlulu.dev/dashboard\"><img src=\"https://img.shields.io/badge/status-live-brightgreen.svg\" alt=\"Live\"></a>\n</p>\n\n---\n\n**Score your creative against what's actually winning in the ad market — before you spend the credit.**\n\nMost AI generation failures are predictable. A weak prompt, an off-formula creative — you can't tell until after you've burned the token. Dali scores it *first*, and it doesn't grade against opinions or generic \"prompt tips.\" It grades against a **real, living corpus of proven-winning ads** — creatives still running in the market months after launch, scraped, embedded, and ranked. Two jobs:\n\n- **`score_prompt`** — judge the *prompt* before you generate (craft: camera, motion, lighting, model-native language).\n- **`score_creative`** — judge the actual *image* against proven winners (does it look like what converts, and what's missing).\n\nEvery wasted generation has a real cost — a Seedance retry is ~$6. [The live dashboard](https://dali.getlulu.dev/dashboard) tracks what the community has saved by catching bad creatives before they burned a credit.\n\n```\nYou: \"make a video ad for our glass serum bottle\"\n\ndali::score_prompt(prompt, \"veo3\")\n→ 8/100  Grade: F\n→ no camera move · no motion · no lighting · 8 words\n→ Verdict: Generic stock footage guaranteed. Enhance first.\n→ enhancement_brief included (score < 70):\n\n  ① lead with camera — Veo 3's #1 lever: \"Slow dolly\", \"Orbital push\"\n  ② describe physics: \"a drop falls\", \"liquid ripples\", \"glass refracts\"\n  ③ lighting type + quality: \"warm backlight\", \"rim-lit edges\"\n  ↳ [Camera]. [Subject + motion]. [Lighting]. [Mood]. [No text.]\n\n✦ YOUR LLM rewrites using the brief:\n\n  \"Slow orbital push around a glass serum bottle on white marble. A single\n   amber drop falls in extreme slow motion, catching warm backlight. Macro:\n   liquid gold ripples outward from impact. Rim-lit edges, soft studio\n   diffusion. Premium, clinical. No text.\"\n\ndali::score_prompt(enhanced, \"veo3\")\n→ 91/100  Grade: A  ✓ Safe to generate.\n```\n\n---\n\n## The real winning data layer\n\nThis is what makes Dali more than a prompt linter. The scores are grounded in **real ads that are actually winning**, not hand-written rules.\n\n**How the corpus is built — longevity is the outcome signal.** We scrape the public Meta Ad Library. An ad still running *months* after it launched is one the advertiser keeps paying for — a **proven winner**. That \"still-running-after-N-days\" longevity is a market-validated label you can't fake, and it's the spine of the whole dataset.\n\n**What's in it, today:**\n\n| | |\n|---|---|\n| Ads ingested | **10,204** (14,100 raw archive) |\n| Proven winners (long-running) | **3,808** |\n| Distinct advertisers | **4,121** |\n| Verticals | **8** — beauty, wellness, supplements, fitness, food, apparel, tech, pets |\n| Winner creatives embedded | **800** (1408-dim, balanced ~100/vertical) |\n| Longest-running winner seen | **2,431 days** (6.6 years live) |\n\n**The pipeline (offline → serving).** The tools never scrape or embed on the fly — they read pre-built stores:\n\n```\nscrape Meta Ad Library         → proven winners (longevity label)\n      → Gemini vision           → creative attributes (lighting, format, before/after, offer…)\n      → prevalence SQL          → winning-pattern lift per vertical (winners vs baseline)\n      → Vertex embeddings       → BigQuery VECTOR_SEARCH (nearest proven winners, cosine)\n      → graph edges (Memgraph)  → (:Pattern)-[:WINS_IN {lift, n}]->(:Category)\n```\n\nSo when `score_creative` runs, it embeds your image and finds the **actual winning ads it most resembles** by full visual signature — then tells you which winning attributes you're missing. When `enhance_prompt` runs with a category, the rewrite brief is backed by real market lift (\"before/after shows up in 78% of winning wellness ads, 4× baseline\"), not craft opinion.\n\n> **Honest scope.** The winner label is *longevity* (a strong market-validated proxy), not per-ad conversion rate — measured CVR validation is in progress. The corpus grows on a schedule, so coverage per vertical keeps deepening. What you get today: your creative scored against what's *demonstrably surviving* in the live market.\n\n```\ndali::score_creative(image_url, \"beauty\")\n→ score 62/100  — partial resemblance to proven winners\n→ looks_like:      Frøya Organics (ran 411d), tashportcosmetics (884d), Face Reality (346d)\n→ what_to_change:  winners use \"before/after\" 4× more · offer-visible 1.8× more\n→ defects:         none\n→ Verdict: Partial — strong resemblance, but add the high-lift attributes before spending.\n```\n\n---\n\n## Contents\n\n- [The real winning data layer](#the-real-winning-data-layer)\n- [Install](#install)\n- [Tools](#tools)\n- [Supported models](#supported-models)\n- [Platform supersets](#platform-supersets)\n- [Why model-specific?](#why-model-specific)\n- [MCP resources](#mcp-resources)\n- [Contributing](#contributing)\n\n---\n\n## Install\n\n**Hosted MCP — connect once, scores every prompt and creative:**\n\n```bash\n# Claude Code\nclaude mcp add --transport http dali https://dali.getlulu.dev/mcp\n```\n\n```json\n// Cursor / Windsurf — .cursor/mcp.json or windsurf settings\n{\n  \"mcpServers\": {\n    \"dali\": { \"url\": \"https://dali.getlulu.dev/mcp\" }\n  }\n}\n```\n\n```json\n// stdio-only clients — npx wrapper around the hosted server, no Python needed\n{\n  \"mcpServers\": {\n    \"dali\": { \"command\": \"npx\", \"args\": [\"-y\", \"dali-mcp\"] }\n  }\n}\n```\n\n→ **[Full install guide with all clients](https://dali.getlulu.dev/#install)**\n\n**Self-hosted — local, no auth required:**\n\n```bash\npip install dali-mcp\nclaude mcp add dali -- python -m dali.server\n```\n\n> The self-hosted package exposes the prompt-scoring tools locally. The creative-scoring tools (`score_creative`, `analyze_winning_formula`) and the winning-ad corpus run on the hosted server — connect via the hosted MCP to use them.\n\n---\n\n## Tools\n\n**Score the creative — against real winners**\n\n| Tool | What it does |\n|------|-------------|\n| `score_creative(image_url, category)` | Score an actual ad **image**. Embedding similarity to proven winners is the headline score; also returns the winners it resembles, which winning attributes it's missing, and generation defects — in one call |\n| `score_creative_from_view(category, …)` | **Score an image you're looking at (pasted/attached in the chat) — no URL.** The model reads the creative's attributes and Dali scores them against the winning corpus (verdict + what to change). Use for images shared in-conversation; `score_creative` (URL) adds the embedding headline |\n| `analyze_winning_formula(csv, category, email)` | Paste your own ads export (creative URL + CPA/CTR/ROAS) → your winning formula vs your losers, plus how you compare to the industry median |\n\n**Score the prompt — before you generate**\n\n| Tool | What it does |\n|------|-------------|\n| `score_prompt(prompt, model, category?)` | Grade 0–100 with a per-dimension breakdown and verdict. When the score is weak, the **rewrite brief is returned in the same call**. Reads intent with the conversation LLM (understands negation, any language) |\n| `enhance_prompt(prompt, model, category?)` | Returns a structured rewrite brief — YOUR LLM writes the enhanced prompt. With a category, the brief is backed by real winning-ad lift |\n| `track_enhancement(original, enhanced, generator)` | Record a before/after pair in the graph brain — trains community patterns |\n| `score_variations(prompts, generator)` | Rank a list of prompt variants in one call — highest to lowest |\n| `suggest_generator(concept, budget_usd_max)` | Pick the best model for your concept + budget |\n\n**The graph brain & meta**\n\n| Tool | What it does |\n|------|-------------|\n| `creative_patterns(model)` | Community top patterns for this model from the graph |\n| `community_benchmark(prompt, model)` | Compare your prompt against community top scorers |\n| `prompt_neighbors(prompt, model)` | Find A/B-grade prompts that share your patterns (score the prompt first, so its patterns are in the graph) |\n| `analyze_intent(prompt)` | Parse dimensions: camera, motion, lighting, style, mood, gaps |\n| `my_story()` | Your scoring history, model stats, grade distribution |\n| `list_generators()` | All supported models with medium and core strength |\n| `dali_version()` | Server version + changelog |\n\n---\n\n## Supported models\n\n### Video\n\n| Model | Platforms | Best for | Prompt style |\n|-------|-----------|----------|--------------|\n| `veo3` | Higgsfield, Google AI Studio (`veo-3.1-generate-preview`), Runway | Cinematic brand films, narrative ads, photorealistic motion | Camera move → Subject → Action → Location → Lighting → Mood |\n| `seedance` | Higgsfield, fal.ai (`bytedance/seedance-2.0`) | UGC, social-native content, TikTok/Reels performance ads | Natural language, motion-first, authentic feel |\n| `kling` | Higgsfield (`kling3`), Kling.ai (`kling-v3-text-to-video`) | Character animation, product showcases, facial performance | Scene → Characters → Action → Camera → Style; multi-shot labels |\n| `runway` | Runway (`gen4_turbo`) | VFX, character performance, cinematic motion | Motion-first — describe what moves, not what exists |\n| `wan` | fal.ai (`fal-ai/wan/v2.7/text-to-video`) | 4K, 20-second clips, native audio, open-source workflows | Scene → Motion → Sound → Duration → Mood |\n| `minimax` | fal.ai (`fal-ai/minimax/hailuo-02/pro/text-to-video`) | Cinematic storytelling, character animation | Natural language + `[camera movement]` bracket syntax |\n| `higgsfield` | Higgsfield (native model) | Physics-driven motion — cloth, hair, fluid, particles | Describe materials in motion, not motion abstractly |\n\n> **Sora 2** (OpenAI): API shutdown September 24, 2026. Do not build new dependencies on it — use Runway or Kling instead.\n\n### Image\n\n| Model | Platforms | Best for | Prompt style |\n|-------|-----------|----------|--------------|\n| `flux` | BFL API (`flux-pro-v1.1`), fal.ai, Replicate | Photorealism, technical photography, product shots | 30–80 words; camera body + lens specs; front-load subject |\n| `midjourney` | Midjourney (v8.1) | Artistic depth, editorial, stylized illustration | Prose + params appended: `--ar 16:9 --s 300 --v 8.1 --style raw` |\n| `ideogram` | Ideogram API (`V_4`), fal.ai | Typography, logos, text-in-image, graphic design | Describe text exactly in quotes inside the prompt |\n| `firefly` | Adobe Firefly 5 (enterprise) | IP-indemnified commercial assets, 4MP brand content | Natural language + `contentClass` and `style.presets` API params |\n\n> **Imagen 4** (Google): deprecated — use `gemini-3.5-flash` with image output. Dali still scores legacy Imagen prompts via the `imagen` model key but don't build new things on it.\n\n---\n\n## Platform supersets\n\n**Higgsfield** and **Runway** are aggregator platforms — they proxy multiple underlying models under one API. The model you pick matters more than the platform name:\n\n| Platform | Model selector | Underlying model |\n|----------|---------------|-----------------|\n| Higgsfield | `veo3` | Google Veo 3.1 |\n| Higgsfield | `seedance` | ByteDance Seedance 2.0 |\n| Higgsfield | `kling3` | Kling 3 |\n| Higgsfield | `wan2-7` | Wan 2.7 |\n| Higgsfield | `image2video` | Higgsfield native |\n| Runway | `veo3` | Google Veo 3.1 |\n| Runway | `gen4_turbo` | Runway Gen 4.5 |\n| Runway | `seedance` | ByteDance Seedance 2.0 |\n\nDali scores for the **underlying model's native prompt language**, not the platform wrapper. Pass the model name (`veo3`, `kling`, `seedance`…), not the platform name.\n\n---\n\n## Why model-specific?\n\nGeneric prompt optimizers don't know that:\n- **Veo 3.1** needs camera movement specified above everything else\n- **Kling 3** supports multi-shot scene labels natively in the prompt\n- **Flux** responds to camera body and lens names like a photographer (`\"Sony A7 IV, 85mm f/1.4\"`)\n- **Midjourney V8.1** reads prose + parameters, not keyword lists\n- **Higgsfield** simulates physics — you describe materials in motion, not motion abstractly\n- **Minimax** uses `[Pan left]` bracket syntax for camera moves — plain text camera commands are ignored\n- **Ideogram V4** needs text quoted exactly in the prompt for typography accuracy\n- **Wan 2.7** generates native audio — include sound descriptions alongside visuals\n\nDali has a separate scoring rubric and rewrite brief for each model. Your LLM does the creative rewriting — Dali provides the intelligence.\n\n---\n\n## MCP resources\n\n```\ncreative://guide/veo3       → Veo 3.1 camera language guide\ncreative://guide/seedance   → Seedance UGC motion guide\ncreative://guide/kling      → Kling multi-shot + expression guide\ncreative://guide/runway     → Runway motion-first guide\ncreative://guide/wan        → Wan 2.7 audio + motion guide\ncreative://guide/minimax    → Minimax bracket camera guide\ncreative://guide/higgsfield → Higgsfield physics-motion guide\ncreative://guide/sora       → Sora 2 guide (API shutdown Sep 24, 2026)\ncreative://guide/flux       → Flux photography brief guide\ncreative://guide/midjourney → Midjourney V8.1 + parameters guide\ncreative://guide/ideogram   → Ideogram V4 typography guide\ncreative://guide/firefly    → Firefly 5 commercial content guide\ncreative://guide/imagen     → Imagen 4 guide (deprecated Aug 17, 2026)\ncreative://models           → All models overview\n```\n\n---\n\n## Contributing\n\nModel guides live in `dali/data/guides/{model}.json` on the hosted server. Found practitioner patterns that consistently produce high-grade results? Open an issue with the model, the pattern, and a sample prompt + result. The best contributions come from Reddit, Discord, and YouTube — real practitioners, not official docs.\n\n→ **[Prompt best practices by model](https://github.com/Lulu-The-Narwhal/dali-mcp/blob/main/docs/best-practices.md)** — cheat sheets, do/don't tables, top patterns per model\n→ **[Dali creative flow skill](https://github.com/Lulu-The-Narwhal/dali-mcp/blob/main/skills/dali-creative-flow.md)** — install this skill so your LLM follows the score → enhance → generate workflow automatically\n\n---\n\n[MIT License](https://github.com/Lulu-The-Narwhal/dali-mcp/blob/main/LICENSE) · Built by [Lulu](https://getlulu.dev) · [dali.getlulu.dev](https://dali.getlulu.dev)\n",
  "bytes": 15924,
  "sha": "cf9ddab1218a1a834a80864946ee220d9b587cbcd83676eecd1010265c9dd200",
  "repo_slug": "lulu-the-narwhal/dali-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_lulu_the_narwhal_dali_78cda6fb/readme"
}