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

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

**Authentication:** OAuth 2.1/DCR
**Categories:** CRM & Sales
**Tools:** 8: 6 read, 1 write, 1 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=DATACIRCLEMCP)

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

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

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

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

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

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="datacirclemcp_get_balance",
       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: 'datacirclemcp_get_balance',
  toolInput: {},
  connector: 'datacirclemcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="datacirclemcp_get_balance",
    tool_input={},
    connection_name="datacirclemcp",
    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.

### `datacirclemcp_get_balance`

Get the balance · Read-only

Read the Datacircle balance, in USD: balance_usd is everything calls can spend now, then what it is made of: signup_credit_usd (left of the sign-up credit), funds_usd (left of the funds added), manual_credit_usd, and temporary_credits, each with its campaign, credit_usd and expires_at. Read it to know whether the balance covers the calls you are about to make. Free.

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

Inputs: none.

Example input: `{}`

### `datacirclemcp_get_download_link`

Get a download link · Read-only

Get a download link for one file from list_files, by its id: url, a signed link valid one hour, fetched as is without the API key, and next_step: what the file holds, with a ready-to-run call per provider for the live profile behind any row. A locked file answers an error saying how to unlock it. Free.

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

Inputs:

- `file_id` (`integer`, required): The file's id, from list_files

Example input: `{"file_id":1}`

### `datacirclemcp_get_invite_link`

Get the invite link · Read-only

Get this account's invite link, invite_url, and signed_up_count: how many people signed up with it and verified their email. required_count (3) of them unlock the 50M+ US dataset and the co-op files; unlocks says so in words, unlocks_datasets names those files' datasets in list_files. Free.

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

Inputs: none.

Example input: `{}`

### `datacirclemcp_list_apis`

List Apis · Read-only

Lists the APIs on Datacircle's sheet and the number of plans and providers for each. Pass an API's name to search_plans.

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

Inputs: none.

Example input: `{}`

### `datacirclemcp_list_files`

List files · Read-only

List the data files this account can download: the free 10M+ US B2B leads dataset (us_10m), the 50M+ US dataset (us_50m) and the co-op files (every profile anyone fetched through a provider, new every day). Each file comes with its id, dataset, filename, row_count, size_bytes, created_at and is_unlocked: whether this account may download it. Get one with get_download_link. Free.

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

Inputs: none.

Example input: `{}`

### `datacirclemcp_search_plans`

Search Plans · Read-only

The sheet's rows, one for each plan of each call, each with every key of the sheet's JSON download: its provider, plan, billing, $ per 1,000 (perThousand), score out of 100 (score), rate limits, speed, the fields it returns and the pages we read it from. total counts every row found, plans holds up to limit of them from offset. What each key means: https://datacircle.dev/fields

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

Inputs:

