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.
ecommerce-report3.41 KB
View saved version →
---
name: ecommerce-report
description: "Report on e-commerce sales from Shopify, Amazon Seller Central, WooCommerce, TikTok Shop, eBay and other stores connected to Windsor.ai. Use for revenue, orders, average order value, refunds, top products and period comparisons, and to combine store sales with ad spend for ROAS. Read-only: does not change anything."
---
Explicit instructions from the user take priority over this skill.
# E-commerce insights
Read live e-commerce data from Shopify, Amazon Seller Central, WooCommerce, TikTok Shop, eBay, BigCommerce, Klaviyo, and Google Merchant Center through Windsor.ai and turn it
into a clear report, ranking, comparison, or trend. The main connector ids for this area are shopify, amazon_sp (Amazon Seller Central), woocommerce, tiktok_shop, ebay, bigcommerce, klaviyo, google_merchant. Other sources in the same category work the same way; find their ids with get_connectors.
## Stay in scope
- Use this skill for metrics, rankings, comparisons, trends, and breakdowns of orders, revenue, average order value, units, refunds, top products, listing and product-feed status, and email-flow performance across store or marketplace account, order, product or listing, and flow.
- If the user asks to pause, enable, change a budget or bid, or update a record, use the campaign-management skill instead.
- If the user asks to connect, reconnect, or add an account, use the get-started skill instead.
- If the user asks for a recurring, scheduled, or automated export, use the scheduled-exports skill instead.
## Resolve scope and time
- Call get_connectors first to see which of these sources have connected accounts. If several accounts match the request, 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 ids or field names.
- 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
- Sales overview -> fields [date, orders, revenue] over the preset; add average order value = revenue / orders.
- Top products -> fields [product, units, revenue], rank by the metric the user names.
- Listing health -> Merchant Center or Amazon fields for status and disapprovals; report counts and reasons.
- Flow performance -> Klaviyo fields [flow, sent, opens, clicks, revenue] over the preset.
- Keep field sets small and request only the accounts you need. Check for truncated or paginated results before claiming complete coverage.
## Accuracy guardrails
- Revenue is in the store currency; state it. Refunds may be reported separately; say whether figures are gross or net.
- Marketplace and store data are not deduplicated across sources; report per source unless asked otherwise.
- If a field the user wants is not in get_fields, say so rather than substituting a different metric.
- If "best", "top", or "worst" lacks a metric, ask which metric should define the ranking.
## Answer with evidence
Lead with the requested result, then state the account or source, the time window, and the numbers behind the conclusion. Keep internal ids and raw JSON out of the answer unless the user asks for them.
## Hand-offs
After a report that surfaces an underperformer, offer once to open the campaign-management skill for it. Never offer plans, upgrades, or pricing. Never repeat an offer the user declined.
Referenced files: 1 — file references are metadata, not package contents.
facebook-pages4.39 KB
View saved version →
---
name: facebook-pages
description: "Analyze Facebook Page (organic) performance through Windsor.ai. Use when the user asks about their Facebook Page's organic insights: reach, impressions, engagement, reactions, follows/fans, or the performance of individual posts, videos, and Reels, by date/week/month or by country. It can also publish a photo post or a text and link post to a Page, always after the user approves the full draft. Do not use for Facebook Ads (those live in the Meta/Facebook Ads connector), boosting posts, Instagram, or other platforms. Also use when the user asks how to connect Facebook Pages (Facebook organic) to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Facebook Organic (Pages) via Windsor.ai
Windsor.ai pulls Facebook **Page organic** insights from the Facebook Graph API.
The connector id is `facebook_organic`. Pass `facebook_organic` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
Reads are the main job. The connector also exposes write actions, currently
`create_post` and `create_photo_post` (the live set is whatever `list_actions`
returns). It has **no ad or cost data** (Facebook Ads live in the Meta/Facebook
Ads connector, so route ad-spend and boost requests there), it does not cover
Instagram, and it does not change Page settings; say those are out of scope
here.
Golden rules:
- **Never guess field, page, or option names**; get them from `get_fields`,
`get_connectors`, and `get_options`. Call those first.
- **Publishing is public and immediate.** Show the full post text (and the
photo URL) and call `execute_action` only after an explicit yes.
- Report what the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which Facebook Pages 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 Pages are connected and the request is ambiguous, ask
which one.
## 2. Reading Page insights
1. Call `get_fields` for `facebook_organic` to get valid field ids. These span
Page-level metrics (reach, impressions, engaged users, follows/fans, video
and Reels plays) and post-level fields (reactions, comments, shares, clicks,
post reach/impressions). Use the exact ids returned, not these examples.
2. Call `get_data` with `fields`, the target Page/`account`(s), and a date range
(`date_from`/`date_to` or a `date_preset` like `last_7d`, `last_30d`,
`this_month`; append `T` to include today). Add `filters` as needed.
Facebook Organic specifics to respect:
- **One broken-down (segmented) metric per request.** The connector can't return
multiple broken-down metrics in one call; request them separately and combine
in your answer rather than asking for several at once.
- **Weekly/monthly aggregation.** Requesting a week field (`week_iso`/
`year_week_iso`, or `week`/`year_week`) returns one row per week; a month field
(`month`/`year_month`) one row per month. Facebook **deduplicates** unique
metrics (reach, unique impressions) over the period, so use the week/month
field for weekly/monthly totals; do **not** sum daily rows, which over-counts
uniques.
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 a post
1. Call `get_connectors` to pick the Page; ask if several are connected.
2. Call `list_actions` for `facebook_organic` and read the schema of
`create_post` or `create_photo_post`; a photo post needs a publicly
reachable image URL.
3. Draft the post as text first and show it in full, exactly as it will
appear, then wait for an explicit yes. Never publish placeholder text.
4. Call `execute_action` once and report the result from
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-business-profile5.3 KB
View saved version →
---
name: google-business-profile
description: "Google Business Profile through Windsor.ai: location views, clicks, calls, direction requests and search keywords, reviews and ratings, local posts and photos, and confirmed changes; publish or update a local post, reply to a review, add a photo, update the description, website, phone numbers, categories, attributes, services, service area or address, and set regular hours, holiday hours or temporary closure. Use for questions about a business location on Google Search and Maps. Do not use for Google Ads, Search Console or GA4. Also use when the user asks how to connect Google Business Profile (Google My Business) to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Google Business Profile via Windsor.ai
The connector id is `google_my_business`. It covers the user's own Google Business Profile locations: performance, reviews, local posts and photos, and listing management. It has no ad or website search data; Google Ads and Search Console are separate connectors with their own skills.
Write actions today are `create_local_post`, `update_local_post`, `reply_to_review`, `upload_media`, `update_location`, `update_categories`, `update_attributes`, `update_service_items`, `update_service_area`, `update_address`, `set_regular_hours`, `set_special_hours` and `set_open_status`. The live set and each action's parameters are whatever `list_actions` returns. New posts follow the campaign-launch skill and review replies follow the campaign-management skill.
## Reading
1. Call `get_connectors` to pick the location; ask if several are connected.
2. Call `get_fields` for `google_my_business` and use the exact ids it returns.
3. Call `get_data` with the fields, the location and a date range.
Fields that are easy to misread:
- `impressions` is Maps plus Search, desktop plus mobile; the split is in `impressions_desktop_maps`, `impressions_desktop_search`, `impressions_mobile_maps` and `impressions_mobile_search`. `clicks` is `call_clicks` plus `website_clicks`.
- By default, review rows and local post rows cover only reviews and posts created in the requested range. Use a wide range to list older ones.
- `review_average_rating` and `review_count` are limited to the range; `review_average_rating_total` and `review_total_count` are all-time.
- `location_*` fields describe the listing's current state (address, categories, hours, attributes, services, service area).
## Changing the listing
Every change follows read, propose, confirm, execute:
1. Read the current value with `get_data` (the matching `location_*`, `post_*` or `review_*` fields).
2. Call `list_actions` and build params from the schema.
3. Show the current value and the new value side by side, and wait for an explicit yes.
4. Call `execute_action` once and report the result. Google may review listing edits before they appear.
Actions that replace a whole set (resend everything the listing should keep):
- `update_service_items` replaces all services; read `location_service_items` first.
- `update_categories` sets the primary category and replaces every additional category (at most 9); omitting `additional_category_ids` removes them all. Read `location_primary_category_id` and `location_additional_categories` first.
- `update_service_area` replaces all places (at most 20); read `location_service_area` first.
- `set_regular_hours` replaces all weekly hours; a day with no period shows as closed. Read `location_regular_hours_periods` first.
- `set_special_hours` replaces all special dates. Read `location_special_hours_periods` first and resend every upcoming exceptional date the listing should keep together with the new ones.
- `update_attributes` is the exception: it changes only the attributes named.
Actions that can unpublish the listing:
- `update_address`, and `update_service_area` with `hide_business_address=true`, can send the listing back into Google's verification, which may unpublish it until
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.
linkedin-pages4.21 KB
View saved version →
---
name: linkedin-pages
description: "Analyze LinkedIn company page (organic) performance through Windsor.ai. Use when the user asks about their LinkedIn page's organic insights: follower growth, impressions, reach, clicks, reactions, comments, shares, engagement rate, or visitor demographics by industry, job function, seniority, or company size. It can also publish a text or image post to the company page, always after the user approves the full draft. Do not use for LinkedIn Ads (those live in the LinkedIn Ads connector) or other platforms. Also use when the user asks how to connect LinkedIn Pages to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# LinkedIn Pages via Windsor.ai
Windsor.ai pulls LinkedIn **organic** company page insights (page and post
metrics, plus visitor demographics). The connector id is `linkedin_organic`.
Pass `linkedin_organic` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
Reads are the main job. The connector also exposes write actions, currently
`create_post` and `create_image_post` (the live set is whatever `list_actions`
returns). It has **no ad or cost data** (LinkedIn Ads live in the LinkedIn Ads
connector, so route ad-spend questions there) and does not change page
settings; say that is out of scope here.
Golden rules:
- **Never guess field, account, or option names**; get them from
`get_fields`, `get_connectors`, and `get_options`. Call those first.
- **Publishing is public and immediate.** Show the full post text (and the
image URL) and call `execute_action` only after an explicit yes.
- Report what the user asked for, concisely.
## 1. Check what is connected
Call `get_connectors` to see which LinkedIn Pages are connected (each has an
id and usually a page 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 pages are connected and the request is
ambiguous, ask which one.
## 2. Reading LinkedIn Pages data
1. Call `get_fields` for `linkedin_organic` to get valid field ids; page and
post metrics (follower growth, impressions, reach, clicks, reactions,
comments, shares, engagement rate) and visitor demographic breakdowns (by
industry, job function, seniority, and company size). Use the exact ids
returned, not these examples.
2. Call `get_data` with `fields`, the target `account`(s), and a date range
(`date_from`/`date_to` or a `date_preset` like `last_7d`, `last_30d`,
`this_month`; append `T` to include today). Add `filters` as needed.
LinkedIn Pages specifics to respect:
- **Page-level metrics** (e.g. follower counts) and **post-level metrics**
(e.g. per-post reactions, comments, shares) live at different granularity; don't mix them into one row unless the fields returned support it.
- **Demographic breakdowns** (industry, job function, seniority, company
size) describe page visitors or followers over the period, not individual
posts; request them on their own rather than expecting them inline with
post-level engagement fields.
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 a post
1. Call `get_connectors` to pick the page; ask if several are connected.
2. Call `list_actions` for `linkedin_organic` and read the schema of
`create_post` or `create_image_post`; an image post needs a publicly
reachable image URL.
3. Draft the post as text first and show it in full, exactly as it will
appear, then wait for an explicit yes. Never publish placeholder text.
4. Call `execute_action` once and report the result from the tool, including
any post id or URL it returns.
5. If the action is refused because write actions are not enabled for the
account, send the user to https://onboa
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.
social-media-report3.28 KB
View saved version →
---
name: social-media-report
description: "Report on organic social media across Instagram, Facebook Pages, TikTok, LinkedIn Pages, YouTube, Threads and Google Business Profile connected to Windsor.ai. Use for monthly social reports, best and worst posts, follower growth, reach and engagement trends, and comparing channels or periods. Read-only: does not post or change anything."
---
Explicit instructions from the user take priority over this skill.
# Social Media insights
Read live social media data from Instagram, Facebook Pages, TikTok, YouTube, LinkedIn Pages, Google Business Profile, and Threads through Windsor.ai and turn it
into a clear report, ranking, comparison, or trend. The main connector ids for this area are instagram, facebook_organic, tiktok_organic, youtube, linkedin_organic, google_my_business, threads. Other sources in the same category work the same way; find their ids with get_connectors.
## Stay in scope
- Use this skill for metrics, rankings, comparisons, trends, and breakdowns of reach, impressions, engagement (likes, comments, shares, saves), follower growth, video views, and watch time across account or page, and post or video.
- If the user asks to create or publish something new, use the campaign-launch skill instead.
- If the user asks to connect, reconnect, or add an account, use the get-started skill instead.
- If the user asks for a recurring, scheduled, or automated export, use the scheduled-exports skill instead.
## Resolve scope and time
- Call get_connectors first to see which of these sources have connected accounts. If several accounts match the request, 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 ids or field names.
- 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 comparison -> get_data per connector with fields [date, reach, engagement, followers], date_preset last_30d.
- Best posts -> fields [post or media id, caption or title, engagement, reach], rank by the metric the user names (engagement rate = engagement / reach).
- Follower trend -> fields [date, followers] over the preset; report net change.
- Keep field sets small and request only the accounts you need. Check for truncated or paginated results before claiming complete coverage.
## Accuracy guardrails
- Organic metrics are platform-reported and not directly comparable across networks; say so when comparing.
- Engagement rate needs a denominator; state whether you used reach or followers.
- If a field the user wants is not in get_fields, say so rather than substituting a different metric.
- If "best", "top", or "worst" lacks a metric, ask which metric should define the ranking.
## Answer with evidence
Lead with the requested result, then state the account or source, the time window, and the numbers behind the conclusion. Keep internal ids and raw JSON out of the answer unless the user asks for them.
## Hand-offs
After a report the user is likely to want regularly, offer once to set it up as a recurring export with the scheduled-exports skill. Never offer plans, upgrades, or pricing. Never repeat an offer the user declined.
Referenced files: 1 — file references are metadata, not package contents.
threads3.23 KB
View saved version →
---
name: threads
description: "Threads through Windsor.ai: post views, likes, replies, reposts, quotes and shares, profile views and followers, follower breakdowns, the replies people leave on the account's posts, and publishing a text or image post or a reply, always after the user confirms the exact text. Use for questions about the user's own Threads account. Do not use for Instagram, which is a separate connector. Also use when the user asks how to connect Threads to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# Threads via Windsor.ai
The connector id is `threads`. It covers the user's own Threads account: post and profile insights, the replies on its posts, and publishing. It has no ad or cost data.
Write actions today are `create_text_post`, `create_image_post` and `create_reply`. There are no actions to hide or delete replies; `reply_hide_status` can be read but not changed here. The live set and each action's parameters are whatever `list_actions` returns. Publishing follows the campaign-launch skill and replies follow the campaign-management skill.
## Reading
1. Call `get_connectors` to pick the account; ask if several are connected.
2. Call `get_fields` for `threads` and use the exact ids it returns. Post fields (`post_*`), profile fields (`profile_*`) and reply fields (`reply_*`) come from different tables, so read them in separate calls.
3. Call `get_data` with the fields, the account and a date range.
Fields that are easy to misread:
- `date`: for posts it is the publish date, and the date range selects posts by it; for profile insights it is the day of the value.
- `profile_followers_count` is the lifetime total and ignores the date range. `profile_views` is a daily value.
- Follower breakdowns (`profile_followers_age`, `_city`, `_country`, `_gender`) need at least 100 followers, and only one breakdown can be requested at a time.
- `post_replies` on a top-level post counts all replies in the thread; on a reply it counts only direct replies. `profile_replies` counts top-level replies only.
- `post_media_type` values include TEXT_POST, IMAGE, VIDEO, CAROUSEL_ALBUM, AUDIO and REPOST_FACADE (a repost).
Useful post fields: `post_id`, `post_timestamp`, `post_text`, `post_permalink`, `post_media_type`, `post_views`, `post_likes`, `post_replies`, `post_reposts`, `post_quotes`, `post_shares`. Useful reply fields: `reply_id`, `reply_text`, `reply_username`, `reply_timestamp`, `reply_to_id`, `reply_root_post_id`, `reply_has_replies`.
## Publishing and replies
- `create_text_post` takes text up to 500 characters. `create_image_post` takes a public JPEG or PNG URL and optional text up to 500 characters.
- `create_reply` takes `reply_to_id` (a `post_id` or `reply_id` from a read, never a guessed id) and text up to 500 characters. The reply is public and attributed to the account.
- Show the exact text and wait for an explicit yes before calling `execute_action`.
- If write actions are not enabled for the account, send the user to https://onboard.windsor.ai/app/settings/account.
## Reference real data
On an error (unknown field or account), call the relevant discovery tool and retry with correct values, or report the specific error. Never invent view counts, follower numbers, reply text or post ids.
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.
tiktok-organic3.51 KB
View saved version →
---
name: tiktok-organic
description: "Analyze TikTok account (organic) performance through Windsor.ai. Use when the user asks about their TikTok personal or business account's organic insights: video views, likes, comments, shares, followers, profile views, or audience breakdowns by country, age, gender, or active hour. Do not use for TikTok Ads (those live in the TikTok Ads connector), other platforms, or publishing videos. Also use when the user asks how to connect TikTok organic to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# TikTok Organic via Windsor.ai
Windsor.ai pulls TikTok **organic** account insights from the TikTok Accounts
API (personal and business accounts). The connector id is `tiktok_organic`. Pass `tiktok_organic` 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 analytics. It has **no ad or cost data**
(TikTok Ads live in the TikTok Ads connector, so route ad-spend questions there),
and it does **not** publish videos or change the account; there are no write
actions. If asked to post or change settings, say that's out of scope here.
Golden rules:
- **Never guess field, account, 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 TikTok accounts are connected (each has an id
and usually a username). 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 TikTok data
1. Call `get_fields` for `tiktok_organic` to get valid field ids; account and
video metrics (video views, likes, comments, shares, followers, profile
views, reach) and audience breakdowns (by country, age, gender, active hour).
Use the exact ids returned, not these examples.
2. Call `get_data` with `fields`, the target `account`(s), and a date range
(`date_from`/`date_to` or a `date_preset` like `last_7d`, `last_30d`,
`this_month`; append `T` to include today). Add `filters` as needed.
TikTok Organic specifics to respect:
- **Three kinds of fields behave differently:**
- *Real-time / general* metrics (e.g. username, current follower count) are
**not date-filterable**; TikTok returns the latest value, placed on a row
with the current date. Don't present them as period-specific.
- *Per-day* metrics (e.g. likes, video views) vary by date over the range.
- *Breakdown* metrics (label and value pairs such as `audience_activity_hour` with
`audience_activity_count`, `audience_countries_country` with
`audience_countries_percentage`, and the same for genders, ages and cities) each return on their
**own row(s)**; request a breakdown on its own and read it separately
rather than expecting it inline with per-day metrics.
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. Reference real data, don't fabricate
On an error (unknown field/connector/account), call the relevant discovery tool
and retry with correct ids, or report the specific error. Never invent view
counts, follower numbers, engagement figures, or video ids.
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.
youtube3.66 KB
View saved version →
---
name: youtube
description: "Analyze YouTube channel, playlist, and video performance through Windsor.ai. Use when the user asks about their YouTube channel's organic insights: views, watch time, average view duration, subscribers gained and lost, likes, comments, shares, or traffic sources, at the channel, playlist, or video level (including comparing Shorts vs. regular videos). Do not use for YouTube Ads, other platforms, or publishing or editing videos. Also use when the user asks how to connect YouTube to ChatGPT."
---
Explicit instructions from the user take priority over this skill.
# YouTube via Windsor.ai
Windsor.ai pulls YouTube channel, playlist, and video analytics from the
YouTube Analytics API. The connector id is `youtube`. Pass `youtube` as the connector on every tool call; the Windsor.ai server
serves all connectors, so it is never implied.
This connector is **read-only** YouTube analytics. It has **no ad or cost
data** (YouTube Ads run through Google Ads, so route ad-spend questions
there), and it does **not** publish or edit videos or change channel
settings; there are no write actions. If asked to upload, edit, or manage
videos, say that's out of scope here.
Golden rules:
- **Never guess field, account, 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 YouTube channels are connected (each has
an id and usually a channel name). If none is connected, help the user
connect: call `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 channels
are connected and the request is ambiguous, ask which one.
## 2. Reading YouTube data
1. Call `get_fields` for `youtube` to get valid field ids; channel,
playlist, and video metrics (views, watch time, average view duration,
subscribers gained and lost, likes, comments, shares) and dimensions
(e.g. video title, content type, traffic source). 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 target `account`(s) (channel), and a
date range (`date_from`/`date_to` or a `date_preset` like `last_7d`,
`last_30d`, `last_Xd`/`last_Xw`/`last_Xm`, `this_month`, `this_year`,
`last_year`; append `T` to include today, e.g. `last_30dT`). For ranges
without a preset (e.g. "this quarter"), compute explicit `date_from`/
`date_to`. Add `filters` as needed, e.g. to isolate Shorts vs. regular
videos.
Common requests → recipe:
- **Channel overview / trend:** fields `date` + the metrics, over a preset
range.
- **Top / worst videos:** fields `video` (or video title) + the metric
(e.g. watch time), then rank; return only what was asked.
- **Shorts vs. regular videos:** fields for content type/format + the
metric (e.g. average view percentage), grouped by format.
- **Traffic sources:** fields for traffic source + views, over the
requested range.
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, and
YouTube Ads questions belong in the Google Ads connector.
## 3. Reference real data, don't fabricate
On an error (unknown field/connector/account), call the relevant discovery
tool and retry with correct ids, or report the specific error. Never invent
view counts, subscriber numbers, watch-time figures, or video ids.
Referenced files: 1 — file references are metadata, not package contents.