Skip to main content
Glama

Save an ad

save_ad
Idempotent

Saves an ad to the user's saved ads (swipe file), optionally into a collection and with a note, and returns the saved entry. Works for ads in this account and public Ad Library ads. Saving an ad that is already saved changes only the collection or note that is supplied and creates no duplicate; it cannot unsort an ad, which move_saved_ad does with collection_id null. list_saved_ads reads saved ads back.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "ad_id": "<ad_id>"
    },
    "name": "save_ad"
  }
}

Input Schema

NameRequiredDescriptionDefault
ad_idYesAd id from a search or list result, or from get_ad.
notesNoOptional note about why the ad was saved, up to 2,000 characters. Absent or blank keeps the note an already-saved ad has.
collection_idNoOptional collection id from list_collections. Absent saves a new ad as unsorted and leaves an already-saved ad in the collection it is in; move_saved_ad with collection_id null unsorts it.

Output Schema

NameRequiredDescriptionDefault
savedAdNoThe saved-ad pointer and available evidence after this change.
operationNoWhether the saved-ad change inserted, updated or preserved the existing item.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / ad_id / description
      Previous value: -"Ad id from search_ads or get_ad."New value: +"Ad id from a search or list result, or from get_ad."
    • changedInput schema / properties / collection_id / description
      Previous value: -"Collection to save into."New value: +"Optional collection id from list_collections. Absent saves a new ad as unsorted and leaves an already-saved ad in the collection it is in; move_saved_ad with collection_id null unsorts it."
    • changedInput schema / properties / notes / description
      Previous value: -"Your notes about the ad."New value: +"Optional note about why the ad was saved, up to 2,000 characters. Absent or blank keeps the note an already-saved ad has."
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the idempotentHint annotation, it discloses the exact upsert semantics: re-saving an existing ad changes only the supplied collection or note and creates no duplicate, and a null collection_id cannot unsort it. That is precisely the behavioral detail an agent needs to call this safely twice.

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?

The action and its scope come first, followed by the upsert rule and the sibling pointers; every sentence carries routing or behavioral information. It is slightly dense in a single paragraph, but no sentence is filler.

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?

With annotations covering the safety profile, an output schema covering the return value, and full parameter documentation, the description fills the remaining gap — idempotent upsert behavior and the cannot-unsort limitation — leaving nothing an agent needs unresolved.

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

Parameters3/5

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

Schema description coverage is 100%, so ad_id, notes, and collection_id are already fully documented, including the absent/blank semantics. The description only restates that the fields are optional, adding no syntax or constraint detail the schema lacks.

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?

The description opens with a specific verb and resource ('Saves an ad to the user's saved ads (swipe file)') and explicitly carves out its scope against move_saved_ad and list_saved_ads, so an agent can route correctly without opening schemas.

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?

It states the valid sources ('ads in this account and public Ad Library ads'), the optional fields, and explicitly names the alternative for a related operation (move_saved_ad with collection_id null unsorts). The only absent pointer is to unsave_ad, which is a minor omission given the explicit alternative for unsorting.

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.