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

The Lusha MCP connector routes your AI agent's tool calls to Lusha's own MCP server through Scalekit. Each user connects their own Lusha API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 37 tools.

**Authentication:** API Key
**Categories:** CRM & Sales, Marketing, AI
**Tools:** 37: 10 read, 24 write, 3 destructive
**Users sign in with:** API key
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=LUSHAMCP)

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

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

   **Console steps with screenshots:**

   Register your Lusha API key with Scalekit so it stores it securely and injects it into every request. Lusha uses API key authentication.

   1. ### Get your Lusha API key

      - Sign in to [Lusha](https://app.lusha.com) and go to **API & connectors** → **Manage API Keys**.
      - Click **+ Create new Key** to generate a new key, or copy the key value from an existing entry.

      > Image: Lusha API Hub showing the Manage API Keys tab with an existing key and a Create new Key button

      > caution: Keep your key private
      >
      > Lusha API keys are tied to your account and consume credits. Store the key in a secrets manager and never hard-code it in your source code. Set a credit limit per key to prevent unexpected usage.

   2. ### Create a connection in Scalekit

      - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. Find **Lusha MCP** and click **Create**.
      - Note the **Connection name** — you will use this as `connection_name` in your code (e.g., `lushamcp`).
      - Click **Save**.

   3. ### Add a connected account

      Connected accounts link a specific user identifier in your system to their Lusha API key. Add one in the dashboard to test. In production, each user adds their own through the authorization link: they enter their credentials on the page it opens.

      **In the dashboard, to test**

      - Open the connection you created and click the **Connected Accounts** tab → **Add account**.
      - Fill in:
        - **Your User's ID** — a unique identifier for this user in your system (e.g., `user_123`)
        - **API Key** — the Lusha API key from step 1
      - Click **Create Account**.

      **From your backend, if your app already has the credentials**

      For example, when users enter them on a settings page in your app:

        **Node.js**

        ```typescript
        import { Scalekit, ConnectorStatus } from '@scalekit-sdk/node';

        const scalekit = new Scalekit(
          process.env.SCALEKIT_ENVIRONMENT_URL,
          process.env.SCALEKIT_CLIENT_ID,
          process.env.SCALEKIT_CLIENT_SECRET,
        );

        // Never hard-code credentials — read from secure storage or user input
        const lushaApiKey = getUserLushaApiKey(); // retrieve from your secure store

        const authorizationDetails = {
          details: {
            case: 'staticAuth',
            value: {
              details: {
                api_key: lushaApiKey,
              },
            },
          },
        };

        let { connectedAccount } = await scalekit.actions.upsertConnectedAccount({
          connectionName: 'lushamcp',
          identifier: 'user_123',
          authorizationDetails,
        });

        // Make sure the account is ACTIVE before the first tool call.
        if (connectedAccount?.status !== ConnectorStatus.ACTIVE) {
          ({ connectedAccount } = await scalekit.actions.upsertConnectedAccount({
            connectionName: 'lushamcp',
            identifier: 'user_123',
            authorizationDetails,
          }));
        }
        ```

        **Python**

        ```python
        import os
        from scalekit import ScalekitClient

        scalekit_client = ScalekitClient(
            env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"],
            client_id=os.environ["SCALEKIT_CLIENT_ID"],
            client_secret=os.environ["SCALEKIT_CLIENT_SECRET"],
        )

        # Never hard-code credentials — read from secure storage or user input
        lusha_api_key = get_user_lusha_api_key()  # retrieve from your secure store

        authorization_details = {"static_auth": {"api_key": lusha_api_key}}

        response = scalekit_client.actions.upsert_connected_account(
            connection_name="lushamcp",
            identifier="user_123",
            authorization_details=authorization_details,
        )

        # Make sure the account is ACTIVE before the first tool call.
        if response.connected_account.status != "ACTIVE":
            response = scalekit_client.actions.upsert_connected_account(
                connection_name="lushamcp",
                identifier="user_123",
                authorization_details=authorization_details,
            )
        ```

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 = 'lushamcp'
   const identifier = 'user_123'

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

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

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="lushamcp_account_usage",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Lusha MCP server credentials there. If your app already has a user's credentials, add the account from your backend instead, as the console steps above show. 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: 'lushamcp_account_usage',
  toolInput: {},
  connector: 'lushamcp',
  identifier: 'user_123',
})
```

**Python**

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

### `lushamcp_account_usage`

Account Usage · Read-only

Retrieve account credit balance, rate-limit status, plan info, and per-action credit pricing.

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: `{}`

### `lushamcp_recommendations_companies_filters`

Recommendations Companies Filters · Read-only

Return the target ICPs and signal types accepted by recommendations_companys filters. OAuth-only; API key sessions receive a 403.

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: `{}`

### `lushamcp_recommendations_contacts_filters`

Recommendations Contacts Filters · Read-only

Return the target ICPs and signal types accepted by recommendations_contacts filters. OAuth-only; API key sessions receive a 403.

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: `{}`

### `lushamcp_signals_company_filters`

Signals Company Filters · Read-only

Discover available company signal types and filter values for signals searches.

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.
- `filterType` (`string`, optional): Optional. Omit to discover signal types and the directory of available filter types. Set to fetch values for a single filter (e.g., 'newsEventTypes', 'hiringByDepartments', 'hiringByLocations'). One of: `newsEventTypes`, `hiringByDepartments`, `hiringByLocations`.
- `query` (`string`, optional): Search text. Required when filterType is 'hiringByLocations' (locations are not enumerable). Not supported for other filterTypes or when filterType is omitted.
- `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: `{}`

