Skip to main content
Glama

Save competitor ad

save_competitor_ad
Idempotent

Keep one ad from search_competitor_ads on the account so it can be decoded and placed on a board. Pass the row exactly as returned. Costs no credits. Saving the same ad twice returns the existing saved ad. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.

Input Schema

NameRequiredDescriptionDefault
adYesOne row from search_competitor_ads results[], copied as is.

Output Schema

NameRequiredDescriptionDefault
adYes
next_stepYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / ad / properties / demo / description
      Previous value: -"True for a sample row: not a real ad. Never present a sample as live data."New value: +"True for a sample row: not a real ad and not live data."
    • changedOutput schema / properties / ad / properties / demo / description
      Previous value: -"True for a sample row: not a real ad. Never present a sample as live data."New value: +"True for a sample row: not a real ad and not live data."
  2. Changed2 schema fields changed
    • removedOutput schema / properties / ad / properties / saved_at
      Removed value: -{
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • changedOutput schema / properties / ad / required
      Previous value: -[
      -  "id",
      -  "ad_ref",
      -  "platform",
      -  "advertiser_name",
      -  "ad_copy",
      -  "media_url",
      -  "media_type",
      -  "estimated_spend",
      -  "engagement_score",
      -  "running_days",
      -  "hook_text",
      -  "cta_text",
      -  "ad_url",
      -  "demo",
      -  "decoded",
      -  "saved_at"
      -]New value: +[
      +  "id",
      +  "ad_ref",
      +  "platform",
      +  "advertiser_name",
      +  "ad_copy",
      +  "media_url",
      +  "media_type",
      +  "estimated_spend",
      +  "engagement_score",
      +  "running_days",
      +  "hook_text",
      +  "cta_text",
      +  "ad_url",
      +  "demo",
      +  "decoded"
      +]
  3. Added

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantive behavior beyond the annotations: zero credit cost, idempotent dedupe semantics ('Saving the same ad twice returns the existing saved ad'), and explicit sign-in/auth setup with the OAuth and Bearer-key paths. These are exactly the operational facts an agent needs before invoking a write tool.

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-loaded with purpose, then cost, idempotency, and auth — sensible ordering with little waste. The auth block is long, but it is genuinely required setup rather than filler; it could be tightened slightly by moving the URL to a trailing note.

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?

Covers purpose, source tool, input contract, cost, idempotency, and authentication, and an output schema already exists so return-value explanation is unnecessary. Nothing an agent needs to call this 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% and every nested field is documented, so the schema does the heavy lifting. The description still adds a real constraint — the single `ad` object must be the row exactly as returned, unmodified — which clarifies the copy-back requirement beyond the per-field descriptions.

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?

States a specific verb and resource ('Keep one ad ... on the account') and names its upstream source, search_competitor_ads, so the agent can distinguish it from get_saved_ad/list_saved_ads and from the search tool itself. It also names the downstream uses (decode, place on a board), which anchors the tool in the workflow.

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

Usage Guidelines4/5

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

'Keep one ad from search_competitor_ads' plus 'Pass the row exactly as returned' gives clear conditions for use and the input contract. It stops short of explicitly contrasting with adjacent consumers like decode_ad or ad_to_canvas_card, so the choice between saving-then-decoding versus decoding directly is left implicit.

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.