google-maps-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | JSON log lines on stderr; tool arguments are never logged, only short hashes | INFO |
| MAPS_HOST | No | HTTP listen address when --host is not given (the Docker image sets it to 0.0.0.0) | 127.0.0.1 |
| MAPS_LANGUAGE | No | Language of names and instructions | en |
| MAPS_BUDGET_TZ | No | The time zone whose midnight resets the budgets | UTC |
| MAPS_CANARY_TO | No | Destination of the status check's walk; must be a place id with opening hours | Albertina |
| MAPS_STATE_DIR | No | Directory for budgets, breaker and Google's consent cookies (default is a per-user state dir; the image uses /state) | |
| MAPS_CANARY_FROM | No | Origin of the status check's walk | Wien Hauptbahnhof |
| MCP_BEARER_TOKEN | Yes | Accepted bearer token(s), comma-separated, each at least 32 characters. Required for the HTTP transport. | |
| MAPS_MIN_INTERVAL_S | No | Minimum seconds between requests (jittered ±30%) | 1.0 |
| MAPS_DAILY_TILE_BUDGET | No | Map tiles per day for maps_static_map | 3000 |
| MAPS_REQUEST_TIMEOUT_S | No | Per-request timeout in seconds | 15 |
| MAPS_DAILY_REQUEST_BUDGET | No | Requests to google.com per day, all tools together | 1000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| maps_search_placesB | Find places like Google Maps search (Places API searchText shape): {places: [{id, displayName, formattedAddress, location, googleMapsUri, primaryTypeDisplayName, categories, rating, userRatingCount, internationalPhoneNumber, nationalPhoneNumber, websiteUri, priceLevel, priceRangeText, timeZone, currentOpeningHours, hoursStatusText, reservationLinks [{uri, provider}], menuUri}]}. reservationLinks are the booking sites Google lists (provider: the site's domain, e.g. sevenrooms.com), empty when none. Put the city in textQuery or pass latitude/longitude. |
| maps_get_placeA | One place by id (Places API Place shape, same fields as maps_search_places), with currentOpeningHours for the next 7 days: dated periods, weekdayDescriptions, openNow, nextOpenTime/nextCloseTime and holidays, plus reservationLinks [{uri, provider}] and menuUri. |
| maps_compute_routeB | Travel time and distance through the stops in order (Routes API computeRoutes shape): {travelMode, routes: [{description, distanceMeters, duration, staticDuration, localizedValues, durationWithoutTraffic, durationRange, departureTime, arrivalTime, legs: [{distanceMeters, duration, staticDuration, startLocation, endLocation, localizedValues}]}], waypoints: [{query, displayName, formattedAddress, placeId, location}], googleMapsUri, condition, note}. duration is in traffic for DRIVE (now or at departureTime/arrivalTime), otherwise typical. includeSteps fills legs[].steps [{distanceMeters, staticDuration, startLocation, navigationInstruction {maneuver, instructions}, localizedValues, notices}] and legs[].segments [{instructions, distanceMeters, staticDuration, firstStepIndex, stepCount}]; includePolyline fills routes[].polyline {encodedPolyline}. |
| maps_compute_route_matrixA | Duration and distance for every origin x destination pair, at most 25 pairs; each pair is one Google request (Routes API computeRouteMatrix element shape): {travelMode, elements: [{originIndex, destinationIndex, status, condition, distanceMeters, duration, staticDuration, localizedValues}]}. Identical origin and destination cost nothing. |
| maps_static_mapA | A map image like the Static Maps API: an area (center + zoom), pins and/or a route line, drawn on Google Maps tiles. Without center or zoom the view fits the pins and route. Returns a JSON legend {center, zoom, size, maptype, markers [{label, query, displayName, location, …}], route {travelMode, condition, description, distanceMeters, duration, googleMapsUri}, missingTiles, attribution} and the JPEG. |
| maps_plan_routeC | Plan a multi-stop route: {travelMode, optimized, order (indices of stops in the chosen order), ordersCompared, savedVsGivenOrder, description, distanceMeters, duration, durationWithDwell, departureTime, arrivalTime, timeZone, stops [{label, role, inputIndex, query, displayName, formattedAddress, placeId, location, arrivalOffset, arrivalTime, dwellMinutes, departureTime, openingStatus {state, text, hours}, rating, category}], legs [{from, to, distanceMeters, duration, staticDuration}], warnings, googleMapsUri}. Without departureTime the plan starts now. |
| maps_show_routeA | Show a route to the person as a card: interactive map with the route and lettered pins, total time and distance, the stops with arrival times and open/closed status, turn-by-turn steps per leg, and an "Open in Google Maps" button (claude.ai and ChatGPT draw it). Same facts as maps_plan_route. Use it whenever you give directions or a route. |
| maps_show_placesA | Show places to the person as cards: photo, rating, category, open now, today's hours, holiday notices, address, phone, website, reserve, directions and Map links, your note, plus a map with lettered pins (claude.ai and ChatGPT draw them). Use it whenever you recommend or compare places; ids come from maps_search_places. |
| maps_statusA | Version, daily request and tile budgets left, breaker, last error and cache size. With check=true, also {canary: {ok, code, checked_at, cached}}: one real route, one place read and one map tile, cached 55 min (5 min after a transient failure); ok is false on any error. Never fails. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| maps-view | Route and place cards (interactive map, stops, steps, photos, hours) for maps_show_*. |
TDQS
Scored across 9 tools
Most tools map to distinct operations, but maps_compute_route and maps_plan_route both compute multi-stop travel times with substantially overlapping output fields, and maps_show_route is explicitly described as carrying the 'same facts as maps_plan_route,' so an agent can easily pick the wrong one when it only needs data or only needs a card. The descriptions do provide guidance ('Use it whenever you give directions'), which keeps this from being worse than moderate overlap.
All tools share a consistent maps_ prefix and mostly follow verb_noun (get_place, search_places, compute_route, plan_route, show_places). The only deviations are the noun-only maps_static_map and maps_status, which are minor and still unsurprising.
Nine tools is well within a comfortable range and each one earns its place: place lookup/search/rendering, route compute/plan/render, a matrix variant, a static image, and diagnostics. No obviously redundant or filler tools.
The surface covers the core Maps workflows: place discovery and detail, routing (single, multi-stop with optimization and dwell), pairwise matrices, map imagery, and a health/budget check. Minor gaps remain, such as address geocoding/autocomplete as first-class operations and route alternatives, but agents can work around these via textQuery search.