← Windsor.aiCONTENT HISTORY

Update to Windsor.ai

Snapshot Nov 10, 2026 · 06:08 UTC · version 4.1.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Windsor.ai and check future changes in Following.

Up to 3 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Analyze and manage TikTok Ads through Windsor.ai. Use when the user asks about their TikTok Ads performance, such as pulling live campaign, ad group, or ad metrics (spend, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns, or when they want to pause or enable a campaign, ad group, or ad, or change a campaign or ad group budget. Do not use for TikTok organic (that's the TikTok Organic connector, which has no ad or cost data), or other ad platforms (Meta/Facebook, Google, LinkedIn, Microsoft Ads). Also use when the user asks how to connect TikTok Ads to ChatGPT.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 369
    }
  ],
  "name": "tiktok-ads",
  "skill_md_contents": "---\nname: tiktok-ads\ndescription: \"Analyze and manage TikTok Ads through Windsor.ai. Use when the user asks about their TikTok Ads performance, such as pulling live campaign, ad group, or ad metrics (spend, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns, or when they want to pause or enable a campaign, ad group, or ad, or change a campaign or ad group budget. Do not use for TikTok organic (that's the TikTok Organic connector, which has no ad or cost data), or other ad platforms (Meta/Facebook, Google, LinkedIn, Microsoft Ads). Also use when the user asks how to connect TikTok Ads to ChatGPT.\"\n---\n\nExplicit instructions from the user take priority over this skill.\n\n# TikTok Ads via Windsor.ai\n\nWindsor.ai exposes live TikTok Ads data (read) and a small set of campaign\nmanagement actions (write) through MCP tools. The connector id is `tiktok`.\nPass `tiktok` as the connector on every tool call; the Windsor.ai server\nserves all connectors, so it is never implied.\n\nGolden rules:\n\n- **Never guess field, account, action, or option names.** They come from\n  `get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those\n  first; do not invent identifiers.\n- **Reads are safe; writes change live ad spend.** Only call `execute_action`\n  after the user has confirmed the specific change.\n- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.\n\n## 1. Check what is connected\n\nCall `get_connectors` to see which TikTok Ads accounts are connected (each has\nan id and, usually, a name). If none are connected, help the user connect one:\ncall `get_connector_authorization_url` (or `get_connector_connect_info` for the\nauth type and steps) and give them the setup link; do not describe manual\ndashboard navigation.\n\nIf the user names an account, match it to a connected account id. If several are\nconnected and the request is ambiguous, ask which account.\n\n## 2. Reading performance data\n\n1. Call `get_fields` for `tiktok` to get valid field ids (e.g. campaign,\n   ad_group_name, ad_name, date, spend, impressions, clicks, conversions, cost_per_conversion. Use\n   the exact ids returned, not these examples).\n2. If the analysis needs attribution or segmentation controls, call\n   `get_options` to see the connector's options and valid values.\n3. Call `get_data` with:\n   - `fields`: the ids you actually need (keep the set small).\n   - `accounts`: the target account id(s); omit for all connected accounts.\n   - A date range: either `date_from`/`date_to` (`\"2026-07-01\"`), or\n     `date_preset`: `last_7d`, `last_30d`, `last_Xd`/`last_Xw`/`last_Xm`,\n     `this_month`, `this_year`, `last_year`. Append `T` to include today\n     (e.g. `last_7dT`, `this_monthT`); `T` works on `last_Xd`, `this_month`,\n     `this_year` and `last_year`, not on `last_Xw` or `last_Xm`.\n   - `options`: only if get_options showed relevant ones.\n   - `filters`: optional conditions, e.g. `[[\"spend\", \"gt\", 100]]`; combine with\n     `\"and\"`/`\"or\"` and nest as needed.\n\nCommon requests → recipe:\n\n- **Overview / trend:** fields `date` + the metrics, over a preset range.\n- **By campaign:** fields `campaign` + metrics; sort/aggregate in your answer.\n- **Best / worst campaign:** pull campaign + the metric, then rank; return only\n  what was asked (e.g. just the campaign name) if the user constrained the\n  output format.\n- **Efficiency:** CPA = spend ÷ conversions; TikTok has no single conversion value field, so for ROAS use the purchase fields from get_fields (for example `complete_payment_roas` for website purchases) and name the one used.\n  Compute from returned fields; note if conversions are zero.\n\nWatch out: TikTok Ads money fields are in the account currency (state it if\nknown). If a field the user wants isn't in `get_fields`, say so rather than\nsubstituting a different metric.\n\n## 3. Managing campaigns (write actions)\n\nTikTok Ads exposes a small set of write actions via `list_actions` /\n`execute_action`. Always call `list_actions` first for the exact ids and JSON\nschemas, and treat the summary below as a guide. They cover:\n\n- **Status:** `pause_campaign` / `enable_campaign`, `pause_ad_group` /\n  `enable_ad_group`, `pause_ad` / `enable_ad`; each reversible via its\n  counterpart.\n- **Budget:** `set_campaign_budget` (needs `campaign_id` and `amount`) and\n  `set_ad_group_budget` (needs `ad_group_id` and `amount`). There is no\n  ad-level budget action.\n\nBudget mechanics:\n\n- Amounts are whole numbers in the **account currency major unit**; `100`\n  means one hundred, not cents or micros; decimals such as 50.50 can't be sent.\n- Ad groups in Upgraded Smart+ campaigns can't be changed through this\n  action; send the user to TikTok Ads Manager for those.\n- The budget type (daily, lifetime, or dynamic daily) is fixed when the\n  campaign or ad group was created and is detected automatically; you only\n  supply the new amount, not the type.\n- `set_campaign_budget` and `set_ad_group_budget` set an **absolute** value,\n  not a delta. To \"raise by 20%\", read the current budget first (via\n  `get_data` or the platform), compute the new absolute amount, and set that.\n- A campaign whose budget is unlimited (`BUDGET_MODE_INFINITE`) or managed at\n  the ad group level has no campaign budget to set; use\n  `set_ad_group_budget` instead, and vice versa for an ad group whose budget\n  is managed at the campaign level (Campaign Budget Optimization). The action\n  reports this rather than silently doing nothing.\n- TikTok may apply some daily budget changes from the next day in the ad\n  account's time zone; if the user expects an instant change, tell them to\n  check in TikTok Ads Manager.\n\nWrite workflow; every time:\n\n1. Resolve the campaign/ad group/ad to its id (via a `get_data` read on the\n   corresponding name and id fields if the user gave a name).\n2. Build the exact params from the `list_actions` schema.\n3. **Show the user the concrete change and ask them to confirm**; e.g.\n   \"Pause campaign 'Summer Sale' (id 123…) on account 456…?\" or \"Set daily\n   budget for ad group X to €50?\".\n4. Only after an explicit yes, call `execute_action` and report the result.\n\nIf the user says \"pause the worst campaign\", first do the read + ranking, then\nname the specific campaign and confirm before pausing; don't pause based on the totals alone.\n\n## 4. Reference the user's data, don't fabricate\n\nIf a tool returns an error (unknown field/connector/account), call the relevant\ndiscovery tool (`get_fields`, `get_connectors`, `list_actions`) and retry with\ncorrect ids. Never fill gaps with made-up numbers or campaign names.\n"
}

SHA-256 of public snapshot: 2bbf1f2138ddb371c3ed31971cad61068cc7432b80696b0f0e0e229ebc9553a3