# Windsor.ai MCP Server — Full Reference for LLMs

> Windsor.ai MCP Server is a Model Context Protocol (MCP) server that connects
> AI agents and coding assistants to 350+ marketing, advertising,
> analytics, e-commerce, CRM, and database platforms. Query live data from Meta
> Ads, Google Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads, Google Analytics 4,
> HubSpot, Salesforce, Klaviyo, Shopify, Stripe, BigQuery, Snowflake and more —
> and *execute write operations* on Meta Ads, Google Ads, TikTok Ads, LinkedIn
> Ads, and Microsoft Ads (manage campaigns, ad sets/groups, ads, budgets, and
> bidding) and Instagram (create image posts, comment on posts), plus Google
> Business Profile, Klaviyo, and Amazon Seller Central — from Claude, ChatGPT,
> Microsoft Copilot, Perplexity, Cursor, Gemini, Manus, or any MCP-compatible
> client. Per-client setup guides live at
> https://windsor.ai/documentation/windsor-mcp/.

## Server Endpoints

- MCP (Streamable HTTP): `POST https://mcp.windsor.ai/`
- MCP (SSE): `GET https://mcp.windsor.ai/sse/`
- Health check: `GET https://mcp.windsor.ai/health`
- HTML docs: `GET https://mcp.windsor.ai/docs`
- LLM short summary: `GET https://mcp.windsor.ai/llms.txt`
- LLM full reference: `GET https://mcp.windsor.ai/llms-full.txt`
- Available data sources: `GET https://mcp.windsor.ai/datasources`
- Available write actions: `GET https://mcp.windsor.ai/actions`
- OAuth metadata: `GET https://mcp.windsor.ai/.well-known/oauth-authorization-server`
- Protocol: JSON-RPC 2.0 over HTTP (MCP) or SSE

## Authentication

Bearer tokens in the Authorization header.

### OAuth 2.0 (recommended)

The MCP server implements the full MCP OAuth flow via FastMCP's OAuth proxy.
Clients that support MCP OAuth — including Claude, ChatGPT, Cursor and Manus —
will discover the OAuth endpoints automatically and walk the user through a
one-time login at Windsor.ai. Dynamic Client Registration is supported.

- Discovery: `https://mcp.windsor.ai/.well-known/oauth-authorization-server`
- Authorization endpoint (proxied): `https://onboard.windsor.ai/oauth/authorize`
- Token endpoint (proxied): `https://onboard.windsor.ai/oauth/token`

### API Key

Pass a Windsor.ai API key as a Bearer token:

```
Authorization: Bearer <your_windsor_api_key>
```

Get an API key from your Windsor.ai account settings: https://onboard.windsor.ai/

## Compatible AI Clients

Windsor.ai MCP works with any MCP-compatible client. Per-client setup guides
live at https://windsor.ai/documentation/windsor-mcp/.

- Claude (Anthropic) — listed in the Claude connector directory.
  One-click install:
  https://claude.ai/directory/360c0c31-4bb6-42ca-8e50-5da0a100a68e
  Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-claude/
- ChatGPT (OpenAI) — listed as a ChatGPT app. One-click install:
  https://chatgpt.com/apps/windsor-ai/asdk_app_694a52cfaa3c819192bea84eaa254968
  Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-chatgpt/
