HasData

Google Maps MCP Server

Connect your AI agents to HasData's Google Maps MCP server. Scrape local packs, place details with phone and hours, and reviews with photos in structured JSON over streamable HTTP.

https://mcp.hasdata.com/api/mcp?apis=google_maps
Transport
Streamable HTTP
Auth
OAuth or API key
Tools
6 Google Maps tools
Price
5–10 credits / call
Get API Key Read the docs 1,000 free credits. No credit card required.
Data teams at
ClientsClients
Playground

See the Google Maps MCP server in action

Select a sample prompt to inspect the tool it chooses and the JSON payload your agent receives.

Google Maps · 6 tools Enter to send
Find dental clinics in central Austin
google_maps_search · 200 OK sample call
Twenty in the local pack. Top three by rating:
Austin Emergency Dental · 5.0 (813) · (737) 747-4646
Emergency Dentist of Austin · 4.8 (1,505) · (512) 961-6200
Swish Dental Downtown · 4.5 (973) · (512) 713-1099
Each row carries a placeId, a dataId and a kgmid, plus the address, the website and the opening hours.
google_maps_search { "q": "dental clinic Austin", "ll": "@30.2672,-97.7431,12z" }
{
"url": "https://api.hasdata.com/scrape/google/maps/search?q=dental+clinic+Austin",
"status": 200,
"json": { "localResults": [
{ "position": 1, "title": "Swish Dental Downtown",
"placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ",
"dataId": "0x8644b5b434046875:0x644e6eb422388b7a",
"phone": "(512) 713-1099", "rating": 4.5, "reviews": 973,
"address": "201 W 5th St Ste 175, Austin, TX 78701", "type": "Dentist" }
] }
}
Find dental clinics in central Austin
google_maps_search · 200 OK sample call
Twenty in the local pack. Top three by rating:
Austin Emergency Dental · 5.0 (813) · (737) 747-4646
Emergency Dentist of Austin · 4.8 (1,505) · (512) 961-6200
Swish Dental Downtown · 4.5 (973) · (512) 713-1099
Each row carries a placeId, a dataId and a kgmid, plus the address, the website and the opening hours.
google_maps_search { "q": "dental clinic Austin", "ll": "@30.2672,-97.7431,12z" }
{
"url": "https://api.hasdata.com/scrape/google/maps/search?q=dental+clinic+Austin",
"status": 200,
"json": { "localResults": [
{ "position": 1, "title": "Swish Dental Downtown",
"placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ",
"dataId": "0x8644b5b434046875:0x644e6eb422388b7a",
"phone": "(512) 713-1099", "rating": 4.5, "reviews": 973,
"address": "201 W 5th St Ste 175, Austin, TX 78701", "type": "Dentist" }
] }
}
Tell me everything about Swish Dental Downtown in Austin
google_maps_place · 200 OK sample call
4.5 across 973 reviews. Closed right now, opens 8 AM.
201 W 5th St Ste 175, plus code 7783+XW. Site is swishsmiles.com.
Ten category labels, starting at Dentist and Cosmetic dentist.
It identifies as women-owned, and the response also carries a menu and a review summary.
google_maps_place { "placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ" }
{
"url": "https://api.hasdata.com/scrape/google/maps/place?placeId=ChIJdWgENLS1RIYReos4IrRuTmQ",
"status": 200,
"json": { "placeResults": {
"title": "Swish Dental Downtown", "rating": 4.5, "reviews": 973,
"openState": "Closed · Opens 8 AM", "plusCode": "7783+XW Austin, Texas",
"website": "https://www.swishsmiles.com/location/downtown",
"types": ["Dentist", "Cosmetic dentist"],
"serviceOptions": ["Identifies as women-owned"]
} }
}
What do the newest reviews of Swish Dental Downtown say?
google_maps_reviews · 200 OK sample call
Eight on the first page, and a topic breakdown with them.
Invisalign comes up in 20 reviews, "second opinion" in 12.
That topic list is what tells you which subject to read about before you read a single review.
google_maps_reviews { "placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ", "sortBy": "newestFirst" }
{
"url": "https://api.hasdata.com/scrape/google/maps/reviews?placeId=ChIJdWgE…&sortBy=newestFirst",
"status": 200,
"json": {
"placeInfo": { "title": "Swish Dental Downtown", "rating": 4.5, "reviews": 973 },
"topics": [
{ "keyword": "invisalign", "mentions": 20 },
{ "keyword": "second opinion", "mentions": 12 }
],
"reviews": [{ "rating": 1, "isoDate": "2026-09-02T05:23:33.977Z", "user": { "name": "…" } }],
"pagination": { "nextPageToken": "Ci8IARInCgoAP72F_EeeVT…" }
}
}
Show me the photos on the Swish Dental Downtown listing
google_maps_photos · 200 OK sample call
Twenty photos on the first page, in three categories.
All, By owner, and one more. Each category has its own id you can filter by.
Every photo comes back twice, as a thumbnail and as the full image.
google_maps_photos { "placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ" }
{
"url": "https://api.hasdata.com/scrape/google/maps/photos?placeId=ChIJdWgENLS1RIYReos4IrRuTmQ",
"status": 200,
"json": {
"categories": [{ "id": "CgIgAQ", "title": "All" }, { "id": "CgIgARICEAE", "title": "By owner" }],
"photos": [{ "thumbnail": "https://lh3.googleusercontent.com/…", "image": "https://…" }],
"pagination": { "nextPageToken": "EvgDKYQi49-NlUMIDwAAAAEAAAMA…" }
}
}
Has Swish Dental Downtown posted any offers on its listing?
google_maps_posts · 200 OK sample call
Four posts, all from the business itself.
"You're in good hands at Swish Dental. Our dentists…"
"A clean, comfortable, and modern environment where…"
The title field is empty on all four, so read the description. Each carries an image and a share URL.
google_maps_posts { "placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ" }
{
"url": "https://api.hasdata.com/scrape/google/maps/posts?placeId=ChIJdWgENLS1RIYReos4IrRuTmQ",
"status": 200,
"json": {
"source": { "name": "Swish Dental Downtown" },
"posts": [
{ "postId": "3888529928603616639", "title": null,
"description": "You're in good hands at Swish Dental. Our dentists…",
"shareUrl": "https://…" }
],
"pagination": { "nextPageToken": "CgsI/I2z0AYQ4KfiDyoA" }
}
}
Does the reviewer who gave Swish Dental one star leave a lot of them?
google_maps_contributor_reviews · 200 OK sample call
Gayatri das has left 41 reviews, at level 4 and 446 points.
The two most recent are both one star, posted four hours ago.
Eighteen seconds apart.
Each review comes back with its own rating and the place it belongs to.
google_maps_contributor_reviews { "contributorId": "110833281186422360993", "num": 50 }
{
"url": "https://api.hasdata.com/scrape/google/maps/contributor-reviews?contributorId=1108332…",
"status": 200,
"json": {
"contributor": { "name": "Gayatri das", "points": 446, "level": 4, "contributions": {} },
"reviews": [
{ "rating": 1, "date": "4 hours ago", "isoDate": "2026-09-02T05:23:33.977Z",
"placeInfo": { "…": "…" }, "reviewId": "Ci9DQUlRQUNvZENodHlj…" }
]
}
}
Tools

