Skip to main content
Glama

Create an image campaign

create_campaign
Idempotent

Makes a set of 1 to 10 image ads for one brand in one size, each adapted from a source ad. Source ads come from sources.type rivals_best (standout ads of the brand's competitors), from source_ad_ids (2 to 5 chosen ads) or, with neither, from automatic selection. product_image_id and prompt set the product image and message, so this is also the tool for controlled output. Two steps: without confirm it returns a cost preview (cost_credits, output_count, source_ad_ids, truth_preflight, confirmation_truth, idempotency_key, max_credits) and spends nothing; the confirming call repeats the same arguments with confirm: true plus the preview's source_ad_ids, count equal to output_count, confirmation_truth as truth, idempotency_key and max_credits. Returns campaign_id and a campaign job reference for get_campaign_outputs. Fewer images than requested can be delivered when sources or quality checks fail. Does not publish ads.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "create_campaign"
  }
}

Input Schema

NameRequiredDescriptionDefault
sizeNoAspect ratio for every image in the campaign (default 1:1). 16:9 is not offered for every campaign; the preview reports when it is unavailable.1:1
countNoNumber of images, 1 to 10 (default 3, or 6 with sources). On a preview with source_ad_ids it equals the number of ids (2 to 5); without them StealAds selects sources for 1 to 10 images. On confirmation, send count equal to output_count from the preview.
truthNoAbsent on the preview call. On confirmation, the preview's confirmation_truth object sent back unchanged; the key is signed over every field, so a missing or edited field is refused. Sending it states that the user approved the facts and any conflicts listed in truth_preflight.
promptNoWhat the campaign should say or feature: offer, product, audience, angle (up to 4,000 characters). Needed unless sources is given. Statements here are compared with the saved brand details; differences, such as another audience, come back as conflicts in truth_preflight for the user to approve.
confirmNotrue starts the campaign from an approved preview and reserves credits; absent or false returns the cost preview and spends nothing.
sourcesNoAutomatic sources from the best ads of the brand's competitors, as an alternative to source_ad_ids. Skips ads this user already used for the brand in the last 14 days. Does not start tracking.
brand_idNoBrand id from list_brands. Needed unless sources.brand_id is given; when both are sent they have to be the same brand.
max_creditsNomax_credits from the cost preview, sent with confirm: true as the approved credit ceiling.
source_ad_idsNoChosen source ads, as ad ids in UUID form. Preview: 2 to 5 distinct ids with count equal to their number; absent for automatic selection, the only way to quote 1 or 6 to 10 images. Confirmation: every source_ad_ids value the preview returned, in the same order. An ad that search returns can still be ineligible as a campaign source.
idempotency_keyNoidempotency_key from the cost preview, needed with confirm: true and valid for 15 minutes. An identical repeat returns the original campaign.
product_image_idNoProduct image to feature: an asset id from list_brand_assets for this brand (asset_type product). Absent or null lets StealAds choose one of the brand's images.

Output Schema

