> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the Agency Analytics MCP server

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

**Authentication:** OAuth 2.1/DCR
**Categories:** Analytics, Marketing, Monitoring
**Tools:** 35: 34 read, 1 write, 0 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=AGENCYANALYTICSMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Agency Analytics MCP connection

   In **AgentKit > Connections**, create an Agency Analytics MCP connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

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

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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 = 'agencyanalyticsmcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Agency Analytics 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: 'agencyanalyticsmcp_browse_client_custom_metrics',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "agencyanalyticsmcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Agency Analytics MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="agencyanalyticsmcp_browse_client_custom_metrics",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'agencyanalyticsmcp_browse_client_custom_metrics',
  toolInput: {},
  connector: 'agencyanalyticsmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="agencyanalyticsmcp_browse_client_custom_metrics",
    tool_input={},
    connection_name="agencyanalyticsmcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `agencyanalyticsmcp_browse_client_custom_metrics`

BrowseClientCustomMetrics · Read-only

List the custom metrics available for a single client — both campaign-level and account-level — so you can discover which formula-driven KPIs exist (e.g. 'Cost per Lead', 'ROAS'). Returns one row per custom metric with its id, name, data_type, change_format, scope, formula, and description. Use the returned ids with read_client_custom_metrics to fetch computed values.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.

Example input: `{}`

### `agencyanalyticsmcp_browse_client_dashboards`

BrowseClientDashboards · Read-only

List all dashboards for a client/campaign. Returns paginated dashboards (10 per page). If the user does not see what they are looking for, increment page and call again. Requires client_id on every call.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`integer`, optional): The client (campaign) ID. Required on every call.
- `page` (`integer`, optional): Page number for pagination (default 1).

Example input: `{}`

### `agencyanalyticsmcp_browse_client_data_sources`

BrowseClientDataSources · Read-only

Discover connected providers and available metric data sources for a campaign. Pass message (the user's question) to filter returned data sources to only those relevant to the question. Returns providers (connected slugs) and data_sources (AAQL data source definitions with available fields and pre-hydrated filters).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `message` (`string`, optional): The user's original question — used to filter relevant data sources.

Example input: `{}`

### `agencyanalyticsmcp_browse_client_reports`

BrowseClientReports · Read-only

List all reports for a client/campaign. Use this when no specific report was named and you need to present options or pick the most relevant one. Requires client_id on every call.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`integer`, optional): The client (campaign) ID. Required on every call.

Example input: `{}`

### `agencyanalyticsmcp_browse_clients`

BrowseClients · Read-only

Browse or enumerate clients. Two modes: Folder mode (omit groupId) returns all folders with their client counts plus ungrouped clients. Drill-down mode (groupId provided) returns all clients inside the specified folder. Results are paginated via limit and offset.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `groupId` (`integer`, optional): Folder ID to drill into. Omit to list all folders and ungrouped clients.
- `limit` (`integer`, optional): Maximum number of items to return (default 50, max 200). Default: `50`.
- `offset` (`integer`, optional): Zero-based pagination offset (default 0). Default: `0`.
- `search` (`string`, optional): Optional text filter applied to client name or URL.
- `status` (`string`, optional): Optional status filter — e.g. "active" or "inactive". Omit to return all statuses.

Example input: `{}`

### `agencyanalyticsmcp_fetch_web`

FetchWeb · Read-only

Fetch a single public web page or document by URL and return its readable text. HTML is reduced to plain text; JSON, plain-text, and XML responses are returned as-is. Output is truncated to maxLength characters (default 30000).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `url` (`string`, required): Absolute http(s) URL to fetch, e.g. 'https://example.com/article'.
- `maxLength` (`integer`, optional): Maximum characters of extracted text to return. Defaults to 30000; clamped to [1000, 100000].

Example input: `{"url":"https://example.com/article"}`

### `agencyanalyticsmcp_read_client_ad_manager`

ReadClientAdManager · Read-only

