Skip to main content
Glama

Plan a boost

boost_plan

Plan a boost: on X (default) one to three of the founder's own posts; on Google (platform google) one to three search ads, each with its own keywords (the searches it answers), headlines (3 to 15, up to 30 characters) and descriptions (2 to 4, up to 90), only with searchVolumes from keyword_research showing people search for them; on Meta (platform meta) one to three ads written for it, each a primary text and a headline over the product video; on Reddit (platform reddit) one to three ads written for it, each a headline (up to 300 characters) over the product video, or with format post a text-only ad that reads like a post: a title (text, up to 300 characters) and a body, with comments on, on the Traffic objective optimised for clicks (Reddit offers text post ads no Sales objective, so no optimize) and with no destination URL: the tagged link is the body's last line, in brief.copy per ad group. An equal budget per post or ad (default $45, at most $300), the days, a tagged link per post so each visit and signup traces to it, what to expect and the stop rule. A post the founder named goes in as is: no data is read about it. Goal visits (default) runs each post as a Promoted-only copy with its link; reach boosts the post itself. targeting is who sees it, as the founder answered: locations, and optionally languages, gender, age, follower look-alikes, keywords, interests, and on Reddit communities (Meta: no look-alikes or keywords; Reddit: no look-alikes). Refused until ads_setup says the ad account and tracking are done on that platform. optimize is the step of the ladder the founder confirmed; a step with too few a week for the platform to learn from is refused (it bids high for the few people it guesses) unless force is true, which only the founder's own say-so after hearing that allows. posts[].media names the files you upload for each ad (cut and format), else the ad's files by name in the ads folder on the Desktop. refreshOf replaces a running boost whose creative or setup is weak: its messages are not offered again, and the plan returns what is left of its budget. firstStep (once per product, kept): whether a phone can take the product's first step, as you found it and the founder confirmed; without one on file a visits plan is refused. devices: every device, desktop only, or split (each ad twice, desktop only and phones only, half its budget each), as the founder confirmed; default from the first step (split when a phone cannot take it), returned as devices with the why. sizing says what each question costs: clicks (enough impressions to compare click rates) and signups (about 5 signups per ad group at the site's own rate, or why it cannot be priced), and what this budget answers; question sets the budget to the one the founder picked. landing: the A/B test of each ad's own line as the landing page's headline, only for the boost's visits (key, name, hypothesis, path, goal for experiment_create, and the gated page code for a PR). retargetOf plans the optional second phase: a small ad to an earlier boost's visitors who did not sign up (default $20 over 5 days, desktop only when a phone cannot take the first step; the audience is created first, in the setup). Returns the Ads Manager setup, the checks for the Review page, and brief.warnings: what is wrong with the audience for this message. Nothing is launched or spent. Free.

Input Schema

