Koskamo

Website Contact & Social Extractor MCP

Extracts emails, validated phone numbers, WhatsApp links, social profiles, and addresses from a website's public pages. It respects robots.txt, uses no proxies or guessing, and returns schema.org company data from the homepage and contact pages.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Website Contact & Social Extractor MCP logo, by Noah's ArchVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Noah's Arch
You need:Without a key the catalogue and a few free tools work; paid tools answer 402 until a key is setX-API-Key: YOUR_KEY
MCP endpoint (Streamable HTTP)
https://contacts.noahsarch.tech/mcp
Vendor documentation

What you can do with it

  • Extract contact details from a target website
  • Validate phone numbers as mobile or landline
  • Find social media profiles on 18 platforms
  • Retrieve schema.org company data

Source and maintenance

Vendor evidenceRegistry 0.1.1

Protocol and capabilities

Server
website-contact-extractor 0.1.0
MCP protocol
2025-06-18
Tools
5 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Get a company's contact details from its website. extract_contacts(url) fetches the homepage and its contact/about pages and returns emails, phone numbers (validated, E.164, mobile vs landline), WhatsApp links, social profiles, postal addresses and organisation data from schema.org markup — deduplicated with the page each item came from. find_social_profiles for just the social links; extract_contacts_bulk for up to 50 sites in one call (lead lists); extract_from_html when you already have the page; check_url to see whether a site is reachable and where it redirects. Pass region (e.g. 'AE') so local phone numbers without +country code are read correctly. Items with source=text came from visible text and deserve a second look; mailto/tel/jsonld items are explicit. Only static HTML is read; sites that load contacts with JavaScript return an empty result with a warning. Respects robots.txt. Response: result with emails[] (email, source, role), phones[] (e164, international, region, type, source), whatsapp[], social{platform: [url, handle]}, addresses[], organization{}, pages[] (what was fetched, status) and summary{}, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Charged per page actually fetched; failed fetches are free. URLs are not logged.

Tools

5 advertised

extract_contacts — Extract contacts from a website
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch a site's homepage and up to max_pages-1 contact/about pages and return every email, phone (validated, E.164, type), WhatsApp link, social profile, postal address and organisation field found, with provenance per item. Example: url 'noahsarch.tech', max_pages 3, region 'AE'. Response: result with emails[] (email, source, role), phones[] (e164, international, region, type, source), whatsapp[], social{platform: [url, handle]}, addresses[], organization{}, pages[] (what was fetched, status) and summary{}, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Charged per page actually fetched; failed fetches are free. URLs are not logged.

extract_contacts input schema
{
  "type": "object",
  "title": "extract_contactsArguments",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "title": "Url",
      "description": "Website URL (scheme optional): 'example.com' or 'https://example.com/about'."
    },
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Region",
      "default": null,
      "description": "ISO 3166-1 alpha-2 country used to interpret phone numbers written without a country code (e.g. 'AE', 'GB', 'US'). Omit if unknown."
    },
    "max_pages": {
      "type": "integer",
      "title": "Max Pages",
      "default": 3,
      "description": "Homepage plus up to (max_pages-1) contact/about pages found on it. 1 = homepage only."
    },
    "include_social": {
      "type": "boolean",
      "title": "Include Social",
      "default": true,
      "description": "Include social-profile links (Facebook, Instagram, X, LinkedIn, YouTube, TikTok, Telegram, Snapchat, Pinterest, Threads, GitHub…)."
    },
    "respect_robots": {
      "type": "boolean",
      "title": "Respect Robots",
      "default": true,
      "description": "Honour the site's robots.txt (default). Set false only for sites you own."
    },
    "follow_contact_pages": {
      "type": "boolean",
      "title": "Follow Contact Pages",
      "default": true,
      "description": "Also fetch the site's contact/about/impressum pages (same site only)."
    }
  }
}
extract_contacts output schema
{
  "type": "object",
  "title": "extract_contactsDictOutput",
  "additionalProperties": true
}
extract_contacts annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_social_profiles — Find a website's social-media profiles
Advertised by the server during the last successful anonymous check.
Advertised read-only

Homepage only: Facebook, Instagram, X/Twitter, LinkedIn, YouTube, TikTok, Telegram, Snapchat, Pinterest, Threads, GitHub, TripAdvisor, Google Business links plus WhatsApp chat links, with handles. Share buttons are excluded. Example: url 'https://example.com'. Response: result with emails[] (email, source, role), phones[] (e164, international, region, type, source), whatsapp[], social{platform: [url, handle]}, addresses[], organization{}, pages[] (what was fetched, status) and summary{}, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Charged per page actually fetched; failed fetches are free. URLs are not logged.

find_social_profiles input schema
{
  "type": "object",
  "title": "find_social_profilesArguments",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "title": "Url",
      "description": "Website URL."
    }
  }
}
find_social_profiles output schema
{
  "type": "object",
  "title": "find_social_profilesDictOutput",
  "additionalProperties": true
}
find_social_profiles annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
extract_contacts_bulk — Extract contacts from up to 50 websites
Advertised by the server during the last successful anonymous check.
Advertised read-only