The Google Maps tools your agent can call

6 tools

Six tools that chain. Search returns a placeId, and every other tool takes that id, so an agent finds a business once and then reads its details, reviews, photos and posts without searching again.

+ hasdata_google_maps_search_performMapSearch The local pack for a query 4 params 5 creditsTry
Parameters of hasdata_google_maps_search_performMapSearch
ParameterTypeRequiredExample
qstringrequired"dental clinic Austin"
llstringoptional"@30.2672,-97.7431,12z"
startnumberoptional20
hlstringoptional"en"
response
  • position
  • title
  • placeId
  • dataId
  • kgmid
  • phone
  • address
  • website
  • rating
  • reviews
  • type
+ hasdata_google_maps_place_getPlaceDetails One place in full, by placeId 3 params 5 creditsTry
Parameters of hasdata_google_maps_place_getPlaceDetails
ParameterTypeRequiredExample
placeIdstringrequired"ChIJN1t_tDeuEmsRUsoyG83frY4"
domainstringoptional"google.co.uk"
hlstringoptional"en"
response
  • title
  • address
  • phone
  • website
  • types
  • workingHours
  • openState
  • rating
  • reviews
  • plusCode
  • serviceOptions
  • menu
+ hasdata_google_maps_reviews_getMapReviews Reviews of a place, sorted 4 params 5 creditsTry
Parameters of hasdata_google_maps_reviews_getMapReviews
ParameterTypeRequiredExample
placeIdstringoptional"ChIJN1t_tDeuEmsRUsoyG83frY4"
sortByenumoptional"newestFirst"
topicIdstringoptional"cleanliness"
nextPageTokenstringoptional"CAESY0N…"
response
  • placeInfo
  • topics
  • rating
  • date
  • isoDate
  • user
  • images
  • reviewId