- `api` (`string`, optional): The API, its name as list_apis gives it. Every API when left out. One of: `Employee profile`, `Person enrichment`, `Employee lookalikes`, `Employee recommendations`, `Employee search`, `People search`, `Employee email`, `Email validation`, `Reverse email lookup`, `Employee phone`, `Phone validation`, `Company profile`, `Company enrichment`, `Business verification`, `Company technologies`, `Company hierarchy`, `Company search`, `Company discovery`, `Company lookalikes`, `G2 reviews`, `Capterra reviews`, `Trustpilot reviews`, `Glassdoor reviews`, `Job search`, `Job postings`, `Job details`, `Job posting details`, `Job lookalikes`, `Company jobs`, `Company job count`, `Leadership changes`, `Post search`, `Post details`, `Employee posts`, `Employee articles`, `Company posts`, `Post comments`, `Post reactions`, `Post reposts`, `Employee comments`, `Employee reactions`, `Facebook ads`, `Google ads`, `LinkedIn ads`, `TikTok ads`, `Company headcount`, `Company funding`, `X profile`, `Instagram profile`, `TikTok profile`, `YouTube channel`, `Reddit profile`, `Facebook page`, `Threads profile`, `Bluesky profile`, `Telegram channel`, `Twitch profile`, `Snapchat profile`, `Truth Social profile`, `GitHub profile`, `X posts`, `Instagram posts`, `TikTok videos`, `YouTube channel videos`, `Reddit posts`, `Facebook posts`, `Threads posts`, `Bluesky posts`, `Telegram channel posts`, `Pinterest pin`, `Pinterest board pins`, `Pinterest user boards`, `Hacker News story comments`, `Twitch videos`, `Twitch clip`, `Kick clip`, `Truth Social posts`, `Pinterest search`, `Hacker News search`, `GitHub repository`, `GitHub user repositories`, `Douyin profile`, `Douyin user videos`, `Douyin video`, `Weibo profile`, `Weibo user posts`, `Weibo post`, `Xiaohongshu profile`, `Xiaohongshu user notes`, `Xiaohongshu note`, `Zhihu profile`, `Zhihu question answers`, `Kuaishou profile`, `Kuaishou user videos`, `Kuaishou video`, `Bilibili profile`, `Bilibili user videos`, `Bilibili video`, `Amazon product`, `Google Shopping product`, `Walmart product`, `eBay product`, `Facebook Marketplace listing`, `TikTok Shop product`, `Amazon search`, `Walmart search`, `eBay search`, `Facebook Marketplace search`, `TikTok Shop search`, `App Store app`, `App Store reviews`, `App Store search`, `Google Play app`, `Google Play reviews`, `Google Play search`, `Zillow property`, `Redfin property`, `Realtor.com property`, `Zillow search`, `Redfin search`, `Realtor.com search`, `Web search`, `SERP`, `Search autocomplete`, `News search`, `Image search`, `Video search`, `Web scraping`, `ChatGPT answer`, `Perplexity answer`, `Gemini answer`, `Bing Copilot answer`, `Keyword research`, `Ranked keywords`, `Related keywords`, `Backlinks`, `Domain authority`.
- `limit` (`integer`, optional): How many plans to give, 1 to 50. 10 when left out.
- `offset` (`integer`, optional): How many found plans to skip first. 0 when left out.
- `query` (`string`, optional): Words that must all appear in the provider's or plan's name, ignoring case and accents.
- `sort` (`string`, optional): score, the default: best first, as on the sheet at datacircle.dev, each API's plans together, unscored plans last. provider: A to Z. price: $ per 1,000, lowest first. One of: `score`, `provider`, `price`.

Example input: `{}`

### `datacirclemcp_get_linkedin_profile`

Get a LinkedIn profile · Write

Fetch one person's LinkedIn profile by its URL: name, headline, location, current company and title, positions, education, skills. It costs the provider's own price, taken from the Datacircle balance with no markup: up2data $0.00125 per profile found, free when it isn't found, up to $1 a day per account; harvestapi $0.0037 per profile found, every section of the profile. Every call is live: the provider is asked each time, so the profile is as it is today. The answer is the provider's own JSON plus datacircle_meta {provider, cost_usd, balance_usd}. If up2data answers its daily limit (429), call again with provider harvestapi; if the balance is too low (402), add_funds. Details: https://docs.datacircle.dev/pricing

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

Inputs:

- `url` (`string`, required): The profile's LinkedIn URL, like https://www.linkedin.com/in/williamhgates
- `provider` (`string`, optional): The data provider that fetches the profile, at its own price: up2data costs least; harvestapi returns every section of the profile, and answers when up2data is at its daily limit. One of: `up2data`, `harvestapi`. Default: `up2data`.

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

### `datacirclemcp_add_funds`

Add funds · Destructive

Start a Stripe Checkout that adds funds to the Datacircle balance. It answers checkout_url: give it to the user to open and pay; nothing is charged until they do. $50 or more in funds also unlocks the co-op files: the flat file of every API request, new every day.

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

Inputs:

- `amount_usd` (`integer`, required): The amount, in US dollars, the user pays at checkout and finds in their balance once paid

Example input: `{"amount_usd":1}`

## Related

Other CRM & Sales connectors ([all 103](/agentkit/connectors/?category=crm-sales)):

- [Insightly](/agentkit/connectors/insightly/): Scalekit connector, API key, 108 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 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 |
