> **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 6 tools.

**Authentication:** OAuth 2.1/DCR
**Categories:** CRM & Sales
**Tools:** 6: 4 read, 1 write, 1 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Datacircle MCP server app
**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 and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   Datacircle MCP server connections use your own OAuth app. Register one with Datacircle MCP server and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the Datacircle MCP connection.

5. ### 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_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_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 65](/agentkit/connectors/?category=crm-sales)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 tools
- [Close](/agentkit/connectors/close/): Scalekit connector, OAuth, 103 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 |
