Skip to main content
Glama

gouda_studios/website-contact-extractor

gouda_studios--website-contact-extractor
Destructive

Extracts public emails, phones, social links, and addresses from a list of websites, one deduplicated row per site. Use for contact discovery on public pages.

Input Schema

NameRequiredDescriptionDefault
checkMxNoAdds a free DNS check that each email domain can receive.
waitSecsNoSeconds to wait for the run to finish (0-45).
startUrlsYesWebsites or domains to extract contacts from, one per.
defaultCountryNoTwo-letter country code used to read local phone numbers.US
maxPagesPerSiteNoHow many pages to read on each site, starting with .
respectRobotsTxtNoSkip pages that a site's robots.txt asks crawlers not .
proxyConfigurationNoOptional. Most business sites work without a proxy. Turn.

Output Schema

NameRequiredDescriptionDefault
tipNoAdvisory guidance RAG Web Browser wrote to its key-value.
runIdYesActor run ID
statsNoRun statistics
statusYesRun status: READY | RUNNING | TIMING-OUT | TIMED-OUT |.
actorIdYesStable Apify Actor ID from the run record
summaryYesPast-tense summary of the run state
exitCodeNoActor process exit code; populated for terminal states.
nextStepYesOne primary follow-up action with identifiers interpolated
storagesYesDataset and key-value store metadata, keyed by alias.
actorNameNo"username/actor-name"
startedAtNoISO timestamp when the run started
finishedAtNoISO timestamp when the run finished (terminal states only)
statusMessageNoPass-through from Apify run.statusMessage
apifyConsoleUrlNoPersonalized Apify Console link to the run; present only.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed47 schema fields changed
    • changedInput schema / properties / checkMx / description
      Previous value: -"Adds a free DNS check that each email domain can receive mail. Flags typos and dead domains.\nExample values: true"New value: +"Adds a free DNS check that each email domain can receive."
    • removedInput schema / properties / checkMx / examples
      Removed value: -[
      -  true
      -]
    • removedInput schema / properties / checkMx / title
      Removed value: -"Check email domains for MX records"
    • changedInput schema / properties / defaultCountry / description
      Previous value: -"Two-letter country code used to read local phone numbers that have no +country prefix, e.g. US, GB, DE, AU.\nExample values: \"US\""New value: +"Two-letter country code used to read local phone numbers."
    • removedInput schema / properties / defaultCountry / examples
      Removed value: -[
      -  "US"
      -]
    • removedInput schema / properties / defaultCountry / title
      Removed value: -"Default phone country"
    • changedInput schema / properties / maxPagesPerSite / description
      Previous value: -"How many pages to read on each site, starting with the homepage and then the most likely contact pages (Contact, About, Team, Impressum, Support). You pay per site, not per page, so higher values only cost more time.\nExample values: 8"New value: +"How many pages to read on each site, starting with ."
    • removedInput schema / properties / maxPagesPerSite / examples
      Removed value: -[
      -  8
      -]
    • removedInput schema / properties / maxPagesPerSite / title
      Removed value: -"Max pages per site"
    • changedInput schema / properties / proxyConfiguration / description
      Previous value: -"Optional. Most business sites work without a proxy. Turn on Apify Proxy if many sites time out or block requests.\nExample values: {\"useApifyProxy\":false}"New value: +"Optional. Most business sites work without a proxy. Turn."
    • removedInput schema / properties / proxyConfiguration / examples
      Removed value: -[
      -  {
      -    "useApifyProxy": false
      -  }
      -]
    • changedInput schema / properties / proxyConfiguration / properties / apifyProxyGroups / description
      Previous value: -"Select specific Apify Proxy groups to use (e.g., RESIDENTIAL, DATACENTER).\n**DATACENTER:**\nThe fastest and cheapest option. It uses datacenters to change your IP address. Note that there is a chance of being blocked because of the activity of other users.\n\n**RESIDENTIAL:**\nIP addresses located in homes and offices around the world. These IPs are the least likely to be blocked."New value: +"Select specific Apify Proxy groups to use (."
    • removedInput schema / properties / proxyConfiguration / properties / apifyProxyGroups / items / description
      Removed value: -"Proxy group name"
    • removedInput schema / properties / proxyConfiguration / properties / apifyProxyGroups / items / title
      Removed value: -"Proxy group name"
    • removedInput schema / properties / proxyConfiguration / properties / apifyProxyGroups / title
      Removed value: -"Apify Proxy Groups"
    • changedInput schema / properties / proxyConfiguration / properties / proxyUrls / description
      Previous value: -"List of custom proxy URLs to be used instead of the Apify Proxy."New value: +"List of custom proxy URLs to be used instead of ."
    • removedInput schema / properties / proxyConfiguration / properties / proxyUrls / items / description
      Removed value: -"Custom proxy URL"
    • removedInput schema / properties / proxyConfiguration / properties / proxyUrls / items / title
      Removed value: -"Custom proxy URL"
    • removedInput schema / properties / proxyConfiguration / properties / proxyUrls / title
      Removed value: -"Proxy URLs"
    • changedInput schema / properties / proxyConfiguration / properties / useApifyProxy / description
      Previous value: -"Whether to use Apify Proxy. Set this to false when you want to use custom proxy URLs."New value: +"Whether to use Apify Proxy. Set this to false when you."
    • removedInput schema / properties / proxyConfiguration / properties / useApifyProxy / title
      Removed value: -"Use Apify Proxy"
    • removedInput schema / properties / proxyConfiguration / title
      Removed value: -"Proxy"
    • changedInput schema / properties / respectRobotsTxt / description
      Previous value: -"Skip pages that a site's robots.txt asks crawlers not to visit.\nExample values: true"New value: +"Skip pages that a site's robots.txt asks crawlers not ."
    • removedInput schema / properties / respectRobotsTxt / examples
      Removed value: -[
      -  true
      -]
    • removedInput schema / properties / respectRobotsTxt / title
      Removed value: -"Respect robots.txt"
    • changedInput schema / properties / startUrls / description
      Previous value: -"**REQUIRED** Websites or domains to extract contacts from, one per line. Examples: https://www.example.com or example.com. Each site becomes exactly one output row.\nExample values: [\"https://apify.com\",\"https://www.python.org\"]"New value: +"Websites or domains to extract contacts from, one per."
    • removedInput schema / properties / startUrls / examples
      Removed value: -[
      -  "https://apify.com",
      -  "https://www.python.org"
      -]
    • removedInput schema / properties / startUrls / items / description
      Removed value: -"**REQUIRED** Websites or domains to extract contacts from, one per line. Examples: https://www.example.com or example.com. Each site becomes exactly one output row."
    • removedInput schema / properties / startUrls / items / title
      Removed value: -"Websites"
    • removedInput schema / properties / startUrls / prefill
      Removed value: -[
      -  "https://apify.com",
      -  "https://www.python.org"
      -]
    • removedInput schema / properties / startUrls / title
      Removed value: -"Websites"
    • changedInput schema / properties / waitSecs / description
      Previous value: -"Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget."New value: +"Seconds to wait for the run to finish (0-45)."
    • changedOutput schema / properties / apifyConsoleUrl / description
      Previous value: -"Personalized Apify Console link to the run; present only for Console sessions"New value: +"Personalized Apify Console link to the run; present only."
    • changedOutput schema / properties / exitCode / description
      Previous value: -"Actor process exit code; populated for terminal states (especially FAILED)"New value: +"Actor process exit code; populated for terminal states."
    • changedOutput schema / properties / status / description
      Previous value: -"Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED"New value: +"Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT |."
    • changedOutput schema / properties / storages / description
      Previous value: -"Dataset and key-value store metadata, keyed by alias. \"default\" is always the primary entry."New value: +"Dataset and key-value store metadata, keyed by alias."
    • changedOutput schema / properties / storages / properties / datasets / additionalProperties / properties / apifyConsoleUrl / description
      Previous value: -"Personalized Apify Console link to the dataset; present only for Console sessions"New value: +"Personalized Apify Console link to the dataset; present."
    • changedOutput schema / properties / storages / properties / datasets / additionalProperties / properties / inflatedBytes / description
      Previous value: -"Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching."New value: +"Approximate uncompressed byte size of the dataset. Use."
    • changedOutput schema / properties / storages / properties / datasets / description
      Previous value: -"Map of dataset alias → metadata. Key \"default\" is always the run's primary dataset."New value: +"Map of dataset alias → metadata. Key \"default\" is always."
    • changedOutput schema / properties / storages / properties / datasets / properties / default / properties / apifyConsoleUrl / description
      Previous value: -"Personalized Apify Console link to the dataset; present only for Console sessions"New value: +"Personalized Apify Console link to the dataset; present."
    • changedOutput schema / properties / storages / properties / datasets / properties / default / properties / inflatedBytes / description
      Previous value: -"Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching."New value: +"Approximate uncompressed byte size of the dataset. Use."
    • changedOutput schema / properties / storages / properties / keyValueStores / additionalProperties / properties / apifyConsoleUrl / description
      Previous value: -"Personalized Apify Console link to the store; present only for Console sessions"New value: +"Personalized Apify Console link to the store; present."
    • changedOutput schema / properties / storages / properties / keyValueStores / description
      Previous value: -"Map of key-value store alias → metadata. Key \"default\" is always the run's primary store."New value: +"Map of key-value store alias → metadata. Key \"default\"."
    • changedOutput schema / properties / storages / properties / keyValueStores / properties / default / properties / apifyConsoleUrl / description
      Previous value: -"Personalized Apify Console link to the store; present only for Console sessions"New value: +"Personalized Apify Console link to the store; present."
    • changedOutput schema / properties / tip / description
      Previous value: -"Advisory guidance RAG Web Browser wrote to its key-value store under the reserved \"TIP\" key"New value: +"Advisory guidance RAG Web Browser wrote to its key-value."
    • changedOutput schema / properties / tip / properties / caveat / description
      Previous value: -"Present when this session cannot run the Actor the tip recommends"New value: +"Present when this session cannot run the Actor the tip."
    • changedOutput schema / properties / tip / properties / message / description
      Previous value: -"Truncated to 300 characters, with a trailing ellipsis if the Actor's message was longer"New value: +"Truncated to 300 characters, with a trailing ellipsis if."
  2. Changed1 schema field changed
    • removedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Removed value: -{
      -  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      -  "properties": {
      -    "addresses": {
      -      "items": {
      -        "properties": {
      -          "city": {
      -            "type": "string"
      -          },
      -          "country": {
      -            "type": "string"
      -          },
      -          "postalCode": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "region": {
      -            "type": [
      -              "null",
      -              "string"
      -            ]
      -          },
      -          "street": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "charged": {
      -      "type": "boolean"
      -    },
      -    "contactPageUrls": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "domain": {
      -      "type": "string"
      -    },
      -    "emailDetails": {
      -      "items": {
      -        "properties": {
      -          "domainHasMx": {
      -            "type": "boolean"
      -          },
      -          "email": {
      -            "type": "string"
      -          },
      -          "foundOn": {
      -            "type": "string"
      -          },
      -          "isRoleAccount": {
      -            "type": "boolean"
      -          },
      -          "matchesSiteDomain": {
      -            "type": "boolean"
      -          },
      -          "source": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "emails": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "error": {
      -      "type": [
      -        "null",
      -        "string"
      -      ]
      -    },
      -    "facebook": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "finalUrl": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "inputUrl": {
      -      "type": "string"
      -    },
      -    "instagram": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "linkedin": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "otherSocials": {
      -      "properties": {
      -        "discord": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "github": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "pinterest": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "reddit": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "pagesScanned": {
      -      "type": "number"
      -    },
      -    "phoneDetails": {
      -      "items": {
      -        "properties": {
      -          "country": {
      -            "type": "string"
      -          },
      -          "e164": {
      -            "type": "string"
      -          },
      -          "foundOn": {
      -            "type": "string"
      -          },
      -          "international": {
      -            "type": "string"
      -          },
      -          "national": {
      -            "type": "string"
      -          },
      -          "source": {
      -            "type": "string"
      -          },
      -          "type": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "phones": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "primaryEmail": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "primaryPhone": {
      -      "type": [
      -        "null",
      -        "string"
      -      ]
      -    },
      -    "scannedUrls": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "scrapedAt": {
      -      "type": "string"
      -    },
      -    "siteName": {
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    },
      -    "status": {
      -      "type": "string"
      -    },
      -    "tiktok": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "x": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "youtube": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  },
      -  "type": "object"
      -}
  3. Added

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds one behavioral fact not in structured fields — results are deduplicated to one row per site — but omits the operationally important traits: this starts a billable actor run, waitSecs (0–45s) caps how long it blocks so output may be partial, and robots.txt is honored by default. With annotations carrying the safety load, this is an adequate-but-thin addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the extraction scope and output granularity front-loaded before the usage hint. There is no redundancy with the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be explained, and parameter documentation is fully handled by the schema. However, for an open-world crawler with a nested proxy config and a 45-second blocking cap, the description should warn that runs can return partial results or time out and that credits are consumed — context an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every one of the seven parameters, including the nested proxyConfiguration object, is already documented in the schema. The description only restates that the input is a list of websites and adds no guidance beyond it, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (extracts) and enumerates concrete resources (public emails, phones, social links, addresses) plus the input shape (a list of websites) and output shape (one deduplicated row per site). Nothing in the sibling list (YouTube transcripts, SEC filings, LEI lookup, trends) overlaps, so an agent can immediately tell this is the contact-discovery tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use for contact discovery on public pages" gives a positive usage cue and implicitly scopes it to public data, but there is no when-not guidance, no mention of what to do if a site yields nothing, and no routing to siblings (e.g., running the actor first via get-actor-run). Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.