Fetch a client's Google Ad Manager (sell-side / publisher ad-serving) analytics, broken down by a dimension. Returns one row per dimension value with the publisher's ad-revenue metrics (revenue, impressions, clicks, CTR, eCPM, fill rate, and more). This is the client-as-PUBLISHER earning ad revenue — NOT the client buying ads (use read_client_ads for spend-side campaign performance). Supported providers (1): google-ad-manager-v1.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `applyMarkup` (`boolean`, optional): Whether to apply the client's agency markup to revenue and eCPM figures. Default: `false`.
- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The dimension to break down Ad Manager revenue by. One of: `advertiser`, `creative`, `line_item`, `order`, `city`, `country`, `region`, `custom_criteria`, `placement`, `browser`, `device`, `device_category`, `domain`, `operating_system`. Default: `advertiser`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The Ad Manager provider slug. One of: `google-ad-manager-v1`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_ads`

ReadClientAds · Read-only

Fetch ad data broken down by campaign, ad group, or ad for a specific platform. Returns one row per entity — NOT a time series. Use ONLY when the user asks for a per-entity breakdown. Supported platforms (21): googleadwords, facebook-ads, linked-in-ads, snapchat-ads, tiktok-ads, adroll, amazon-ads, bing-ads, twitter-ads, spotify-ads, stack-adapt, google-display-video360, pinterest-ads, reddit-ads-v1, simpli-fi, centro, centro-basis, choozle, adform, yelp-ads, ground-truth-v1.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `applyMarkup` (`boolean`, optional): Whether to apply the client's agency markup to cost/spend figures. Default: `false`.
- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The entity type to break down by. One of: `campaign`, `adgroup`, `ad`, `video`, `reach`, `domain`. Default: `campaign`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The ad platform provider slug. One of: `googleadwords`, `facebook-ads`, `linked-in-ads`, `snapchat-ads`, `tiktok-ads`, `adroll`, `amazon-ads`, `bing-ads`, `twitter-ads`, `spotify-ads`, `stack-adapt`, `google-display-video360`, `pinterest-ads`, `reddit-ads-v1`, `simpli-fi`, `centro`, `centro-basis`, `choozle`, `adform`, `yelp-ads`, `ground-truth-v1`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_ai_tracker`

ReadClientAiTracker · Read-only

Fetch a client's AI Tracker analytics — how visible the brand is inside AI assistants' answers (ChatGPT, Google AI Overview, Google AI Mode, Claude, Perplexity, Gemini), broken down by a dimension. Returns one row per dimension value with AI-visibility metrics (visibility, citations, position, sentiment, citation_rate, prompts). This is AI-answer visibility — NOT Google SERP keyword rankings (use read_client_keywords for that). Supported providers (1): agency-analytics-ai-tracker-v1.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The dimension to break down AI visibility by. One of: `platform`, `prompt`, `topic`, `citation_domain`, `citation_url`, `by_date`, `by_date_platform`, `by_date_topic`. Default: `platform`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The AI Tracker provider slug. One of: `agency-analytics-ai-tracker-v1`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_audience`

ReadClientAudience · Read-only

Fetch a client's audience demographics broken down by a demographic dimension for a specific connected platform. Returns one row per segment with the platform's audience metric. Use for 'who is the audience?' questions such as audience by age, gender, or country. Not a time-series tool and not ad performance by demographic. Supported platforms (5): instagram, youtube, tiktok-v1, pinterest-ads, linked-in.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The demographic dimension to break audience down by. One of: `age`, `gender`, `city`, `country`, `device`, `category`, `region`, `industry`, `seniority`, `function`, `company_size`. Default: `country`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The audience platform provider slug. One of: `instagram`, `youtube`, `tiktok-v1`, `pinterest-ads`, `linked-in`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_calls`

ReadClientCalls · Read-only

Fetch call analytics grouped by an entity type for a connected call-tracking integration. Returns one row per entity type. Supported providers (10): marchex, twilio, what-converts, callrail, call-tracking-metrics, call-source, googleadwords, avanser, delacon, wild-jar.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The dimension to group calls by. One of: `call_type`, `status`, `source`. Default: `status`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The call tracking provider slug. One of: `marchex`, `twilio`, `what-converts`, `callrail`, `call-tracking-metrics`, `call-source`, `googleadwords`, `avanser`, `delacon`, `wild-jar`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_content`

ReadClientContent · Read-only

Fetch content analytics broken down by individual post, reel, pin, or video item for a specific social platform. Returns one row per content item — NOT a time series. Supported platforms (7): facebook, instagram, pinterest, youtube, linked-in, tiktok-v1, vimeo.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The type of content: 'posts', 'reels', 'pins', or 'videos'. One of: `posts`, `reels`, `pins`, `videos`. Default: `posts`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The social platform provider slug. One of: `facebook`, `instagram`, `pinterest`, `youtube`, `linked-in`, `tiktok-v1`, `vimeo`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_conversions`

