Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Windsor.ai MCP server

Vendor MCP
Open markdown

The Windsor.ai MCP connector routes your AI agent's tool calls to Windsor.ai's own MCP server through Scalekit. Each user signs in to Windsor.ai once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 18 tools.

Tools
18
What they doRead · write · destructive
14 · 3 · 114 read3 write1 destructive
Users sign in with
OAuth app
Scalekit's or your own

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Windsor.ai MCP connection

    In AgentKit > Connections, create a Windsor.ai MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Windsor.ai MCP server, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'windsoraimcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Windsor.ai MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'windsoraimcp_get_current_user',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • windsoraimcp_get_connector_authorization_urlGet the URL to connect or authorize a Windsor.ai connector.Read-only

    Get Connector Authorization URL

    Get the URL to connect or authorize a Windsor.ai connector. Always call get_connectors(include_not_yet_connected=True) first to obtain the correct connector ID. Returns a URL the user can open in their browser to set up the connector. For OAuth connectors the link jumps straight into the provider consent flow; for manual connectors it opens the connector's credentials form. Use this for any request to connect, grant access to, authorize, add, replace, or reconnect a connector account, including adding another account to an already-connected connector. The user opens the URL in their browser and is signed in by their existing Windsor.ai session; if that has expired they are asked to sign in first. For richer guidance — the auth type and, for manual connectors, the exact credential fields required — use get_connector_connect_info instead. Do not substitute prose dashboard navigation steps for this link.

    Inputs

    connectorstringrequired
    Connector ID as returned by get_connectors(include_not_yet_connected=True) — do not guess it.
  • windsoraimcp_get_connector_connect_infoDescribe how the user can grant access to a connector, to guide it in chat.Read-only

    Get Connector Connect Info

    Describe how the user can grant access to a connector, to guide it in chat. Always call get_connectors(include_not_yet_connected=True) first to obtain the correct connector ID. Returns: - auth_type: "oauth" if the connector needs provider consent in the browser, or "manual" if it is connected with credentials (e.g. an API key); - connect_url: a link the user opens in their browser to grant access, signed in by their existing Windsor.ai session (or asked to sign in first if it has expired). For OAuth it jumps straight into the provider consent screen; for manual connectors it opens the credentials form prefilled for that connector; - fields: for manual connectors, the credential fields the user must provide (name, type, whether required, and whether the value is sensitive). Empty for OAuth connectors. Use this to answer "how do I connect/grant access to X": for OAuth, hand the user the connect_url and tell them to authorize; for manual connectors, tell them which fields are needed and give them the connect_url to enter them. Sensitive fields (API keys, tokens, passwords) must be entered by the user in that form — never ask them to paste secrets into the chat. Afterwards, confirm the connection by calling get_connectors and reporting the new account. Use this for any request to connect, grant access to, authorize, add, replace, or reconnect a connector account, including adding another account to an already-connected connector. Do not substitute prose dashboard navigation steps for the connect_url.

    Inputs

    connectorstringrequired
    ID of the connector as returned by get_connectors(include_not_yet_connected=True). Always call that first to get the correct ID — never guess it.
  • windsoraimcp_get_connectorsWindsor.ai: List connectors, their accounts, write actions, and options.Read-only

    Get Connectors

    Windsor.ai: List connectors, their accounts, write actions, and options. By default returns only connectors that have connected accounts; pass include_not_yet_connected=True for every available connector. Accounts carry an id and, when available, a name. Connectors that support write actions carry an `actions` list of action ids for execute_action. Connectors that expose read options carry an `options` list of option ids that change what a get_data read returns (call get_options for their meaning and values). Covers 350+ sources: advertising (Meta Ads, Google Ads, TikTok Ads, LinkedIn Ads), analytics (Google Analytics 4), CRM and e-commerce (HubSpot, Shopify), payments (Stripe), warehouses (BigQuery, Snowflake), and more. Supported connector slugs (357 total): activecampaign, adalyser, adform, adjust, adobe, adobe2, adroll, adtraction, aha, ahrefs, aimwel, aircall, airtable, all, alpha_vantage, amazon_ads, amazon_dsp, amazon_s3, amazon_sp, amazon_sqs, amazon_vendor, amplitude, apify_dataset, appfollow, apple_search_ads, applovin, appnexus, appsflyer, apsis_one, ashby, attentive, auth0, awin, aws_cloudtrail, azure_table, babelforce, bamboo_hr, basis_dsp, big_query, bigcommerce, bing, bing_webmaster, bling, boxcast, braintree, branch, braze, breezometer, callrail, captain_data, cart, chargebee, chargify, chartmogul, cj, clickmagick, clickup_api, clockify, close_com, cm360, coda, coin_api, coinmarketcap, commercetools, commissionfactory, configcat, confluence, contractors_cloud, convertkit, convex, copper, courier, criteo, currency_conversion, customer_io, daisycon, datadog, datamediq, datascope, delighted, digistorm, dixa, dockerhub, dragonmetrics, dremio, drift, dv360, dynamics365, emailoctopus, everflow, everhour, exchange_rates, exoclick, facebook, facebook_leads, facebook_organic, faker, fastbill, fauna, file, firebolt, firstpromoter, flashtalking, flexport, freshcaller, freshdesk, freshsales, freshservice, fullstory, gainsight_px, gemius, genesys, getlago, github, gitlab, glassfrog, gmailcsv, gnews, gocardless, gohighlevel, gong, google_ad_manager, google_ads, google_merchant, google_my_business, google_pagespeed, google_search_ads, google_webfonts, google_workspace_admin_reports, googleanalytics, googleanalytics4, googlesheets, gravity_forms, greenhouse, gridly, harness, harvest, hawk_dsp, hellobaton, hubplanner, hubspot, idealo, impact, incomeaccess, insightly, instagram, instagram_public, instatus, intercom, intruder, ip2whois, iterable, jira, k6cloud, klarna, klaus_api, klaviyo, kommo, kustomer_singer, kyriba, kyve, launchdarkly, leadinfo, lemlist, lever_hiring, line, line_ads, linkedin, linkedin_organic, linnworks, lokalise, looker, magento, mailchimp, mailerlite, mailersend, mailgun, mailjet_mail, mailjet_sms, matomo, mediago, merge, metabase, metricool, microsoft_clarity, microsoft_dataverse, microsoft_teams, mixpanel, mntn, monday, mongodb, my_hours, mysql, n8n, nasa, netsuite, news_api, nextdoor, notion, nytimes, okta, omnisend, onesignal, openai_ads, openweather, opsgenie, orb, orbit, oura, outbrain, outreach, pagerduty, pardot, partnerize, partnerstack, paypal_transaction, paystack, pendo, persistiq, pexels_api, pinterest, pinterest_organic, pipedrive, pivotal_tracker, plaid, plausible, pocket, pokeapi, polygon_stock_api, postgresql, posthog, prestashop, primetric, productive, profitwell, punk_api, pypi, qonto, qualaroo, quickbooks, quora, railz, rakuten_advertising, rd_station_marketing, readpeak, recharge, recreation, recruitee, recurly, reddit, redshift, reply_io, retently, rki_covid, rocket_chat, rss, rtbhouse, salesforce, salesforce_marketing, salesloft, sap_fieldglass, search_metrics, searchconsole, secoda, semrush, sendgrid, sendinblue, senseforce, sentry, serpstat, sftp, sftp_bulk, shareasale, shiphero, shopify, shortio, similarweb, simplifi, slack, smaily, smartengage, smartsheets, snapchat, snowflake, sonar_cloud, spotify, sproutsocial, square, stackadapt, statuspage, strava, stripe, supabase, survey_sparrow, surveycto, surveymonkey, taboola, teads, tempo, the_guardian_api, threads, ticimax, tiktok, tiktok_organic, tiktok_shop, timely, tmdb, todoist, toggl, tradedesk, tradedoubler, trafficjunky, trello, triplewhale, trustpilot, tvmaze_schedule, twilio, twilio_taskrouter, twinred, twitter, typeform, unleash, us_census, vantage, vibe, visma_economic, vitally, waiteraid, walmart, weatherstack, webflow, wikipedia_pageviews, woocommerce, wordpress, workable, workramp, wrike, x_organic, xero, yahoo_finance_price, yahoo_japan, yandex_metrica, yotpo, yougov_brandindex, younium, youtube, zapier_supported_storage, zendesk_chat, zendesk_sell, zendesk_sunshine, zendesk_support, zendesk_talk, zenefits, zenloop, zoho, zoom, zuora.

    Inputs

    include_actionsboolean
    Default True: include each connector's write-action ids. False skips the per-connector actions fetch when only account info is needed.default true
    include_not_yet_connectedboolean
    Default False: only connectors with connected accounts. True: every available connector.default false
    include_optionsboolean
    Default True: include each connector's read-option ids (controls that change what a get_data read returns). False skips the per-connector options fetch when only account info is needed.default true
  • windsoraimcp_get_current_userWindsor.ai: Get the authenticated user's username, email and plan.Read-only

    Get Current User

    Windsor.ai: Get the authenticated user's username, email and plan. `plan_id`, `plan_name` and `is_paid` come from the live Windsor.ai profile; they are null when the profile lookup fails, which means the plan is unknown — not that the user is on a free plan.

    Inputs

    This tool takes no inputs.

  • windsoraimcp_get_custom_fieldsWindsor.ai: List the user's custom (formula) fields across connectors.Read-only

    Get Custom Fields

    Windsor.ai: List the user's custom (formula) fields across connectors. A custom field is a user-defined metric or dimension computed from a connector's existing fields with a formula (for example spend times a margin, or a CPA). Each entry reports the connector it belongs to, its field_name, the generated field_id used in get_data/get_fields, its type (NUMERIC or TEXT), and the formula. Call this before create_custom_field to see which fields already exist and avoid creating duplicates.

    Inputs

    This tool takes no inputs.

  • windsoraimcp_get_dataWindsor.ai: Retrieve data from a connector.Read-only

    Get Data

    Windsor.ai: Retrieve data from a connector. Call get_fields first — field IDs must come from it.

    Inputs

    connectorstringrequired
    Connector ID, e.g. "facebook" for Meta Ads (Facebook & Instagram Ads), "google_ads" for Google Ads. Call get_connectors if unsure or on error.
    fieldsstringrequired
    Field IDs to retrieve, e.g. ["campaign", "date", "spend"]. Must come from get_fields — call it first, do not guess field names.
    accountsstring
    Optional account IDs, e.g. ["1234567890"]. Default: all accounts. Pass a subset to keep the response small.
    date_filtersstring
    Per-table date columns used instead of the defaults, e.g. {"orders": "created_at"}. Required for warehouse connectors (mysql, postgresql, redshift, mongodb, snowflake, big_query) when filtering by date.
    date_fromstring
    Start date, e.g. "2025-09-01".
    date_presetstring
    Predefined range: "last_Xd", "last_Xw", "last_Xm", "last_Xy" (last X days/weeks/months/years), "last_year", "last_2years", "this_month", "this_year". Append "T" to include today — valid only as "last_XdT", "last_yearT", "last_2yearsT", "this_monthT", "this_yearT". E.g. "last_7d", "this_monthT".
    date_tostring
    End date, e.g. "2025-09-07".
    filtersstring
    Filter conditions. A condition is ["<field>", "<operator>", <value>] or the equivalent dict {"field": ..., "operation": ..., "value": ...}; combine with "and"/"or" strings; nesting allowed. Operators: eq, neq, gt, gte, lt, lte, contains, ncontains, null, notnull, in (value is a JSON-array-encoded string of exact alternatives, e.g. ["campaign", "in", "[\"Summer\",\"Autumn\"]"]). E.g. [["spend", "gt", 100]], [{"field": "spend", "operation": "gt", "value": 100}] or [[["campaign", "eq", "Summer"], "or", ["spend", "eq", 10]], "and", ["clicks", "notnull", null]]. May also be passed as a single JSON-encoded string of the same structure — required for clients that cannot send nested arrays (e.g. Microsoft Copilot Studio / PowerFx): "[[\"spend\", \"gt\", 100]]".
    optionsstring
    Connector options, e.g. {"attribution_window": "7d_view,1d_click"}.
  • windsoraimcp_get_destination_setup_infoWindsor.ai: Describe how to set up a scheduled export to a destination.Read-only

    Get Destination Setup Info

    Windsor.ai: Describe how to set up a scheduled export to a destination. Always call get_destinations first to get the correct destination id. Returns the auth type, the target fields describing where data is written, the allowed schedules, reusable credentials (OAuth or service account), and a setup_url link to the dashboard form. Sensitive fields (service accounts, passwords, keys) are entered by the user in the setup_url form — never ask them to paste secrets into chat. When create_in_chat is true, collect the non-sensitive target fields and call create_destination_task; otherwise hand the user the setup_url.

    Inputs

    destination_typestringrequired
    Destination id as returned by get_destinations, e.g. "big_query" or "googlesheets". Call get_destinations first — never guess it.
  • windsoraimcp_get_destination_tasksWindsor.ai: List the scheduled export tasks the user has created.Read-only

    Get Destination Tasks

    Windsor.ai: List the scheduled export tasks the user has created. A destination task is a recurring export of a connector's data to a destination. Each entry reports its id, destination type and name, alias, source connector, schedule, and status (active, paused, or deactivated), plus a manage_url to open it in the dashboard. Use this when the user asks what exports, syncs, or destination tasks they already have, or before creating one to avoid duplicates.

    Inputs

    This tool takes no inputs.