# Contact Finder MCP Server (`automation-lab/contact-finder-mcp`) Actor

MCP server for SDR agents to find public emails, phone numbers, and social profiles from company domains using focused tool calls.

- **URL**: https://apify.com/automation-lab/contact-finder-mcp.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** AI, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Contact Finder MCP Server

Turn company domains into public contact signals from Claude, Cursor, custom SDR agents, or any MCP-compatible client.

Contact Finder MCP Server exposes three focused tools over Apify Standby + MCP: find public emails, find phone numbers, and find social profile links. It is built as a sibling actor for the MCP experiment and calls the existing Website Contact Finder actor internally instead of duplicating its crawler.

### What does Contact Finder MCP Server do?

It scans a company website and returns a compact contact result that an AI agent can use immediately.

- `find_emails(domain, max_pages?)` returns public email addresses.
- `find_phones(domain, max_pages?)` returns discovered phone numbers with normalized digits.
- `find_socials(domain, max_pages?)` returns LinkedIn, X/Twitter, Facebook, Instagram, YouTube, GitHub, and TikTok URLs when found.

### Who is it for?

- SDR agents that need a contact step inside a prospecting workflow.
- RevOps teams building lead enrichment assistants.
- Founders validating small lead lists from domains.
- Agencies that want an MCP tool rather than a bulk scraping UI.
- Developers testing Apify Standby actors as MCP servers.

### Why use this actor?

Most contact finders are batch jobs. This actor is designed around agent tool calls. Your assistant can decide which contact signal it needs, call one tool, and receive JSON that fits naturally into a chat or workflow memory.

### MCP tools

| Tool | Purpose | Main output |
| --- | --- | --- |
| `find_emails` | Find public emails from a website and likely contact pages | `emails` |
| `find_phones` | Find website phone numbers | `phones` |
| `find_socials` | Find social media profile links | `socials` |

Add it to Claude Code with:

```bash
claude mcp add apify-contact-finder \
  https://mcp.apify.com/?tools=automation-lab/contact-finder-mcp
````

Or configure an MCP client with JSON:

```json
{
  "mcpServers": {
    "apify-contact-finder": {
      "url": "https://mcp.apify.com/?tools=automation-lab/contact-finder-mcp"
    }
  }
}
```

Example prompt: "Use Contact Finder MCP to find social profiles for openai.com and summarize the best outreach channel."

### Data returned

Each tool response includes the requested contact type plus traceability fields.

| Field | Type | Description |
| --- | --- | --- |
| `tool` | string | Tool that was called |
| `domain` | string | Original domain or URL from the request |
| `normalizedDomain` | string | URL normalized before scanning |
| `emails` | array | Returned by `find_emails` |
| `phones` | array | Returned by `find_phones`; includes `value`, `normalized`, `format`, and `region` |
| `socials` | object | Returned by `find_socials` |
| `contactPageUrl` | string/null | Contact page found by the source crawler |
| `pagesCrawled` | number | Number of pages scanned by the source actor |
| `sourceActorRunId` | string | Internal Website Contact Finder run ID |
| `sourceDatasetId` | string | Internal source dataset ID |
| `crawledAt` | string | ISO timestamp for the tool call |

### How much does it cost to find contacts with MCP?

The actor uses pay-per-event pricing.

- Run/session start: `$0.005`.
- Contact tool call: `$0.005` on Bronze for each `find_emails`, `find_phones`, or `find_socials` call, with standard tier discounts.

This price was chosen for the MCP experiment because observed source Website Contact Finder runs on small domains cost roughly `$0.0001–0.0003` in Apify usage per domain, leaving room for the nested source actor run and Standby overhead while keeping agent tool calls inexpensive.

### How to use it in Standby mode

1. Open the actor on Apify.
2. Use the Standby endpoint from the actor page.
3. Send MCP Streamable HTTP JSON-RPC requests to `/mcp`.
4. Call one of the three tools with a `domain` and optional `max_pages`.

### How to use it in normal actor mode

You can also run one tool call as a regular Apify actor run.

```json
{
  "tool": "find_emails",
  "domain": "apify.com",
  "max_pages": 5
}
```

The result is pushed to the default dataset.

### Input

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `tool` | string | `find_emails` | One of `find_emails`, `find_phones`, or `find_socials` |
| `domain` | string | required | Company domain or full website URL |
| `max_pages` | integer | `8` | Maximum internal pages to scan, from 1 to 25 |

### Output example

```json
{
  "tool": "find_socials",
  "domain": "apify.com",
  "normalizedDomain": "https://apify.com",
  "maxPages": 5,
  "contactPageUrl": null,
  "pagesCrawled": 5,
  "sourceActorRunId": "abc123",
  "sourceDatasetId": "def456",
  "crawledAt": "2026-05-20T00:00:00.000Z",
  "socials": {
    "linkedin": "http://linkedin.com/company/apify/",
    "twitter": "https://x.com/apify",
    "facebook": null,
    "instagram": null,
    "youtube": null,
    "github": "https://github.com/apify",
    "tiktok": "https://www.tiktok.com/@apifytech"
  }
}
```

### MCP JSON-RPC example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "find_emails",
    "arguments": {
      "domain": "apify.com",
      "max_pages": 5
    }
  }
}
```

### MCP setup

The recommended MCP URL is:

```text
https://mcp.apify.com/?tools=automation-lab/contact-finder-mcp
```

Example prompts:

- "Find public emails for apify.com and tell me whether there is a generic sales inbox."
- "Find social profiles for openai.com and draft a short SDR research note."
- "Find phone numbers for this company domain and return normalized digits only."

### Claude Code setup