- Microsoft Copilot — uses the Windsor.ai Power Platform connector
  (https://learn.microsoft.com/en-us/connectors/windsorai/). Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-copilot-agent/
- Perplexity — setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-perplexity/
- Claude Code — install with `claude plugin install windsor-ai`. Dedicated
  plugin with slash commands and an analyst agent. Source:
  https://github.com/windsor-ai/claude-windsor-ai-plugin
- Cursor — dedicated plugin (https://github.com/windsor-ai/windsor-ai-cursor-plugin)
  or paste `{"mcpServers":{"windsor":{"url":"https://mcp.windsor.ai/"}}}` into
  Cursor's `mcp.json`. Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-cursor/
- Manus — add `https://mcp.windsor.ai/` as an MCP server. Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-manus-ai/
- Google Gemini — standard MCP server config (`url: https://mcp.windsor.ai/`).
  Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-gemini/
- Google Antigravity — add `https://mcp.windsor.ai/` via Manage MCP Servers →
  raw config (`mcp_config.json`). Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-antigravity/
- Grok (xAI) — add `https://mcp.windsor.ai/` as a Custom Connector at
  https://grok.com/connectors.
- Lovable — add `https://mcp.windsor.ai/` as a Custom MCP connector. Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-data-into-lovable/
- Base44 — add `https://mcp.windsor.ai/` under Settings → MCP connections with
  OAuth authentication.
- n8n — add an MCP Client Tool node pointing at `https://mcp.windsor.ai/` with a
  Bearer Auth credential holding your Windsor.ai API key. Setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-integrate-windsor-mcp-into-n8n/
- Windsurf, Cline, GitHub Copilot — standard MCP server config
  (`url: https://mcp.windsor.ai/`). Generic setup guide:
  https://windsor.ai/documentation/windsor-mcp/how-to-connect-windsor-mcp-to-any-ai-client/
- mcp-proxy and custom MCP clients.

## Workflow

### Read workflow (analytical queries)

1. `get_connectors()` — list connectors that already have connected accounts.
   The response includes an `actions` list of action ids on each connector
   that supports write actions, so you see the available verbs (create, pause,
   enable, set budget, …) upfront, and an `options` list of read-option ids
   (connector-specific controls that change what a `get_data` read returns;
   call `get_options` for their meaning and values). Pass
   `include_not_yet_connected=True` to also see connectors the user has not set
   up yet.
2. For any request to connect, grant access to, authorize, add, replace, or
   reconnect a data source account, call
   `get_connector_connect_info(connector=...)` or
   `get_connector_authorization_url(connector=...)` and return the connect URL.
   This includes adding another account to an already-connected connector. Do
   not substitute dashboard navigation steps for the tool link. For manual
   connectors, do not ask the user to paste API keys, tokens, passwords, or
   credentials into chat; send them to the connect URL form instead.
3. `get_options(connector=..., accounts=[...])` — list available fields, date
   filter columns, and connector-specific options for the chosen account set.
4. `get_fields(connector=..., fields=[...])` — get descriptions, types, and
   tables for the fields you plan to query. Fields with `NUMERIC` or `PERCENT`
   types are metrics; everything else is a dimension.
5. `get_data(connector=..., fields=[...], ...)` — run the query with optional
   date range, accounts, options, and filters.

### Write workflow (act on the user's behalf)

Whenever an analytical answer ends with a recommendation to change something on
a connected platform (pause or enable a campaign, ad set, or ad, create a new
one, raise or lower a budget, etc.) — do not stop at describing the change in
prose. Offer to execute it.

1. `list_actions(connector=...)` — fetch the full JSON schema for each write
   action the connector supports. Skip if the action and its schema were
   already loaded earlier in the session.
2. `execute_action(connector=..., action=..., account=..., params={...})` —
   run the action against a specific account, with params matching the
   schema. Confirm intent with the user before invoking.

### Destinations workflow (scheduled exports)

When the user wants to export, send, sync, or schedule a connector's data to a
destination (BigQuery, Google Sheets, Snowflake, a database, or cloud storage):

Call `get_destination_tasks()` to list the export tasks the user already has
(id, destination, connector, schedule, status). To set up a new export:

1. `get_destinations()` — destinations, their reusable OAuth credentials, and
   whether a task can be created here (`create_in_chat`).
2. `get_destination_setup_info(destination_type=...)` — target fields, allowed
   schedules, existing credentials, and a `setup_url`.
3. `create_destination_task(...)` — create the recurring export when
   `create_in_chat` is true, reusing an existing credential. Confirm the source,
   target, and schedule first. Otherwise hand the user the `setup_url`. Never
   ask for secrets in chat; they are entered in that form.

### Subscription workflow

The `get_subscription_url(target_plan=...)` tool returns a clickable Markdown
link. Omit `target_plan` to link to the general pricing page, or
pass one of `BASIC`, `STANDARD`, `PLUS`, `PROFESSIONAL`, `ENTERPRISE` to
pre-select a plan's upgrade page. It only returns the link; the user completes
any checkout themselves in their browser.

## Available Tools

### `get_current_user`

Return the authenticated user's profile. Useful as a sanity check that the
auth token is working and to greet the user by name.

Returns: `{ "username": str, "email": str, "plan_id": str, "plan_name": str,
"is_paid": bool }`. Plan fields reflect the live Windsor.ai profile and are
`null` only when the profile lookup fails (plan unknown, not free).

### `get_connectors`

List Windsor.ai connectors, their connected accounts, the write actions each
connector supports, and the read options each exposes.

Parameters:
- `include_not_yet_connected: bool = False` — if true, also return connectors
  that the user could set up but hasn't connected an account to yet.
- `include_actions: bool = True` — if true (default), each connector includes
  an `actions` list of write-action ids it exposes (fetch the full schema
  with `list_actions`). Set to false to skip the per-connector actions fetch.
- `include_options: bool = True` — if true (default), each connector includes
  an `options` list of read-option ids (connector-specific controls that change
  what a `get_data` read returns; call `get_options` for their meaning and
  values). Set to false to skip the per-connector options fetch.

Returns: `[{ "id": str, "accounts": [{ "id": str, "name": str | None }] | None, "actions": [str] | null, "options": [str] | null }]`

### `get_connector_connect_info`

Describe how to grant access to a connector, including the auth type, direct
connect URL, and any manual credential fields. Use this for connect, grant
access, authorize, add, replace, or reconnect requests, including adding another
account to an already-connected connector. Never ask users to paste secrets into
chat; send them to the connect URL form.

Parameters:
- `connector: str` — connector ID. Always call
  `get_connectors(include_not_yet_connected=True)` first to obtain the correct
  ID.

Returns: `{ "connector": str, "auth_type": "oauth" | "manual", "connect_url": str, "fields": [...] }`

### `get_connector_authorization_url`

Returns a URL the user can open in their browser to set up a connector.
Handles both OAuth-based and manual-credential connectors. Use this for connect,
grant access, authorize, add, replace, or reconnect requests, including adding
another account to an already-connected connector. Do not substitute dashboard
navigation steps for the returned link.

Parameters:
- `connector: str` — connector ID. Always call
  `get_connectors(include_not_yet_connected=True)` first to obtain the correct
  ID.

Returns: a string URL.

### `get_subscription_url`

Returns a clickable Markdown link to the Windsor.ai pricing page, or to a
specific plan's upgrade page when `target_plan` is given. The user
completes any checkout themselves in their browser.

Parameters:
- `target_plan: str | None` — optional plan to pre-select. Valid values:
  `BASIC`, `STANDARD`, `PLUS`, `PROFESSIONAL`, `ENTERPRISE`.

Returns: a Markdown link string, e.g. `[Upgrade your Windsor plan](https://...)`.

### `get_options`

List available fields, date filter columns, and connector-specific options.

Parameters:
- `connector: str` — connector ID, e.g. `"facebook"`, `"google_ads"`,
  `"tiktok"`, `"linkedin"`.
- `accounts: list[str]` — account IDs.

Returns: `{ "fields": [str], "date_filters": { table: [str] }, "options": [...] }`

### `get_fields`

Get detailed descriptions, types and tables for specific fields.

Parameters:
- `connector: str`
- `fields: list[str]` — list of field IDs.

Returns: `[{ "id": str, "name": str, "description": str, "type": str, "table": str | None }]`

Field types: `NUMERIC` and `PERCENT` are metrics (aggregated); everything
else is a dimension (grouped by).

### `get_data`

Retrieve data from a connector. The most powerful tool — supports date
ranges, account filtering, custom field filters, and connector-specific
options.

Parameters:
- `connector: str`
- `fields: list[str]` — field IDs to retrieve.
- `accounts: list[str] | None` — optional list of account IDs to filter by.
- `date_filters: dict[str, str] | None` — override the default date column
  per table (e.g. `{"orders": "created_at"}`).
- `date_from: date | None`
- `date_to: date | None`
- `date_preset: str | None` — e.g. `"last_7d"`, `"last_30d"`, `"last_3m"`,
  `"last_year"`, `"this_month"`, `"this_yearT"` (`T` suffix means including
  today).
- `options: dict | None` — connector-specific options, e.g.
  `{"attribution_window": "7d_view,1d_click"}` for Meta Ads.
- `filters` — nested condition list, e.g.
  `[["spend", "gt", 100], "and", ["campaign", "contains", "Sale"]]`.
  A condition may also be a dict, e.g.
  `{"field": "spend", "operation": "gt", "value": 100}`.
  Supported operators: `eq`, `neq`, `gt`, `gte`, `lt`, `lte`, `contains`,
  `ncontains`, `null`, `notnull`, `in`.

Returns: a list of records.

Some warehouse connectors (`mysql`, `postgresql`, `redshift`, `mongodb`,
`snowflake`, `big_query`) require `date_filters` when filtering by date.

### `get_custom_fields`

List the custom (formula) fields the user has defined across connectors.

Returns: for each field, its `id`, `connector`, `field_name`, generated
`field_id` (used in `get_data`/`get_fields`), `type`, and `formula`.

### `create_custom_field`

Create a custom (formula) field on a connector — a calculated metric or
dimension computed from the connector's existing fields, e.g. CPA or spend
adjusted by a margin. Once created it behaves like a normal field in
`get_fields`, `get_data`, and scheduled exports.

Parameters:
- `connector: str` — connector id the field belongs to.
- `field_name: str` — display name for the new field.
- `field_type: "NUMERIC" | "TEXT"` — NUMERIC for values used in calculations,
  TEXT for labels.
- `formula: str` — formula referencing the connector's field ids (from
  `get_fields`), e.g. `"to_float(spend) * 1.2"`.

Returns: the created field's `id`, `connector`, `field_name`, `field_id`,
`type`, and `formula`.

Stores configuration in the user's Windsor.ai account. Confirm the field with
the user first.

### `list_actions`

Discover write operations a connector exposes. The connectors with write
actions today:

- Meta Ads (`facebook`) — `create_campaign`, `enable_campaign`,
  `pause_campaign`, `update_campaign`, `set_campaign_budget`, `create_adset`,
  `enable_adset`, `pause_adset`, `update_adset`, `set_adset_budget`,
  `create_ad`, `create_ad_video`, `enable_ad`, `pause_ad`, `update_ad`,
  `boost_post`, `set_page_welcome_message`.
- Google Ads (`google_ads`) — `create_campaign`, `create_ad_group`,
  `create_responsive_search_ad`, `enable_campaign`, `pause_campaign`,
  `enable_ad_group`, `pause_ad_group`, `enable_ad`, `pause_ad`,
  `push_keywords`, `update_keywords`, `remove_keywords`,
  `push_negative_keywords`, `set_campaign_budget`,
  `set_campaign_bidding_strategy`, `set_cpc_bid_ceiling`, `set_max_cpc`,
  `set_target_cpa`, `create_customer_match_list`,
  `upload_customer_match_list`, `get_customer_match_upload_status`,
  `rename_customer_match_list`, `delete_customer_match_list`,
  `attach_user_list_to_ad_group`, `detach_user_list_from_ad_group`.
- TikTok Ads (`tiktok`) — `enable_campaign`, `pause_campaign`,
  `enable_ad_group`, `pause_ad_group`, `enable_ad`, `pause_ad`,
  `set_campaign_budget`, `set_ad_group_budget`.
- LinkedIn Ads (`linkedin`) — `enable_campaign_group`, `pause_campaign_group`,
  `enable_campaign`, `pause_campaign`, `enable_creative`, `pause_creative`,
  `set_campaign_group_budget`, `set_campaign_budget`.
- Microsoft Ads / Bing (`bing`) — `enable_campaign`, `pause_campaign`,
  `enable_ad_group`, `pause_ad_group`, `set_campaign_budget`.
- Instagram (`instagram`) — `create_image_post`, `create_comment`. An account
  connected before comment access was added returns a permission error on
  `create_comment` until it is reconnected.
- Google Business Profile (`google_my_business`) — `create_local_post`,
  `update_local_post`, `reply_to_review`, `upload_media`, `update_location`,
  `set_regular_hours`, `set_special_hours`, `set_open_status`.
- Klaviyo (`klaviyo`) — `create_flow`, `update_flow_status`.
- Amazon Seller Central (`amazon_sp`) — `update_listing`.

Other connectors return an empty list. Each returned action carries a JSON
schema describing the parameters `execute_action` will accept.

Parameters:
- `connector: str` — connector ID.

Returns: `[{ "id": str, "name": str, "description": str, "schema": dict }]`

Use this proactively whenever your analysis is about to recommend a change
on a connected platform. Surface the matching action to the user and offer
to run it via `execute_action` instead of describing the change in prose.

### `execute_action`

Execute a write action against a specific connector account — for example
creating, pausing, or enabling a campaign, ad set, or ad, or setting a campaign
or ad set budget.

Parameters:
- `connector: str` — connector ID, e.g. `"google_ads"`, `"facebook"`.
- `action: str` — action ID returned by `list_actions`.
- `account: str` — account ID the action runs against (from
  `get_connectors`).
- `params: dict | None` — parameters matching the action's JSON schema
  (as returned by `list_actions`).

Returns: a status string describing how the action was queued or applied.

Write actions modify external state. Confirm intent with the user before
invoking. Errors point you back at `list_actions` / `get_connectors` if the
action or connector id is wrong.

### `get_destinations`

List destinations that can receive a scheduled export of connector data, such
as BigQuery, Google Sheets, Snowflake, databases, and cloud storage.

Returns: each destination's `type`, `name`, `category`, whether a task can be
created here (`create_in_chat`), and any `existing_credentials` (reusable OAuth
connections or stored service accounts, each with a `credential_id`).

### `get_destination_tasks`

List the scheduled export tasks the user has already created.

Returns: for each task, its `id`, destination `type` and `name`, `alias`,
source `connector`, `schedule_type`, `schedule`, `status` (active, paused, or
deactivated), and a `manage_url` to open it in the dashboard.

### `get_destination_setup_info`

Describe how to set up a scheduled export to one destination.

Parameters:
- `destination_type: str` — destination id from `get_destinations`.

Returns: the `auth_type`, `create_in_chat`, the `target_fields` describing where
data is written, the allowed `schedule_types`, `existing_credentials`, and a
`setup_url` link to the dashboard form. Sensitive fields are entered
by the user in that form, never in chat.

### `create_destination_task`

Create a recurring export of a connector's data to a destination.

Parameters:
- `destination_type: str` — destination id (must have `create_in_chat=true`).
- `connector: str` — source connector id.
- `fields: list[str]` — source field ids from `get_fields`.
- `config: dict` — destination target fields from `get_destination_setup_info`
  (never secrets).
- `credential_id: str | None` — a reusable credential from `get_destinations`
  (an OAuth connection or a stored service account).
- optional source scope (`accounts`, `date_from`/`date_to`/`date_preset`,
  `filters`) and schedule (`schedule_type`, `schedule`, `refresh_period`,
  `alias`, `columns_to_match`).

Returns: the created task's `id`, `type`, `name`, `alias`, and a `manage_url`.

Creates recurring external state. Confirm the source, target, and schedule with
the user first. Only works when `create_in_chat` is true; otherwise use the
`setup_url`.

### `get_windsor_login_url`

Return a URL into the Windsor.ai dashboard. The user's own browser session
signs them in; if it has expired they are asked to sign in first.

Parameters:
- `next_path: str | None` — optional post-login path, e.g. `"/app/facebook"`,
  `"/destinations"`, `"/billing"`. Omit for the dashboard home.

Returns: a string URL.

### `contact_windsor`

Send feedback, a support request, or a feature request to Windsor.ai.

Parameters:
- `category: "feedback" | "support" | "feature_request"` — the type of inquiry.
- `subject: str` — short one-line title (max 200 chars).
- `message: str` — full message body with relevant context (max 10,000 chars).

Returns: a reference ID string the user can share with Windsor.ai support.

## Use Case Examples

- "Pull last month's Meta Ads spend by campaign and compare to the previous
  period."
- "Show me Google Ads ROAS by campaign for the last 30 days."
- "List my connected TikTok Ads accounts and pull last week's performance."
- "Combine Meta Ads, Google Ads, and TikTok Ads spend into a unified weekly
  report."
- "Pull Shopify orders and Klaviyo email engagement so I can attribute revenue."
- "Query my BigQuery warehouse for last quarter's pipeline data."
- "Build a Looker Studio-ready dataset combining GA4 sessions and ad spend."
- "After reviewing CAC, pause the underperforming PMax campaign and raise the
  daily budget on the top-tier search campaign." (read + write — analyze with
  `get_data`, then act with `execute_action`.)
- "Cut the daily budget on my worst-performing Meta Ads campaign by 20%."
- "Create a paused Meta Ads campaign with a $50/day budget, then add an ad set
  and a single-image ad under it so I can review before launching."
- "Pause my two lowest-ROAS TikTok Ads ad groups and shift budget to the top
  performer."
- "Set a target CPA on my best Google Ads campaign and push a list of negative
  keywords to cut wasted spend."
- "Pause the underperforming LinkedIn Ads creatives in my lead-gen campaign
  group."

## Supported Data Sources

The full list of 350+ supported connectors is dynamic — call
`get_connectors(include_not_yet_connected=True)` from your MCP client or fetch
`GET https://mcp.windsor.ai/datasources` for the up-to-date list.

Highlights by category:

### Advertising
Meta Ads (Facebook & Instagram), Google Ads, Microsoft Ads (Bing),
TikTok Ads, LinkedIn Ads, Snapchat, Pinterest, Reddit, X/Twitter, Amazon Ads,
Apple Search Ads, Criteo, Taboola, Outbrain, DV360, Campaign Manager 360,
Search Ads 360, AdRoll, AdForm, StackAdapt, The Trade Desk, RTB House,
Quora Ads, MNTN, Basis DSP, MediaGo, Yahoo Japan Ads, Line Ads, Yandex.Direct,
Vibe, Flashtalking, AppNexus.

