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

The Dropcontact MCP connector routes your AI agent's tool calls to Dropcontact's own MCP server through Scalekit. Each user signs in to Dropcontact 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, Marketing
**Tools:** 6: 2 read, 4 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=DROPCONTACTMCP)

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

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

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

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

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

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

**Python**

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

### `dropcontactmcp_check_credits`

Check Credits · Read-only

Check the number of remaining Dropcontact enrichment credits for the authenticated user. Each contact enrichment or email validation consumes 1 credit. Call this before submitting enrichment requests to verify sufficient credits are available.

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

Inputs:

- `conversation_id` (`string`, optional): Conversation correlation ID. Present only when an earlier tool response in this conversation returned one; that value is carried unchanged on subsequent calls. Omitted on the first call.
- `reason_for_invocation` (`string`, optional): Brief explanation of why you chose this tool for the current task. Optional audit field; max 500 characters (longer values are truncated). Plain text only.

Example input: `{}`

### `dropcontactmcp_retrieve_enrichment_result`

Retrieve Enrichment Result · Read-only

Retrieve the result of a previously submitted enrichment or email validation request. Polls until processing is complete (typically 10–60 seconds, up to 3 minutes). Call this after any submit tool returns a request_id.

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

Inputs:

- `request_id` (`string`, required): The request ID returned by a previous submit tool call (submit_contact_enrichment_by_name, submit_contact_enrichment_by_full_name, submit_contact_enrichment_by_linkedin, or submit_email_validation). Used to poll for the enrichment or validation result.
- `conversation_id` (`string`, optional): Conversation correlation ID. Present only when an earlier tool response in this conversation returned one; that value is carried unchanged on subsequent calls. Omitted on the first call.
- `reason_for_invocation` (`string`, optional): Brief explanation of why you chose this tool for the current task. Optional audit field; max 500 characters (longer values are truncated). Plain text only.

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

### `dropcontactmcp_submit_contact_enrichment_by_full_name`

Submit Contact Enrichment By Full Name · Write

Submit a contact enrichment request using a full name and company name. Returns a request_id. Call retrieve_enrichment_result with the returned request_id to get results.

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

Inputs:

- `company` (`string`, required): The name of the company where the contact works. Required to narrow the search and return accurate professional contact information.
- `full_name` (`string`, required): The contact's full name (first and last name combined). Used together with the company name to identify the person and find their professional email address.
- `conversation_id` (`string`, optional): Conversation correlation ID. Present only when an earlier tool response in this conversation returned one; that value is carried unchanged on subsequent calls. Omitted on the first call.
- `reason_for_invocation` (`string`, optional): Brief explanation of why you chose this tool for the current task. Optional audit field; max 500 characters (longer values are truncated). Plain text only.

Example input: `{"company":"<company>","full_name":"<full_name>"}`

### `dropcontactmcp_submit_contact_enrichment_by_linkedin`

Submit Contact Enrichment By LinkedIn · Write

Submit a contact enrichment request using a LinkedIn profile URL. Returns a request_id. Call retrieve_enrichment_result with the returned request_id to get results.

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

Inputs:

- `linkedin_url` (`string`, required): The full LinkedIn profile URL of the contact to enrich. Must be a valid linkedin.com/in/ profile URL.
- `conversation_id` (`string`, optional): Conversation correlation ID. Present only when an earlier tool response in this conversation returned one; that value is carried unchanged on subsequent calls. Omitted on the first call.
- `reason_for_invocation` (`string`, optional): Brief explanation of why you chose this tool for the current task. Optional audit field; max 500 characters (longer values are truncated). Plain text only.

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

### `dropcontactmcp_submit_contact_enrichment_by_name`

Submit Contact Enrichment By Name · Write

Submit a contact enrichment request using first name, last name, and company name. Returns a request_id. Call retrieve_enrichment_result with the returned request_id to get results.

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

Inputs:

- `company` (`string`, required): The name of the company where the contact works. Required to narrow the search and return accurate professional contact information.
- `first_name` (`string`, required): The contact's first name. Used together with last name and company to identify the person and find their professional email address.
- `last_name` (`string`, required): The contact's last name. Used together with first name and company to identify the person and find their professional email address.
- `conversation_id` (`string`, optional): Conversation correlation ID. Present only when an earlier tool response in this conversation returned one; that value is carried unchanged on subsequent calls. Omitted on the first call.
- `reason_for_invocation` (`string`, optional): Brief explanation of why you chose this tool for the current task. Optional audit field; max 500 characters (longer values are truncated). Plain text only.

Example input: `{"company":"<company>","first_name":"<first_name>","last_name":"<last_name>"}`

### `dropcontactmcp_submit_email_validation`

Submit Email Validation · Write

Submit an email validation request to check whether an email address is valid and deliverable. Returns qualification: nominative, catch-all, generic, or invalid. Returns a request_id. Call retrieve_enrichment_result to get results.

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

Inputs:

- `email_address` (`string`, required): The email address to validate. Will be checked for deliverability and qualified as nominative, catch-all, generic, or invalid.
- `conversation_id` (`string`, optional): Conversation correlation ID. Present only when an earlier tool response in this conversation returned one; that value is carried unchanged on subsequent calls. Omitted on the first call.
- `reason_for_invocation` (`string`, optional): Brief explanation of why you chose this tool for the current task. Optional audit field; max 500 characters (longer values are truncated). Plain text only.

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

## Related

Other CRM & Sales connectors ([all 64](/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 |