ReadClientConversions · Read-only

Fetch conversion analytics broken down by conversion type for a specific platform connected to a client. Returns one row per conversion type with counts and (where the platform tracks it) value/cost. Not a time-series tool — use read_client_metrics for conversions over time, or read_client_ads for per-campaign totals. Supported platforms (6): google-analytics4, facebook-ads, stack-adapt, google-local-services-ads, bing-ads, simpli-fi.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `applyMarkup` (`boolean`, optional): Whether to apply the client's agency markup to cost/value figures. Default: `false`.
- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The conversion platform provider slug. One of: `google-analytics4`, `facebook-ads`, `stack-adapt`, `google-local-services-ads`, `bing-ads`, `simpli-fi`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_crm`

ReadClientCrm · Read-only

Fetch CRM data for a specific platform connected to a client. Returns one row per entity (deal stage, company, contact segment, campaign, appointment, etc.). Use for sales-pipeline / CRM questions such as deals by stage, pipeline value, or contacts by lifecycle stage. Not a time-series tool — use read_client_metrics for pipeline/revenue trends over time. Supported platforms (5): hub-spot, salesforce, keap, high-level, sharp-spring.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The CRM entity type to fetch. One of: `deals`, `companies`, `contacts`, `campaigns`, `appointments`, `conversations`. Default: `deals`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The CRM provider slug. One of: `hub-spot`, `salesforce`, `keap`, `high-level`, `sharp-spring`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_custom_metrics`

ReadClientCustomMetrics · Read-only

Fetch the computed output of a single client's custom metrics (formula-driven KPIs such as 'Cost per Lead' or 'ROAS') over a date range. Provide customMetricIds to read specific metrics; omit it to read every custom metric available for the client. Use browse_client_custom_metrics first to discover the available metric ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `byDate` (`boolean`, optional): Set to true to return values broken down by date. Default: `false`.
- `clientId` (`integer`, optional): The client (campaign) ID.
- `customMetricIds` (`array`, optional): List of custom metric IDs to fetch. Omit to fetch all.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.

Example input: `{}`

### `agencyanalyticsmcp_read_client_dashboard`

ReadClientDashboard · Read-only

Fetch data for a specific dashboard. Step 1 (no section_name): resolves a dashboard container by dashboard_id or dashboard_name and returns the list of available dashboards. Step 2 (with section_name): fetches provider data for the named dashboard. Requires client_id on every call.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`integer`, optional): The client (campaign) ID. Required on every call.
- `dashboard_id` (`integer`, optional): ID of the dashboard to fetch.
- `dashboard_name` (`string`, optional): Name of the dashboard to fetch.
- `end_date` (`string`, optional): End date in YYYY-MM-DD format.
- `section_name` (`string`, optional): Name of the section to fetch data for. Omit for Step 1 (list sections).
- `start_date` (`string`, optional): Start date in YYYY-MM-DD format.

Example input: `{}`

### `agencyanalyticsmcp_read_client_data_source`

ReadClientDataSource · Read-only

Run a raw AAQL read query for one client and return the raw connector rows as CSV. Use this ONLY when the user explicitly asks to export raw data. For normal analytics use the entity and metric tools — they are far more token-efficient.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `asset` (`string`, optional): The AAQL asset/table name.
- `clientId` (`integer`, optional): The client (campaign) ID.
- `confirmed` (`boolean`, optional): Set to true to confirm the export. Default: `false`.
- `fields` (`array`, optional): Fields to include in the output.
- `filters` (`object`, optional): Key-value filter map.
- `groupBy` (`array`, optional): Fields to group by.
- `limit` (`integer`, optional): Maximum rows (default 50). Default: `50`.
- `offset` (`integer`, optional): Pagination offset. Default: `0`.
- `provider` (`string`, optional): The integration provider slug.
- `sort` (`object`, optional): Sort configuration.
- `testMode` (`boolean`, optional): Serve the provider's demo data instead of the client's live data, so a source can be read without a live integration. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_ecommerce`

ReadClientEcommerce · Read-only

Fetch ecommerce data for a specific platform connected to a client. Returns one row per entity (product, order status, channel, subscription, payment, etc.). Use for online-store questions such as best-selling products, orders by status, sales by channel, or subscription revenue. Not a time-series tool — use read_client_metrics for revenue/sales trends over time. Metrics are provider-native and not directly comparable across platforms. Supported platforms (6): shopify, woocommerce, big-commerce-v1, stripe, keap, google-analytics4.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The ecommerce entity type to fetch. One of: `products`, `channels`, `orders`, `customers`, `subscriptions`, `payments`, `refunds`, `transactions`. Default: `products`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The ecommerce provider slug. One of: `shopify`, `woocommerce`, `big-commerce-v1`, `stripe`, `keap`, `google-analytics4`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_email`

