# Generect (npm · generect-ultimate-mcp)

B2B lead and company data for AI agents: free search, pay only for emails, phones, profiles.

- Trust score: 66/100 (medium)
- Change this week: +33
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- remote · `mcp.generect.com`: 37/100, [markdown](https://verifymcp.io/servers/com-generect-generect-mcp/mcp.md), [page](https://verifymcp.io/servers/com-generect-generect-mcp/mcp)
- npm · `generect-ultimate-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/com-generect-generect-mcp/generect-ultimate-mcp.md), [page](https://verifymcp.io/servers/com-generect-generect-mcp/generect-ultimate-mcp)

## Channel facts

- Registry: `npm`
- Package: `generect-ultimate-mcp`
- Version: `0.12.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 29 of 92 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 19/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 1 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 73/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 10079 tokens (~387/item across 26 items; 17 tools + 9 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 17 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).
  - Supports UI / widget rendering.

## Install

### How do I install the Generect MCP server?

Generect runs locally as an npm package, launched with npx -y generect-ultimate-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add com-generect-generect-mcp -- npx -y generect-ultimate-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "com-generect-generect-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "generect-ultimate-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-generect-generect-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "generect-ultimate-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add com-generect-generect-mcp -- npx -y generect-ultimate-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-generect-generect-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "generect-ultimate-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-generect-generect-mcp --command npx --arg -y --arg generect-ultimate-mcp
```

### Hermes

```yaml
mcp_servers:
  com-generect-generect-mcp:
    command: "npx"
    args: ["-y", "generect-ultimate-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "com-generect-generect-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "generect-ultimate-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-generect-generect-mcp -t stdio -c npx -a -y generect-ultimate-mcp
```

### Other

```json
{
  "mcpServers": {
    "com-generect-generect-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "generect-ultimate-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-17 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-16 (score 65, +1)

- [security regression] Tool safety: pass → unverified
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional improvement] Stability: unverified → 0.07
- [functional] Package version: 0.12.1 → 0.12.2

### 2026-10-14 (score 64, +31)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Capabilities: pass
- [functional] First check of Tool coverage: 100
- [functional] First check of Tool coverage: 100

### 2026-10-13 (score 33, 0)

- [functional regression] Security disclosure: unverified → fail

### 2026-10-11 (score 33)

First indexed and scored.

## MCP tools (17)

### `count_leads` (~1335 tokens)

Count matching leads (free)

How many leads match an ICP, and what pulling them would cost. FREE — this call never spends credits. ALWAYS CALL THIS BEFORE search_leads: it is the only way to learn the size of an audience without paying per row, and it returns a cost estimate for the next step at this account's real rates. A realtime count is NOT free ($0.02 flat) — this tool refuses to run one unless you pass mode:"realtime" on purpose.

Input parameters:

- `allow_unlisted_values` (boolean): Escape hatch. This server checks industry / seniority / headcount / company-type values against the LinkedIn vocabularies before sending, because the API silently returns 0 results for an unknown ind…
- `changed_jobs` (boolean): Only leads who recently changed jobs — realtime only: using it forces the pricier live mode.
- `company_filters` (object): Optional: count leads only at companies matching these company filters (a two-level ICP). Still free in database mode.
- `company_headcounts` (array): Employer size buckets. Allowed ONLY: "1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10 000+" (note the space in "10 000+").
- `company_id` (string|number): Anchor to one company by LinkedIn numeric id.
- `company_industries` (array): Industry of the current employer. Must match Generect industry names exactly (e.g. "Software Development", "Financial Services"); names are hierarchical and unknown names are rejected with HTTP 400 n…
- `company_link` (string): Anchor to one company by LinkedIn URL.
- `company_locations` (array): HQ location of the lead's current employer.
- `company_name` (string): Anchor to one company by name (exclusive with company_link/company_id).
- `company_types` (array): Employer types: "Public Company","Privately Held","Non Profit","Government Agency","Educational","Self Employed","Self Owned","Partnership".
- `exclude_company_headcounts` (array): Employer size buckets to exclude.
- `exclude_company_industries` (array): Employer industries to exclude.
- `exclude_company_locations` (array): Employer HQ locations to exclude.
- `exclude_ids` (array): Skip leads by Generect/Sales-Navigator id. Pass the ids you already received to paginate without duplicates — ordering is not stable, so this is more reliable than offset.
- `exclude_locations` (array): Lead locations to exclude.
- `exclude_names` (array): Skip leads by full name. Works in both modes (the database-mode bug that returned 0 rows was fixed in the API on 2026-08-13, PRO-1333). exclude_ids is still the more reliable way to paginate.
- `exclude_title_keywords`: DEPRECATED — accepted but ignored. No v1 equivalent. Narrow job_titles instead, or filter the returned rows yourself.
- `filter_empty_vars` (array): Drop leads where these fields are empty, e.g. ["profile_photo","job_started_on"]. Useful to raise data quality before paying.
- `functions` (array): Job functions, e.g. ["Sales","Marketing","Engineering"] — realtime only: using it forces the pricier live mode.
- `get_max_leads`: DEPRECATED — accepted but ignored. Always on now: search responses include results_count without asking.
- `job_title` (string): DEPRECATED alias for job_titles. Still honoured: it is merged into job_titles.
- `job_titles` (array): Target job titles, OR-matched (e.g. ["CEO","Founder","Owner"]). A lead needs to match only one.
- `keywords` (array): Free-text keywords across headline/summary/skills — realtime only: using it forces the pricier live mode.
- `lead_industries`: DEPRECATED — accepted but ignored. Removed: v1 filters on the employer's industry. Use company_industries.
- `linkedin_filter_link` (string): A LinkedIn / Sales Navigator search URL to lift filters from — realtime only: using it forces the pricier live mode.
- `locations` (array): Where the lead lives — matches cities, states and countries, e.g. ["United States","Berlin"].
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `past_company_names` (array): Companies the lead previously worked at (alumni targeting) — realtime only: using it forces the pricier live mode.
- `personas` (array): Advanced raw persona tuples [name, functions, seniorities, prohibits, priority?] — realtime only: using it forces the pricier live mode.
- `posted_on_linkedin` (boolean): Only leads who recently posted on LinkedIn — realtime only: using it forces the pricier live mode.
- `seniorities` (array): Seniority at the current employer, e.g. ["Owner","CXO","VP","Director","Manager"]. Current position only.
- `strict` (array): Fields to match strictly, e.g. ["company_locations"].
- `timeout_ms` (number): Request timeout in milliseconds.
- `without_company`: DEPRECATED — accepted but ignored. No longer needed — v1 filter-only search is the default when no company anchor is set.
- `years_in_company` (array): Time at current company, same buckets as years_in_position — realtime only: using it forces the pricier live mode.
- `years_in_position` (array): Time in current role: 1=<1y, 2=1-2y, 3=3-5y, 4=6-10y, 5=10y+ — realtime only: using it forces the pricier live mode.

Output parameters:

- `advice` (string)
- `blocked_by_vocabulary` (array)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `fix` (string)
- `mode` (string)
- `needs_realtime` (array)
- `next_step_estimate`
- `options` (array)
- `results_count` (number|null)
- `status` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)
- `why` (string)

### `count_companies` (~780 tokens)

Count matching companies (free)

How many companies match an ICP, and what pulling them would cost. FREE — this call never spends credits. Call this before search_companies. As with count_leads, a realtime count costs $0.02 and is never run implicitly.

Input parameters:

- `allow_unlisted_values` (boolean): Escape hatch for the local vocabulary check — see the lead-side field of the same name.
- `company_names` (array): Restrict to specific company names — realtime only: using it forces the pricier live mode.
- `company_types` (array): Company types: "Public Company","Privately Held","Non Profit","Government Agency","Educational", …
- `department_headcount` (object): Department size, e.g. {"name":"engineering","min":10,"max":100} — realtime only: using it forces the pricier live mode.
- `exclude_domains` (array): Exclude companies by domain (e.g. existing customers).
- `exclude_ids` (array): Exclude companies by LinkedIn id/URN.
- `exclude_industries` (array): Industries to exclude.
- `exclude_locations` (array): HQ locations to exclude.
- `fallback_from_leads`: DEPRECATED — accepted but ignored. Removed. It fabricated lead-derived name aggregates and cost an extra billable query.
- `get_max_companies`: DEPRECATED — accepted but ignored. Always on now: search responses include results_count without asking.
- `headcount_growth` (object): Headcount growth in percent — realtime only: using it forces the pricier live mode.
- `headcounts` (array): Size buckets. Allowed ONLY: "1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10 000+".
- `hiring_on_linkedin` (boolean): Only companies actively hiring — realtime only: using it forces the pricier live mode.
- `industries` (array): Company industries. Must match Generect industry names exactly (e.g. "Software Development"); unknown names are rejected with HTTP 400.
- `keywords` (array): Free-text keywords across name/description/specialties — realtime only: using it forces the pricier live mode.
- `linkedins_links` (array): Specific LinkedIn company URLs — realtime only: using it forces the pricier live mode.
- `locations` (array): HQ locations — cities, states or countries.
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `num_of_followers` (array): LinkedIn follower buckets: "1-50","51-100","101-1000","1001-5000","5001+" — realtime only: using it forces the pricier live mode.
- `revenues_range` (object): Annual revenue range, single object {min,max} — realtime only: using it forces the pricier live mode.
- `sub_industries` (boolean): Expand each selected industry to its sub-industries as well (broadens the match).
- `technologies` (array): Technologies the company uses — realtime only: using it forces the pricier live mode.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `advice` (string)
- `blocked_by_vocabulary` (array)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `fix` (string)
- `mode` (string)
- `needs_realtime` (array)
- `next_step_estimate`
- `options` (array)
- `results_count` (number|null)
- `status` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)
- `why` (string)

### `get_balance` (~282 tokens)

Balance, usage and your prices (free)

Account balance, month-to-date usage and THIS account's real per-operation prices. FREE — this call never spends credits. balance_usd is the wallet; grants_usd is bonus and plan credit (sign-up bonus, perks, plan allowance), reported apart. Grants are spent first, but only on the operations each one covers: a promo perk or a plan allowance may not pay for API calls, and a perk never pays for phone numbers. Report both figures; do not add them up as what the user can spend. Call it before a batch of paid work (so you can tell the user what they can afford) and after (so you can report exactly what was spent). The prices it returns beat any number in a tool description — those are list prices.

Input parameters:

- `include_prices` (boolean): Include this account's per-operation prices. Default true.
- `include_token_analytics` (boolean): Also return per-API-token request counts for the last 30 days (by endpoint and status). Free. Useful for answering "which integration is making these calls?".
- `include_transactions` (number): Also return the N most recent transactions (each shows the operation type and dollar amount).
- `include_usage` (boolean): Also return the month-to-date credit usage broken down by operation type. Free.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `balance_usd` (number|null)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `email` (string|null)
- `grants_usd` (number|null)
- `preview_tier` (boolean|null)
- `prices_source` (string)
- `recent_transactions`
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `token_analytics`
- `usage`
- `used_this_month_usd` (number|null)
- `vocabulary_warnings` (array)
- `your_prices_usd`

### `health` (~101 tokens)

Server and credential health (free)

Liveness check. FREE — this call never spends credits. Confirms the MCP server is up, reports its version, and (unless you disable it) verifies the credential against a free account endpoint. It never touches a paid data endpoint, so it is safe to call from a monitor.

Input parameters:

- `check_credential` (boolean): Also verify the API token against the free /accounts/me endpoint. Default true.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `account` (string|null)
- `api_base` (string)
- `balance_usd` (number|null)
- `cost` (object)
- `credential_error`
- `credential_valid` (boolean)
- `deprecated_params_ignored` (object)
- `has_credential` (boolean)
- `ms` (number)
- `ok` (boolean)
- `server` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `version` (string)
- `vocabulary_warnings` (array)

### `preview_leads` (~1453 tokens)

Preview leads (cheapest paid look)

Cheap look at the actual people behind a count, before committing to a full search. BILLABLE — about $0.002 per returned row (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Preview rows carry a Generect `id`, so the intended flow is: preview many → pick the few that fit → enrich_lead / generate_email only on those. Per the API contract preview rows are masked (no LinkedIn URL, domain, email or phone); if your account returns more than that, treat it as a bonus and not something to rely on.

Input parameters:

- `allow_unlisted_values` (boolean): Escape hatch. This server checks industry / seniority / headcount / company-type values against the LinkedIn vocabularies before sending, because the API silently returns 0 results for an unknown ind…
- `changed_jobs` (boolean): Only leads who recently changed jobs — realtime only: using it forces the pricier live mode.
- `compact` (boolean): Default true: return a small per-lead summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically need…
- `company_filters` (object): Optional company-level filters for a two-level ICP.
- `company_headcounts` (array): Employer size buckets. Allowed ONLY: "1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10 000+" (note the space in "10 000+").
- `company_id` (string|number): Anchor to one company by LinkedIn numeric id.
- `company_industries` (array): Industry of the current employer. Must match Generect industry names exactly (e.g. "Software Development", "Financial Services"); names are hierarchical and unknown names are rejected with HTTP 400 n…
- `company_link` (string): Anchor to one company by LinkedIn URL.
- `company_locations` (array): HQ location of the lead's current employer.
- `company_name` (string): Anchor to one company by name (exclusive with company_link/company_id).
- `company_types` (array): Employer types: "Public Company","Privately Held","Non Profit","Government Agency","Educational","Self Employed","Self Owned","Partnership".
- `confirm_spend_usd` (number): Explicit approval for an unusually large charge. Calls whose worst case exceeds $5 are refused unless this is set to at least the amount the tool reports. Only set it after the user has agreed to tha…
- `count_only` (boolean): Return just how many leads the preview index holds for these filters and spend nothing. Free. This is a second opinion on count_leads: preview and cached search are different indexes and can disagree.
- `exclude_company_headcounts` (array): Employer size buckets to exclude.
- `exclude_company_industries` (array): Employer industries to exclude.
- `exclude_company_locations` (array): Employer HQ locations to exclude.
- `exclude_ids` (array): Skip leads by Generect/Sales-Navigator id. Pass the ids you already received to paginate without duplicates — ordering is not stable, so this is more reliable than offset.
- `exclude_locations` (array): Lead locations to exclude.
- `exclude_names` (array): Skip leads by full name. Works in both modes (the database-mode bug that returned 0 rows was fixed in the API on 2026-08-13, PRO-1333). exclude_ids is still the more reliable way to paginate.
- `exclude_title_keywords`: DEPRECATED — accepted but ignored. No v1 equivalent. Narrow job_titles instead, or filter the returned rows yourself.
- `filter_empty_vars` (array): Drop leads where these fields are empty, e.g. ["profile_photo","job_started_on"]. Useful to raise data quality before paying.
- `functions` (array): Job functions, e.g. ["Sales","Marketing","Engineering"] — realtime only: using it forces the pricier live mode.
- `get_max_leads`: DEPRECATED — accepted but ignored. Always on now: search responses include results_count without asking.
- `job_title` (string): DEPRECATED alias for job_titles. Still honoured: it is merged into job_titles.
- `job_titles` (array): Target job titles, OR-matched (e.g. ["CEO","Founder","Owner"]). A lead needs to match only one.
- `keywords` (array): Free-text keywords across headline/summary/skills — realtime only: using it forces the pricier live mode.
- `lead_industries`: DEPRECATED — accepted but ignored. Removed: v1 filters on the employer's industry. Use company_industries.
- `limit` (number): Alias for limit_by.
- `limit_by` (number): Rows to return this call (1–100, default 25). You are billed per returned row, so this number IS the price of the call.
- `linkedin_filter_link` (string): A LinkedIn / Sales Navigator search URL to lift filters from — realtime only: using it forces the pricier live mode.
- `locations` (array): Where the lead lives — matches cities, states and countries, e.g. ["United States","Berlin"].
- `offset_by` (number): Rows to skip (pagination).
- `past_company_names` (array): Companies the lead previously worked at (alumni targeting) — realtime only: using it forces the pricier live mode.
- `personas` (array): Advanced raw persona tuples [name, functions, seniorities, prohibits, priority?] — realtime only: using it forces the pricier live mode.
- `posted_on_linkedin` (boolean): Only leads who recently posted on LinkedIn — realtime only: using it forces the pricier live mode.
- `seniorities` (array): Seniority at the current employer, e.g. ["Owner","CXO","VP","Director","Manager"]. Current position only.
- `strict` (array): Fields to match strictly, e.g. ["company_locations"].
- `timeout_ms` (number): Request timeout in milliseconds.
- `without_company`: DEPRECATED — accepted but ignored. No longer needed — v1 filter-only search is the default when no company anchor is set.
- `years_in_company` (array): Time at current company, same buckets as years_in_position — realtime only: using it forces the pricier live mode.
- `years_in_position` (array): Time in current role: 1=<1y, 2=1-2y, 3=3-5y, 4=6-10y, 5=10y+ — realtime only: using it forces the pricier live mode.

Output parameters:

- `api_returned_more_than_requested` (number)
- `blocked_by_vocabulary` (array)
- `companies` (array)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `escalated_to_realtime_because` (array)
- `escalation_note` (string)
- `fix` (string)
- `leads` (array)
- `mode` (string)
- `next_page_args`
- `note` (string)
- `requested_rows` (number)
- `results_count` (number|null)
- `returned` (number)
- `spend_guard`
- `status` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `search_leads` (~1786 tokens)

Search leads (free thin rows, full rows billed)

Return leads (people) matching an ICP. FREE by default while the account has free thin rows left today (daily quota; see detail — pass detail "thin" to guarantee $0). detail "full" is billable, about $0.0067 per returned row (0 rows costs $0) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Realtime, or an auto escalation to it, is billed per row too. Run count_leads first — it is free and sizes the audience. Rows never include email or phone: call generate_email (it takes the lead id) or find_phone only on the ids you keep. Ordering is not stable, so paginate by passing ids you already have in exclude_ids rather than by offset.

Input parameters:

- `allow_unlisted_values` (boolean): Escape hatch. This server checks industry / seniority / headcount / company-type values against the LinkedIn vocabularies before sending, because the API silently returns 0 results for an unknown ind…
- `changed_jobs` (boolean): Only leads who recently changed jobs — realtime only: using it forces the pricier live mode.
- `compact` (boolean): Default true: return a small per-lead summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically need…
- `company_filters` (object): Optional: only return leads at companies matching these filters (two-level ICP).
- `company_headcounts` (array): Employer size buckets. Allowed ONLY: "1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10 000+" (note the space in "10 000+").
- `company_id` (string|number): Anchor to one company by LinkedIn numeric id.
- `company_industries` (array): Industry of the current employer. Must match Generect industry names exactly (e.g. "Software Development", "Financial Services"); names are hierarchical and unknown names are rejected with HTTP 400 n…
- `company_link` (string): Anchor to one company by LinkedIn URL.
- `company_locations` (array): HQ location of the lead's current employer.
- `company_name` (string): Anchor to one company by name (exclusive with company_link/company_id).
- `company_types` (array): Employer types: "Public Company","Privately Held","Non Profit","Government Agency","Educational","Self Employed","Self Owned","Partnership".
- `confirm_spend_usd` (number): Explicit approval for an unusually large charge. Calls whose worst case exceeds $5 are refused unless this is set to at least the amount the tool reports. Only set it after the user has agreed to tha…
- `detail` (string): Row detail for the database search. Thin rows are FREE — id, name, job_title, seniority, location, company name/id/industry/country; no LinkedIn URL, domain, contacts or history — up to a daily per-a…
- `exclude_company_headcounts` (array): Employer size buckets to exclude.
- `exclude_company_industries` (array): Employer industries to exclude.
- `exclude_company_locations` (array): Employer HQ locations to exclude.
- `exclude_ids` (array): Skip leads by Generect/Sales-Navigator id. Pass the ids you already received to paginate without duplicates — ordering is not stable, so this is more reliable than offset.
- `exclude_locations` (array): Lead locations to exclude.
- `exclude_names` (array): Skip leads by full name. Works in both modes (the database-mode bug that returned 0 rows was fixed in the API on 2026-08-13, PRO-1333). exclude_ids is still the more reliable way to paginate.
- `exclude_title_keywords`: DEPRECATED — accepted but ignored. No v1 equivalent. Narrow job_titles instead, or filter the returned rows yourself.
- `filter_empty_vars` (array): Drop leads where these fields are empty, e.g. ["profile_photo","job_started_on"]. Useful to raise data quality before paying.
- `functions` (array): Job functions, e.g. ["Sales","Marketing","Engineering"] — realtime only: using it forces the pricier live mode.
- `get_max_leads`: DEPRECATED — accepted but ignored. Always on now: search responses include results_count without asking.
- `job_title` (string): DEPRECATED alias for job_titles. Still honoured: it is merged into job_titles.
- `job_titles` (array): Target job titles, OR-matched (e.g. ["CEO","Founder","Owner"]). A lead needs to match only one.
- `keywords` (array): Free-text keywords across headline/summary/skills — realtime only: using it forces the pricier live mode.
- `lead_industries`: DEPRECATED — accepted but ignored. Removed: v1 filters on the employer's industry. Use company_industries.
- `limit` (number): Alias for limit_by.
- `limit_by` (number): Rows to return this call (1–100, default 25). You are billed per returned row, so this number IS the price of the call.
- `linkedin_filter_link` (string): A LinkedIn / Sales Navigator search URL to lift filters from — realtime only: using it forces the pricier live mode.
- `locations` (array): Where the lead lives — matches cities, states and countries, e.g. ["United States","Berlin"].
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `offset` (number): Alias for offset_by.
- `offset_by` (number): Rows to skip (pagination).
- `past_company_names` (array): Companies the lead previously worked at (alumni targeting) — realtime only: using it forces the pricier live mode.
- `personas` (array): Advanced raw persona tuples [name, functions, seniorities, prohibits, priority?] — realtime only: using it forces the pricier live mode.
- `posted_on_linkedin` (boolean): Only leads who recently posted on LinkedIn — realtime only: using it forces the pricier live mode.
- `seniorities` (array): Seniority at the current employer, e.g. ["Owner","CXO","VP","Director","Manager"]. Current position only.
- `strict` (array): Fields to match strictly, e.g. ["company_locations"].
- `timeout_ms` (number): Request timeout in milliseconds.
- `without_company`: DEPRECATED — accepted but ignored. No longer needed — v1 filter-only search is the default when no company anchor is set.
- `years_in_company` (array): Time at current company, same buckets as years_in_position — realtime only: using it forces the pricier live mode.
- `years_in_position` (array): Time in current role: 1=<1y, 2=1-2y, 3=3-5y, 4=6-10y, 5=10y+ — realtime only: using it forces the pricier live mode.

Output parameters:

- `api_returned_more_than_requested` (number)
- `blocked_by_vocabulary` (array)
- `companies` (array)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `escalated_to_realtime_because` (array)
- `escalation_note` (string)
- `fix` (string)
- `leads` (array)
- `mode` (string)
- `next_page_args`
- `note` (string)
- `requested_rows` (number)
- `results_count` (number|null)
- `returned` (number)
- `spend_guard`
- `status` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `search_companies` (~1263 tokens)

Search companies (free thin rows, full rows billed)

Return companies matching an ICP. FREE by default while the account has free thin rows left today (daily quota; see detail — pass detail "thin" to guarantee $0); thin rows carry no domain — use enrich_company on the ones you keep. detail "full" is billable, about $0.0067 per returned row (0 rows costs $0) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Realtime is billed per row too. Run count_companies first. Note that headcount_range is a snapshot taken when the record was indexed and can lag the company's current size; the filter itself is applied at query time.

Input parameters:

- `allow_unlisted_values` (boolean): Escape hatch for the local vocabulary check — see the lead-side field of the same name.
- `compact` (boolean): Default true: return a small per-company summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically ne…
- `company_names` (array): Restrict to specific company names — realtime only: using it forces the pricier live mode.
- `company_types` (array): Company types: "Public Company","Privately Held","Non Profit","Government Agency","Educational", …
- `confirm_spend_usd` (number): Explicit approval for an unusually large charge. Calls whose worst case exceeds $5 are refused unless this is set to at least the amount the tool reports. Only set it after the user has agreed to tha…
- `department_headcount` (object): Department size, e.g. {"name":"engineering","min":10,"max":100} — realtime only: using it forces the pricier live mode.
- `detail` (string): Row detail for the database search. Thin rows are FREE — id, name, industry, headcount_range, HQ country/city, company_type, founded_year; no LinkedIn URL, domain, contacts or history — up to a daily…
- `exclude_domains` (array): Exclude companies by domain (e.g. existing customers).
- `exclude_ids` (array): Exclude companies by LinkedIn id/URN.
- `exclude_industries` (array): Industries to exclude.
- `exclude_locations` (array): HQ locations to exclude.
- `fallback_from_leads`: DEPRECATED — accepted but ignored. Removed. It fabricated lead-derived name aggregates and cost an extra billable query.
- `get_max_companies`: DEPRECATED — accepted but ignored. Always on now: search responses include results_count without asking.
- `headcount_growth` (object): Headcount growth in percent — realtime only: using it forces the pricier live mode.
- `headcounts` (array): Size buckets. Allowed ONLY: "1-10","11-50","51-200","201-500","501-1000","1001-5000","5001-10000","10 000+".
- `hiring_on_linkedin` (boolean): Only companies actively hiring — realtime only: using it forces the pricier live mode.
- `industries` (array): Company industries. Must match Generect industry names exactly (e.g. "Software Development"); unknown names are rejected with HTTP 400.
- `keywords` (array): Free-text keywords across name/description/specialties — realtime only: using it forces the pricier live mode.
- `limit` (number): Alias for limit_by.
- `limit_by` (number): Rows to return this call (1–100, default 25). You are billed per returned row, so this number IS the price of the call.
- `linkedins_links` (array): Specific LinkedIn company URLs — realtime only: using it forces the pricier live mode.
- `locations` (array): HQ locations — cities, states or countries.
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `num_of_followers` (array): LinkedIn follower buckets: "1-50","51-100","101-1000","1001-5000","5001+" — realtime only: using it forces the pricier live mode.
- `offset` (number): Alias for offset_by.
- `offset_by` (number): Rows to skip (pagination).
- `revenues_range` (object): Annual revenue range, single object {min,max} — realtime only: using it forces the pricier live mode.
- `sub_industries` (boolean): Expand each selected industry to its sub-industries as well (broadens the match).
- `technologies` (array): Technologies the company uses — realtime only: using it forces the pricier live mode.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `api_returned_more_than_requested` (number)
- `blocked_by_vocabulary` (array)
- `companies` (array)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `escalated_to_realtime_because` (array)
- `escalation_note` (string)
- `fix` (string)
- `leads` (array)
- `mode` (string)
- `next_page_args`
- `note` (string)
- `requested_rows` (number)
- `results_count` (number|null)
- `returned` (number)
- `spend_guard`
- `status` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `resolve_profile` (~448 tokens)

Resolve an anonymous LinkedIn link

Reveal who is behind an anonymous LinkedIn profile link. BILLABLE — about $0.0005 per RESOLVED profile (an unresolvable reference is free) — duplicates in one batch are billed per row, so deduplicate first (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Takes the obfuscated links that Sales Navigator leaves in exports, CRMs and ad platforms — `linkedin.com/in/ACwAA…` — plus Sales Navigator lead URLs, bare profile ids and urns, and returns the real profile URL and identity. Pass `profiles` (up to 50) to do a batch in one call. The `id` it returns is the same identifier enrich_lead, generate_email and find_phone accept, so this is the cheap first step before spending on a full record. Returns identity only — no location, company or work history; use enrich_lead for those. The numeric member id is NOT accepted as input (LinkedIn answers 403 to it); it comes back as `linkedin_id`.

Input parameters:

- `compact` (boolean): Default true: return a small per-profile summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically ne…
- `id` (string): Alias for `url` — same accepted values. Use whichever reads better.
- `profiles` (array): Batch mode: 1–50 references, mixed freely. One row per input, in input order, each either a resolved profile or {input, error}. Duplicates are billed per row — deduplicate first.
- `timeout_ms` (number): Request timeout in milliseconds.
- `url` (string): A single LinkedIn person reference: profile URL of any flavour (including /in/ACwAA… and /sales/lead/…), a public identifier, an obfuscated id (ACwAA… or ACoAA…) or an urn. Matched case-insensitively.

Output parameters:

- `cost` (object)
- `deprecated_params_ignored` (object)
- `profiles` (array)
- `resolved`
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `enrich_lead` (~375 tokens)

Enrich one lead

Full profile for ONE known person, by Generect id, LinkedIn URL, or work email (reverse lookup). BILLABLE — about $0.0067 per record found (not-found is refunded) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Not found costs nothing. Prefer the `id` from a search/preview result — it is the most accurate identifier. For many people at once use start_bulk_job.

Input parameters:

- `compact` (boolean): Default true: return a small per-lead summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically need…
- `email` (string): Work email, for reverse lookup.
- `id` (string): Generect lead id from search/preview.
- `linkedin_url` (string): LinkedIn profile URL.
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `company`
- `cost` (object)
- `deprecated_params_ignored` (object)
- `found` (boolean)
- `lead`
- `mode` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `enrich_company` (~367 tokens)

Enrich one company

Full profile for ONE known company, by Generect id, LinkedIn URL, domain, or name. BILLABLE — about $0.0067 per record found (not-found is refunded) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Not found costs nothing. Domain is the most reliable identifier after id; name matching is fuzzy.

Input parameters:

- `compact` (boolean): Default true: return a small per-company summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically ne…
- `domain` (string): Company domain without protocol, e.g. "stripe.com".
- `id` (string): Generect company id.
- `linkedin_url` (string): LinkedIn company page URL.
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `name` (string): Company name (fuzzy match).
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `company`
- `cost` (object)
- `deprecated_params_ignored` (object)
- `found` (boolean)
- `lead`
- `mode` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `get_lead_by_url` (~449 tokens)

Enrich a lead by LinkedIn URL (alias)

Alias of enrich_lead for a LinkedIn profile URL, kept for backwards compatibility. BILLABLE — about $0.0067 per record found (not-found is refunded) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Prefer enrich_lead — it also accepts a Generect id (cheaper to get right) or an email for reverse lookup.

Input parameters:

- `comments`: DEPRECATED — accepted but ignored. Removed: v1 enrich returns the full profile without per-section toggles.
- `compact` (boolean): Default true: return a small per-lead summary (including the Generect `id`, which every later step accepts). Set false for the full raw record (~80 fields) — only worth it when you specifically need…
- `inexact_company`: DEPRECATED — accepted but ignored. Removed: v1 enrich matches on the identifier you pass.
- `mode` (string): Data mode. "database" = Generect's own index: sub-second, free counts, free thin rows (see detail) or cheaper full rows; it accepts a subset of the filters today and names any it rejects. "realtime"…
- `people_also_viewed`: DEPRECATED — accepted but ignored. Removed: v1 enrich returns the full profile without per-section toggles.
- `posts`: DEPRECATED — accepted but ignored. Removed: v1 enrich returns the full profile without per-section toggles.
- `timeout_ms` (number): Request timeout in milliseconds.
- `url` (string, required): LinkedIn profile URL (e.g. https://www.linkedin.com/in/username/).

Output parameters:

- `company`
- `cost` (object)
- `deprecated_params_ignored` (object)
- `found` (boolean)
- `lead`
- `mode` (string)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `generate_email` (~269 tokens)

Find a verified work email

Find and verify a work email. BILLABLE — about $0.02 per VALID email found (a miss is free) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). Identify the person by lead_id (best), LinkedIn URL, or first+last+domain. `candidates` resolves several people in one call; more than 10 is routed to an async bulk job instead, which returns a job_id for get_bulk_job.

Input parameters:

- `candidates` (array): Batch mode. Each entry uses the same identifier rules as the single-person form.
- `domain` (string): Company domain without protocol, e.g. "stripe.com" (name+domain mode).
- `first_name` (string): First name (name+domain mode).
- `last_name` (string): Last name (name+domain mode).
- `lead_id` (string): Generect lead id from search / preview / enrich results — the cheapest and most accurate identifier.
- `linkedin_url` (string): LinkedIn profile URL.
- `middle_name` (string): Middle name (optional, improves pattern matching).
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `cost` (object)
- `deprecated_params_ignored` (object)
- `dropped` (number)
- `job`
- `mode` (string)
- `next_step` (string)
- `requested` (number)
- `results` (array)
- `submitted` (number)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `validate_email` (~140 tokens)

Validate email deliverability

Check deliverability of emails you already have. BILLABLE — about $0.005 per email submitted — every address is billed, whatever the verdict (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). This is the one operation where EVERY submitted address is billed — the verdict is the deliverable. Never validate an address that generate_email just returned as valid; it is already verified.

Input parameters:

- `emails` (array, required): Email addresses to validate. Each one is billed.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `cost` (object)
- `deprecated_params_ignored` (object)
- `results`
- `submitted` (number)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `find_phone` (~246 tokens)

Find a phone number (most expensive)

Find a phone number for one person. BILLABLE — about $0.4 per phone found (a miss is free) (Tier 0 list price; your account may pay a different rate — call get_balance for your real prices, and read cost.amount_charged in every response for what was actually spent). THE MOST EXPENSIVE OPERATION HERE — roughly 20x an email lookup. Do not call it speculatively or across a list; confirm with the user first, and only for people they have already qualified. Use start_bulk_job for an approved list.

Input parameters:

- `company` (string): Company name or domain (name+company mode).
- `domain` (string): Company domain without protocol, e.g. "stripe.com" (name+domain mode).
- `first_name` (string): First name (name+domain mode).
- `last_name` (string): Last name (name+domain mode).
- `lead_id` (string): Generect lead id from search / preview / enrich results — the cheapest and most accurate identifier.
- `linkedin_url` (string): LinkedIn profile URL.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `cost` (object)
- `deprecated_params_ignored` (object)
- `result`
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `start_bulk_job` (~276 tokens)

Submit a bulk job

Submit up to 50 records for asynchronous processing and get a job_id back. BILLABLE at the same per-record rate as the single-record tool — and the whole cost is RESERVED at submit time, so a submitted job keeps running (and keeps charging) even if you stop polling. Only submit a list the user has approved. Poll with get_bulk_job, or register a webhook to be told when it finishes.

Input parameters:

- `confirm_spend_usd` (number): Explicit approval for an unusually large charge. Calls whose worst case exceeds $5 are refused unless this is set to at least the amount the tool reports. Only set it after the user has agreed to tha…
- `items` (array, required): Max 50. email_find/phone_find: {lead_id} | {linkedin_url} | {first_name,last_name,domain|company}. enrich_leads: {id} | {linkedin_url} | {email}. enrich_companies: {id} | {linkedin_url} | {domain} |…
- `job_type` (string, required): What to do with the items. phone_find is by far the most expensive per record.
- `mode` (string): Enrich jobs only: cached (cheaper) or live. Default "database".
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `cost` (object)
- `deprecated_params_ignored` (object)
- `dropped` (number)
- `job`
- `job_type` (string)
- `mode` (string)
- `next_step` (string)
- `reservation_note` (string)
- `reserved_worst_case_usd` (number)
- `submitted` (number)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `get_bulk_job` (~91 tokens)

Poll a bulk job (free)

Status and results of a bulk job. FREE — this call never spends credits. Polling is free — the work was already billed at submit time. Poll every few seconds, not in a tight loop.

Input parameters:

- `job_id` (string, required): job_id returned by start_bulk_job.
- `job_type` (string, required): Same job_type used at submit.
- `timeout_ms` (number): Request timeout in milliseconds.

Output parameters:

- `cost` (object)
- `deprecated_params_ignored` (object)
- `job`
- `job_id` (string)
- `job_type` (string)
- `results`
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)

### `manage_webhooks` (~142 tokens)

Manage webhook endpoints

List, create, update, delete or test webhook endpoints for bulk-job completion. FREE — this call never spends credits. Use this instead of long polling in scheduled/unattended workflows: register once, then let the completion event wake your job up.

Input parameters:

- `action` (string, required): What to do.
- `events` (array): Events to subscribe to (create/update).
- `id` (string): Webhook id (required for update, delete, test).
- `secret` (string): Shared secret for HMAC signature verification.
- `timeout_ms` (number): Request timeout in milliseconds.
- `url` (string): HTTPS endpoint that receives events (create/update).

Output parameters:

- `action` (string)
- `cost` (object)
- `deprecated_params_ignored` (object)
- `test_mode` (boolean)
- `test_mode_notice` (string)
- `vocabulary_warnings` (array)
- `webhooks`

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/com-generect-generect-mcp/generect-ultimate-mcp#diagnostics

## Score history

- 2026-10-18: 66
- 2026-10-17: 66
- 2026-10-16: 65
- 2026-10-15: 64
- 2026-10-14: 64
- 2026-10-13: 33
- 2026-10-12: 33
- 2026-10-11: 33

## Common questions

### What is the Generect MCP server?

Generect is an MCP server listed in the public MCP registry as com.generect/generect-mcp. B2B lead and company data for AI agents: free search, pay only for emails, phones, profiles. This page covers its npm package (generect-ultimate-mcp).

### Is the Generect MCP server safe to use?

Generect scores 66 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 18 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Generect MCP server expose?

Generect exposes 17 tools: count_leads, count_companies, get_balance, health, preview_leads, and 12 more. Their descriptions and schemas cost roughly 9,803 tokens of context every time the server is loaded.

### Is the Generect MCP server still maintained?

Generect is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Generect MCP server under?

Generect declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/generect-ultimate-mcp
- Socket report: https://socket.dev/npm/package/generect-ultimate-mcp
- Website: https://generect.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-generect-generect-mcp/generect-ultimate-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-generect-generect-mcp/generect-ultimate-mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-generect-generect-mcp/generect-ultimate-mcp