One call for a lead list: each site gets homepage + contact pages (max_pages), results per site plus a summary (sites with email/phone/WhatsApp, failures). Charged per page fetched across all sites. Example: urls ['a.com','b.ae'], max_pages 2, region 'AE'. Response: result with emails[] (email, source, role), phones[] (e164, international, region, type, source), whatsapp[], social{platform: [url, handle]}, addresses[], organization{}, pages[] (what was fetched, status) and summary{}, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Charged per page actually fetched; failed fetches are free. URLs are not logged.

extract_contacts_bulk input schema
{
  "type": "object",
  "title": "extract_contacts_bulkArguments",
  "required": [
    "urls"
  ],
  "properties": {
    "urls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Urls",
      "description": "Up to 50 website URLs (one per company). Duplicate sites are merged."
    },
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Region",
      "default": null,
      "description": "ISO 3166-1 alpha-2 country used to interpret phone numbers written without a country code (e.g. 'AE', 'GB', 'US'). Omit if unknown."
    },
    "max_pages": {
      "type": "integer",
      "title": "Max Pages",
      "default": 2,
      "description": "Pages per site (homepage + contact pages)."
    },
    "include_social": {
      "type": "boolean",
      "title": "Include Social",
      "default": true,
      "description": ""
    }
  }
}
extract_contacts_bulk output schema
{
  "type": "object",
  "title": "extract_contacts_bulkDictOutput",
  "additionalProperties": true
}
extract_contacts_bulk annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
extract_from_html — Extract contacts from HTML you already have
Advertised by the server during the last successful anonymous check.
Advertised read-only

Same parser, no fetching: emails (incl. obfuscated 'name [at] domain [dot] com'), phones, WhatsApp, social links, addresses, schema.org organisation data, and the contact-page links present. Free. Example: html '<a href="mailto:x@y.com">'. Response: result with emails[] (email, source, role), phones[] (e164, international, region, type, source), whatsapp[], social{platform: [url, handle]}, addresses[], organization{}, pages[] (what was fetched, status) and summary{}, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Charged per page actually fetched; failed fetches are free. URLs are not logged.

extract_from_html input schema
{
  "type": "object",
  "title": "extract_from_htmlArguments",
  "required": [
    "html"
  ],
  "properties": {
    "html": {
      "type": "string",
      "title": "Html",
      "description": "HTML (or plain text) you already have."
    },
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Region",
      "default": null,
      "description": "ISO 3166-1 alpha-2 country used to interpret phone numbers written without a country code (e.g. 'AE', 'GB', 'US'). Omit if unknown."
    },
    "base_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Base Url",
      "default": null,
      "description": "Page URL, used to resolve relative links and decide which links are same-site."
    }
  }
}
extract_from_html output schema
{
  "type": "object",
  "title": "extract_from_htmlDictOutput",
  "additionalProperties": true
}
extract_from_html annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_url — Check that a website is reachable
Advertised by the server during the last successful anonymous check.
Advertised read-only

GET the URL (robots-respecting, public hosts only) and report status, final URL after redirects, content type, title, declared languages and whether a contact page is linked. Use before a bulk job or to clean a URL list. Example: url 'example.com'. Response: result with emails[] (email, source, role), phones[] (e164, international, region, type, source), whatsapp[], social{platform: [url, handle]}, addresses[], organization{}, pages[] (what was fetched, status) and summary{}, plus data_confidence, estimated_items[], sources[], data_version, warnings[] and a disclaimer. Charged per page actually fetched; failed fetches are free. URLs are not logged.

check_url input schema
{
  "type": "object",
  "title": "check_urlArguments",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "title": "Url",
      "description": ""
    },
    "respect_robots": {
      "type": "boolean",
      "title": "Respect Robots",
      "default": true,
      "description": ""
    }
  }
}
check_url output schema
{
  "type": "object",
  "title": "check_urlDictOutput",
  "additionalProperties": true
}
check_url annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

0 advertised

No prompt definitions available.

Resources

2 advertised

data_version — Data version

Advertised by the server during the last successful anonymous check.

Current data/rules version.

data_version URI
website-contact-extractor://data-version

MIME type: text/plain

metrics — Aggregate metrics

Advertised by the server during the last successful anonymous check.

Aggregate counters only (tool, status, latency bucket). No queries are logged.

metrics URI
website-contact-extractor://metrics

MIME type: text/plain

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
2529 ms
95th percentile latency
2529 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 2529 ms · metadata changed · 5 tool(s), 2 resource(s), 0 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http website-contact-social-extractor-mcp https://contacts.noahsarch.tech/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add website-contact-social-extractor-mcp --url https://contacts.noahsarch.tech/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable website-contact-social-extractor-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "website-contact-social-extractor-mcp": {
      "url": "https://contacts.noahsarch.tech/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "website-contact-social-extractor-mcp": {
      "type": "streamableHttp",
      "url": "https://contacts.noahsarch.tech/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start website-contact-social-extractor-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "website-contact-social-extractor-mcp": {
      "type": "http",
      "url": "https://contacts.noahsarch.tech/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http website-contact-social-extractor-mcp https://contacts.noahsarch.tech/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "website-contact-social-extractor-mcp": {
      "url": "https://contacts.noahsarch.tech/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "website-contact-social-extractor-mcp": {
      "serverUrl": "https://contacts.noahsarch.tech/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Website Contact & Social Extractor MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Website Contact & Social Extractor MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing