Skip to main content

Novoads MCP & CLI for any AI

Create winning ads directly from your prompts in any AI tool

3 days for 1 dollar on every model, in Claude and Cursor
  1. 1

    Copy the connector URL

    You will paste this into Claude in the next step.

    https://novoads.ai/api/mcp
  2. 2

    Open Claude connectors

    Settings → Connectors → Add custom connector, then paste it in.

  3. 3

    Sign in and start

    OAuth, no API key. Approve two permissions, then ask for an ad.

Timeline, captions and voice cloning live in the app

What Claude does with it

Not a protocol diagram. The calls a real run makes, in order, next to what they produced.

You

Here is our black tee. Make a vertical ad in Spanish, someone at home talking to camera. Tell me what it costs before you spend anything.

tee-black.jpg

Claude

Pricing it first.

estimate_cost

video6ses

3.4 credits, checked against your balance. Nothing charged, no job created.

generate_video

Un joven en casa, luz natural de ventana, sostiene la cámara con una mano y habla directo al lente sobre su camiseta negra con el logo circular.

Seedance 2.09:166ses

Returns a jobId right away. The render outlives the call, so it does not hold the connection open.

Claude

Here it is. Vertical, native audio in Spanish, ready for Reels or TikTok.

Result

A real ad made with Novoads. The call beside it is the live tool contract: those parameter names and bounds are exactly what the server accepts.

9 tools, and what each one costs you

4 of them spend credits. The rest read, price and report, which is what makes a chain running unattended safe to start.

Prepare

Get your real asset in, and read what is already working in someone else's. Reading an ad charges a flat fee; the upload does not.

upload_assetSpends nothing

Returns a presigned URL for an image or video, plus the assetId that identifies it in every later call.

analyze_adSpends credits

Turns an uploaded ad into a structured read: summary, hook boundary, beats, on-screen text, casting and layout zones.

list_caption_presetsSpends nothing

docsMcp.tools.items.list_caption_presets

Create

Every call in this group charges. All of them validate the prompt before a credit moves.

generate_videoSpends credits

Submits a video render and returns a jobId immediately. The prompt is validated before any credit is charged.

generate_imageSpends credits

Generates a static ad image and returns the image URLs and a jobId.

generate_captionsSpends credits

docsMcp.tools.items.generate_captions

Price and track

Quote before you commit, then follow the job. None of these cost anything to call.

estimate_costSpends nothing

What a generation would cost, your balance, and whether it covers it. Spends nothing and creates no job.

get_generationSpends nothing

Status, progress and, once finished, a time-limited output URL for one job.

list_generationsSpends nothing

Your recent jobs, newest first. The recovery path for when the response carrying the jobId is the thing that got lost.

Video model
Seedance 2.0 by default
Length
4 to 30s on Seedance 2.5, up to 13 credits
Image model
3 models, 0.3–1 credits each
Formats
6 aspect ratios, 11 languages

The free call checks your prompt before you spend

Every rule below was measured on a render that came back wrong, not reasoned from a model card. `estimate_cost` runs all of them for free and hands back what it found. It is advice: nothing here refuses a generation, and nothing here changes the price.

Video prompts: 8 checks

What a prompt that wasted a render was missing.

  • banned_polishBreaks the render

    Rejected: polish words (cinematic, cinematográfico, perfecto, 8k, masterpiece). A valid prompt names the light source, the surface and the flaw.

  • back_referenceBreaks the render

    Rejected: back-references to an earlier shot's actor ("the same woman", "la misma mujer"). Seedance re-casts on every cut, so the actor tag is repeated verbatim.

  • missing_actor_descriptorBreaks the render

    Required in every shot: an actor descriptor. Established once in 37-53 chars (age band, gender, wardrobe), then repeated as an 11-30 char tag, word for word.

  • chained_motionBreaks the render

    Rejected: chained motion ("then", "y luego", "em seguida"). One action per shot; a second beat renders as a smear.

  • bullety_promptBreaks the render

    Rejected: bullets and field:value pairs. Seedance reads flowing prose; a labelled list renders as literal on-screen text.

  • label_without_holdCosmetic

    A visible label, package or screen needs the labelHold clause, or its printed text comes back garbled.

  • no_spoken_lineBreaks the render

    Required: the spoken line in double quotes, or a statement that the shot is silent / b-roll / voiceover. A silent talking head bills in full.

  • no_aspect_ratioCosmetic

    The aspect ratio belongs at the end. Vertical 9:16 is the format for Reels, TikTok and Stories.

