Build lead lists from Google Maps: businesses with emails, phones and websites, US/CA/UK/AU.
Call this server's tools from your browser. Nothing to install.
Bearer <your MapsData API key>, created in Settings. Optional: clients that support OAuth connect without it.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
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.
| Argument | Type | Description |
|---|---|---|
| job_id* | string |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| scope | string | 'emails' is rows with a deliverable email, which is what usage is billed on. 'all' is every scraped row. |
| format | string | |
| job_id* | string |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"scope": {
"enum": [
"emails",
"all",
"filtered"
],
"type": "string",
"default": "emails",
"description": "'emails' is rows with a deliverable email, which is what usage is billed on. 'all' is every scraped row."
},
"format": {
"enum": [
"csv",
"xlsx"
],
"type": "string",
"default": "csv"
},
"job_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| job_id* | string |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string"
}
}
}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.
No arguments.
{
"type": "object",
"properties": {}
}List the exact region names a scrape accepts for a country. Submit them verbatim. Abbreviations like 'TX' are rejected; use the full name.
| Argument | Type | Description |
|---|---|---|
| country | string |
{
"type": "object",
"properties": {
"country": {
"enum": [
"au",
"ca",
"uk",
"us"
],
"type": "string",
"default": "us"
}
}
}List this workspace's recent scrapes, newest first.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| status | string |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1
},
"status": {
"enum": [
"queued",
"running",
"cancelling",
"cancelled",
"completed",
"failed"
],
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Substring to search for, e.g. 'plumb'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"description": "Substring to search for, e.g. 'plumb'."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| query* | string | An exact Google Maps category, e.g. 'Plumber'. Verify it with mapsdata_search_categories first. |
| cities | array | Named cities instead of whole regions. |
| states | array | Full region names, e.g. ['Texas']. Not abbreviations. Use this or cities, not both. |
| country | string | |
| dry_run | boolean | Validate against every rule and return the plan WITHOUT starting a scrape or spending quota. |
| list_name | string | Label for the list. Defaults to the query. |
| total_limit* | integer | 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. |
{
"type": "object",
"required": [
"query",
"total_limit"
],
"properties": {
"query": {
"type": "string",
"description": "An exact Google Maps category, e.g. 'Plumber'. Verify it with mapsdata_search_categories first."
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"state"
],
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "Full region name."
}
}
},
"description": "Named cities instead of whole regions."
},
"states": {
"type": "array",
"items": {
"type": "string"
},
"description": "Full region names, e.g. ['Texas']. Not abbreviations. Use this or cities, not both."
},
"country": {
"enum": [
"au",
"ca",
"uk",
"us"
],
"type": "string",
"default": "us"
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "Validate against every rule and return the plan WITHOUT starting a scrape or spending quota."
},
"list_name": {
"type": "string",
"description": "Label for the list. Defaults to the query."
},
"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."
}
}
}