Skip to main content
Glama

Prospects: find and rank local businesses to pitch

find_prospects

Find local businesses an agency could win as clients, check each one's website quickly (tracking tags, Google Ads tag, inquiry forms including embedded ones, booking tools, tap-to-call, the site platform, the published business email) and rank them by how much the agency could fix for them, with the 1-3 strongest findings each in plain English. Works in any country, in one or several areas at once. Every filter is optional (v2, 10/20/26): Google listing filters (rating, review count, status, types, price level, website / no website, phone, radius around a place, service-area businesses, open weekends / 24 h), a business-age ESTIMATE (min_estimated_age_years: Google publishes no founding date, so age is estimated from the website domain's registration date and the oldest Google review we can see; always call it an estimate, never 'founded' or 'years in business'), and filters on our own website check (Google Ads tag seen or not, Analytics, a form, a booking tool, the site platform, a published email, a minimum opportunity score). Company size, revenue and owners' private details are not available: say so and offer review count instead. Skips the agency's clients, businesses it audited recently and businesses it already got in an earlier search (include_seen to see them again, free). Credits: one per business delivered (found, checked and returned); with strict filters at least one per 8 businesses scanned (Google bills each search page as 20); never more than count. Each area is at least one Google search, so several areas need a larger count (the preview says how much). Included each month: Free 10, Standard 50, Premium 100, plus 100 welcome credits once; packs on the dashboard. preview: true (or describe) shows the search and the credit estimate without running. When the run would use purchased credits it asks first: call again with confirm: true after the person agrees. Flow: find_prospects → show the ranked list → prospect_drafts for the ones they pick → they send from their own email, phone or CRM. Nothing is ever sent from here.

Input Schema