Image prompts: 3 checks

Same idea, on the image side.

  • banned_polishBreaks the render

    Rejected: polish words (cinematic, cinematográfico, perfecto, 8k, masterpiece). A valid prompt names the light source, the surface and the flaw.

  • blank_labelBreaks the render

    Rejected: unbranded and blank-label products. A valid prompt names the real brand, with its photo passed via upload_asset + referenceAssetIds.

  • unfilled_placeholderBreaks the render

    Rejected: unfilled [PLACEHOLDER] tokens left over from a template.

The wording above is exactly what comes back in `warnings`, in English, whatever language your ad is in. Generating never runs these — only `estimate_cost` does, and only to tell you.

What we built on top of it

Four skills we run in-house, each one a chain over the same seven tools.

novoads-pixar-ad

One product in, one stylized 3D animated ad out. Picture and spoken lines from a single generation call.

estimate_costgenerate_imagegenerate_video
clone-hook

Reads a competitor's video hook down to the signal that ends it, then rebuilds that hook with your product and your actor.

upload_assetanalyze_adgenerate_videoget_generation
clone-static-ad

Reads a static ad's layout zones and copy hierarchy, then rebuilds the structure around your product.

upload_assetanalyze_adgenerate_imageget_generation
spy-competitor-ads

Pulls what a competitor is currently running and reports the pattern behind it, not just the files.

estimate_costfind_competitor_ads

These are instructions, not software. The judgement lives in the skill; the rendering happens here, on your account. Several are open source on GitHub, so you can read the folder before you trust it.

Questions a developer actually has

If the answer you need is not here, ask Pablo directly. He answers.

Message us on WhatsApp

Through MCP, the open standard for giving an agent access to external tools. You add one URL as a connector and sign in once. From then on Claude can reach 9 Novoads tools inside any conversation, and the results come back in the chat rather than in a dashboard you have to go check.

Anything that speaks MCP over Streamable HTTP with OAuth. Claude and Claude Code are the two we use daily, and the instructions above are the ones we run ourselves. Other clients take the same URL; the screen you paste it into is the only thing that changes.

No, and there is no key to issue. The connector signs you in with OAuth against the Novoads account you already have. The permissions it asks for are mcp, offline_access, and you can revoke them from your client whenever you want.

Credits from your plan, on the same schedule the app charges. What it costs depends on the model as well as the length: a Seedance 2.0 video at the default length is 3 credits, and the longest render on offer — 30 seconds on Seedance 2.5 — is 13. Images are 0.3–1 credits each. estimate_cost quotes the exact figure and reads your balance before anything is charged, and calling it costs nothing.

generate_video returns a jobId immediately instead of holding the connection open, because a render outlives a tool call. Poll get_generation for status and the output URL. If the response carrying the jobId is what got lost, list_generations finds the job anyway, including whether it already completed and charged.

The ad's spoken language is declared per call and 11 are accepted. It is declared rather than guessed from the prose, so a Spanish ad never gets rewritten into English just to satisfy a rule.

Yes. list_generations returns your recent jobs with a time-limited output URL, and upload_asset takes any image or video back in as an assetId you can hand to the next call.

Errors come back structured, with a code and a message written for a person, because running out of credits is a different next step from the provider being down. If the tools never appear in Claude Code, it is almost always the restart in step 3. Anything else, message us and we will look at it.
Pablo, co-founder of Novoads
Pablo, co-founder · I'm here if you need anything

Your first ad, today.

Try 3 days for $1. Cancel anytime. No sales calls.

Made in LatAm · WhatsApp support · Commercial rights included.

Rather ask first? Chat with Pablo on WhatsApp