Skill instructions
amazon-ads5.53 KB
View saved version →
---
name: amazon-ads
description: "Analyze and manage Amazon Ads (Sponsored Products, Sponsored Brands, Sponsored Display) through Windsor.ai. Use when the user asks about their Amazon Ads performance (spend, clicks, impressions, sales, purchases, ACoS, ROAS by campaign, ad group, keyword, target, search term, placement or advertised product), or when they want to pause or enable a Sponsored Products campaign or change its daily budget. Do not use for Amazon Seller Central or Vendor Central orders and listings, or for other ad platforms. Also use when the user asks how to connect Amazon Ads to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Amazon Ads via Windsor.ai
Windsor.ai exposes live Amazon Ads data (read) and a small set of Sponsored
Products campaign actions (write) through MCP tools. The connector id is
`amazon_ads`. Pass `amazon_ads` as the connector on every tool call.
Golden rules:
- **Never guess field, account, action, or option names.** They come from
`get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those
first; do not invent identifiers.
- **Reads are safe; writes change live ad spend.** Only call `execute_action`
after the user has confirmed the specific change.
- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.
## 1. Check what is connected
Call `get_connectors` to see which Amazon Ads accounts (advertising profiles)
are connected. If none are connected, call `get_connector_authorization_url`
(or `get_connector_connect_info`) and give the user the setup link.
One Amazon login can hold several profiles, one per marketplace. If the user
names a marketplace or brand, match it to an account id; if the request is
ambiguous, ask which one.
## 2. Reading performance data
Amazon Ads fields are grouped by report, and each field id starts with its
report prefix. Examples (always confirm with `get_fields`):
- `sponsored_products_campaign__*`: campaign, campaign status, daily budget,
cost, clicks, impressions, ACoS, ROAS, attributed sales and conversions at
1, 7, 14 and 30 days
- `sponsored_products_search_term__*`: search term, keyword text, match type,
campaign and ad group, cost, clicks, purchases and sales at 1, 7, 14 and 30 days
- `sponsored_products_targeting__*`, `sponsored_products_placement__*`,
`sponsored_products_advertised_product__*`
- Sponsored Brands and Sponsored Display have their own report families
(for example `sponsored_brands_search_term__*`,
`sponsored_display_campaign__*`); their set differs from Sponsored
Products, so check `get_fields`
- shared fields without a prefix: `date`, `account_name`, `account_id`,
`marketplace`, `ad_type`
Recipe:
1. Call `get_fields` for `amazon_ads` and pick the report prefix that matches
the question (campaign, search term, targeting, placement, product).
2. Call `get_data` with fields from that one prefix plus shared fields such as
`date` or `account_name`. Keep each call to one report so the rows stay
comparable; run a second call for a second report.
3. Use the date range the user gave, or a preset such as `last_30d`, and say
which one you used.
Metric notes:
- **Attribution windows:** Sponsored Products sales, purchases and units come in 1, 7, 14 and 30
day versions (Sponsored Brands and Sponsored Display fields carry fewer
windows; read the field descriptions). Pick one window, name it in the answer, and use the same one
across campaigns.
- **ACoS** = ad spend / ad-attributed sales. **ROAS** = ad-attributed sales /
ad spend. The Sponsored Products `__acos` and `__roas` fields use 14-day
sales (for Sponsored Brands and Sponsored Display, check the field
description). For any other window, compute them from cost and the matching sales
field (for example `sponsored_products_campaign__attributedsales7d`), and say which window you used.
- Money fields are in the profile's currency. Profiles in different
marketplaces
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
budget-pacing7.66 KB
View saved version →
---
name: budget-pacing
description: "Check budget pacing and reallocate ad budgets across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads and Amazon Ads through Windsor.ai. Use when the user asks if campaigns are on track to spend their monthly budget, will overspend or underspend, which campaigns are limited by budget, how to split or shift budget between campaigns or platforms, or to plan next month's budget. Projects month-end spend, proposes budget changes with the expected effect, and changes budgets only after explicit approval."
---
Explicit instructions from the user take priority over this skill.
# Budget pacing and allocation
Answer two questions: are the accounts on track to spend the planned budget, and where should the next euro or dollar go. Read first, propose second, change budgets only after an explicit yes.
## 1. Get the plan
- The platforms hold daily or lifetime budgets, not a monthly plan. Ask for the planned amount: per account, per platform, or one total, and for which month. If the user has no plan, use the sum of current daily budgets x days in the month as the implied plan and say so.
- Ask for a target if they have one (cost per conversion or ROAS). Without one, rank by cost per conversion.
- Call `get_connectors` for the connected ad accounts; ask which to include if there are several.
## 2. Read spend and budgets
For each ad connector, read field ids from `get_fields`, then call `get_data` at campaign level (campaign name and id, status, spend, conversions, conversion value where available, and the budget fields) for month to date (`this_monthT` includes today; use `this_month` if today's data is still incomplete) and for the last 7 days.
Budget fields and units, checked 2026-11-09:
- Google Ads: `budget_amount` is the daily budget in the account currency (it does not multiply by the date range). `search_budget_lost_impression_share` is a fraction (0.25 = 25%) of Search impressions lost to budget. `recommended_budget_amount` is returned in micros despite its name (1,700,000,000 = 1,700.00) and is empty when Google has no recommendation.
- Meta Ads: `campaign_daily_budget`, `adset_daily_budget`, `adset_lifetime_budget` and `campaign_budget_remaining` are in cents (200 = 2.00); `campaign_lifetime_budget` is documented in normal currency units. Currencies without cents (JPY, KRW and others) use whole units. Budgets sit on the campaign (Advantage campaign budget) or on the ad set, never both; read both and use whichever is set.
- TikTok Ads: `campaign_budget` / `campaign_budget_mode` and `ad_group_budget` / `ad_group_budget_mode`, in the normal currency amount. Modes are daily, dynamic daily (`BUDGET_MODE_DYNAMIC_DAILY_BUDGET`, a weekly average, so one day can spend more; treat it as daily), lifetime, or unlimited.
- LinkedIn Ads: `campaign_daily_budget_amount`, `campaign_total_budget_amount`, `campaign_group_total_budget` (LinkedIn "campaigns" are ad sets; the two campaign amounts come back as text, so convert them to numbers).
- Microsoft Ads: `budget_amount` (daily cap) and `impression_lost_to_budget_percent` (a fraction, 0.10 = 10%, despite the name) can be read with spend. `monthly_budget` and `month_to_date_budget_spend` cannot be read with `spend`: read them together in a separate call that includes `date`, and use the values on the latest date. Without `date` the server adds up the daily values, which is wrong for both (`month_to_date_budget_spend` is already a running total). Use `conversions_qualified` for conversions.
- Amazon Ads: `sponsored_products_campaign__campaigndailybudget` and the Sponsored Brands budget fields with their `_budget_type`.
- Read units are not verified for LinkedIn and Amazon. Sanity-check every budget against average daily spend before using it; if a budget is 100x the daily spend, it is probably in cents or micros.
## 3. Pacing
- Days elapsed = completed days this month; days left = days in the month minus days elapsed.
- Projected month-end sp
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
campaign-launch3.55 KB
View saved version →
---
name: campaign-launch
description: "Create new campaigns, ad groups, ads and posts through Windsor.ai: Google Ads campaigns and responsive search ads, Meta Ads campaigns, ad sets and ads, Instagram, Facebook, LinkedIn, Threads and Google Business Profile posts, and Klaviyo flows. Use when the user wants to create, build, launch, draft or publish something new. Shows the full draft first, creates ad objects paused where the platform supports it, and creates only after confirmation."
---
Explicit instructions from the user take priority over this skill.
# Create on connected platforms
Create new items on connected accounts through Windsor.ai. Create actions currently exist on Meta Ads (facebook), Google Ads (google_ads), LinkedIn Ads (linkedin, ads from an existing post), Amazon DSP (amazon_dsp), Instagram (instagram), Facebook Pages (facebook_organic), LinkedIn Pages (linkedin_organic), Threads (threads), Google Business Profile (google_my_business), Google Merchant Center (google_merchant, products), Klaviyo (klaviyo), Salesforce (salesforce), GoHighLevel (gohighlevel), Stripe (stripe), WooCommerce (woocommerce, coupons), and WordPress (wordpress). TikTok Ads, Microsoft Ads and Amazon Ads have no create actions; the available create actions and their required fields are whatever list_actions returns for the connector.
## Non-negotiable contract
- Interpret create, make, build, publish, post, and launch as a creation request for this skill.
- Gather every required input first, show the complete draft, and create only after an explicit yes. Never create with placeholder values.
- Build params from the list_actions schema, not from memory. Create one item per confirmation unless the user approved an explicit list.
## Workflow
1. Call get_connectors to pick the connector and target account; ask if several match.
2. Call list_actions for the connector and read the schema of the create action.
3. Collect the inputs the schema requires, then present the full draft (every field, the account, and what will be live afterwards).
4. After an explicit yes, call execute_action once and report the created item and its state.
## Rules
- Created ad objects start paused (LinkedIn creatives start as drafts) where the platform supports it; say so, and offer the campaign-management skill to enable them once reviewed.
- Responsive search ads need 3 to 15 headlines, 2 to 4 descriptions, and a final URL; collect them before building params.
- Invoices and subscriptions bill a real customer; never create one with placeholder amounts, and show the amount, currency, and customer in the confirmation.
- Instagram image posts need a publicly reachable JPEG image URL (the caption is optional); Google Business Profile posts need the location and the post text. Show the exact text that will be published.
- Never invent budgets, bids, or copy; ask for them, then confirm the exact values. If the user wants creative help, draft it as text for approval first.
- If execute_action reports that write actions are not enabled, send the user to https://onboard.windsor.ai/app/settings/account and retry after they confirm.
## Hand-offs
- Reporting, rankings, comparisons, trends -> the marketing-performance-review skill
- Confirmed changes (pause, enable, budgets, bids, audiences, flows, listing updates) -> the campaign-management skill
- Connecting, reconnecting, adding an account, or asking what is connected -> the get-started skill
- Recurring exports and syncs -> the scheduled-exports skill
## Answer with evidence
Report exactly what was created, where, and its status, using the execute_action result.
Referenced files: 1 — file references are metadata, not package contents.
campaign-management4.47 KB
View saved version →
---
name: campaign-management
description: "Make confirmed changes on ad and marketing accounts connected to Windsor.ai: pause or enable campaigns, ad sets, ad groups and ads, set budgets on Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads and Amazon Ads, set bids and bidding strategies on Google Ads and Meta Ads, push Google Ads negative keywords, reply to reviews and comments, and update listings and CRM records. Use when the user wants to pause, enable, raise, lower, set, fix or update something. Always reads first and asks for confirmation before each change."
---
Explicit instructions from the user take priority over this skill.
# Manage connected platforms
Make confirmed changes on connected accounts through Windsor.ai. Write actions currently exist on Meta Ads (facebook), Google Ads (google_ads), TikTok Ads (tiktok), LinkedIn Ads (linkedin), Microsoft Ads (bing), Amazon Ads (amazon_ads), Instagram (instagram), Facebook Pages (facebook_organic), LinkedIn Pages (linkedin_organic), Threads (threads), Google Business Profile (google_my_business), Klaviyo (klaviyo), Amazon Seller Central (amazon_sp), Salesforce (salesforce), GoHighLevel (gohighlevel), Stripe (stripe), WordPress (wordpress), Google Merchant Center (google_merchant), ChatGPT Ads (openai_ads), Snapchat Ads (snapchat), WooCommerce (woocommerce), Amazon DSP (amazon_dsp). The exact set is whatever list_actions returns for the connector; it changes over time, so never assume an action exists.
## Non-negotiable contract
- Interpret pause, enable, stop, resume, set, raise, lower, update, and change as a write request for this skill.
- Every write follows read, propose, confirm, execute. Never call execute_action without an explicit yes to the specific change.
- Do not improvise a write with a different tool. If list_actions has no matching action, say so and offer the dashboard link from get_windsor_login_url.
- One change per confirmation. For a batch, list every item and get one explicit approval for the exact list.
## Workflow
1. Call get_connectors to find the connector slug and account; ask if several accounts match.
2. Resolve the target with a get_data read (name plus id fields) so the change points at an id, not a name.
3. Call list_actions for the connector and build the params from the returned JSON schema.
4. Show the concrete change, for example "Pause campaign 'Summer Sale' (id ...) on account ...?" or "Set the Google Ads daily budget for campaign X to 50.00 (50000000 micros)?", and ask for confirmation.
5. After an explicit yes, call execute_action once and report the result, including anything the platform returned.
## Rules that prevent wrong writes
- Deletes (a Salesforce record, an Instagram comment, a Google Ads Customer Match list) cannot be undone; name the item and its id in the confirmation, and prefer hiding over deleting a comment unless the user asks to delete.
- Budgets, bids, and targets are absolute values, not deltas. To raise a budget by 20 percent, read the current value, compute the new absolute amount, and set that.
- Budget units differ per platform: Google Ads takes micros (50.00 = 50000000), Meta takes cents (50.00 = 5000; whole units for currencies without cents such as JPY), LinkedIn, Microsoft Ads and Amazon Ads take the normal amount (50.00 = 50), and TikTok takes whole numbers (50). For any other connector, take the unit from the action's schema description. Convert the user's amount and show both values in the confirmation.
- If the user says "pause the worst one", first run the read and ranking (or hand it to the marketing-performance-review skill), then name the specific item and confirm before writing.
- If execute_action reports that write actions are not enabled for the account, send the user to https://onboard.windsor.ai/app/settings/account to turn them on, then retry after they confirm.
- If it reports a missing permission (for example Instagram comments on an account connected before comment acces
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
get-started7.13 KB
View saved version →
---
name: get-started
description: Guide a new Windsor.ai user through setup, choosing a data source, connecting an account, and getting a first useful report. Use when the user runs plugin setup, asks to get started, or needs help completing their initial connection. Regular reporting and campaign-management requests should use the platform or workflow skills, or the Windsor skill when none fits.
---
# Get started with Windsor.ai
Help the user reach their first useful result with their own data. Use the
Windsor.ai MCP tools already available in the conversation. Follow the user's
stated goal and language; skip questions they have already answered. Keep each
message short and ask only for the next choice that blocks progress.
## Start from the current connection
Call `get_connectors(include_actions=False, include_options=False)` to discover
connected sources and account names. If these optional flags are absent from
the live tool schema, omit them. Use returned connector and account IDs, never
invent them. An authentication or service error is not an empty account list.
- **Windsor is not authenticated:** use the host's Connect/sign-in action or
the connection prompt returned by the tool. Ask the user to finish it and
resume afterwards. Do not invent a sign-in URL or keep retrying a 401.
- **Relevant accounts already exist:** reuse them. With one matching account,
continue to the first report. With several, ask which account to use unless
the user already selected one or explicitly requested all of them. Show
account names, with a shortened ID only when names are missing or duplicated.
- **No relevant account is connected:** help connect the chosen source below.
Do not make a returning user reconnect a working account.
If the goal or platform is still unknown, ask one short question: what would
they like to understand, and on which platform? Offer a few relevant examples,
such as Instagram engagement, Facebook/Meta Ads results, Google Search Console
SEO, Google Analytics 4 website traffic or Google Ads performance. Accept any
other supported source; do not present a 350-source catalog or require a form.
When connected sources provide useful choices, offer those first.
## Connect the selected source
Before requesting a connection link, call
`get_connectors(include_not_yet_connected=True, include_actions=False,
include_options=False)` to obtain the connector ID from the complete catalog.
Omit unsupported optional flags. Distinguish organic Instagram from Instagram
Public and Meta Ads, Facebook Pages from Facebook Ads, and LinkedIn Pages from
LinkedIn Ads. Ask a focused question if the user's wording leaves that choice
unclear; never substitute another connector silently.
Call `get_connector_connect_info` for the discovered ID. Give the returned
`connect_url` as a labeled link and repeat provider-specific `notes` verbatim
when present. For OAuth, explain that the user authorizes and selects their
account in the browser. For manual connections, name the required fields and
send the user to that form to enter them. Never ask for passwords, API keys,
tokens or other secrets in chat. If connect-info is unavailable but
`get_connector_authorization_url` exists, use its returned URL and notes.
Ask the user to return when finished, then pause. Do not poll while they are
authorizing. On their return, call `get_connectors` again to verify the expected
account appears. Opening a link or completing provider sign-in alone does not
prove the connection is ready. If it is still absent, explain the remaining
account-selection or save step using the returned guidance. After one recovery
attempt with no progress, summarize the blocker and offer support; do not loop
through authorization. Cancellation should leave setup paused, without a claim
of completion. Do not submit a support request unless the user asks.
## Deliver the first report
Honor any report the user already requested, including their account and date
range. Fo
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
google-ads7.24 KB
View saved version →
---
name: google-ads
description: "Analyze and manage Google Ads through Windsor.ai. Use when the user asks about their Google Ads performance, such as pulling live campaign, ad group, or keyword metrics (cost, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns, or when they want to pause or enable campaigns, ad groups or ads, change budgets, bids or bidding strategies, add keywords or negative keywords, set targeting, or create campaigns, ad groups and responsive search ads. Do not use for other ad platforms (Meta/Facebook, TikTok, LinkedIn, Microsoft Ads), organic social, or GA4/website analytics. Also use when the user asks how to connect Google Ads to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Google Ads via Windsor.ai
Windsor.ai exposes live Google Ads data (read) and a broad set of campaign
management actions (write) through MCP tools. The connector id is
`google_ads`. Pass `google_ads` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
Golden rules:
- **Never guess field, account, action, or option names.** They come from
`get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those
first; do not invent identifiers.
- **Reads are safe; writes change live ad spend.** Only call `execute_action`
after the user has confirmed the specific change.
- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.
## 1. Check what is connected
Call `get_connectors` to see which Google Ads accounts are connected (each has
an id and, usually, a name). If none are connected, help the user connect one:
call `get_connector_authorization_url` (or `get_connector_connect_info` for the
auth type and steps) and give them the setup link; do not describe manual
dashboard navigation.
If the user names an account, match it to a connected account id. If several are
connected and the request is ambiguous, ask which account.
## 2. Reading performance data
1. Call `get_fields` for `google_ads` to get valid field ids (e.g. campaign,
ad_group, date, cost/spend, impressions, clicks, conversions, conversion
value. Use the exact ids returned, not these examples).
2. If the analysis needs attribution or segmentation controls, call
`get_options` to see the connector's options and valid values.
3. Call `get_data` with:
- `fields`: the ids you actually need (keep the set small).
- `accounts`: the target account id(s); omit for all connected accounts.
- A date range: either `date_from`/`date_to` (`"2026-02-01"`), or
`date_preset`: `last_7d`, `last_30d`, `last_Xd`/`last_Xw`/`last_Xm`,
`this_month`, `this_year`, `last_year`. Append `T` to include today
(e.g. `last_7dT`, `this_monthT`); `T` works on `last_Xd`, `this_month`,
`this_year` and `last_year`, not on `last_Xw` or `last_Xm`.
- `options`: only if get_options showed relevant ones.
- `filters`: optional conditions, e.g. `[["cost", "gt", 100]]`; combine with
`"and"`/`"or"` and nest as needed.
Common requests → recipe:
- **Overview / trend:** fields `date` + the metrics, over a preset range.
- **By campaign:** fields `campaign` + metrics; sort/aggregate in your answer.
- **Best / worst campaign:** pull campaign + the metric, then rank; return only
what was asked (e.g. just the campaign name) if the user constrained the
output format.
- **Efficiency:** cost per conversion = cost ÷ conversions; ROAS = conversion
value ÷ cost. Compute from returned fields; note if conversions are zero.
Watch out: most Google Ads money fields (spend, cost, `budget_amount`) are in
the account currency (state it if known); fields ending in `_micros`, and
`recommended_budget_amount`, `keyword_average_cpc` and `top_of_page_bid_*`,
are in micros. Check the field description. Conversions can be fractional. If a field the user wants isn't in
`get_fields`, say so rather than Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
google-analytics-44.2 KB
View saved version →
---
name: google-analytics-4
description: "Analyze Google Analytics 4 (GA4) data through Windsor.ai. Use when the user asks about their GA4 website or app analytics: sessions, users, new users, engagement, conversions/key events, bounce/engagement rate, pageviews, or breakdowns by channel, source/medium, campaign, landing page, device, country, or date. For spend and ROAS as reported by each ad platform, use the ad-platform connectors (GA4 only has cost for linked Google Ads accounts and imported cost data). Do not use for other analytics products, or changing GA4 settings. Also use when the user asks how to connect Google Analytics 4 (GA4) to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Google Analytics 4 (GA4) via Windsor.ai
Windsor.ai pulls live **read-only** GA4 report data through the Google Analytics
Data API. The connector id is `googleanalytics4`. Pass `googleanalytics4` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
This connector is **read-only analytics**: it reports GA4 metrics and dimensions.
Ad cost is only available for linked Google Ads accounts and imported cost
data (`advertiser_ad_cost`, `advertiser_ad_cost_per_key_event`,
`return_on_ad_spend`); spend from other platforms lives in their ad
connectors. It does **not** change any GA4 setting; there are no write
actions. If asked to create a conversion event, change settings, or
spend data, say that's out of scope here.
Golden rules:
- **Never guess field, property, or option names**; get them from `get_fields`,
`get_connectors`, and `get_options`. Call those first; GA4 has many
dimensions and metrics with exact API ids.
- Read-only connector; there are no live write actions to run.
- Report what the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which GA4 properties are connected (each has an id
and usually a name). If none is connected, help the user connect:
`get_connector_authorization_url` (or `get_connector_connect_info` for the auth
type and steps) and give them the setup link; don't describe manual dashboard
navigation. If several properties are connected and the request is ambiguous,
ask which one.
## 2. Reading GA4 data
1. Call `get_fields` for `googleanalytics4` to get valid field ids. GA4 splits
into **dimensions** (e.g. date, `session_default_channel_group`, source/medium,
campaign, landing page, devicecategory, country) and **metrics** (e.g.
sessions, active users, `conversions` (key events), engagement
rate, bounce rate, pageviews, average session duration, event count,
revenue). Use the exact ids returned, not these examples.
2. If the analysis needs specific controls, call `get_options` for the
connector's options and valid values.
3. Call `get_data` with the `fields` you need (a mix of dimensions and metrics),
the target property/account id(s) in `accounts`, and a date range; `date_from`/`date_to`
(`"2026-02-01"`) or a `date_preset` like `last_7d`, `last_30d`, `this_month`,
`last_year` (append `T` to include today). Add `filters` for conditions.
Common requests → recipe:
- **Traffic overview / trend:** `date` + sessions/users over a preset range.
- **By channel:** `session_default_channel_group` + sessions/conversions; rank in
your answer.
- **Top source or campaign:** the source/medium or campaign dimension + the
metric, then rank; return only what the user asked for (e.g. just the channel
name) if they constrained the output.
- **Conversions:** GA4 "conversions" are key events. Cost-per-conversion or ROAS
use `advertiser_ad_cost` for linked Google Ads and imported cost; for other
platforms, join spend from their ad connector and say the numbers come from
two sources.
Watch out: GA4 sampling/thresholding and property timezone can shift numbers;
metric availability depends on the property. If a field the user wants isn't in
`get_fields`, say so rather tha
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
google-merchant-center5.3 KB
View saved version →
---
name: google-merchant-center
description: "Analyze Google Merchant Center product feed and Shopping data through Windsor.ai. Use when the user asks about their Merchant Center product feed: product status counts (active, disapproved, pending, expiring), availability, clicks, impressions, CTR, or price benchmarks by product, brand, or category. It can also add, update, pause or delete products and create API data sources, always after the user confirms the exact change. Do not use for Google Ads Shopping campaign spend or ROAS (those live in the Google Ads connector) or other platforms (e.g. Amazon). Also use when the user asks how to connect Google Merchant Center to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Google Merchant Center via Windsor.ai
Windsor.ai pulls Google Merchant Center product feed and Shopping data. The
connector id is `google_merchant`. Pass `google_merchant` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
This connector reads product feed and Shopping data and has **no Google Ads
Shopping campaign data** (spend and ROAS live in the Google Ads connector, so
route those questions there).
Write actions (check `list_actions` for the live set and schemas):
`insert_product`, `update_product` (change attributes, clear attributes, or
pause a product), `delete_product`, and `create_data_source`. Changes go
through an API data source: products from a file feed or the Merchant Center
UI are changed through a supplemental API data source linked to their primary
data source (`create_data_source` with `link_to_primary_data_source`). Read
the product's `product_data_source` first, show the exact change, and run it
only after the user confirms. Merchant Center shows changes after a few
minutes. Deleting from a primary data source removes the whole product.
Golden rules:
- **Never guess field, account, or option names**; get them from
`get_fields`, `get_connectors`, and `get_options`. Call those first.
- Reads are safe. Writes change the live product feed: run `execute_action`
only after the user confirms the specific change.
- Report what the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which Merchant Center accounts are connected
(each has an id and, usually, a name). If none is connected, help the user
connect one: call `get_connector_authorization_url` (or
`get_connector_connect_info` for the auth type and steps) and give them the
setup link; do not describe manual dashboard navigation.
If the user names an account, match it to a connected account id. If several
are connected and the request is ambiguous, ask which account.
## 2. Reading Merchant Center data
1. Call `get_fields` for `google_merchant` to get valid field ids; product
and feed attributes (availability, price, price benchmark, brand,
category, and product status counts) and Shopping
performance metrics (clicks, impressions, CTR). Use the exact ids
returned, not these examples.
2. If the analysis needs segmentation controls, call
`get_options` to see the connector's options and valid values.
3. Call `get_data` with:
- `fields`: the ids you actually need (keep the set small).
- `accounts`: the target account id(s); omit for all connected accounts.
- A date range: either `date_from`/`date_to` (`"2026-02-01"`), or
`date_preset`: `last_7d`, `last_30d`, `this_month`; append `T` to
include today (e.g. `last_7dT`, `this_monthT`).
- `filters`: optional conditions, e.g. a price-benchmark threshold; combine with `"and"`/`"or"` as needed.
Merchant Center specifics to respect:
- Feed attributes (availability, price, price benchmark) and product status
counts describe the **current state of the feed**, while
clicks, impressions, and CTR are **per-day performance metrics** over the
requested range. Don't present a current feed attribute as if it varied
over a historicalPreview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
google-search-console3.57 KB
View saved version →
---
name: google-search-console
description: "Analyze Google Search Console (organic search) data through Windsor.ai. Use when the user asks about their site's organic Google Search performance: clicks, impressions, CTR, or average position, broken down by search query, page/URL, country, device, search appearance, or date. Do not use for paid search / Google Ads cost, other webmaster tools (e.g. Bing), web analytics like GA4, or changing Search Console settings. Also use when the user asks how to connect Google Search Console to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Google Search Console via Windsor.ai
Windsor.ai pulls live **read-only** Google Search Console data through the Search
Analytics API. The connector id is `searchconsole`. Pass `searchconsole` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
This connector is **read-only** organic-search analytics. It reports Search
Console metrics and dimensions; it does **not** cover paid search or ad cost
(that lives in the Google Ads connector), and it does **not** submit sitemaps or
change any Search Console setting; there are no write actions. If asked to
submit a sitemap or change settings, say that's out of scope here.
Golden rules:
- **Never guess field, site, or option names**; get them from `get_fields`,
`get_connectors`, and `get_options`. Call those first.
- Read-only connector; there are no live write actions to run.
- Report what the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which Search Console sites/properties are connected
(each has an id and usually a name). If none is connected, help the user connect:
`get_connector_authorization_url` (or `get_connector_connect_info` for the auth
type and steps) and give them the setup link; don't describe manual dashboard
navigation. If several sites are connected and the request is ambiguous, ask
which one.
## 2. Reading Search Console data
1. Call `get_fields` for `searchconsole` to get valid field ids. Search Console
splits into **dimensions** (e.g. query, page/URL, country, device, search
appearance, date) and **metrics** (clicks, impressions, CTR, average
position). Use the exact ids returned, not these examples.
2. Call `get_data` with the `fields` you need (dimensions + metrics), the target
site/account id(s) in `accounts`, and a date range; `date_from`/`date_to` (`"2026-02-01"`)
or a `date_preset` like `last_7d`, `last_28d`, `last_30d`, `this_month`.
Add `filters` for conditions (e.g. branded vs non-branded queries, a country).
Common requests → recipe:
- **Search performance overview / trend:** `date` + clicks/impressions/CTR/
position over a preset range.
- **Top queries or pages:** the query or page dimension + clicks/impressions,
then rank in your answer.
- **By country/device:** that dimension + the metrics.
- Position is an **average position** (lower is better); CTR is clicks ÷
impressions. Compute derived figures from returned fields.
Watch out: Search Console data typically lags by **~2 to 3 days** (very recent days
may be missing or partial) and history is limited to about **16 months**. It is
**organic** search only; there is no cost/spend data. If a field the user wants
isn't in `get_fields`, say so rather than substituting a different metric.
## 3. Reference real data, don't fabricate
On an error (unknown field/connector/site), call the relevant discovery tool and
retry with correct ids, or report the specific error. Never invent click counts,
positions, query strings, or site ids.
Referenced files: 1 — file references are metadata, not package contents.
instagram4.84 KB
View saved version →
---
name: instagram
description: "Analyze Instagram organic performance through Windsor.ai. Use when the user asks about their Instagram Business or Creator account's insights: followers, reach, views, profile or website clicks, engagement, or the performance of individual media/posts. It can also publish image, carousel, video (Reels) and story posts and reply to, hide, unhide or delete comments, always after the user confirms the exact change. Do not use for Instagram Ads (those live in the Meta/Facebook Ads connector), other platforms, or GA4/website analytics. Also use when the user asks how to connect Instagram to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Instagram (organic) via Windsor.ai
Windsor.ai pulls Instagram **organic** insights from the Instagram Graph API. The
connector id is `instagram`. Pass `instagram` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
This connector covers **organic** Instagram: profile and media insights, plus
publishing and comment moderation. It has **no ad or cost data** (Instagram Ads
live in the Meta/Facebook Ads connector, so route ad-spend questions there).
Write actions today are `create_image_post`, `create_carousel_post`,
`create_video_post`, `create_story`, `create_comment`, `reply_to_comment`,
`hide_comment`, `unhide_comment` and `delete_comment`; the live set is whatever
`list_actions` returns.
Golden rules:
- **Never guess field, account, or option names**; get them from `get_fields`,
`get_connectors`, and `get_options`. Call those first.
- **Publishing and comment changes are public and immediate.** Show the exact
caption, media URLs, or reply text and call `execute_action` only after an
explicit yes. `delete_comment` cannot be undone; prefer `hide_comment` unless
the user asks to delete.
- Report what the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which Instagram accounts are connected (each has an
id and usually a name/username). The account must be an Instagram Professional
account (Business or Creator) linked to a Facebook Page. If none is connected,
help the user connect: `get_connector_authorization_url` (or
`get_connector_connect_info` for the auth type and steps) and give them the
setup link; don't describe manual dashboard navigation.
If several accounts are connected and the request is ambiguous, ask which one.
## 2. Reading insights
1. Call `get_fields` for `instagram` to get valid field ids. Typical ones
include account-level metrics (e.g. `followers_count`, `follows_count`,
`media_count`, reach, views, profile/website clicks, engagement) and
per-media metrics. Use the exact ids returned, not these examples.
2. Call `get_data` with `fields`, the target account id(s) in `accounts`, and a date range
(`date_from`/`date_to` or a `date_preset` like `last_7d`, `last_30d`,
`this_month`; append `T` to include today).
Instagram date behaviour to keep in mind:
- **Lifetime metrics** (e.g. total followers) ignore the date range; the API
always returns the latest value. Don't present them as period-specific.
- Instagram no longer returns impressions (`impressions` and
`media_impressions` come back empty or 0); use `views` and `media_views`.
- Some **daily metrics** (for example `follower_count_1d`) only go back about
**30 days**; check the field description. Others, such as reach, return
older dates.
- **Stories** insights exist only for the **last 24 hours**.
If a metric the user wants isn't in `get_fields`, say so rather than
substituting a different one. There is no cost/spend data here.
## 3. Publishing and moderating comments
1. Call `get_connectors` to pick the account; ask if several are connected.
2. Call `list_actions` for `instagram` and build the params from the returned
schema. Media must be publicly reachable URLs (images JPEG, videos MP4 or
MOV); a carousel takes 2 to 10 im
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
linkedin-ads5.03 KB
View saved version →
---
name: linkedin-ads
description: "Analyze and manage LinkedIn Ads through Windsor.ai. Use when the user asks about their LinkedIn Ads performance (spend, impressions, clicks, CTR, CPC, conversions, or leads at campaign, campaign-group, or creative level, with member demographic breakdowns), or wants to pause/enable a campaign, campaign group, or creative, change a campaign or campaign-group budget, rename a campaign, change its schedule or targeting, or create an ad from an existing post. Do not use for LinkedIn organic company-page data (that's the LinkedIn Organic connector), other ad platforms, or GA4/web analytics. Also use when the user asks how to connect LinkedIn Ads to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# LinkedIn Ads via Windsor.ai
Windsor.ai exposes live LinkedIn Ads data (read) and campaign-management actions
(write) through MCP tools. The connector id is `linkedin`. Pass `linkedin` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
Golden rules:
- **Never guess field, account, action, or option names**; get them from
`get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those
first.
- **Reads are safe; writes change live ad spend.** Only call `execute_action`
after the user confirms the specific change.
- Report the numbers the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which LinkedIn ad accounts are connected. If none is
connected, help the user connect: `get_connector_authorization_url` (or
`get_connector_connect_info`) and give them the setup link. If several accounts
are connected and the request is ambiguous, ask which one.
## 2. Reading performance data
1. Call `get_fields` for `linkedin` to get valid field ids; metrics (spend/cost,
impressions, clicks, CTR, CPC, CPM, conversions, leads/form completions; note
that `conversions` counts post-view conversions only, so use
`externalwebsiteconversions` for total conversions and `oneclickleads` for
Lead Gen forms) and
dimensions (campaign, campaign group, creative, date, plus `member_*`
demographics like industry, job title, seniority, company size). Use the
exact ids returned.
2. Call `get_data` with `fields`, the target account id(s) in `accounts`, and a date range
(`date_from`/`date_to` or a `date_preset`; add `date` to the fields for a
daily breakdown, omit it for aggregated totals).
LinkedIn report specifics:
- **Report levels:** campaign, campaign group, and creative. Some fields require
a specific level (get_fields/get_options indicate this). Including an ad/
creative field returns creative-level data; otherwise it defaults to campaign
level.
- **Demographic fields (`member_*`)** use their own pivot; request **one
demographic breakdown at a time**, on its own, rather than combining several.
- The API allows up to ~20 metrics and up to 3 pivots per query; keep field sets
focused.
## 3. Managing campaigns (write actions)
LinkedIn Ads exposes these actions via `list_actions` / `execute_action`. Always
call `list_actions` first to confirm the exact ids and schemas, and treat the list
below as guidance:
- **`pause_campaign` / `enable_campaign`**; params: `campaign_id`.
- **`pause_campaign_group` / `enable_campaign_group`**; params:
`campaign_group_id`.
- **`pause_creative` / `enable_creative`**; params: `creative_id`.
- **`set_campaign_budget`**; params: `campaign_id`, `budget_type`
(`daily` or `total`), `amount`. A **total** budget requires the campaign to
have a schedule end date.
- **`set_campaign_group_budget`**; params: `campaign_group_id`, `amount`
(total budget only; the campaign group must have a schedule end date).
- Newer actions such as `rename_campaign`, `set_campaign_schedule`,
`set_campaign_targeting`, and `create_creative` are also listed today; build
their params only from the schema `list_actions` returns, and confir
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
marketing-performance-review7.67 KB
View saved version →
---
name: marketing-performance-review
description: "Review marketing performance across every source connected to Windsor.ai: paid ads (Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads, Amazon Ads), organic social, GA4, Search Console, CRM, e-commerce and payments. Use for campaign reports, weekly or monthly reviews, period-over-period comparisons, cross-channel comparisons, best and worst campaigns, and ROAS, CPA, spend, conversions or revenue questions. Read-only: does not change anything."
---
Explicit instructions from the user take priority over this skill.
# Windsor.ai insights
Read live data from any connected source through Windsor.ai and turn it into a clear report, ranking, comparison, or trend. The Windsor.ai server is not scoped to one platform: every tool takes a `connector` slug (for example `google_ads`, `facebook` for Meta Ads, `googleanalytics4`, `shopify`, `stripe`), so discover the slug and the accounts before reading.
## Resolve scope and time
- Call get_connectors first. It lists connected accounts per connector with their options and supported actions. If the source is not connected, hand off to the get-started skill instead of guessing. If several accounts match, ask which one.
- Read field ids from get_fields for the chosen connector, and get_options for date-filter columns and connector options. Never guess connector slugs, account ids, field ids, or option ids.
- Use the date range the user gave. If none, use a sensible preset (last_30d, this_month, last_7d) and state which one you used. Append T to a preset to include today.
## Choose the smallest useful read
- Channel or source comparison -> one get_data call per connector with a small shared field set (date plus the metric asked for), then compare in the answer and say the numbers are platform-reported.
- Best or worst item -> the entity field (campaign, post, page, product, customer) plus the ranking metric; name the metric used. If "best" or "worst" has no metric, ask which one.
- Trend -> date plus the metric over the preset; report direction and magnitude.
- Efficiency -> compute from the raw fields (cost per conversion = spend / conversions; ROAS = conversion value / spend; engagement rate = engagements / reach) and say when a denominator is zero.
- Keep field sets small, request only the accounts you need, and check for truncated or paginated results before claiming complete coverage.
## Accuracy guardrails
- Money fields are in the account currency; state it. Most Google Ads money fields (spend, cost, budget_amount) arrive in the account currency. Fields ending in `_micros`, and a few others such as `recommended_budget_amount`, `keyword_average_cpc` and `top_of_page_bid_*`, are in micros (1,000,000 = 1.00); check the field description. Google Ads write amounts are in micros, except target ROAS, which is a ratio (4.0 = 400%).
- Conversions can be fractional. Do not round them into integers silently.
- Attribution windows and metric definitions differ per platform; do not present cross-platform numbers as like for like.
- If a field the user wants is not in get_fields, say so rather than substituting a different metric.
## Platform notes
- Google Ads: some money fields are in micros (see above), so check the field description; search terms cannot be requested together with keyword fields, so read them in separate calls.
- Meta Ads, Facebook Pages, Instagram: reach and other unique metrics are deduplicated over the period; use the week or month field for weekly or monthly totals instead of summing daily rows. Facebook Pages returns one broken-down metric per request.
- GA4: conversions are key events; GA4 has ad cost only for linked Google Ads accounts and imported cost (`advertiser_ad_cost`), so join spend from the other ad connectors for their ROAS.
- Conversions differ per platform: Microsoft Ads uses `conversions_qualified` (its `conversions` field is deprecated and returns 0); LinkedIn `conversions` counts post-view co
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
meta-ads7.82 KB
View saved version →
---
name: meta-ads
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."
---
Explicit instructions from the user take priority over this skill.
# Facebook Ads via Windsor.ai
Windsor.ai exposes live Meta Ads data (read) and a set of campaign management
actions (write) for Facebook and Instagram ad placements through MCP tools.
The connector id is `facebook`. Pass `facebook` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
This connector covers **Meta Ads** (paid Facebook & Instagram ad placements)
only. It is distinct from Facebook Organic (Page posts) and Instagram
organic, which live in their own connectors; route organic questions there.
Golden rules:
- **Never guess field, account, action, or option names.** They come from
`get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those
first; do not invent identifiers.
- **Reads are safe; writes change live ad spend.** Only call `execute_action`
after the user has confirmed the specific change.
- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.
## 1. Check what is connected
Call `get_connectors` to see which Meta Ads accounts are connected (each has
an id and, usually, a name). If none are connected, help the user connect one:
call `get_connector_authorization_url` (or `get_connector_connect_info` for the
auth type and steps) and give them the setup link; do not describe manual
dashboard navigation.
If the user names an account, match it to a connected account id. If several are
connected and the request is ambiguous, ask which account.
## 2. Reading performance data
1. Call `get_fields` for `facebook` to get valid field ids (e.g. campaign,
ad set, ad, date, spend, impressions, clicks, actions_omni_purchase, action_values_omni_purchase. Use
the exact ids returned, not these examples).
2. If the analysis needs attribution windows or other segmentation controls,
call `get_options` to see the connector's options and valid values (e.g.
click/view attribution windows).
3. Call `get_data` with:
- `fields`: the ids you actually need (keep the set small).
- `accounts`: the target account id(s); omit for all connected accounts.
- A date range: either `date_from`/`date_to` (`"2026-02-01"`), or
`date_preset`: `last_7d`, `last_30d`, `last_Xd`/`last_Xw`/`last_Xm`,
`this_month`, `this_year`, `last_year`. Append `T` to include today
(e.g. `last_7dT`, `this_monthT`); `T` works on `last_Xd`, `this_month`,
`this_year` and `last_year`, not on `last_Xw` or `last_Xm`.
- `options`: only if get_options showed relevant ones.
- `filters`: optional conditions, e.g. `[["spend", "gt", 100]]`; combine
with `"and"`/`"or"` and nest as needed.
Common requests → recipe:
- **Overview / trend:** fields `date` + the metrics, over a preset range.
- **By campaign / ad set / ad:** fields campaign/ad set/ad + metrics; sort or
aggregate in your answer.
- **Best / worst campaign:** pull campaign + the metric, then rank; return only
what was asked (e.g. just the campaign name) if the user constrained the
output format.
- **Efficiency:** cost per result = spend ÷ conversions (or purchases); ROAS =
purchase value ÷ spend. Compute from returned fields; note if thePreview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
microsoft-ads7.25 KB
View saved version →
---
name: microsoft-ads
description: "Analyze and manage Microsoft Advertising (Bing Ads) through Windsor.ai. Use when the user asks about their Microsoft Ads performance, such as pulling live campaign, ad group, keyword, or ad metrics (spend, impressions, clicks, CTR, CPC, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns or ad groups, or when they want to pause or enable a campaign or ad group, or change a campaign's daily budget. Do not use for other ad platforms (Google Ads, Meta/Facebook Ads, TikTok Ads, LinkedIn Ads), organic Bing or web search rankings, or website analytics. Also use when the user asks how to connect Microsoft Ads (Bing Ads) to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Microsoft Ads (Bing) via Windsor.ai
Windsor.ai exposes live Microsoft Advertising (Bing Ads) data (read) and a
small set of campaign and ad group management actions (write) through MCP
tools. The connector id is `bing`. Pass `bing` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
Golden rules:
- **Never guess field, account, action, or option names.** They come from
`get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those
first; do not invent identifiers.
- **Reads are safe; writes change live campaign/ad group status or budget.**
Only call `execute_action` after the user has confirmed the specific change.
- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.
## 1. Check what is connected
Call `get_connectors` to see which Microsoft Ads accounts are connected (each
has an id and, usually, a name). If none are connected, help the user connect
one: call `get_connector_authorization_url` (or `get_connector_connect_info`
for the auth type and steps) and give them the setup link; do not describe
manual dashboard navigation.
If the user names an account, match it to a connected account id. If several
are connected and the request is ambiguous, ask which account.
## 2. Reading Microsoft Ads data
1. Call `get_fields` for `bing` to get valid field ids (e.g. campaign,
ad_group_name, keyword, ad_title, date, spend, impressions, clicks, CTR, CPC,
conversions_qualified, cost_per_conversion, revenue. Use the exact ids
returned, not these examples). The field `cpa` is cost per assist (spend /
assists), not cost per acquisition; compute CPA as spend / conversions or
use `cost_per_conversion`. Microsoft has deprecated `conversions`; prefer
`conversions_qualified`.
2. If the analysis needs segmentation or attribution controls, call
`get_options` to see the connector's options and valid values.
3. Call `get_data` with:
- `fields`: the ids you actually need (keep the set small).
- `accounts`: the target account id(s); omit for all connected accounts.
- A date range: either `date_from`/`date_to` (`"2026-07-01"`), or
`date_preset`: `last_7d`, `last_30d`, `last_Xd`/`last_Xw`/`last_Xm`,
`this_month`, `this_year`, `last_year`. Append `T` to include today
(e.g. `last_7dT`, `this_monthT`); `T` works on `last_Xd`, `this_month`,
`this_year` and `last_year`, not on `last_Xw` or `last_Xm`.
- `options`: only if `get_options` showed relevant ones.
- `filters`: optional conditions, e.g. `[["spend", "gt", 100]]`; combine with
`"and"`/`"or"` and nest as needed.
Common requests → recipe:
- **Overview / trend:** fields `date` + the metrics, over a preset range.
- **By campaign or ad group:** fields `campaign`/`ad_group_name` + metrics;
sort/aggregate in your answer.
- **Best / worst campaign or ad group:** pull the entity + the metric, then
rank; return only what was asked (e.g. just the name) if the user
constrained the output format.
- **Efficiency:** CPA = spend ÷ conversions; ROAS = `revenue` ÷ spend, or read `all_roas`; there is no `conversion_value` field.
Compute from returned fields; note if convePreview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
scheduled-exports2.16 KB
View saved version →
---
name: scheduled-exports
description: "Set up recurring exports of data connected to Windsor.ai to BigQuery, Snowflake, Redshift, PostgreSQL, MySQL, Databricks, Google Sheets, Amazon S3, Azure Blob Storage and other destinations, and check existing export tasks. Use for scheduled, daily, weekly or automated exports, data pipelines and reporting feeds. Do not use for a one-off answer in the conversation."
---
Explicit instructions from the user take priority over this skill.
# Export connected data on a schedule
Set up recurring exports of connected data to a warehouse, database, spreadsheet, or cloud storage through Windsor.ai, for example daily ad spend to BigQuery, a weekly GA4 summary to Google Sheets, or Shopify orders to Snowflake.
## Stay in scope
- Use this skill for recurring, scheduled, daily, weekly, or automated exports and syncs, and for questions about existing export tasks.
- A one-off answer is the marketing-performance-review skill, not an export.
## Workflow
1. Call get_destination_tasks to see existing exports and avoid duplicates.
2. Call get_connectors to confirm the source connector and accounts to export.
3. Call get_destinations to list destinations; note which have create_in_chat true and any reusable credentials.
4. Call get_destination_setup_info for the chosen destination to get its target fields, allowed schedules, and credential_id options.
5. Call get_fields for the source connector to get the exact field ids to export.
6. Confirm source, accounts, fields, destination target, credential, and schedule with the user, and tell them that each run replaces matching rows in the destination target, then call create_destination_task once. If create_in_chat is false, hand the user the setup_url instead.
## Rules
- Prefer a rolling date_preset (for example last_7d) over fixed dates so each run stays fresh.
- Never put secrets in config; sensitive values are entered by the user in the setup_url form.
- Report the created task's id, schedule, and manage_url from the tool result.
## Hand-offs
- Reporting -> the marketing-performance-review skill. Connecting a source -> the get-started skill. Changing platform state -> the campaign-management skill.
Referenced files: 1 — file references are metadata, not package contents.
tiktok-ads6.48 KB
View saved version →
---
name: tiktok-ads
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."
---
Explicit instructions from the user take priority over this skill.
# TikTok Ads via Windsor.ai
Windsor.ai exposes live TikTok Ads data (read) and a small set of campaign
management actions (write) through MCP tools. The connector id is `tiktok`.
Pass `tiktok` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
Golden rules:
- **Never guess field, account, action, or option names.** They come from
`get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those
first; do not invent identifiers.
- **Reads are safe; writes change live ad spend.** Only call `execute_action`
after the user has confirmed the specific change.
- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.
## 1. Check what is connected
Call `get_connectors` to see which TikTok Ads accounts are connected (each has
an id and, usually, a name). If none are connected, help the user connect one:
call `get_connector_authorization_url` (or `get_connector_connect_info` for the
auth type and steps) and give them the setup link; do not describe manual
dashboard navigation.
If the user names an account, match it to a connected account id. If several are
connected and the request is ambiguous, ask which account.
## 2. Reading performance data
1. Call `get_fields` for `tiktok` to get valid field ids (e.g. campaign,
ad_group_name, ad_name, date, spend, impressions, clicks, conversions, cost_per_conversion. Use
the exact ids returned, not these examples).
2. If the analysis needs attribution or segmentation controls, call
`get_options` to see the connector's options and valid values.
3. Call `get_data` with:
- `fields`: the ids you actually need (keep the set small).
- `accounts`: the target account id(s); omit for all connected accounts.
- A date range: either `date_from`/`date_to` (`"2026-07-01"`), or
`date_preset`: `last_7d`, `last_30d`, `last_Xd`/`last_Xw`/`last_Xm`,
`this_month`, `this_year`, `last_year`. Append `T` to include today
(e.g. `last_7dT`, `this_monthT`); `T` works on `last_Xd`, `this_month`,
`this_year` and `last_year`, not on `last_Xw` or `last_Xm`.
- `options`: only if get_options showed relevant ones.
- `filters`: optional conditions, e.g. `[["spend", "gt", 100]]`; combine with
`"and"`/`"or"` and nest as needed.
Common requests → recipe:
- **Overview / trend:** fields `date` + the metrics, over a preset range.
- **By campaign:** fields `campaign` + metrics; sort/aggregate in your answer.
- **Best / worst campaign:** pull campaign + the metric, then rank; return only
what was asked (e.g. just the campaign name) if the user constrained the
output format.
- **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.
Compute from returned fields; note if conversions are zero.
Watch out: TikTok Ads money fields are in the account currency (state it if
known). If a field the user wants isn't in `get_fields`, say so rather than
substituting a different metric.
## 3. Managing campaigns (write actions)
TikTok Ads exposes a small set of write actions via `list_actions` /
`execute_aPreview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
wasted-spend-audit5.31 KB
View saved version →
---
name: wasted-spend-audit
description: "Find ad spend that does not convert across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads and Amazon Ads through Windsor.ai: zero-conversion campaigns and ad sets, conversions far above the account's average cost, and Google Ads search terms to add as negative keywords. Use when the user asks where budget is wasted, how to cut spend, how to improve ROAS, or to optimize campaigns. Proposes fixes and applies only the ones the user approves."
---
Explicit instructions from the user take priority over this skill.
# Optimize ad spend
Find spend that is not paying off, show the evidence, and apply the fixes the user approves.
## 1. Scope
- Call `get_connectors` and list the connected ad accounts. Ask which accounts to include if there are several; default to all.
- Use the last 30 days unless the user gives a range. State the currency per account and never sum across currencies.
## 2. Find waste, per platform
For each ad connector, read field ids from `get_fields` first, then call `get_data` with campaign (and ad set or ad group) name and id, spend, clicks, impressions and conversions. Conversions differ per platform: Microsoft Ads uses `conversions_qualified` (its `conversions` field is deprecated and returns 0); LinkedIn `conversions` counts post-view conversions only, so use `externalwebsiteconversions`, plus `oneclickleads` for Lead Gen forms; Meta has no plain `conversions` field, so pick the `actions_*` event that matches the campaign objective (for purchases, `actions_omni_purchase` with `action_values_omni_purchase`). Check get_fields before treating any campaign as zero-conversion.
- **Zero-conversion spend:** items with spend above zero and no conversions, sorted by spend.
- **Expensive conversions:** items whose cost per conversion (spend / conversions) is more than twice the account average; show both numbers.
- **Search terms (Google Ads):** follow the recipe below for the negative keyword flow.
- Ignore items with too little data to judge (for example under 1,000 impressions) and say so.
## 3. Propose
Present one table per account: item, spend, conversions, cost per conversion, suggested action (pause, lower budget by an absolute amount, or add negatives), and the expected saving. Never propose touching brand campaigns or items the user marked as intentional.
## 4. Apply only what is approved
- Wait for an explicit yes to the exact list. Partial approval is fine.
- Call `list_actions` for each connector and build params from the returned schema (`pause_campaign`, `pause_adset`, `set_campaign_budget` and similar; the live set is what `list_actions` returns). Budget units differ per platform: Google Ads takes micros (50.00 = 50000000), Meta takes cents (50.00 = 5000; whole units for currencies without cents such as JPY), LinkedIn, Microsoft Ads and Amazon Ads take the normal amount (50.00 = 50), and TikTok takes whole numbers (50). Convert the user's amount and show both values in the confirmation.
- Call `execute_action` once per approved change and report what changed, before and after, and anything the platform rejected.
- If write actions are not enabled for the account, send the user to https://onboard.windsor.ai/app/settings/account and retry after they confirm.
## Hand-offs
- Reporting only -> the marketing-performance-review skill
- Creating replacement campaigns or ads -> the campaign-launch skill
## Recipe: Google Ads search terms
Review Google Ads search terms from the last 30 days, list the ones that spend without converting, and add the ones you approve as negative keywords.
### Instructions
1. Call `get_connectors` and pick the user's `google_ads` account. If there are several, ask which one.
2. Call `get_data` on `google_ads` with `["campaign", "campaign_id", "ad_group_name", "ad_group_id", "search_term", "spend", "clicks", "impressions", "conversions"]` and `date_preset: "last_30d"`. Google Ads cannot return `search_term` together with
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
windsor3.59 KB
View saved version →
---
name: windsor
description: Analyze marketing and business data and run supported write actions across 350+ sources through Windsor.ai. Use when the user asks about performance, metrics, or spend from any connected platform (ads, analytics, SEO, CRM, e-commerce, payments, warehouses), wants to compare channels, connect a source, run a supported action such as pausing a campaign or setting a budget, or schedule a recurring data export. Prefer a more specific Windsor.ai skill when one fits (a platform such as Google Ads or GA4, a performance review, wasted-spend audit, campaign management, campaign launch, budget pacing or scheduled exports); use this one for other sources and anything those skills don't cover. Do not use for writing marketing copy or for general advice unrelated to the user's connected accounts.
---
# Windsor.ai
Windsor.ai exposes live data (read) and supported write actions across 350+
connected sources through MCP tools. Every tool takes a `connector` id, a
lowercase slug such as `google_ads` for Google Ads, `facebook` for Meta Ads
(Facebook and Instagram Ads), or `googleanalytics4` for GA4. This app is not
scoped to a single connector, so always discover the right slug and accounts
first.
## Golden rules
- **Never guess** connector slugs, account ids, field ids, action ids, or option
ids. Get them from `get_connectors`, `get_fields`, `list_actions`, and
`get_options`, and call those before `get_data` or `execute_action`.
- **Reads are safe; writes change live platform state.** Only call
`execute_action` after the user confirms the specific change.
## Core read workflow
1. `get_connectors` shows connected accounts and, per connector, the available
`actions` and `options`. Pass `include_not_yet_connected=True` to list every
available source.
2. `get_fields` (and `get_options` for date-filter columns and connector
options) returns valid field ids for the chosen connector. Field ids passed
to `get_data` must come from `get_fields`.
3. `get_data` reads the metrics for the connector, fields, accounts, and date
range, then you analyze the result.
## Write actions
- `list_actions` returns the write actions a connector supports and each action's
parameter schema. The set is whatever it returns, so do not assume an action
exists.
- `execute_action` runs one action id against one account id with params matching
its schema. It modifies external platform state, for example pausing or
enabling a campaign, setting a budget or bid, managing an audience list or
flow, or posting content, so confirm the exact change with the user first.
## Connecting a source
For any request to connect, authorize, add, or reconnect an account, call
`get_connectors(include_not_yet_connected=True)` for the slug, then
`get_connector_authorization_url` for a ready-to-open setup link, or
`get_connector_connect_info` for the auth type and the manual credential fields.
Sensitive credentials are entered by the user in that form, never pasted into
chat.
## Scheduled exports (destinations)
- `get_destinations` lists where data can be exported on a schedule (BigQuery,
Google Sheets, Snowflake, databases, storage) and any reusable credentials.
- `get_destination_setup_info` describes a destination's target fields and
allowed schedules. `create_destination_task` sets up a recurring export;
confirm the source, destination, and schedule with the user first.
## Support and account
- `get_current_user` returns the authenticated Windsor.ai user.
- `get_windsor_login_url` returns an auto-login link into the dashboard.
- `contact_windsor` files feedback, a support request, or a feature request.
Referenced files: 1 — file references are metadata, not package contents.