← Windsor.aiCONTENT HISTORY
WHAT CHANGED
Update to Windsor.ai
Snapshot Nov 10, 2026 · 06:08 UTC · version 4.1.0
Collection source: downloaded plugin package.
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 JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Analyze and manage Meta Ads (Facebook & Instagram ad placements) through Windsor.ai. Use when the user asks about their Facebook Ads / Meta Ads performance, such as pulling live campaign, ad set, or ad metrics (spend, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns, or when they want to create, pause, or enable a campaign, ad set, or ad, change a budget, boost an existing post, or edit ad creative. Do not use for other ad platforms (Google Ads, TikTok, LinkedIn, Microsoft Ads), organic Facebook Page posts or Instagram organic content, or designing/generating ad creative images. Also use when the user asks how to connect Facebook Ads or Meta Ads to ChatGPT.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 368
}
],
"name": "meta-ads",
"skill_md_contents": "---\nname: meta-ads\ndescription: \"Analyze and manage Meta Ads (Facebook & Instagram ad placements) through Windsor.ai. Use when the user asks about their Facebook Ads / Meta Ads performance, such as pulling live campaign, ad set, or ad metrics (spend, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns, or when they want to create, pause, or enable a campaign, ad set, or ad, change a budget, boost an existing post, or edit ad creative. Do not use for other ad platforms (Google Ads, TikTok, LinkedIn, Microsoft Ads), organic Facebook Page posts or Instagram organic content, or designing/generating ad creative images. Also use when the user asks how to connect Facebook Ads or Meta Ads to ChatGPT.\"\n---\n\nExplicit instructions from the user take priority over this skill.\n\n# Facebook Ads via Windsor.ai\n\nWindsor.ai exposes live Meta Ads data (read) and a set of campaign management\nactions (write) for Facebook and Instagram ad placements through MCP tools.\nThe connector id is `facebook`. Pass `facebook` as the connector on every tool call; the Windsor.ai server\nserves all connectors, so it is never implied.\n\nThis connector covers **Meta Ads** (paid Facebook & Instagram ad placements)\nonly. It is distinct from Facebook Organic (Page posts) and Instagram\norganic, which live in their own connectors; route organic questions there.\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 Meta 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 `facebook` to get valid field ids (e.g. campaign,\n ad set, ad, date, spend, impressions, clicks, actions_omni_purchase, action_values_omni_purchase. Use\n the exact ids returned, not these examples).\n2. If the analysis needs attribution windows or other segmentation controls,\n call `get_options` to see the connector's options and valid values (e.g.\n click/view attribution windows).\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-02-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\n with `\"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 / ad set / ad:** fields campaign/ad set/ad + metrics; sort or\n 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:** cost per result = spend ÷ conversions (or purchases); ROAS =\n purchase value ÷ spend. Compute from returned fields; note if the\n denominator is zero.\n\nWatch out: Meta spend fields are in the account currency (state it if known).\nIf 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\nMeta Ads exposes a set of write actions via `list_actions` / `execute_action`.\nAlways call `list_actions` first for the exact ids and JSON schemas, and treat\nthe summary below as a guide. They cover:\n\n- **Create / structure:** `create_campaign` (Facebook or Instagram, with an\n objective such as OUTCOME_TRAFFIC/OUTCOME_LEADS/OUTCOME_SALES and any\n required `special_ad_categories`; created paused), `create_adset` (in an\n existing campaign, with targeting, optimization goal, and billing event;\n created paused), `create_ad` (in an existing ad set; either a simple\n link-ad builder from page_id/link/message/image_url/call_to_action_type, a\n Click-to-Message ad via `messaging_destination`, or a raw creative spec;\n created paused), `duplicate_adset` (copy an ad set, optionally with its\n ads), `create_ad_video` (upload a video from a public URL), and `create_ad_image`\n (takes image files, so it runs through `upload_files`, not `execute_action`;\n pass the returned image_hash to `create_ad`).\n- **Status:** `pause_campaign` / `enable_campaign`, `pause_adset` /\n `enable_adset`, `pause_ad` / `enable_ad`.\n- **Budget:** `set_campaign_budget` and `set_adset_budget` (`daily` or\n `lifetime`; setting one budget type replaces the other).\n- **Update existing objects:** `update_campaign` (name, bid_strategy,\n special_ad_categories, spend_cap), `update_adset` (name, targeting,\n optimization_goal, bid_amount/bid_strategy, destination_type, end_time),\n `update_ad` (name, creative reference, conversion_domain,\n display_sequence), `update_ad_creative` (edits an ad's copy, headline,\n description, link, image, call-to-action, URL tags, or one carousel card.\n Meta treats creatives as immutable, so this creates a new creative and\n re-points the ad at it).\n- **Organic post promotion:** `boost_post` (turn an existing organic Facebook\n or Instagram post into a paid ad in an existing engagement ad set, reusing\n the post as the creative; created paused).\n- **Messaging:** `set_page_welcome_message` (set the automated greeting shown\n when someone opens a conversation from a Click-to-Message ad).\n\nBudget and creation mechanics:\n\n- Money amounts are in the account currency's **minor unit** (e.g. cents):\n `5000` means 50.00; not micros. Currencies without cents (CLP, COP, CRC,\n HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: `300000` means\n 300000 COP. Convert the user's amount before calling.\n- Budget actions (`set_campaign_budget`, `set_adset_budget`, `spend_cap`) set\n an **absolute** value, not a delta. To \"raise by 20%\", read the current\n value first, compute the new absolute amount, and set that.\n- `create_campaign`, `create_adset`, `create_ad`, and `boost_post` all\n produce **paused** objects by default, so nothing spends until the user\n enables it.\n\nWrite workflow; every time:\n\n1. Resolve the campaign/ad set/ad to its id (via a `get_data` read on the\n relevant 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 set X to €50.00 (5000 in minor units)?\".\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: a3c815d5cf66f5e9cd809d47eac0d9ba79fd544ceefb56eb762cf101c01587d1