NameRequiredDescriptionDefault
daysNoDefault 3
goalNo
forceNoOnly when the founder still wants a step with too few a week to learn from, after you told them it bids high
postsYes
formatNoReddit only. video (default): a headline over the product video. post: a text-only ad written like a post to the community, a title (text) and a body, comments on; no video or image
repeatNoOnly when the founder asked to boost again a post or message boosted before; without it a repeat is refused
sourceNofounder: they named it. ranked: from boost_candidates
devicesNoAs the founder confirmed; default from the first step
optimizeNoWhat the campaign optimises for, as the founder confirmed from ads_setup's recommend; default that recommendation. Not for a Reddit post ad: it runs on Traffic, optimised for clicks
platformNoDefault x
questionNoWhat the founder wants the budget to answer, from sizing; sets the budget when budgetUsd is not given
budgetUsdNoTotal, split equally; default 45
firstStepNoOnce per product, after the founder confirmed it; kept for later plans
refreshOfNoThe id of the boost this one replaces; its ads are paused by the founder first
targetingNoWho sees the ads, as the founder answered. Ask before planning.
landingUrlNoWhere the link goes; default the site's home page
retargetOfNoRetarget this earlier boost's visitors who did not sign up (optional, only on the founder's yes)
searchVolumesNoGoogle: each keyword's searches a month and cost per click, from keyword_research

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / optimize / description
      Previous value: -"What the campaign optimises for, as the founder confirmed from ads_setup's recommend; default that recommendation"New value: +"What the campaign optimises for, as the founder confirmed from ads_setup's recommend; default that recommendation. Not for a Reddit post ad: it runs on Traffic, optimised for clicks"
    • changedInput schema / properties / posts / items / properties / body / description
      Previous value: -"Reddit post ad (format post): the body under its title, 80 to 2000 characters, no link (the tagged link is the ad's destination)"New value: +"Reddit post ad (format post): the body under its title, 80 to 2000 characters, no link (the plan adds the tagged link as its last line, returned in brief.copy)"
  2. Changed3 schema fields changed
    • addedInput schema / properties / format
      Added value: +{
      +  "description": "Reddit only. video (default): a headline over the product video. post: a text-only ad written like a post to the community, a title (text) and a body, comments on; no video or image",
      +  "enum": [
      +    "video",
      +    "post"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / posts / items / properties / body
      Added value: +{
      +  "description": "Reddit post ad (format post): the body under its title, 80 to 2000 characters, no link (the tagged link is the ad's destination)",
      +  "maxLength": 2000,
      +  "type": "string"
      +}
    • changedInput schema / properties / posts / items / properties / text / description
      Previous value: -"X: the post's text, for the Promoted-only copy. Meta: the ad's primary text. Reddit: the ad's headline"New value: +"X: the post's text, for the Promoted-only copy. Meta: the ad's primary text. Reddit: the ad's headline, or a post ad's title"
  3. Changed10 schema fields changed
    • addedInput schema / properties / devices
      Added value: +{
      +  "description": "As the founder confirmed; default from the first step",
      +  "enum": [
      +    "all",
      +    "desktop",
      +    "split"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / firstStep
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Once per product, after the founder confirmed it; kept for later plans",
      +  "properties": {
      +    "evidence": {
      +      "description": "What the first step is and where you read it, in one line",
      +      "maxLength": 300,
      +      "type": "string"
      +    },
      +    "phone": {
      +      "description": "A phone can take the product's first step",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "phone",
      +    "evidence"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / platform / enum
      Previous value: -[
      -  "x",
      -  "meta",
      -  "reddit"
      -]New value: +[
      +  "x",
      +  "meta",
      +  "reddit",
      +  "google"
      +]
    • addedInput schema / properties / posts / items / properties / descriptions
      Added value: +{
      +  "description": "Google: its descriptions, 2 to 4, each up to 90 characters",
      +  "items": {
      +    "maxLength": 90,
      +    "type": "string"
      +  },
      +  "maxItems": 4,
      +  "type": "array"
      +}
    • addedInput schema / properties / posts / items / properties / headlines
      Added value: +{
      +  "description": "Google: the search ad's headlines, 3 to 15, each up to 30 characters",
      +  "items": {
      +    "maxLength": 30,
      +    "type": "string"
      +  },
      +  "maxItems": 15,
      +  "type": "array"
      +}
    • addedInput schema / properties / posts / items / properties / keywords
      Added value: +{
      +  "description": "Google: the searches this ad answers, phrase match (\"keyword\") unless written [exact]",
      +  "items": {
      +    "maxLength": 80,
      +    "type": "string"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • addedInput schema / properties / question
      Added value: +{
      +  "description": "What the founder wants the budget to answer, from sizing; sets the budget when budgetUsd is not given",
      +  "enum": [
      +    "clicks",
      +    "signups"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / retargetOf
      Added value: +{
      +  "description": "Retarget this earlier boost's visitors who did not sign up (optional, only on the founder's yes)",
      +  "maxLength": 40,
      +  "type": "string"
      +}
    • addedInput schema / properties / searchVolumes
      Added value: +{
      +  "description": "Google: each keyword's searches a month and cost per click, from keyword_research",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "cpcUsd": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "keyword": {
      +        "maxLength": 80,
      +        "type": "string"
      +      },
      +      "monthly": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "keyword",
      +      "monthly"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 100,
      +  "type": "array"
      +}
    • addedInput schema / properties / targeting / properties / negativeKeywords
      Added value: +{
      +  "description": "Google: searches the ads never show on",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  4. Changed3 schema fields changed
    • addedInput schema / properties / force
      Added value: +{
      +  "description": "Only when the founder still wants a step with too few a week to learn from, after you told them it bids high",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / posts / items / properties / media
      Added value: +{
      +  "description": "The files you upload for this ad, from the ads folder on the Desktop: Meta ad1-video-portrait.mp4, ad1-video-vertical.mp4, ad1-image-portrait.png; Reddit and X ad1-video-square.mp4 (Reddit also ad1-image-square.png). Default those names",
      +  "items": {
      +    "maxLength": 200,
      +    "type": "string"
      +  },
      +  "maxItems": 6,
      +  "type": "array"
      +}
    • addedInput schema / properties / refreshOf
      Added value: +{
      +  "description": "The id of the boost this one replaces; its ads are paused by the founder first",
      +  "maxLength": 40,
      +  "type": "string"
      +}
  5. Changed7 schema fields changed
    • addedInput schema / properties / optimize
      Added value: +{
      +  "description": "What the campaign optimises for, as the founder confirmed from ads_setup's recommend; default that recommendation",
      +  "enum": [
      +    "landing_page_view",
      +    "signup",
      +    "payment"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / platform
      Added value: +{
      +  "description": "Default x",
      +  "enum": [
      +    "x",
      +    "meta",
      +    "reddit"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / posts / items / properties / headline
      Added value: +{
      +  "description": "Meta: the ad's headline",
      +  "maxLength": 60,
      +  "type": "string"
      +}
    • changedInput schema / properties / posts / items / properties / text / description
      Previous value: -"The post's text, for the Promoted-only copy"New value: +"X: the post's text, for the Promoted-only copy. Meta: the ad's primary text. Reddit: the ad's headline"
    • changedInput schema / properties / posts / items / properties / url / description
      Previous value: -"https://x.com/<handle>/status/<id>"New value: +"X: https://x.com/<handle>/status/<id>. Meta: none"
    • removedInput schema / properties / posts / items / required
      Removed value: -[
      -  "url"
      -]
    • addedInput schema / properties / targeting / properties / communities
      Added value: +{
      +  "description": "Reddit: subreddits, r/<name>",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  6. Changed1 schema field changed
    • addedInput schema / properties / repeat
      Added value: +{
      +  "description": "Only when the founder asked to boost again a post or message boosted before; without it a repeat is refused",
      +  "type": "boolean"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / targeting
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Who sees the ads, as the founder answered. Ask before planning.",
      +  "properties": {
      +    "age": {
      +      "description": "\"all\", \"25-54\" or \"35+\"",
      +      "type": "string"
      +    },
      +    "gender": {
      +      "enum": [
      +        "any",
      +        "male",
      +        "female"
      +      ],
      +      "type": "string"
      +    },
      +    "interests": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "keywords": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "languages": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "locations": {
      +      "description": "Countries, regions or cities, as Ads Manager names them",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "lookalikes": {
      +      "description": "X handles whose followers' look-alikes see the ads",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "locations"
      +  ],
      +  "type": "object"
      +}
  8. Added

TDQS

A4.4/5.0
Behavior5/5

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

Goes far beyond the annotations: it discloses that nothing is launched or spent, that an equal budget per ad is applied (default $45, cap $300), that firstStep is persisted once per product, that refreshOf drops the replaced boost's messages and returns leftover budget, and that the response includes Ads Manager setup, Review-page checks, and brief.warnings. These are exactly the side-effect, persistence, and refusal behaviors an agent cannot infer from readOnlyHint=false / destructiveHint=false alone.

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

Conciseness2/5

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

A single semicolon-chained block of roughly 600 words with no headings, lists, or paragraph breaks, making it hard to scan under time pressure. The most decision-critical line — 'Nothing is launched or spent. Free.' — is buried at the very end instead of front-loaded, and several sentences merely echo the input schema.

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?

Given 18 parameters, nested objects, and no output schema, the description covers all four platforms' asset requirements, default derivation, refusal conditions, persistence rules, and what the response contains. An agent has enough to construct a valid call and predict the outcome without opening any sibling tool.

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 already 89%, yet the description still adds genuine semantics: the $300 budget ceiling and equal split, devices defaulting from the first step (split when a phone can't take it), question overriding budgetUsd, Reddit post-ads forcing Traffic/click optimization, and retargetOf's $20-over-5-days desktop-only default. Some of the text merely restates schema limits (headlines 3–15, 30 chars; descriptions 2–4, 90 chars), which dilutes rather than extends the schema.

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 opening states a specific verb and resource ('Plan a boost') and immediately differentiates behavior per platform — X posts, Google search ads with headlines/descriptions, Meta primary text plus headline, Reddit video vs. text post formats — so an agent knows exactly what artifact is produced. It also names collaborators by name (keyword_research, ads_setup, boost_candidates, experiment_create), which anchors it against siblings.

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?

Prerequisites and gating are explicit: 'Refused until ads_setup says the ad account and tracking are done on that platform', visits plans are refused without a firstStep, repeats refused without repeat=true, and too-small optimize steps refused unless force is true. Defaults are traced to their sources (sizing for question, ads_setup recommend for optimize, boost_candidates for ranked). It stops short of explicitly distinguishing this tool from ads_propose/ads_review, so it isn't a full when/when-not/alternative map.

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.

Resources