Use the Apify MCP endpoint with the actor tool filter:

```bash
claude mcp add apify-contact-finder \
  https://mcp.apify.com/?tools=automation-lab/contact-finder-mcp
```

Then ask:

> Find public emails for apify.com and summarize whether the domain has a general sales inbox.

### Claude Desktop setup

Add an MCP server that points to Apify MCP with this actor enabled:

```json
{
  "mcpServers": {
    "apify-contact-finder": {
      "url": "https://mcp.apify.com/?tools=automation-lab/contact-finder-mcp"
    }
  }
}
```

### API usage with Apify client

#### Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/contact-finder-mcp').call({
  tool: 'find_socials',
  domain: 'apify.com',
  max_pages: 5,
});
console.log(run.defaultDatasetId);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/contact-finder-mcp').call(run_input={
    'tool': 'find_phones',
    'domain': 'apify.com',
    'max_pages': 5,
})
print(run['defaultDatasetId'])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~contact-finder-mcp/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"tool":"find_emails","domain":"apify.com","max_pages":5}'
```

### Tips for better results

- Use the root domain, for example `example.com`, not a deep product URL.
- Keep `max_pages` between 5 and 10 for agent workflows.
- Increase `max_pages` only when the company hides contacts on deeper pages.
- Use `find_socials` when a website has no obvious email; LinkedIn pages are often enough for SDR routing.

### Integrations

- Enrich CRM records from a domain column.
- Add a contact lookup step to an outbound email drafting agent.
- Check whether a target account has public social profiles before personalization.
- Route leads to phone-first or email-first workflows based on returned contacts.

### Architecture notes

This actor does not fork Website Contact Finder. It keeps a separate MCP interface and calls `automation-lab/website-contact-finder` as the internal scraping engine. That keeps the experiment isolated while preserving the production crawler boundary.

### Standby and MCP mechanics

The actor enables Apify Standby mode and exposes an MCP endpoint at `/mcp`. It supports JSON-RPC `initialize`, `ping`, `tools/list`, and `tools/call`. Readiness probes return a simple ready response so Apify can keep the Standby container healthy.

### Limitations

- It finds public contact information only.
- It does not log in, bypass paywalls, or access private directories.
- It returns what the scanned website exposes within the selected page limit.
- Some companies intentionally avoid publishing emails or phone numbers.

### Legality and privacy

The actor extracts contact details publicly available on company websites. You are responsible for using the data under applicable laws such as GDPR, CAN-SPAM, and local telemarketing rules. Always respect opt-outs and avoid sending unsolicited messages where prohibited.

### FAQ

#### Is this the same as Website Contact Finder?

No. This actor is the MCP interface. It calls Website Contact Finder internally as the scraping engine but keeps separate pricing, schemas, Standby configuration, and agent-focused tools.

#### Can I use it for bulk lead lists?

For bulk lists, use Website Contact Finder directly. This actor is optimized for individual MCP tool calls inside AI workflows.

### Troubleshooting

#### The tool returns no emails

Try `find_socials` or increase `max_pages`. Many companies publish contact forms and social profiles instead of raw email addresses.

#### The tool is slow

Lower `max_pages`. Agent workflows usually work best with a small scan first, then a second deeper scan only when needed.

#### The MCP client cannot list tools

Confirm the client is calling the Apify MCP URL with `?tools=automation-lab/contact-finder-mcp` and that the actor has Standby enabled.

### Related scrapers

- [Website Contact Finder](https://apify.com/automation-lab/website-contact-finder) for bulk website contact extraction.
- [Email Finder](https://apify.com/automation-lab/email-finder) for email-focused workflows.
- [Google Maps Lead Finder](https://apify.com/automation-lab/google-maps-lead-finder) for local business prospecting.

### Changelog

- `0.1.0` — Initial MCP experiment actor with emails, phones, and socials tools.

# Actor input Schema

## `tool` (type: `string`):

Tool to run when starting the actor in standard mode.

## `domain` (type: `string`):

Company domain or full website URL to scan, for example apify.com or https://apify.com.

## `max_pages` (type: `integer`):

Maximum number of internal website pages to scan for this tool call.

## Actor input object example

```json
{
  "tool": "find_emails",
  "domain": "apify.com",
  "max_pages": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tool": "find_emails",
    "domain": "apify.com",
    "max_pages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/contact-finder-mcp").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "tool": "find_emails",
    "domain": "apify.com",
    "max_pages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/contact-finder-mcp").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tool": "find_emails",
  "domain": "apify.com",
  "max_pages": 5
}' |
apify call automation-lab/contact-finder-mcp --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/contact-finder-mcp",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Contact Finder MCP Server",
        "description": "MCP server for SDR agents to find public emails, phone numbers, and social profiles from company domains using focused tool calls.",
        "version": "0.1",
        "x-build-id": "30RDO2p9mfDxylmeL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~contact-finder-mcp/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-contact-finder-mcp",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~contact-finder-mcp/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-contact-finder-mcp",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~contact-finder-mcp/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-contact-finder-mcp",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "domain"
                ],
                "properties": {
                    "tool": {
                        "title": "MCP tool",
                        "enum": [
                            "find_emails",
                            "find_phones",
                            "find_socials"
                        ],
                        "type": "string",
                        "description": "Tool to run when starting the actor in standard mode.",
                        "default": "find_emails"
                    },
                    "domain": {
                        "title": "Domain or website URL",
                        "type": "string",
                        "description": "Company domain or full website URL to scan, for example apify.com or https://apify.com."
                    },
                    "max_pages": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 25,
                        "type": "integer",
                        "description": "Maximum number of internal website pages to scan for this tool call.",
                        "default": 8
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
