MapsData
Build lead lists from Google Maps: businesses with emails, phones and websites, US/CA/UK/AU.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (8)
🟢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
Evidence