### Analytics & Search
Google Analytics 4 (GA4), Universal Analytics, Adobe Analytics, Mixpanel,
Amplitude, Matomo, Plausible, PostHog, FullStory, Search Console, Bing
Webmaster, PageSpeed Insights, Looker, Metabase.

### Social (Organic & Public)
Facebook Organic, Instagram, Instagram Public, LinkedIn Organic, TikTok
Organic, Pinterest Organic, X Organic (Twitter), Threads, YouTube,
Sprout Social.

### CRM & Marketing Automation
HubSpot, Salesforce, Salesforce Marketing Cloud, Pipedrive, Microsoft
Dynamics 365, Zoho CRM, Copper, Close.com, Insightly, Monday.com, Pardot,
Mailchimp, Klaviyo, ActiveCampaign, Brevo (Sendinblue), MailerLite,
Mailgun, MailerSend, Mailjet, Omnisend, Customer.io, Iterable,
SendGrid, Drift, Intercom, Outreach, Salesloft, Reply.io, Lemlist.

### E-commerce & Payments
Shopify, Magento, WooCommerce, BigCommerce, PrestaShop, Square, Stripe,
PayPal, Braintree, Klarna, Recharge, Recurly, Chargebee, Chargify, Paystack,
Walmart, TikTok Shop.