ReadClientEmail · Read-only

Fetch email-campaign performance for a specific platform connected to a client. Returns one row per email campaign with engagement metrics (sent, delivered, opens, clicks, open_rate, click_rate, unsubscribes, bounce_rate). Not a time-series tool — use read_client_metrics for email metrics over time. Sendinblue/Brevo ignores the date range and always returns all campaigns. Supported platforms (3): mail-chimp, hub-spot, sendinblue.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The email platform provider slug. One of: `mail-chimp`, `hub-spot`, `sendinblue`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_forms`

ReadClientForms · Read-only

Fetch web-form submission analytics for a specific platform connected to a client. Returns one row per form with its submission count (and, for HubSpot, views + submission/clickthrough rates). Not a time-series tool, call tracking, or conversions-by-type data — use read_client_metrics, read_client_calls, or read_client_conversions respectively. GravityForms reports an all-time count per form (its date range is ignored); HubSpot honors the date range. Supported platforms (2): gravity-forms-v1, hub-spot.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The form platform provider slug. One of: `gravity-forms-v1`, `hub-spot`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_insights`

ReadClientInsights · Read-only

Return a single client's biggest-moving metrics (trend signals), ranked by the magnitude of their percent change — biggest movers first, whether up or down. Use this to answer 'what changed the most for this client?'. These are pre-computed trend signals refreshed once daily — NOT real-time.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `comparisonType` (`string`, optional): The comparison type. One of: `previous_period`, `year_over_year`.
- `direction` (`string`, optional): Filter to only gains ('up'), only declines ('down'), or flat metrics ('flat'). One of: `up`, `down`, `flat`.
- `limit` (`integer`, optional): Maximum number of results (default 50). Default: `50`.
- `minPercentageChangeMagnitude` (`number`, optional): Minimum absolute percent change to include.
- `period` (`integer`, optional): Comparison window in days. Allowed values: 30 or 90.

Example input: `{}`

### `agencyanalyticsmcp_read_client_keywords`

ReadClientKeywords · Read-only

Fetch keyword data for a specific platform connected to a client. Returns one row per keyword. Supported platforms (9): googleadwords, bing-ads, amazon-ads, pinterest-ads, simpli-fi, bing-webmaster-tools, google-search-console, rank-tracker, se-ranking-v1.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `applyMarkup` (`boolean`, optional): Whether to apply the client's agency markup to cost/cpc figures (ad-platform providers only; no effect on organic/rank providers). Default: `false`.
- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The keyword platform provider slug. One of: `googleadwords`, `bing-ads`, `amazon-ads`, `pinterest-ads`, `simpli-fi`, `bing-webmaster-tools`, `google-search-console`, `rank-tracker`, `se-ranking-v1`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_knowledge`

ReadClientKnowledge · Read-only

Answer questions grounded in a client's uploaded documents — contracts, invoices, statements of work, proposals, briefs, meeting notes, reports — or the account's shared docs (brand guidelines, templates, policies). Pass clientId to scope to one client; omit it to search all accessible clients plus shared docs. Returns a grounded, source-cited answer.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): Optional. The client (campaign) whose documents to search. Omit to search across all accessible clients plus shared account-level documents.
- `prompt` (`string`, optional): The natural-language question about the uploaded documents.

Example input: `{}`

### `agencyanalyticsmcp_read_client_metrics`

ReadClientMetrics · Read-only

Fetch aggregated time-series metrics for a single client over a date range, scoped to one connected integration provider. Returns one row per day or month — NOT one row per campaign or keyword. Use this for trend questions. Responses are limited to a maximum of 200 rows. Supported providers: adroll, bing-ads, facebook, facebook-ads, google-analytics4, google-local-services-ads, google-my-business, google-search-console, googleadwords, ground-truth-v1, high-level, instagram, linked-in, linked-in-ads, pinterest-ads, reddit-ads-v1, simpli-fi, spotify-ads, stack-adapt, tiktok-ads, twitter-ads.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `increment` (`string`, optional): Time grouping: 'day' or 'month'. One of: `day`, `month`. Default: `day`.
- `provider` (`string`, optional): The integration provider slug. One of: `adroll`, `bing-ads`, `facebook`, `facebook-ads`, `google-analytics4`, `google-local-services-ads`, `google-my-business`, `google-search-console`, `googleadwords`, `ground-truth-v1`, `high-level`, `instagram`, `linked-in`, `linked-in-ads`, `pinterest-ads`, `reddit-ads-v1`, `simpli-fi`, `spotify-ads`, `stack-adapt`, `tiktok-ads`, `twitter-ads`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.

Example input: `{}`

### `agencyanalyticsmcp_read_client_pages`

ReadClientPages · Read-only

Fetch page data for a specific platform connected to a client. Returns one row per page. Supported platforms (5): google-analytics4, google-search-console, hub-spot, unbounce, agency-analytics-auditor-4.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The entity type: 'pages' or 'blog_posts'. One of: `pages`, `blog_posts`. Default: `pages`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The page analytics provider slug. One of: `google-analytics4`, `google-search-console`, `hub-spot`, `unbounce`, `agency-analytics-auditor-4`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_report`

