mcp-company-contact-details-extractor
An MCP server that finds a company's contact page from a domain and returns its role emails, phone number, and postal address as one flat Clay-ready row, powered by an Apify actor.
Find a company's contact page from a bare domain (e.g.
stripe.com)Extract classified ROLE email addresses only (general, support, sales, privacy) — never named individuals
Optionally extract a main phone number in E.164 and a postal address
Report found vs. rejected email counts and rejection reasons, plus coverage
Control output with
emailTypes,includePhones,includeAddress,allowFreeMailboxes,crawlDepth,skipCache, andcompany_nameReturn 27 flat snake_case fields per company, with no nested objects
Read-only; requires an
APIFY_TOKENand consumes Apify credits per call
Company Contact Details Extractor MCP Server
An MCP server that finds a company contact page and extracts role emails, a phone number and a postal address. It wraps the Mamba Labs Company Contact Details Extractor actor on Apify and returns a Clay-ready flat JSON row to any MCP client.
What's Inside
Related MCP server: mcp-github-organization-signal-scanner
What it does
Give it a company domain and it finds that company's contact page, then returns the role email addresses published on it, a main phone number in E.164 where the country resolves, and a postal address. One flat row per company.
Named individuals are never returned. An address is kept only when its domain belongs to the company and its local part is in the role vocabulary, so info@, support@, sales@ and privacy@ survive and a person's address is dropped by an allow list rather than by a name detector. The row reports how many addresses were found and how many were rejected and why, so a thin result is never mistaken for a site that publishes nothing.
All of the extraction runs on Apify. This package is a thin client that calls the actor and hands back the result unchanged.
Quick start
You need Node.js 18 or newer and an Apify account with an API token.
Add this to your Claude Desktop config:
{
"mcpServers": {
"mamba-company-contact-details-extractor": {
"command": "npx",
"args": ["-y", "@mambalabsdev/mcp-company-contact-details-extractor"],
"env": {
"APIFY_TOKEN": "your-apify-token"
}
}
}
}Get your token at https://console.apify.com/account/integrations, paste it in, and restart Claude Desktop. The extract_company_contact_details tool will be available.
Prerequisites
Node.js 18 or newer
An Apify account with an API token
Example prompts
"Find the contact details for stripe.com."
"Get the sales email for figma.com and skip the phone number."
"Pull contact details for this local plumbing company and allow free mailboxes."
"Extract the support address for notion.com, reading a second page if the contact page has nothing."
Inputs
company_domain(required by this tool): bare company domain, for examplestripe.com. This is the lookup key and the join key for every other actor in the fleet. The tool returns an error naming the field when it is missing, before any run starts.company_name(optional): used in the row and in logging. This tool gates addresses on the email domain rather than on the company name, so supplying a name does not change which addresses are kept.emailTypes(optional): which classes of role address to return. One ofall,general,support,sales,privacy,general_supportorsales_only.allis the default and returns general, support, sales and privacy. The narrower settings return only what they name and leave the other columns null, which is a different answer from not finding one.includePhones(optional): when true (the default) the contact page is scanned for a main phone number. Set false to skip phone extraction entirely.includeAddress(optional): when true (the default) a postal address is read from JSON-LD first and from the footer second. Set false to skip it.allowFreeMailboxes(optional): when false (the default) an address at Gmail, Outlook or another free provider is rejected, because it cannot be checked against the company domain. Set true for small business and local company lists, where a free mailbox on the contact page is often the real contact point.crawlDepth(optional): how many pages to read after the homepage.1(the default) reads the contact page.2also reads a support or legal page when the contact page yielded nothing. This is a cost and thoroughness dial, not a change of answer.skipCache(optional): when false (the default) a successful lookup is cached for seven days and reused. Set true to force a fresh fetch.max_charge_usd(optional): a cost cap in USD for this run. The actor stops before an item that could take its charges past this amount. Omit it to rely on the maximum cost per run set in Apify.
How a call runs
The tool starts the actor run and polls it to a finished status, so a long run is not cut off at 300 seconds. The run is allowed 1,800 seconds. If it is still going two minutes after that, the call stops waiting and returns the run ID with a link to it in the Apify Console, where the results land when it finishes. A run that does not succeed comes back as an error with its run ID and status.
Output
The tool returns the actor's flat JSON row for the company, with 27 snake_case fields and no nested objects. emails_rejected_count and emails_rejected_reasons account for what was dropped, contact_page_method says how the contact page was found, and fetch_status says whether the read succeeded. See the Apify Store page for the full output schema.
Example output
{
"degraded": false,
"degradation_reason": null,
"company_domain": "stripe.com",
"company_name": "Stripe",
"contact_page_url": "https://stripe.com/contact/sales",
"contact_page_method": "footer_anchor",
"contact_page_confidence": 0.85,
"email_general": null,
"email_support": null,
"email_sales": "sales@stripe.com",
"email_privacy": null,
"emails_found_count": 7,
"emails_rejected_count": 6,
"emails_rejected_reasons": "foreign_domain=5, not_a_role_address=1",
"phone_main": null,
"phone_source": null,
"phone_page": null,
"address_line": null,
"address_city": null,
"address_country": null,
"address_source": null,
"address_page": null,
"contact_form_url": null,
"pages_read": 2,
"coverage": 0.2,
"fetch_status": "ok",
"run_date": "2026-08-22T19:23:48.675Z"
}Features
Role email addresses only, never a named individual
Main phone number and postal address when the company publishes them
Contact page URL, plus how that page was found
Rejection accounting in
emails_rejected_reasons, so a thin read is visibleCoverage reported per row
27 flat snake_case fields, one row per company
Pricing
Price per event on the Apify FREE plan, from the live pricing record; paid Apify plans pay less per event.
Event | Price (USD) |
Actor Start ( | 0.00005 |
Company checked ( | 0.0035 |
Contact page found ( | 0.0025 |
Email extracted ( | 0.003 |
Full actor documentation
This server is a thin client and holds no extraction logic. For the complete input and output reference, pricing, and run history, see the Apify Store page:
https://apify.com/mambalabs/company-contact-details-extractor
Mamba Labs GTM Suite
This server is one of the Mamba Labs GTM Suite MCP servers. Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything. The actor behind this server is the Company Contact Details Extractor, immutable Apify actor ID 4mMncKaJykiq94grz.
Built by Mamba Labs | npm | Apify Store
License
MIT
Built by Mamba Labs. https://apify.com/mambalabs
Available Tools
1 toolextract_company_contact_detailsExtract Company Contact DetailsARead-onlyIdempotent
Find a company's contact page from its domain and extract classified ROLE email addresses (general, support, sales, privacy), a main phone number in E.164 where the country resolves, and a postal address. Returns one flat Clay ready row. Named individuals are NEVER returned: an address is kept only when its domain belongs to the company and its local part is in the role vocabulary, so a person's address is dropped by an allow list rather than by a name detector. The row reports how many addresses were found and how many were rejected and why, so a thin result is never mistaken for a site that publishes nothing. Read only; requires an APIFY_TOKEN and consumes Apify credits per call.
| Name | Required | Description | Default |
|---|---|---|---|
| skipCache | No | When "false" (default) a successful lookup is cached for seven days and reused, which costs you nothing on a repeated run. Set "true" to force a fresh fetch. Sent as a string for Clay compatibility. | |
| crawlDepth | No | How many pages to read after the homepage. "1" (default) reads the contact page. "2" also reads a support or legal page when the contact page yielded nothing. This is a cost and thoroughness dial, not a change of answer. Sent as a string for Clay compatibility. | |
| emailTypes | No | Which classes of role address to return. "all" (default) returns general, support, sales and privacy. The narrower settings return only what they name and leave the other columns null, which is a different answer from not finding one. Sent as a string for Clay compatibility. | |
| company_name | No | Optional. Used in the row and in logging. This actor gates addresses on the email DOMAIN rather than on the company name, so supplying a name does not change which addresses are kept. | |
| includePhones | No | When "true" (default) the contact page is scanned for a main phone number. Set "false" to skip phone extraction entirely, which leaves the phone columns null. Sent as a string for Clay compatibility. | |
| company_domain | No | Bare company domain, for example stripe.com. Needed on every call: the tool returns an error naming this field when it is missing. It is the join key for every other actor in the fleet. | |
| includeAddress | No | When "true" (default) a postal address is read from JSON-LD first and from the footer second. Set "false" to skip it. Sent as a string for Clay compatibility. | |
| allowFreeMailboxes | No | When "false" (default) an address at gmail, outlook or another free provider is rejected, because it cannot be checked against the company domain. Set "true" for small business and local company lists, where a free mailbox on the contact page is often the real contact point. Sent as a string for Clay compatibility. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial context beyond that: named individuals are dropped by a role allow-list rather than a name detector, the row reports found vs rejected counts with reasons, and calls consume Apify credits and need a token. This is exactly the extra behavioral disclosure the lower bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the key constraint (no named individuals), then the why of the rejection count, then prerequisites. Every sentence carries distinct information and the whole is tightly bounded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden, and it does: a flat Clay-ready row with role emails, phone in E.164, postal address, and found/rejected counts. Combined with full schema coverage and annotations, an agent has everything needed to invoke and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters including enums and defaults. The description reinforces the allow-list logic that underlies allowFreeMailboxes but adds no parameter-specific syntax or format detail beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: find a company's contact page from its domain and extract role emails, a main phone, and a postal address. It names exactly what is produced (one flat row) and what is deliberately excluded (named individuals), so an agent knows precisely what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There are no sibling tools to route against, so differentiation is moot, but the description gives operational context: read-only, requires an APIFY_TOKEN, and consumes Apify credits per call. It stops short of explicit when-to-use/when-not guidance for the narrower emailTypes or crawlDepth settings, but the framing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.1.1- Changed
extract_company_contact_details2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / company_domain / descriptionPrevious value: -"Bare company domain, for example stripe.com. This is the only required input and it is the join key for every other actor in the fleet."New value: +"Bare company domain, for example stripe.com. Needed on every call: the tool returns an error naming this field when it is missing. It is the join key for every other actor in the fleet."
1 tool update
v1.0.0- First observed
extract_company_contact_details
TDQS
Scored across 1 tool
With a single tool there is no possibility of misselection; its purpose (find a company's contact page from a domain and extract role emails, phone, and postal address) is stated unambiguously in both name and description.
The lone name, extract_company_contact_details, follows a clear verb_noun_object snake_case pattern and is descriptive of the action and resource. There are no other names to conflict with it.
The server is narrowly scoped and the single monolithic tool does address that scope end-to-end, but one tool is thin for a surface that handles discovery, extraction, validation, rejection reporting, and output formatting in one call.
For its stated purpose the tool covers the full pipeline (email roles, E.164 phone with country resolution, postal address) and even reports rejected addresses with reasons, avoiding false-thin results. Minor gaps exist, e.g. no bulk/multi-domain input or parameterization for selective extraction.
Maintenance
Related MCP Connectors
Apify MCP — run web-scraping Actors and fetch their dataset results.
Curated Shopify products, SKU variants, ATS jobs and sitemaps via Apify's official MCP server.
117 data tools in one MCP server, run on Apify: Google Shopping, Flights, Hotels, News, Images, Videos, Ads Transparency, Jobs and Trends; YouTube transcripts; AI visibility checks; Google Maps leads; App Store and Google Play reviews. Pay per result. Sign in with Apify (OAuth) or an API token.
Clutch.co B2B agency directory, profiles, and reviews as JSON, via an Apify Actor, hosted MCP.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for the Mamba Labs People Finder & Email Verifier actor on Apify. Give it a company domain, name or LinkedIn URL and it returns the people at that company who match your role, seniority and department filters, each as a structured contact record with an optional verified business email.1220 npmMIT
- AlicenseAqualityAmaintenanceMCP server for the Mamba Labs GitHub Organization Signal Scanner actor on Apify. Resolve a company domain to its GitHub organization with repo, language and activity signals.194 npmMIT
- AlicenseAqualityAmaintenanceMCP server for the Mamba Labs Website Traffic Rank Estimator actor on Apify. Get a research grade Tranco popularity rank and trend for any company domain.1110 npmMIT
- AlicenseAqualityAmaintenanceMCP server for the Mamba Labs X Twitter Brand Presence Mapper actor on Apify. Resolve a company domain to its X handle, profile URL and follower metrics.1106 npmMIT