### `lushamcp_signals_contact_filters`

Signals Contact Filters · Read-only

Return available contact signal types accepted by contacts signals tools.

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: `{}`

### `lushamcp_table_get_entities`

Table Get Entities · Read-only

Read a page of a Workspace table's rows, including populated column values.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `page` (`integer`, optional): Page number (0-based, max 100).
- `page_size` (`integer`, optional): Items per page (1-100, default 100).
- `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: `{"entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_table_list`

Table List · Read-only

List the caller's Workspace contacts or companies tables with pagination and name/status filters.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `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.
- `email` (`string`, optional): Filter to tables owned by this email. REQUIRED when authenticating with an API key (there is no signed-in user to default to); with OAuth the caller is identified by the token, so it is optional and defaults to the caller.
- `name` (`string`, optional): Filter by name (substring match).
- `page` (`integer`, optional): Page number (0-based, max 100).
- `page_size` (`integer`, optional): Items per page (1-100, default 100).
- `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.
- `status` (`string`, optional): Filter tables by lifecycle status. One of: `active`, `archived`, `deleted`.

Example input: `{"entity_type":"contacts"}`

### `lushamcp_table_list_columns`

Table List Columns · Read-only

List a Workspace table's columns with per-status row counts.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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: `{"entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_table_status`

Table Status · Read-only

Return one Workspace table's entity count and per-column run aggregates (processing/success/failed rows).

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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: `{"entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_website_visits_search`

Website Visits Search · Read-only

Rank companies that visited the account's tracked websites by visit engagement.

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.
- `domains` (`array`, optional): Tracked domains configured in the dashboard. Omit to use all configured tracked sites for the account.
- `endDate` (`string`, optional): Window end (YYYY-MM-DD). Optional; defaults to today (UTC). The resolved range cannot exceed 3 months.
- `filters` (`object`, optional): Optional behavioral filters applied to the ranking.
- `pagination` (`object`, optional): Pagination. Defaults to page 0, size 25.
- `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.
- `sort` (`object`, optional): Optional sort field and direction.
- `startDate` (`string`, optional): Window start (YYYY-MM-DD). Optional; defaults to 30 days before endDate.

Example input: `{}`

### `lushamcp_buying_group_search`

Buying Group Search · Write

Rank buying committee members for given companies, optionally filtered by persona.

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

Inputs:

- `companies` (`array`, required): Companies to find buying group members for (1-25). Each entry must include exactly one of 'domain' or 'id', plus an optional clientReferenceId echoed back per result.
- `contactsLimit` (`integer`, optional): Maximum number of buying group contacts to return per company (1-100). Defaults to 100. Billing is per contact returned, so keep this as low as the task allows. Default: `100`.
- `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.
- `pagination` (`object`, optional): Optional pagination over the ranked buying group members (0-based `page`, `size` 10-100). Omit to receive the provider default page.
- `personas` (`array`, optional): Persona filter — return only contacts whose primary role matches one of the supplied values. Omit to return all personas. Allowed values: 'decision_maker', 'potential_champion', 'end_user'.
- `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: `{"companies":[]}`

### `lushamcp_companies_search`

Companies Search · Write

Look up known companies in the Lusha database by name, domain, or FQDN, supporting batches of up to 25.

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

Inputs:

- `companies` (`array`, required): No description.
- `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.
- `enrich` (`boolean`, optional): Auto-enrich the results. When true (default) the response includes firmographics, technologies and intent in one call and consumes reveal credits. When false only the search preview is returned (no premium fields, no reveal credits); follow up with prospecting_company_enrich on the returned ids when reveals are needed.
- `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: `{"companies":[]}`

### `lushamcp_contacts_search`

Contacts Search · Write

Look up a known business contact in Lusha by name, company, LinkedIn URL, or email.

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

Inputs:

- `company_name` (`string`, optional): Company name the contact works at. Required when looking up by name (first_name + last_name + company_name).
- `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.
- `email` (`string`, optional): Contact's email address. Standalone lookup path.
- `enrich` (`boolean`, optional): Auto-enrich the result. When true (default) the response includes emails and phones in one call and consumes reveal credits. When false only the search preview is returned (no emails/phones, no reveal credits); follow up with prospecting_contact_enrich on the returned id when reveals are needed.
- `first_name` (`string`, optional): Contact's first name. Use with last_name + company_name as one of the supported lookup paths.
- `last_name` (`string`, optional): Contact's last name. Use with first_name + company_name as one of the supported lookup paths.
- `linkedin_url` (`string`, optional): Contact's LinkedIn profile URL. Standalone lookup path.
- `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: `{}`

### `lushamcp_conversations_search`

Conversations Search · Write

Find the account's recorded sales calls by keyword, date, participant, domain, or title.

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

Inputs:

- `companyDomains` (`array`, optional): Domains of the external participants, such as acme.com (up to 10 values, ORed). This matches on domain rather than display name; companies_search resolves a company name to its domain.
- `contactNames` (`array`, optional): Partial, case-insensitive match on participant names (up to 10 values, ORed).
- `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.
- `conversationIds` (`array`, optional): Restricts results to these conversation ids (1-25). Unknown ids are omitted from the response rather than erroring.
- `dateFrom` (`string`, optional): Earliest meeting date, inclusive, as YYYY-MM-DD.
- `dateTo` (`string`, optional): Latest meeting date, inclusive, as YYYY-MM-DD.
- `detail` (`string`, optional): Response depth. 'compact' (default) returns the summary and flags whether coaching and chapters exist; 'full' includes them and limits pageSize to 5. One of: `compact`, `full`.
- `meetingTitles` (`array`, optional): Partial, case-insensitive match on the meeting title (up to 10 values, ORed).
- `page` (`integer`, optional): 1-based page index. Defaults to 1.
- `pageSize` (`integer`, optional): Conversations per page (1-25, default 10). Capped at 25 so a page costs a single credit and fits the 25k-token response budget.
- `query` (`string`, optional): Free-text search over what was said on the call, ranked by relevance. It overrides the structural filters, so one search uses either this or them.
- `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: `{}`

### `lushamcp_conversations_transcript_get`

Conversations Transcript Get · Write

Return the speaker-attributed transcript of one recorded call, in windows.

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

Inputs:

- `conversationId` (`string`, required): Id of the recorded call, as returned in conversations[].id by conversations_search. This is the call identifier and is unrelated to the chat-session conversation_id field.
- `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.
- `segmentLimit` (`integer`, optional): Segments per window (1-200, default 100). A window is shortened further when its text would exceed the 25k-token response budget.
- `segmentOffset` (`integer`, optional): 0-based index of the first transcript segment in the window. Defaults to 0.

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

### `lushamcp_lookalike_companies`

Lookalike Companies · Write

Discover companies similar to a set of seed companies, returning paginated lookalike candidates.

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

Inputs:

- `seeds` (`object`, required): Seed companies to find lookalikes for. Total unique identifiers across both arrays must be 5-100.
- `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.
- `dedupeSessionId` (`string`, optional): Opaque pagination/dedupe token (UUID). Omit on first call to start a new run; the response includes a dedupeSessionId to pass back on subsequent calls for the same seeds. Sessions expire after 30 days of inactivity.
- `exclude` (`object`, optional): Optional companies to exclude from results (e.g., existing customers). Total identifiers max 500. Distinct from dedupeSessionId, which excludes companies already returned by prior pagination calls.
- `limit` (`integer`, optional): Number of results per call (1-100). Defaults to 25 when omitted.
- `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: `{"seeds":{}}`

### `lushamcp_lookalike_contacts`

Lookalike Contacts · Write

Discover contacts similar to a set of seed contacts, returning paginated lookalike candidates.

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

Inputs:

- `seeds` (`object`, required): Seed contacts to find lookalikes for. Total unique identifiers across all arrays must be 5-100.
- `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.
- `dedupeSessionId` (`string`, optional): Opaque pagination/dedupe token (UUID). Omit on first call to start a new run; the response includes a dedupeSessionId to pass back on subsequent calls for the same seeds. Sessions expire after 30 days of inactivity.
- `exclude` (`object`, optional): Optional contacts to exclude from results (e.g., existing customers). Total identifiers max 500. Distinct from dedupeSessionId, which excludes contacts already returned by prior pagination calls.
- `limit` (`integer`, optional): Number of results per call (1-50). Defaults to 25 when omitted.
- `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: `{"seeds":{}}`

### `lushamcp_prospecting_company_enrich`

Prospecting Company Enrich · Write

Reveal full firmographic details for one or more Lusha company IDs.

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

Inputs:

- `ids` (`array`, required): Lusha company IDs to enrich (from prospecting_company_search or companies_search results). Each id is a numeric string. Capped at 25 per request — split larger batches to fit the 25k-token response budget.
- `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.
- `reveal` (`array`, optional): Company premium fields to reveal. Source of truth: the prior search response's `canReveal[].field` (typically a subset of 'employeesByDepartment', 'employeesByLocation', 'employeesBySeniority', 'competitors', 'intent'); per-field credit cost for this account is in `canReveal[].credits`. When omitted, V3 returns only the free 'intent' field — chargeable firmographics require an explicit list of fields. Values not present in the prior response's `canReveal` are rejected by V3 — `canReveal` reflects this account's entitlements and per-company data availability.

Example input: `{"ids":[]}`

### `lushamcp_prospecting_company_search_by_text`

Prospecting Company Search By Text · Write

Find companys by describing the target audience in plain language; Lusha converts the text into structured prospecting filters server-side.

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

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.
- `pagination_token` (`string`, optional): Opaque token returned by a prior call to this tool. Pass it back verbatim to fetch the NEXT page of that same search. Do not construct, edit, or guess it; only ever echo one this tool returned. When a response has no pagination_token, there are no more results.
- `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.
- `text` (`string`, optional): Lusha prospecting: a natural-language description of the target audience (e.g., 'CMOs from Apple and Google in California'). Lusha's server converts this text into structured prospecting filters and runs the search. 2-1024 characters. Provide this for a NEW search; omit it when paging with pagination_token.

Example input: `{}`

### `lushamcp_prospecting_contact_enrich`

Prospecting Contact Enrich · Write

Reveal emails and phone numbers for one or more Lusha contact IDs.

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

Inputs:

- `ids` (`array`, required): Lusha contact IDs to enrich (from prospecting_contact_search or contacts_search results). Each id is a numeric string. Capped at 50 per request — split larger batches to fit the 25k-token response budget.
- `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.
- `reveal` (`array`, optional): Contact premium fields to reveal. Source of truth: the prior search response's `canReveal[].field` (typically 'emails', 'phones'); per-field credit cost for this account is in `canReveal[].credits`. When omitted, V3 returns every field listed in each contact's `canReveal`. Values not present in the prior response's `canReveal` are rejected by V3 — `canReveal` reflects this account's entitlements and per-contact data availability.

Example input: `{"ids":[]}`

### `lushamcp_prospecting_contact_search_by_text`

Prospecting Contact Search By Text · Write

Find contacts by describing the target audience in plain language; Lusha converts the text into structured prospecting filters server-side.

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

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.
- `pagination_token` (`string`, optional): Opaque token returned by a prior call to this tool. Pass it back verbatim to fetch the NEXT page of that same search. Do not construct, edit, or guess it; only ever echo one this tool returned. When a response has no pagination_token, there are no more results.
- `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.
- `text` (`string`, optional): Lusha prospecting: a natural-language description of the target audience (e.g., 'CMOs from Apple and Google in California'). Lusha's server converts this text into structured prospecting filters and runs the search. 2-1024 characters. Provide this for a NEW search; omit it when paging with pagination_token.

Example input: `{}`

### `lushamcp_recommendations_companies`

Recommendations Companies · Write

Return recommended companys ranked by lead, signal, and ICP-fit scores. OAuth-only; API key sessions receive a 403.

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

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.
- `filters` (`object`, optional): No description.
- `pagination` (`object`, optional): 0-based page index (0-1000) and page size (10-100); defaults to page 0 / size 25.
- `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.
- `sort` (`array`, optional): Ordering for the recommendations, up to 4 entries; all entries share a single direction (mixed asc/desc returns a 400).

Example input: `{}`

### `lushamcp_recommendations_contacts`

Recommendations Contacts · Write

Return recommended contacts ranked by lead, signal, and ICP-fit scores. OAuth-only; API key sessions receive a 403.

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

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.
- `filters` (`object`, optional): No description.
- `pagination` (`object`, optional): 0-based page index (0-1000) and page size (10-100); defaults to page 0 / size 25.
- `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.
- `sort` (`array`, optional): Ordering for the recommendations, up to 4 entries; all entries share a single direction (mixed asc/desc returns a 400).

Example input: `{}`

### `lushamcp_signal_score_companies`

Signal Score Companies · Write

Score known companies (batch of 1-50) by their currently active buying signals.

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

Inputs:

- `companies` (`array`, required): Companies to score (1-50). Each entry has exactly one identifier (id, domain, name, or email) plus an optional clientReferenceId.
- `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: `{"companies":[]}`

### `lushamcp_signal_score_contacts`

Signal Score Contacts · Write

Score known contacts (batch of 1-50) by their currently active buying signals.

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

Inputs:

- `contacts` (`array`, required): Contacts to score (1-50). Each entry uses one lookup path (id | linkedinUrl | email | firstName + lastName + (companyName | companyDomain)) plus an optional clientReferenceId.
- `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: `{"contacts":[]}`

### `lushamcp_signals_companies_get`

Signals Companies Get · Write

Return recent activity signals (hiring, headcount, IT spend, news) for known Lusha company IDs.

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

Inputs:

- `companyIds` (`array`, required): Lusha company IDs (1-25 per request). Capped at 25 to fit the 25k-token response budget once signal events are merged; split larger lists into multiple calls.
- `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.
- `filters` (`object`, optional): Optional filters narrowing news/hiring company signal results. Pair with 'riskNews', 'commercialActivityNews', etc. (newsEventTypes) and 'surgeInHiringByDepartment' / 'surgeInHiringByLocation' (hiringByDepartments / hiringByLocations).
- `maxResultsPerSignal` (`integer`, optional): Maximum number of signal instances per signal type per company (1-100). Defaults to 10 when omitted.
- `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.
- `signals` (`array`, optional): Deprecated: use 'signalTypes'. Kept for backward compatibility; will be removed in a future release.
- `signalTypes` (`array`, optional): Company signal type identifiers (e.g., 'surgeInHiring', 'headcountIncrease3m', 'riskNews'); 'allSignals' selects every supported type. Source of truth: signals_company_filters - resolve valid values from there before calling. Invalid values return a 400 from the Lusha API.
- `startDate` (`string`, optional): Start date for signal retrieval (YYYY-MM-DD). Must be a valid calendar date and not in the future. Defaults to last 6 months when omitted.

Example input: `{"companyIds":[]}`

### `lushamcp_signals_companies_search`

Signals Companies Search · Write

Resolve companies by domain or name and return their recent activity signals.

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

Inputs:

- `companies` (`array`, required): Companies to identify and enrich with signals (1-25 per request). Capped at 25 to fit the 25k-token response budget once signal events are merged.
- `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.
- `filters` (`object`, optional): Optional filters narrowing news/hiring company signal results. Pair with 'riskNews', 'commercialActivityNews', etc. (newsEventTypes) and 'surgeInHiringByDepartment' / 'surgeInHiringByLocation' (hiringByDepartments / hiringByLocations).
- `maxResultsPerSignal` (`integer`, optional): Maximum number of signal instances per signal type per company (1-100). Defaults to 10 when omitted.
- `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.
- `signals` (`array`, optional): Deprecated: use 'signalTypes'. Kept for backward compatibility; will be removed in a future release.
- `signalTypes` (`array`, optional): Company signal type identifiers (e.g., 'surgeInHiring', 'headcountIncrease3m', 'riskNews'); 'allSignals' selects every supported type. Source of truth: signals_company_filters - resolve valid values from there before calling. Invalid values return a 400 from the Lusha API.
- `startDate` (`string`, optional): Start date for signal retrieval (YYYY-MM-DD). Must be a valid calendar date and not in the future. Defaults to last 6 months when omitted.

Example input: `{"companies":[]}`

### `lushamcp_signals_contacts_get`

Signals Contacts Get · Write

Return recent activity signals (promotions, company changes) for known Lusha contact IDs.

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

Inputs:

- `contactIds` (`array`, required): Lusha contact IDs (1-25 per request). Capped at 25 to fit the 25k-token response budget once signal events are merged; split larger lists into multiple calls.
- `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.
- `maxResultsPerSignal` (`integer`, optional): Maximum number of signal instances per signal type per contact (1-100). Defaults to 10 when omitted.
- `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.
- `signals` (`array`, optional): Deprecated: use 'signalTypes'. Kept for backward compatibility; will be removed in a future release.
- `signalTypes` (`array`, optional): Contact signal type identifiers (e.g., 'allSignals', 'promotion', 'companyChange'). Source of truth: signals_contact_filters - resolve valid values from there before calling. Invalid values return a 400 from the Lusha API.
- `startDate` (`string`, optional): Start date for signal retrieval (YYYY-MM-DD). Must be a valid calendar date and not in the future. Defaults to last 6 months when omitted.

Example input: `{"contactIds":[]}`

### `lushamcp_signals_contacts_search`

Signals Contacts Search · Write

Resolve contacts by LinkedIn URL, email, or name and return their recent activity signals.

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

Inputs:

- `contacts` (`array`, required): Contacts to identify and enrich with signals (1-25 per request). Capped at 25 to fit the 25k-token response budget once signal events are merged.
- `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.
- `maxResultsPerSignal` (`integer`, optional): Maximum number of signal instances per signal type per contact (1-100). Defaults to 10 when omitted.
- `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.
- `signals` (`array`, optional): Deprecated: use 'signalTypes'. Kept for backward compatibility; will be removed in a future release.
- `signalTypes` (`array`, optional): Contact signal type identifiers (e.g., 'allSignals', 'promotion', 'companyChange'). Source of truth: signals_contact_filters - resolve valid values from there before calling. Invalid values return a 400 from the Lusha API.
- `startDate` (`string`, optional): Start date for signal retrieval (YYYY-MM-DD). Must be a valid calendar date and not in the future. Defaults to last 6 months when omitted.

Example input: `{"contacts":[]}`

### `lushamcp_table_add_column`

Table Add Column · Write

Add a column (Lusha datapoint, CRM, signal, AI, or score) to a Workspace table, optionally running it immediately.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `name` (`string`, required): Display name of the column (1-255 chars).
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `type` (`string`, required): Column category: 'lusha' (a Lusha datapoint via `key`), 'crm', 'signal', 'ai' (prompt in `meta`), or 'score'. One of: `lusha`, `crm`, `signal`, `ai`, `score`.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `entity_ids` (`array`, optional): Entity ids to run when run_scope='specific'.
- `key` (`string`, optional): Data key/datapoint for a 'lusha' column (e.g. 'jobTitle', 'emailAddress').
- `meta` (`object`, optional): Extra column configuration (AI prompt, signal id, score config, etc.).
- `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.
- `run_scope` (`string`, optional): Run the column immediately after creation (defaults to 'none'). One of: `all`, `missing`, `specific`, `none`.

Example input: `{"entity_type":"contacts","name":"<name>","table_id":"<table_id>","type":"lusha"}`

### `lushamcp_table_add_entities`

Table Add Entities · Write

Add known Lusha entity ids (contacts or companies) to a Workspace table; duplicates are deduped.

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

Inputs:

- `entity_ids` (`array`, required): Lusha entity ids to add (deduped automatically). Up to 500 per call.
- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `company_ids` (`array`, optional): Contacts tables only: lushaCompanyId per contact, index-aligned with entity_ids, so the workspace can enrich the contact (person + company pair). Ignored for companies tables.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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: `{"entity_ids":[],"entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_table_create`

Table Create · Write

Create an empty Workspace table (contacts or companies) to collect and enrich saved records.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `name` (`string`, required): Table name (1-255 chars).
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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.
- `visibility` (`string`, optional): Table visibility: 'private' (default) or 'shared' with the account. One of: `private`, `shared`.

Example input: `{"entity_type":"contacts","name":"<name>"}`

### `lushamcp_table_run_column`

Table Run Column · Write

Run (populate) a Workspace table column across all, missing-only, or specific rows.

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

Inputs:

- `column_id` (`string`, required): Column id to run (from table_list_columns).
- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `run_scope` (`string`, required): Which rows to run: 'all', 'missing', or 'specific' (requires entity_ids). One of: `all`, `missing`, `specific`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `entity_ids` (`array`, optional): Entity ids to run when run_scope='specific'.
- `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: `{"column_id":"<column_id>","entity_type":"contacts","run_scope":"all","table_id":"<table_id>"}`

### `lushamcp_table_update`

Table Update · Write

Rename a Workspace table, change its visibility, or archive/unarchive it.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `archived` (`boolean`, optional): Archive (true) or unarchive (false) the table.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `name` (`string`, optional): New table name (1-255 chars).
- `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.
- `visibility` (`string`, optional): Table visibility: 'private' (default) or 'shared' with the account. One of: `private`, `shared`.

Example input: `{"entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_table_delete`

Table Delete · Destructive

Permanently delete a Workspace table and its rows/columns.

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

Inputs:

- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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: `{"entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_table_remove_column`

Table Remove Column · Destructive

Remove a non-default column from a Workspace table.

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

Inputs:

- `column_id` (`string`, required): Column id to remove (from table_list_columns).
- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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: `{"column_id":"<column_id>","entity_type":"contacts","table_id":"<table_id>"}`

### `lushamcp_table_remove_entities`

Table Remove Entities · Destructive

Remove rows (by Lusha entity id) from a Workspace table.

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

Inputs:

- `entity_ids` (`array`, required): Lusha entity ids to remove. Up to 500 per call.
- `entity_type` (`string`, required): Which Lusha entity the table holds: 'contacts' or 'companies'. Routes the call to /v3/contacts/* or /v3/companies/*; a table only ever holds one entity type. One of: `contacts`, `companies`.
- `table_id` (`string`, required): Target Workspace table id (UUID). Resolve it from table_list or a create response.
- `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.
- `email` (`string`, optional): Owner email: the user in the account that owns the table (the API resolves it to a userId). Needed only when the credential has no associated user, such as an API key that does not resolve to a specific user. With OAuth, or an API key already scoped to a user, the caller's own userId identifies the owner and email can be omitted; it may still be passed to act on behalf of another owner.
- `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: `{"entity_ids":[],"entity_type":"contacts","table_id":"<table_id>"}`

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