ReadClientReport · Read-only

Read a specific scheduled report for a client/campaign. Requires report_id or report_name. Step 1 (no section_name): resolves the report and returns its list of sections. Step 2 (with section_name): fetches provider data for one specific section. Requires client_id on every call.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `client_id` (`integer`, optional): The client (campaign) ID. Required on every call.
- `end_date` (`string`, optional): End date in YYYY-MM-DD format.
- `report_id` (`integer`, optional): ID of the report to read.
- `report_name` (`string`, optional): Name of the report to read.
- `section_name` (`string`, optional): Name of the section to fetch. Omit for Step 1 (list sections).
- `start_date` (`string`, optional): Start date in YYYY-MM-DD format.

Example input: `{}`

### `agencyanalyticsmcp_read_client_reputation`

ReadClientReputation · Read-only

Fetch a client's aggregate review/reputation analytics for a specific connected review platform. Returns review counts broken down by a dimension, or an overall rating summary. This is aggregate reputation analytics, NOT the individual reviews themselves (use read_client_reviews for review text/authors) and not a time-series tool. TrustPilot and Yelp return the current snapshot regardless of the requested dates. Supported platforms (5): bird-eye, trust-pilot, grade-us, gather-up, yelp.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The dimension to break reputation data down by. 'overall' is the only option that returns average_rating. One of: `rating`, `source`, `sentiment`, `overall`. Default: `rating`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The reputation/review platform provider slug. One of: `bird-eye`, `trust-pilot`, `grade-us`, `gather-up`, `yelp`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_reviews`

ReadClientReviews · Read-only

Fetch individual customer reviews for a specific review platform connected to a client. Returns one row per review. Supported platforms (7): google-my-business, vendasta, bird-eye, gather-up, grade-us, trust-pilot, yelp.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The review platform provider slug. One of: `google-my-business`, `vendasta`, `bird-eye`, `gather-up`, `grade-us`, `trust-pilot`, `yelp`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_site_audit`

ReadClientSiteAudit · Read-only

Fetch a client's technical site-audit data for a specific connected provider. Returns page-speed / Lighthouse scores and audit findings, or Search Console sitemap health. This is technical site health — NOT keyword rankings (use read_client_keywords) or page traffic (use read_client_pages), and not a time-series tool. startDate/endDate are ignored — results are always the current snapshot. Supported providers (2): google-page-speed-v1, google-search-console.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format. Ignored by this tool — site-audit results are always the current snapshot.
- `entityType` (`string`, optional): The site-audit breakdown to fetch. One of: `scores`, `scores_mobile`, `audits`, `audits_mobile`, `sitemaps`, `sitemap_alerts`. Default: `scores`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The site-audit provider slug. One of: `google-page-speed-v1`, `google-search-console`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format. Ignored by this tool — site-audit results are always the current snapshot.
- `testMode` (`boolean`, optional): Set to true to return sample data without a live API call. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_client_traffic`

ReadClientTraffic · Read-only