NameRequiredDescriptionDefault
formNoAn inquiry form seen (or confirmed absent; a JavaScript-built site is 'couldn't check', never 'no form')
nearNoWith radius_km: a place to measure from, e.g. 'Parramatta NSW'
countNoHow many businesses to deliver (one credit each)
socialNoOnly businesses that link a social profile on their own site: ["any"], or any of these networks. These are the profiles the business publishes on its site, not a search of the networks; no channel is analysed.
bookingNoAn online booking or scheduling tool seen (or not)
confirmNotrue = the person agreed to use purchased credits for this run
excludeNoBusiness names or website domains to leave out
keywordNoThe trade or kind of business, e.g. 'solar installer', 'plumber', 'dentist'. Several trades: separate with commas, e.g. 'fence builder, shed builder, deck builder' (each trade in each area is its own search, so a larger count may be needed). Required unless describe is given.
previewNotrue = show the search, the filters and the credit estimate without running
websiteNorequired (default; the website check needs one), none = only businesses WITHOUT a website (a website sale), any
describeNoA plain-English description of who to find, e.g. 'solar installers in NSW that have been around a while'. Turned into the search above and returned as a preview; nothing runs from it.
locationNoOne city, region or postcode, any country, e.g. 'Sydney NSW', 'Leeds UK', '84604'
open_24hNoOpen 24 hours, from the listing's hours
platformNoThe site is built on one of these
analyticsNoGoogle Analytics / Tag Manager seen (or not)
form_kindNoHow they take inquiries: funnel (a funnel or landing builder such as HighLevel, ClickFunnels, Leadpages, Unbounce, Instapage, Kartra, Kajabi, Systeme.io), form_tool (an embedded form service such as Typeform or Jotform), basic_form (a plain HTML form), none_seen (we read the pages and saw none). A site built with JavaScript is never counted as none_seen.
has_phoneNoOnly listings with a phone number
locationsNoSeveral areas in one run, e.g. ['Sydney NSW', 'Newcastle NSW', 'Perth WA']; results are deduplicated across them
radius_kmNoOnly businesses within this many km of near (from the listing's map pin)
max_ratingNoGoogle rating at most this (lower ratings are more reputation work to sell)
min_ratingNoGoogle rating at least this
email_foundNoA business email is (or isn't) published on their own site
max_reviewsNoAt most this many Google reviews
min_reviewsNoAt least this many Google reviews (a proxy for size and age; Google publishes no company size)
include_seenNoAlso return businesses this account got in an earlier search (free, never charged)
price_levelsNoGoogle's price level (mostly restaurants and shops; most trades have none)
primary_typeNoThe listing's main Google Places type must be this
service_areaNoService-area businesses with no storefront (most trades): include (default), exclude, or only
exclude_typesNoGoogle Places types to leave out
include_typesNoGoogle Places types, any of them, e.g. 'solar_energy_system_service', 'plumber', 'electrician'
min_locationsNoAt least this many physical locations: an ESTIMATE from several Google listings sharing the website, addresses in the site's business details, or a locations page in its navigation ("several" counts as 2). Say it is an estimate.
open_weekendsNoOpen on Saturday or Sunday, from the listing's hours
google_ads_tagNoA Google Ads tag seen (or not) on their site: an advertising signal, not proof of current spend
business_statusNoDefault: OPERATIONAL only
marketing_activeNotrue = already marketing (a funnel, a Google Ads tag, a Meta pixel, or 3+ tracking tags); false = none of those seen. Separate from opportunity_score, which is how much an agency could fix.
must_have_websiteNoOlder name: false = website any
min_opportunity_scoreNoOnly businesses with at least this opportunity score (how much the agency could fix)
min_estimated_age_yearsNoBusiness age ESTIMATE at least this many years: the older of the website domain's registration date and the oldest Google review we can see. Google publishes no founding date, so this is a lower-bound estimate; businesses whose age can't be estimated are left out.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / keyword / description
      Previous value: -"The trade or kind of business, e.g. 'solar installer', 'plumber', 'dentist'. Required unless describe is given."New value: +"The trade or kind of business, e.g. 'solar installer', 'plumber', 'dentist'. Several trades: separate with commas, e.g. 'fence builder, shed builder, deck builder' (each trade in each area is its own search, so a larger count may be needed). Required unless describe is given."
    • addedInput schema / properties / keyword / maxLength
      Added value: +200
  2. Changed4 schema fields changed
    • addedInput schema / properties / form_kind
      Added value: +{
      +  "description": "How they take inquiries: funnel (a funnel or landing builder such as HighLevel, ClickFunnels, Leadpages, Unbounce, Instapage, Kartra, Kajabi, Systeme.io), form_tool (an embedded form service such as Typeform or Jotform), basic_form (a plain HTML form), none_seen (we read the pages and saw none). A site built with JavaScript is never counted as none_seen.",
      +  "items": {
      +    "enum": [
      +      "funnel",
      +      "form_tool",
      +      "basic_form",
      +      "none_seen"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 4,
      +  "type": "array"
      +}
    • addedInput schema / properties / marketing_active
      Added value: +{
      +  "description": "true = already marketing (a funnel, a Google Ads tag, a Meta pixel, or 3+ tracking tags); false = none of those seen. Separate from opportunity_score, which is how much an agency could fix.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / min_locations
      Added value: +{
      +  "description": "At least this many physical locations: an ESTIMATE from several Google listings sharing the website, addresses in the site's business details, or a locations page in its navigation (\"several\" counts as 2). Say it is an estimate.",
      +  "maximum": 50,
      +  "minimum": 2,
      +  "type": "integer"
      +}
    • addedInput schema / properties / social
      Added value: +{
      +  "description": "Only businesses that link a social profile on their own site: [\"any\"], or any of these networks. These are the profiles the business publishes on its site, not a search of the networks; no channel is analysed.",
      +  "items": {
      +    "enum": [
      +      "any",
      +      "facebook",
      +      "instagram",
      +      "linkedin",
      +      "x",
      +      "youtube",
      +      "tiktok",
      +      "pinterest"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 7,
      +  "type": "array"
      +}
  3. Changed34 schema fields changed
    • addedInput schema / properties / analytics
      Added value: +{
      +  "description": "Google Analytics / Tag Manager seen (or not)",
      +  "enum": [
      +    "present",
      +    "absent"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / booking
      Added value: +{
      +  "description": "An online booking or scheduling tool seen (or not)",
      +  "enum": [
      +    "present",
      +    "absent"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / business_status
      Added value: +{
      +  "description": "Default: OPERATIONAL only",
      +  "items": {
      +    "enum": [
      +      "OPERATIONAL",
      +      "CLOSED_TEMPORARILY",
      +      "CLOSED_PERMANENTLY"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / count / description
      Previous value: -"How many businesses to find and check (one credit each)"New value: +"How many businesses to deliver (one credit each)"
    • addedInput schema / properties / describe
      Added value: +{
      +  "description": "A plain-English description of who to find, e.g. 'solar installers in NSW that have been around a while'. Turned into the search above and returned as a preview; nothing runs from it.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • addedInput schema / properties / email_found
      Added value: +{
      +  "description": "A business email is (or isn't) published on their own site",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / exclude_types
      Added value: +{
      +  "description": "Google Places types to leave out",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
    • addedInput schema / properties / form
      Added value: +{
      +  "description": "An inquiry form seen (or confirmed absent; a JavaScript-built site is 'couldn't check', never 'no form')",
      +  "enum": [
      +    "present",
      +    "absent"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / google_ads_tag
      Added value: +{
      +  "description": "A Google Ads tag seen (or not) on their site: an advertising signal, not proof of current spend",
      +  "enum": [
      +    "present",
      +    "absent"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / has_phone
      Added value: +{
      +  "description": "Only listings with a phone number",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / include_seen
      Added value: +{
      +  "default": false,
      +  "description": "Also return businesses this account got in an earlier search (free, never charged)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / include_types
      Added value: +{
      +  "description": "Google Places types, any of them, e.g. 'solar_energy_system_service', 'plumber', 'electrician'",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
    • changedInput schema / properties / keyword / description
      Previous value: -"The trade or kind of business, e.g. 'plumber', 'recruitment agency', 'dentist'"New value: +"The trade or kind of business, e.g. 'solar installer', 'plumber', 'dentist'. Required unless describe is given."
    • changedInput schema / properties / location / description
      Previous value: -"City, region or postcode, any country, e.g. 'Sydney NSW', 'Leeds UK', '84604'"New value: +"One city, region or postcode, any country, e.g. 'Sydney NSW', 'Leeds UK', '84604'"
    • addedInput schema / properties / locations
      Added value: +{
      +  "description": "Several areas in one run, e.g. ['Sydney NSW', 'Newcastle NSW', 'Perth WA']; results are deduplicated across them",
      +  "items": {
      +    "minLength": 2,
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
    • changedInput schema / properties / max_rating / description
      Previous value: -"Only businesses rated at or below this (lower ratings are more to sell)"New value: +"Google rating at most this (lower ratings are more reputation work to sell)"
    • addedInput schema / properties / max_reviews
      Added value: +{
      +  "description": "At most this many Google reviews",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / min_estimated_age_years
      Added value: +{
      +  "description": "Business age ESTIMATE at least this many years: the older of the website domain's registration date and the oldest Google review we can see. Google publishes no founding date, so this is a lower-bound estimate; businesses whose age can't be estimated are left out.",
      +  "maximum": 50,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / min_opportunity_score
      Added value: +{
      +  "description": "Only businesses with at least this opportunity score (how much the agency could fix)",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / min_rating
      Added value: +{
      +  "description": "Google rating at least this",
      +  "maximum": 5,
      +  "minimum": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / min_reviews / description
      Added value: +"At least this many Google reviews (a proxy for size and age; Google publishes no company size)"
    • removedInput schema / properties / must_have_website / default
      Removed value: -true
    • addedInput schema / properties / must_have_website / description
      Added value: +"Older name: false = website any"
    • addedInput schema / properties / near
      Added value: +{
      +  "description": "With radius_km: a place to measure from, e.g. 'Parramatta NSW'",
      +  "type": "string"
      +}
    • addedInput schema / properties / open_24h
      Added value: +{
      +  "description": "Open 24 hours, from the listing's hours",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / open_weekends
      Added value: +{
      +  "description": "Open on Saturday or Sunday, from the listing's hours",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platform
      Added value: +{
      +  "description": "The site is built on one of these",
      +  "items": {
      +    "enum": [
      +      "WordPress",
      +      "Wix",
      +      "Squarespace",
      +      "Shopify",
      +      "HighLevel",
      +      "Base44",
      +      "Webflow",
      +      "GoDaddy",
      +      "Duda",
      +      "Weebly",
      +      "Framer",
      +      "Joomla",
      +      "Drupal"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / preview
      Added value: +{
      +  "default": false,
      +  "description": "true = show the search, the filters and the credit estimate without running",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / price_levels
      Added value: +{
      +  "description": "Google's price level (mostly restaurants and shops; most trades have none)",
      +  "items": {
      +    "enum": [
      +      "PRICE_LEVEL_FREE",
      +      "PRICE_LEVEL_INEXPENSIVE",
      +      "PRICE_LEVEL_MODERATE",
      +      "PRICE_LEVEL_EXPENSIVE",
      +      "PRICE_LEVEL_VERY_EXPENSIVE"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / primary_type
      Added value: +{
      +  "description": "The listing's main Google Places type must be this",
      +  "type": "string"
      +}
    • addedInput schema / properties / radius_km
      Added value: +{
      +  "description": "Only businesses within this many km of near (from the listing's map pin)",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / service_area
      Added value: +{
      +  "description": "Service-area businesses with no storefront (most trades): include (default), exclude, or only",
      +  "enum": [
      +    "include",
      +    "exclude",
      +    "only"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / website
      Added value: +{
      +  "description": "required (default; the website check needs one), none = only businesses WITHOUT a website (a website sale), any",
      +  "enum": [
      +    "required",
      +    "none",
      +    "any"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "keyword",
      -  "location"
      -]
  4. Added

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond annotations: it discloses the credit model (one per delivered business, at least one per 8 scanned with strict filters, never more than count), the monthly allowance and pack top-ups, the confirm-before-purchased-credits gate, and the data that is NOT available (size, revenue, owner details) with review count as the substitute. Annotations only say readOnlyHint=false and openWorldHint=true; this fills in the cost, non-idempotency and estimation caveats.

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

Conciseness3/5

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

Purpose and flow are front-loaded, but the description is very dense and long, and parts duplicate schema descriptions (the age-estimate caveat, service-area handling, website/no-website options). Every section is relevant, but the length works against fast scanning for a 38-parameter tool.

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

Completeness5/5

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

For a complex, paid, multi-filter discovery tool with no output schema, the description covers purpose, filter families, pricing/confirmation behavior, unavailable data, result format (ranked list with 1-3 findings) and the downstream hand-off. An agent has enough to call it correctly and explain the cost.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning the schema lacks: count maps to credits, include_seen is free, strict filters raise the scan cost, several trades/areas multiply searches, and min_estimated_age_years is a lower-bound estimate that the agent must phrase as an estimate, never 'founded'. That is genuine semantic value beyond the schema text.

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?

States a specific verb (find and rank) and resource (local businesses an agency could win), plus what gets checked on each site and what is returned (1-3 plain-English findings). It is clearly distinguishable from siblings like audit_prospect, lead_check and suggest_clients, which do narrower evidence or suggestion tasks.

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

Usage Guidelines5/5

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

Explicit when-to-use context: the flow find_prospects → ranked list → prospect_drafts → send from their own email/CRM, plus preview:true to estimate without running and confirm:true after the person agrees to purchased credits. It also states what it skips (existing clients, recently audited, already-seen businesses) and offers include_seen as the alternative.

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.