Windsor.ai MCP

Live

OAUTH 2.1/DCR

MARKETING ANALYTICS

Marketing

Query unified marketing and business data from 350+ sources through Windsor.ai MCP, with OAuth-scoped, per-user tool calls.

  • One query layer. pull from Meta Ads, Google Ads, TikTok, and 350+ connectors without per-platform API code.
  • Per-user OAuth vault. credentials are encrypted at rest, resolved per request, and never exposed to the model.
  • Scoped before every call. pre-call scope check with a 90-day audit trail on every read and write action.
Windsor.ai MCP
agent · Acme Q3
Run
How did paid spend trend across Meta and Google Ads last month, and which campaigns drove it?
S
windsoraimcp_get_data
112ms
Windsor.ai agent
Combined spend was $48,200 in August, up 9% on July. Meta Ads led with $27,400; Google Ads added $20,800. The retargeting set drove most of the Meta increase.
Sources: 2 connectors, 1 custom field, Aug 1 to Aug 31
windsoraimcp
2 connectors
18:29
Message Claude...

Tools your marketing agent reaches for on Windsor.ai, scoped per user.

CALL ANY TOOL
Query marketing and business data across 350+ connectors, manage fields and exports, and run write actions with OAuth-scoped calls.
windsoraimcp_contact_windsor
Contact Windsor.ai
Send feedback, a support request, or a feature request and get a reference id for follow-up.
Parameters
Name
Type
Required
Description
category
string
Required
Type of inquiry: "feedback" for general impressions or complaints, "support" for technical issues or unexpected behavior, "feature_request" for new features or improvements.
message
string
Required
Full message body. Include all relevant context, for example: which tools were called and in what order; connector IDs (e.g. "facebook", "google_ads"); field names and account IDs; date ranges or presets used; what you were trying to achieve; actions that did not work or were missing; what went wrong - error messages, missing or unexpected data, wrong numbers; expected vs actual behavior; steps to reproduce; or, for feature requests, the use case and the desired outcome.
subject
string
Required
Short one-line title describing the inquiry.
windsoraimcp_create_custom_field
Create custom field
windsoraimcp_create_destination_task
Create destination task
windsoraimcp_execute_action
Execute action
windsoraimcp_get_connector_authorization_url
Get connector authorization URL
windsoraimcp_get_connector_connect_info
Get connector connect info
windsoraimcp_get_connectors
List connectors
windsoraimcp_get_current_user
Get current user
windsoraimcp_get_custom_fields
List custom fields
windsoraimcp_get_data
Get data
windsoraimcp_get_destination_setup_info
Get destination setup info
windsoraimcp_get_destination_tasks
List destination tasks
windsoraimcp_get_destinations
List destinations
windsoraimcp_get_fields
Get fields
windsoraimcp_get_options
Get options
windsoraimcp_get_subscription_url
Get subscription URL
windsoraimcp_get_windsor_login_url
Get Windsor.ai login URL
windsoraimcp_list_actions
List actions
Build your Agent
The same OAuth vault and scoped tool list across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { DynamicStructuredTool } from "@langchain/core/tools";
const sk = new ScalekitClient(
process.env.SCALEKIT_ENVIRONMENT_URL,
process.env.SCALEKIT_CLIENT_ID,
process.env.SCALEKIT_CLIENT_SECRET,
);
const page = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["windsoraimcp"], toolNames: [
"windsoraimcp_get_connectors",
"windsoraimcp_get_fields",
"windsoraimcp_get_data",
]}, pageSize: 100,
});
import { ScalekitClient } from "@scalekit-sdk/node";
import OpenAI from "openai";
const sk = new ScalekitClient(
process.env.SCALEKIT_ENVIRONMENT_URL,
process.env.SCALEKIT_CLIENT_ID,
process.env.SCALEKIT_CLIENT_SECRET,
);
const page = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["windsoraimcp"], toolNames: [
"windsoraimcp_get_connectors",
"windsoraimcp_get_fields",
"windsoraimcp_get_data",
]}, pageSize: 100,
});
const openai = new OpenAI();
import { ScalekitClient } from "@scalekit-sdk/node";
import Anthropic from "@anthropic-ai/sdk";
const sk = new ScalekitClient(
process.env.SCALEKIT_ENVIRONMENT_URL,
process.env.SCALEKIT_CLIENT_ID,
process.env.SCALEKIT_CLIENT_SECRET,
);
const page = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["windsoraimcp"], toolNames: [
"windsoraimcp_get_connectors",
"windsoraimcp_get_fields",
"windsoraimcp_get_data",
]}, pageSize: 100,
});
const anthropic = new Anthropic();
import { ScalekitClient } from "@scalekit-sdk/node";
const sk = new ScalekitClient(
process.env.SCALEKIT_ENVIRONMENT_URL,
process.env.SCALEKIT_CLIENT_ID,
process.env.SCALEKIT_CLIENT_SECRET,
);
const page = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["windsoraimcp"], toolNames: [
"windsoraimcp_get_connectors",
"windsoraimcp_get_fields",
"windsoraimcp_get_data",
]}, pageSize: 100,
});
Try these prompts
Copy a prompt into your agent. Each one maps to Windsor.ai marketing and business data for the signed-in user.
Cross-channel reporting
Copy the prompt
Copied
How did paid spend trend across Meta and Google Ads last month?
Copy the prompt
Copied
Which campaigns moved CPA the most in the last 14 days?
Copy the prompt
Copied
Compare blended ROAS this month against the same period last month.
Fields and custom metrics
Copy the prompt
Copied
Which fields can I segment by for the facebook connector?
Copy the prompt
Copied
Create a custom field for cost per qualified lead on Google Ads.
Copy the prompt
Copied
List my custom fields and the connectors they belong to.
Exports and account admin
Copy the prompt
Copied
Schedule a weekly export of Meta Ads data to BigQuery.
Copy the prompt
Copied
Which destination tasks run on my account right now?
Copy the prompt
Copied
What plan am I on and where do I upgrade?
SEE HOW AUTH WORKS
Your users connect once. Their Windsor.ai OAuth credentials stay vaulted, every call is checked, and every action is logged.
1
Authorize
Your user connects
Windsor.ai MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Windsor.ai MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Windsor.ai MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Windsor.ai MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
Reuse the same OAuth vault and audit chain on other marketing and analytics connectors.
No items found.
Test other agents
Reuse the same OAuth vault and audit chain on other marketing and analytics connectors.
No items found.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Windsor.ai credential makes every query look like a bot. Scalekit resolves the credential of the actual user who triggered the agent, never a shared service account.
// shared key
audit → bot_acct

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Windsor.ai today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Windsor.ai as the user or a shared key?
Per-user resolution. Each tool call uses the signed-in user's Windsor.ai OAuth grant, so every query attributes to that user in the audit log.
Where is the Windsor.ai token stored?
In Scalekit's AES-256 vault, namespaced per tenant. Tokens refresh automatically and revoke from one dashboard without rotating shared secrets.
Can I limit what the agent does in Windsor.ai?
Yes. Filter tool names in listScopedTools (for example windsoraimcp_get_data only) and Scalekit checks that scope before the API call.
What happens when a user revokes access?
The next Windsor.ai tool call fails closed for that user. Other users and connectors are unaffected. The revoke is logged.
What about write actions like exports or campaign changes?
Writes stay governed. Actions such as create_destination_task or execute_action run only when the user's own grant allows them, and each one lands in the same audit trail as reads.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""windsoraimcp"": {
""url"": ""https://mcp.scalekit.com/windsoraimcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.windsoraimcp]
url = ""https://mcp.scalekit.com/windsoraimcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""windsoraimcp"": {
""url"": ""https://mcp.scalekit.com/windsoraimcp"",
""type"": ""http""
}
}
}