maps-fetcher-mcp
Fetches any Google Maps place by link, retrieving full business metadata and all gallery photos and videos at maximum resolution.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@maps-fetcher-mcpGet everything for this place: https://maps.app.goo.gl/abc"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
maps-fetcher-mcp
MCP server + CLI: fetch any Google Maps place by link — full business metadata plus ALL gallery photos and videos at max resolution.
Install
pip install maps-fetcher-mcp # or: uv pip install maps-fetcher-mcp
maps-fetcher-setup # one-time: browser download (~120MB)Related MCP server: Local Business Data MCP Server
Use as an MCP server (any MCP client)
{
"mcpServers": {
"maps_fetcher": {
"command": "maps-fetcher-mcp"
}
}
}Works in: Hermes Agent, Claude Desktop, Cursor, opencode, Cline, Zed — anything that speaks MCP (stdio).
Use as a CLI
maps-fetcher "https://maps.app.goo.gl/XXXX" # everything
maps-fetcher "https://maps.app.goo.gl/XXXX" --include info # metadata only (~20s)
maps-fetcher "https://maps.app.goo.gl/XXXX" --include photos
maps-fetcher "https://maps.app.goo.gl/XXXX" --include videos
maps-fetcher --list # what's been fetchedTools exposed (MCP)
Tool | Purpose | Typical time |
| metadata only: name, phone, rating, address, hours, coords | ~20s |
| media only ( | 40-220s |
| one-shot everything ( | 60-220s |
| previously fetched places | instant |
Same place re-fetched within 24h reuses the scrape (~2s).
What it handles
Short links resolved + canonicalized; search links rejected cleanly
Video tiles disguised as photos; DASH/HLS manifests muxed with audio
Expired URLs, avatar junk, motion-blur frames, perceptual duplicates (quarantined, not deleted), gapless file numbering
Nondeterministic gallery lazy-loading: scrape retried and merged
Bot-wall detection (reCAPTCHA / unusual-traffic) with clean errors; stealth browser via Patchright, plain Playwright fallback
Security: google-host allowlist for all media downloads, per-file and per-place size caps, decompression-bomb guard, no secrets
Output
<root>/<place-slug>/
photos/photo_01.jpg ... videos/video_01.mp4 ... quarantine/
info_pw.json contact_sheet.jpgDefault root: /mnt/d/Projects/maps-data-fetcher/places (WSL layout;
override with output_dir or MAPS_FETCHER_ROOT).
Limits
Unofficial scraping — good for batch collection at low volume. Google markup changes can break it (fixes usually small). Not for high-volume production; use the paid Google Places API for that. CAPTCHAs are detected and reported, not auto-solved.
Dev
Source layout: maps_fetcher/core.py (engine), mcp_server.py (MCP
tools), cli.py (CLI), setup.py (browser install helper).
Available Tools
4 toolsfetch_maps_placeA
Fetch a Google Maps place by link (maps.app.goo.gl/... or full google.com/maps URL). Downloads gallery media at max resolution plus business metadata (name, phone, website, rating, address, plus code, hours, coordinates).
Args: url: Google Maps place link (single place only, not search links). output_dir: optional root directory (default: /mnt/d/Projects/maps-data-fetcher/places). A per-place subfolder is created with photos/, videos/, info_pw.json, contact_sheet.jpg. include: "all" (default) | "info" (metadata only, fast) | "photos" | "videos" | "media" (photos+videos). meta_only: deprecated alias for include="info".
Returns JSON summary: place data, media counts, output paths. Typical run: info ~20-40s, full fetch 60-220s.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| include | No | all | |
| meta_only | No | ||
| output_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that it downloads at 'max resolution', creates a subfolder with specific files, returns a JSON summary, and provides typical run times. It also notes the deprecated meta_only alias. This is transparent about core behavior. It omits edge cases like invalid URLs or missing media, but the essential behavioral traits are well covered, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear first sentence for purpose, followed by an Args list, and then return/timing info. The inclusion of a very specific default path ('/mnt/d/Projects/maps-data-fetcher/places') is an implementation detail that may not be relevant to an agent, slightly reducing conciseness. Overall, it is efficient and front-loaded, but not perfectly lean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, absence of annotations, and presence of an output schema, the description covers all essential aspects: what the tool does, input requirements, behavior (downloads, creates files), output format, and performance expectations. It even documents the deprecated alias. The existence of the output schema excuses the lack of detailed return structure. No critical information is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so thoroughly: each parameter (url, output_dir, include, meta_only) is documented with types, defaults, and allowed values. The include parameter's options are enumerated, the output_dir default is given, and meta_only's deprecated status is noted. This adds substantial meaning beyond the bare schema, fully compensating for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb ('Fetch a Google Maps place by link'), the resource (a Google Maps place URL), and the scope (downloads media and metadata). It clearly distinguishes itself from siblings by combining both info and media in one call, and it lists the exact metadata fields and media types. An agent can understand exactly what this tool does and how it differs from get_place_info or get_place_media.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on the input format ('single place only, not search links') and the include parameter allows partial fetches, which implies alternative usages (e.g., 'info' only). However, it does not explicitly name alternative tools or state when to prefer a sibling over this one. The guidance is implied through the include options rather than stated as a routing decision, so it scores at the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_place_infoA
Fast metadata-only fetch: name, phone, website, rating, address, plus code, hours, coordinates. No media downloaded. Use when the agent only needs business info. ~20-40s.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| output_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It clearly states 'No media downloaded' (a key side-effect avoidance) and emphasizes 'metadata-only' fetch, implying a read operation. The time estimate (~20-40s) adds performance context. While it does not mention error handling, pagination, or rate limits, the explicit 'no media' behavior and simplicity of the operation justify a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences. The core purpose and key differentiator ('No media downloaded') are front-loaded, and the use condition is clearly stated. Every sentence adds value; the time estimate is optional but not wasteful. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description lacks essential context for calling the tool correctly. The 'output_dir' parameter is unexplained, and there is no clarification on the URL format or the tool's scope (e.g., whether it returns a single place or handles multiple). The exclusion of annotations and 0% schema descriptions place the burden on the description, which it only partially meets. The description is adequate for a basic call, but the ambiguity around output_dir and input expectations makes it incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It fails to do so: it does not mention that 'url' is the required input or what it should contain (e.g., a Google Maps URL), and 'output_dir' is completely unexplained—its purpose is ambiguous despite a default value. The description lists returned fields but provides no guidance on how to set parameters, leaving the agent without sufficient context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches metadata-only business info and lists exact fields (name, phone, website, rating, address, plus code, hours, coordinates). The phrase 'No media downloaded' explicitly differentiates it from the media-focused sibling, and the use-case ('only needs business info') further distinguishes it. The verb 'fetch' plus specific resource makes it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear condition for use: 'Use when the agent only needs business info.' It also implies when not to use (e.g., when media is needed) by stating 'No media downloaded.' However, it does not name alternative sibling tools or explicitly contrast with fetch_maps_place or list_maps_places, so it lacks a fully explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_place_mediaA
Media-only fetch: downloads gallery photos and/or videos, skips verbose metadata in the response. Use when the agent only needs the images/videos.
Args: kind: "both" (default) | "photos" | "videos". Returns JSON: place name, counts, output dirs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| kind | No | both | |
| output_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description must carry the disclosure burden. It does mention that it downloads media and returns output directories, implying file writes, but it does not disclose authentication requirements, potential failure modes, or whether the operation is read-only (it likely is). The description provides some transparency but not full behavior context for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: the purpose and usage are stated in the first two sentences, and the Args section is a compact, structured list. No fluff, no redundancy. It is efficiently front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 3 parameters and an output schema, the description covers the core purpose, usage, and kind parameter. However, it leaves gaps: output_dir is never explained, error handling is absent, and side effects (file writes) are only hinted at via 'output dirs.' Given no annotations, the tool would benefit from a bit more detail to be fully complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'kind' parameter with its allowed values and default. However, it does not explain 'url' (though semantically obvious from the tool name) or 'output_dir' (implied from the return value but not explicitly defined). The partial coverage is useful but incomplete for the undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: downloads gallery photos and/or videos, and explicitly frames it as 'media-only fetch' that skips verbose metadata. This distinguishes it from siblings like get_place_info (metadata) and fetch_maps_place (generic fetch), so an agent can tell it apart instantly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use when the agent only needs the images/videos,' which gives a clear condition for selection. It does not name alternative tools explicitly, but the framing implies that for metadata or other data, other tools should be used. This is clear context, though it could be improved by naming exact siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_maps_placesC
List previously fetched places under the output root with photo/video counts and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for disclosing behavior. It implies a read-only listing but never explicitly states safety, side effects, or what happens if output_dir is invalid. This gap is significant for a tool with no annotation guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core purpose ('List previously fetched places') and adds supplemental details (counts, metadata). Every word contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a defined output schema, return values need not be described, but the description omits critical operational context such as whether output_dir is required, its default behavior, or any expected directory structure. The tool is simple, but the lack of parameter clarity and usage guidance reduces completeness to a marginal level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only hints at 'output root' without explicitly tying it to the output_dir parameter. It does not explain the format, defaults, or constraints of output_dir, leaving the agent to guess its meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'previously fetched places', and specifies it includes photo/video counts and metadata. It distinguishes itself from siblings like fetch_maps_place (which fetches new places) by emphasizing 'previously fetched'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like get_place_info or get_place_media. It does not mention exclusions or preconditions, leaving the agent to infer that it is for browsing accumulated results without explicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
fetch_maps_place - First observed
get_place_info - First observed
get_place_media - First observed
list_maps_places
TDQS
Scored across 4 tools
There is significant overlap: fetch_maps_place with include='info' does exactly what get_place_info does, and with include='media' does what get_place_media does. While the descriptions clarify the intended use cases, an agent may struggle to pick the right tool since fetch_maps_place is a superset. The tools are not clearly distinct in purpose.
The naming mixes conventions: 'get_place_info' and 'get_place_media' follow a get_place_N pattern, but 'fetch_maps_place' uses a different verb (fetch) and noun order, and 'list_maps_places' uses plural. The pattern is not consistent across all tools, though the tools are readable.
At 4 tools, the server is well-scoped for a maps fetcher. However, the presence of get_place_info and get_place_media is redundant given fetch_maps_place can achieve the same via its include parameter, suggesting the count could be trimmed to 2–3 tools without losing functionality.
The core lifecycle for fetching Google Maps place data is covered: retrieving metadata, media, or both, plus listing previously fetched places. There are no obvious dead ends for the stated purpose. Missing delete/update operations are not essential for a fetcher, so the surface feels complete.
Maintenance
Related MCP Connectors
Google Maps places, reviews, contributor history, photos and posts as JSON. No Google Cloud.
Live Google Maps business search, review, and photo data for AI agents over MCP.
Google Maps MCP Pack — geocoding, places, directions, distance matrix, elevation.
Search, extract, crawl, map, research, scrape 16 platforms, browser automation, proxy — one API key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables web searching via Google Search and AI Mode, plus advanced web scraping capabilities including content extraction in multiple formats, link extraction, and batch scraping of multiple URLs.6 npmMIT
- AlicenseBqualityDmaintenanceEnables access to Google Maps business data including search, reviews, photos, and geocoding. Supports searching businesses by location, area, or coordinates, retrieving detailed business information, reviews, and performing reverse geocoding operations.13MIT
- FlicenseNot gradedqualityDmaintenanceEnables advanced web crawling and content extraction with JavaScript support, AI-powered analysis, PDF/Office document processing, YouTube transcript extraction, Google search integration, and multi-format data export capabilities.2-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to search and scrape Google Maps places data (name, rating, address, etc.) directly without an API key.-