> **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 Profound MCP server

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

**Authentication:** OAuth 2.1/DCR
**Categories:** Marketing, Analytics, AI
**Tools:** 15: 15 read, 0 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=PROFOUNDMCP)

## 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 Profound MCP connection

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

   Scalekit credentials are available for Profound 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 = 'profoundmcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Profound 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: 'profoundmcp_list_models',
     toolInput: { rationale: 'YOUR_RATIONALE' },
   })
   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 = "profoundmcp"
   identifier = "user_123"

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

   # Make your first call
   result = actions.execute_tool(
       tool_input={"rationale":"YOUR_RATIONALE"},
       tool_name="profoundmcp_list_models",
       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: 'profoundmcp_get_bots_report',
  toolInput: {
    domain: '<domain>',
    end_date: '<end_date>',
    rationale: '<rationale>',
    start_date: '<start_date>',
  },
  connector: 'profoundmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="profoundmcp_get_bots_report",
    tool_input={
        "domain": "<domain>",
        "end_date": "<end_date>",
        "rationale": "<rationale>",
        "start_date": "<start_date>",
    },
    connection_name="profoundmcp",
    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.

### `profoundmcp_get_bots_report`

Get Bots Report · Read-only

Measure AI crawler activity against a domain over a date range, including bots such as GPTBot and PerplexityBot.

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

Inputs:

- `domain` (`string`, required): Tracked domain using exact hostname from list_domains
- `end_date` (`string`, required): Window end in YYYY-MM-DD format (exclusive)
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `start_date` (`string`, required): Window start in YYYY-MM-DD format (inclusive)
- `bot_name_filter` (`array`, optional): Narrow to specific bots
- `bot_provider_filter` (`array`, optional): Narrow to specific bot providers
- `bot_type_filter` (`array`, optional): Narrow to bot categories
- `cursor` (`string`, optional): Pagination token
- `dimensions` (`array`, optional): Group-by fields
- `filters` (`array`, optional): Advanced predicates
- `limit` (`integer`, optional): Top-N row cap
- `metrics` (`array`, optional): Metrics to return
- `organization_id` (`string`, optional): Disambiguate domain across organizations
- `page_size` (`integer`, optional): First-page size, up to 10,000

Example input: `{"domain":"<domain>","end_date":"<end_date>","rationale":"<rationale>","start_date":"<start_date>"}`

### `profoundmcp_get_citations_report`

Get Citations Report · Read-only

See which sources AI engines cite for a category, and how often, over a date range.

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

Inputs:

- `category_id` (`string`, required): Category to report on
- `end_date` (`string`, required): Window end in YYYY-MM-DD format (exclusive)
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `start_date` (`string`, required): Window start in YYYY-MM-DD format (inclusive)
- `citation_category_filter` (`array`, optional): Narrow to specific citation categories
- `cursor` (`string`, optional): Pagination token
- `dimensions` (`array`, optional): Group-by fields
- `filters` (`array`, optional): Advanced predicates
- `hostname_filter` (`array`, optional): Narrow to specific hostnames
- `limit` (`integer`, optional): Top-N row cap
- `metrics` (`array`, optional): Metrics to return
- `model_filter` (`array`, optional): Narrow to specific AI models
- `page_size` (`integer`, optional): First-page size, up to 10,000
- `persona_filter` (`array`, optional): Narrow to specific personas
- `region_filter` (`array`, optional): Narrow to specific regions
- `root_domain_filter` (`array`, optional): Narrow to specific root domains
- `tag_filter` (`array`, optional): Narrow to specific tags
- `topic_filter` (`array`, optional): Narrow to specific topics

Example input: `{"category_id":"<category_id>","end_date":"<end_date>","rationale":"<rationale>","start_date":"<start_date>"}`

### `profoundmcp_get_prompt_answers`

Get Prompt Answers · Read-only

Retrieve the actual answers AI engines gave for a category's prompts over a date range.

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

Inputs:

- `category_id` (`string`, required): Category to retrieve answers for
- `end_date` (`string`, required): Window end in YYYY-MM-DD format (exclusive)
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `start_date` (`string`, required): Window start in YYYY-MM-DD format (inclusive)
- `limit` (`integer`, optional): Rows per page
- `offset` (`integer`, optional): Row offset for pagination

Example input: `{"category_id":"<category_id>","end_date":"<end_date>","rationale":"<rationale>","start_date":"<start_date>"}`

### `profoundmcp_get_referrals_report`

Get Referrals Report · Read-only

Measure visits a domain received from AI engines, such as ChatGPT and Perplexity, over a date range.

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

Inputs:

- `domain` (`string`, required): Tracked domain using exact hostname from list_domains
- `end_date` (`string`, required): Window end in YYYY-MM-DD format (exclusive)
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `start_date` (`string`, required): Window start in YYYY-MM-DD format (inclusive)
- `cursor` (`string`, optional): Pagination token
- `dimensions` (`array`, optional): Group-by fields
- `filters` (`array`, optional): Advanced predicates
- `limit` (`integer`, optional): Top-N row cap
- `metrics` (`array`, optional): Metrics to return
- `organization_id` (`string`, optional): Disambiguate domain across organizations
- `page_size` (`integer`, optional): First-page size, up to 10,000
- `referral_source_filter` (`array`, optional): Narrow to specific referrer vendors
- `referral_type_filter` (`array`, optional): Narrow to referral categories

Example input: `{"domain":"<domain>","end_date":"<end_date>","rationale":"<rationale>","start_date":"<start_date>"}`

### `profoundmcp_get_sentiment_report`

Get Sentiment Report · Read-only

Measure sentiment in AI answers for a category over a date range. Default metrics: positive, negative, and occurrences.

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

Inputs:

- `category_id` (`string`, required): Category to report on
- `end_date` (`string`, required): Window end in YYYY-MM-DD format (exclusive)
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `start_date` (`string`, required): Window start in YYYY-MM-DD format (inclusive)
- `asset_filter` (`array`, optional): Narrow to brand/competitor assets
- `cursor` (`string`, optional): Pagination token
- `filters` (`array`, optional): Advanced predicates
- `limit` (`integer`, optional): Top-N row cap
- `metrics` (`array`, optional): Metrics to return
- `model_filter` (`array`, optional): Narrow to specific AI models
- `page_size` (`integer`, optional): First-page size, up to 10,000
- `persona_filter` (`array`, optional): Narrow to specific personas
- `region_filter` (`array`, optional): Narrow to specific regions
- `tag_filter` (`array`, optional): Narrow to specific tags
- `theme_filter` (`array`, optional): Narrow to specific sentiment themes
- `topic_filter` (`array`, optional): Narrow to specific topics

Example input: `{"category_id":"<category_id>","end_date":"<end_date>","rationale":"<rationale>","start_date":"<start_date>"}`

### `profoundmcp_get_visibility_report`

Get Visibility Report · Read-only

Measure how often and how prominently a brand appears in AI answers for a category over a date range.

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

Inputs:

- `category_id` (`string`, required): Category to report on
- `end_date` (`string`, required): Window end in YYYY-MM-DD format (exclusive)
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `start_date` (`string`, required): Window start in YYYY-MM-DD format (inclusive)
- `asset_filter` (`array`, optional): Narrow to brand/competitor assets
- `cursor` (`string`, optional): Pagination token
- `dimensions` (`array`, optional): Group-by fields
- `filters` (`array`, optional): Advanced predicates with field, operator, value
- `limit` (`integer`, optional): Top-N row cap
- `metrics` (`array`, optional): Metrics to return
- `model_filter` (`array`, optional): Narrow to specific AI models
- `page_size` (`integer`, optional): First-page size, up to 10,000
- `persona_filter` (`array`, optional): Narrow to specific personas
- `region_filter` (`array`, optional): Narrow to specific regions
- `tag_filter` (`array`, optional): Narrow to specific tags
- `topic_filter` (`array`, optional): Narrow to specific topics

Example input: `{"category_id":"<category_id>","end_date":"<end_date>","rationale":"<rationale>","start_date":"<start_date>"}`

### `profoundmcp_list_categories`

List Categories · Read-only

List tracked categories, markets, or segments in an organization. Most brand visibility reports are scoped to a category.

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

Inputs:

- `org_id` (`string`, required): Organization whose categories to list
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"org_id":"<org_id>","rationale":"<rationale>"}`

### `profoundmcp_list_domains`

List Domains · Read-only

List tracked domains for an organization. Domains are exact hostnames, so www.example.com and example.com are distinct.

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

Inputs:

- `org_id` (`string`, required): Organization whose tracked domains to list
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"org_id":"<org_id>","rationale":"<rationale>"}`