+ hasdata_google_maps_photos_getMapPhotos Photos of a place, by category 3 params 5 creditsTry
Parameters of hasdata_google_maps_photos_getMapPhotos
ParameterTypeRequiredExample
placeIdstringoptional"ChIJN1t_tDeuEmsRUsoyG83frY4"
categoryIdstringoptional"menu"
nextPageTokenstringoptional"CAESY0N…"
response
  • categories
  • thumbnail
  • image
  • pagination
+ hasdata_google_maps_posts_getMapPosts A business's own posts and offers 3 params 10 creditsTry
Parameters of hasdata_google_maps_posts_getMapPosts
ParameterTypeRequiredExample
placeIdstringoptional"ChIJN1t_tDeuEmsRUsoyG83frY4"
dataIdstringoptional"0x89c25a…"
nextPageTokenstringoptional"CAESY0N…"
response
  • source
  • postId
  • title
  • description
  • image
  • createdAt
  • postedAt
  • shareUrl
  • postUrl
+ hasdata_google_maps_contributor_reviews_getMapReviews Every review one person has left 3 params 5 creditsTry
Parameters of hasdata_google_maps_contributor_reviews_getMapReviews
ParameterTypeRequiredExample
contributorIdstringrequired"104839261748301946283"
numnumberoptional50
nextPageTokenstringoptional"CAESY0N…"
response
  • contributor
  • rating
  • date
  • isoDate
  • placeInfo
  • reviewId
  • link

Calls cost 5 to 10 credits depending on the tool. Failed calls are not billed.

Connect

One endpoint, any MCP client

Config blocks for Claude Desktop, Cursor, VS Code, Windsurf and Claude Code, in each one’s native format. Authenticate with browser OAuth or an x-api-key header.

Claude Code

zsh — hasdata-google-maps
$claude mcp add --transport http hasdata-google-maps \
> https://mcp.hasdata.com/api/mcp?apis=google_maps \
> --header "x-api-key: YOUR_API_KEY"
· One line, no restart. Run /mcp to confirm 6 tools.
Check the tools are thereIn the session
/mcp
hasdata-google-maps · connected · 6 tools

Cursor

~/.cursor/mcp.json
{
"mcpServers": { "hasdata-google-maps": {
"url": "https://mcp.hasdata.com/api/mcp?apis=google_maps",
"headers": { "x-api-key": "YOUR_API_KEY" }
} }
}
· Add this entry to ~/.cursor/mcp.json. Servers already in the file stay as they are.
· Project-level config also works at .cursor/mcp.json
Check the tools are thereAfter saving the file
Settings → MCP
hasdata-google-maps · 6 tools enabled

Claude Desktop

Recommended · OAuth connector
1.Settings → Connectors → Add custom connector
2.Paste https://mcp.hasdata.com/api/mcp?apis=google_maps
3.Sign in with HasData
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": { "hasdata-google-maps": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.hasdata.com/api/mcp?apis=google_maps",
"--header", "x-api-key:YOUR_API_KEY"]
} }
}
· Add this entry to ~/Library/Application Support/Claude/claude_desktop_config.json. Servers already in the file stay as they are.
· The config file only takes stdio servers, so a static key rides the mcp-remote bridge. On Windows the file lives at %APPDATA%\Claude\claude_desktop_config.json.
Check the tools are thereReopen the app
Settings → Connectors
hasdata-google-maps · connected · 6 tools

VS Code / Copilot

.vscode/mcp.json
{
"servers": { "hasdata-google-maps": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=google_maps",
"headers": { "x-api-key": "YOUR_API_KEY" }
} }
}
· Add this entry to .vscode/mcp.json. Servers already in the file stay as they are.
· Agent mode picks the server up on save.
Check the tools are thereAgent mode
Ctrl/⌘ + Shift + P → MCP: List Servers
hasdata-google-maps · running · 6 tools