### Affiliate & Partner Marketing
CJ, Awin, Impact, Partnerize, PartnerStack, Adtraction, Daisycon,
Commission Factory, Rakuten Advertising, ShareASale, Tradedoubler, Everflow.

### App Analytics & Attribution
AppsFlyer, Adjust, Branch, AppFollow.

### Customer Support & Helpdesk
Zendesk (Support, Chat, Sell, Sunshine, Talk), Freshdesk, Freshcaller,
Freshservice, Dixa, Drift, Intercom.

### Databases, Warehouses & Files
BigQuery, Snowflake, PostgreSQL, MySQL, Redshift, MongoDB, Firebolt,
Dremio, SFTP, Google Sheets, Airtable, Notion, Amazon S3.

### HR, Finance, Productivity, Other
BambooHR, Ashby, Lever, Greenhouse, Recruitee, Workable, QuickBooks, Xero,
NetSuite, Slack, Microsoft Teams, Twilio, Zoom, Jira, Confluence, GitHub,
GitLab, Datadog, Sentry, PagerDuty, and many more.

For the complete authoritative list, fetch `/datasources` or call
`get_connectors(include_not_yet_connected=True)`.

## Troubleshooting

### Authentication failures (401)

- Confirm the Authorization header is `Bearer <token>` (no quotes).
- For API keys: get one from https://onboard.windsor.ai/.
- For OAuth: clear cached tokens in your client and re-authorize.

### Tool errors

- "Requested data exceeds size limit": narrow the date range, reduce fields,
  filter by accounts, or add filters.
- "Connector requires specifying date filters": pass `date_filters` for
  warehouse connectors (mysql, postgresql, redshift, mongodb, snowflake,
  big_query).
- "Not authenticated": no valid token reached the server — check headers.

### Connector access

For connect, grant access, authorize, add, replace, or reconnect requests, call
`get_connector_connect_info(connector=...)` or
`get_connector_authorization_url(connector=...)` and have the user open the
returned connect URL. This applies both to not-yet-connected connectors and to
adding another account on an already-connected connector. Do not substitute
dashboard navigation steps for the tool link. Then re-run `get_connectors()`.

## Support

- Windsor.ai homepage: https://windsor.ai/
- Onboarding & account: https://onboard.windsor.ai/
- Issues: contact Windsor.ai support