Fetch traffic analytics grouped by an entity type for a specific traffic platform. Returns one row per entity value (e.g. per device type, per country). Supported providers (6): google-analytics4, youtube, google-my-business, matomo-v1, clarity-v1, hub-spot.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `clientId` (`integer`, optional): The client (campaign) ID.
- `endDate` (`string`, optional): End date in YYYY-MM-DD format.
- `entityType` (`string`, optional): The dimension to group traffic by. One of: `age`, `browser`, `campaign`, `channel`, `city`, `country`, `device`, `device_model`, `first_user_source_platform`, `gender`, `interest`, `landing_page`, `landing_page_query_string`, `language`, `operating_system`, `page`, `percent_scrolled`, `platform`, `region`, `search_term`, `session_keyword`, `session_manual_term`, `session_medium`, `session_source`, `session_source_medium`, `session_traffic_origin`, `source`, `source_medium`, `user_type`, `impression_type`, `search_engine`, `social_network`, `referrer`, `location`. Default: `source`.
- `limit` (`integer`, optional): Maximum rows to return (default 50). Default: `50`.
- `provider` (`string`, optional): The traffic analytics provider slug. One of: `google-analytics4`, `youtube`, `google-my-business`, `matomo-v1`, `clarity-v1`, `hub-spot`.
- `startDate` (`string`, optional): Start date in YYYY-MM-DD format.
- `testMode` (`boolean`, optional): Set to true to return sample data. Default: `false`.

Example input: `{}`

### `agencyanalyticsmcp_read_knowledge_base`

ReadKnowledgeBase · Read-only

Search the AgencyAnalytics knowledge base for how-to articles and platform documentation. Use this to answer questions about how to use the AgencyAnalytics platform itself.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `search` (`string`, optional): Search term to look up in the knowledge base.

Example input: `{}`

### `agencyanalyticsmcp_search_clients`

SearchClients · Read-only

Look up ONE specific client by name fragment, brand token, or domain. Returns the single best-matching client (highest cosine similarity over `company`+`url`) with a `providers` field — use that to confirm a provider is connected before calling any entity tool. If the user wants to list, browse, or enumerate clients — use `browse_clients` instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): A substantive client identifier the user actually provided — a name fragment, brand token, or domain (e.g. "acme", "shopify", ".io"). NOT a search engine query. Empty, whitespace-only, single-character, or generic-word queries will be rejected.

Example input: `{"query":"acme"}`

### `agencyanalyticsmcp_search_users`

SearchUsers · Read-only

Search the teammates and contacts in your own AgencyAnalytics account by name or email. Returns users you are allowed to contact with id, name, email, and role.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Required. A name or email fragment to search for, e.g. "john", "smith", "john@acme.com".
- `limit` (`integer`, optional): Optional. Maximum number of users to return (default 10, max 50). Default: `10`.

Example input: `{"query":"john"}`

### `agencyanalyticsmcp_search_web`

SearchWeb · Read-only

Search the live web and return a compact keyword-research result set: organic results (position, title, link, domain, snippet), related searches, People Also Ask questions, and the answer box when present. Use for keyword research, SERP inspection, and competitor discovery. Not client-scoped — no clientId required.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): The search query — a keyword phrase to research.
- `countryCode` (`string`, optional): Optional two-letter Google country code (gl), e.g. 'ca'.
- `engine` (`string`, optional): Search engine to use: 'google' (desktop, default), 'google_mobile', or 'bing'. One of: `google`, `google_mobile`, `bing`.
- `language` (`string`, optional): Optional language code (hl for Google, bing_language for Bing), e.g. 'en'.
- `limit` (`integer`, optional): Maximum organic results to return (1-100). Defaults to 10.
- `location` (`string`, optional): Optional free-form location to localize results, e.g. 'Toronto, Ontario, Canada'.

Example input: `{"query":"acme"}`

### `agencyanalyticsmcp_create_mcp_feedback`

CreateMcpFeedback · Write

Record user feedback explicitly directed at the AgencyAnalytics MCP server experience — its tools, ergonomics, or quality of results. Only call this when the user clearly intends to leave feedback about the MCP.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `message` (`string`, required): The user's feedback in their own words. 1-2000 characters.
- `sentiment` (`string`, required): Overall sentiment of the feedback. One of: `positive`, `negative`.

Example input: `{"message":"<message>","sentiment":"positive"}`

## Related

Other Analytics connectors ([all 95](/agentkit/connectors/?category=analytics)):

- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Snowflake](/agentkit/connectors/snowflake/): Scalekit connector, OAuth, 42 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