Windsurf

~/.codeium/windsurf/mcp_config.json
{
"mcpServers": { "hasdata-google-maps": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=google_maps",
"headers": { "x-api-key": "YOUR_API_KEY" }
} }
}
· Add this entry to ~/.codeium/windsurf/mcp_config.json. Servers already in the file stay as they are.
· Windsurf reads serverUrl, not url. Header auth only.
Check the tools are thereIn Cascade
Cascade → MCP servers
hasdata-google-maps · 6 tools

Codex CLI

~/.codex/config.toml
[mcp_servers.hasdata-google-maps]
url = "https://mcp.hasdata.com/api/mcp?apis=google_maps"
env_http_headers = { "x-api-key" = "HASDATA_API_KEY" }
· Add this entry to ~/.codex/config.toml. Servers already in the file stay as they are.
· TOML, not JSON. Codex reads the key from the HASDATA_API_KEY environment variable, so export it in the shell that starts Codex.
Check the tools are thereIn the terminal
codex mcp list
hasdata-google-maps · 6 tools

Raw HTTP / curl

zsh — hasdata-google-maps
$curl -N https://mcp.hasdata.com/api/mcp?apis=google_maps \
> -H "x-api-key: YOUR_API_KEY" \
> -H "Content-Type: application/json" \
> -H "Accept: application/json, text/event-stream" \
> -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
· Fallback for any client not listed. Streamable HTTP wants both Accept types, and leaving one out returns 406.
Check the tools are thereCall it yourself
curl … tools/list
{ "tools": [ … 6 items ] }
Scope

Google Maps plus whatever else you need

Name the services in the query string and the server exposes only their tools. Every one draws from the same key and the same balance.

Google Maps 6 tools See the full MCP server →
https://mcp.hasdata.com/api/mcp?apis=google_maps,yelp,yellowpages
11tools in your server
Build vs Buy

Free on GitHub, paid in hours

Anyone can clone a free MCP to scrape Google Maps. Whether that stays free depends on the shape of your project.

Scenario

A script I run once

Self-hosted from GitHubyour machine, your upkeep
$0/ mo, runs locally
+ 3–6 h onceof someone’s time
Setup (clone, wire, run)3–6 h once
Markup changesnot yet
Retries and concurrencynot needed
Proxy and hosting$0
Nothing to own. You get the answer and delete the folder.
mcp.hasdata.comFree tier
$0/ mo
+ 0 hof someone’s time
Setup one line
Parser upkeep included
Retries and concurrency included
~50 calls 250 of 1,000 credits
The free tier renews every month. No card.
leans self-hosted
Take the free repo
Nothing has to keep working tomorrow, so upkeep never appears. Both cost nothing, so take whichever is already in front of you.

A weekly report

Self-hosted from GitHubyour machine, your upkeep
$0–40/ mo
+ 2–4 h / moof someone’s time
Setup (proxy, hosting, wiring)3–6 h once
Markup changes2–4 h / mo
Retries and concurrency2–4 h once
Proxy and hosting$0–40 / mo
Someone looks at it when the numbers come back wrong, which is how you find out.
mcp.hasdata.comFree tier
$0/ mo
+ 0 hof someone’s time
Setup one line
Parser upkeep included
Retries and concurrency included
~200 calls a month 1,000 of 1,000 credits
Exactly the free tier, so a heavier month moves you to Startup.
dead even
Either works
The repo is free if you have somewhere to run it, ours is free up to the credit ceiling. The two to four hours a month decide it.

A pipeline in production

Self-hosted from GitHubyour machine, your upkeep
$40–120/ mo
+ 6–10 h / moof someone’s time
Setup (proxy, hosting, wiring)3–6 h once
Markup changes2–4 h / mo
Retries, concurrency, rate limits4–8 h once
Proxy and hosting$40–120 / mo
Someone owns this permanently, and it is never the top of their list.
mcp.hasdata.comStartup, 200K credits, 5 concurrent
$49/ mo
+ 0 hof someone’s time
Setup one line
Parser upkeep included
Retries and concurrency included
10,000 calls 50K of 200K credits
A quarter of the plan used, and the rest is headroom.
leans hosted
Use the hosted server
The proxy and hosting bill alone is in the range of the whole plan, and that is before anyone spends the six to ten hours.

