MapsData

Build lead lists from Google Maps: businesses with emails, phones and websites, US/CA/UK/AU.

Should I use this

Quality & Safety

A
Description quality
95%
Schema completeness
75%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,266Tokens (tool definitions)
~810 BTypical response size
Moderate attention impact (0.99% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mapsdata": {
      "url": "https://mapsdata.ai/mcp"
    }
  }
}

Remote endpoints

https://mapsdata.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢mapsdata_search_categories(query, limit)

Search the Google Maps business categories MapsData can scrape. CALL THIS FIRST, before mapsdata_start_scrape: a scrape's query must be one of these exact categories, and a free-text guess like 'plumbing companies' is rejected.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Substring to search for, e.g. 'plumb'."
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 50
    }
  },
  "required": [
    "query"
  ]
}
🟢mapsdata_list_regions(country)

List the exact region names a scrape accepts for a country. Submit them verbatim. Abbreviations like 'TX' are rejected, because the postal tables key on the full name.

Input Schema

{
  "type": "object",
  "properties": {
    "country": {
      "type": "string",
      "enum": [
        "au",
        "ca",
        "uk",
        "us"
      ],
      "default": "us"
    }
  }
}
🟡mapsdata_start_scrape(query, states, cities, total_limit, country, ...)

Start scraping Google Maps businesses and their emails. Returns IMMEDIATELY with a job id; the scrape itself takes 5 minutes to several hours. Before calling this, confirm the category with mapsdata_search_categories and the region with mapsdata_list_regions. Those two mistakes are the overwhelming majority of rejections. This consumes the user's monthly lead allowance. Set dry_run to check a request against every rule without spending anything.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "An exact Google Maps category, e.g. 'Plumber'. Verify it with mapsdata_search_categories first."
    },
    "states": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Full region names, e.g. ['Texas']. Not abbreviations. Use this or cities, not both."
    },
    "cities": {
      "type": "array",
      "description": "Named cities instead of whole regions.",
      "items": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string"
          },
          "state": {
            "type": "string",
            "description": "Full region name."
          }
        },
        "required": [
          "city",
          "state"
        ]
      }
    },
    "total_limit": {
      "type": "integer",
      "minimum": 1,
      "description": "Rows to scrape. Read max_rows_this_scrape from mapsdata_get_usage first: a larger request is reduced to the allowance left this cycle, not rejected."
    },
    "country": {
      "type": "string",
      "enum": [
        "au",
        "ca",
        "uk",
        "us"
      ],
      "default": "us"
    },
    "list_name": {
      "type": "string",
      "description": "Label for the list. Defaults to the query."
    },
    "dry_run": {
      "type": "boolean",
      "default": false,
      "description": "Validate against every rule and return the plan WITHOUT starting a scrape or spending quota."
    }
  },
  "required": [
    "query",
    "total_limit"
  ]
}
🟢mapsdata_get_scrape(job_id)

Get the current state of one scrape. This is an INSTANT SNAPSHOT of a job that runs for minutes to hours. Do NOT call it repeatedly in a loop. The response includes next_action, the suggested next step for the job's current status. MapsData also emails the user when a scrape finishes.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string"
    }
  },
  "required": [
    "job_id"
  ]
}
🟢mapsdata_list_scrapes(status, limit)

List this workspace's recent scrapes, newest first.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "queued",
        "running",
        "cancelling",
        "cancelled",
        "completed",
        "failed"
      ]
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 25
    }
  }
}
🔴mapsdata_cancel_scrape(job_id)

Cancel a queued or running scrape. A queued scrape costs nothing. CANCELLING A RUNNING SCRAPE STILL BILLS the leads already delivered, so confirm with the user before calling this.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string"
    }
  },
  "required": [
    "job_id"
  ]
}
🟢mapsdata_get_download_link(job_id, format, scope)

Get a link to a finished scrape's results. The link expires in 15 minutes, so hand it to the user promptly rather than storing it.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string"
    },
    "format": {
      "type": "string",
      "enum": [
        "csv",
        "xlsx"
      ],
      "default": "csv"
    },
    "scope": {
      "type": "string",
      "enum": [
        "emails",
        "all",
        "filtered"
      ],
      "default": "emails",
      "description": "'emails' is rows with a deliverable email, which is what usage is billed on. 'all' is every scraped row."
    }
  },
  "required": [
    "job_id"
  ]
}
🟢mapsdata_get_usage

How much of this month's lead allowance is left, and the largest single scrape this plan allows. Read max_rows_this_scrape before choosing a total_limit.

Input Schema

{
  "type": "object",
  "properties": {}
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools