> **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 Vibe Prospecting MCP server

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

**Authentication:** OAuth 2.1/DCR
**Categories:** CRM & Sales, Marketing, AI
**Tools:** 14: 9 read, 5 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=VIBEPROSPECTINGMCP)

## 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 Vibe Prospecting MCP connection

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

   Scalekit credentials are available for Vibe Prospecting 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 = 'vibeprospectingmcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Vibe Prospecting 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: 'vibeprospectingmcp_get_dataset',
     toolInput: { tool_reasoning: 'YOUR_TOOL_REASONING' },
   })
   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 = "vibeprospectingmcp"
   identifier = "user_123"

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

   # Make your first call
   result = actions.execute_tool(
       tool_input={"tool_reasoning":"YOUR_TOOL_REASONING"},
       tool_name="vibeprospectingmcp_get_dataset",
       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: 'vibeprospectingmcp_autocomplete',
  toolInput: {
    field: 'naics_category',
    query: '<query>',
    tool_reasoning: '<tool_reasoning>',
  },
  connector: 'vibeprospectingmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="vibeprospectingmcp_autocomplete",
    tool_input={
        "field": "naics_category",
        "query": "<query>",
        "tool_reasoning": "<tool_reasoning>",
    },
    connection_name="vibeprospectingmcp",
    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.

### `vibeprospectingmcp_autocomplete`

Autocomplete · Read-only

Autocomplete values for business filters based on a query. Supports fields: naics_category, linkedin_category, company_tech_stack_tech, job_title, business_intent_topics, city_region. Never use for fields not in this list. Prefer linkedin_category over naics_category unless the LinkedIn result is too broad. Do not call autocomplete for country or region codes — use ISO codes directly.

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

Inputs:

- `field` (`string`, required): The field to autocomplete. Only use fields listed here. Never use autocomplete for a field not in this list. One of: `naics_category`, `linkedin_category`, `company_tech_stack_tech`, `job_title`, `business_intent_topics`, `city_region`.
- `query` (`string`, required): The query to autocomplete
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Maximum 2000 characters.
- `session_id` (`string`, optional): Session ID for tracking tool calls within the same user request context. Reuse when continuing the same request; omit to create a new session.

Example input: `{"field":"naics_category","query":"<query>","tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_estimate_cost`

Estimate Cost · Read-only

Estimate the export cost in Explorium credits for a given table before exporting. Returns estimated cost, currency, a human-readable description, the table name, and a breakdown by row count and enrichment operations. Always show the cost estimate to the user and wait for explicit confirmation before calling export-to-csv. Note: show-sample already returns cost estimation fields, so this tool is only needed when a separate cost check is required.

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

Inputs:

- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): Name of the table to estimate cost for
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Do not replace it with a per-step rationale or unrelated PII. Maximum 2000 characters.

Example input: `{"session_id":"<session_id>","table_name":"<table_name>","tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_fetch_entities`

Fetch Entities · Read-only

Find companies and/or prospects using any combination of filters (returns ~10 sample rows for exploration, no charge). Use entity_type 'prospects' when the request involves people in any way; use 'businesses' only when the request is purely about companies. Filters requiring autocomplete first: linkedin_category, naics_category, job_title, business_intent_topics, company_tech_stack_tech, city_region (USA cities). Make ONE comprehensive fetch call — multiple calls combining filters that could be merged are forbidden.

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

Inputs:

- `entity_type` (`string`, required): REQUIRED: The type of entity you want as final output. Use "businesses" for company data, "prospects" for people/contact data. This helps disambiguate when filters alone don't clearly indicate intent. One of: `businesses`, `prospects`.
- `filters` (`object`, required): Combination of filters to narrow down results. All filter fields are optional. Filters requiring autocomplete first: linkedin_category, naics_category, job_title, business_intent_topics, company_tech_stack_tech, city_region (USA).
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Do not replace it with a per-step rationale or unrelated PII. Maximum 2000 characters.
- `businesses_reference_table` (`string`, optional): OPTIONAL: Only use to REFINE prospects from a previous fetch-businesses result. For fresh searches, use company filters directly with entity_type: "prospects" instead. MUST be provided with a session_id.
- `estimate_cost` (`boolean`, optional): No description. Default: `true`.
- `exclude_key` (`string`, optional): Exclude key to avoid returning previously seen entities. Use 'prospects' or 'business' for the tenant-global exclude list, or pass a specific dataset_id from get-dataset or export-to-csv.
- `max_per_company` (`number`, optional): Maximum number of prospects to return per company. Only applicable for prospect queries. CRITICAL: DO NOT use unless explicitly requested by the user.
- `number_of_results` (`number`, optional): Number of results to return. Defaults to 50 if not specified. Use the exact number requested by the user. Default: `50`.
- `session_id` (`string`, optional): Session ID for tracking tool calls within the same user request context. Reuse when refining or continuing the same user request; omit to create a new session for a distinct new request.

Example input: `{"entity_type":"businesses","filters":{},"tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_fetch_entities_statistics`

Fetch Entities Statistics · Read-only

Fetch aggregated insights into businesses or prospects by industry, revenue, employee count, job department, and geographic distribution. Use entity_type 'prospects' when the request involves prospects; use 'businesses' only for company-only stats. Filters requiring autocomplete first: linkedin_category, naics_category, job_title, business_intent_topics, company_tech_stack_tech. Country and region codes can be used directly without autocomplete.

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

Inputs:

- `entity_type` (`string`, required): REQUIRED: The type of entity you want statistics for. Use "businesses" for company stats, "prospects" for people/contact stats. One of: `businesses`, `prospects`.
- `filters` (`object`, required): Combination of filters to scope the statistics query. All filter fields are optional.
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Maximum 2000 characters.
- `session_id` (`string`, optional): Session ID for tracking tool calls within the same user request context. Reuse when refining or continuing the same request; omit to create a new session.

Example input: `{"entity_type":"businesses","filters":{},"tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_get_dataset`

Get Dataset · Read-only

Load a previously exported dataset or list into a session for further analysis, prospecting, or exclusion — or list the user's most recent datasets. Call with no dataset_id and no dataset_name to list up to 20 recent datasets. Provide at least one of dataset_id or dataset_name to load a specific dataset. If session_id is omitted, a new session is automatically created.

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

Inputs:

- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Do not replace it with a per-step rationale or unrelated PII. Maximum 2000 characters.
- `dataset_id` (`string`, optional): Optional. Dataset or list ID (starts with "ds-") to load directly. Takes priority over dataset_name. If neither dataset_name nor dataset_id is provided, returns a list of the user's most recent datasets.
- `dataset_name` (`string`, optional): Optional. Dataset or list name to load by name search. If the value starts with "ds-", use dataset_id instead. If neither dataset_name nor dataset_id is provided, returns a list of the user's most recent datasets.
- `session_id` (`string`, optional): Session ID for tracking tool calls within the same user request context. If not provided, a new session is automatically created for the dataset.

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

### `vibeprospectingmcp_match_business`

Match Business · Read-only

Get the Explorium business IDs from business name and/or domain in bulk. You can provide either name OR domain for each business, or both (recommended for better accuracy). If session_id is provided, results are stored for future reference; otherwise a new session_id is created and returned. Do NOT use when you already called fetch-entities for businesses (response contains business IDs) or when looking for general industry trends without specific companies.

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

Inputs:

- `businesses_to_match` (`array`, required): List of businesses to match. Each entry requires name and/or domain. Up to 50 businesses per call.
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Maximum 2000 characters.
- `session_id` (`string`, optional): Session ID for tracking tool calls within the same user request context. Reuse when refining or continuing the same request; omit to create a new session.

Example input: `{"businesses_to_match":[],"tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_match_prospects`

Match Prospects · Read-only

Match specific individuals to get their Explorium prospect IDs. Requires email OR (full name + company name) for each prospect. Always prefer this over web search for questions about specific people. Results are stored in the session for future enrichment or export. Returns session_id in the response for future data retrieval.

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

Inputs:

- `prospects_to_match` (`array`, required): List of prospects to match. Each entry requires email OR (full_name + company_name). Up to 40 prospects per call.
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Maximum 2000 characters.
- `session_id` (`string`, optional): Session ID for tracking tool calls within the same user request context. Reuse when continuing the same request; omit to create a new session.

Example input: `{"prospects_to_match":[],"tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_show_pricing_plans`

Show Pricing Plans · Read-only

Show Vibe Prospecting credit package pricing in an interactive widget. Use when the user asks about pricing, cost, buying credits, packages, upgrading, or plans — or when a prior tool execution failed due to insufficient credits. All plans are one-time purchases (not subscriptions), and credits are valid for 365 days. If a prior export-to-csv response included a promotion, pass its promo_code_id and promotion_type.

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

Inputs:

- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Do not replace it with a per-step rationale or unrelated PII. Maximum 2000 characters.
- `promotion_code_id` (`string`, optional): Optional Stripe promotion code id (e.g. promo_code_id from export-to-csv tool execution).
- `promotion_type` (`string`, optional): Optional promotion type. Currently can only be 'first_export'. Use it only when given a specific promotion code id from a previous export-to-csv tool execution with that type in the response.

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

### `vibeprospectingmcp_show_sample`

Show Sample · Read-only

Present the final sample rows to the user from a fetch, enrich, or events exploration table. Call this after each user turn's fetch/enrich/events work is finished. Charges 5 credits per exploration table (idempotent per table — duplicate calls for the same table_name do not charge again). Always call show-sample before presenting results to the user; do not ask for confirmation before calling it. This tool also returns export cost fields, so estimate-cost is not needed after show-sample for the same table.

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

Inputs:

- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): table_name from a prior fetch/enrich/events exploration response. Do not invent this value.
- `tool_reasoning` (`string`, required): The original user query that prompted this workflow, in EXACT WORDS. Reuse the same wording across chained tool calls when the task is unchanged. Do not replace it with a per-step rationale or unrelated PII. Maximum 2000 characters.

Example input: `{"session_id":"<session_id>","table_name":"<table_name>","tool_reasoning":"<tool_reasoning>"}`

### `vibeprospectingmcp_enrich_business`

Enrich Business · Write

Add detailed information to companies from previous fetch-entities results. Supports enrichments including firmographics, technographics, funding, workforce trends, financial metrics, LinkedIn posts, website changes, and more. Returns a masked preview and a new table_name (no charge); use export-to-csv to retrieve all enriched rows. Use the new table_name for all downstream steps — the original fetch-entities table does not receive the enrichment columns.

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

Inputs:

- `enrichments` (`array`, required): List of enrichment types to run in parallel
- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): Table name containing business data to enrich
- `estimate_cost` (`boolean`, optional): No description. Default: `true`.
- `parameters` (`object`, optional): No description.
- `sample_size` (`number`, optional): Number of sample results to return in context. Default: `5`.

Example input: `{"enrichments":[],"session_id":"<session_id>","table_name":"<table_name>"}`

### `vibeprospectingmcp_enrich_prospects`

Enrich Prospects · Write

Add contact details and profiles to people from previous fetch-entities results. Supports enrichments for professional/personal emails and phone numbers (enrich-prospects-contacts) and full profile details including work history and education (enrich-prospects-profiles). Returns a masked preview and a new table_name (no charge). Use the new table_name for all downstream steps — the original fetch-entities table does not receive enrichment columns.

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

Inputs:

- `enrichments` (`array`, required): List of enrichment types to run in parallel
- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): Table name containing prospect data to enrich
- `estimate_cost` (`boolean`, optional): No description. Default: `true`.
- `parameters` (`object`, optional): No description.
- `sample_size` (`number`, optional): Number of sample results to return in context. Default: `5`.

Example input: `{"enrichments":[],"session_id":"<session_id>","table_name":"<table_name>"}`

### `vibeprospectingmcp_export_to_csv`

Export to CSV · Write

Export your data to CSV and get a download link. Consumes credits. Only call this tool when the user has explicitly asked to export and has seen a cost estimate. Always wait for explicit user confirmation before exporting, regardless of credit balance. Exported entities are automatically added to the user's exclude list to prevent them from appearing in future searches.

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

Inputs:

- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): Name of the specific table to export
- `dataset_name` (`string`, optional): Descriptive name for the dataset (10-80 chars, lowercase alphanumeric with underscores). If not provided, a random name will be generated. The final dataset name will be: {dataset_name}_{unique_id}.
- `exclude_key` (`string`, optional): Optional. Pass the prior export dataset_id (ds- plus UUID) on the SAME table_name to skip rows already in that dataset. Use after a credit-limited partial export or when the user asks for additional rows.
- `limit` (`integer`, optional): Maximum rows to materialize for this export (overrides workflow number_of_results). Without exclude_key: cap at limit rows from the original query. With exclude_key (prior export dataset_id): caps how many rows are fetched after excluding that dataset.
- `tool_reasoning` (`string`, optional): The ORIGINAL user query that started this workflow, in EXACT WORDS. Use the first message that led to this tool being called, NOT follow-up commands like 'export', 'yes', 'continue'. Maximum 2000 characters.

Example input: `{"session_id":"<session_id>","table_name":"<table_name>"}`

### `vibeprospectingmcp_fetch_businesses_events`

Fetch Businesses Events · Write

Retrieves business-related events (funding rounds, new offices, partnerships, hiring signals, etc.) from the Explorium API in bulk. Requires a table_name and session_id from a prior fetch-entities call. Returns a masked preview and table_name at no charge; export-to-csv delivers the full dataset. Sample preview shows only up to 3 events per company — the full export contains significantly more data. For events related to role changes, use the prospects events tool instead.

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

Inputs:

- `event_types` (`array`, required): List of event types to fetch, max 10
- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): Table name containing business data to get events for
- `estimate_cost` (`boolean`, optional): No description. Default: `true`.
- `sample_size` (`number`, optional): Number of sample results to return in context. Default: `5`.
- `timestamp_from` (`string`, optional): ISO format datetime string or date in format YYYY-MM-DD (defaults to 3 months ago). Default: `1969-10-01`.

Example input: `{"event_types":[],"session_id":"<session_id>","table_name":"<table_name>"}`

### `vibeprospectingmcp_fetch_prospects_events`

Fetch Prospects Events · Write

Retrieves prospect-related events (role changes, company changes, job anniversaries) from the Explorium API in bulk. Requires a table_name and session_id from a prior fetch-entities call. Returns a masked preview and table_name at no charge; sample preview shows only up to 3 events per prospect. Must ask the user to confirm before calling when the prior fetch used event-related filters (unless the user already asked for event details in the same message).

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

Inputs:

- `event_types` (`array`, required): List of event types to fetch, max 10
- `session_id` (`string`, required): Session ID containing the data to process
- `table_name` (`string`, required): Table name containing prospect data to get events for
- `estimate_cost` (`boolean`, optional): No description. Default: `true`.
- `sample_size` (`number`, optional): Number of sample results to return in context. Default: `5`.
- `timestamp_from` (`string`, optional): ISO format datetime string or date in format YYYY-MM-DD (defaults to 3 months ago). Default: `1969-10-01`.

Example input: `{"event_types":[],"session_id":"<session_id>","table_name":"<table_name>"}`

## 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 |
