consulti-mcp
v2.4.1
Published
Consulti.ai MCP server — 10 stable tools for email verification (incl. catch-all mailbox resolution), B2B lead search/enrichment, LinkedIn-URL enrichment, Instagram profile search, list management, and credit-balance checks. Stable surface only; beta endp
Maintainers
Readme
Consulti MCP Server
MCP server for the Consulti lead intelligence API — 10 stable tools to search 500M+ B2B leads, search Instagram profiles, verify emails (including catch-all mailbox resolution), enrich leads by email or LinkedIn URL, manage saved lists, and check credit balance.
Stable surface only. Beta endpoints (name-domain lookup, local-business search, creator search) are intentionally NOT exposed via MCP — their schemas may change. To use them, call the REST API directly: https://www.consulti.ai/api-docs
Installation
npx consulti-mcpConfiguration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"consulti": {
"command": "npx",
"args": ["-y", "consulti-mcp"],
"env": {
"CONSULTI_API_KEY": "your-api-key-here"
}
}
}
}Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"consulti": {
"command": "npx",
"args": ["-y", "consulti-mcp"],
"env": {
"CONSULTI_API_KEY": "your-api-key-here"
}
}
}
}Tools
verify_email
Verify if an email address is valid and deliverable.
Cost: 1 verification credit per call.
| Input | Type | Description |
| ------- | ------ | --------------------------- |
| email | string | The email address to verify |
Example:
{ "email": "[email protected]" }verify_catchall
Resolve whether a specific mailbox on a catch-all domain actually exists — the ESP-engine probe that plain SMTP (verify_email) cannot do. Use it on addresses verify_email returns with is_catch_all: true.
Cost: 5 verification credits per call (charged on success, including cache hits; refunded on a 500). Requires a plan with catch-all verification enabled (Pro or higher).
| Input | Type | Description |
| ------- | ------ | ------------------------------------------------- |
| email | string | The email address on a catch-all domain to resolve |
Example:
{ "email": "[email protected]" }Response shape:
{
"success": true,
"data": {
"email": "[email protected]",
"status": "good",
"is_catch_all": true,
"catch_all_verification": { "score": 95, "status": "Deliverable", "provider": "consulti" },
"credits_used": 5,
"cached": false
}
}enrich_lead
Enrich a lead's full profile using their email address.
Cost: 1 lead credit — only deducted on a successful match; 404 responses are free.
| Input | Type | Description |
| ------- | ------ | --------------------------------------- |
| email | string | The email address of the lead to enrich |
Example:
{ "email": "[email protected]" }enrich_linkedin
Enrich a person by their LinkedIn profile URL → a verified work email plus their US mobile phone (free add-on). Cache-first: served instantly when we already hold a verified email for that profile, otherwise enriched live and cached.
Cost: 1 lead credit — charged only when an email is returned; phone-only or no-match responses are free.
| Input | Type | Description |
| -------------- | ------ | ------------------------------------------------------ |
| linkedin_url | string | The LinkedIn profile URL, e.g. https://linkedin.com/in/johndoe |
Example:
{ "linkedin_url": "https://linkedin.com/in/johndoe" }search_b2b_leads
Search a database of 500M+ B2B leads with filters like job title, industry, location, and company size. All inputs are optional. Results are always restricted to leads carrying our verified email label — there is no option to include unverified leads.
Cost: 1 lead credit per result returned. Credits are reserved up to size then refunded down to the actual row count; 0 results = 0 credits. Call get_credits first before using large size values.
| Input | Type | Description |
| ---------------- | -------- | ------------------------------------------------------------------ |
| q | string | Free text search across name, title, company, and industry |
| titles | string[] | Job titles to filter by (e.g. ["CEO", "VP Marketing"]) |
| industries | string[] | Industries to filter by (e.g. ["Technology", "Finance"]) |
| technologies | string[] | Website tech, exact Wappalyzer-style names (e.g. ["Shopify"]); OR-matched. Canonical list: GET /api/v1/meta/technologies |
| excludeTechnologies | string[] | Website tech to EXCLUDE (same names). A lead is dropped if its company uses ANY listed tech; leads with no technology data are kept |
| countries | string[] | Countries to filter by (e.g. ["United States"]) |
| states | string[] | States/regions to filter by (e.g. ["California"]) |
| cities | string[] | Cities to filter by (e.g. ["San Francisco"]) |
| company | string | Company name to search for |
| empMin | number | Minimum employee count |
| empMax | number | Maximum employee count |
| excludeListId | string | UUID of a saved list owned by the API key holder — leads in this list will be excluded from results. Canonical singular field name; exclude_list_id and other variants return HTTP 400. |
| page | number | Page number (default: 1) |
| size | number | Results per page (default: 25, max: 100) |
Strict validation: unknown fields in the request body return HTTP 400 with the offending field name. Send only the inputs documented above.
Response shape: the response includes both
total(size of the addressable set beforeexcludeListIdis applied) andtotal_after_exclusion(size after). WhenexcludeListIdis omitted, both values are equal. Clients can sanity-check exclusion by assertingtotal_after_exclusion < totalwhenever a non-empty list is supplied.
Example:
{
"titles": ["CEO", "CTO"],
"industries": ["Technology"],
"countries": ["United States"],
"empMin": 50,
"empMax": 500,
"excludeListId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"size": 25
}get_lists
Get all saved lead lists for the authenticated user, with member counts. No inputs required.
Example:
{}create_list
Create a new saved lead list.
| Input | Type | Description |
| ------------- | ------ | ---------------------------------- |
| name | string | Required. Name of the list |
| description | string | Optional description of the list |
Example:
{ "name": "Tech CEOs", "description": "CEOs at tech companies with 50-500 employees" }add_leads_to_list
Add leads to a saved list by email addresses (B2B leads) or business IDs (local leads).
| Input | Type | Description |
| ------------- | -------- | -------------------------------------- |
| listId | string | Required. UUID of the target list |
| emails | string[] | Email addresses of B2B leads to add |
| businessIds | number[] | Business IDs of local leads to add |
Example:
{
"listId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"emails": ["[email protected]", "[email protected]"]
}get_credits
Check the authenticated user's current lead and verification credit balance. Free — no credits deducted. Use before bulk operations to avoid running out mid-task. No inputs required.
Example:
{}Response shape:
{
"success": true,
"data": {
"lead_credits": 1500,
"verification_credits": 5000
}
}Get your API key
Sign up at www.consulti.ai and generate an API key under Settings → Integrations → API Keys.
Environment variables
| Variable | Required | Default | Description |
| ------------------ | -------- | ----------------------------------- | --------------------------------------------------------------------------------- |
| CONSULTI_API_KEY | Yes | — | Your Consulti API key (starts with capi_). |
| MCP_BASE_URL | No | https://www.consulti.ai/api/v1 | Override the API base URL. Only set this for staging / local dev — never in prod. |
The server enforces a 30-second timeout on every API request; timed-out calls return a structured {"error": "Request timed out after 30s"} so MCP clients can parse and retry.
Versioning
Print the installed version:
npx -y consulti-mcp --version
# → 2.3.0Releases are published to npm via GitHub Actions trusted publishing on tags matching mcp-v* — each release carries an npm provenance attestation.