A feature in my product

Self-hosted from GitHubyour machine, your upkeep
$300+/ mo
+ on-callof someone’s time
Setup (proxy, hosting, wiring)3–6 h once
Markup changes, plus on-call2–4 h / mo
Retries, concurrency, rate limitsongoing
Proxy and hosting$300+ / mo
The thing your customers touch depends on one volunteer's spare evening.
mcp.hasdata.comBasic, 1M credits, 15 concurrent
$99/ mo
+ 0 hof someone’s time
Setup one line
Parser upkeep included
Retries and concurrency included
100,000 calls 500K of 1M credits
Same endpoint at ten calls and at ten million. One invoice.
leans hosted
Use the hosted server
A third of the price, and nobody has to carry a pager for a dependency your customers touch.
Pricing

One balance, every interface

A flat monthly price against a known credit ceiling. Move up a plan when you outgrow it.

Free
$0 /mo
Free forever
200 tool calls / month
1,000 credits / month
1 concurrent request
Every MCP tool on every plan
Failed calls are not billed
One balance across MCP and REST
Community support
Start free
Startup
$49 /mo
$1.23 / 1k tool calls
40K tool calls / month
200K credits / month
5 concurrent requests
Every MCP tool on every plan
Failed calls are not billed
One balance across MCP and REST
Email support
Get started
Basic
Recommended
$99 /mo
$0.50 / 1k tool calls
200K tool calls / month
1M credits / month
15 concurrent requests
Every MCP tool on every plan
Failed calls are not billed
One balance across MCP and REST
Priority email support
Get started
Growth
$208 /mo
$0.35 / 1k tool calls
3M credits / month
50 concurrent requests
Every MCP tool on every plan
Failed calls are not billed
One balance across MCP and REST
Dedicated account manager
Get started
Monthly tool call volume
Free 200K 1M 4M
Best fit
Basic
tool calls / mo
200K
Concurrency
15
$ / 1k tool calls
$0.50
$99 /mo
Get Started
Enterprise
Custom price based on required volume

Past 20M credits a month, or terms the self-serve plans do not cover. We shape the contract around your workload.

Credits rollover
Unused credits carry into the next billing period.
Concurrency 2000+
Parallel request limits set to your peak load.
#1 request priority
Highest speed, always first in the queue.
Personal manager
A direct line to the founding team.
SSO
SAML single sign-on for the whole team.
SOC-2 compliance
Security review, DPA, and audit reports.
Talk to sales Quote within one business day
FAQ

Before you wire it in

Do I need a Google Cloud project or a Places API key?

No. The only credential is your HasData key. Every tool reads the public Google Maps pages a signed-out visitor sees, so there is no billing account to enable and no per-field pricing to model.

Why does one tool cost more than the others?

Because they are separate endpoints with separate costs. Five of the six bill 5 credits per successful call and the posts tool bills 10. The table above states the figure per tool rather than quoting one number for the whole server.

How do the six tools fit together?

Search is the entry point and returns a <code>placeId</code> for each result. Details, reviews, photos and posts all take that id, so an agent searches once and then reads as deep as it needs on a specific business.

Why is placeId not marked required on some tools?

Because those tools accept either a <code>placeId</code> or a <code>dataId</code>, and the schema cannot express one-of-two. Send one of them. Sending neither returns an error rather than a random place.

Can I read every review a single person has written?

Yes, that is the contributor tool. Give it a contributor id and it returns their whole review history with the place each one is attached to, which is how patterns across a reviewer’s activity become visible.

How fresh is the data? Is anything cached?

Every tool call fetches the page at that moment, so hours and ratings are current. Nothing is served from a cache.

How many calls can run in parallel?

One on the free tier, five on Startup, fifteen on Basic, and fifty on Growth. The larger Growth volumes raise it to 200, 300 and 500.

What happens when I run out of credits?

Nothing is charged on top of the plan. Calls stop until the billing cycle renews.

Does it work with Claude Desktop, Cursor, VS Code and Claude Code?

Yes, all four, plus anything else that speaks MCP over streamable HTTP. Claude Desktop connects through OAuth, and the rest take the URL and an API key header.

Is HasData affiliated with Google?

No. HasData is an independent service and is not affiliated with, endorsed by, or sponsored by Google LLC. Google Maps is a trademark of its respective owner.