NameRequiredDescriptionDefault
noteNoExplanation when fewer eligible sources remain outside the cooldown.
statusNoCurrent progress or delivery state.
replayedNoreplayed value in this response.
_referencesNoOpaque action references accepted by subsequent tool calls.
billing_urlNobilling url value in this response.
campaign_idNocampaign id value in this response.
max_creditsNoExplicit credit ceiling to echo after the user approves this quote.
next_actionNoSuggested operation to continue or recover from this state.
cost_creditsNoCredits quoted or charged by this operation.
output_countNooutput count value in this response.
what_happensNoPlain explanation of the proposed work, confirmation steps and quote expiry.
source_ad_idsNosource ad ids value in this response.
enough_creditsNoenough credits value in this response.
balance_creditsNobalance credits value in this response.
idempotency_keyNoKey binding confirmation to this preview and preventing duplicate work.
truth_preflightNotruth preflight value in this response.
confirmation_truthNoconfirmation truth value in this response.
confirmation_requiredNoTrue for a cost preview awaiting explicit approval.
requested_output_countNorequested output count value in this response.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedOutput schema / properties / note / anyOf
      Previous value: -[
      -  {
      -    "description": "Explanation when fewer eligible sources remain outside the cooldown, or why nothing could be priced.",
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Explanation when fewer eligible sources remain outside the cooldown.",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / note / description
      Previous value: -"Explanation when fewer eligible sources remain outside the cooldown, or why nothing could be priced."New value: +"Explanation when fewer eligible sources remain outside the cooldown."
    • removedOutput schema / properties / zero_reason
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "description": "Why there is nothing to price: needs_product_proof (add a product screenshot to the brand), cooldown (every source is resting) or no_sources.",
      -      "enum": [
      -        "needs_product_proof",
      -        "cooldown",
      -        "no_sources"
      -      ],
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Why there is nothing to price: needs_product_proof (add a product screenshot to the brand), cooldown (every source is resting) or no_sources."
      -}
  2. Changed3 schema fields changed
    • changedOutput schema / properties / note / anyOf
      Previous value: -[
      -  {
      -    "description": "Explanation when fewer eligible sources remain outside the cooldown.",
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Explanation when fewer eligible sources remain outside the cooldown, or why nothing could be priced.",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / note / description
      Previous value: -"Explanation when fewer eligible sources remain outside the cooldown."New value: +"Explanation when fewer eligible sources remain outside the cooldown, or why nothing could be priced."
    • addedOutput schema / properties / zero_reason
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Why there is nothing to price: needs_product_proof (add a product screenshot to the brand), cooldown (every source is resting) or no_sources.",
      +      "enum": [
      +        "needs_product_proof",
      +        "cooldown",
      +        "no_sources"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Why there is nothing to price: needs_product_proof (add a product screenshot to the brand), cooldown (every source is resting) or no_sources."
      +}
  3. Changed24 schema fields changed
    • changedInput schema / properties / brand_id / description
      Previous value: -"Brand reference from list_brands (e.g. the returned brand id)."New value: +"Brand id from list_brands. Needed unless sources.brand_id is given; when both are sent they have to be the same brand."
    • changedInput schema / properties / confirm / description
      Previous value: -"Whether the user has approved the displayed preview; defaults to false."New value: +"true starts the campaign from an approved preview and reserves credits; absent or false returns the cost preview and spends nothing."
    • changedInput schema / properties / count / description
      Previous value: -"Requested image count (1 to 10). With manual source_ad_ids in a preview, count equals the 2 to 5 selected sources. Automatic selection supports 1 to 10 images when source_ad_ids is absent. Confirmation uses count equal to output_count in the preview."New value: +"Number of images, 1 to 10 (default 3, or 6 with sources). On a preview with source_ad_ids it equals the number of ids (2 to 5); without them StealAds selects sources for 1 to 10 images. On confirmation, send count equal to output_count from the preview."
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Confirmation key from the cost preview; valid for 15 minutes."New value: +"idempotency_key from the cost preview, needed with confirm: true and valid for 15 minutes. An identical repeat returns the original campaign."
    • changedInput schema / properties / max_credits / description
      Previous value: -"Explicit credit ceiling approved from the preview."New value: +"max_credits from the cost preview, sent with confirm: true as the approved credit ceiling."
    • changedInput schema / properties / product_image_id / anyOf
      Previous value: -[
      -  {
      -    "description": "Product image reference from the brand images.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Asset id of a product image from list_brand_assets.",
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / product_image_id / description
      Previous value: -"Product image reference from the brand images."New value: +"Product image to feature: an asset id from list_brand_assets for this brand (asset_type product). Absent or null lets StealAds choose one of the brand's images."
    • changedInput schema / properties / prompt / description
      Previous value: -"Requested creative direction or change."New value: +"What the campaign should say or feature: offer, product, audience, angle (up to 4,000 characters). Needed unless sources is given. Statements here are compared with the saved brand details; differences, such as another audience, come back as conflicts in truth_preflight for the user to approve."
    • changedInput schema / properties / size / description
      Previous value: -"Output image aspect ratio."New value: +"Aspect ratio for every image in the campaign (default 1:1). 16:9 is not offered for every campaign; the preview reports when it is unavailable."
    • changedInput schema / properties / source_ad_ids / description
      Previous value: -"Manual preview sources: 2 to 5 distinct ads, with count equal to the array length. Absent for automatic selection, including requests for 1 or 6 to 10 images. Confirmation sources: all ordered source_ad_ids returned by the preview (1 to 10)."New value: +"Chosen source ads, as ad ids in UUID form. Preview: 2 to 5 distinct ids with count equal to their number; absent for automatic selection, the only way to quote 1 or 6 to 10 images. Confirmation: every source_ad_ids value the preview returned, in the same order. An ad that search returns can still be ineligible as a campaign source."
    • changedInput schema / properties / source_ad_ids / items / description
      Previous value: -"Distinct source ad references: 2 to 5 for a preview; confirmation echoes the returned ordered sources, up to 10."New value: +"One source ad id in UUID form."
    • changedInput schema / properties / sources / description
      Previous value: -"Automatically choose standout sources for one normal campaign; tracking is separate."New value: +"Automatic sources from the best ads of the brand's competitors, as an alternative to source_ad_ids. Skips ads this user already used for the brand in the last 14 days. Does not start tracking."
    • changedInput schema / properties / sources / properties / brand_id / description
      Previous value: -"Your brand reference from list_brands."New value: +"Brand id from list_brands."
    • changedInput schema / properties / sources / properties / category / description
      Previous value: -"Optional category in plain words for a one-time library sample instead of tracked rivals."New value: +"Optional category in plain words: takes sources from a one-time Ad Library sample of that category instead of tracked competitors."
    • changedInput schema / properties / sources / properties / count / description
      Previous value: -"Ads to make: default 6, maximum 10, the quote carries the current price."New value: +"Ads to make, 1 to 10 (default 6). The preview quotes fewer when too few eligible sources remain."
    • changedInput schema / properties / sources / properties / type / description
      Previous value: -"Select sources from the brand’s rivals’ best ads."New value: +"rivals_best: sources are standout ads from the brand's competitors."
    • changedInput schema / properties / truth / description
      Previous value: -"Brand facts and approvals used for this campaign."New value: +"Absent on the preview call. On confirmation, the preview's confirmation_truth object sent back unchanged; the key is signed over every field, so a missing or edited field is refused. Sending it states that the user approved the facts and any conflicts listed in truth_preflight."
    • changedInput schema / properties / truth / properties / canonical_brand_hash / description
      Previous value: -"Brand details fingerprint returned by the cost preview."New value: +"From the preview's confirmation_truth; sent back unchanged."
    • changedInput schema / properties / truth / properties / canonical_brand_revision / description
      Previous value: -"Brand details revision returned by the cost preview."New value: +"From the preview's confirmation_truth; sent back unchanged."
    • changedInput schema / properties / truth / properties / confirm_campaign_truth / description
      Previous value: -"Whether the user approved the brand facts shown in the preview."New value: +"From confirmation_truth: the user approved the brand facts shown in truth_preflight."
    • changedInput schema / properties / truth / properties / confirm_conflicts / description
      Previous value: -"Whether the user approved the conflicting facts shown in the preview."New value: +"From confirmation_truth: the user approved any conflicts shown in truth_preflight. Sent as returned even when the preview lists no conflicts; leaving it out voids the key."
    • changedInput schema / properties / truth / properties / conflict_hash / description
      Previous value: -"Conflict fingerprint returned by the cost preview."New value: +"From the preview's confirmation_truth; sent back unchanged."
    • changedInput schema / properties / truth / properties / revision / description
      Previous value: -"Revision number returned by the preview."New value: +"From the preview's confirmation_truth; sent back unchanged."
    • changedInput schema / properties / truth / properties / snapshot_hash / description
      Previous value: -"Fingerprint of the facts returned by the preview."New value: +"From the preview's confirmation_truth; sent back unchanged."
  4. First observed

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover mutation, idempotency and open-world behavior, yet the description adds real value beyond them: the preview 'spends nothing', confirmation 'reserves credits', the idempotency key is valid for 15 minutes, and 'Fewer images than requested can be delivered when sources or quality checks fail'. What is left implicit is the credit cost magnitude, which is only available at preview time — reasonable, but not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then the source modes, then the two-step mechanics, then the failure caveat — a sensible ordering. It is dense but largely earns its length; the parenthetical list of preview return fields partially duplicates the output schema and is the one trimmable passage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with nested objects and an output schema, the description covers the two-step contract, failure modes, credit reservation, and routes the agent to get_campaign_outputs for results. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description earns a step up by explaining cross-parameter workflow semantics the schema cannot express on its own: on confirmation, send 'count equal to output_count', the preview's source_ad_ids 'in the same order', and idempotency_key/max_credits carried forward from the preview.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and bounded output: 'Makes a set of 1 to 10 image ads for one brand in one size, each adapted from a source ad.' It also states a negative scope ('Does not publish ads') that separates it from publishing-oriented siblings, so an agent can identify it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Enumerates the three source-selection modes (rivals_best, source_ad_ids, automatic fallback) and the condition that selects each. It also explains when product_image_id and prompt are needed ('this is also the tool for controlled output') and gives the preview-then-confirm procedure with the exact arguments to repeat.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.