Skip to main content
Glama

Apogee: Bulk Ad Launcher for Meta, TikTok & Snapchat

List TikTok posts for Spark Ads

list_tiktok_posts
Read-onlyIdempotent

Existing TikTok posts to run as Spark Ads, keeping their likes and comments. TikTok Spark Ads: existing TikTok posts a launch can run as ads, keeping their likes and comments (the post's caption is the ad text). source "account" (default): the video posts of one of the brand's TikTok accounts (identity_id / identity_type from get_launch_questions identity.choices; default: the first one), a page at a time (next_cursor). source "authorized": the posts creators authorized for this ad account with a code (bound in the Apogee app). Each post says whether it can run (usable, refusals, warnings) and gives its spark_post, to put in prepare_launch ads[].spark_post instead of files.

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_account_id": "<ad_account_id>"
    },
    "name": "list_tiktok_posts"
  }
}

Input Schema

NameRequiredDescriptionDefault
pageNosource authorized: the page
bc_idNoBC_AUTH_TT: its Business Center
cursorNosource account: next_cursor of the previous page
sourceNo
identity_idNosource account: the TikTok account (get_launch_questions identity.choices.identities)
ad_account_idYesA TikTok advertiser id (list_ad_accounts platform tiktok)
identity_typeNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description adds valuable behavior beyond them: results are paginated "a page at a time (next_cursor)", the authorized source requires a code bound in the Apogee app, and each post reports "usable, refusals, warnings" plus its spark_post. It doesn't state rate limits or error behavior, but the disclosure is well above the annotation baseline.

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

Conciseness3/5

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

The purpose is front-loaded, but the body is a dense run-on with nested parentheticals and slash-separated alternatives ("identity_id / identity_type", "usable, refusals, warnings") that slow parsing. Restructuring into per-source bullets would preserve the content with far less parsing effort.

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

Completeness4/5

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

With no output schema, the description carries the return-shape burden and does so by naming the fields each post reports (usable, refusals, warnings, spark_post). Given seven parameters, two enums, and two distinct source modes, this is nearly complete; only edge cases like empty pages or invalid cursor handling are absent.

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 71% and the description meaningfully extends it: source's two modes, identity_type/identity_id sourcing from get_launch_questions, cursor mapping to next_cursor, and the authorized-source code/bc context. It adds little for page or bc_id beyond the schema, but overall it clarifies the parameter interaction (which params apply to which source) better than the schema alone.

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

Purpose4/5

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

The description opens with a specific verb+resource+scope: "Existing TikTok posts to run as Spark Ads, keeping their likes and comments," and immediately explains the two retrieval modes (brand-owned account posts vs. creator-authorized posts). It is clearly distinct from generic siblings like list_posts or list_ads, though it never names those siblings to reinforce the boundary.

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?

Strong downstream guidance: the output is meant to be placed in "prepare_launch ads[].spark_post instead of files," which tells the agent exactly why and where to call this. It also defines the default source ("account") and points to get_launch_questions identity.choices for identity_id, but gives no explicit when-not-to-use or exclusion versus other listing tools.

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.