Skip to main content
Glama

Draft a Reddit ad

draft_reddit_ad

Draft a Reddit ad: creates a post on the profile, then the ad (PAUSED) — PREVIEW.

click_url and the media URLs are checked before drafting, so ads do not point at unverified pages and Reddit gets real image and video files. Comments are public on Reddit ads. With post_id an EXISTING post is promoted instead, keeping its upvotes and comments: no post is created and the copy arguments are ignored. Returns a preview with a plan_id; nothing changes until confirm_and_apply applies it. Once enabled, the ad goes through Reddit policy review (PENDING_APPROVAL).

Reddit Ads API: https://ads-api.reddit.com/docs/v3/

Input Schema

NameRequiredDescriptionDefault
bodyNoPost body text, up to 40,000 characters. Optional for media posts.
ad_nameNoAd name; empty uses the headline. Truncated to 200 characters.
post_idNoExisting post to promote (t3_...); headline, body, the media arguments, call_to_action and display_url are then ignored. Empty creates a new post.
headlineNoPost headline, required for a new post, at most 300 characters.
click_urlNoLanding page (http:// or https://). Required for a new post. TEXT posts open themselves, so the full click_url must also appear in body. With post_id, TEXT posts take no click_url and media posts default it to the post's destination.
image_urlNoPublicly reachable image URL, required for IMAGE posts.
post_typeNoTEXT (headline + optional body; default), IMAGE (public image_url), VIDEO (public video_url + thumbnail_url) or CAROUSEL (2 to 6 carousel_cards).TEXT
video_urlNoDirect link to the video file (MP4 or MOV, up to 1 GB), required for VIDEO posts. Reddit downloads it when the post is created; a page that embeds the video does not work.
profile_idNoReddit profile that authors the post, from list_reddit_funding_instruments (profiles). Required for a new post; with post_id it defaults to the post's.
ad_group_idYesReddit ad group id (from get_reddit_ad_groups).
display_urlNoOptional display URL shown with media posts; must be on the click_url's domain.
ad_account_idNoReddit ad account id (from list_reddit_accounts). Empty uses reddit.ad_account_id from the config.
thumbnail_urlNoPublicly reachable image Reddit shows before the video plays, required for VIDEO posts.
allow_commentsNoWhether Redditors can comment publicly on the ad (default true); false disables them.
call_to_actionNoOne of Reddit's fixed labels for media posts: Apply Now, Book Now, Buy Tickets, Contact Us, Donate Now, Download, Get a Quote, Get Directions, Get Showtimes, Install, Learn More, Listen Now, Order Now, Play Now, Pre-order Now, Read More, Remind Me, See Menu, Shop Now, Sign Up, Subscribe, View More, Visit Store, Watch Now. On a carousel it is the default for every card.
carousel_cardsNoFor CAROUSEL posts, 2 to 6 cards, each {"image_url": "...", "caption": "...", "click_url": "...", "call_to_action": "..."}. Only image_url is required; caption is at most 180 characters, click_url and call_to_action default to the ad's.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / body / description
      Previous value: -"Post body text for TEXT posts, up to 40,000 characters."New value: +"Post body text, up to 40,000 characters. Optional for media\nposts."
    • changedInput schema / properties / call_to_action / description
      Previous value: -"One of Reddit's fixed labels for IMAGE posts: Apply\nNow, Book Now, Contact Us, Download, Get a Quote, Get Showtimes,\nInstall, Learn More, Order Now, Play Now, Pre-order Now, See Menu,\nShop Now, Sign Up, View More, Watch Now."New value: +"One of Reddit's fixed labels for media posts: Apply\nNow, Book Now, Buy Tickets, Contact Us, Donate Now, Download, Get\na Quote, Get Directions, Get Showtimes, Install, Learn More,\nListen Now, Order Now, Play Now, Pre-order Now, Read More, Remind\nMe, See Menu, Shop Now, Sign Up, Subscribe, View More, Visit\nStore, Watch Now. On a carousel it is the default for every card."
    • addedInput schema / properties / carousel_cards
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "For CAROUSEL posts, 2 to 6 cards, each\n{\"image_url\": \"...\", \"caption\": \"...\", \"click_url\": \"...\",\n\"call_to_action\": \"...\"}. Only image_url is required; caption is\nat most 180 characters, click_url and call_to_action default to\nthe ad's."
      +}
    • changedInput schema / properties / display_url / description
      Previous value: -"Optional display URL shown with IMAGE posts."New value: +"Optional display URL shown with media posts; must be on\nthe click_url's domain."
    • changedInput schema / properties / post_id / description
      Previous value: -"Existing post to promote (t3_...); headline, body,\nimage_url, call_to_action and display_url are then ignored. Empty\ncreates a new post."New value: +"Existing post to promote (t3_...); headline, body, the\nmedia arguments, call_to_action and display_url are then ignored.\nEmpty creates a new post."
    • changedInput schema / properties / post_type / description
      Previous value: -"TEXT (headline + optional body; default) or IMAGE\n(headline + public image_url)."New value: +"TEXT (headline + optional body; default), IMAGE\n(public image_url), VIDEO (public video_url + thumbnail_url) or\nCAROUSEL (2 to 6 carousel_cards)."
    • addedInput schema / properties / thumbnail_url
      Added value: +{
      +  "default": "",
      +  "description": "Publicly reachable image Reddit shows before the video\nplays, required for VIDEO posts.",
      +  "type": "string"
      +}
    • addedInput schema / properties / video_url
      Added value: +{
      +  "default": "",
      +  "description": "Direct link to the video file (MP4 or MOV, up to 1 GB),\nrequired for VIDEO posts. Reddit downloads it when the post is\ncreated; a page that embeds the video does not work.",
      +  "type": "string"
      +}
  2. Changed13 schema fields changed
    • addedInput schema / properties / ad_account_id / description
      Added value: +"Reddit ad account id (from list_reddit_accounts).\nEmpty uses reddit.ad_account_id from the config."
    • addedInput schema / properties / ad_group_id / description
      Added value: +"Reddit ad group id (from get_reddit_ad_groups)."
    • addedInput schema / properties / ad_name / description
      Added value: +"Ad name; empty uses the headline. Truncated to 200\ncharacters."
    • addedInput schema / properties / allow_comments / description
      Added value: +"Whether Redditors can comment publicly on the ad\n(default true); false disables them."
    • addedInput schema / properties / body / description
      Added value: +"Post body text for TEXT posts, up to 40,000 characters."
    • addedInput schema / properties / call_to_action / description
      Added value: +"One of Reddit's fixed labels for IMAGE posts: Apply\nNow, Book Now, Contact Us, Download, Get a Quote, Get Showtimes,\nInstall, Learn More, Order Now, Play Now, Pre-order Now, See Menu,\nShop Now, Sign Up, View More, Watch Now."
    • addedInput schema / properties / click_url / description
      Added value: +"Landing page (http:// or https://). Required for a new\npost. TEXT posts open themselves, so the full click_url must also\nappear in body. With post_id, TEXT posts take no click_url and\nmedia posts default it to the post's destination."
    • addedInput schema / properties / display_url / description
      Added value: +"Optional display URL shown with IMAGE posts."
    • addedInput schema / properties / headline / description
      Added value: +"Post headline, required for a new post, at most 300\ncharacters."
    • addedInput schema / properties / image_url / description
      Added value: +"Publicly reachable image URL, required for IMAGE posts."
    • addedInput schema / properties / post_id / description
      Added value: +"Existing post to promote (t3_...); headline, body,\nimage_url, call_to_action and display_url are then ignored. Empty\ncreates a new post."
    • addedInput schema / properties / post_type / description
      Added value: +"TEXT (headline + optional body; default) or IMAGE\n(headline + public image_url)."
    • addedInput schema / properties / profile_id / description
      Added value: +"Reddit profile that authors the post, from\nlist_reddit_funding_instruments (profiles). Required for a new\npost; with post_id it defaults to the post's."
  3. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (which only declare non-readOnly, non-destructive, openWorld), the description discloses that this is a no-op preview until confirm_and_apply, that click_url and media URLs are validated up front, that the ad enters Reddit policy review (PENDING_APPROVAL), and that comments are public. That is substantial behavioral context the annotations do not carry.

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 the essential preview/no-op semantics, then the post_id branch and the API link. Dense but each sentence carries information; the multi-line wrapping makes it slightly harder to scan but nothing is wasted.

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 a 16-parameter mutation tool with an output schema and full annotation coverage, the description covers the preview lifecycle, the post_id branch, validation, and policy review. Since an output schema exists, it need not explain return values, and it still mentions the plan_id preview result.

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, but the description adds real cross-parameter meaning the schema does not: post_id suppresses post creation and makes the copy arguments ignored while preserving upvotes/comments, and media/landing URLs are verified before drafting. It does not restate the field enumerations, which the schema already handles.

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 first sentence gives a specific verb+resource (draft a Reddit ad) and immediately explains the two-step mechanics: create a post, then a PAUSED ad as a PREVIEW. This clearly separates it from siblings like draft_reddit_campaign, draft_reddit_ad_group and draft_reddit_custom_audience, and the preview/plan_id framing separates it from update_reddit_ad.

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?

It gives explicit context for the two operating modes: with post_id an existing post is promoted (copy args ignored), without it a new post is created, and it states nothing changes until confirm_and_apply. It stops short of naming a sibling alternative (e.g. update_reddit_ad) for the edit-existing-ad case, so it stops at 4.

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.