{
  "data": {
    "a": {
      "slug": "google-maps-platform",
      "name": "Google Maps Platform + Grounding Lite MCP",
      "vendor": "Google",
      "vendorUrl": "https://mapsplatform.google.com",
      "kind": "http-api",
      "category": "maps",
      "summary": "Geocoding, Places API (New) for text, nearby and detail search, Routes for routes and matrices, Address Validation, static maps and map tiles.",
      "url": "https://www.anchorterminal.com/tools/google-maps-platform",
      "markdownUrl": "https://www.anchorterminal.com/tools/google-maps-platform.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/google-maps-platform.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/google-maps-platform.json",
      "dns": "google-maps-platform.grade.anchorterminal.com",
      "repo": "https://github.com/googlemaps/google-maps-services-python",
      "license": "Apache-2.0 (client libraries)",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://maps.googleapis.com",
      "packages": [
        {
          "registry": "npm",
          "name": "@googlemaps/google-maps-services-js"
        },
        {
          "registry": "pypi",
          "name": "googlemaps"
        }
      ],
      "auth": "mixed",
      "authNotes": "An API key per Cloud project. The classic web services (Geocoding, Static Maps) take it as the key query parameter, Places API (New), Routes and the Maps Experience agent tools (formerly Maps Grounding Lite) take it in the X-Goog-Api-Key header. Places API (New) also accepts OAuth 2.0 with per-method scopes, and the agent tools accept OAuth 2.0 with the maps-platform.mapstools scope. A Maps Demo Key works without billing for prototyping on a limited set of APIs.",
      "pricing": "usage",
      "pricingNotes": "Billed per 1,000 events with a free monthly cap on each SKU, 10,000 for Essentials, 5,000 for Pro and 1,000 for Enterprise SKUs. First-tier prices are Geocoding $5, Place Details Essentials $5, Pro $17 and Enterprise $20, Text Search Pro $32 and Enterprise $35, Nearby Search Pro $32, Autocomplete Requests $2.83, Address Validation Pro $17, Compute Routes and Route Matrix $5, $10 or $15 by tier, Static Maps $2, Dynamic Maps $7 and 2D Map Tiles $0.60. Text Search Essentials (IDs Only) is free with no cap. The Maps Experience agent tools Essentials SKU (formerly Grounding Lite) is $7 per 1,000 after 10,000 free, stepping down to $2.80 above 5 million, and the Pro SKU is $14 per 1,000 after 5,000 free, for allowlisted projects. A Maps Demo Key gives capped, no-cost prototyping without billing (https://developers.google.com/maps/billing-and-pricing/pricing).",
      "priceSummary": "$5 / 1k req",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": 5,
      "popularity": {
        "githubStars": 5000,
        "npmWeekly": 1193020,
        "pypiWeekly": 747555,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://developers.google.com/maps/documentation",
      "capabilities": [
        "geo.geocode",
        "geo.reverse",
        "geo.places",
        "geo.routing",
        "geo.tiles"
      ],
      "tags": [
        "hosted",
        "mcp",
        "official",
        "oauth",
        "typescript",
        "python",
        "card-required",
        "enterprise",
        "closed-source"
      ],
      "lastRelease": "2026-10-23",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 75.4,
        "grade": "BB",
        "agentReady": true,
        "rank": 63,
        "ranked": true,
        "rankOf": 1510,
        "categoryRank": 3,
        "methodology": "0.7",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 85,
          "maintenance": 80,
          "payments": 40,
          "reliability": 90,
          "schema": 77,
          "security": 73,
          "transparency": 72
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-11-01"
        },
        "negative": 0,
        "verdict": "Field masks size every Places and Routes response, a 99.9 per cent SLA covers the core services, and a Maps Demo Key allows prototyping without billing. Production use needs a Cloud billing account set up by a person, classic Geocoding takes the key in the URL, and the terms bar storing coordinates beyond 30 days.",
        "bestFor": "Best when the answer has to match what the user sees in Google Maps, for place details, opening hours and reviews.",
        "strengths": [
          "Maps Experience agent tools (formerly Grounding Lite) are hosted over MCP and take an X-Goog-Api-Key header or OAuth with the maps-platform.mapstools scope",
          "A 99.9 per cent monthly SLA with credits up to 50 per cent",
          "Field masks size responses and pick the SKU, and Text Search Essentials (IDs Only) is free with no cap",
          "A Maps Demo Key covers Places (New), Geocoding v4, Compute Routes, Weather and the agent tools without billing information",
          "A 12-month deprecation policy with a dated deprecations page"
        ],
        "weaknesses": [
          "Free monthly caps beyond the prototyping Demo Key need a Cloud billing account with a payment method",
          "Coordinates may be cached for 30 days at most and only shown on a Google map",
          "No llms.txt at developers.google.com/maps (404 on 1 November)",
          "Classic Geocoding and Static Maps take the key in the URL, and Places (New) also reads `key` and `access_token` from the query string",
          "Places and the agent tools return reviews and AI summaries with no prompt-injection guidance"
        ],
        "agentNotes": [
          "Send X-Goog-FieldMask on every Places (New) and Routes call, since a missing mask is an error and the fields you ask for set the SKU",
          "Resolve a name with Text Search and an IDs-only field mask (free), then fetch details for the one place you need",
          "Store place IDs, refetch details, and drop cached coordinates after 30 days",
          "Leave the agent tools' Pro options (`include_extended_details`, `page_size` above 5, traffic-aware routing) unset unless asked, since allowlisted projects pay $14 per 1,000 for them",
          "Put Google Maps attribution directly after any answer grounded in the agent tools' results"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 2.5,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "BB",
            "methodology": "0.7",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 75.4
          }
        ],
        "editorialScores": {
          "ergonomics": 85,
          "maintenance": 80,
          "payments": 40,
          "reliability": 90,
          "schema": 77,
          "security": 73,
          "transparency": 65
        },
        "provenanceScore": 79,
        "checked": {
          "categories": {
            "ergonomics": "2026-11-01",
            "maintenance": "2026-11-01",
            "payments": "2026-11-01",
            "reliability": "2026-11-01",
            "schema": "2026-11-01",
            "security": "2026-11-01",
            "transparency": "2026-11-01"
          },
          "last": "2026-11-01",
          "lastMoved": "2026-11-01",
          "oldest": "2026-11-01",
          "stale": false,
          "staleAfterDays": 90
        }
      },
      "connect": {
        "http": "curl \"https://maps.googleapis.com/maps/api/geocode/json?address=10%20Downing%20Street%2C%20London\u0026key=$GOOGLE_MAPS_API_KEY\"",
        "claudeCode": "claude mcp add --transport http google-maps https://mapstools.googleapis.com/mcp --header \"X-Goog-Api-Key: $GOOGLE_MAPS_API_KEY\"",
        "config": {
          "mcpServers": {
            "google-maps": {
              "headers": {
                "X-Goog-Api-Key": "${GOOGLE_MAPS_API_KEY}"
              },
              "type": "http",
              "url": "https://mapstools.googleapis.com/mcp"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/geo.geocode",
        "tool": "https://letme.dev/google-maps-platform"
      },
      "sameCompany": [
        "gemini-api",
        "vertex-ai",
        "gemini-embedding",
        "vertex-ai-tuning",
        "cloud-run-gpus",
        "google-model-armor",
        "google-imagen",
        "google-veo",
        "google-lyria",
        "google-speech-to-text",
        "google-cloud-tts",
        "gemini-live",
        "google-adk",
        "google-memory-bank",
        "google-secret-manager",
        "google-cloud-document-ai",
        "google-weather-api",
        "chrome-devtools-mcp",
        "google-cloud-translation",
        "google-calendar-api",
        "firebase-cloud-messaging",
        "google-cloud-storage",
        "google-drive-api",
        "gemini-enterprise",
        "gemini-cli",
        "google-search-console",
        "google-ads-api",
        "google-forms",
        "google-sheets-api",
        "gmail-api",
        "google-people-api"
      ],
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Geocoding",
          "unit": "1k-requests",
          "usd": 5,
          "note": "10,000 free a month"
        },
        {
          "item": "Place Details Essentials",
          "unit": "1k-requests",
          "usd": 5,
          "note": "10,000 free a month"
        },
        {
          "item": "Place Details Pro",
          "unit": "1k-requests",
          "usd": 17,
          "note": "5,000 free a month"
        },
        {
          "item": "Text Search Pro",
          "unit": "1k-requests",
          "usd": 32,
          "note": "5,000 free a month"
        },
        {
          "item": "Autocomplete Requests",
          "unit": "1k-requests",
          "usd": 2.83,
          "note": "10,000 free a month"
        },
        {
          "item": "Compute Routes Essentials",
          "unit": "1k-requests",
          "usd": 5,
          "note": "Pro $10, Enterprise $15"
        },
        {
          "item": "Maps Experience agent tools Essentials",
          "unit": "1k-requests",
          "usd": 7,
          "note": "formerly Grounding Lite, 10,000 free a month, $2.80 above 5 million"
        },
        {
          "item": "2D Map Tiles",
          "unit": "1k-requests",
          "usd": 0.6,
          "note": "100,000 free a month"
        },
        {
          "item": "Maps Experience agent tools Pro",
          "unit": "1k-requests",
          "usd": 14,
          "note": "allowlisted projects, 5,000 free a month"
        }
      ],
      "provenance": {
        "legalEntity": "Google LLC or a regional Google entity, by billing country",
        "domain": "google.com",
        "domainRegistered": "1997-09-15",
        "endpointOnVendorDomain": false,
        "terms": "https://cloud.google.com/maps-platform/terms",
        "privacy": "https://policies.google.com/privacy",
        "statusPage": "https://status.cloud.google.com/maps-platform/",
        "changelog": "https://developers.google.com/maps/documentation/places/web-service/release-notes",
        "securityTxt": "valid",
        "checked": "2026-09-30",
        "notes": [
          "The terms name the contracting party through Google's entity table, and Section 21 lists regional entities for Australia, India, Indonesia and Mexico among others.",
          "The API and MCP endpoints sit on googleapis.com, Google's API domain, not google.com.",
          "google.com/.well-known/security.txt lists security@google.com and expires 2030-04-01.",
          "The Maps Platform terms were last modified 26 August 2026 and the service terms 10 June 2026."
        ],
        "score": 79
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/google-maps-platform.json",
      "live": {
        "slug": "google-maps-platform",
        "probe": {
          "target": "https://maps.googleapis.com",
          "method": "get",
          "lastAt": "2026-11-07T22:55:59.28019699Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 478,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 99.94,
          "p50ms24h": 556,
          "p95ms24h": 1122,
          "samples24h": 244,
          "samples30d": 7956,
          "days": [
            {
              "date": "2026-10-07",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-08",
              "probes": 268,
              "ok": 268
            },
            {
              "date": "2026-10-09",
              "probes": 250,
              "ok": 250
            },
            {
              "date": "2026-10-10",
              "probes": 247,
              "ok": 247
            },
            {
              "date": "2026-10-11",
              "probes": 247,
              "ok": 247
            },
            {
              "date": "2026-10-12",
              "probes": 247,
              "ok": 247
            },
            {
              "date": "2026-10-13",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-14",
              "probes": 249,
              "ok": 249
            },
            {
              "date": "2026-10-15",
              "probes": 253,
              "ok": 253
            },
            {
              "date": "2026-10-16",
              "probes": 252,
              "ok": 252
            },
            {
              "date": "2026-10-17",
              "probes": 253,
              "ok": 253
            },
            {
              "date": "2026-10-18",
              "probes": 256,
              "ok": 256
            },
            {
              "date": "2026-10-19",
              "probes": 255,
              "ok": 255
            },
            {
              "date": "2026-10-20",
              "probes": 252,
              "ok": 252
            },
            {
              "date": "2026-10-21",
              "probes": 253,
              "ok": 252
            },
            {
              "date": "2026-10-22",
              "probes": 253,
              "ok": 253
            },
            {
              "date": "2026-10-23",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-24",
              "probes": 251,
              "ok": 251
            },
            {
              "date": "2026-10-25",
              "probes": 250,
              "ok": 250
            },
            {
              "date": "2026-10-26",
              "probes": 252,
              "ok": 251
            },
            {
              "date": "2026-10-27",
              "probes": 249,
              "ok": 248
            },
            {
              "date": "2026-10-28",
              "probes": 251,
              "ok": 251
            },
            {
              "date": "2026-10-29",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-30",
              "probes": 249,
              "ok": 249
            },
            {
              "date": "2026-10-31",
              "probes": 251,
              "ok": 251
            },
            {
              "date": "2026-11-01",
              "probes": 249,
              "ok": 249
            },
            {
              "date": "2026-11-02",
              "probes": 250,
              "ok": 250
            },
            {
              "date": "2026-11-03",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-11-04",
              "probes": 246,
              "ok": 245
            },
            {
              "date": "2026-11-05",
              "probes": 185,
              "ok": 185
            },
            {
              "date": "2026-11-06",
              "probes": 241,
              "ok": 240
            },
            {
              "date": "2026-11-07",
              "probes": 233,
              "ok": 233
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.cloud.google.com/maps-platform",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-11-07T04:47:51.283863251Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "googlemaps/google-maps-services-python",
            "version": "v4.10.0",
            "released": "2023-01-26",
            "seenAt": "2026-11-06T23:29:37.117890537Z"
          },
          {
            "registry": "npm",
            "name": "@googlemaps/google-maps-services-js",
            "version": "3.4.2",
            "seenAt": "2026-11-06T23:29:36.350307365Z"
          },
          {
            "registry": "pypi",
            "name": "googlemaps",
            "version": "4.10.0",
            "released": "2023-01-26",
            "seenAt": "2026-11-06T23:29:36.825507742Z"
          }
        ],
        "githubStars": 4985,
        "npmWeekly": 1334834,
        "pypiWeekly": 1110419,
        "securityTxt": {
          "url": "https://google.com/.well-known/security.txt",
          "state": "valid",
          "expires": "2030-04-01T00:00:00z",
          "checkedAt": "2026-11-07T16:01:22.068349931Z"
        },
        "domain": {
          "domain": "google.com",
          "registered": "1997-09-15",
          "source": "https://rdap.verisign.com/com/v1/domain/google.com",
          "checkedAt": "2026-11-01T14:17:18.719851913Z"
        },
        "pages": [
          {
            "url": "https://developers.google.com/maps/documentation/places/web-service/release-notes",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-11-07T14:04:09.695330468Z",
            "changedAt": "2026-11-03T07:45:37.584256213Z",
            "fingerprint": "a9f4f0153e37"
          },
          {
            "url": "https://developers.google.com/maps/deprecations",
            "kind": "deprecations",
            "status": 200,
            "checkedAt": "2026-11-07T14:04:07.505483493Z",
            "changedAt": "2026-11-03T07:45:35.692155118Z",
            "fingerprint": "03e43d33d4e8"
          },
          {
            "url": "https://developers.google.com/maps/billing-and-pricing/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-11-07T14:04:06.41094309Z",
            "changedAt": "2026-11-03T07:45:34.349490108Z",
            "fingerprint": "5ced93365bd5"
          },
          {
            "url": "https://cloud.google.com/maps-platform/terms",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-11-07T14:01:18.192695708Z",
            "changedAt": "2026-10-16T22:18:45.593261271Z",
            "fingerprint": "1b2d0f160c72"
          }
        ],
        "mcpTools": {
          "url": "https://mapstools.googleapis.com/mcp",
          "checkedAt": "2026-11-07T01:45:16.836601487Z",
          "status": "ok",
          "note": "answered without the initialize handshake",
          "tools": [
            {
              "name": "search_places",
              "description": "Call this tool when the user's request is to find places, businesses, addresses, locations, points of interest, or any other Google Maps related search.\n\n**Input Requirements (CRITICAL):**\n\n1.  **`text_query` (string - MANDATORY):** The primary search query. This must clearly define what the user is looking for.\n\n    *   **Examples:** `'restaurants in New York'`, `'coffee shops near Golden Gate Park'`, `'SF MoMA'`, `'1600 Amphitheatre Pkwy, Mountain View, CA, USA'`, `'pets friendly parks in Manhattan, New York'`, `'date night restaurants in Chicago'`, `'accessible public libraries in Los Angeles'`.\n\n    *   **For specific place details:** Include the requested attribute (e.g., `'Google Store Mountain View opening hours'`, `'SF MoMa phone number'`, `'Shoreline Park Mountain View address'`).\n\n2.  **`location_bias` (object - OPTIONAL):** Use this to prioritize results near a specific geographic area.\n    *   **Format:** `{\"location_bias\": {\"circle\": {\"center\": {\"latitude\": [value], \"longitude\": [value]}, \"radius_meters\": [value (optional)]}}}`\n\n    *   **Usage:**\n        *   **To bias to a 5km radius:** `{\"location_bias\": {\"circle\": {\"center\": {\"latitude\": 34.052235, \"longitude\": -118.243683}, \"radius_meters\": 5000}}}`\n        *   **To bias strongly to the center point:** `{\"location_bias\": {\"circle\": {\"center\": {\"latitude\": 34.052235, \"longitude\": -118.243683}}}}` (omitting `radius_meters`).\n\n3. **`language_code` (string - OPTIONAL):** The language to show the search results summary in.\n    *   **Format:** A two-letter language code (ISO 639-1), optionally followed by an underscore and a two-letter country code (ISO 3166-1 alpha-2), e.g., `en`, `ja`, `en_US`, `zh_CN`, `es_MX`. If the language code is not provided, the results will be in English.\n\n4. **`region_code` (string - OPTIONAL):** The Unicode CLDR region code of the user. This parameter is used to display the place details, like region-specific place name, if available. The parameter canaffect results based on applicable law.\n    *   **Format:** A two-letter country code (ISO 3166-1 alpha-2), e.g., `US`, `CA`.\n\n**Instructions for Tool Call:**\n\n*   Location Information (CRITICAL): The search must contain sufficient location information. If the location is ambiguous (e.g., just \"pizza places\"), *you must* specify it in the `text_query` (e.g., \"pizza places in New York\") or use the `location_bias` parameter. Include city, state/province, and region/country name if needed for disambiguation.\n\n*   Always provide the most specific and contextually rich `text_query` possible.\n\n*   Only use `location_bias` if coordinates are explicitly provided or if inferring a location from a user's known context is appropriate *and* necessary for better results.\n\n*   The grounded output must be attributed to the source using the information from the `attribution` field when available.\n",
              "inputSchema": {
                "$defs": {
                  "Circle": {
                    "description": "A circle defined by center point and radius.",
                    "properties": {
                      "center": {
                        "$ref": "#/$defs/LatLng",
                        "description": "Required. The center point of the circle."
                      },
                      "radiusMeters": {
                        "description": "The radius of the circle in meters. The radius must be within 50,000 meters.",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "required": [
                      "center"
                    ],
                    "type": "object"
                  },
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "LocationBias": {
                    "description": "The region to bias the search results to. Places outside of this region may still be returned.",
                    "properties": {
                      "circle": {
                        "$ref": "#/$defs/Circle",
                        "description": "Optional. A circle defined by center point and radius. The `radius_meters` is optional. If not set, the results will be biased towards the center point."
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Request message for SearchText.",
                "properties": {
                  "includeExtendedDetails": {
                    "description": "Optional. Includes extended place details in the response. Set this field to `true` when the user request requires rich qualitative insights, real-time dynamics, or specialized entity attributes: - Qualitative reviews, customer sentiment, and feedback. - Specific offerings like menu items, dishes, food specialties, beverages, or business highlights. - Qualitative atmosphere, interior decor, aesthetic, ambience, or mood. - Real-time data and specialized facility specs, visitor policies/tips, wait times. Leave `false` (default) for standard discovery searches (e.g., cuisines, store types), location/address lookups, contact info, operating hours, and standard metadata/amenities. Enabling this field will trigger the Pro tier and incur higher billing cost and higher latency.",
                    "type": "boolean"
                  },
                  "languageCode": {
                    "description": "Optional. The language to request that the summary is returned in. If the language code is unspecified or unrecognized, the summary with a preference for English will be returned. For example, \"en\" for English. Current list of supported languages: https://developers.google.com/maps/faq#languagesupport.",
                    "type": "string"
                  },
                  "locationBias": {
                    "$ref": "#/$defs/LocationBias",
                    "description": "An optional region to bias the search results to. If an explicit location is in `text_query`, it will be used to bias the search results instead of this field."
                  },
                  "pageSize": {
                    "description": "Optional. The maximum number of places to return, up to 5. The service may return fewer than this value. The default value is 5. Requesting more than 5 places will trigger the Pro tier and incur higher billing cost and latency.",
                    "format": "int32",
                    "type": "integer"
                  },
                  "regionCode": {
                    "description": "Optional. The Unicode country/region code (CLDR) of the location where the request is coming from. This parameter is used to display the place details, like region-specific place name, if available. The parameter can affect results based on applicable law. For example, \"US\" for United States. For more information, see https://www.unicode.org/cldr/charts/latest/supplemental/territory_language_information.html. Note that 3-digit region codes are not currently supported.",
                    "type": "string"
                  },
                  "textQuery": {
                    "description": "Required. The text query.",
                    "type": "string"
                  }
                },
                "required": [
                  "textQuery"
                ],
                "type": "object"
              },
              "outputSchema": {
                "$defs": {
                  "Attribution": {
                    "description": "Required attribution to show with maps content.",
                    "properties": {
                      "title": {
                        "description": "The title to display for the attribution.",
                        "type": "string"
                      },
                      "url": {
                        "description": "The URL to link to for the attribution.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "GoogleMapsLinks": {
                    "description": "Links to trigger different Google Maps actions.",
                    "properties": {
                      "directionsUrl": {
                        "description": "A link to show the directions to the place. The link only populates the destination location and uses the default travel mode `DRIVE`.",
                        "type": "string"
                      },
                      "photosUrl": {
                        "description": "A link to show photos of this place on Google Maps.",
                        "type": "string"
                      },
                      "placeUrl": {
                        "description": "A link to show this place.",
                        "type": "string"
                      },
                      "reviewsUrl": {
                        "description": "A link to show reviews of this place on Google Maps.",
                        "type": "string"
                      },
                      "writeAReviewUrl": {
                        "description": "A link to write a review for this place on Google Maps.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "PlaceView": {
                    "description": "A view of a place.",
                    "properties": {
                      "attribution": {
                        "$ref": "#/$defs/Attribution",
                        "description": "Required attribution to show with the place."
                      },
                      "googleMapsLinks": {
                        "$ref": "#/$defs/GoogleMapsLinks",
                        "description": "Links to trigger different Google Maps actions."
                      },
                      "id": {
                        "description": "The place ID of the underlying place.",
                        "type": "string"
                      },
                      "location": {
                        "$ref": "#/$defs/LatLng",
                        "description": "The position of this place."
                      },
                      "place": {
                        "description": "The resource name of the underlying place, in the format of \"places/{id}\".",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Response message for SearchText.",
                "properties": {
                  "contentToken": {
                    "description": "Output only. An encrypted token that encapsulates the search context and can be passed to Google Maps visual rendering services, SDKs, or the Maps Agentic UI Toolkit (A2UI) to display interactive UI components for the returned search results.",
                    "readOnly": true,
                    "type": "string"
                  },
                  "places": {
                    "description": "Output only. The list of places that are mentioned in the summary.",
                    "items": {
                      "$ref": "#/$defs/PlaceView"
                    },
                    "readOnly": true,
                    "type": "array"
                  },
                  "summary": {
                    "description": "Output only. A natural language summary of the search results. The summary may contain zero-based citations like \"[0]\", \"[1]\", \"[2]\" etc. These citations map to the corresponding places in the `places` field.",
                    "readOnly": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "lookup_weather",
              "description": "Retrieves comprehensive environmental intelligence for a location, including Weather, Air Quality (AQI \u0026 pollutants), and Pollen (tree, grass, weed, and plant species allergen levels): current conditions, hourly forecasts/history, and daily forecasts for Weather and Air Quality; Pollen is a daily forecast only (today through +4 days, no hourly or past data).\n**Available Environmental Domains \u0026 Capabilities (`capabilities`: `WEATHER`, `AIR_QUALITY`, `POLLEN` — CRITICAL):**\n*   **Mandatory Explicit Selection:** You **MUST** include at least one of `WEATHER`, `AIR_QUALITY`, or `POLLEN` in `capabilities` on every call. Omitting `capabilities` is **NOT allowed**.\n*   **Broad / Ambiguous Outdoor Queries (Full Ambient Outdoor Suite):** If the user asks a general outdoor, travel, or situational question without restricting to a specific domain (e.g., \"What are outdoor conditions like right now for a run?\"), **explicitly include all three capabilities** (`capabilities: [\"WEATHER\", \"AIR_QUALITY\", \"POLLEN\"]`) to return the complete ambient outdoor suite (Weather + Air Quality + Pollen); for a past `date`/`hour`, leave out `POLLEN`, which has no history.\n*   **Targeted Domain Selection (Specific Queries):** If the user asks specifically for only one or two domains (e.g., \"What is the AQI in Seattle right now?\"), include **only** the requested capabilities (`WEATHER`, `AIR_QUALITY`, and/or `POLLEN`). Only the requested domain(s) will be executed and returned.\n**Specific Data Available by Domain:**\n*   **Weather (`weather`):** Temperature (Current, Feels Like, Max/Min, Heat Index), Wind (Speed, Gusts, Direction), Celestial Events (Sunrise/Sunset, Moon Phase), Precipitation (Type, Probability, Quantity/QPF), and Atmospheric Conditions (UV Index, Humidity, Cloud Cover, Thunderstorm Probability, Air Pressure).\n*   **Air Quality (`air_quality`):** Universal \u0026 Local Air Quality Indexes (AQI value, category, dominant pollutant), Health Recommendations across 7 sensitivity groups, and Pollutant Concentrations (`include_pollutant_concentration: true`). Each index has its own dominant pollutant; report it per index (e.g., don't give the Universal AQI's pollutant for the US AQI).\n*   **Pollen (`pollen`):** Daily Universal Pollen Index (UPI, 0–5) per Tree, Grass, and Weed category and per plant species (`index.value` with its `index.category`, e.g. 1 = \"Very Low\"), in-season status, cross-reactions, and health recommendations.\n*   **Missing Pollen Fields:** a missing `in_season` means not in season. Leave out plant species returned without an `index`, unless the user asks about that plant; then say no pollen data is reported for it today (don't infer a level).\n**Location Rules (CRITICAL):**\nThe target location MUST be specified in `location` using **ONLY ONE** of the following `oneof` sub-fields:\n1.  **Geographic Coordinates (`lat_lng`):**\n    *   Use when exact latitude/longitude coordinates are known.\n    *   Example: `{\"location\": {\"lat_lng\": {\"latitude\": 34.0522, \"longitude\": -118.2437}}}`\n2.  **Place ID (`place_id`):**\n    *   An unambiguous Google Maps Place ID (e.g., obtained from `search_places` or `resolve_names`).\n    *   Example: `{\"location\": {\"place_id\": \"ChIJLU7jZClu5kcR4PcOOO6p3I0\"}}`\n3.  **Address String (`address`):**\n    *   A city/region, neighborhood, landmark or point of interest, street address, or postal code, ideally with the city/country.\n    *   Example: `{\"location\": {\"address\": \"Paris, France\"}}`\n**Time \u0026 Usage Modes (`date` and `hour` — CRITICAL):**\n*   **Local Timezone Reference:** All `date` (`{year, month, day}`) and `hour` (`0-23`) inputs MUST be expressed in the **requested `location`'s local civil time zone** (e.g., a query for `\"Paris tomorrow at 13:00\"` uses `Europe/Paris` local date and hour `13`), never UTC or the caller's time zone.\n*   **1. Current Conditions (`date` omitted AND `hour` omitted):**\n    *   Provide `location` and the target `capabilities` (`WEATHER`, `AIR_QUALITY`, `POLLEN`). Do **NOT** specify `date` or `hour`.\n    *   Returns real-time Current Conditions (`CC`) for the requested domain(s) (current Weather, current-hour Air Quality, and/or today's Pollen forecast).\n    *   For **Air Quality**, Current Conditions is a **single hour**: do **NOT** use it alone to answer air quality or broad outdoor questions about **today** as a whole (use Daily Queries below).\n*   **2. Hourly Forecast / History (`date` specified AND `hour` specified `0-23`):**\n    *   Provide `location`, `date` (`{year, month, day}`), `hour` (`0-23`), and the target `capabilities`. If minutes are mentioned, round down to the nearest hour.\n    *   **CRITICAL CONSTRAINT (`date` is REQUIRED when `hour` is set):** Providing `hour` without `date` (`date` omitted, `hour` set) is **NOT allowed** and will fail with an error. Even when the user asks about a specific hour **today** (e.g., `\"at 13:00 today\"`), you **MUST** populate both `date` (today's date at `location`) and `hour`.\n    *   Executes an hourly lookup for requested Weather and/or Air Quality at `YYYY-MM-DD-HH` and a daily lookup for requested Pollen on `YYYY-MM-DD`.\n    *   **Weather \"when\" questions:** for **weather** questions asking **when / what time / best time** (e.g., `\"what time will it stop raining?\"`), use hourly `WEATHER` calls (`date` + `hour`) for the relevant hours. A daily Weather forecast has no hourly values. For **broad outdoor** \"when / best time\" questions (e.g., `\"when is the best time to go walking today?\"`), make these hourly `WEATHER` calls in addition to the full-day call for Air Quality (and Pollen) described under Daily Queries.\n*   **3. Daily Queries (`date` specified AND `hour` omitted):**\n    *   Provide `location`, `date` (`{year, month, day}` in the requested `location`'s local civil time) without `hour`, and the target `capabilities` for full-day queries (e.g., `\"weather and pollen in London tomorrow\"`).\n    *   **Air Quality and broad outdoor questions about today:** for **air quality** questions and **broad outdoor** questions (which include Air Quality) about **today** (e.g., `\"how will the air quality change today\"`, `\"is today a good day for a picnic?\"`), set `date` to **today's date at `location`** (hour omitted) to get the day's hourly Air Quality series. A Current Conditions call alone returns only the current hour of Air Quality and is not enough; you may add one if the user also asks about \"now\".\n    *   **Air Quality time windows:** for an air quality question about a window within one day (e.g., `\"air quality between noon and 6 PM\"`), prefer **one Daily call** for that date and read the window's hours from the Air Quality series, rather than sampling individual hours. If you use hourly calls, cover **every** hour of the window.\n    *   Returns daily forecasts for requested **Weather** and/or **Pollen**, and the day's hourly **Air Quality** series covering the full local day (00:00–23:00 local): 24 historical hours for a past date, 24 forecasted hours for a future date, and for **today** the earlier hours (history), the current hour, and the remaining hours (forecast).\n**Supported Time Horizons by Domain:**\n*   **Weather:** Hourly from 24 hours ago up to 240 hours (10 days) ahead (past hours need both `date` and `hour`); daily up to 10 days including today (today through +9 days); no daily history.\n*   **Air Quality:** Hourly from 720 hours (30 days) ago up to 96 hours (4 days) ahead; a full-day call must fit inside that window (in practice today −29 days through +3 days).\n*   **Pollen:** Daily only, today through +4 days (5 days including today); no past dates, and `hour` is ignored.\n*   *(Note: If several capabilities are requested and the `date`/`hour` is outside one of their ranges, the call still succeeds and returns only the supported ones.)*\n*   **Out-of-range requests:** If a requested date or hour may be outside a domain's supported range above (e.g., Pollen for a past date), still call `lookup_weather` for the **requested** date/hour; the error states the supported range. Do **not** call a different date, hour, or domain as a substitute.\n**Domain Options \u0026 Attribution:**\n*   **Language (`language_code`):** Optional BCP-47 language code (e.g., `\"fr\"`). Defaults to `\"en\"`.\n*   **Weather Units (`weather_options.units_system` or `units_system`):** Defaults to `METRIC`. Set to `IMPERIAL` (Fahrenheit/mph) if the user implies US standards or explicitly requests Imperial units. Supported in both `weather_options.units_system` (preferred) and top-level `units_system`; if both are specified, they must not conflict.\n*   **Air Quality Options (`air_quality_options`):** Set `include_pollutant_concentration: true` when specific pollutant concentrations (PM2.5, PM10, O3, NO2, SO2, CO) are needed; optionally set `index_region_code` (2-letter ISO country code, e.g., `\"US\"`) to request a specific regional AQI scale. By default, the response includes the Universal AQI and the location's regional AQI.\n*   **Attribution:** Grounded output MUST be attributed to the source using the `attribution` field inside each returned domain container (`weather.attribution`, `air_quality.attribution`, `pollen.attribution`).\n*   **Returned Times:** Air Quality `date_time` values are already in the location's local time (`utc_offset` included); present them as-is. Weather `date_time` (current and hourly) and sunrise/sunset times are UTC; convert them to the location's local time using `time_zone`. Label all times as local.\n",
              "inputSchema": {
                "$defs": {
                  "AirQualityOptions": {
                    "description": "Options specific to air quality requests.",
                    "properties": {
                      "includePollutantConcentration": {
                        "description": "Optional. If true, includes detailed pollutant concentrations and additional information (sources and effects) in the air quality response.",
                        "type": "boolean"
                      },
                      "indexRegionCode": {
                        "description": "Optional. Two-letter ISO 3166-1 alpha-2 country/region code (e.g. \"US\", \"FR\", \"CN\") used to select the preferred local Air Quality Index (AQI) scale alongside the Universal AQI (UAQI). If not specified, defaults to the region of the requested location.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Date": {
                    "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values. * A month and day, with a zero year (for example, an anniversary). * A year on its own, with a zero month and a zero day. * A year and month, with a zero day (for example, a credit card expiration date). Related types: * google.type.TimeOfDay * google.type.DateTime * google.protobuf.Timestamp",
                    "properties": {
                      "day": {
                        "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "month": {
                        "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "year": {
                        "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
                        "format": "int32",
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  },
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "Location": {
                    "description": "Represents a location for the weather request.",
                    "properties": {
                      "address": {
                        "description": "Human readable address or a plus code. See https://plus.codes for details. Only one of the following fields should be set: this field, latLng, placeId.",
                        "type": "string"
                      },
                      "latLng": {
                        "$ref": "#/$defs/LatLng",
                        "description": "A point specified using geographic coordinates. Only one of the following fields should be set: this field, placeId, address."
                      },
                      "placeId": {
                        "description": "The Place ID associated with the location . Only one of the following fields should be set: this field, latLng, address.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "WeatherOptions": {
                    "description": "Options specific to weather requests.",
                    "properties": {
                      "unitsSystem": {
                        "description": "Optional. The units system to use for the returned weather conditions. If not provided, the returned weather conditions will be in the metric system (default = METRIC).",
                        "enum": [
                          "UNITS_SYSTEM_UNSPECIFIED",
                          "IMPERIAL",
                          "METRIC"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "The units system is unspecified.",
                          "The imperial units system (e.g. Fahrenheit, miles, etc).",
                          "The metric units system (e.g. Celsius, kilometers, etc)."
                        ]
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Request for the LookupWeather method - represents the weather conditions at the requested location.",
                "properties": {
                  "airQualityOptions": {
                    "$ref": "#/$defs/AirQualityOptions",
                    "description": "Optional. Options specific to air quality requests. Ignored if `AIR_QUALITY` is not requested in `capabilities`."
                  },
                  "capabilities": {
                    "description": "Optional. The environmental capabilities to include in the response.",
                    "items": {
                      "enum": [
                        "CAPABILITY_UNSPECIFIED",
                        "WEATHER",
                        "AIR_QUALITY",
                        "POLLEN"
                      ],
                      "type": "string",
                      "x-google-enum-descriptions": [
                        "Unspecified capability.",
                        "Weather conditions (temperature, precipitation, wind, UV, etc.).",
                        "Air quality information (AQI, pollutants, and health recommendations).",
                        "Pollen information (tree, grass, weed, and plant species allergen levels)."
                      ]
                    },
                    "type": "array"
                  },
                  "date": {
                    "$ref": "#/$defs/Date",
                    "description": "Optional. Specifies the date of the requested environmental information, relative to the local timezone of the location specified in the `location` field. Supported date ranges depend on the requested capabilities: - `WEATHER`: up to 24 hours in the past (when `hour` is also set) and up to 10 days (240 hours) in the future. - `AIR_QUALITY`: up to 30 days (720 hours) in the past and up to 4 days (96 hours) in the future. - `POLLEN`: current day and up to 5 days in the future (historical dates are not supported)."
                  },
                  "hour": {
                    "description": "Optional. Specifies the hour of the requested environmental information, in 24-hour format (0-23), relative to the local timezone of the location specified in the `location` field. Requires `date` to be specified. Supported hourly ranges depend on the requested capabilities: - `WEATHER`: up to 24 hours in the past and up to 240 hours (10 days) in the future. - `AIR_QUALITY`: up to 30 days (720 hours) in the past and up to 4 days (96 hours) in the future. - `POLLEN`: returns daily forecasts only; `hour` is ignored for pollen.",
                    "format": "int32",
                    "type": "integer"
                  },
                  "languageCode": {
                    "description": "Optional. The BCP-47 language code for localized text in the response (e.g. \"en\", \"ja\", \"fr-CA\"). Defaults to \"en\" if not specified.",
                    "type": "string"
                  },
                  "location": {
                    "$ref": "#/$defs/Location",
                    "description": "Required. The location to get the weather conditions for."
                  },
                  "unitsSystem": {
                    "description": "Optional. The units system to use for the returned weather conditions. If not provided, the returned weather conditions will be in the metric system (default = METRIC).",
                    "enum": [
                      "UNITS_SYSTEM_UNSPECIFIED",
                      "IMPERIAL",
                      "METRIC"
                    ],
                    "type": "string",
                    "x-google-enum-descriptions": [
                      "The units system is unspecified.",
                      "The imperial units system (e.g. Fahrenheit, miles, etc).",
                      "The metric units system (e.g. Celsius, kilometers, etc)."
                    ]
                  },
                  "weatherOptions": {
                    "$ref": "#/$defs/WeatherOptions",
                    "description": "Optional. Options specific to weather requests. `weather_options.units_system` is supported in tandem with top-level `units_system` (tag 4) to preserve backwards compatibility for existing callers; returns INVALID_ARGUMENT if both specify conflicting unit systems. Ignored if `WEATHER` is not requested in `capabilities`."
                  }
                },
                "required": [
                  "location"
                ],
                "type": "object"
              },
              "outputSchema": {
                "$defs": {
                  "AdditionalInfo": {
                    "description": "Sources and health effects of a pollutant.",
                    "properties": {
                      "effects": {
                        "description": "Potential health effects of exposure to the pollutant.",
                        "type": "string"
                      },
                      "sources": {
                        "description": "Main emission sources of the pollutant.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "AirPressure": {
                    "description": "Represents the atmospheric air pressure conditions.",
                    "properties": {
                      "meanSeaLevelMillibars": {
                        "description": "The mean sea level air pressure in millibars.",
                        "format": "float",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "AirQualityHourlyResult": {
                    "description": "Hourly air quality information.",
                    "properties": {
                      "dateTime": {
                        "$ref": "#/$defs/DateTime",
                        "description": "The local date and time in the location's timezone for this hourly air quality entry (consists of `year`, `month`, `day`, `hours`, `minutes`, `seconds`, and `utc_offset`)."
                      },
                      "healthRecommendations": {
                        "$ref": "#/$defs/HealthRecommendations",
                        "description": "Health recommendations for different population groups."
                      },
                      "indexes": {
                        "description": "Air quality indexes (e.g. Universal AQI and local AQI).",
                        "items": {
                          "$ref": "#/$defs/AirQualityIndex"
                        },
                        "type": "array"
                      },
                      "pollutants": {
                        "description": "Detailed pollutant information, populated when `air_quality_options.include_pollutant_concentration` is true.",
                        "items": {
                          "$ref": "#/$defs/Pollutant"
                        },
                        "type": "array"
                      }
                    },
                    "type": "object"
                  },
                  "AirQualityIndex": {
                    "description": "Represents an Air Quality Index (AQI) measurement.",
                    "properties": {
                      "category": {
                        "description": "Textual air quality category (e.g. \"Good air quality\", \"Moderate air quality\").",
                        "type": "string"
                      },
                      "displayName": {
                        "description": "The index's display name (e.g. \"Universal AQI\", \"US EPA AQI\").",
                        "type": "string"
                      },
                      "dominantPollutant": {
                        "description": "The code of the dominant pollutant (e.g. \"pm25\", \"o3\").",
                        "type": "string"
                      },
                      "value": {
                        "description": "Numeric AQI value.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "valueDisplay": {
                        "description": "Formatted string representation of the AQI value.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "AirQualityResultData": {
                    "description": "Air quality payload for the requested location.",
                    "properties": {
                      "attribution": {
                        "$ref": "#/$defs/Attribution",
                        "description": "Required attribution to show with the air quality data."
                      },
                      "hourlyResults": {
                        "description": "Hourly air quality data for the requested time (contains 1 entry for Current Conditions or single-hour queries, up to 24 entries for a past or future date-only query, or current + remaining hours when date is today).",
                        "items": {
                          "$ref": "#/$defs/AirQualityHourlyResult"
                        },
                        "type": "array"
                      }
                    },
                    "type": "object"
                  },
                  "Attribution": {
                    "description": "Required attribution to show with maps content.",
                    "properties": {
                      "title": {
                        "description": "The title to display for the attribution.",
                        "type": "string"
                      },
                      "url": {
                        "description": "The URL to link to for the attribution.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Concentration": {
                    "description": "Concentration measurement of a pollutant.",
                    "properties": {
                      "unit": {
                        "description": "Measurement unit of the concentration.",
                        "enum": [
                          "UNIT_UNSPECIFIED",
                          "PARTS_PER_BILLION",
                          "MICROGRAMS_PER_CUBIC_METER"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "Unspecified concentration unit.",
                          "Parts per billion (ppb).",
                          "Micrograms per cubic meter (µg/m³)."
                        ]
                      },
                      "value": {
                        "description": "Numeric concentration value.",
                        "format": "float",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "DailyPollenForecast": {
                    "description": "Pollen forecast for a single calendar day.",
                    "properties": {
                      "categories": {
                        "description": "Broad pollen category breakdown (Tree, Grass, Weed).",
                        "items": {
                          "$ref": "#/$defs/PollenCategoryInfo"
                        },
                        "type": "array"
                      },
                      "date": {
                        "$ref": "#/$defs/Date",
                        "description": "Civil calendar date of the forecast."
                      },
                      "plantSpecies": {
                        "description": "Granular plant species breakdown.",
                        "items": {
                          "$ref": "#/$defs/PlantSpeciesInfo"
                        },
                        "type": "array"
                      }
                    },
                    "type": "object"
                  },
                  "Date": {
                    "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values. * A month and day, with a zero year (for example, an anniversary). * A year on its own, with a zero month and a zero day. * A year and month, with a zero day (for example, a credit card expiration date). Related types: * google.type.TimeOfDay * google.type.DateTime * google.protobuf.Timestamp",
                    "properties": {
                      "day": {
                        "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "month": {
                        "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "year": {
                        "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
                        "format": "int32",
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  },
                  "DateTime": {
                    "description": "Represents civil time (or occasionally physical time). This type can represent a civil time in one of a few possible ways: * When utc_offset is set and time_zone is unset: a civil time on a calendar day with a particular offset from UTC. * When time_zone is set and utc_offset is unset: a civil time on a calendar day in a particular time zone. * When neither time_zone nor utc_offset is set: a civil time on a calendar day in local time. The date is relative to the Proleptic Gregorian Calendar. If year, month, or day are 0, the DateTime is considered not to have a specific year, month, or day respectively. This type may also be used to represent a physical time if all the date and time fields are set and either case of the `time_offset` oneof is set. Consider using `Timestamp` message for physical time instead. If your use case also would like to store the user's timezone, that can be done in another field. This type is more flexible than some applications may want. Make sure to document and validate your application's limitations.",
                    "properties": {
                      "day": {
                        "description": "Optional. Day of month. Must be from 1 to 31 and valid for the year and month, or 0 if specifying a datetime without a day.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "hours": {
                        "description": "Optional. Hours of day in 24 hour format. Should be from 0 to 23, defaults to 0 (midnight). An API may choose to allow the value \"24:00:00\" for scenarios like business closing time.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "minutes": {
                        "description": "Optional. Minutes of hour of day. Must be from 0 to 59, defaults to 0.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "month": {
                        "description": "Optional. Month of year. Must be from 1 to 12, or 0 if specifying a datetime without a month.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "nanos": {
                        "description": "Optional. Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999, defaults to 0.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "seconds": {
                        "description": "Optional. Seconds of minutes of the time. Must normally be from 0 to 59, defaults to 0. An API may allow the value 60 if it allows leap-seconds.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "timeZone": {
                        "$ref": "#/$defs/TimeZone",
                        "description": "Time zone. Only one of this field or utcOffset should be set."
                      },
                      "utcOffset": {
                        "description": "UTC offset. Must be whole seconds, between -18 hours and +18 hours. For example, a UTC offset of -4:00 would be represented as { seconds: -14400 }. Only one of this field or timeZone should be set.",
                        "format": "google-duration",
                        "type": "string"
                      },
                      "year": {
                        "description": "Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a datetime without a year.",
                        "format": "int32",
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  },
                  "HealthRecommendations": {
                    "description": "Health recommendations tailored to specific population groups.",
                    "properties": {
                      "athletes": {
                        "description": "Guidance for athletes and active outdoor individuals.",
                        "type": "string"
                      },
                      "children": {
                        "description": "Guidance for children.",
                        "type": "string"
                      },
                      "elderly": {
                        "description": "Guidance for the elderly population.",
                        "type": "string"
                      },
                      "generalPopulation": {
                        "description": "Guidance for the general population.",
                        "type": "string"
                      },
                      "heartDiseasePopulation": {
                        "description": "Guidance for individuals with cardiovascular or heart disease.",
                        "type": "string"
                      },
                      "lungDiseasePopulation": {
                        "description": "Guidance for individuals with lung disease or respiratory conditions.",
                        "type": "string"
                      },
                      "pregnantWomen": {
                        "description": "Guidance for pregnant women.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "LocalizedText": {
                    "description": "Localized variant of a text in a particular language.",
                    "properties": {
                      "languageCode": {
                        "description": "The text's BCP-47 language code, such as \"en-US\" or \"sr-Latn\". For more information, see http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.",
                        "type": "string"
                      },
                      "text": {
                        "description": "Localized string in the language corresponding to language_code below.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Location": {
                    "description": "Represents a location for the weather request.",
                    "properties": {
                      "address": {
                        "description": "Human readable address or a plus code. See https://plus.codes for details. Only one of the following fields should be set: this field, latLng, placeId.",
                        "type": "string"
                      },
                      "latLng": {
                        "$ref": "#/$defs/LatLng",
                        "description": "A point specified using geographic coordinates. Only one of the following fields should be set: this field, placeId, address."
                      },
                      "placeId": {
                        "description": "The Place ID associated with the location . Only one of the following fields should be set: this field, latLng, address.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "MoonEvents": {
                    "description": "Represents the events related to the moon (e.g. moonrise, moonset).",
                    "properties": {
                      "moonPhase": {
                        "description": "Optional. The moon phase (a.k.a. lunar phase).",
                        "enum": [
                          "PHASE_UNSPECIFIED",
                          "NEW_MOON",
                          "WAXING_CRESCENT",
                          "FIRST_QUARTER",
                          "WAXING_GIBBOUS",
                          "FULL_MOON",
                          "WANING_GIBBOUS",
                          "LAST_QUARTER",
                          "WANING_CRESCENT"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "Unspecified moon phase.",
                          "The moon is not illuminated by the sun.",
                          "The moon is lit by 0%-50% on its right side in the northern hemisphere 🌒 and on its left side in the southern hemisphere 🌘.",
                          "The moon is lit by 50.1% on its right side in the northern hemisphere 🌓 and on its left side in the southern hemisphere 🌗.",
                          "The moon is lit by 50%-100% on its right side in the northern hemisphere 🌔 and on its left side in the southern hemisphere 🌖.",
                          "The moon is fully illuminated.",
                          "The moon is lit by 50%-100% on its left side in the northern hemisphere 🌖 and on its right side in the southern hemisphere 🌔.",
                          "The moon is lit by 50.1% on its left side in the northern hemisphere 🌗 and on its right side in the southern hemisphere 🌓.",
                          "The moon is lit by 0%-50% on its left side in the northern hemisphere 🌘 and on its right side in the southern hemisphere 🌒."
                        ]
                      },
                      "moonriseTimes": {
                        "description": "The time when the upper limb of the moon appears above the horizon (see https://en.wikipedia.org/wiki/Moonrise_and_moonset). NOTE: For most cases, there'll be a single moon rise time per day. In other cases, the list might be empty (e.g. when the moon rises after next day midnight). However, in unique cases (e.g. in polar regions), the list may contain more than one value. In these cases, the values are sorted in ascending order.",
                        "items": {
                          "format": "date-time",
                          "type": "string"
                        },
                        "type": "array"
                      },
                      "moonsetTimes": {
                        "description": "The time when the upper limb of the moon disappears below the horizon (see https://en.wikipedia.org/wiki/Moonrise_and_moonset). NOTE: For most cases, there'll be a single moon set time per day. In other cases, the list might be empty (e.g. when the moon sets after next day midnight). However, in unique cases (e.g. in polar regions), the list may contain more than one value. In these cases, the values are sorted in ascending order.",
                        "items": {
                          "format": "date-time",
                          "type": "string"
                        },
                        "type": "array"
                      }
                    },
                    "type": "object"
                  },
                  "PlantSpeciesInfo": {
                    "description": "Information for a specific allergenic plant species.",
                    "properties": {
                      "code": {
                        "description": "Machine-readable species code (e.g. \"BIRCH\", \"JAPANESE_CEDAR\", \"RAGWEED\").",
                        "type": "string"
                      },
                      "crossReactions": {
                        "description": "Known cross-reactive allergens (e.g. \"Alder, Hazel, Beech, and Oak pollen\").",
                        "type": "string"
                      },
                      "displayName": {
                        "description": "Localized display name of the plant species (e.g. \"Birch\").",
                        "type": "string"
                      },
                      "family": {
                        "description": "Botanical family name (e.g. \"Betulaceae (the Birch family)\").",
                        "type": "string"
                      },
                      "inSeason": {
                        "description": "Whether this plant species is currently in season.",
                        "type": "boolean"
                      },
                      "index": {
                        "$ref": "#/$defs/PollenIndex",
                        "description": "Universal Pollen Index (UPI) measurement for this species."
                      },
                      "season": {
                        "description": "Typical blooming season description (e.g. \"Late winter, spring\").",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "PollenCategoryInfo": {
                    "description": "Information for a broad pollen category (e.g. Tree, Grass, Weed).",
                    "properties": {
                      "displayName": {
                        "description": "Display name of the category (e.g. \"Tree\", \"Grass\", \"Weed\").",
                        "type": "string"
                      },
                      "healthRecommendations": {
                        "description": "Actionable health advice for pollen-sensitive groups.",
                        "items": {
                          "type": "string"
                        },
                        "type": "array"
                      },
                      "inSeason": {
                        "description": "Whether this pollen category is actively blooming in the region.",
                        "type": "boolean"
                      },
                      "index": {
                        "$ref": "#/$defs/PollenIndex",
                        "description": "Universal Pollen Index (UPI) measurement for this category."
                      }
                    },
                    "type": "object"
                  },
                  "PollenIndex": {
                    "description": "Standardized Universal Pollen Index (UPI) measurement.",
                    "properties": {
                      "category": {
                        "description": "Localized category classification (e.g. \"None\", \"Very Low\", \"Low\", \"Moderate\", \"High\", \"Very High\").",
                        "type": "string"
                      },
                      "description": {
                        "description": "Description of the pollen risk level.",
                        "type": "string"
                      },
                      "value": {
                        "description": "Numeric UPI value (0 to 5 scale).",
                        "format": "int32",
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  },
                  "PollenResultData": {
                    "description": "Pollen payload for the requested location.",
                    "properties": {
                      "attribution": {
                        "$ref": "#/$defs/Attribution",
                        "description": "Required attribution to show with the pollen data."
                      },
                      "dailyForecast": {
                        "$ref": "#/$defs/DailyPollenForecast",
                        "description": "Daily pollen forecast for the requested date."
                      }
                    },
                    "type": "object"
                  },
                  "Pollutant": {
                    "description": "Represents a specific air pollutant and its concentration.",
                    "properties": {
                      "additionalInfo": {
                        "$ref": "#/$defs/AdditionalInfo",
                        "description": "Additional information about the pollutant's sources and health effects."
                      },
                      "concentration": {
                        "$ref": "#/$defs/Concentration",
                        "description": "Measured concentration of the pollutant."
                      },
                      "displayName": {
                        "description": "Short display name of the pollutant (e.g. \"PM2.5\", \"O3\").",
                        "type": "string"
                      },
                      "fullName": {
                        "description": "Full chemical or common name of the pollutant (e.g. \"Fine particulate matter (\u003c2.5µm)\", \"Ozone\").",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Precipitation": {
                    "description": "Represents a set of precipitation values at a given location.",
                    "properties": {
                      "probability": {
                        "$ref": "#/$defs/PrecipitationProbability",
                        "description": "The probability of precipitation (values from 0 to 100)."
                      },
                      "qpf": {
                        "$ref": "#/$defs/QuantitativePrecipitationForecast",
                        "description": "The amount of precipitation rain, measured as liquid water equivalent, that has accumulated over a period of time. Note: QPF is an abbreviation for Quantitative Precipitation Forecast (please see the QuantitativePrecipitationForecast definition for more details)."
                      },
                      "snowQpf": {
                        "$ref": "#/$defs/QuantitativePrecipitationForecast",
                        "description": "The amount of snow, measured as liquid water equivalent, that has accumulated over a period of time. Note: QPF is an abbreviation for Quantitative Precipitation Forecast (please see the QuantitativePrecipitationForecast definition for more details)."
                      }
                    },
                    "type": "object"
                  },
                  "PrecipitationProbability": {
                    "description": "Represents the probability of precipitation at a given location.",
                    "properties": {
                      "percent": {
                        "description": "A percentage from 0 to 100 that indicates the chances of precipitation.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "type": {
                        "description": "Optional. A code that indicates the type of precipitation.",
                        "enum": [
                          "TYPE_UNSPECIFIED",
                          "NONE",
                          "SNOW",
                          "RAIN",
                          "LIGHT_RAIN",
                          "HEAVY_RAIN",
                          "RAIN_AND_SNOW",
                          "SLEET",
                          "FREEZING_RAIN",
                          "PRECIPITATION_TYPE_HAIL"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "Unspecified precipitation type.",
                          "No precipitation.",
                          "Snow precipitation.",
                          "Rain precipitation.",
                          "Light rain precipitation.",
                          "Heavy rain precipitation.",
                          "Both rain and snow precipitations.",
                          "Sleet precipitation.",
                          "Freezing rain precipitation.",
                          "Hail precipitation."
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "QuantitativePrecipitationForecast": {
                    "description": "Represents the expected amount of melted precipitation accumulated over a specified time period over a specified area (reference: https://en.wikipedia.org/wiki/Quantitative_precipitation_forecast) - usually abbreviated QPF for short.",
                    "properties": {
                      "quantity": {
                        "description": "The amount of precipitation, measured as liquid water equivalent, that has accumulated over a period of time.",
                        "format": "float",
                        "type": "number"
                      },
                      "unit": {
                        "description": "The code of the unit used to measure the amount of accumulated precipitation.",
                        "enum": [
                          "UNIT_UNSPECIFIED",
                          "MILLIMETERS",
                          "INCHES"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "Unspecified precipitation unit.",
                          "The amount of precipitation is measured in millimeters.",
                          "The amount of precipitation is measured in inches."
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "SunEvents": {
                    "description": "Represents the events related to the sun (e.g. sunrise, sunset).",
                    "properties": {
                      "sunriseTime": {
                        "description": "The time when the sun rises. NOTE: In some unique cases (e.g. north of the artic circle) there may be no sunrise time for a day. In these cases, this field will be unset.",
                        "format": "date-time",
                        "type": "string"
                      },
                      "sunsetTime": {
                        "description": "The time when the sun sets. NOTE: In some unique cases (e.g. north of the artic circle) there may be no sunset time for a day. In these cases, this field will be unset.",
                        "format": "date-time",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Temperature": {
                    "description": "Represents a temperature value.",
                    "properties": {
                      "degrees": {
                        "description": "The temperature value (in degrees) in the specified unit.",
                        "format": "float",
                        "type": "number"
                      },
                      "unit": {
                        "description": "Optional. The code for the unit used to measure the temperature value.",
                        "enum": [
                          "UNIT_UNSPECIFIED",
                          "CELSIUS",
                          "FAHRENHEIT"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "The temperature unit is unspecified.",
                          "The temperature is measured in Celsius.",
                          "The temperature is measured in Fahrenheit."
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "TimeZone": {
                    "description": "Represents a time zone from the [IANA Time Zone Database](https://www.iana.org/time-zones).",
                    "properties": {
                      "id": {
                        "description": "IANA Time Zone Database time zone. For example \"America/New_York\".",
                        "type": "string"
                      },
                      "version": {
                        "description": "Optional. IANA Time Zone Database version number. For example \"2019a\".",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "WeatherCondition": {
                    "description": "Represents a weather condition for a given location at a given period of time. Disclaimer: Weather icons and condition codes are subject to change. Google may introduce new codes and icons or update existing ones as needed. We encourage you to refer to this documentation regularly for the most up-to-date information.",
                    "properties": {
                      "description": {
                        "$ref": "#/$defs/LocalizedText",
                        "description": "The textual description for this weather condition (localized)."
                      },
                      "iconBaseUri": {
                        "description": "The base URI for the icon not including the file type extension. To display the icon, append a theme if desired and the file type extension (`.png` or `.svg`) to this URI. By default, the icon is light themed, but `_dark` can be appended for dark mode. For example: \"https://maps.gstatic.com/weather/v1/dust.svg\" or \"https://maps.gstatic.com/weather/v1/dust_dark.svg\", where `icon_base_uri` is \"https://maps.gstatic.com/weather/v1/dust\".",
                        "type": "string"
                      },
                      "type": {
                        "description": "The type of weather condition.",
                        "enum": [
                          "TYPE_UNSPECIFIED",
                          "CLEAR",
                          "MOSTLY_CLEAR",
                          "PARTLY_CLOUDY",
                          "MOSTLY_CLOUDY",
                          "CLOUDY",
                          "WINDY",
                          "WIND_AND_RAIN",
                          "LIGHT_RAIN_SHOWERS",
                          "CHANCE_OF_SHOWERS",
                          "SCATTERED_SHOWERS",
                          "RAIN_SHOWERS",
                          "HEAVY_RAIN_SHOWERS",
                          "LIGHT_TO_MODERATE_RAIN",
                          "MODERATE_TO_HEAVY_RAIN",
                          "RAIN",
                          "LIGHT_RAIN",
                          "HEAVY_RAIN",
                          "RAIN_PERIODICALLY_HEAVY",
                          "LIGHT_SNOW_SHOWERS",
                          "CHANCE_OF_SNOW_SHOWERS",
                          "SCATTERED_SNOW_SHOWERS",
                          "SNOW_SHOWERS",
                          "HEAVY_SNOW_SHOWERS",
                          "LIGHT_TO_MODERATE_SNOW",
                          "MODERATE_TO_HEAVY_SNOW",
                          "SNOW",
                          "LIGHT_SNOW",
                          "HEAVY_SNOW",
                          "SNOWSTORM",
                          "SNOW_PERIODICALLY_HEAVY",
                          "HEAVY_SNOW_STORM",
                          "BLOWING_SNOW",
                          "RAIN_AND_SNOW",
                          "HAIL",
                          "HAIL_SHOWERS",
                          "THUNDERSTORM",
                          "THUNDERSHOWER",
                          "LIGHT_THUNDERSTORM_RAIN",
                          "SCATTERED_THUNDERSTORMS",
                          "HEAVY_THUNDERSTORM",
                          "CLEAR_AFTER_FOG_IN_THE_MORNING",
                          "CLEAR_BUT_LATER_TURNING_CLOUDY",
                          "CLEAR_BUT_LATER_TURNING_TO_RAIN_AND_SNOW_MAIN_CONSTITUENT_RAIN",
                          "CLEAR_BUT_LATER_TURNING_TO_SNOW_AND_RAIN_MAIN_CONSTITUENT_SNOW",
                          "CLEAR_BUT_THUNDERSTORMS_LATER",
                          "CLEAR_IN_THE_MORNING_BUT_CLOUDY_IN_THE_EVENING",
                          "CLEAR_IN_THE_MORNING_WITH_BRIEF_RAIN_IN_THE_EVENING",
                          "CLEAR_MORNING_WITH_BRIEF_RAIN",
                          "CLEAR_WITH_BRIEF_RAIN",
                          "CLEAR_WITH_BRIEF_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT",
                          "CLEAR_WITH_BRIEF_RAIN_LATER",
                          "CLEAR_WITH_BRIEF_SNOW",
                          "CLEAR_WITH_BRIEF_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT",
                          "CLEAR_WITH_BRIEF_SNOW_LATER",
                          "CLEAR_WITH_PERIODIC_CLOUDS_LATER",
                          "CLEAR_WITH_PERIODIC_RAIN",
                          "CLEAR_WITH_PERIODIC_RAIN_ACCOMPANIED_BY_THUNDER",
                          "CLEAR_WITH_PERIODIC_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT",
                          "CLEAR_WITH_PERIODIC_RAIN_LATER",
                          "CLEAR_WITH_PERIODIC_SNOW",
                          "CLEAR_WITH_PERIODIC_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT",
                          "CLEAR_WITH_PERIODIC_SNOW_LATER",
                          "CLEAR_WITH_RAIN_AFTER_MIDNIGHT",
                          "CLEAR_WITH_RAIN_IN_THE_NIGHT",
                          "CLEAR_WITH_RAIN_LATER",
                          "CLEAR_WITH_SNOW_ALONG_THE_MOUNTAINS",
                          "CLEAR_WITH_SNOW_LATER",
                          "CLEAR_WITH_THUNDERSTORMS_ALONG_THE_MOUNTAINS",
                          "CLEAR_WITH_THUNDERSTORMS_IN_THE_AFTERNOON",
                          "CLOUDY_BUT_CLEAR_LATER",
                          "CLOUDY_BUT_LATER_TURNING_TO_RAIN_AND_SNOW_MAIN_CONSTITUENT_RAIN",
                          "CLOUDY_BUT_LATER_TURNING_TO_SNOW_AND_RAIN_MAIN_CONSTITUENT_SNOW",
                          "CLOUDY_BUT_PERIODICALLY_CLEAR_LATER",
                          "CLOUDY_BUT_THUNDERSTORMS_LATER",
                          "CLOUDY_MORNING_WITH_BRIEF_RAIN",
                          "CLOUDY_PERIODICALLY_CLEAR",
                          "CLOUDY_SNOWING_IN_THE_EVENING",
                          "CLOUDY_SNOWING_IN_THE_NIGHT",
                          "CLOUDY_WITH_BRIEF_RAIN",
                          "CLOUDY_WITH_BRIEF_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT",
                          "CLOUDY_WITH_BRIEF_RAIN_LATER",
                          "CLOUDY_WITH_BRIEF_SNOW",
                          "CLOUDY_WITH_BRIEF_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT",
                          "CLOUDY_WITH_BRIEF_SNOW_LATER",
                          "CLOUDY_WITH_BRIEF_THUNDERSTORM",
                          "CLOUDY_WITH_FOG_ON_THE_OCEAN_AND_AT_THE_SEASHORE",
                          "CLOUDY_WITH_PERIODIC_RAIN",
                          "CLOUDY_WITH_PERIODIC_RAIN_ACCOMPANIED_BY_THUNDER",
                          "CLOUDY_WITH_PERIODIC_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT",
                          "CLOUDY_WITH_PERIODIC_RAIN_LATER",
                          "CLOUDY_WITH_PERIODIC_SNOW",
                          "CLOUDY_WITH_PERIODIC_SNOW_ACCOMPANIED_BY_THUNDER",
                          "CLOUDY_WITH_PERIODIC_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT",
                          "CLOUDY_WITH_PERIODIC_SNOW_LATER",
                          "CLOUDY_WITH_RAIN_AFTER_MIDNIGHT",
                          "CLOUDY_WITH_RAIN_FROM_ABOUT_NOON",
                          "CLOUDY_WITH_RAIN_FROM_EVENING",
                          "CLOUDY_WITH_RAIN_LATER",
                          "CLOUDY_WITH_SNOW_FROM_AROUND_NOON",
                          "CLOUDY_WITH_SNOW_LATER",
                          "FOG",
                          "RAINSNOW_MIX_LATER_BECOMING_CLEAR_RAIN_AS_MAIN",
                          "RAINSNOW_MIX_RAIN_AS_MAIN",
                          "RAINY_BUT_PERIODICALLY_CLEAR",
                          "RAIN_ACCOMPANIED_BY_LIGHTNING",
                          "RAIN_ACCOMPANIED_BY_WINDSTORM",
                          "RAIN_CLEAR_AT_NIGHT",
                          "RAIN_CLEAR_FROM_AROUND_EVENING",
                          "RAIN_CLEAR_FROM_AROUND_NOON",
                          "RAIN_LATER_BECOMING_CLEAR",
                          "RAIN_LATER_BECOMING_CLOUDY",
                          "RAIN_LATER_BECOMING_SNOW",
                          "RAIN_LATER_WITH_PERIODIC_SNOW",
                          "RAIN_SNOW_AT_NIGHT",
                          "RAIN_SNOW_IN_THE_EVENING",
                          "RAIN_TEMPORARILY_BECOMING_SLEET",
                          "RAIN_THAT_PERIODICALLY_STOPS",
                          "RAIN_WITH_BRIEF_SNOW",
                          "RAIN_WITH_PERIODIC_SNOW",
                          "SNOWRAIN_MIX_LATER_BECOMING_CLEAR_SNOW_AS_MAIN",
                          "SNOWRAIN_MIX_LATER_BECOMING_CLOUDY_SNOW_AS_MAIN",
                          "SNOWRAIN_MIX_SNOW_AS_MAIN",
                          "SNOW_ACCOMPANIED_BY_LIGHTNING",
                          "SNOW_BECOMING_SLEET",
                          "SNOW_LATER_CLEAR",
                          "SNOW_LATER_CLOUDY",
                          "SNOW_LATER_RAIN",
                          "SNOW_PERIODICALLY_CLEAR",
                          "SNOW_THAT_PERIODICALLY_STOPS",
                          "SNOW_TURNING_TO_RAIN_AROUND_NOON",
                          "SNOW_TURNING_TO_RAIN_IN_THE_EVENING",
                          "SNOW_TURNING_TO_RAIN_IN_THE_NIGHT",
                          "SNOW_WITH_BRIEF_RAIN",
                          "SNOW_WITH_BRIEF_SLEET",
                          "SNOW_WITH_PERIODIC_RAIN",
                          "VERY_HOT",
                          "SLEET",
                          "HEAVY_RAIN_TO_RAINSTORM"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "The weather condition is unspecified.",
                          "No clouds.",
                          "Periodic clouds.",
                          "Party cloudy (some clouds).",
                          "Mostly cloudy (more clouds than sun).",
                          "Cloudy (all clouds, no sun).",
                          "High wind.",
                          "High wind with precipitation.",
                          "Light intermittent rain.",
                          "Chance of intermittent rain.",
                          "Intermittent rain.",
                          "Showers are considered to be rainfall that has a shorter duration than rain, and is characterized by suddenness in terms of start and stop times, and rapid changes in intensity.",
                          "Intense showers.",
                          "Rain (light to moderate in quantity).",
                          "Rain (moderate to heavy in quantity).",
                          "Moderate rain.",
                          "Light rain.",
                          "Heavy rain.",
                          "Rain periodically heavy.",
                          "Light snow that is falling at varying intensities for brief periods of time.",
                          "Chance of snow showers.",
                          "Snow that is falling at varying intensities for brief periods of time.",
                          "Snow showers.",
                          "Heavy snow showers.",
                          "Light to moderate snow.",
                          "Moderate to heavy snow.",
                          "Moderate snow.",
                          "Light snow.",
                          "Heavy snow.",
                          "Snow with possible thunder and lightning.",
                          "Snow, at times heavy.",
                          "Heavy snow with possible thunder and lightning.",
                          "Snow with intense wind.",
                          "Rain and snow mix.",
                          "Hail.",
                          "Hail that is falling at varying intensities for brief periods of time.",
                          "Thunderstorm.",
                          "A shower of rain accompanied by thunder and lightning.",
                          "Light thunderstorm rain.",
                          "Thunderstorms that has rain in various intensities for brief periods of time.",
                          "Heavy thunderstorm.",
                          "Clear after fog in the morning.",
                          "Clear but later turning cloudy.",
                          "Clear but later turning to rain and snow, with rain as the main constituent.",
                          "Clear but later turning to snow and rain, with snow as the main constituent.",
                          "Clear but thunderstorms later.",
                          "Clear in the morning but cloudy in the evening.",
                          "Clear in the morning with brief rain in the evening.",
                          "Clear morning with brief rain.",
                          "Clear with brief rain.",
                          "Clear with brief rain and snow, with rain as the main constituent.",
                          "Clear with brief rain later.",
                          "Clear with brief snow.",
                          "Clear with brief snow and rain, with snow as the main constituent.",
                          "Clear with brief snow later.",
                          "Clear with periodic clouds later.",
                          "Clear with periodic rain.",
                          "Clear with periodic rain accompanied by thunder.",
                          "Clear with periodic rain and snow, with rain as the main constituent.",
                          "Clear with periodic rain later.",
                          "Clear with periodic snow.",
                          "Clear with periodic snow and rain, with snow as the main constituent.",
                          "Clear with periodic snow later.",
                          "Clear with rain after midnight.",
                          "Clear with rain in the night.",
                          "Clear with rain later.",
                          "Clear with snow along the mountains.",
                          "Clear with snow later.",
                          "Clear with thunderstorms along the mountains.",
                          "Clear with thunderstorms in the afternoon.",
                          "Cloudy but clear later.",
                          "Cloudy but later turning to rain and snow, with rain as the main constituent.",
                          "Cloudy but later turning to snow and rain, with snow as the main constituent.",
                          "Cloudy but periodically clear later.",
                          "Cloudy but thunderstorms later.",
                          "Cloudy morning with brief rain.",
                          "Cloudy, periodically clear.",
                          "Cloudy, with snow in the evening.",
                          "Cloudy, with snow at night.",
                          "Cloudy with brief rain.",
                          "Cloudy with brief rain and snow, with rain as the main constituent.",
                          "Cloudy with brief rain later.",
                          "Cloudy with brief snow.",
                          "Cloudy with brief snow and rain, with snow as the main constituent.",
                          "Cloudy with brief snow later.",
                          "Cloudy with brief thunderstorm.",
                          "Cloudy with fog on the ocean and at the seashore.",
                          "Cloudy with periodic rain.",
                          "Cloudy with periodic rain accompanied by thunder.",
                          "Cloudy with periodic rain and snow, with rain as the main constituent.",
                          "Cloudy with periodic rain later.",
                          "Cloudy with periodic snow.",
                          "Cloudy with periodic snow accompanied by thunder.",
                          "Cloudy with periodic snow and rain, with snow as the main constituent.",
                          "Cloudy with periodic snow later.",
                          "Cloudy with rain after midnight.",
                          "Cloudy with rain from about noon.",
                          "Cloudy with rain from evening.",
                          "Cloudy with rain later.",
                          "Cloudy with snow from around noon.",
                          "Cloudy with snow later.",
                          "Fog.",
                          "Rain-snow mix, later becoming clear, with rain as the main constituent.",
                          "Rain-snow mix, with rain as the main constituent.",
                          "Rainy but periodically clear.",
                          "Rain accompanied by lightning.",
                          "Rain accompanied by windstorm.",
                          "Rain, clearing at night.",
                          "Rain, clearing from around evening.",
                          "Rain, clearing from around noon.",
                          "Rain, later becoming clear.",
                          "Rain, later becoming cloudy.",
                          "Rain, later becoming snow.",
                          "Rain, later with periodic snow.",
                          "Rain and snow at night.",
                          "Rain and snow in the evening.",
                          "Rain, temporarily becoming sleet.",
                          "Rain that periodically stops.",
                          "Rain with brief snow.",
                          "Rain with periodic snow.",
                          "Snow-rain mix, later becoming clear, with snow as the main constituent.",
                          "Snow-rain mix, later becoming cloudy, with snow as the main constituent.",
                          "Snow-rain mix, with snow as the main constituent.",
                          "Snow accompanied by lightning.",
                          "Snow, becoming sleet.",
                          "Snow, later clearing.",
                          "Snow, later becoming cloudy.",
                          "Snow, later becoming rain.",
                          "Snow, periodically clearing.",
                          "Snow that periodically stops.",
                          "Snow turning to rain around noon.",
                          "Snow turning to rain in the evening.",
                          "Snow turning to rain at night.",
                          "Snow with brief rain.",
                          "Snow with brief sleet.",
                          "Snow with periodic rain.",
                          "Very hot.",
                          "Sleet.",
                          "Heavy rain to rainstorm."
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "WeatherResultData": {
                    "description": "Weather conditions payload for the requested location.",
                    "properties": {
                      "airPressure": {
                        "$ref": "#/$defs/AirPressure",
                        "description": "The hourly air pressure conditions."
                      },
                      "attribution": {
                        "$ref": "#/$defs/Attribution",
                        "description": "Required attribution to show with the weather."
                      },
                      "cloudCover": {
                        "description": "The percentage of the sky covered by clouds (values from 0 to 100).",
                        "format": "int32",
                        "type": "integer"
                      },
                      "date": {
                        "$ref": "#/$defs/Date",
                        "description": "Civil calendar date of the daily weather forecast."
                      },
                      "dateTime": {
                        "description": "The timestamp for this hourly or current weather entry.",
                        "format": "date-time",
                        "type": "string"
                      },
                      "feelsLikeMaxTemperature": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The maximum (high) feels-like temperature throughout the day."
                      },
                      "feelsLikeMinTemperature": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The minimum (low) feels-like temperature throughout the day."
                      },
                      "feelsLikeTemperature": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The hourly measure of how the temperature feels like."
                      },
                      "heatIndex": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The hourly heat index temperature."
                      },
                      "maxHeatIndex": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The maximum heat index temperature throughout the day."
                      },
                      "maxTemperature": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The maximum (high) temperature throughout the day."
                      },
                      "minTemperature": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The minimum (low) temperature throughout the day."
                      },
                      "moonEvents": {
                        "$ref": "#/$defs/MoonEvents",
                        "description": "The events related to the moon (e.g. moonrise, moonset)."
                      },
                      "precipitation": {
                        "$ref": "#/$defs/Precipitation",
                        "description": "The precipitation probability and amount of precipitation accumulated."
                      },
                      "relativeHumidity": {
                        "description": "The percent of relative humidity (values from 0 to 100).",
                        "format": "int32",
                        "type": "integer"
                      },
                      "sunEvents": {
                        "$ref": "#/$defs/SunEvents",
                        "description": "The events related to the sun (e.g. sunrise, sunset)."
                      },
                      "temperature": {
                        "$ref": "#/$defs/Temperature",
                        "description": "The hourly temperature."
                      },
                      "thunderstormProbability": {
                        "description": "The thunderstorm probability (values from 0 to 100).",
                        "format": "int32",
                        "type": "integer"
                      },
                      "uvIndex": {
                        "description": "The maximum ultraviolet (UV) index.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "weatherCondition": {
                        "$ref": "#/$defs/WeatherCondition",
                        "description": "The weather condition."
                      },
                      "wind": {
                        "$ref": "#/$defs/Wind",
                        "description": "The wind conditions."
                      }
                    },
                    "type": "object"
                  },
                  "Wind": {
                    "description": "Represents a set of wind properties.",
                    "properties": {
                      "direction": {
                        "$ref": "#/$defs/WindDirection",
                        "description": "The direction of the wind, the angle it is coming from."
                      },
                      "gust": {
                        "$ref": "#/$defs/WindSpeed",
                        "description": "The wind gust (sudden increase in the wind speed)."
                      },
                      "speed": {
                        "$ref": "#/$defs/WindSpeed",
                        "description": "The speed of the wind."
                      }
                    },
                    "type": "object"
                  },
                  "WindDirection": {
                    "description": "Represents the direction from which the wind originates.",
                    "properties": {
                      "cardinal": {
                        "description": "Optional. The code that represents the cardinal direction from which the wind is blowing.",
                        "enum": [
                          "CARDINAL_UNSPECIFIED",
                          "NORTH",
                          "NORTH_NORTHEAST",
                          "NORTHEAST",
                          "EAST_NORTHEAST",
                          "EAST",
                          "EAST_SOUTHEAST",
                          "SOUTHEAST",
                          "SOUTH_SOUTHEAST",
                          "SOUTH",
                          "SOUTH_SOUTHWEST",
                          "SOUTHWEST",
                          "WEST_SOUTHWEST",
                          "WEST",
                          "WEST_NORTHWEST",
                          "NORTHWEST",
                          "NORTH_NORTHWEST"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "The cardinal direction is unspecified.",
                          "The north cardinal direction.",
                          "The north-northeast secondary intercardinal direction.",
                          "The northeast intercardinal direction.",
                          "The east-northeast secondary intercardinal direction.",
                          "The east cardinal direction.",
                          "The east-southeast secondary intercardinal direction.",
                          "The southeast intercardinal direction.",
                          "The south-southeast secondary intercardinal direction.",
                          "The south cardinal direction.",
                          "The south-southwest secondary intercardinal direction.",
                          "The southwest intercardinal direction.",
                          "The west-southwest secondary intercardinal direction.",
                          "The west cardinal direction.",
                          "The west-northwest secondary intercardinal direction.",
                          "The northwest intercardinal direction.",
                          "The north-northwest secondary intercardinal direction."
                        ]
                      },
                      "degrees": {
                        "description": "The direction of the wind in degrees (values from 0 to 360).",
                        "format": "int32",
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  },
                  "WindSpeed": {
                    "description": "Represents the speed of the wind.",
                    "properties": {
                      "unit": {
                        "description": "Optional. The code that represents the unit used to measure the wind speed.",
                        "enum": [
                          "UNIT_UNSPECIFIED",
                          "KILOMETERS_PER_HOUR",
                          "MILES_PER_HOUR"
                        ],
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "The speed unit is unspecified.",
                          "The speed is measured in kilometers per hour.",
                          "The speed is measured in miles per hour."
                        ]
                      },
                      "value": {
                        "description": "The value of the wind speed.",
                        "format": "float",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Response for the LookupWeather RPC - represents the weather conditions at the requested location. This response represent both Hourly and Daily information, therefore the response is split in three sections Hourly, Daily and Shared. Only-Hourly, Only-Daily fields are marked as optional. For fields that are shared between Hourly and Daily information, some are always present so they are not marked as optional while the rest are marked as optional because they are not always available. ",
                "properties": {
                  "airPressure": {
                    "$ref": "#/$defs/AirPressure",
                    "description": "The hourly air pressure conditions."
                  },
                  "airQuality": {
                    "$ref": "#/$defs/AirQualityResultData",
                    "description": "Air quality information at the requested location."
                  },
                  "attribution": {
                    "$ref": "#/$defs/Attribution",
                    "description": "Required attribution to show with the weather."
                  },
                  "cloudCover": {
                    "description": "The percentage of the sky covered by clouds (values from 0 to 100). define optional because it is not always available",
                    "format": "int32",
                    "type": "integer"
                  },
                  "feelsLikeMaxTemperature": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The maximum (high) feels-like temperature throughout the day."
                  },
                  "feelsLikeMinTemperature": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The minimum (low) feels-like temperature throughout the day."
                  },
                  "feelsLikeTemperature": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The hourly measure of how the temperature feels like."
                  },
                  "heatIndex": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The hourly heat index temperature."
                  },
                  "maxHeatIndex": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The maximum heat index temperature throughout the day."
                  },
                  "maxTemperature": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The maximum (high) temperature throughout the day."
                  },
                  "minTemperature": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The minimum (low) temperature throughout the day."
                  },
                  "moonEvents": {
                    "$ref": "#/$defs/MoonEvents",
                    "description": "The events related to the moon (e.g. moonrise, moonset)."
                  },
                  "pollen": {
                    "$ref": "#/$defs/PollenResultData",
                    "description": "Pollen information at the requested location."
                  },
                  "precipitation": {
                    "$ref": "#/$defs/Precipitation",
                    "description": "The precipitation probability and amount of precipitation accumulated"
                  },
                  "relativeHumidity": {
                    "description": "The percent of relative humidity (values from 0 to 100). define optional because it is not always available",
                    "format": "int32",
                    "type": "integer"
                  },
                  "returnedLocation": {
                    "$ref": "#/$defs/Location",
                    "description": "Required. The location where the weather information is returned. This location is identical to the location in the request, but can be different from it if the requested location is a free text address that looks up to a coarse location (e.g. \"Mountain View, CA\")."
                  },
                  "sunEvents": {
                    "$ref": "#/$defs/SunEvents",
                    "description": "The events related to the sun (e.g. sunrise, sunset)."
                  },
                  "temperature": {
                    "$ref": "#/$defs/Temperature",
                    "description": "The hourly temperature"
                  },
                  "thunderstormProbability": {
                    "description": "The thunderstorm probability (values from 0 to 100). define optional because it is not always available",
                    "format": "int32",
                    "type": "integer"
                  },
                  "timeZone": {
                    "description": "Resolved IANA timezone string for the location (e.g., \"America/New_York\", \"Asia/Tokyo\").",
                    "type": "string"
                  },
                  "uvIndex": {
                    "description": "The maximum ultraviolet (UV) index. define optional because it is not always available",
                    "format": "int32",
                    "type": "integer"
                  },
                  "weather": {
                    "$ref": "#/$defs/WeatherResultData",
                    "description": "Weather conditions at the requested location."
                  },
                  "weatherCondition": {
                    "$ref": "#/$defs/WeatherCondition",
                    "description": "The weather condition"
                  },
                  "wind": {
                    "$ref": "#/$defs/Wind",
                    "description": "The wind conditions"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "compute_routes",
              "description": "Computes travel routes between an origin and a destination, optionally through intermediate stops. Returns the distance and duration for each route.\n\n**Input Requirements (CRITICAL):**\n\n1.  **`origin` and `destination` (objects - MANDATORY):** Each must be provided using exactly one of:\n    *   **`address`** (string, e.g., `'Eiffel Tower, Paris'`). Named places, landmarks, and businesses are resolved directly, so do NOT call `search_places` first just to geocode a waypoint. Include any city, region, or country the user mentioned.\n    *   **`lat_lng`** (object, `{\"latitude\": number, \"longitude\": number}`).\n    *   **`place_id`** (string, e.g., `'ChIJOwE_Id1w5EAR4Q27FkL6T_0'`), for example from `search_places`.\n\n2.  **`intermediate_waypoints` (array of objects - OPTIONAL):** Up to 10 stops to pass through, in order, between the origin and destination. Same format as `origin`. Not supported with `TRANSIT`. Only include stops the user asked for.\n\n3.  **`travel_mode` (enum - OPTIONAL):** `DRIVE` (default), `WALK`, `BICYCLE`, or `TRANSIT`.\n\n4.  **Timing (OPTIONAL - set at most ONE):** RFC 3339 timestamps with a UTC offset, e.g., `'2026-09-19T08:00:00-07:00'`. Defaults to departing now. For `TRANSIT`, the time can be up to 7 days in the past or up to 100 days in the future. For other modes, the time can be up to 365 days in the future and must not be in the past.\n    *   **`departure_time`:** Use when the user says when they will leave (e.g., \"tomorrow at 8am\").\n    *   **`arrival_time`:** Use when the user says when they must arrive (e.g., \"be there by 9am\").\n\n5.  **`routing_preference` (enum - OPTIONAL):**\n    *   `ROUTING_PREFERENCE_TRAFFIC_UNAWARE` (default): ignores live traffic, incidents, and closures. Lowest latency.\n    *   `ROUTING_PREFERENCE_TRAFFIC_AWARE_OPTIMAL`: uses live traffic conditions when available. Not supported for `WALK` or `BICYCLE`. Set this ONLY when the user asks about traffic, congestion, or a traffic-adjusted ETA. It incurs higher cost and latency.\n\n6.  **`location_bias` (object - OPTIONAL):** `{\"latitude\": number, \"longitude\": number}` used to disambiguate place names in waypoint addresses. If a name is ambiguous (e.g., \"Springfield\") and the user gave no region, keep the name as given in `address` and set `location_bias` toward the intended area instead of guessing a region.\n\n7.  **`compute_alternative_routes` (boolean - OPTIONAL):** Set to `true` only when the user asks for route options or alternatives. Defaults to `false`, which returns only the recommended route.\n\n8.  **`include_polyline` (boolean - OPTIONAL):** Set to `true` only when the route geometry (`encoded_polyline`) is needed. Defaults to `false`.\n\n**Instructions for Tool Call:**\n\n*   If the origin or the destination is missing, **you MUST ask the user for clarification** before calling the tool.\n*   For \"How far is A from B?\" questions, use B as the `origin` and A as the `destination`.\n\n**Example Tool Call:**\n{\"origin\":{\"address\":\"Eiffel Tower\"},\"destination\":{\"place_id\":\"ChIJt_5xIthw5EARoJ71mGq7t74\"},\"intermediate_waypoints\":[{\"address\":\"Louvre Museum\"}],\"travel_mode\":\"DRIVE\",\"departure_time\":\"2026-09-19T08:00:00+02:00\"}\n\n**Instructions for Response:**\n\n*   When alternative routes are requested, routes are ordered from most to least recommended.\n*   If `routes` is empty, tell the user no route was found. Do not guess a route.\n*   To find places along a `DRIVE` route, pass the route's `retrieval_token` to `search_along_route`. The token is valid for 10 minutes.\n*   Only state facts returned by the tool. Do NOT invent turn-by-turn directions, transit lines, stations, platforms, or transfers.\n*   The grounded output must be attributed to the source using each route's `attribution` field when available.\n",
              "inputSchema": {
                "$defs": {
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "Waypoint": {
                    "description": "Encapsulates a waypoint. Waypoints mark both the beginning and end of a route.",
                    "properties": {
                      "address": {
                        "description": "Human readable address or a plus code. See https://plus.codes for details. Only one of the following fields should be set: this field, latLng, placeId.",
                        "type": "string"
                      },
                      "latLng": {
                        "$ref": "#/$defs/LatLng",
                        "description": "A point specified using geographic coordinates. Only one of the following fields should be set: this field, placeId, address."
                      },
                      "placeId": {
                        "description": "The Place ID associated with the waypoint. Only one of the following fields should be set: this field, latLng, address.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "ComputeRoutesRequest.",
                "properties": {
                  "arrivalTime": {
                    "description": "Optional. Indicates that the route should be computed based on arrival time. Only one of this field or departureTime should be set.",
                    "format": "date-time",
                    "type": "string"
                  },
                  "computeAlternativeRoutes": {
                    "description": "Optional. Whether to compute alternative routes in addition to the recommended route. Defaults to false, in which case only the recommended route is returned. When set to true, up to all available routes are returned, though alternatives may not be available for every request.",
                    "type": "boolean"
                  },
                  "departureTime": {
                    "description": "Optional. Indicates that the route should be computed based on departure time. Only one of this field or arrivalTime should be set.",
                    "format": "date-time",
                    "type": "string"
                  },
                  "destination": {
                    "$ref": "#/$defs/Waypoint",
                    "description": "Required. Destination waypoint."
                  },
                  "includePolyline": {
                    "description": "Optional. Whether to include the encoded polyline in the response routes. Defaults to `false`. When set to `true`, `Route.encoded_polyline` is returned.",
                    "type": "boolean"
                  },
                  "intermediateWaypoints": {
                    "description": "Optional. Intermediate stops between the origin and destination to pass through in order. At most 10 intermediate waypoints are supported. Intermediate waypoints are not supported when `travel_mode` is `TRANSIT`.",
                    "items": {
                      "$ref": "#/$defs/Waypoint"
                    },
                    "type": "array"
                  },
                  "locationBias": {
                    "$ref": "#/$defs/LatLng",
                    "description": "Optional. A location to bias the search results toward, for example to disambiguate waypoint text queries."
                  },
                  "origin": {
                    "$ref": "#/$defs/Waypoint",
                    "description": "Required. Origin waypoint."
                  },
                  "routingPreference": {
                    "description": "Optional. Determines how traffic data is used to compute the route. `ROUTING_PREFERENCE_TRAFFIC_AWARE_OPTIMAL` is not supported when `travel_mode` is `WALK` or `BICYCLE`. For `TRANSIT`, it enables realtime transit data, such as delays and cancellations.",
                    "enum": [
                      "ROUTING_PREFERENCE_UNSPECIFIED",
                      "ROUTING_PREFERENCE_TRAFFIC_UNAWARE",
                      "ROUTING_PREFERENCE_TRAFFIC_AWARE_OPTIMAL"
                    ],
                    "type": "string",
                    "x-google-enum-descriptions": [
                      "No routing preference specified. Defaults to `ROUTING_PREFERENCE_TRAFFIC_UNAWARE`.",
                      "Computes routes without taking live traffic conditions into consideration. Suitable when traffic conditions don't matter or are not applicable. Using this value produces the lowest latency.",
                      "Calculates routes taking live traffic conditions into consideration, when traffic data is available. For `TRANSIT`, uses realtime transit data, such as delays and cancellations, when available. This value will trigger the Pro tier and incur higher billing cost and latency. This is only available for allowlisted customers. If not allowlisted, the request will fall back to `ROUTING_PREFERENCE_TRAFFIC_UNAWARE`."
                    ]
                  },
                  "travelMode": {
                    "description": "Optional. Specifies the mode of transportation.",
                    "enum": [
                      "ROUTE_TRAVEL_MODE_UNSPECIFIED",
                      "DRIVE",
                      "WALK",
                      "BICYCLE",
                      "TRANSIT"
                    ],
                    "type": "string",
                    "x-google-enum-descriptions": [
                      "No travel mode specified. Defaults to `DRIVE`.",
                      "Travel by passenger car.",
                      "Travel by walking. NOTE: `WALK` routes are in beta and might sometimes be missing clear sidewalks or pedestrian paths. You must display this warning to the user for all walking that you display in your app.",
                      "Travel by bicycle.",
                      "Travel by public transit."
                    ]
                  }
                },
                "required": [
                  "origin",
                  "destination"
                ],
                "type": "object"
              },
              "outputSchema": {
                "$defs": {
                  "Attribution": {
                    "description": "Required attribution to show with maps content.",
                    "properties": {
                      "title": {
                        "description": "The title to display for the attribution.",
                        "type": "string"
                      },
                      "url": {
                        "description": "The URL to link to for the attribution.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Route": {
                    "description": "Details about a route between locations.",
                    "properties": {
                      "attribution": {
                        "$ref": "#/$defs/Attribution",
                        "description": "Required attribution to show with the route."
                      },
                      "distanceMeters": {
                        "description": "The travel distance of the route, in meters.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "duration": {
                        "description": "The length of time needed to navigate the route.",
                        "format": "google-duration",
                        "type": "string"
                      },
                      "encodedPolyline": {
                        "description": "An encoded polyline of the route. See https://developers.google.com/maps/documentation/utilities/polylinealgorithm",
                        "type": "string"
                      },
                      "retrievalToken": {
                        "description": "A token that can be used to retrieve this specific route in downstream tools, such as SearchAlongRoute. Valid for 10 minutes.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "ComputeRoutesResponse.",
                "properties": {
                  "routes": {
                    "description": "Contains routes between the requested origin and destination, ordered from most recommended to least recommended. Only one route is returned unless `ComputeRoutesRequest.compute_alternative_routes` is set to true.",
                    "items": {
                      "$ref": "#/$defs/Route"
                    },
                    "type": "array"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "search_along_route",
              "description": "Call this tool when the user wants to find places, businesses, or points of interest along a travel route (e.g., \"gas stations on my way to Tahoe\", \"coffee shops between SF and San Jose\"). Calling this tool incurs higher cost than `search_places`, so use `search_places` instead when searching near a single location rather than along a route.\n\n**Input Requirements (CRITICAL):**\n\n1.  **`text_query` (string - MANDATORY):** A natural language description of what to search for along the route.\n    *   **Examples:** `'ev chargers'`, `'coffee'`, `'vegetarian restaurants'`, `'rest stops'`.\n\n2.  **Route specification (MANDATORY - provide exactly ONE of the following):**\n    *   **`retrieval_token` (string):** The `retrieval_token` returned by a prior `compute_routes` call for a `DRIVE` route. Prefer this whenever the route was already computed. The token is valid for 10 minutes.\n    *   **`route_endpoints` (object):** The route's `origin` and `destination`. Each must be provided using one of `address`, `lat_lng`, or `place_id`.\n        *   **Example:** `{\"route_endpoints\": {\"origin\": {\"address\": \"San Francisco, CA\"}, \"destination\": {\"address\": \"Lake Tahoe, CA\"}}}`\n    *   **`encoded_polyline` (string):** An encoded polyline representing a `DRIVE` route.\n\n3.  **`travel_mode` (enum - OPTIONAL):** `DRIVE` (default), `WALK`, or `BICYCLE`. `WALK` and `BICYCLE` are only supported with `route_endpoints`. `TRANSIT` is not supported.\n\n4.  **`routing_preference` (enum - OPTIONAL):**\n    *   `ROUTING_PREFERENCE_TRAFFIC_UNAWARE` (default): computes the route and detours without live traffic. Lowest latency.\n    *   `ROUTING_PREFERENCE_TRAFFIC_AWARE_OPTIMAL`: uses live traffic conditions when available. Not supported for `WALK` or `BICYCLE`. Set this ONLY when the user asks about traffic, congestion, or traffic-adjusted detour times. It incurs higher latency.\n\n5.  **`include_extended_details` (boolean - OPTIONAL):** Set to `true` only when the request requires qualitative review insights, specific menu items or offerings, atmosphere, visitor tips or busyness, EV charger availability, gas prices, or other rich qualitative details. Defaults to `false`. Enabling it may increase latency.\n\n6.  **`language_code` (string - OPTIONAL):** The language for the results summary and place details, e.g., `en`, `ja`, `en-US`. Defaults to `en-US`.\n\n7.  **`region_code` (string - OPTIONAL):** The Unicode CLDR region code of the user, e.g., `US`, `CA`.\n\n**Instructions for Tool Call:**\n\n*   Each result includes a `detour_summary` (when available) describing the extra distance (`localized_detour_distance`) and, unless the route was given as `encoded_polyline`, the extra time (`detour_duration`) incurred by stopping at that place. Use it to compare options.\n*   The response `summary` may contain zero-based citations (e.g., \"[0]\") referencing entries in `results`.\n*   The grounded output must be attributed to the source using the `attribution` field of each `results[].place` when available.\n",
              "inputSchema": {
                "$defs": {
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "RouteEndpoints": {
                    "description": "Route endpoints (origin, destination).",
                    "properties": {
                      "destination": {
                        "$ref": "#/$defs/Waypoint",
                        "description": "Required. Destination point (address, Place ID, or geographic coordinates)."
                      },
                      "origin": {
                        "$ref": "#/$defs/Waypoint",
                        "description": "Required. Starting point (address, Place ID, or geographic coordinates)."
                      }
                    },
                    "required": [
                      "origin",
                      "destination"
                    ],
                    "type": "object"
                  },
                  "Waypoint": {
                    "description": "Encapsulates a waypoint. Waypoints mark both the beginning and end of a route.",
                    "properties": {
                      "address": {
                        "description": "Human readable address or a plus code. See https://plus.codes for details. Only one of the following fields should be set: this field, latLng, placeId.",
                        "type": "string"
                      },
                      "latLng": {
                        "$ref": "#/$defs/LatLng",
                        "description": "A point specified using geographic coordinates. Only one of the following fields should be set: this field, placeId, address."
                      },
                      "placeId": {
                        "description": "The Place ID associated with the waypoint. Only one of the following fields should be set: this field, latLng, address.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Request message for SearchAlongRoute.",
                "properties": {
                  "encodedPolyline": {
                    "description": "An encoded polyline string representing the route. See https://developers.google.com/maps/documentation/utilities/polylinealgorithm. Only one of the following fields should be set: this field, retrievalToken, routeEndpoints.",
                    "type": "string"
                  },
                  "includeExtendedDetails": {
                    "description": "Optional. Includes extended place details in the response. Set this field to `true` when the user request requires rich qualitative insights, real-time dynamics, or specialized entity attributes: - Qualitative reviews, customer sentiment, and feedback. - Specific offerings like menu items, dishes, food specialties, beverages, or business highlights. - Qualitative atmosphere, interior decor, aesthetic, ambience, or mood. - Real-time data and specialized facility specs, visitor policies/tips, wait times. Leave `false` (default) for standard discovery searches (e.g., cuisines, store types), location/address lookups, contact info, operating hours, and standard metadata/amenities. Enabling this field may incur higher latency.",
                    "type": "boolean"
                  },
                  "languageCode": {
                    "description": "Optional. The language for summary and place details. Defaults to \"en-US\".",
                    "type": "string"
                  },
                  "regionCode": {
                    "description": "Optional. Country/region code (CLDR) of location (e.g., \"US\").",
                    "type": "string"
                  },
                  "retrievalToken": {
                    "description": "A retrieval token returned from a prior ComputeRoutes call representing the route. Only one of the following fields should be set: this field, encodedPolyline, routeEndpoints.",
                    "type": "string"
                  },
                  "routeEndpoints": {
                    "$ref": "#/$defs/RouteEndpoints",
                    "description": "Explicit route endpoints (origin and destination). Only one of the following fields should be set: this field, encodedPolyline, retrievalToken."
                  },
                  "routingPreference": {
                    "description": "Optional. Optional routing preference specifying how traffic data is used. Defaults to TRAFFIC_UNAWARE.",
                    "enum": [
                      "ROUTING_PREFERENCE_UNSPECIFIED",
                      "ROUTING_PREFERENCE_TRAFFIC_UNAWARE",
                      "ROUTING_PREFERENCE_TRAFFIC_AWARE_OPTIMAL"
                    ],
                    "type": "string",
                    "x-google-enum-descriptions": [
                      "No routing preference specified. Defaults to `ROUTING_PREFERENCE_TRAFFIC_UNAWARE`.",
                      "Computes routes without taking live traffic conditions into consideration. Suitable when traffic conditions don't matter or are not applicable. Using this value produces the lowest latency.",
                      "Calculates routes taking live traffic conditions into consideration, when traffic data is available. For `TRANSIT`, uses realtime transit data, such as delays and cancellations, when available. This value will trigger the Pro tier and incur higher billing cost and latency. This is only available for allowlisted customers. If not allowlisted, the request will fall back to `ROUTING_PREFERENCE_TRAFFIC_UNAWARE`."
                    ]
                  },
                  "textQuery": {
                    "description": "Required. Natural language search query (e.g., \"ev chargers\", \"coffee\").",
                    "type": "string"
                  },
                  "travelMode": {
                    "description": "Optional. Specifies the travel mode used to compute the route and the detours. Defaults to `DRIVE`. `WALK` and `BICYCLE` are only supported with `route_endpoints`. `TRANSIT` is not supported.",
                    "enum": [
                      "ROUTE_TRAVEL_MODE_UNSPECIFIED",
                      "DRIVE",
                      "WALK",
                      "BICYCLE",
                      "TRANSIT"
                    ],
                    "type": "string",
                    "x-google-enum-descriptions": [
                      "No travel mode specified. Defaults to `DRIVE`.",
                      "Travel by passenger car.",
                      "Travel by walking. NOTE: `WALK` routes are in beta and might sometimes be missing clear sidewalks or pedestrian paths. You must display this warning to the user for all walking that you display in your app.",
                      "Travel by bicycle.",
                      "Travel by public transit."
                    ]
                  }
                },
                "required": [
                  "textQuery"
                ],
                "type": "object"
              },
              "outputSchema": {
                "$defs": {
                  "Attribution": {
                    "description": "Required attribution to show with maps content.",
                    "properties": {
                      "title": {
                        "description": "The title to display for the attribution.",
                        "type": "string"
                      },
                      "url": {
                        "description": "The URL to link to for the attribution.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "DetourSummary": {
                    "description": "The additional duration and distance required to detour to a place from the main route.",
                    "properties": {
                      "detourDuration": {
                        "description": "The additional travel time required to detour to this place from the main route. This value is not set if the route is specified by `encoded_polyline`.",
                        "format": "google-duration",
                        "type": "string"
                      },
                      "localizedDetourDistance": {
                        "description": "The additional distance required to detour to this place from the main route, formatted for display in the request language (e.g. \"1.2 mi\" or \"1,9 km\").",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "GoogleMapsLinks": {
                    "description": "Links to trigger different Google Maps actions.",
                    "properties": {
                      "directionsUrl": {
                        "description": "A link to show the directions to the place. The link only populates the destination location and uses the default travel mode `DRIVE`.",
                        "type": "string"
                      },
                      "photosUrl": {
                        "description": "A link to show photos of this place on Google Maps.",
                        "type": "string"
                      },
                      "placeUrl": {
                        "description": "A link to show this place.",
                        "type": "string"
                      },
                      "reviewsUrl": {
                        "description": "A link to show reviews of this place on Google Maps.",
                        "type": "string"
                      },
                      "writeAReviewUrl": {
                        "description": "A link to write a review for this place on Google Maps.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "PlaceView": {
                    "description": "A view of a place.",
                    "properties": {
                      "attribution": {
                        "$ref": "#/$defs/Attribution",
                        "description": "Required attribution to show with the place."
                      },
                      "googleMapsLinks": {
                        "$ref": "#/$defs/GoogleMapsLinks",
                        "description": "Links to trigger different Google Maps actions."
                      },
                      "id": {
                        "description": "The place ID of the underlying place.",
                        "type": "string"
                      },
                      "location": {
                        "$ref": "#/$defs/LatLng",
                        "description": "The position of this place."
                      },
                      "place": {
                        "description": "The resource name of the underlying place, in the format of \"places/{id}\".",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Result": {
                    "description": "A search result along the route, pairing a place with its detour metrics.",
                    "properties": {
                      "detourSummary": {
                        "$ref": "#/$defs/DetourSummary",
                        "description": "Output only. Detour metrics incurred by adding this place as an intermediate stop along the route. Omitted or empty if detour metrics could not be calculated.",
                        "readOnly": true
                      },
                      "place": {
                        "$ref": "#/$defs/PlaceView",
                        "description": "Output only. Details about the place found along the route.",
                        "readOnly": true
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Response message for SearchAlongRoute.",
                "properties": {
                  "contentToken": {
                    "description": "Output only. An encrypted token that encapsulates the search context and can be passed to Google Maps visual rendering services, SDKs, or the Maps Agentic UI Toolkit (A2UI) to display interactive UI components for the returned search results.",
                    "readOnly": true,
                    "type": "string"
                  },
                  "results": {
                    "description": "Output only. The ranked list of search results found along the route.",
                    "items": {
                      "$ref": "#/$defs/Result"
                    },
                    "readOnly": true,
                    "type": "array"
                  },
                  "summary": {
                    "description": "Output only. Natural language summary of search results and detour trade-offs. May contain zero-based citations (e.g. \"[0]\", \"[1]\") referencing the corresponding entries in the `results` list.",
                    "readOnly": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "resolve_names",
              "description": "Resolves a batch list of specific location queries (landmark names or exact addresses) into canonical Google Maps Place IDs.\n\n**Input Requirements (CRITICAL):**\n\n1.  **`queries` (array of objects - MANDATORY):** A list of location queries to resolve. You may specify up to 20 queries.\n    *   **Each query object must have:**\n        *   **`text` (string - MANDATORY):** The text query representing a specific place name or address to resolve.\n            *   **Examples:** `'Googleplex, Mountain View, CA'`, `'1600 Amphitheatre Pkwy, Mountain View, CA'`, `'Eiffel Tower, Paris'`.\n\n2.  **`location_bias` (object - OPTIONAL):** Use this to prioritize results near a specific geographic area.\n    *   **Format:** `{\"viewport\": {\"low\": {\"latitude\": [value], \"longitude\": [value]}, \"high\": {\"latitude\": [value], \"longitude\": [value]}}}`\n\n3.  **`region_code` (string - OPTIONAL):** The Unicode CLDR region code (two-letter country code, e.g., `US`, `CA`) of the user to bias the results.\n\n**Instructions for Tool Call:**\n\n*   Specificity (CRITICAL): Queries must represent a specific place name or address. General searches like `'restaurants'` or chain names like `'Starbucks'` are not supported.\n*   Do NOT call this tool if the downstream tools you plan to invoke already accept raw address or place name strings directly.\n\n**Save to Google Maps:**\n\n*   The response includes a `save_to_maps_url` field: a single Google Maps link containing all successfully resolved places.\n*   When the user wants to save, share, or open the resolved places as a list in Google Maps, present this link to the user. Do NOT construct this link yourself.\n\n**Error Handling (CRITICAL):**\n\n*   This is a batch processing tool. A request might return \"mixed results\" (e.g. some queries resolve successfully while others fail).\n*   The output list of `results` is guaranteed to map 1:1 with the input `queries` indices. A failed query will result in an empty `Result` message (no `entity` is set) at its corresponding index in the `results` list.\n*   You **MUST** check the `failed_requests` map field in the response to identify which specific query index failed. The key of `failed_requests` represents the 0-based index of the failed query in the request. Do not assume the entire batch call failed because of a partial failure.\n",
              "inputSchema": {
                "$defs": {
                  "LatLng": {
                    "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard \u003chttps://en.wikipedia.org/wiki/World_Geodetic_System#1984_version\u003e. Values must be within normalized ranges.",
                    "properties": {
                      "latitude": {
                        "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
                        "format": "double",
                        "type": "number"
                      },
                      "longitude": {
                        "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
                        "format": "double",
                        "type": "number"
                      }
                    },
                    "type": "object"
                  },
                  "LocationBias": {
                    "description": "The region to bias the resolution results to.",
                    "properties": {
                      "viewport": {
                        "$ref": "#/$defs/Viewport",
                        "description": "A viewport defined by a bounding box."
                      }
                    },
                    "type": "object"
                  },
                  "LocationQuery": {
                    "description": "A location query represents a specific location entity that can be resolved with Google Maps. Currently, only place names and addresses are supported as location queries.",
                    "properties": {
                      "text": {
                        "description": "Required. The text query to resolve to a specific geospatial entity on Google Maps, such as a place or an address. The more specific the query, the more accurate the resolution. For example, \"San Francisco\", \"Googleplex, Mountain View, CA\", \"1600 Amphitheatre Parkway, Mountain View, CA\", or \"Eiffel Tower, Paris\". Queries must be a specific address or place name. General locations like a chain name (e.g. Starbucks) or a search query like \"restaurants\" are not supported.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  },
                  "Viewport": {
                    "description": "A latitude-longitude viewport, represented as two diagonally opposite `low` and `high` points. A viewport is considered a closed region, i.e. it includes its boundary. The latitude bounds must range between -90 to 90 degrees inclusive, and the longitude bounds must range between -180 to 180 degrees inclusive. Various cases include: - If `low` = `high`, the viewport consists of that single point. - If `low.longitude` \u003e `high.longitude`, the longitude range is inverted (the viewport crosses the 180 degree longitude line). - If `low.longitude` = -180 degrees and `high.longitude` = 180 degrees, the viewport includes all longitudes. - If `low.longitude` = 180 degrees and `high.longitude` = -180 degrees, the longitude range is empty. - If `low.latitude` \u003e `high.latitude`, the latitude range is empty. Both `low` and `high` must be populated, and the represented box cannot be empty (as specified by the definitions above). An empty viewport will result in an error. For example, this viewport fully encloses New York City: { \"low\": { \"latitude\": 40.477398, \"longitude\": -74.259087 }, \"high\": { \"latitude\": 40.91618, \"longitude\": -73.70018 } }",
                    "properties": {
                      "high": {
                        "$ref": "#/$defs/LatLng",
                        "description": "Required. The high point of the viewport."
                      },
                      "low": {
                        "$ref": "#/$defs/LatLng",
                        "description": "Required. The low point of the viewport."
                      }
                    },
                    "required": [
                      "low",
                      "high"
                    ],
                    "type": "object"
                  }
                },
                "description": "Request message for ResolveNames.",
                "properties": {
                  "locationBias": {
                    "$ref": "#/$defs/LocationBias",
                    "description": "Optional. An optional region to bias the resolution results. If specified, the resolution results will be biased towards the entities that are closer to this region. Including `location_bias` or `region_code` often provides better results by narrowing the search space. If both `location_bias` and `region_code` are specified, `location_bias` takes precedence over `region_code`."
                  },
                  "queries": {
                    "description": "Required. A list of location queries to be resolved. You may specify up to 20 queries.",
                    "items": {
                      "$ref": "#/$defs/LocationQuery"
                    },
                    "type": "array"
                  },
                  "regionCode": {
                    "description": "Optional. An optional region code to bias the resolution results. If specified, the resolution results will be biased towards the entities that are in or near the specified region. This should be a CLDR region code. For example, \"US\" or \"CA\". Including `location_bias` or `region_code` often provides better results by narrowing the search space. If both `location_bias` and `region_code` are specified, `location_bias` takes precedence over `region_code`.",
                    "type": "string"
                  }
                },
                "required": [
                  "queries"
                ],
                "type": "object"
              },
              "outputSchema": {
                "$defs": {
                  "Entity": {
                    "description": "A single resolved entity from a given query.",
                    "properties": {
                      "place": {
                        "description": "The resource name of the resolved place.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Result": {
                    "description": "A single resolved entity from a given location query, along with the confidence level of the resolution.",
                    "properties": {
                      "confidence": {
                        "description": "Output only. The level of confidence for the resolution.",
                        "enum": [
                          "CONFIDENCE_UNSPECIFIED",
                          "MEDIUM",
                          "HIGH"
                        ],
                        "readOnly": true,
                        "type": "string",
                        "x-google-enum-descriptions": [
                          "Default value. This value is unused.",
                          "Medium confidence indicates that the resolution is likely correct but there may be other candidates.",
                          "High confidence indicates that the resolution is correct and represents a specific geospatial entity (e.g., a specific place)."
                        ]
                      },
                      "entity": {
                        "$ref": "#/$defs/Entity",
                        "description": "Output only. The resolved entity from the location query.",
                        "readOnly": true
                      }
                    },
                    "type": "object"
                  },
                  "Status": {
                    "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).",
                    "properties": {
                      "code": {
                        "description": "The status code, which should be an enum value of google.rpc.Code.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "details": {
                        "description": "A list of messages that carry the error details. There is a common set of message types for APIs to use.",
                        "items": {
                          "additionalProperties": {
                            "description": "Properties of the object. Contains field @type with type URL."
                          },
                          "type": "object"
                        },
                        "type": "array"
                      },
                      "message": {
                        "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Response message for ResolveNames.",
                "properties": {
                  "failedRequests": {
                    "additionalProperties": {
                      "$ref": "#/$defs/Status"
                    },
                    "description": "Output only. A map communicating partial failures. The key is the index of the failed request in the `queries` field. The value is the error status detailing why the resolution failed.",
                    "readOnly": true,
                    "type": "object"
                  },
                  "results": {
                    "description": "Output only. The list of resolved entities from the location queries. Guaranteed to map 1:1 with the request `queries` indices. An empty string at index `i` indicates the resolution failed for that query. If the resolution failed, please check the `failed_requests` field for the error status.",
                    "items": {
                      "$ref": "#/$defs/Result"
                    },
                    "readOnly": true,
                    "type": "array"
                  },
                  "saveToMapsUrl": {
                    "description": "Output only. A link to save all successfully resolved entities in Google Maps.",
                    "readOnly": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "resolve_maps_urls",
              "description": "Resolves a list of Google Maps URLs into canonical Google Maps Place IDs.\n\n**When to call this tool (CRITICAL):**\n\n*   Use this tool when the user provides one or more Google Maps sharing links or URLs (e.g. 'https://maps.app.goo.gl/...', 'https://www.google.com/maps/place/...', or 'https://maps.google.com/...') and you need to extract the underlying canonical Place IDs.\n*   You can specify up to 20 URLs to resolve in a single batch request.\n\n**Input Requirements (CRITICAL):**\n\n*   **`urls` (array of strings - MANDATORY):** The list of Google Maps URLs to resolve. Each URL must be a valid, single-place Google Maps URL.\n\n**Save to Google Maps:**\n\n*   The response includes a `save_to_maps_url` field: a single Google Maps link containing all successfully resolved places.\n*   When the user wants to save, share, or open the resolved places as a list in Google Maps (e.g. collecting places shared in a conversation), present this link to the user. Do NOT construct this link yourself.\n\n**Error Handling (CRITICAL):**\n\n*   This is a batch processing tool. A request might return \"mixed results\" (e.g. some URLs resolve successfully while others fail).\n*   The output list of `entities` is guaranteed to map 1:1 with the input `urls` indices. A failed URL resolution will result in an empty `Entity` message (no fields are set) at its corresponding index in the `entities` list.\n*   You **MUST** check the `failed_requests` map field in the response to identify which specific URL index failed. The key of `failed_requests` represents the 0-based index of the failed URL in the request. Do not assume the entire batch call failed because of a partial failure.\n",
              "inputSchema": {
                "description": "Request message for ResolveMapsUrls.",
                "properties": {
                  "urls": {
                    "description": "Required. The Google Maps URLs to be resolved. Each URL should be a valid Google Maps URL, for example, https://maps.app.goo.gl/..., https://www.google.com/maps/place/..., or https://maps.google.com/.... Currently, only URLs pointing to a single place are supported. You may specify up to 20 URLs.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "urls"
                ],
                "type": "object"
              },
              "outputSchema": {
                "$defs": {
                  "Entity": {
                    "description": "A single resolved entity from a given query.",
                    "properties": {
                      "place": {
                        "description": "The resource name of the resolved place.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "Status": {
                    "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).",
                    "properties": {
                      "code": {
                        "description": "The status code, which should be an enum value of google.rpc.Code.",
                        "format": "int32",
                        "type": "integer"
                      },
                      "details": {
                        "description": "A list of messages that carry the error details. There is a common set of message types for APIs to use.",
                        "items": {
                          "additionalProperties": {
                            "description": "Properties of the object. Contains field @type with type URL."
                          },
                          "type": "object"
                        },
                        "type": "array"
                      },
                      "message": {
                        "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "description": "Response message for ResolveMapsUrls.",
                "properties": {
                  "entities": {
                    "description": "Output only. The list of resolved entities from the Google Maps URLs. Guaranteed to map 1:1 with the request `urls` indices. An empty message at index `i` (where no `entity` is set) indicates the resolution failed for that URL. If the resolution failed, please check the `failed_requests` field for the error status.",
                    "items": {
                      "$ref": "#/$defs/Entity"
                    },
                    "readOnly": true,
                    "type": "array"
                  },
                  "failedRequests": {
                    "additionalProperties": {
                      "$ref": "#/$defs/Status"
                    },
                    "description": "Output only. A map communicating partial failures for the Google Maps URLs. The key is the index of the failed request in the `urls` field. The value is the error status detailing why the resolution failed.",
                    "readOnly": true,
                    "type": "object"
                  },
                  "saveToMapsUrl": {
                    "description": "Output only. A link to save all successfully resolved entities in Google Maps.",
                    "readOnly": true,
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            }
          ],
          "schemaTokens": 25597,
          "changedAt": "2026-11-07T01:45:16.836601487Z",
          "check": {
            "checker": "anchor-check/1.0",
            "totalTokens": 25597,
            "counts": {
              "error": 0,
              "note": 0,
              "warn": 16
            },
            "findings": [
              {
                "rule": "TC07",
                "severity": "warn",
                "tool": "compute_routes",
                "message": "the description is about 940 tokens",
                "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
              },
              {
                "rule": "TC07",
                "severity": "warn",
                "tool": "lookup_weather",
                "message": "the description is about 2,371 tokens",
                "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
              },
              {
                "rule": "TC07",
                "severity": "warn",
                "tool": "resolve_names",
                "message": "the description is about 577 tokens",
                "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
              },
              {
                "rule": "TC07",
                "severity": "warn",
                "tool": "search_along_route",
                "message": "the description is about 750 tokens",
                "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
              },
              {
                "rule": "TC07",
                "severity": "warn",
                "tool": "search_places",
                "message": "the description is about 718 tokens",
                "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
              },
              {
                "rule": "TC15",
                "severity": "warn",
                "tool": "compute_routes",
                "message": "inputSchema uses $ref/$defs",
                "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
              },
              {
                "rule": "TC15",
                "severity": "warn",
                "tool": "lookup_weather",
                "message": "inputSchema uses $ref/$defs",
                "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
              },
              {
                "rule": "TC15",
                "severity": "warn",
                "tool": "resolve_names",
                "message": "inputSchema uses $ref/$defs",
                "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
              },
              {
                "rule": "TC15",
                "severity": "warn",
                "tool": "search_along_route",
                "message": "inputSchema uses $ref/$defs",
                "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
              },
              {
                "rule": "TC15",
                "severity": "warn",
                "tool": "search_places",
                "message": "inputSchema uses $ref/$defs",
                "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "compute_routes",
                "message": "the definition is about 2,544 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "lookup_weather",
                "message": "the definition is about 13,796 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "resolve_names",
                "message": "the definition is about 2,459 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "search_along_route",
                "message": "the definition is about 3,188 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "search_places",
                "message": "the definition is about 2,486 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC23",
                "severity": "warn",
                "message": "6 tools, about 25,628 tokens of definitions",
                "fix": "Split the server by job, or offer a smaller default toolset (a read-only set, or a search-then-call pattern)."
              }
            ]
          }
        },
        "github": {
          "repo": "googlemaps/google-maps-services-python",
          "checkedAt": "2026-11-02T08:52:28.541960274Z",
          "stars": 4987,
          "archived": false,
          "issuesEnabled": true,
          "pushedAt": "2026-10-06T15:58:22Z",
          "openIssues": 54,
          "openPRs": 19,
          "issuesOpened90d": 1,
          "issuesClosed90d": 0,
          "prsMerged90d": 2,
          "ci": {
            "branch": "master",
            "runs": 2,
            "success": 0,
            "failure": 2,
            "other": 0,
            "latest": "failure",
            "latestAt": "2026-10-06T16:10:33Z"
          },
          "replies": {
            "sampled": 25,
            "unanswered": 15,
            "medianDays": 0
          }
        },
        "updatedAt": "2026-11-07T22:55:59.28019699Z"
      }
    },
    "answer": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against MapTiler Cloud's 62.1 (B), and leads in 4 of 7 scored categories. MapTiler Cloud leads on transparency \u0026 trust.",
    "b": {
      "slug": "maptiler",
      "name": "MapTiler Cloud",
      "vendor": "MapTiler AG",
      "vendorUrl": "https://www.maptiler.com",
      "kind": "http-api",
      "category": "maps",
      "summary": "MapTiler Cloud is a hosted maps platform from MapTiler AG in Switzerland. Its read-only REST APIs serve map styles, vector and raster tiles, static maps, forward and reverse geocoding, IP geolocation, elevation, coordinate transforms and weather data.",
      "url": "https://www.anchorterminal.com/tools/maptiler",
      "markdownUrl": "https://www.anchorterminal.com/tools/maptiler.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/maptiler.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/maptiler.json",
      "dns": "maptiler.grade.anchorterminal.com",
      "repo": "https://github.com/maptiler/maptiler-client-js",
      "transports": [
        "http"
      ],
      "packages": [
        {
          "registry": "npm",
          "name": "@maptiler/client"
        },
        {
          "registry": "npm",
          "name": "@maptiler/sdk"
        }
      ],
      "auth": "api-key",
      "authNotes": "API key from the MapTiler Cloud account after a browser signup, always passed as the `key` query parameter. Keys can be limited to HTTP origins and a User-Agent substring and are managed through the Service API. From a backend, a service token can sign each request with a `signature` parameter instead. The Service API (uploads, tilesets, keys, analytics) needs a service token.",
      "pricing": "freemium",
      "pricingNotes": "Free plan with 100,000 API requests, 5,000 sessions and 1,000 search sessions a month, no card, for testing and non-commercial use; service pauses at the limit. Flex is $30 a month with 500,000 requests, then $0.15 per 1,000 requests and $2.50 per 1,000 search sessions. Custom contracts carry a 99.9% SLA.",
      "priceSummary": "$0.15 / 1k req",
      "where": "local",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the API reference, OpenAPI spec, llms.txt or pricing page (checked 2026-11-06). Paid plans are billed by FastSpring.",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": null,
        "npmWeekly": 114682,
        "pypiWeekly": null,
        "asOf": "2026-11-06"
      },
      "docsUrl": "https://docs.maptiler.com/cloud/api/",
      "llmsTxt": "https://docs.maptiler.com/llms.txt",
      "openapi": "https://docs.maptiler.com/_data/cloud/api/openapi.yml",
      "capabilities": [
        "geo.geocode",
        "geo.reverse",
        "geo.places",
        "geo.tiles",
        "data.weather"
      ],
      "tags": [
        "hosted",
        "api-key",
        "freemium",
        "free-tier",
        "no-card",
        "llms-txt",
        "openapi",
        "official",
        "agent-skills",
        "typescript",
        "status-page",
        "security-txt",
        "iso27001",
        "eu",
        "eu-region",
        "sla",
        "closed-source"
      ],
      "lastRelease": "2026-10-02",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 62.1,
        "grade": "B",
        "agentReady": false,
        "rank": 576,
        "ranked": true,
        "rankOf": 1510,
        "categoryRank": 10,
        "methodology": "0.7",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 70,
          "maintenance": 70,
          "payments": 40,
          "reliability": 43,
          "schema": 79,
          "security": 64,
          "transparency": 80
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-11-06"
        },
        "negative": 0,
        "verdict": "MapTiler Cloud has an OpenAPI 3.1 reference, llms.txt with Markdown pages, an agent skill and ISO 27001 certification, and allows geocoding results to be stored. The key always travels in the query string, there's no routing API, no documented rate limit or 429 handling, and the free plan excludes commercial use.",
        "bestFor": "Map tiles, static maps and worldwide geocoding with storable results for apps that also show a map, with EU data residency.",
        "strengths": [
          "OpenAPI 3.1.0 spec, llms.txt, llms-full.txt and a Markdown version of every docs page",
          "Geocoding results may be bulk downloaded and used outside the service with attribution",
          "Keys can be restricted by origin and User-Agent, and service tokens can sign requests instead",
          "ISO/IEC 27001:2022 certification, security.txt and a vulnerability disclosure policy",
          "EU-only endpoint at api.maptiler.eu and hosting mainly in Switzerland and the EEA"
        ],
        "weaknesses": [
          "The API key is always sent as a query parameter",
          "No routing, directions or matrix API",
          "No per-second rate limit, 429 behaviour or retry guidance found in the documentation",
          "The free plan is for testing and non-commercial use only, and pauses at its monthly limit",
          "Official clients are JavaScript and TypeScript only"
        ],
        "agentNotes": [
          "Restrict the key to an origin or User-Agent, or sign requests with a service token from a backend, since the key appears in every URL",
          "Use the batch geocoding path (up to 50 semicolon-separated queries) rather than one call per address",
          "Use api.maptiler.eu when the user's requests must stay in the EU",
          "Read docs pages as Markdown by appending .md, starting from https://docs.maptiler.com/llms.txt",
          "Don't cache map tiles server-side; the Cloud terms forbid it, though geocoding results may be stored with attribution"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.7",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 62.1
          }
        ],
        "editorialScores": {
          "ergonomics": 70,
          "maintenance": 70,
          "payments": 40,
          "reliability": 43,
          "schema": 79,
          "security": 64,
          "transparency": 64
        },
        "provenanceScore": 96,
        "checked": {
          "categories": {
            "ergonomics": "2026-11-06",
            "maintenance": "2026-11-06",
            "payments": "2026-11-06",
            "reliability": "2026-11-06",
            "schema": "2026-11-06",
            "security": "2026-11-06",
            "transparency": "2026-11-06"
          },
          "last": "2026-11-06",
          "oldest": "2026-11-06",
          "stale": false,
          "staleAfterDays": 90
        }
      },
      "connect": {
        "install": "npm install @maptiler/client",
        "http": "curl \"https://api.maptiler.com/geocoding/Zurich.json?language=en\u0026limit=3\u0026key=$MAPTILER_API_KEY\""
      },
      "letme": {
        "capability": "https://letme.dev/geo.geocode",
        "tool": "https://letme.dev/maptiler"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "API requests over the Flex allowance",
          "unit": "1k-requests",
          "usd": 0.15,
          "note": "Flex includes 500,000 a month"
        },
        {
          "item": "Search sessions over the Flex allowance",
          "unit": "1k-requests",
          "usd": 2.5,
          "note": "Priced per 1,000 search sessions through MapTiler SDK JS"
        },
        {
          "item": "Flex plan",
          "unit": "month",
          "usd": 30,
          "note": "Extra usage billed monthly"
        }
      ],
      "provenance": {
        "legalEntity": "MapTiler AG",
        "domain": "maptiler.com",
        "domainRegistered": "2008-08-08",
        "endpointOnVendorDomain": true,
        "terms": "https://www.maptiler.com/terms/",
        "privacy": "https://www.maptiler.com/privacy-policy/",
        "statusPage": "https://status.maptiler.com",
        "changelog": "https://docs.maptiler.com/updates/",
        "securityTxt": "valid",
        "checked": "2026-11-06",
        "notes": [
          "The general terms name MapTiler AG, Zugerstrasse 22, 6314 Unterägeri, Switzerland, under Swiss law with courts in Zug.",
          "security.txt at www.maptiler.com/.well-known/security.txt names sysadmin@maptiler.com, a PGP key and a signature, and has no Expires field.",
          "status.maptiler.com is a StatusCake public report whose data loads from app.statuscake.com. That host's robots.txt answered with a redirect, so it wasn't fetched and no uptime or incident history was read.",
          "RDAP gives maptiler.com a registration date of 8 August 2008.",
          "No clause on automated access to the website was found in the general terms. robots.txt on www.maptiler.com and docs.maptiler.com allows all agents apart from a few paths."
        ],
        "score": 96
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/maptiler.json",
      "live": {
        "slug": "maptiler",
        "vendorStatus": {
          "page": "https://status.maptiler.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-11-07T04:48:02.124798696Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "maptiler/maptiler-client-js",
            "version": "v3.1.0",
            "released": "2026-10-02",
            "seenAt": "2026-11-06T23:42:38.646681081Z"
          },
          {
            "registry": "npm",
            "name": "@maptiler/client",
            "version": "3.1.0",
            "seenAt": "2026-11-06T23:42:36.419318643Z"
          },
          {
            "registry": "npm",
            "name": "@maptiler/sdk",
            "version": "4.2.1",
            "seenAt": "2026-11-06T23:42:37.315182633Z"
          }
        ],
        "githubStars": 25,
        "npmWeekly": 114682,
        "securityTxt": {
          "url": "https://maptiler.com/.well-known/security.txt",
          "state": "valid",
          "checkedAt": "2026-11-07T15:59:35.51300876Z"
        },
        "llmsTxt": {
          "url": "https://docs.maptiler.com/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-11-07T15:32:57.151624353Z"
        },
        "pages": [
          {
            "url": "https://docs.maptiler.com/updates/",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-11-07T14:06:56.724195464Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "1152e8fe8b9d"
          },
          {
            "url": "https://www.maptiler.com/privacy-policy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-11-07T14:31:21.154658791Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "46d3f1544780"
          },
          {
            "url": "https://www.maptiler.com/terms/",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-11-07T14:31:23.29013826Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "fc740f21aa9f"
          }
        ],
        "updatedAt": "2026-11-07T15:59:35.51300876Z"
      }
    },
    "edges": [
      {
        "by": 47,
        "category": "reliability",
        "leads": "google-maps-platform",
        "name": "Reliability",
        "reasons": {
          "a": "Google Cloud's status dashboard has a Maps Platform section with per-product incident history and a JSON feed, re-read on 1 November (20). The 26 July traffic-data incident has left the 90-day window (cause time). Four incidents since 3 August. Directions, Distance Matrix and Routes had elevated errors and latency from 18:56 to 20:40 UTC on 19 October. Reverse-geocoding requests to the Geocoding API resolved to an address in Vietnam from 02:40 to 04:42 UTC on 23 October, which Google labels an outage, and some street results came back with incomplete or wrongly localised addresses from 25 October, resolved by 30 October with data restoration still running. A Maps SDK for Android crash on some Adreno GPUs on 28 September isn't on this listing's surfaces. Each touches one product, one group of products or some requests, so each is partial and read as minor, as this run reads Google's dashboard on google-speech-to-text and google-cloud-document-ai (20). Grounding Lite (now Maps Experience agent tools) quotas are 300 queries a minute per project for search, weather and routes and 600 for the resolvers, per the 1 October check, not re-read on 1 November (15). The Geocoding best-practice page gives exponential backoff with a worked example, 100 ms doubling to 5 s, and says which status codes to retry, per the 1 October check (15). A 99.9 per cent monthly SLA with 10, 25 and 50 per cent credits, re-read on 1 November (10). Places (New), Routes and the agent tools' Essentials SKU are GA; the Pro SKU is in Restricted GA (10). 20 + 20 + 15 + 15 + 10 + 10 = 90.",
          "b": "Hosted lines. status.maptiler.com is a StatusCake public uptime report rather than a component incident page (15). Its data loads from app.statuscake.com, whose robots.txt answered with a redirect, so we didn't fetch it and read no history. That's our limit, not a finding, and the rubric gives 5 (5). Monthly request and session quotas are published per plan, but no per-second limit (5). No 429, Retry-After or backoff guidance found in the API reference, the OpenAPI spec or llms-full.txt (0). The pricing page lists a 99.9% SLA on the Custom plan, while the Cloud terms call availability best effort and point to a custom SLA (8). The public APIs are GA (10). 15+5+5+0+8+10 = 43."
        },
        "scores": {
          "a": 90,
          "b": 43
        }
      },
      {
        "by": 15,
        "category": "ergonomics",
        "leads": "google-maps-platform",
        "name": "Agent ergonomics",
        "reasons": {
          "a": "Grounding Lite has three tools plus two experimental resolvers, and the REST APIs size their responses with X-Goog-FieldMask, which also sets the price (25). pageSize and pageToken on Text Search, includedTypes, locationBias and locationRestriction (20). google.rpc status codes with messages, and Geocoding's OK, UNKNOWN_ERROR, OVER_QUERY_LIMIT and INVALID_REQUEST split into retryable and not (16). Every agent-facing call is a read and the backoff guidance is explicit. We couldn't check MCP annotations on the closed server (14). Official generated clients in many languages, such as @googlemaps/places 3.0.1 on npm, but a missing field mask on Places (New) or Routes is an error rather than a default, which costs a turn (10).",
          "b": "API reading. limit, types, bbox, proximity, country, language and fuzzyMatch size geocoding results, and the batch endpoint takes up to 50 queries (20). Country, bbox and type filters, no pagination (geocoding rarely needs it) (16). Errors are documented as 400 and 403 with no recovery guidance (10). Every public API reads and is safe to retry (12). Few required parameters, but official clients are JavaScript and TypeScript only, plus native mobile SDKs (12). 20+16+10+12+12 = 70."
        },
        "scores": {
          "a": 85,
          "b": 70
        }
      },
      {
        "by": 10,
        "category": "maintenance",
        "leads": "google-maps-platform",
        "name": "Maintenance \u0026 community",
        "reasons": {
          "a": "Newest dated API change is the Routes API note of 23 October 2026 on route tokens passed to the Navigation SDK, 9 days before this check (30). Three dated release-note entries in the 90 days from 3 August, Places API (New) on 6 August (entrances and navigation points), Geocoding API on 13 October (entrance display names and Experimental parking facilities) and Routes API on 23 October. The listed googlemaps Python client and Node services library tagged nothing in the window (20). Dated release notes, emailed change notices and a paid support route (12). Current generated clients such as @googlemaps/places, but the listed Python library googlemaps last tagged v4.10.0 on 26 January 2023 and its README now sends new APIs to the Cloud client libraries, and the Node services library last tagged v3.4.2 on 6 July 2025 (12). The generated clients are built in googleapis' CI. The older libraries say they sit outside the SLA and deprecation policy (6). 30 + 20 + 12 + 12 + 6 = 80.",
          "b": "@maptiler/client 3.1.0 and @maptiler/sdk 4.2.0 on 2 October 2026, 35 days before this check, with the agent skill updated on 21 October (20). Platform updates entries for August (EU endpoint, key security) and September 2026 (terrain blending) plus the two October releases (20). A Discord community and support answered on a best-effort basis within two business days, per the Cloud terms. We didn't read GitHub issues (10). Official JavaScript client and SDK current, no Python client (12). The SDK repository runs unit and end-to-end tests in CI; we didn't check results (8). 20+20+10+12+8 = 70."
        },
        "scores": {
          "a": 80,
          "b": 70
        }
      },
      {
        "by": 9,
        "category": "security",
        "leads": "google-maps-platform",
        "name": "Security \u0026 auth",
        "reasons": {
          "a": "API keys with API restrictions and IP restrictions, documented rotation with an overlap window, and OAuth 2.0 with per-method scopes (such as maps-platform.places.textsearch in the Places discovery document) and the maps-platform.mapstools scope for the agent tools, which earns 30. Less 10 because a credential can travel in the URL. Classic Geocoding and Static Maps take the key as the `key` query parameter, and on 1 November Places API (New) answered a made-up `?key=` with API_KEY_INVALID and a made-up `?access_token=` with 401 invalid credentials (not missing), with both listed as query parameters in its discovery document. That's one deduction, the same test and reading as google-weather-api and gmail-api (20). A key can be restricted to the APIs it needs, and no agent-facing call writes anything (16). Places and the agent tools return reviews and AI-generated place summaries, which are third-party text, and we found no prompt-injection guidance (5). Cloud Monitoring's Metrics Explorer shows usage per key and per API (12). google.com's security.txt is valid to 1 April 2030 and names the vulnerability reward programme, and the Maps Platform trust centre lists ISO/IEC 27001:2022 and 27017, SOC 2 and SOC 3, both read on 1 November. Read as Google's hosted APIs whose product a certification names are read in this run (gmail-api, google-drive-api, google-cloud-document-ai, google-model-armor, google-speech-to-text) (20). 20 + 16 + 5 + 12 + 20 = 73.",
          "b": "Revocable keys that can be limited to origins and a User-Agent substring and managed by the API keys API, and service tokens that sign requests so the token itself never travels, which earns 27. Less 10 because the key is 'always passed as a query parameter' (17). The public APIs are read-only, and account changes need a separate service token (16). Geocoding returns OpenStreetMap names and addresses, community-edited text, with no prompt-injection guidance (7). An Analytics API and account usage statistics (8). security.txt, a vulnerability disclosure policy and ISO/IEC 27001:2022 certification per the security page. No bug bounty found (16). 17+16+7+8+16 = 64."
        },
        "scores": {
          "a": 73,
          "b": 64
        }
      },
      {
        "by": 8,
        "category": "transparency",
        "leads": "maptiler",
        "name": "Transparency \u0026 trust",
        "reasons": {
          "a": "Closed service with long, specific terms that were last modified 26 August 2026, and Apache-2.0 client libraries (18). The service terms spell out caching (coordinates 30 days, place IDs exempt, a per-user geocode cache allowed) and Grounding Lite says Maps content isn't cached, stored or used to improve the model. The privacy policy is Google's general one (22). A 12-month deprecation policy and a deprecations page with dates, such as the Heatmap Layer deprecated May 2025 and gone May 2026 (20). Separate EEA terms and regional contracting entities are disclosed. A Maps Platform subprocessor list wasn't at the URL we tried (5).",
          "b": "Editorial half only. Closed service with general and Cloud-specific terms under Swiss law, and SDKs under BSD 3-Clause and the skill under MIT (20). The privacy policy covers account and payment data and says legal-claim data is kept up to 10 years, but says nothing about how long API request logs are kept (15). A dated deprecation page for v3 maps and migration guides, with no written notice period (12). Hosting with OVHcloud and Google Firebase, data mainly in Switzerland and the EEA, and an EU-only endpoint. Google Analytics, Firebase and FastSpring named in the privacy policy (17). 20+15+12+17 = 64."
        },
        "scores": {
          "a": 72,
          "b": 80
        }
      }
    ],
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Google",
        "b": "MapTiler AG",
        "name": "Vendor"
      },
      {
        "a": "https://maps.googleapis.com",
        "b": "no (local only)",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP, Streamable HTTP",
        "b": "HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth or key",
        "b": "API key",
        "name": "Auth"
      },
      {
        "a": "Pay per use",
        "b": "Freemium",
        "name": "Pricing"
      },
      {
        "a": "$5 per 1,000 requests",
        "b": "not published",
        "name": "Price for geocoding"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "Apache-2.0 (client libraries)",
        "b": "none",
        "name": "Licence"
      },
      {
        "a": "5",
        "b": "none",
        "name": "Tools exposed"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "no",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "2026-10-23",
        "b": "2026-10-02",
        "name": "Last release"
      },
      {
        "a": "2026-08-26",
        "b": "no date given",
        "name": "Terms last updated"
      },
      {
        "a": "2026-10-01",
        "b": "no date given",
        "name": "Privacy policy last updated"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Customer content may train models"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Terms restrict automated access"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "not found in the text",
        "b": "yes",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "5k stars, 1.2M npm/wk, 748k PyPI/wk",
        "b": "115k npm/wk",
        "name": "Popularity"
      },
      {
        "a": "2.5/5 (2)",
        "b": "none",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against MapTiler Cloud's 62.1 (B), and leads in 4 of 7 scored categories. MapTiler Cloud leads on transparency \u0026 trust.",
        "question": "Which is better for AI agents, Google Maps Platform + Grounding Lite MCP or MapTiler Cloud?"
      },
      {
        "answer": "Google Maps Platform + Grounding Lite MCP takes an API key or an OAuth sign-in. MapTiler Cloud needs an API key.",
        "question": "Do Google Maps Platform + Grounding Lite MCP and MapTiler Cloud need an API key?"
      },
      {
        "answer": "Google Maps Platform + Grounding Lite MCP has a hosted endpoint at https://maps.googleapis.com. No hosted endpoint is listed for MapTiler Cloud.",
        "question": "Can an agent call Google Maps Platform + Grounding Lite MCP and MapTiler Cloud without installing anything?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Reliability, 90 against 43",
          "Agent ergonomics, 85 against 70",
          "Security \u0026 auth, 73 against 64",
          "Maintenance \u0026 community, 80 against 70"
        ],
        "also": [
          "Agent-ready, a grade of BB or better",
          "A hosted endpoint, with nothing to install"
        ],
        "goodFor": "Best when the answer has to match what the user sees in Google Maps, for place details, opening hours and reviews.",
        "slug": "google-maps-platform",
        "watchFor": "Free monthly caps beyond the prototyping Demo Key need a Cloud billing account with a payment method"
      },
      {
        "aheadOn": [
          "Transparency \u0026 trust, 80 against 72"
        ],
        "also": [
          "Free to start without a card"
        ],
        "goodFor": "Map tiles, static maps and worldwide geocoding with storable results for apps that also show a map, with EU data residency.",
        "slug": "maptiler",
        "watchFor": "The API key is always sent as a query parameter"
      }
    ],
    "history": {
      "google-maps-platform": [
        {
          "causes": [
            "product",
            "evidence",
            "time"
          ],
          "date": "2026-11-01",
          "delta": 7.2,
          "from": 68.2,
          "fromGrade": "B",
          "to": 75.4,
          "toGrade": "BB"
        },
        {
          "causes": [
            "correction"
          ],
          "date": "2026-10-28",
          "delta": -0.1,
          "from": 68.3,
          "fromGrade": "B",
          "to": 68.2,
          "toGrade": "B"
        },
        {
          "causes": [
            "method"
          ],
          "date": "2026-10-27",
          "delta": 0.1,
          "from": 68.2,
          "fromGrade": "B",
          "to": 68.3,
          "toGrade": "B"
        }
      ],
      "maptiler": null
    },
    "job": {
      "capability": "geo.geocode",
      "name": "Geocoding"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/amazon-location-vs-google-maps-platform.json",
        "title": "Amazon Location Service vs Google Maps Platform + Grounding Lite MCP",
        "url": "https://www.anchorterminal.com/compare/amazon-location-vs-google-maps-platform"
      },
      {
        "json": "https://www.anchorterminal.com/compare/amazon-location-vs-maptiler.json",
        "title": "Amazon Location Service vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/amazon-location-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/arcgis-vs-google-maps-platform.json",
        "title": "ArcGIS Location Platform vs Google Maps Platform + Grounding Lite MCP",
        "url": "https://www.anchorterminal.com/compare/arcgis-vs-google-maps-platform"
      },
      {
        "json": "https://www.anchorterminal.com/compare/arcgis-vs-maptiler.json",
        "title": "ArcGIS Location Platform vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/arcgis-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/azure-maps-vs-google-maps-platform.json",
        "title": "Azure Maps vs Google Maps Platform + Grounding Lite MCP",
        "url": "https://www.anchorterminal.com/compare/azure-maps-vs-google-maps-platform"
      },
      {
        "json": "https://www.anchorterminal.com/compare/azure-maps-vs-maptiler.json",
        "title": "Azure Maps vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/azure-maps-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/geoapify-vs-google-maps-platform.json",
        "title": "Geoapify Location Platform + MCP vs Google Maps Platform + Grounding Lite MCP",
        "url": "https://www.anchorterminal.com/compare/geoapify-vs-google-maps-platform"
      },
      {
        "json": "https://www.anchorterminal.com/compare/geoapify-vs-maptiler.json",
        "title": "Geoapify Location Platform + MCP vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/geoapify-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/geocodio-vs-google-maps-platform.json",
        "title": "Geocodio vs Google Maps Platform + Grounding Lite MCP",
        "url": "https://www.anchorterminal.com/compare/geocodio-vs-google-maps-platform"
      },
      {
        "json": "https://www.anchorterminal.com/compare/geocodio-vs-maptiler.json",
        "title": "Geocodio vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/geocodio-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-here-location-services.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs HERE Location Services",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-here-location-services"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-locationiq.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs LocationIQ",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-locationiq"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-mapbox.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs Mapbox APIs + MCP",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-mapbox"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-mapquest.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs MapQuest",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-mapquest"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nominatim.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs Nominatim",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nominatim"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-opencage.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs OpenCage Geocoding API",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-opencage"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-radar.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs Radar",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-radar"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-stadia-maps.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs Stadia Maps",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-stadia-maps"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-tomtom.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs TomTom Maps APIs + MCP",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-tomtom"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-woosmap.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs Woosmap",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-woosmap"
      },
      {
        "json": "https://www.anchorterminal.com/compare/here-location-services-vs-maptiler.json",
        "title": "HERE Location Services vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/here-location-services-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/locationiq-vs-maptiler.json",
        "title": "LocationIQ vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/locationiq-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/mapbox-vs-maptiler.json",
        "title": "Mapbox APIs + MCP vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/mapbox-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/mapquest-vs-maptiler.json",
        "title": "MapQuest vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/mapquest-vs-maptiler"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-nextbillion.json",
        "title": "MapTiler Cloud vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-nextbillion"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-nominatim.json",
        "title": "MapTiler Cloud vs Nominatim",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-nominatim"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-opencage.json",
        "title": "MapTiler Cloud vs OpenCage Geocoding API",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-opencage"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-radar.json",
        "title": "MapTiler Cloud vs Radar",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-radar"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-stadia-maps.json",
        "title": "MapTiler Cloud vs Stadia Maps",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-stadia-maps"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-tomtom.json",
        "title": "MapTiler Cloud vs TomTom Maps APIs + MCP",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-tomtom"
      },
      {
        "json": "https://www.anchorterminal.com/compare/maptiler-vs-woosmap.json",
        "title": "MapTiler Cloud vs Woosmap",
        "url": "https://www.anchorterminal.com/compare/maptiler-vs-woosmap"
      }
    ],
    "panel": null,
    "scores": [
      {
        "by": 47,
        "edge": "google-maps-platform",
        "google-maps-platform": 90,
        "key": "reliability",
        "maptiler": 43,
        "name": "Reliability",
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 2,
        "edge": "maptiler",
        "google-maps-platform": 77,
        "key": "schema",
        "maptiler": 79,
        "name": "Schema \u0026 documentation",
        "weight": 13
      },
      {
        "by": 15,
        "edge": "google-maps-platform",
        "google-maps-platform": 85,
        "key": "ergonomics",
        "maptiler": 70,
        "name": "Agent ergonomics",
        "weight": 13
      },
      {
        "by": 9,
        "edge": "google-maps-platform",
        "google-maps-platform": 73,
        "key": "security",
        "maptiler": 64,
        "name": "Security \u0026 auth",
        "weight": 14
      },
      {
        "by": 0,
        "edge": "",
        "google-maps-platform": 40,
        "key": "payments",
        "maptiler": 40,
        "name": "Payments \u0026 pricing",
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 10,
        "edge": "google-maps-platform",
        "google-maps-platform": 80,
        "key": "maintenance",
        "maptiler": 70,
        "name": "Maintenance \u0026 community",
        "weight": 7
      },
      {
        "by": 8,
        "edge": "maptiler",
        "google-maps-platform": 72,
        "key": "transparency",
        "maptiler": 80,
        "name": "Transparency \u0026 trust",
        "weight": 7
      }
    ],
    "summary": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against MapTiler Cloud's 62.1 (B), and leads in 4 of 7 scored categories. MapTiler Cloud leads on transparency \u0026 trust. Both do geocoding.",
    "tasks": null,
    "tutorials": [],
    "verdicts": {
      "google-maps-platform": "Field masks size every Places and Routes response, a 99.9 per cent SLA covers the core services, and a Maps Demo Key allows prototyping without billing. Production use needs a Cloud billing account set up by a person, classic Geocoding takes the key in the URL, and the terms bar storing coordinates beyond 30 days.",
      "maptiler": "MapTiler Cloud has an OpenAPI 3.1 reference, llms.txt with Markdown pages, an agent skill and ISO 27001 certification, and allows geocoding results to be stored. The key always travels in the query string, there's no routing API, no documented rate limit or 429 handling, and the free plan excludes commercial use."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler",
    "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler.md",
    "mcp": "https://www.anchorterminal.com/mcp",
    "slim": "https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler.min.md"
  },
  "markdown": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against MapTiler Cloud's 62.1 (B), and leads in 4 of 7 scored categories. MapTiler Cloud leads on transparency \u0026 trust. Both do geocoding.\n\n- Google Maps Platform + Grounding Lite MCP: grade BB, 75.4/100, rank #63 of 1510. Markdown https://www.anchorterminal.com/tools/google-maps-platform.md · JSON https://www.anchorterminal.com/api/v1/tools/google-maps-platform.json\n- MapTiler Cloud: grade B, 62.1/100, rank #576 of 1510. Markdown https://www.anchorterminal.com/tools/maptiler.md · JSON https://www.anchorterminal.com/api/v1/tools/maptiler.json\n- Best maps, geocoding and places APIs for AI agents: https://www.anchorterminal.com/best/maps/index.md\n- All 153 maps comparisons: https://www.anchorterminal.com/compare/maps/index.md\n\n## Which one, for what\n\n### Google Maps Platform + Grounding Lite MCP (BB)\n\nGood for: Best when the answer has to match what the user sees in Google Maps, for place details, opening hours and reviews.\n\nAhead on:\n- Reliability, 90 against 43\n- Agent ergonomics, 85 against 70\n- Security \u0026 auth, 73 against 64\n- Maintenance \u0026 community, 80 against 70\n\nAlso in its favour:\n- Agent-ready, a grade of BB or better\n- A hosted endpoint, with nothing to install\n\nWatch for: Free monthly caps beyond the prototyping Demo Key need a Cloud billing account with a payment method\n\n### MapTiler Cloud (B)\n\nGood for: Map tiles, static maps and worldwide geocoding with storable results for apps that also show a map, with EU data residency.\n\nAhead on:\n- Transparency \u0026 trust, 80 against 72\n\nAlso in its favour:\n- Free to start without a card\n\nWatch for: The API key is always sent as a query parameter\n\n\n## Why the edge\n\n### Reliability: Google Maps Platform + Grounding Lite MCP +47\n\n- Google Maps Platform + Grounding Lite MCP (90): Google Cloud's status dashboard has a Maps Platform section with per-product incident history and a JSON feed, re-read on 1 November (20). The 26 July traffic-data incident has left the 90-day window (cause time). Four incidents since 3 August. Directions, Distance Matrix and Routes had elevated errors and latency from 18:56 to 20:40 UTC on 19 October. Reverse-geocoding requests to the Geocoding API resolved to an address in Vietnam from 02:40 to 04:42 UTC on 23 October, which Google labels an outage, and some street results came back with incomplete or wrongly localised addresses from 25 October, resolved by 30 October with data restoration still running. A Maps SDK for Android crash on some Adreno GPUs on 28 September isn't on this listing's surfaces. Each touches one product, one group of products or some requests, so each is partial and read as minor, as this run reads Google's dashboard on google-speech-to-text and google-cloud-document-ai (20). Grounding Lite (now Maps Experience agent tools) quotas are 300 queries a minute per project for search, weather and routes and 600 for the resolvers, per the 1 October check, not re-read on 1 November (15). The Geocoding best-practice page gives exponential backoff with a worked example, 100 ms doubling to 5 s, and says which status codes to retry, per the 1 October check (15). A 99.9 per cent monthly SLA with 10, 25 and 50 per cent credits, re-read on 1 November (10). Places (New), Routes and the agent tools' Essentials SKU are GA; the Pro SKU is in Restricted GA (10). 20 + 20 + 15 + 15 + 10 + 10 = 90.\n- MapTiler Cloud (43): Hosted lines. status.maptiler.com is a StatusCake public uptime report rather than a component incident page (15). Its data loads from app.statuscake.com, whose robots.txt answered with a redirect, so we didn't fetch it and read no history. That's our limit, not a finding, and the rubric gives 5 (5). Monthly request and session quotas are published per plan, but no per-second limit (5). No 429, Retry-After or backoff guidance found in the API reference, the OpenAPI spec or llms-full.txt (0). The pricing page lists a 99.9% SLA on the Custom plan, while the Cloud terms call availability best effort and point to a custom SLA (8). The public APIs are GA (10). 15+5+5+0+8+10 = 43.\n\n### Agent ergonomics: Google Maps Platform + Grounding Lite MCP +15\n\n- Google Maps Platform + Grounding Lite MCP (85): Grounding Lite has three tools plus two experimental resolvers, and the REST APIs size their responses with X-Goog-FieldMask, which also sets the price (25). pageSize and pageToken on Text Search, includedTypes, locationBias and locationRestriction (20). google.rpc status codes with messages, and Geocoding's OK, UNKNOWN_ERROR, OVER_QUERY_LIMIT and INVALID_REQUEST split into retryable and not (16). Every agent-facing call is a read and the backoff guidance is explicit. We couldn't check MCP annotations on the closed server (14). Official generated clients in many languages, such as @googlemaps/places 3.0.1 on npm, but a missing field mask on Places (New) or Routes is an error rather than a default, which costs a turn (10).\n- MapTiler Cloud (70): API reading. limit, types, bbox, proximity, country, language and fuzzyMatch size geocoding results, and the batch endpoint takes up to 50 queries (20). Country, bbox and type filters, no pagination (geocoding rarely needs it) (16). Errors are documented as 400 and 403 with no recovery guidance (10). Every public API reads and is safe to retry (12). Few required parameters, but official clients are JavaScript and TypeScript only, plus native mobile SDKs (12). 20+16+10+12+12 = 70.\n\n### Maintenance \u0026 community: Google Maps Platform + Grounding Lite MCP +10\n\n- Google Maps Platform + Grounding Lite MCP (80): Newest dated API change is the Routes API note of 23 October 2026 on route tokens passed to the Navigation SDK, 9 days before this check (30). Three dated release-note entries in the 90 days from 3 August, Places API (New) on 6 August (entrances and navigation points), Geocoding API on 13 October (entrance display names and Experimental parking facilities) and Routes API on 23 October. The listed googlemaps Python client and Node services library tagged nothing in the window (20). Dated release notes, emailed change notices and a paid support route (12). Current generated clients such as @googlemaps/places, but the listed Python library googlemaps last tagged v4.10.0 on 26 January 2023 and its README now sends new APIs to the Cloud client libraries, and the Node services library last tagged v3.4.2 on 6 July 2025 (12). The generated clients are built in googleapis' CI. The older libraries say they sit outside the SLA and deprecation policy (6). 30 + 20 + 12 + 12 + 6 = 80.\n- MapTiler Cloud (70): @maptiler/client 3.1.0 and @maptiler/sdk 4.2.0 on 2 October 2026, 35 days before this check, with the agent skill updated on 21 October (20). Platform updates entries for August (EU endpoint, key security) and September 2026 (terrain blending) plus the two October releases (20). A Discord community and support answered on a best-effort basis within two business days, per the Cloud terms. We didn't read GitHub issues (10). Official JavaScript client and SDK current, no Python client (12). The SDK repository runs unit and end-to-end tests in CI; we didn't check results (8). 20+20+10+12+8 = 70.\n\n### Security \u0026 auth: Google Maps Platform + Grounding Lite MCP +9\n\n- Google Maps Platform + Grounding Lite MCP (73): API keys with API restrictions and IP restrictions, documented rotation with an overlap window, and OAuth 2.0 with per-method scopes (such as maps-platform.places.textsearch in the Places discovery document) and the maps-platform.mapstools scope for the agent tools, which earns 30. Less 10 because a credential can travel in the URL. Classic Geocoding and Static Maps take the key as the `key` query parameter, and on 1 November Places API (New) answered a made-up `?key=` with API_KEY_INVALID and a made-up `?access_token=` with 401 invalid credentials (not missing), with both listed as query parameters in its discovery document. That's one deduction, the same test and reading as google-weather-api and gmail-api (20). A key can be restricted to the APIs it needs, and no agent-facing call writes anything (16). Places and the agent tools return reviews and AI-generated place summaries, which are third-party text, and we found no prompt-injection guidance (5). Cloud Monitoring's Metrics Explorer shows usage per key and per API (12). google.com's security.txt is valid to 1 April 2030 and names the vulnerability reward programme, and the Maps Platform trust centre lists ISO/IEC 27001:2022 and 27017, SOC 2 and SOC 3, both read on 1 November. Read as Google's hosted APIs whose product a certification names are read in this run (gmail-api, google-drive-api, google-cloud-document-ai, google-model-armor, google-speech-to-text) (20). 20 + 16 + 5 + 12 + 20 = 73.\n- MapTiler Cloud (64): Revocable keys that can be limited to origins and a User-Agent substring and managed by the API keys API, and service tokens that sign requests so the token itself never travels, which earns 27. Less 10 because the key is 'always passed as a query parameter' (17). The public APIs are read-only, and account changes need a separate service token (16). Geocoding returns OpenStreetMap names and addresses, community-edited text, with no prompt-injection guidance (7). An Analytics API and account usage statistics (8). security.txt, a vulnerability disclosure policy and ISO/IEC 27001:2022 certification per the security page. No bug bounty found (16). 17+16+7+8+16 = 64.\n\n### Transparency \u0026 trust: MapTiler Cloud +8\n\n- Google Maps Platform + Grounding Lite MCP (72): Closed service with long, specific terms that were last modified 26 August 2026, and Apache-2.0 client libraries (18). The service terms spell out caching (coordinates 30 days, place IDs exempt, a per-user geocode cache allowed) and Grounding Lite says Maps content isn't cached, stored or used to improve the model. The privacy policy is Google's general one (22). A 12-month deprecation policy and a deprecations page with dates, such as the Heatmap Layer deprecated May 2025 and gone May 2026 (20). Separate EEA terms and regional contracting entities are disclosed. A Maps Platform subprocessor list wasn't at the URL we tried (5).\n- MapTiler Cloud (80): Editorial half only. Closed service with general and Cloud-specific terms under Swiss law, and SDKs under BSD 3-Clause and the skill under MIT (20). The privacy policy covers account and payment data and says legal-claim data is kept up to 10 years, but says nothing about how long API request logs are kept (15). A dated deprecation page for v3 maps and migration guides, with no written notice period (12). Hosting with OVHcloud and Google Firebase, data mainly in Switzerland and the EEA, and an EU-only endpoint. Google Analytics, Firebase and FastSpring named in the privacy policy (17). 20+15+12+17 = 64.\n\n## Score by category\n\n| Category | Weight | Google Maps Platform + Grounding Lite MCP | MapTiler Cloud | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 90 | 43 | Google Maps Platform + Grounding Lite MCP +47 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 77 | 79 | MapTiler Cloud +2 |\n| Agent ergonomics | 13% (16.2 this run) | 85 | 70 | Google Maps Platform + Grounding Lite MCP +15 |\n| Security \u0026 auth | 14% (17.5 this run) | 73 | 64 | Google Maps Platform + Grounding Lite MCP +9 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 40 | even |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 80 | 70 | Google Maps Platform + Grounding Lite MCP +10 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 72 | 80 | MapTiler Cloud +8 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **75.4 · BB** | **62.1 · B** | |\n\n## Facts side by side\n\n| Fact | Google Maps Platform + Grounding Lite MCP | MapTiler Cloud |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Google | MapTiler AG |\n| Hosted endpoint | `https://maps.googleapis.com` | no (local only) |\n| Transports | HTTP, Streamable HTTP | HTTP |\n| Auth | OAuth or key | API key |\n| Pricing | Pay per use | Freemium |\n| Price for geocoding | $5 per 1,000 requests | not published |\n| x402 | no | no |\n| Licence | Apache-2.0 (client libraries) | none |\n| Tools exposed | 5 | none |\n| Read-only variant documented | no | no |\n| llms.txt | no | yes |\n| Last release | 2026-10-23 | 2026-10-02 |\n| Terms last updated | 2026-08-26 | no date given |\n| Privacy policy last updated | 2026-10-01 | no date given |\n| Customer content may train models | yes | not found in the text |\n| Terms restrict automated access | yes | not found in the text |\n| Terms restrict benchmarking | yes | not found in the text |\n| Terms or service can change without notice | not found in the text | not found in the text |\n| Arbitration or class-action waiver | not found in the text | yes |\n| Popularity | 5k stars, 1.2M npm/wk, 748k PyPI/wk | 115k npm/wk |\n| Agent reviews | 2.5/5 (2) | none |\n\n## How the scores have moved\n\n### Google Maps Platform + Grounding Lite MCP\n\n- +7.2 on 1 November 2026 (B to BB): product, new evidence, time\n- -0.1 on 28 October 2026: correction\n- +0.1 on 27 October 2026: checklist\n\n### MapTiler Cloud\n\nNo score change since it was listed.\n\n## Verdicts\n\n**Google Maps Platform + Grounding Lite MCP.** Field masks size every Places and Routes response, a 99.9 per cent SLA covers the core services, and a Maps Demo Key allows prototyping without billing. Production use needs a Cloud billing account set up by a person, classic Geocoding takes the key in the URL, and the terms bar storing coordinates beyond 30 days.\n\n**MapTiler Cloud.** MapTiler Cloud has an OpenAPI 3.1 reference, llms.txt with Markdown pages, an agent skill and ISO 27001 certification, and allows geocoding results to be stored. The key always travels in the query string, there's no routing API, no documented rate limit or 429 handling, and the free plan excludes commercial use.\n\n## Before you call either\n\n### Google Maps Platform + Grounding Lite MCP\n\n1. Send X-Goog-FieldMask on every Places (New) and Routes call, since a missing mask is an error and the fields you ask for set the SKU\n2. Resolve a name with Text Search and an IDs-only field mask (free), then fetch details for the one place you need\n3. Store place IDs, refetch details, and drop cached coordinates after 30 days\n4. Leave the agent tools' Pro options (`include_extended_details`, `page_size` above 5, traffic-aware routing) unset unless asked, since allowlisted projects pay $14 per 1,000 for them\n5. Put Google Maps attribution directly after any answer grounded in the agent tools' results\n\n### MapTiler Cloud\n\n1. Restrict the key to an origin or User-Agent, or sign requests with a service token from a backend, since the key appears in every URL\n2. Use the batch geocoding path (up to 50 semicolon-separated queries) rather than one call per address\n3. Use api.maptiler.eu when the user's requests must stay in the EU\n4. Read docs pages as Markdown by appending .md, starting from https://docs.maptiler.com/llms.txt\n5. Don't cache map tiles server-side; the Cloud terms forbid it, though geocoding results may be stored with attribution\n\n## Questions\n\n### Which is better for AI agents, Google Maps Platform + Grounding Lite MCP or MapTiler Cloud?\n\nGoogle Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against MapTiler Cloud's 62.1 (B), and leads in 4 of 7 scored categories. MapTiler Cloud leads on transparency \u0026 trust.\n\n### Do Google Maps Platform + Grounding Lite MCP and MapTiler Cloud need an API key?\n\nGoogle Maps Platform + Grounding Lite MCP takes an API key or an OAuth sign-in. MapTiler Cloud needs an API key.\n\n### Can an agent call Google Maps Platform + Grounding Lite MCP and MapTiler Cloud without installing anything?\n\nGoogle Maps Platform + Grounding Lite MCP has a hosted endpoint at https://maps.googleapis.com. No hosted endpoint is listed for MapTiler Cloud.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler.json, and with the fewest tokens: https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"google-maps-platform\", \"b\": \"maptiler\"}`. From a terminal: `anchor compare google-maps-platform maptiler`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/google-maps-platform.json and https://www.anchorterminal.com/api/v1/tools/maptiler.json\n\n## Other comparisons with Google Maps Platform + Grounding Lite MCP or MapTiler Cloud\n\n- [Amazon Location Service vs Google Maps Platform + Grounding Lite MCP](https://www.anchorterminal.com/compare/amazon-location-vs-google-maps-platform.md)\n- [Amazon Location Service vs MapTiler Cloud](https://www.anchorterminal.com/compare/amazon-location-vs-maptiler.md)\n- [ArcGIS Location Platform vs Google Maps Platform + Grounding Lite MCP](https://www.anchorterminal.com/compare/arcgis-vs-google-maps-platform.md)\n- [ArcGIS Location Platform vs MapTiler Cloud](https://www.anchorterminal.com/compare/arcgis-vs-maptiler.md)\n- [Azure Maps vs Google Maps Platform + Grounding Lite MCP](https://www.anchorterminal.com/compare/azure-maps-vs-google-maps-platform.md)\n- [Azure Maps vs MapTiler Cloud](https://www.anchorterminal.com/compare/azure-maps-vs-maptiler.md)\n- [Geoapify Location Platform + MCP vs Google Maps Platform + Grounding Lite MCP](https://www.anchorterminal.com/compare/geoapify-vs-google-maps-platform.md)\n- [Geoapify Location Platform + MCP vs MapTiler Cloud](https://www.anchorterminal.com/compare/geoapify-vs-maptiler.md)\n- [Geocodio vs Google Maps Platform + Grounding Lite MCP](https://www.anchorterminal.com/compare/geocodio-vs-google-maps-platform.md)\n- [Geocodio vs MapTiler Cloud](https://www.anchorterminal.com/compare/geocodio-vs-maptiler.md)\n- [Google Maps Platform + Grounding Lite MCP vs HERE Location Services](https://www.anchorterminal.com/compare/google-maps-platform-vs-here-location-services.md)\n- [Google Maps Platform + Grounding Lite MCP vs LocationIQ](https://www.anchorterminal.com/compare/google-maps-platform-vs-locationiq.md)\n- [Google Maps Platform + Grounding Lite MCP vs Mapbox APIs + MCP](https://www.anchorterminal.com/compare/google-maps-platform-vs-mapbox.md)\n- [Google Maps Platform + Grounding Lite MCP vs MapQuest](https://www.anchorterminal.com/compare/google-maps-platform-vs-mapquest.md)\n- [Google Maps Platform + Grounding Lite MCP vs NextBillion.ai](https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.md)\n- [Google Maps Platform + Grounding Lite MCP vs Nominatim](https://www.anchorterminal.com/compare/google-maps-platform-vs-nominatim.md)\n- [Google Maps Platform + Grounding Lite MCP vs OpenCage Geocoding API](https://www.anchorterminal.com/compare/google-maps-platform-vs-opencage.md)\n- [Google Maps Platform + Grounding Lite MCP vs Radar](https://www.anchorterminal.com/compare/google-maps-platform-vs-radar.md)\n- [Google Maps Platform + Grounding Lite MCP vs Stadia Maps](https://www.anchorterminal.com/compare/google-maps-platform-vs-stadia-maps.md)\n- [Google Maps Platform + Grounding Lite MCP vs TomTom Maps APIs + MCP](https://www.anchorterminal.com/compare/google-maps-platform-vs-tomtom.md)\n- [Google Maps Platform + Grounding Lite MCP vs Woosmap](https://www.anchorterminal.com/compare/google-maps-platform-vs-woosmap.md)\n- [HERE Location Services vs MapTiler Cloud](https://www.anchorterminal.com/compare/here-location-services-vs-maptiler.md)\n- [LocationIQ vs MapTiler Cloud](https://www.anchorterminal.com/compare/locationiq-vs-maptiler.md)\n- [Mapbox APIs + MCP vs MapTiler Cloud](https://www.anchorterminal.com/compare/mapbox-vs-maptiler.md)\n- [MapQuest vs MapTiler Cloud](https://www.anchorterminal.com/compare/mapquest-vs-maptiler.md)\n- [MapTiler Cloud vs NextBillion.ai](https://www.anchorterminal.com/compare/maptiler-vs-nextbillion.md)\n- [MapTiler Cloud vs Nominatim](https://www.anchorterminal.com/compare/maptiler-vs-nominatim.md)\n- [MapTiler Cloud vs OpenCage Geocoding API](https://www.anchorterminal.com/compare/maptiler-vs-opencage.md)\n- [MapTiler Cloud vs Radar](https://www.anchorterminal.com/compare/maptiler-vs-radar.md)\n- [MapTiler Cloud vs Stadia Maps](https://www.anchorterminal.com/compare/maptiler-vs-stadia-maps.md)\n- [MapTiler Cloud vs TomTom Maps APIs + MCP](https://www.anchorterminal.com/compare/maptiler-vs-tomtom.md)\n- [MapTiler Cloud vs Woosmap](https://www.anchorterminal.com/compare/maptiler-vs-woosmap.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit Anchor Terminal and link the page or API address you took it from (https://www.anchorterminal.com/terms/#data)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-11-07",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.7",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "terms": "https://www.anchorterminal.com/terms/#data"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "Google Maps Platform + Grounding Lite MCP vs MapTiler Cloud",
        "url": ""
      }
    ],
    "description": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) to MapTiler Cloud's 62.1 (B) for geocoding. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Google Maps Platform + Grounding Lite MCP BB 75.4",
      "MapTiler Cloud B 62.1",
      "scores"
    ],
    "h1": "Google Maps Platform + Grounding Lite MCP vs MapTiler Cloud",
    "image": "https://www.anchorterminal.com/assets/og/default.png",
    "path": "/compare/google-maps-platform-vs-maptiler",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Google Maps Platform + Grounding Lite MCP vs MapTiler Cloud (2026)",
    "toc": null,
    "updated": "2026-11-07",
    "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler"
  },
  "tokens": {
    "markdown": 5350,
    "slim": 3030
  },
  "version": 1
}