### `profoundmcp_list_models`

List Models · Read-only

List the AI models Profound tracks. Use returned model IDs to filter reports to a single engine.

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

Inputs:

- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"rationale":"<rationale>"}`

### `profoundmcp_list_organizations`

List Organizations · Read-only

List the organizations the authenticated user can access. Returned IDs feed category, domain, and report tools.

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

Inputs:

- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"rationale":"<rationale>"}`

### `profoundmcp_list_prompts`

List Prompts · Read-only

List prompts configured in a category. Prompts are the questions Profound runs against AI engines to measure brand visibility.

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

Inputs:

- `category_id` (`string`, required): Category to list prompts for
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `combine` (`string`, optional): How include filters combine. One of: `AND`, `OR`.
- `cursor` (`string`, optional): Pagination token from previous response
- `exclude_tag_ids` (`array`, optional): Exclude prompts carrying these tags
- `exclude_topic_ids` (`array`, optional): Exclude prompts under these topics
- `limit` (`integer`, optional): Maximum prompts to return
- `status` (`string`, optional): Filter by prompt status. One of: `active`, `disabled`, `all`.
- `tag_ids` (`array`, optional): Include only prompts carrying these tags
- `topic_ids` (`array`, optional): Include only prompts under these topics

Example input: `{"category_id":"<category_id>","rationale":"<rationale>"}`

### `profoundmcp_list_regions`

List Regions · Read-only

List geographic regions configured for an organization. Omit org_id to see regions across all accessible organizations.

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

Inputs:

- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool
- `org_id` (`string`, optional): Organization identifier

Example input: `{"rationale":"<rationale>"}`

### `profoundmcp_list_tags`

List Tags · Read-only

List tags available within a category for filtering prompts and reports.

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

Inputs:

- `category_id` (`string`, required): Category whose tags to list
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"category_id":"<category_id>","rationale":"<rationale>"}`

### `profoundmcp_list_topics`

List Topics · Read-only

List topics available within a category for filtering prompts and reports.

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

Inputs:

- `category_id` (`string`, required): Category to list topics for
- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"category_id":"<category_id>","rationale":"<rationale>"}`

### `profoundmcp_whoami`

Whoami · Read-only

Confirm the authenticated user, organizations, regions, and entitlements available to this MCP session.

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

Inputs:

- `rationale` (`string`, required): Always provide a brief explanation of why you are calling this tool

Example input: `{"rationale":"<rationale>"}`

## Related

Other Marketing connectors ([all 59](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 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 |
