{
  "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 NextBillion.ai's 55.4 (C), and leads in every scored category.",
    "b": {
      "slug": "nextbillion",
      "name": "NextBillion.ai",
      "vendor": "NextBillion.ai Pte. Ltd.",
      "vendorUrl": "https://nextbillion.ai",
      "kind": "http-api",
      "category": "maps",
      "summary": "NextBillion.ai is a Singapore mapping and routing platform for fleets and logistics. Its REST APIs cover directions, distance matrices, route optimisation, navigation, geocoding and places, with a hosted MCP server for agents.",
      "url": "https://www.anchorterminal.com/tools/nextbillion",
      "markdownUrl": "https://www.anchorterminal.com/tools/nextbillion.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/nextbillion.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/nextbillion.json",
      "dns": "nextbillion.grade.anchorterminal.com",
      "repo": "https://github.com/nextbillion-ai/nextbillion-mcp",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://mcp.nextbillion.io",
      "packages": [],
      "auth": "mixed",
      "authNotes": "REST APIs take a 32-character key as the `key` query parameter, issued in the console at console.nextbillion.ai or by emailing support. Keys can carry an IP allowlist. The hosted MCP server is its own OAuth 2.1 authorisation server with PKCE: a sign-in page asks for the key once and seals it into the tokens. Scripts can send the key as a Bearer header to the MCP server instead.",
      "pricing": "paid",
      "pricingNotes": "By quote. Annual licences priced per order, per asset or per API call, paid monthly or yearly, with extra usage at a rate set in the plan. A 7-day free trial with an API key and no credit card.",
      "priceSummary": "Paid",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs, llms.txt, the MCP server source or the pricing page (checked 2026-11-06). Contracts are invoiced.",
        "endpoints": []
      },
      "toolCount": 27,
      "popularity": {
        "githubStars": null,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-11-06"
      },
      "docsUrl": "https://docs.nextbillion.ai/",
      "llmsTxt": "https://docs.nextbillion.ai/llms.txt",
      "capabilities": [
        "geo.routing",
        "geo.geocode",
        "geo.reverse",
        "geo.places",
        "geo.tiles"
      ],
      "tags": [
        "hosted",
        "mcp",
        "remote-mcp",
        "oauth",
        "api-key",
        "llms-txt",
        "official",
        "sales-led",
        "annual-contract",
        "free-trial",
        "no-card",
        "enterprise",
        "android",
        "ios",
        "closed-source"
      ],
      "lastRelease": "2026-10-30",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 55.4,
        "grade": "C",
        "agentReady": false,
        "rank": 874,
        "ranked": true,
        "rankOf": 1510,
        "categoryRank": 15,
        "methodology": "0.7",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 77,
          "maintenance": 73,
          "payments": 20,
          "reliability": 45,
          "schema": 73,
          "security": 46,
          "transparency": 58
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-11-06"
        },
        "negative": 0,
        "verdict": "NextBillion.ai covers routing, distance matrices, route optimisation, geocoding and places, and runs a hosted MCP server with 27 read-only annotated tools and OAuth sign-in. Pricing is by quote on annual licences, the REST API key travels in the query string, and no OpenAPI spec, API changelog or readable status history was found.",
        "bestFor": "Fleet and delivery routing, distance matrices and route optimisation with truck profiles, plus geocoding and POI search, for companies ready for an annual contract.",
        "strengths": [
          "Hosted MCP server at mcp.nextbillion.io with OAuth 2.1 and PKCE, and every API tool annotated read-only and idempotent",
          "Routing, distance matrix, isochrone, route optimisation, geocoding and places APIs under one key",
          "llms.txt, llms-full.txt and Markdown versions of the docs pages",
          "Documented rate limit of 2,400 queries a minute and a per-endpoint error table",
          "7-day free trial with no credit card"
        ],
        "weaknesses": [
          "Pricing is by quote on annual licences, with no public unit prices",
          "The REST APIs take the key only as a `key` query parameter",
          "No OpenAPI spec or API changelog found",
          "No security.txt or vulnerability disclosure policy, and no SLA",
          "The status page renders only in a browser, so its history couldn't be read"
        ],
        "agentNotes": [
          "Connect through https://mcp.nextbillion.io so the key stays in a Bearer header or OAuth token rather than in request URLs",
          "Use the geometry tools only for straight-line questions; use directions or distance_matrix for travel time",
          "Batch up to 100 geocodes with geocode_batch instead of one call per address",
          "On 429 the quota or the 2,400-a-minute limit is reached; slow down and tell the user if credits are spent",
          "Search the docs with the MCP documentation tools before guessing a parameter"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.7",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 55.4
          }
        ],
        "editorialScores": {
          "ergonomics": 77,
          "maintenance": 73,
          "payments": 20,
          "reliability": 45,
          "schema": 73,
          "security": 46,
          "transparency": 43
        },
        "provenanceScore": 73,
        "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": {
        "http": "curl \"https://api.nextbillion.io/geocode?q=market\u0026at=40.720685,-74.044772\u0026in=countryCode:USA\u0026key=$NBAI_API_KEY\"",
        "claudeCode": "claude mcp add --transport http nextbillion https://mcp.nextbillion.io",
        "config": {
          "mcpServers": {
            "nextbillion": {
              "url": "https://mcp.nextbillion.io"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/geo.routing",
        "tool": "https://letme.dev/nextbillion"
      },
      "area": "everyday",
      "provenance": {
        "legalEntity": "NextBillion.ai Pte. Ltd.",
        "domain": "nextbillion.ai",
        "domainRegistered": "2019-08-07",
        "endpointOnVendorDomain": false,
        "terms": "https://nextbillion.ai/terms-of-service",
        "privacy": "https://nextbillion.ai/privacy",
        "statusPage": "https://status.nextbillion.io",
        "changelog": "https://github.com/nextbillion-ai/nextbillion-mcp/blob/main/CHANGELOG.md",
        "securityTxt": "none",
        "checked": "2026-11-06",
        "notes": [
          "The terms name NextBillion.ai Pte. Ltd. and choose Singapore law, with mediation first. The privacy policy names Nextbillion.AI Pte. Ltd. and its affiliates.",
          "The APIs and MCP server run on nextbillion.io, a second domain of the same company, while the site and docs are on nextbillion.ai.",
          "nextbillion.ai/.well-known/security.txt and /security return 404. No vulnerability disclosure policy was found.",
          "The changelog listed is the MCP server's; no changelog for the REST APIs was found.",
          "RDAP gives nextbillion.ai a registration date of 7 August 2019. robots.txt on nextbillion.ai and docs.nextbillion.ai allows these pages, and docs robots.txt allows /llms*.txt.",
          "The acceptable use clause bars reselling or making the services available to third parties. No clause on automated access to the website was found."
        ],
        "score": 73
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/nextbillion.json",
      "live": {
        "slug": "nextbillion",
        "probe": {
          "target": "https://mcp.nextbillion.io",
          "method": "get",
          "lastAt": "2026-11-07T22:56:10.801921384Z",
          "lastOk": true,
          "lastStatus": 405,
          "lastMs": 395,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 384,
          "p95ms24h": 517,
          "samples24h": 244,
          "samples30d": 246,
          "days": [
            {
              "date": "2026-11-06",
              "probes": 13,
              "ok": 13
            },
            {
              "date": "2026-11-07",
              "probes": 233,
              "ok": 233
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.nextbillion.io",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-11-07T04:48:15.654905456Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "nextbillion-ai/nextbillion-mcp",
            "version": "v0.5.3",
            "released": "2026-10-30",
            "seenAt": "2026-11-06T23:49:07.315516581Z"
          }
        ],
        "githubStars": 0,
        "securityTxt": {
          "url": "https://nextbillion.ai/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-11-07T16:00:46.65718407Z"
        },
        "llmsTxt": {
          "url": "https://docs.nextbillion.ai/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-11-07T15:33:19.797741277Z"
        },
        "pages": [
          {
            "url": "https://raw.githubusercontent.com/nextbillion-ai/nextbillion-mcp/main/CHANGELOG.md",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-11-07T14:22:12.997536111Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "7a2ac2407039"
          },
          {
            "url": "https://nextbillion.ai/privacy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-11-07T14:14:59.152376992Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "39ac967d5c22"
          },
          {
            "url": "https://nextbillion.ai/terms-of-service",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-11-07T14:15:02.368911623Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "898d2ccdb595"
          }
        ],
        "mcpTools": {
          "url": "https://mcp.nextbillion.io",
          "checkedAt": "2026-11-07T01:46:25.213284458Z",
          "status": "ok",
          "protocol": "2026-07-28",
          "tools": [
            {
              "name": "autocomplete",
              "title": "Autocomplete",
              "description": "Complete a partial address or administrative-area prefix into full valid addresses (e.g. \"stat\" -\u003e \"State Capitol, ...\"). Use for prefix completion as the user types; use autosuggest for typo-tolerant fuzzy suggestions and geocode_forward for a full address. Parameters: query (required); optional near {latitude, longitude}, radius_m (with near), country_codes, bounding_box {west, south, east, north}, limit, language, view. Example: {\"query\": \"stat\", \"near\": {\"latitude\": 35.4769, \"longitude\": -97.4872}, \"limit\": 5}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "bounding_box": {
                    "additionalProperties": false,
                    "description": "Hard-limit results to this bounding box",
                    "properties": {
                      "east": {
                        "description": "Eastern longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "north": {
                        "description": "Northern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "south": {
                        "description": "Southern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "west": {
                        "description": "Western longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "west",
                      "south",
                      "east",
                      "north"
                    ],
                    "type": "object"
                  },
                  "country_codes": {
                    "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                    "items": {
                      "pattern": "^[A-Za-z]{3}$",
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "language": {
                    "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                    "type": "string"
                  },
                  "limit": {
                    "description": "Maximum results (default 10)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "near": {
                    "additionalProperties": false,
                    "description": "Center of the search context; results are ranked around this point",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "query": {
                    "description": "Free-text search query",
                    "minLength": 1,
                    "type": "string"
                  },
                  "radius_m": {
                    "description": "With `near`: hard-limit results to this radius in meters",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991,
                    "type": "integer"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "autosuggest",
              "title": "Autosuggest",
              "description": "Suggest address and place candidates from an incomplete or misspelled query (typo-tolerant, e.g. \"aqaurium\" still matches aquariums). Use for search-as-you-type; use autocomplete for strict prefix completion of valid addresses. Parameters: query (required); optional near {latitude, longitude}, radius_m (with near), country_codes, bounding_box {west, south, east, north}, limit, language, view. Example: {\"query\": \"aqauriums\", \"near\": {\"latitude\": 42.3501, \"longitude\": -71.0689}, \"limit\": 5}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "bounding_box": {
                    "additionalProperties": false,
                    "description": "Hard-limit results to this bounding box",
                    "properties": {
                      "east": {
                        "description": "Eastern longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "north": {
                        "description": "Northern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "south": {
                        "description": "Southern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "west": {
                        "description": "Western longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "west",
                      "south",
                      "east",
                      "north"
                    ],
                    "type": "object"
                  },
                  "country_codes": {
                    "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                    "items": {
                      "pattern": "^[A-Za-z]{3}$",
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "language": {
                    "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                    "type": "string"
                  },
                  "limit": {
                    "description": "Maximum results (default 10)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "near": {
                    "additionalProperties": false,
                    "description": "Center of the search context; results are ranked around this point",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "query": {
                    "description": "Free-text search query",
                    "minLength": 1,
                    "type": "string"
                  },
                  "radius_m": {
                    "description": "With `near`: hard-limit results to this radius in meters",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991,
                    "type": "integer"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "bbox",
              "title": "Bounding Box",
              "description": "The smallest latitude/longitude box around a set of points, a line or a polygon, optionally padded in metres — for example a viewport for static_map_image or a spatial filter. Handles shapes that straddle the antimeridian (reports crosses_antimeridian and the narrower box). Computed locally, no sign-in needed. Parameters: exactly one of points (array of {latitude, longitude}), line (array of points) or polygon (GeoJSON Polygon/MultiPolygon, isochrone Feature accepted); padding_meters (default 0). Returns min_latitude, min_longitude, max_latitude, max_longitude, crosses_antimeridian. Example: {\"points\": [{\"latitude\": 12.9716, \"longitude\": 77.5946}, {\"latitude\": 13.0827, \"longitude\": 80.2707}], \"padding_meters\": 500}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "line": {
                    "description": "A line as an array of {latitude, longitude} points (at least 2)",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 5000,
                    "minItems": 2,
                    "type": "array"
                  },
                  "padding_meters": {
                    "description": "Grow the box by this many metres on every side",
                    "maximum": 1000000,
                    "minimum": 0,
                    "type": "number"
                  },
                  "points": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "description": "Optional label echoed back in the result",
                          "maxLength": 100,
                          "type": "string"
                        },
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 1000,
                    "minItems": 1,
                    "type": "array"
                  },
                  "polygon": {
                    "additionalProperties": {},
                    "description": "A GeoJSON Polygon or MultiPolygon geometry (coordinates in [longitude, latitude] order), or a Feature wrapping one — an isochrone contour can be passed as is",
                    "properties": {
                      "type": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "buffer",
              "title": "Buffer Zone Around a Point, Line or Polygon",
              "description": "Build the zone within a given straight-line distance of a point (a circle), a line (a corridor, e.g. 1 km along a route) or a polygon (grown outward, or shrunk inward with a negative distance). Geodesic on WGS84, computed locally, no sign-in needed. Returns a GeoJSON Polygon or MultiPolygon (a shrunk shape may split) with its area; an empty result is returned, not an error. Parameters: exactly one of point ({latitude, longitude}), line (array of points) or polygon (GeoJSON Polygon/MultiPolygon, isochrone Feature accepted); distance (number, negative only for polygon); units (default meters); steps (points per circle, default 16); area_units; max_vertices (default 500). Example: {\"line\": [{\"latitude\": 12.9716, \"longitude\": 77.5946}, {\"latitude\": 12.99, \"longitude\": 77.62}], \"distance\": 1, \"units\": \"kilometers\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "area_units": {
                    "description": "Area unit (default square_meters)",
                    "enum": [
                      "square_meters",
                      "square_kilometers",
                      "hectares",
                      "acres",
                      "square_miles",
                      "square_feet"
                    ],
                    "type": "string"
                  },
                  "distance": {
                    "description": "Buffer distance; negative shrinks a polygon inward",
                    "type": "number"
                  },
                  "line": {
                    "description": "Buffer around a line (a corridor)",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 5000,
                    "minItems": 2,
                    "type": "array"
                  },
                  "max_vertices": {
                    "description": "Simplify the returned shape to at most this many vertices (default 500); the result says when it was simplified",
                    "maximum": 5000,
                    "minimum": 16,
                    "type": "integer"
                  },
                  "point": {
                    "additionalProperties": false,
                    "description": "Buffer around a point (a geodesic circle)",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "polygon": {
                    "additionalProperties": {},
                    "description": "Buffer around or inside a polygon",
                    "properties": {
                      "type": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object"
                  },
                  "steps": {
                    "description": "Vertices per quarter... per full circle (default 16)",
                    "maximum": 64,
                    "minimum": 4,
                    "type": "integer"
                  },
                  "units": {
                    "description": "Distance unit (default meters)",
                    "enum": [
                      "meters",
                      "kilometers",
                      "miles",
                      "feet",
                      "nautical_miles"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "distance"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "centroid",
              "title": "Centroid and Label Point of a Polygon",
              "description": "The area-weighted centre of a polygon and a label point that is guaranteed to lie inside it (the centroid of a C- or ring-shaped area falls outside; the label point does not). Computed locally, no sign-in needed. Parameters: polygon (GeoJSON Polygon/MultiPolygon, or an isochrone Feature). Returns centroid, label_point ({latitude, longitude}) and centroid_inside. Example: {\"polygon\": {\"type\": \"Polygon\", \"coordinates\": [[[77.59, 12.97], [77.61, 12.97], [77.61, 12.99], [77.59, 12.99], [77.59, 12.97]]]}}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "polygon": {
                    "additionalProperties": {},
                    "description": "A GeoJSON Polygon or MultiPolygon geometry (coordinates in [longitude, latitude] order), or a Feature wrapping one — an isochrone contour can be passed as is",
                    "properties": {
                      "type": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "polygon"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "directions",
              "title": "Directions",
              "description": "Calculate a route between an origin and a destination with optional waypoints; returns distance (meters), duration (seconds) and an encoded polyline per route, which static_route_map can draw. Use distance_matrix for many pairs. Documentation for this API is available through search_documentation. Parameters: origin, destination {latitude, longitude} (required); optional waypoints (max 200), mode (car | truck | motorcycle | bike | walk), service (\"flexible\" default: all options; \"fast\": car/truck only, lower latency), route_type, departure_time, avoid (soft), exclude (strict), road_info, honor_restrictions, alternatives, steps (fast only), geometry (polyline | polyline6), cross_border; truck options: truck_size_cm, truck_weight_kg, truck_axle_load, hazmat_type, emission_class; freight network: prefer \"truck_route\" + truck_type (rigid_truck | semi_trailer | b_double | road_train | generic_truck) for roads legal for that truck class, require \"truck_route\" to stay on it. Example: {\"origin\": {\"latitude\": 37.7749, \"longitude\": -122.4194}, \"destination\": {\"latitude\": 34.0522, \"longitude\": -118.2437}, \"mode\": \"truck\", \"prefer\": \"truck_route\", \"truck_type\": [\"b_double\"]}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "alternatives": {
                    "description": "Return up to 3 alternative routes (only without waypoints)",
                    "type": "boolean"
                  },
                  "avoid": {
                    "description": "Road features to avoid when alternatives exist. Fast service supports only toll/ferry/highway",
                    "items": {
                      "enum": [
                        "toll",
                        "highway",
                        "ferry",
                        "sharp_turn",
                        "uturn",
                        "service_road",
                        "left_turn",
                        "right_turn",
                        "tunnel",
                        "none"
                      ],
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "cross_border": {
                    "description": "Allow the route to cross international borders (region-dependent, flexible service only)",
                    "type": "boolean"
                  },
                  "departure_time": {
                    "description": "Departure as a UNIX timestamp in seconds, for typical-traffic routing (flexible only)",
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "destination": {
                    "additionalProperties": false,
                    "description": "Route end (must be a routable land location)",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "emission_class": {
                    "description": "Engine emission class (EU regions, truck mode, flexible service only)",
                    "enum": [
                      "euro0",
                      "euro1",
                      "euro2",
                      "euro3",
                      "euro4",
                      "euro5",
                      "euro6",
                      "euro7",
                      "euro8",
                      "euro9"
                    ],
                    "type": "string"
                  },
                  "exclude": {
                    "description": "Strict filter: only routes that completely avoid these features are returned (error if none exists). Use `avoid` for a soft preference instead. Flexible service only",
                    "items": {
                      "enum": [
                        "toll",
                        "ferry",
                        "highway",
                        "service_road",
                        "uturn",
                        "sharp_turn",
                        "left_turn",
                        "right_turn"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "geometry": {
                    "description": "Route geometry encoding (default polyline, precision 5 — directly usable with static_route_map)",
                    "enum": [
                      "polyline",
                      "polyline6"
                    ],
                    "type": "string"
                  },
                  "hazmat_type": {
                    "description": "Hazardous cargo classes carried (truck mode, flexible service only)",
                    "items": {
                      "enum": [
                        "explosives",
                        "gas",
                        "flammable_liquid",
                        "flammable_gas",
                        "organic",
                        "toxic",
                        "radioactive",
                        "corrosive",
                        "other"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "honor_restrictions": {
                    "description": "When true, enforce restricted-area rules: no route is generated if origin, destination, or a waypoint is inside a restricted area. Default false: route anyway with a warning (flexible service only)",
                    "type": "boolean"
                  },
                  "mode": {
                    "description": "Travel mode (default car). Modes other than car/truck require service=flexible",
                    "enum": [
                      "car",
                      "truck",
                      "motorcycle",
                      "bike",
                      "walk"
                    ],
                    "type": "string"
                  },
                  "origin": {
                    "additionalProperties": false,
                    "description": "Route start (must be a routable land location)",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "prefer": {
                    "description": "Prioritise designated freight network roads (flexible service, mode truck). truck_type takes effect only together with this",
                    "enum": [
                      "truck_route"
                    ],
                    "type": "string"
                  },
                  "require": {
                    "description": "Restrict the route to designated freight network roads; the API answers HTTP 422 when no such road is within 2 km of the origin, destination or a waypoint. Needs prefer: \"truck_route\"",
                    "enum": [
                      "truck_route"
                    ],
                    "type": "string"
                  },
                  "road_info": {
                    "description": "Extra per-segment information to return: max_speed, toll_distance, toll_cost, toll_info, truck_route, stop_sign, traffic_light (flexible service only)",
                    "items": {
                      "enum": [
                        "max_speed",
                        "toll_distance",
                        "toll_cost",
                        "toll_info",
                        "truck_route",
                        "stop_sign",
                        "traffic_light"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "route_type": {
                    "description": "Optimization objective (flexible only, default fastest)",
                    "enum": [
                      "fastest",
                      "shortest"
                    ],
                    "type": "string"
                  },
                  "service": {
                    "description": "API variant: \"flexible\" (default) supports all modes, departure_time, route_type, full avoid list and truck options; \"fast\" is lower latency but limited to car/truck and avoid toll/ferry/highway only",
                    "enum": [
                      "flexible",
                      "fast"
                    ],
                    "type": "string"
                  },
                  "steps": {
                    "description": "Include turn-by-turn steps (fast service only)",
                    "type": "boolean"
                  },
                  "truck_axle_load": {
                    "description": "Load per axle in tonnes (truck mode, flexible service only)",
                    "exclusiveMinimum": 0,
                    "type": "number"
                  },
                  "truck_size_cm": {
                    "additionalProperties": false,
                    "description": "Truck dimensions in cm (flexible + mode=truck only)",
                    "properties": {
                      "height": {
                        "type": "number"
                      },
                      "length": {
                        "type": "number"
                      },
                      "width": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "height",
                      "width",
                      "length"
                    ],
                    "type": "object"
                  },
                  "truck_type": {
                    "description": "Truck class(es) the route must be legal for on the designated freight network (rigid_truck, semi_trailer, b_double, road_train, generic_truck). Effective together with prefer: \"truck_route\" (flexible service, mode truck)",
                    "items": {
                      "enum": [
                        "rigid_truck",
                        "semi_trailer",
                        "b_double",
                        "road_train",
                        "generic_truck"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "truck_weight_kg": {
                    "description": "Truck gross weight in kg (flexible + mode=truck only)",
                    "maximum": 100000,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "waypoints": {
                    "description": "Intermediate stops visited in order (max 200)",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 200,
                    "type": "array"
                  }
                },
                "required": [
                  "origin",
                  "destination"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "distance_matrix",
              "title": "Distance Matrix",
              "description": "Compute travel distance (meters) and duration (seconds) for every origin-to-destination pair in one call; one row per origin with one element per destination, in input order. Use it instead of repeated directions calls when several pairs are needed. Documentation for this API is available through search_documentation. Parameters: origins, destinations (arrays of {latitude, longitude}, required); optional mode, service (\"fast\" default: up to 1000x1000 points; \"flexible\": the options below, max 50x50), route_type, departure_time, avoid (soft), exclude (strict), honor_restrictions, route_failed_prompt (unroutable pairs return -1 instead of 0), truck options: truck_size_cm {height, width, length}, truck_weight_kg, truck_axle_load, hazmat_type, emission_class, cross_border, prefer \"truck_route\" + truck_type (roads legal for a truck class on the designated freight network). Example: {\"origins\": [{\"latitude\": 1.29, \"longitude\": 103.85}], \"destinations\": [{\"latitude\": 1.35, \"longitude\": 103.99}, {\"latitude\": 1.3, \"longitude\": 103.77}], \"route_failed_prompt\": true}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "avoid": {
                    "description": "Road features to avoid",
                    "items": {
                      "enum": [
                        "toll",
                        "highway",
                        "ferry",
                        "none"
                      ],
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "cross_border": {
                    "description": "Allow routes to cross international borders (region-dependent, flexible service only)",
                    "type": "boolean"
                  },
                  "departure_time": {
                    "description": "Departure as a UNIX timestamp in seconds, for typical-traffic results (flexible only)",
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "destinations": {
                    "description": "End points (matrix columns)",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 1000,
                    "minItems": 1,
                    "type": "array"
                  },
                  "emission_class": {
                    "description": "Engine emission class (EU regions, truck mode, flexible service only)",
                    "enum": [
                      "euro0",
                      "euro1",
                      "euro2",
                      "euro3",
                      "euro4",
                      "euro5",
                      "euro6",
                      "euro7",
                      "euro8",
                      "euro9"
                    ],
                    "type": "string"
                  },
                  "exclude": {
                    "description": "Strict filter: only routes that completely avoid these features are returned (error if none exists). Use `avoid` for a soft preference instead. Flexible service only",
                    "items": {
                      "enum": [
                        "toll",
                        "ferry",
                        "highway",
                        "service_road",
                        "uturn",
                        "sharp_turn",
                        "left_turn",
                        "right_turn"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "hazmat_type": {
                    "description": "Hazardous cargo classes carried (truck mode, flexible service only)",
                    "items": {
                      "enum": [
                        "explosives",
                        "gas",
                        "flammable_liquid",
                        "flammable_gas",
                        "organic",
                        "toxic",
                        "radioactive",
                        "corrosive",
                        "other"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "honor_restrictions": {
                    "description": "When true, enforce restricted-area rules for origin/destination points instead of routing through with a warning (flexible service only)",
                    "type": "boolean"
                  },
                  "mode": {
                    "description": "Travel mode (default car). Modes other than car/truck require service=flexible",
                    "enum": [
                      "car",
                      "truck",
                      "motorcycle",
                      "bike",
                      "walk"
                    ],
                    "type": "string"
                  },
                  "origins": {
                    "description": "Start points (matrix rows)",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 1000,
                    "minItems": 1,
                    "type": "array"
                  },
                  "prefer": {
                    "description": "Prioritise designated freight network roads (flexible service, mode truck). truck_type takes effect only together with this",
                    "enum": [
                      "truck_route"
                    ],
                    "type": "string"
                  },
                  "route_failed_prompt": {
                    "description": "When true, unroutable origin/destination pairs return -1 instead of 0 so they can be told apart from zero-distance pairs",
                    "type": "boolean"
                  },
                  "route_type": {
                    "description": "Optimization objective (flexible only, default fastest)",
                    "enum": [
                      "fastest",
                      "shortest"
                    ],
                    "type": "string"
                  },
                  "service": {
                    "description": "API variant: \"fast\" (default) supports up to 1000x1000 points; \"flexible\" adds departure_time, route_type, truck options and more modes but is limited to 50x50 points within a ~8000 km area",
                    "enum": [
                      "fast",
                      "flexible"
                    ],
                    "type": "string"
                  },
                  "truck_axle_load": {
                    "description": "Load per axle in tonnes (truck mode, flexible service only)",
                    "exclusiveMinimum": 0,
                    "type": "number"
                  },
                  "truck_size_cm": {
                    "additionalProperties": false,
                    "description": "Truck dimensions in cm (flexible + mode=truck only)",
                    "properties": {
                      "height": {
                        "type": "number"
                      },
                      "length": {
                        "type": "number"
                      },
                      "width": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "height",
                      "width",
                      "length"
                    ],
                    "type": "object"
                  },
                  "truck_type": {
                    "description": "Truck class(es) the route must be legal for on the designated freight network (rigid_truck, semi_trailer, b_double, road_train, generic_truck). Effective together with prefer: \"truck_route\" (flexible service, mode truck)",
                    "items": {
                      "enum": [
                        "rigid_truck",
                        "semi_trailer",
                        "b_double",
                        "road_train",
                        "generic_truck"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "truck_weight_kg": {
                    "description": "Truck gross weight in kg (flexible + mode=truck only)",
                    "maximum": 100000,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  }
                },
                "required": [
                  "origins",
                  "destinations"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "geocode_batch",
              "title": "Batch Geocode",
              "description": "Forward-geocode up to 100 free-text queries in one request; returns one ranked result set per query, in input order. Use it instead of repeated geocode_forward calls when several addresses are needed: this endpoint has its own rate limit of 60 requests per minute, so larger batches per call stay within it. Parameters: queries (required array; each item: query (required), optional near {latitude, longitude}, radius_m, country_codes, bounding_box, limit, language, view, types); optional top-level types (houseNumber | addressBlock | street | intersection | place | area) as the default for all queries (a per-query types overrides it). Example: {\"queries\": [{\"query\": \"600-699 Golden Gate Ave, San Francisco, CA\", \"types\": [\"addressBlock\"]}, {\"query\": \"Empire State Building\", \"country_codes\": [\"USA\"]}]}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "queries": {
                    "description": "Up to 100 forward-geocode queries resolved in a single request",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "bounding_box": {
                          "additionalProperties": false,
                          "description": "Hard-limit results to this bounding box",
                          "properties": {
                            "east": {
                              "description": "Eastern longitude",
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            },
                            "north": {
                              "description": "Northern latitude",
                              "maximum": 90,
                              "minimum": -90,
                              "type": "number"
                            },
                            "south": {
                              "description": "Southern latitude",
                              "maximum": 90,
                              "minimum": -90,
                              "type": "number"
                            },
                            "west": {
                              "description": "Western longitude",
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            }
                          },
                          "required": [
                            "west",
                            "south",
                            "east",
                            "north"
                          ],
                          "type": "object"
                        },
                        "country_codes": {
                          "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                          "items": {
                            "pattern": "^[A-Za-z]{3}$",
                            "type": "string"
                          },
                          "minItems": 1,
                          "type": "array"
                        },
                        "language": {
                          "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                          "type": "string"
                        },
                        "limit": {
                          "description": "Maximum results (default 10)",
                          "maximum": 100,
                          "minimum": 1,
                          "type": "integer"
                        },
                        "near": {
                          "additionalProperties": false,
                          "description": "Center of the search context; results are ranked around this point",
                          "properties": {
                            "latitude": {
                              "maximum": 90,
                              "minimum": -90,
                              "type": "number"
                            },
                            "longitude": {
                              "maximum": 180,
                              "minimum": -180,
                              "type": "number"
                            }
                          },
                          "required": [
                            "latitude",
                            "longitude"
                          ],
                          "type": "object"
                        },
                        "query": {
                          "description": "Free-text search query for this entry",
                          "minLength": 1,
                          "type": "string"
                        },
                        "radius_m": {
                          "description": "With `near`: hard-limit results to this radius in meters",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "type": "integer"
                        },
                        "types": {
                          "description": "Restrict results to these types: houseNumber (exact door point), addressBlock (address-range/segment match incl. interpolated numbers), street, intersection (only returned when requested), place (POI), area (city/district/postal/admin area)",
                          "items": {
                            "enum": [
                              "houseNumber",
                              "addressBlock",
                              "street",
                              "intersection",
                              "place",
                              "area"
                            ],
                            "type": "string"
                          },
                          "minItems": 1,
                          "type": "array"
                        },
                        "view": {
                          "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                          "enum": [
                            "Unified",
                            "AR",
                            "IL",
                            "IN",
                            "MA",
                            "PK",
                            "RU",
                            "TR",
                            "CN",
                            "TW"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "query"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "minItems": 1,
                    "type": "array"
                  },
                  "types": {
                    "description": "Default result-type filter applied to every query that does not set its own `types` (houseNumber, addressBlock, street, intersection, place, area)",
                    "items": {
                      "enum": [
                        "houseNumber",
                        "addressBlock",
                        "street",
                        "intersection",
                        "place",
                        "area"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  }
                },
                "required": [
                  "queries"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "geocode_forward",
              "title": "Forward Geocode",
              "description": "Convert a free-text address, place name, locality or administrative area into coordinates and a full postal address; tolerates incomplete or partly wrong input. Use geocode_batch for many addresses, place_search for POIs/businesses, geocode_structured when the address components are already separated. Parameters: query (required); optional near {latitude, longitude} or country_codes (strongly recommended - landmark names rank poorly without a location bias), radius_m (with near), bounding_box {west, south, east, north}, limit, language, view, types (houseNumber | addressBlock | street | intersection | place | area). Example: {\"query\": \"1600 Pennsylvania Avenue NW, Washington DC\", \"country_codes\": [\"USA\"], \"limit\": 1}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "bounding_box": {
                    "additionalProperties": false,
                    "description": "Hard-limit results to this bounding box",
                    "properties": {
                      "east": {
                        "description": "Eastern longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "north": {
                        "description": "Northern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "south": {
                        "description": "Southern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "west": {
                        "description": "Western longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "west",
                      "south",
                      "east",
                      "north"
                    ],
                    "type": "object"
                  },
                  "country_codes": {
                    "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                    "items": {
                      "pattern": "^[A-Za-z]{3}$",
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "language": {
                    "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                    "type": "string"
                  },
                  "limit": {
                    "description": "Maximum results (default 10)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "near": {
                    "additionalProperties": false,
                    "description": "Center of the search context; results are ranked around this point",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "query": {
                    "description": "Free-text search query",
                    "minLength": 1,
                    "type": "string"
                  },
                  "radius_m": {
                    "description": "With `near`: hard-limit results to this radius in meters",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991,
                    "type": "integer"
                  },
                  "types": {
                    "description": "Restrict results to these types: houseNumber (exact door point), addressBlock (address-range/segment match incl. interpolated numbers), street, intersection (only returned when requested), place (POI), area (city/district/postal/admin area)",
                    "items": {
                      "enum": [
                        "houseNumber",
                        "addressBlock",
                        "street",
                        "intersection",
                        "place",
                        "area"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "geocode_reverse",
              "title": "Reverse Geocode",
              "description": "Find the nearest address for a coordinate; returns the full postal address, the matched position and a bounding box. Parameters: coordinate {latitude, longitude} (required); optional country_codes, bounding_box {west, south, east, north}, language, view. Example: {\"coordinate\": {\"latitude\": 48.8566, \"longitude\": 2.3522}}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "bounding_box": {
                    "additionalProperties": false,
                    "description": "Hard-limit results to this bounding box",
                    "properties": {
                      "east": {
                        "description": "Eastern longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "north": {
                        "description": "Northern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "south": {
                        "description": "Southern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "west": {
                        "description": "Western longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "west",
                      "south",
                      "east",
                      "north"
                    ],
                    "type": "object"
                  },
                  "coordinate": {
                    "additionalProperties": false,
                    "description": "The location to reverse geocode",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "country_codes": {
                    "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                    "items": {
                      "pattern": "^[A-Za-z]{3}$",
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "language": {
                    "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                    "type": "string"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "coordinate"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "geocode_structured",
              "title": "Structured Geocode",
              "description": "Geocode an address given as separate fields instead of one string; searches addresses and administrative areas only, never POIs. Use when the components are already known and precision matters; otherwise use geocode_forward. Parameters: country_code (required, ISO 3166-1 alpha-3) plus at least one of state, county, city, suburb, neighborhood, street, house_number, postal_code; optional near {latitude, longitude}, limit, types, view. Example: {\"country_code\": \"GBR\", \"city\": \"London\", \"street\": \"Baker Street\", \"house_number\": \"221B\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "city": {
                    "type": "string"
                  },
                  "country_code": {
                    "description": "Country of the address (required, ISO 3166-1 alpha-3, e.g. \"USA\")",
                    "pattern": "^[A-Za-z]{3}$",
                    "type": "string"
                  },
                  "county": {
                    "type": "string"
                  },
                  "house_number": {
                    "type": "string"
                  },
                  "limit": {
                    "description": "Maximum results (default 10)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "near": {
                    "additionalProperties": false,
                    "description": "Search-context center for ranking",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "neighborhood": {
                    "type": "string"
                  },
                  "postal_code": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "street": {
                    "type": "string"
                  },
                  "suburb": {
                    "type": "string"
                  },
                  "types": {
                    "description": "Restrict results to these types: houseNumber (exact door point), addressBlock (address-range/segment match incl. interpolated numbers), street, intersection (only returned when requested), place (POI), area (city/district/postal/admin area)",
                    "items": {
                      "enum": [
                        "houseNumber",
                        "addressBlock",
                        "street",
                        "intersection",
                        "place",
                        "area"
                      ],
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "country_code"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "get_api_parameters",
              "title": "Get API Parameters",
              "description": "Get structured parameter details for a NextBillion REST API endpoint: type, required, default, allowed values, units and description. More precise than a prose search for questions about one specific parameter. Returns every matching API variant (e.g. directions/flexible and directions/fast), identified by heading_path. Empty units means the documentation does not state a unit. SDK methods are not covered. When the index is temporarily unavailable the result says so and names the public docs site.\nParameters:\n- endpoint (string, required unless doc_id given): API slug, optionally with variant, e.g. directions or directions/flexible; a tool name such as geocode_batch or a doc_id also resolves. An unknown endpoint returns found: false with similar endpoints.\n- doc_id (string, optional): page id instead of endpoint.\n- name (string, optional): one parameter name.\nExample: {\"endpoint\": \"directions\", \"name\": \"truck_weight\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "doc_id": {
                    "description": "Page id instead of endpoint",
                    "type": "string"
                  },
                  "endpoint": {
                    "description": "API slug with optional variant (directions, directions/flexible, geofence/create), a tool name (geocode_batch) or a doc_id",
                    "type": "string"
                  },
                  "name": {
                    "description": "One parameter name, e.g. truck_weight",
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "get_documentation",
              "title": "Get Documentation Page",
              "description": "Fetch the full text of one documentation page by its doc_id, as returned by search_documentation. Use when an excerpt is not enough to answer accurately. Pages over the size limit return truncated: true and a section list; a single section can be requested with section. Sample request and response bodies are omitted unless include_examples is true. An unknown doc_id or section returns found: false with similar ids or the section list. When the index is temporarily unavailable the result says so and names the public docs site.\nParameters:\n- doc_id (string, required): page id from search results.\n- section (string, optional): heading of one section to return.\n- include_examples (boolean, optional): default false.\nExample: {\"doc_id\": \"routing/directions-api/examples/legal-routes-for-a-given-truck-weight\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "doc_id": {
                    "description": "Page id from search_documentation or list_documentation_topics",
                    "minLength": 1,
                    "type": "string"
                  },
                  "include_examples": {
                    "description": "Include sample request/response code blocks (default false)",
                    "type": "boolean"
                  },
                  "section": {
                    "description": "Heading (or its anchor) of one section to return",
                    "type": "string"
                  }
                },
                "required": [
                  "doc_id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "isochrone",
              "title": "Isochrone",
              "description": "Calculate the area reachable from a point within given travel times or distances; returns a GeoJSON FeatureCollection of contours (geometry coordinates are [longitude, latitude]). Each contour ring can be drawn with static_route_map by passing it as paths[].geojson_coordinates with a fill_color. Documentation for this API is available through search_documentation. Parameters: origin {latitude, longitude} (required); exactly one of contours_minutes (array, up to 4 values, max 40) or contours_meters (array, up to 4 values, max 60000); optional mode, polygons (true for Polygon geometry), denoise, generalize (meters), contours_colors (hex without #, one per contour), departure_time. Example: {\"origin\": {\"latitude\": 37.7749, \"longitude\": -122.4194}, \"contours_minutes\": [5, 10], \"polygons\": true}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "contours_colors": {
                    "description": "One hex color (without #) per contour, e.g. [\"ff0000\", \"00ff00\"]",
                    "items": {
                      "pattern": "^[0-9a-fA-F]{6}$",
                      "type": "string"
                    },
                    "maxItems": 4,
                    "type": "array"
                  },
                  "contours_meters": {
                    "description": "Travel distances in meters, one contour each (max 4 values, increasing, max 60000)",
                    "items": {
                      "maximum": 60000,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "maxItems": 4,
                    "type": "array"
                  },
                  "contours_minutes": {
                    "description": "Travel times in minutes, one contour each (max 4 values, increasing, max 40)",
                    "items": {
                      "maximum": 40,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "maxItems": 4,
                    "type": "array"
                  },
                  "denoise": {
                    "description": "Remove contours smaller than this fraction of the largest (default 1: largest only)",
                    "maximum": 1,
                    "minimum": 0,
                    "type": "number"
                  },
                  "departure_time": {
                    "description": "Departure as a UNIX timestamp in seconds, for typical-traffic analysis",
                    "maximum": 9007199254740991,
                    "minimum": -9007199254740991,
                    "type": "integer"
                  },
                  "generalize": {
                    "description": "Simplification tolerance in meters (Douglas-Peucker); omit for automatic",
                    "exclusiveMinimum": 0,
                    "type": "number"
                  },
                  "mode": {
                    "description": "Travel mode (default car)",
                    "enum": [
                      "car",
                      "truck",
                      "motorcycle",
                      "bike",
                      "walk"
                    ],
                    "type": "string"
                  },
                  "origin": {
                    "additionalProperties": false,
                    "description": "Starting point of the reachability analysis",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "polygons": {
                    "description": "Return contours as GeoJSON Polygons instead of LineStrings",
                    "type": "boolean"
                  }
                },
                "required": [
                  "origin"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "list_documentation_topics",
              "title": "List Documentation Topics",
              "description": "List the available documentation categories, APIs and pages, with index metadata. Useful before searching, when the right terms are not yet known, e.g. to see which APIs exist for a problem area. When the index is temporarily unavailable the result says so and names the public docs site.\nParameters:\n- category (string, optional): limit to one category.\n- sdk (string, optional): Android, iOS or Flutter.\nExample: {\"category\": \"Optimization\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "category": {
                    "description": "Only this category, e.g. Routing",
                    "type": "string"
                  },
                  "sdk": {
                    "description": "Only pages of this platform: Android, iOS, Flutter, Web",
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "measure",
              "title": "Measure Straight-Line Distance, Length, Area or Bearing",
              "description": "Measure straight-line (geodesic, WGS84) distance between two points, the length of a line, the area and perimeter of a polygon, or the bearing from one point to another. Straight-line (geodesic) geometry computed locally, not road distance or travel time: for those, directions or distance_matrix apply. No sign-in needed. Parameters: mode (distance | length | area | bearing); from and to ({latitude, longitude}) for distance and bearing; line (array of points) for length; polygon (GeoJSON Polygon or MultiPolygon, e.g. an isochrone contour) for area; units (meters, kilometers, miles, feet, nautical_miles; default meters); area_units (square_meters, square_kilometers, hectares, acres, square_miles, square_feet; default square_meters). Example: {\"mode\": \"distance\", \"from\": {\"latitude\": 12.9716, \"longitude\": 77.5946}, \"to\": {\"latitude\": 13.0827, \"longitude\": 80.2707}, \"units\": \"kilometers\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "area_units": {
                    "description": "Area unit (default square_meters)",
                    "enum": [
                      "square_meters",
                      "square_kilometers",
                      "hectares",
                      "acres",
                      "square_miles",
                      "square_feet"
                    ],
                    "type": "string"
                  },
                  "from": {
                    "additionalProperties": false,
                    "description": "Start point (distance, bearing)",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "line": {
                    "description": "The line (length)",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 5000,
                    "minItems": 2,
                    "type": "array"
                  },
                  "mode": {
                    "description": "distance: between two points; length: of a line; area: of a polygon; bearing: from one point to another",
                    "enum": [
                      "distance",
                      "length",
                      "area",
                      "bearing"
                    ],
                    "type": "string"
                  },
                  "polygon": {
                    "additionalProperties": {},
                    "description": "The polygon (area)",
                    "properties": {
                      "type": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object"
                  },
                  "to": {
                    "additionalProperties": false,
                    "description": "End point (distance, bearing)",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "units": {
                    "description": "Distance unit (default meters)",
                    "enum": [
                      "meters",
                      "kilometers",
                      "miles",
                      "feet",
                      "nautical_miles"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "mode"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "nearest",
              "title": "Nearest Point or Position on a Line",
              "description": "Find the candidate points nearest to a target as the crow flies (e.g. the closest depots to a customer), or snap the target onto a line and report the closest position on it. Straight-line (geodesic) distances, computed locally, no sign-in needed; distance_matrix gives travel time and road distance instead. Parameters: target ({latitude, longitude}); either candidates (array of {latitude, longitude, id?}) with k (default 1), or line (array of points); units (default meters). Returns ranked {id, point, distance} for candidates, or snapped_point, distance, segment_index and distance_along_line for a line. Example: {\"target\": {\"latitude\": 12.9716, \"longitude\": 77.5946}, \"candidates\": [{\"latitude\": 13.0827, \"longitude\": 80.2707, \"id\": \"Chennai\"}, {\"latitude\": 19.076, \"longitude\": 72.8777, \"id\": \"Mumbai\"}], \"k\": 1, \"units\": \"kilometers\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "candidates": {
                    "description": "Points to rank by straight-line distance from target",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "description": "Optional label echoed back in the result",
                          "maxLength": 100,
                          "type": "string"
                        },
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 1000,
                    "minItems": 1,
                    "type": "array"
                  },
                  "k": {
                    "description": "How many nearest candidates to return (default 1)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "line": {
                    "description": "A line to snap the target onto",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 5000,
                    "minItems": 2,
                    "type": "array"
                  },
                  "target": {
                    "additionalProperties": false,
                    "description": "The reference point",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "units": {
                    "description": "Distance unit (default meters)",
                    "enum": [
                      "meters",
                      "kilometers",
                      "miles",
                      "feet",
                      "nautical_miles"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "target"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "place_browse",
              "title": "Browse Places by Category",
              "description": "List places of given categories around a location, ranked by distance, without a text query - e.g. all restaurants or schools near a point. Use place_search when the user describes what they want in words; use place_lookup to expand a result by id. Parameters: categories (required array of category names or ids); near {latitude, longitude} (recommended), radius_m (with near), country_codes, bounding_box {west, south, east, north}, limit, language, view. Example: {\"categories\": [\"restaurant\"], \"near\": {\"latitude\": 1.2839, \"longitude\": 103.8607}, \"radius_m\": 800, \"limit\": 10}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "bounding_box": {
                    "additionalProperties": false,
                    "description": "Hard-limit results to this bounding box",
                    "properties": {
                      "east": {
                        "description": "Eastern longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "north": {
                        "description": "Northern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "south": {
                        "description": "Southern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "west": {
                        "description": "Western longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "west",
                      "south",
                      "east",
                      "north"
                    ],
                    "type": "object"
                  },
                  "categories": {
                    "description": "Category names or ids to browse; a place matching any of them is returned (e.g. [\"restaurant\"], [\"schools\"], [\"7376\"])",
                    "items": {
                      "minLength": 1,
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "country_codes": {
                    "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                    "items": {
                      "pattern": "^[A-Za-z]{3}$",
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "language": {
                    "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                    "type": "string"
                  },
                  "limit": {
                    "description": "Maximum results (default 10)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "near": {
                    "additionalProperties": false,
                    "description": "Center of the search context; results are ranked around this point",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "radius_m": {
                    "description": "With `near`: hard-limit results to this radius in meters",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991,
                    "type": "integer"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "categories"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "place_lookup",
              "title": "Place Lookup",
              "description": "Fetch the full details of a place (address, position, access points, categories, contacts) by its unique id, as returned by place_search, geocode_forward, autosuggest, autocomplete or search_along_route. Parameters: id (required); optional view. Example: {\"id\": \"2EmBgAmFpR9dg0D89EBzNA\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "description": "Unique place id, as returned by the other place/geocoding tools",
                    "minLength": 1,
                    "type": "string"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "place_search",
              "title": "Search Places",
              "description": "Search for places, points of interest and businesses with a free-text query (e.g. \"gas station\", \"coffee\"), ranked by relevance around a location. Use geocode_forward for plain address-to-coordinates conversion. Documentation for this API is available through search_documentation. Parameters: query (required); optional near {latitude, longitude} (recommended), radius_m (with near), country_codes, bounding_box {west, south, east, north}, limit, language, view. Example: {\"query\": \"coffee\", \"near\": {\"latitude\": 37.7749, \"longitude\": -122.4194}, \"radius_m\": 1000, \"limit\": 5}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "bounding_box": {
                    "additionalProperties": false,
                    "description": "Hard-limit results to this bounding box",
                    "properties": {
                      "east": {
                        "description": "Eastern longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "north": {
                        "description": "Northern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "south": {
                        "description": "Southern latitude",
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "west": {
                        "description": "Western longitude",
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "west",
                      "south",
                      "east",
                      "north"
                    ],
                    "type": "object"
                  },
                  "country_codes": {
                    "description": "Restrict results to these countries (ISO 3166-1 alpha-3 codes, e.g. [\"USA\",\"MEX\"])",
                    "items": {
                      "pattern": "^[A-Za-z]{3}$",
                      "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                  },
                  "language": {
                    "description": "Result language as a BCP 47 tag, e.g. \"en-US\"",
                    "type": "string"
                  },
                  "limit": {
                    "description": "Maximum results (default 10)",
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "near": {
                    "additionalProperties": false,
                    "description": "Center of the search context; results are ranked around this point",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "query": {
                    "description": "Free-text search query",
                    "minLength": 1,
                    "type": "string"
                  },
                  "radius_m": {
                    "description": "With `near`: hard-limit results to this radius in meters",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991,
                    "type": "integer"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories. Default: Unified (or the requester region)",
                    "enum": [
                      "Unified",
                      "AR",
                      "IL",
                      "IN",
                      "MA",
                      "PK",
                      "RU",
                      "TR",
                      "CN",
                      "TW"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "points_in_polygon",
              "title": "Points in Polygon",
              "description": "Geofencing: tell which of up to 1,000 points lie inside a polygon, for example which delivery addresses fall within an isochrone contour or a service area. Holes are respected; the test is done in map (flat degree) space, matching how polygons are drawn. Computed locally, no sign-in needed. Parameters: polygon (GeoJSON Polygon or MultiPolygon, or an isochrone Feature); points (array of {latitude, longitude, id?}); include_boundary (default true). Returns inside and outside lists (ids, or indexes when no id is given) with counts. Example: {\"polygon\": {\"type\": \"Polygon\", \"coordinates\": [[[77.59, 12.97], [77.61, 12.97], [77.61, 12.99], [77.59, 12.99], [77.59, 12.97]]]}, \"points\": [{\"latitude\": 12.98, \"longitude\": 77.6, \"id\": \"A\"}]}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "include_boundary": {
                    "description": "Count points exactly on the edge as inside (default true)",
                    "type": "boolean"
                  },
                  "points": {
                    "description": "Points to test, each optionally with an id",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "description": "Optional label echoed back in the result",
                          "maxLength": 100,
                          "type": "string"
                        },
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "maxItems": 1000,
                    "minItems": 1,
                    "type": "array"
                  },
                  "polygon": {
                    "additionalProperties": {},
                    "description": "A GeoJSON Polygon or MultiPolygon geometry (coordinates in [longitude, latitude] order), or a Feature wrapping one — an isochrone contour can be passed as is",
                    "properties": {
                      "type": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "polygon",
                  "points"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "polygon_ops",
              "title": "Polygon Union, Intersection or Difference",
              "description": "Combine polygons: union (merge), intersect (overlap) or difference (first minus the others), for example the overlap of two isochrones or the part of a zone not covered by a depot area. Returns the resulting GeoJSON geometry (Polygon or MultiPolygon, or null when empty) with its geodesic area. Computed locally, no sign-in needed. Parameters: operation (union | intersect | difference); polygons (array of 2–20 GeoJSON Polygon/MultiPolygon geometries, isochrone Features accepted); area_units (default square_meters); max_vertices (default 500, result simplified to fit). Example: {\"operation\": \"intersect\", \"polygons\": [{\"type\": \"Polygon\", \"coordinates\": [[[77.59, 12.97], [77.61, 12.97], [77.61, 12.99], [77.59, 12.99], [77.59, 12.97]]]}, {\"type\": \"Polygon\", \"coordinates\": [[[77.6, 12.98], [77.62, 12.98], [77.62, 13.0], [77.6, 13.0], [77.6, 12.98]]]}], \"area_units\": \"hectares\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "area_units": {
                    "description": "Area unit (default square_meters)",
                    "enum": [
                      "square_meters",
                      "square_kilometers",
                      "hectares",
                      "acres",
                      "square_miles",
                      "square_feet"
                    ],
                    "type": "string"
                  },
                  "max_vertices": {
                    "description": "Simplify the returned shape to at most this many vertices (default 500); the result says when it was simplified",
                    "maximum": 5000,
                    "minimum": 16,
                    "type": "integer"
                  },
                  "operation": {
                    "description": "difference = first polygon minus all others",
                    "enum": [
                      "union",
                      "intersect",
                      "difference"
                    ],
                    "type": "string"
                  },
                  "polygons": {
                    "description": "Two or more polygons (GeoJSON Polygon/MultiPolygon or isochrone Features)",
                    "items": {
                      "additionalProperties": {},
                      "description": "A GeoJSON Polygon or MultiPolygon geometry (coordinates in [longitude, latitude] order), or a Feature wrapping one — an isochrone contour can be passed as is",
                      "properties": {
                        "type": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type"
                      ],
                      "type": "object"
                    },
                    "maxItems": 20,
                    "minItems": 2,
                    "type": "array"
                  }
                },
                "required": [
                  "operation",
                  "polygons"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "postcode_lookup",
              "title": "Postcode Lookup",
              "description": "Get the centroid and boundary polygon of a postal/ZIP code, or find the postal code that contains a coordinate; one lookup per call. Supported countries: USA, India, UK, Netherlands, Austria, Germany, Indonesia, France, Singapore, Philippines, Canada, Australia, New Zealand, Italy, Brazil, Mexico, Spain. Parameters: either postal_code plus country (name, alpha-2 or alpha-3 code), or coordinate {latitude, longitude}; optional geojson_boundary (true for a GeoJSON boundary). Example: {\"postal_code\": \"90011\", \"country\": \"USA\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "coordinate": {
                    "additionalProperties": false,
                    "description": "Find the postal code containing this location (alternative to `postal_code`)",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "country": {
                    "description": "Country of the postal code — name, alpha-2, or alpha-3 ISO code. Required with `postal_code`",
                    "type": "string"
                  },
                  "geojson_boundary": {
                    "description": "Return the boundary polygon in GeoJSON format instead of the default point-list format",
                    "type": "boolean"
                  },
                  "postal_code": {
                    "description": "Postal/ZIP code to look up (requires `country`; do not combine with `coordinate`)",
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "search_along_route",
              "title": "Search Along Route",
              "description": "Find places matching a text query along a driving route, with the detour time and distance each stop adds - for \"find X on the way\" questions. Pass the route as an ordered list of waypoints, e.g. the origin, waypoints and destination used with directions. Parameters: route_points (array of {latitude, longitude}, at least 2, required), query (required); optional max_detour_seconds (default 900, max 3600), sort_by (detour_time | detour_offset), limit (max 20), view. Example: {\"route_points\": [{\"latitude\": 34.0493, \"longitude\": -118.2557}, {\"latitude\": 34.0415, \"longitude\": -118.231}], \"query\": \"gas station\", \"max_detour_seconds\": 600}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "limit": {
                    "description": "Maximum results (default 10, max 20)",
                    "maximum": 20,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "max_detour_seconds": {
                    "description": "Max driving time to reach a result after leaving the route (default 900 = 15 min)",
                    "maximum": 3600,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "query": {
                    "description": "What to find along the route, e.g. \"gas station\", \"coffee\"",
                    "minLength": 1,
                    "type": "string"
                  },
                  "route_points": {
                    "description": "Waypoints defining the route to search along, in travel order",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "minItems": 2,
                    "type": "array"
                  },
                  "sort_by": {
                    "description": "Order by detour driving time, or by distance of the detour point from route start",
                    "enum": [
                      "detour_time",
                      "detour_offset"
                    ],
                    "type": "string"
                  },
                  "view": {
                    "description": "Geopolitical view for disputed territories (default: requester region or Unified)",
                    "enum": [
                      "Unified",
                      "AR",
                      "CN",
                      "IN",
                      "PK",
                      "MA",
                      "RU",
                      "RS",
                      "TW",
                      "TR"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "route_points",
                  "query"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "search_documentation",
              "title": "Search Documentation",
              "description": "Search NextBillion's official API and SDK documentation. Use for any question about how NextBillion works: calling an API, what a parameter means, which API to use, or SDK setup. Answers come from an index of the official documentation, not from live API calls; when the index is temporarily unavailable the result says so and names the public docs site.\nQueries match best with the docs' own terms and exact parameter names (truck_weight, option=flexible) rather than everyday phrasing; when results are thin, other API terms may match. Results are excerpts: get_documentation returns a full page. Each result carries a source_url for citation and related_tools, the name of the tool that performs the operation.\nParameters:\n- query (string, required): search terms.\n- category (string, optional): e.g. Routing, Places.\n- api (string, optional): e.g. Directions.\n- sdk (string, optional): Android, iOS or Flutter.\n- limit (integer, optional): default 5, max 10.\n- include_examples (boolean, optional): default false.\nExample: {\"query\": \"truck_size truck_weight routing\", \"api\": \"Directions\"}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "api": {
                    "description": "Boost one API, e.g. Directions",
                    "type": "string"
                  },
                  "category": {
                    "description": "Boost one category, e.g. Routing, Places",
                    "type": "string"
                  },
                  "include_examples": {
                    "description": "Also return sample request/response code chunks (default false)",
                    "type": "boolean"
                  },
                  "limit": {
                    "description": "Number of results (default 5)",
                    "maximum": 10,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "query": {
                    "description": "Search terms, ideally the docs’ own vocabulary",
                    "minLength": 1,
                    "type": "string"
                  },
                  "sdk": {
                    "description": "Only pages of this platform: Android, iOS, Flutter, Web",
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "static_map_image",
              "title": "Static Map Image",
              "description": "Render a static map image centered on a location, with optional markers and line/polygon overlays; returns the image inline (path in the result text). For a map auto-fitted to a route or to overlays, use static_route_map. Parameters: center {latitude, longitude} and zoom (0-22) (required); optional markers (array of {latitude, longitude, color, icon_url, anchor, scale}), paths (array of {points [{latitude, longitude}] OR geojson_coordinates [[longitude, latitude], ...], stroke_color, stroke_width, fill_color for a filled polygon}), width, height (default 512), style (streets | light | dark | hybrid), format (png | jpg | webp), retina. Example: {\"center\": {\"latitude\": 48.8566, \"longitude\": 2.3522}, \"zoom\": 14, \"markers\": [{\"latitude\": 48.8584, \"longitude\": 2.2945, \"color\": \"red\"}], \"paths\": [{\"points\": [{\"latitude\": 48.85, \"longitude\": 2.29}, {\"latitude\": 48.86, \"longitude\": 2.30}], \"stroke_color\": \"green\"}]}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "center": {
                    "additionalProperties": false,
                    "description": "Center of the map view",
                    "properties": {
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      }
                    },
                    "required": [
                      "latitude",
                      "longitude"
                    ],
                    "type": "object"
                  },
                  "format": {
                    "description": "Image format (default png)",
                    "enum": [
                      "png",
                      "jpg",
                      "webp"
                    ],
                    "type": "string"
                  },
                  "height": {
                    "description": "Image height in pixels (default 512)",
                    "maximum": 2048,
                    "minimum": 16,
                    "type": "integer"
                  },
                  "markers": {
                    "description": "Markers to draw, each with optional color or custom icon",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "anchor": {
                          "description": "Anchor point of a custom icon (default bottom)",
                          "enum": [
                            "top",
                            "left",
                            "bottom",
                            "right",
                            "center",
                            "topleft",
                            "bottomleft",
                            "topright",
                            "bottomright"
                          ],
                          "type": "string"
                        },
                        "color": {
                          "description": "Marker color, e.g. \"red\" or \"#0000ff\" (ignored when icon_url is set)",
                          "type": "string"
                        },
                        "icon_url": {
                          "description": "URL of a custom marker image (max 64 kB / 4096 px, e.g. 64x64 PNG)",
                          "format": "uri",
                          "type": "string"
                        },
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "scale": {
                          "description": "Custom icon scale factor (default 1)",
                          "exclusiveMinimum": 0,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "paths": {
                    "description": "Extra lines/polygons to draw (e.g. isochrone contours as filled polygons)",
                    "items": {
                      "additionalProperties": false,
                      "description": "A line or filled polygon overlay",
                      "properties": {
                        "fill_color": {
                          "description": "Fill color for a closed shape, e.g. \"rgba(255,0,0,0.3)\" or \"#ff000055\"; omit for a line",
                          "type": "string"
                        },
                        "geojson_coordinates": {
                          "description": "Vertices as GeoJSON [longitude, latitude] pairs - pass an isochrone or GeoJSON ring here unchanged",
                          "items": {
                            "prefixItems": [
                              {
                                "type": "number"
                              },
                              {
                                "type": "number"
                              }
                            ],
                            "type": "array"
                          },
                          "minItems": 2,
                          "type": "array"
                        },
                        "points": {
                          "description": "Vertices as {latitude, longitude} objects",
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "latitude": {
                                "maximum": 90,
                                "minimum": -90,
                                "type": "number"
                              },
                              "longitude": {
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              }
                            },
                            "required": [
                              "latitude",
                              "longitude"
                            ],
                            "type": "object"
                          },
                          "minItems": 2,
                          "type": "array"
                        },
                        "stroke_color": {
                          "description": "Line color (default blue)",
                          "type": "string"
                        },
                        "stroke_width": {
                          "description": "Line width in px (default 3)",
                          "maximum": 20,
                          "minimum": 1,
                          "type": "integer"
                        }
                      },
                      "type": "object"
                    },
                    "maxItems": 10,
                    "type": "array"
                  },
                  "retina": {
                    "description": "Render at @2x resolution for high-DPI displays",
                    "type": "boolean"
                  },
                  "style": {
                    "description": "Map style id: \"streets\", \"light\", \"dark\", or \"hybrid\" (default streets)",
                    "type": "string"
                  },
                  "width": {
                    "description": "Image width in pixels (default 512)",
                    "maximum": 2048,
                    "minimum": 16,
                    "type": "integer"
                  },
                  "zoom": {
                    "description": "Zoom level (0 = world, ~10 = city, ~15 = streets; fractional values allowed)",
                    "maximum": 22,
                    "minimum": 0,
                    "type": "number"
                  }
                },
                "required": [
                  "center",
                  "zoom"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            },
            {
              "name": "static_route_map",
              "title": "Static Route Map",
              "description": "Render a static map auto-fitted to a route and/or overlays: a route from directions, and/or lines and filled polygons such as isochrone contours; very long geometry is simplified automatically to fit the map API URL limit (distances unaffected). Returns the image inline. Parameters: at least one of encoded_polyline (the geometry string from directions, preferred), route_points (array of {latitude, longitude}) or paths (array of {points OR geojson_coordinates [[longitude, latitude], ...], stroke_color, stroke_width, fill_color}); optional markers (array of {latitude, longitude, color, icon_url, anchor, scale}), stroke_color, stroke_width (route line), padding, width, height, style, format, retina. The example draws isochrone contours. Example: {\"paths\": [{\"geojson_coordinates\": [[-122.42, 37.77], [-122.40, 37.78], [-122.41, 37.79], [-122.42, 37.77]], \"fill_color\": \"rgba(29,78,216,0.35)\", \"stroke_color\": \"#1d4ed8\"}], \"markers\": [{\"latitude\": 37.7749, \"longitude\": -122.4194, \"color\": \"red\"}]}",
              "inputSchema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "additionalProperties": false,
                "properties": {
                  "encoded_polyline": {
                    "description": "Route geometry as a Google encoded polyline (precision 5) — exactly what the directions tool returns with its default geometry setting",
                    "type": "string"
                  },
                  "format": {
                    "description": "Image format (default png)",
                    "enum": [
                      "png",
                      "jpg",
                      "webp"
                    ],
                    "type": "string"
                  },
                  "height": {
                    "description": "Image height in pixels (default 512)",
                    "maximum": 2048,
                    "minimum": 16,
                    "type": "integer"
                  },
                  "markers": {
                    "description": "Extra markers, e.g. origin and destination, with optional color or custom icon",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "anchor": {
                          "description": "Anchor point of a custom icon (default bottom)",
                          "enum": [
                            "top",
                            "left",
                            "bottom",
                            "right",
                            "center",
                            "topleft",
                            "bottomleft",
                            "topright",
                            "bottomright"
                          ],
                          "type": "string"
                        },
                        "color": {
                          "description": "Marker color, e.g. \"red\" or \"#0000ff\" (ignored when icon_url is set)",
                          "type": "string"
                        },
                        "icon_url": {
                          "description": "URL of a custom marker image (max 64 kB / 4096 px, e.g. 64x64 PNG)",
                          "format": "uri",
                          "type": "string"
                        },
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        },
                        "scale": {
                          "description": "Custom icon scale factor (default 1)",
                          "exclusiveMinimum": 0,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "padding": {
                    "description": "Margin around the route as a fraction of image size (default 0.1)",
                    "maximum": 1,
                    "minimum": 0,
                    "type": "number"
                  },
                  "paths": {
                    "description": "Extra lines/polygons to draw (e.g. isochrone contours as filled polygons)",
                    "items": {
                      "additionalProperties": false,
                      "description": "A line or filled polygon overlay",
                      "properties": {
                        "fill_color": {
                          "description": "Fill color for a closed shape, e.g. \"rgba(255,0,0,0.3)\" or \"#ff000055\"; omit for a line",
                          "type": "string"
                        },
                        "geojson_coordinates": {
                          "description": "Vertices as GeoJSON [longitude, latitude] pairs - pass an isochrone or GeoJSON ring here unchanged",
                          "items": {
                            "prefixItems": [
                              {
                                "type": "number"
                              },
                              {
                                "type": "number"
                              }
                            ],
                            "type": "array"
                          },
                          "minItems": 2,
                          "type": "array"
                        },
                        "points": {
                          "description": "Vertices as {latitude, longitude} objects",
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "latitude": {
                                "maximum": 90,
                                "minimum": -90,
                                "type": "number"
                              },
                              "longitude": {
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              }
                            },
                            "required": [
                              "latitude",
                              "longitude"
                            ],
                            "type": "object"
                          },
                          "minItems": 2,
                          "type": "array"
                        },
                        "stroke_color": {
                          "description": "Line color (default blue)",
                          "type": "string"
                        },
                        "stroke_width": {
                          "description": "Line width in px (default 3)",
                          "maximum": 20,
                          "minimum": 1,
                          "type": "integer"
                        }
                      },
                      "type": "object"
                    },
                    "maxItems": 10,
                    "type": "array"
                  },
                  "retina": {
                    "description": "Render at @2x resolution for high-DPI displays",
                    "type": "boolean"
                  },
                  "route_points": {
                    "description": "Alternative to encoded_polyline: the route as an ordered list of coordinates",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "latitude": {
                          "maximum": 90,
                          "minimum": -90,
                          "type": "number"
                        },
                        "longitude": {
                          "maximum": 180,
                          "minimum": -180,
                          "type": "number"
                        }
                      },
                      "required": [
                        "latitude",
                        "longitude"
                      ],
                      "type": "object"
                    },
                    "minItems": 2,
                    "type": "array"
                  },
                  "stroke_color": {
                    "description": "Route line color (e.g. \"blue\", \"#ff0000\"; default blue)",
                    "type": "string"
                  },
                  "stroke_width": {
                    "description": "Route line width in pixels (default 4)",
                    "maximum": 20,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "style": {
                    "description": "Map style id: \"streets\", \"light\", \"dark\", or \"hybrid\" (default streets)",
                    "type": "string"
                  },
                  "width": {
                    "description": "Image width in pixels (default 512)",
                    "maximum": 2048,
                    "minimum": 16,
                    "type": "integer"
                  }
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              }
            }
          ],
          "schemaTokens": 17777,
          "changedAt": "2026-11-07T01:46:25.213284458Z",
          "check": {
            "checker": "anchor-check/1.0",
            "totalTokens": 17777,
            "counts": {
              "error": 0,
              "note": 1,
              "warn": 6
            },
            "findings": [
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "bbox",
                "message": "3 parameters without a description: points, points[].latitude, points[].longitude",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "geocode_structured",
                "message": "8 parameters without a description: city, county, house_number, neighborhood, postal_code, state and 2 more",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC13",
                "severity": "warn",
                "tool": "static_map_image",
                "message": "paths[].geojson_coordinates[] (array with no items)",
                "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
              },
              {
                "rule": "TC13",
                "severity": "warn",
                "tool": "static_route_map",
                "message": "paths[].geojson_coordinates[] (array with no items)",
                "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "directions",
                "message": "the definition is about 1,699 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC23",
                "severity": "warn",
                "message": "27 tools, about 17,789 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)."
              },
              {
                "rule": "TC24",
                "severity": "note",
                "message": "27 of 27 tools have no outputSchema",
                "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
              }
            ]
          }
        },
        "updatedAt": "2026-11-07T22:56:10.801921384Z"
      }
    },
    "edges": [
      {
        "by": 45,
        "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, for the REST APIs at api.nextbillion.io and the hosted MCP server. A status page at status.nextbillion.io, 'NextBillion.AI API Status', renders only in a browser, and its Statuspage-style JSON paths return 404, so we couldn't see its components (10) or read any history. That's our limit, not a finding, and the rubric gives 5 (5). The API reference states 2,400 queries a minute, or 40 a second, for continuous requests (15). Each endpoint's error table lists 429 as 'QPM or API request count quota reached', with no Retry-After or backoff guidance (5). No SLA found; the terms say access isn't warranted to be uninterrupted (0). The REST APIs are GA. The MCP server is at version 0.5.3 (10). 10+5+15+5+0+10 = 45."
        },
        "scores": {
          "a": 90,
          "b": 45
        }
      },
      {
        "by": 27,
        "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": "The REST APIs take a single `key` query parameter, so a plain key that travels in URLs, which earns 20 less 10. The MCP server adds OAuth 2.1 with PKCE, seals the key into tokens with AES-256-GCM, accepts a Bearer header and stores nothing server-side, so 5 back (15). Every tool is read-only, and keys can carry an IP allowlist (12). Places results are POI and address text with no prompt-injection guidance (7). Usage alerts at 50, 75 and 90 per cent of credits, per the pricing FAQ. No per-call log found (5). /.well-known/security.txt returns 404, and we found no disclosure policy or bug bounty. The about page says the company follows ISO 27001 standards, without naming a certificate (7). 15+12+7+5+7 = 46."
        },
        "scores": {
          "a": 73,
          "b": 46
        }
      },
      {
        "by": 20,
        "category": "payments",
        "leads": "google-maps-platform",
        "name": "Payments \u0026 pricing",
        "reasons": {
          "a": "No x402, MPP or L402 (0). Per-1,000 prices for every SKU published without login, re-read on 1 November (20). Monthly free caps per SKU (10,000 Essentials, 5,000 Pro, 1,000 Enterprise) need a Cloud billing account, but the Maps Demo Key lets a personal Google account prototype with Places API (New), Geocoding API v4, Compute Routes, Weather and the agent tools without billing information, within daily limits, so a trial with no card exists (20). A person still signs in to a Google account and accepts terms in a browser before the first key exists (0). 0 + 20 + 20 + 0 = 40.",
          "b": "No x402, MPP or L402 (0). Pricing is by quote, with annual licences per order, asset or API call and no published unit price (0). A 7-day free trial with an API key and 'No credit card required' (20). A person signs up through the console or emails support for a key (0). 0+0+20+0 = 20."
        },
        "scores": {
          "a": 40,
          "b": 20
        }
      },
      {
        "by": 14,
        "category": "transparency",
        "leads": "google-maps-platform",
        "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 under terms that name NextBillion.ai Pte. Ltd. and Singapore law, and an Apache-2.0 MCP server (18). The privacy policy keeps personal data while a legitimate business need exists, with no periods given. The MCP README says only tool arguments are sent to the API and nothing is retained between requests (14). No deprecation policy or dated notices found. The terms promise 10 days' notice of material changes to the terms (3). Data is mainly processed in Singapore, with transfers abroad under standard clauses. No sub-processor list found (8). 18+14+3+8 = 43."
        },
        "scores": {
          "a": 72,
          "b": 58
        }
      },
      {
        "by": 8,
        "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": "MCP reading, since the hosted server is the agent surface. 27 tools, four of them for documentation and seven local geometry tools, with shapes simplified to a 500-vertex budget to save context (18). limit, types, country, bbox and circle filters, and batch geocoding of up to 100 queries (16). The error table explains each code, and the MCP masks the key in error text (15). Every API tool is marked readOnlyHint, idempotentHint and not destructive in the source (18). Few required parameters and explicit latitude and longitude objects, but no official server-side SDK, only mobile and web map SDKs (10). 18+16+15+18+10 = 77."
        },
        "scores": {
          "a": 85,
          "b": 77
        }
      },
      {
        "by": 7,
        "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": "MCP server 0.5.3 on 30 October 2026 (30). Eleven tagged MCP releases between 7 October and 30 October, adding hosted mode, truck routing and geometry tools (20). Support by email, a public MCP repository with a changelog, but no public API changelog (8). The MCP server isn't in the official MCP registry, and we didn't check the mobile SDK versions (7). The MCP repository runs CI with unit and end-to-end tests (8). 30+20+8+7+8 = 73."
        },
        "scores": {
          "a": 80,
          "b": 73
        }
      }
    ],
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Google",
        "b": "NextBillion.ai Pte. Ltd.",
        "name": "Vendor"
      },
      {
        "a": "https://maps.googleapis.com",
        "b": "https://mcp.nextbillion.io",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP, Streamable HTTP",
        "b": "HTTP, Streamable HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth or key",
        "b": "OAuth or key",
        "name": "Auth"
      },
      {
        "a": "Pay per use",
        "b": "Paid",
        "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": "27",
        "name": "Tools exposed"
      },
      {
        "a": "no",
        "b": "yes",
        "name": "Read-only variant documented"
      },
      {
        "a": "no",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "2026-10-23",
        "b": "2026-10-30",
        "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": "not found in the text",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "5k stars, 1.2M npm/wk, 748k PyPI/wk",
        "b": "none",
        "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 NextBillion.ai's 55.4 (C), and leads in every scored category.",
        "question": "Which is better for AI agents, Google Maps Platform + Grounding Lite MCP or NextBillion.ai?"
      },
      {
        "answer": "Both take an API key or an OAuth sign-in.",
        "question": "Do Google Maps Platform + Grounding Lite MCP and NextBillion.ai need an API key?"
      },
      {
        "answer": "Yes. Google Maps Platform + Grounding Lite MCP has a hosted endpoint at https://maps.googleapis.com and NextBillion.ai at https://mcp.nextbillion.io.",
        "question": "Can an agent call Google Maps Platform + Grounding Lite MCP and NextBillion.ai without installing anything?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Reliability, 90 against 45",
          "Agent ergonomics, 85 against 77",
          "Security \u0026 auth, 73 against 46",
          "Payments \u0026 pricing, 40 against 20",
          "Maintenance \u0026 community, 80 against 73",
          "Transparency \u0026 trust, 72 against 58"
        ],
        "also": [
          "Agent-ready, a grade of BB or better"
        ],
        "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": null,
        "also": [
          "Free to start without a card"
        ],
        "goodFor": "Fleet and delivery routing, distance matrices and route optimisation with truck profiles, plus geocoding and POI search, for companies ready for an annual contract.",
        "slug": "nextbillion",
        "watchFor": "Pricing is by quote on annual licences, with no public unit prices"
      }
    ],
    "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"
        }
      ],
      "nextbillion": 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-nextbillion.json",
        "title": "Amazon Location Service vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/amazon-location-vs-nextbillion"
      },
      {
        "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-nextbillion.json",
        "title": "ArcGIS Location Platform vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/arcgis-vs-nextbillion"
      },
      {
        "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-nextbillion.json",
        "title": "Azure Maps vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/azure-maps-vs-nextbillion"
      },
      {
        "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-nextbillion.json",
        "title": "Geoapify Location Platform + MCP vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/geoapify-vs-nextbillion"
      },
      {
        "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-nextbillion.json",
        "title": "Geocodio vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/geocodio-vs-nextbillion"
      },
      {
        "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-maptiler.json",
        "title": "Google Maps Platform + Grounding Lite MCP vs MapTiler Cloud",
        "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler"
      },
      {
        "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-nextbillion.json",
        "title": "HERE Location Services vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/here-location-services-vs-nextbillion"
      },
      {
        "json": "https://www.anchorterminal.com/compare/locationiq-vs-nextbillion.json",
        "title": "LocationIQ vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/locationiq-vs-nextbillion"
      },
      {
        "json": "https://www.anchorterminal.com/compare/mapbox-vs-nextbillion.json",
        "title": "Mapbox APIs + MCP vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/mapbox-vs-nextbillion"
      },
      {
        "json": "https://www.anchorterminal.com/compare/mapquest-vs-nextbillion.json",
        "title": "MapQuest vs NextBillion.ai",
        "url": "https://www.anchorterminal.com/compare/mapquest-vs-nextbillion"
      },
      {
        "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/nextbillion-vs-nominatim.json",
        "title": "NextBillion.ai vs Nominatim",
        "url": "https://www.anchorterminal.com/compare/nextbillion-vs-nominatim"
      },
      {
        "json": "https://www.anchorterminal.com/compare/nextbillion-vs-opencage.json",
        "title": "NextBillion.ai vs OpenCage Geocoding API",
        "url": "https://www.anchorterminal.com/compare/nextbillion-vs-opencage"
      },
      {
        "json": "https://www.anchorterminal.com/compare/nextbillion-vs-radar.json",
        "title": "NextBillion.ai vs Radar",
        "url": "https://www.anchorterminal.com/compare/nextbillion-vs-radar"
      },
      {
        "json": "https://www.anchorterminal.com/compare/nextbillion-vs-stadia-maps.json",
        "title": "NextBillion.ai vs Stadia Maps",
        "url": "https://www.anchorterminal.com/compare/nextbillion-vs-stadia-maps"
      },
      {
        "json": "https://www.anchorterminal.com/compare/nextbillion-vs-tomtom.json",
        "title": "NextBillion.ai vs TomTom Maps APIs + MCP",
        "url": "https://www.anchorterminal.com/compare/nextbillion-vs-tomtom"
      },
      {
        "json": "https://www.anchorterminal.com/compare/nextbillion-vs-woosmap.json",
        "title": "NextBillion.ai vs Woosmap",
        "url": "https://www.anchorterminal.com/compare/nextbillion-vs-woosmap"
      }
    ],
    "panel": null,
    "scores": [
      {
        "by": 45,
        "edge": "google-maps-platform",
        "google-maps-platform": 90,
        "key": "reliability",
        "name": "Reliability",
        "nextbillion": 45,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 4,
        "edge": "google-maps-platform",
        "google-maps-platform": 77,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "nextbillion": 73,
        "weight": 13
      },
      {
        "by": 8,
        "edge": "google-maps-platform",
        "google-maps-platform": 85,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "nextbillion": 77,
        "weight": 13
      },
      {
        "by": 27,
        "edge": "google-maps-platform",
        "google-maps-platform": 73,
        "key": "security",
        "name": "Security \u0026 auth",
        "nextbillion": 46,
        "weight": 14
      },
      {
        "by": 20,
        "edge": "google-maps-platform",
        "google-maps-platform": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "nextbillion": 20,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 7,
        "edge": "google-maps-platform",
        "google-maps-platform": 80,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "nextbillion": 73,
        "weight": 7
      },
      {
        "by": 14,
        "edge": "google-maps-platform",
        "google-maps-platform": 72,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "nextbillion": 58,
        "weight": 7
      }
    ],
    "summary": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against NextBillion.ai's 55.4 (C), and leads in every scored category. 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.",
      "nextbillion": "NextBillion.ai covers routing, distance matrices, route optimisation, geocoding and places, and runs a hosted MCP server with 27 read-only annotated tools and OAuth sign-in. Pricing is by quote on annual licences, the REST API key travels in the query string, and no OpenAPI spec, API changelog or readable status history was found."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion",
    "json": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.md",
    "mcp": "https://www.anchorterminal.com/mcp",
    "slim": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.min.md"
  },
  "markdown": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against NextBillion.ai's 55.4 (C), and leads in every scored category. 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- NextBillion.ai: grade C, 55.4/100, rank #874 of 1510. Markdown https://www.anchorterminal.com/tools/nextbillion.md · JSON https://www.anchorterminal.com/api/v1/tools/nextbillion.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 45\n- Agent ergonomics, 85 against 77\n- Security \u0026 auth, 73 against 46\n- Payments \u0026 pricing, 40 against 20\n- Maintenance \u0026 community, 80 against 73\n- Transparency \u0026 trust, 72 against 58\n\nAlso in its favour:\n- Agent-ready, a grade of BB or better\n\nWatch for: Free monthly caps beyond the prototyping Demo Key need a Cloud billing account with a payment method\n\n### NextBillion.ai (C)\n\nGood for: Fleet and delivery routing, distance matrices and route optimisation with truck profiles, plus geocoding and POI search, for companies ready for an annual contract.\n\nAlso in its favour:\n- Free to start without a card\n\nWatch for: Pricing is by quote on annual licences, with no public unit prices\n\n\n## Why the edge\n\n### Reliability: Google Maps Platform + Grounding Lite MCP +45\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- NextBillion.ai (45): Hosted lines, for the REST APIs at api.nextbillion.io and the hosted MCP server. A status page at status.nextbillion.io, 'NextBillion.AI API Status', renders only in a browser, and its Statuspage-style JSON paths return 404, so we couldn't see its components (10) or read any history. That's our limit, not a finding, and the rubric gives 5 (5). The API reference states 2,400 queries a minute, or 40 a second, for continuous requests (15). Each endpoint's error table lists 429 as 'QPM or API request count quota reached', with no Retry-After or backoff guidance (5). No SLA found; the terms say access isn't warranted to be uninterrupted (0). The REST APIs are GA. The MCP server is at version 0.5.3 (10). 10+5+15+5+0+10 = 45.\n\n### Security \u0026 auth: Google Maps Platform + Grounding Lite MCP +27\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- NextBillion.ai (46): The REST APIs take a single `key` query parameter, so a plain key that travels in URLs, which earns 20 less 10. The MCP server adds OAuth 2.1 with PKCE, seals the key into tokens with AES-256-GCM, accepts a Bearer header and stores nothing server-side, so 5 back (15). Every tool is read-only, and keys can carry an IP allowlist (12). Places results are POI and address text with no prompt-injection guidance (7). Usage alerts at 50, 75 and 90 per cent of credits, per the pricing FAQ. No per-call log found (5). /.well-known/security.txt returns 404, and we found no disclosure policy or bug bounty. The about page says the company follows ISO 27001 standards, without naming a certificate (7). 15+12+7+5+7 = 46.\n\n### Payments \u0026 pricing: Google Maps Platform + Grounding Lite MCP +20\n\n- Google Maps Platform + Grounding Lite MCP (40): No x402, MPP or L402 (0). Per-1,000 prices for every SKU published without login, re-read on 1 November (20). Monthly free caps per SKU (10,000 Essentials, 5,000 Pro, 1,000 Enterprise) need a Cloud billing account, but the Maps Demo Key lets a personal Google account prototype with Places API (New), Geocoding API v4, Compute Routes, Weather and the agent tools without billing information, within daily limits, so a trial with no card exists (20). A person still signs in to a Google account and accepts terms in a browser before the first key exists (0). 0 + 20 + 20 + 0 = 40.\n- NextBillion.ai (20): No x402, MPP or L402 (0). Pricing is by quote, with annual licences per order, asset or API call and no published unit price (0). A 7-day free trial with an API key and 'No credit card required' (20). A person signs up through the console or emails support for a key (0). 0+0+20+0 = 20.\n\n### Transparency \u0026 trust: Google Maps Platform + Grounding Lite MCP +14\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- NextBillion.ai (58): Editorial half only. Closed service under terms that name NextBillion.ai Pte. Ltd. and Singapore law, and an Apache-2.0 MCP server (18). The privacy policy keeps personal data while a legitimate business need exists, with no periods given. The MCP README says only tool arguments are sent to the API and nothing is retained between requests (14). No deprecation policy or dated notices found. The terms promise 10 days' notice of material changes to the terms (3). Data is mainly processed in Singapore, with transfers abroad under standard clauses. No sub-processor list found (8). 18+14+3+8 = 43.\n\n### Agent ergonomics: Google Maps Platform + Grounding Lite MCP +8\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- NextBillion.ai (77): MCP reading, since the hosted server is the agent surface. 27 tools, four of them for documentation and seven local geometry tools, with shapes simplified to a 500-vertex budget to save context (18). limit, types, country, bbox and circle filters, and batch geocoding of up to 100 queries (16). The error table explains each code, and the MCP masks the key in error text (15). Every API tool is marked readOnlyHint, idempotentHint and not destructive in the source (18). Few required parameters and explicit latitude and longitude objects, but no official server-side SDK, only mobile and web map SDKs (10). 18+16+15+18+10 = 77.\n\n### Maintenance \u0026 community: Google Maps Platform + Grounding Lite MCP +7\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- NextBillion.ai (73): MCP server 0.5.3 on 30 October 2026 (30). Eleven tagged MCP releases between 7 October and 30 October, adding hosted mode, truck routing and geometry tools (20). Support by email, a public MCP repository with a changelog, but no public API changelog (8). The MCP server isn't in the official MCP registry, and we didn't check the mobile SDK versions (7). The MCP repository runs CI with unit and end-to-end tests (8). 30+20+8+7+8 = 73.\n\n## Score by category\n\n| Category | Weight | Google Maps Platform + Grounding Lite MCP | NextBillion.ai | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 90 | 45 | Google Maps Platform + Grounding Lite MCP +45 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 77 | 73 | Google Maps Platform + Grounding Lite MCP +4 |\n| Agent ergonomics | 13% (16.2 this run) | 85 | 77 | Google Maps Platform + Grounding Lite MCP +8 |\n| Security \u0026 auth | 14% (17.5 this run) | 73 | 46 | Google Maps Platform + Grounding Lite MCP +27 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 20 | Google Maps Platform + Grounding Lite MCP +20 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 80 | 73 | Google Maps Platform + Grounding Lite MCP +7 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 72 | 58 | Google Maps Platform + Grounding Lite MCP +14 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **75.4 · BB** | **55.4 · C** | |\n\n## Facts side by side\n\n| Fact | Google Maps Platform + Grounding Lite MCP | NextBillion.ai |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Google | NextBillion.ai Pte. Ltd. |\n| Hosted endpoint | `https://maps.googleapis.com` | `https://mcp.nextbillion.io` |\n| Transports | HTTP, Streamable HTTP | HTTP, Streamable HTTP |\n| Auth | OAuth or key | OAuth or key |\n| Pricing | Pay per use | Paid |\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 | 27 |\n| Read-only variant documented | no | yes |\n| llms.txt | no | yes |\n| Last release | 2026-10-23 | 2026-10-30 |\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 | not found in the text |\n| Popularity | 5k stars, 1.2M npm/wk, 748k PyPI/wk | none |\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### NextBillion.ai\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**NextBillion.ai.** NextBillion.ai covers routing, distance matrices, route optimisation, geocoding and places, and runs a hosted MCP server with 27 read-only annotated tools and OAuth sign-in. Pricing is by quote on annual licences, the REST API key travels in the query string, and no OpenAPI spec, API changelog or readable status history was found.\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### NextBillion.ai\n\n1. Connect through https://mcp.nextbillion.io so the key stays in a Bearer header or OAuth token rather than in request URLs\n2. Use the geometry tools only for straight-line questions; use directions or distance_matrix for travel time\n3. Batch up to 100 geocodes with geocode_batch instead of one call per address\n4. On 429 the quota or the 2,400-a-minute limit is reached; slow down and tell the user if credits are spent\n5. Search the docs with the MCP documentation tools before guessing a parameter\n\n## Questions\n\n### Which is better for AI agents, Google Maps Platform + Grounding Lite MCP or NextBillion.ai?\n\nGoogle Maps Platform + Grounding Lite MCP scores 75.4 (BB) on agent readiness against NextBillion.ai's 55.4 (C), and leads in every scored category.\n\n### Do Google Maps Platform + Grounding Lite MCP and NextBillion.ai need an API key?\n\nBoth take an API key or an OAuth sign-in.\n\n### Can an agent call Google Maps Platform + Grounding Lite MCP and NextBillion.ai without installing anything?\n\nYes. Google Maps Platform + Grounding Lite MCP has a hosted endpoint at https://maps.googleapis.com and NextBillion.ai at https://mcp.nextbillion.io.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.json, and with the fewest tokens: https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"google-maps-platform\", \"b\": \"nextbillion\"}`. From a terminal: `anchor compare google-maps-platform nextbillion`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/google-maps-platform.json and https://www.anchorterminal.com/api/v1/tools/nextbillion.json\n\n## Other comparisons with Google Maps Platform + Grounding Lite MCP or NextBillion.ai\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 NextBillion.ai](https://www.anchorterminal.com/compare/amazon-location-vs-nextbillion.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 NextBillion.ai](https://www.anchorterminal.com/compare/arcgis-vs-nextbillion.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 NextBillion.ai](https://www.anchorterminal.com/compare/azure-maps-vs-nextbillion.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 NextBillion.ai](https://www.anchorterminal.com/compare/geoapify-vs-nextbillion.md)\n- [Geocodio vs Google Maps Platform + Grounding Lite MCP](https://www.anchorterminal.com/compare/geocodio-vs-google-maps-platform.md)\n- [Geocodio vs NextBillion.ai](https://www.anchorterminal.com/compare/geocodio-vs-nextbillion.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 MapTiler Cloud](https://www.anchorterminal.com/compare/google-maps-platform-vs-maptiler.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 NextBillion.ai](https://www.anchorterminal.com/compare/here-location-services-vs-nextbillion.md)\n- [LocationIQ vs NextBillion.ai](https://www.anchorterminal.com/compare/locationiq-vs-nextbillion.md)\n- [Mapbox APIs + MCP vs NextBillion.ai](https://www.anchorterminal.com/compare/mapbox-vs-nextbillion.md)\n- [MapQuest vs NextBillion.ai](https://www.anchorterminal.com/compare/mapquest-vs-nextbillion.md)\n- [MapTiler Cloud vs NextBillion.ai](https://www.anchorterminal.com/compare/maptiler-vs-nextbillion.md)\n- [NextBillion.ai vs Nominatim](https://www.anchorterminal.com/compare/nextbillion-vs-nominatim.md)\n- [NextBillion.ai vs OpenCage Geocoding API](https://www.anchorterminal.com/compare/nextbillion-vs-opencage.md)\n- [NextBillion.ai vs Radar](https://www.anchorterminal.com/compare/nextbillion-vs-radar.md)\n- [NextBillion.ai vs Stadia Maps](https://www.anchorterminal.com/compare/nextbillion-vs-stadia-maps.md)\n- [NextBillion.ai vs TomTom Maps APIs + MCP](https://www.anchorterminal.com/compare/nextbillion-vs-tomtom.md)\n- [NextBillion.ai vs Woosmap](https://www.anchorterminal.com/compare/nextbillion-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 NextBillion.ai",
        "url": ""
      }
    ],
    "description": "Google Maps Platform + Grounding Lite MCP scores 75.4 (BB) to NextBillion.ai's 55.4 (C) for geocoding. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Google Maps Platform + Grounding Lite MCP BB 75.4",
      "NextBillion.ai C 55.4",
      "scores"
    ],
    "h1": "Google Maps Platform + Grounding Lite MCP vs NextBillion.ai",
    "image": "https://www.anchorterminal.com/assets/og/default.png",
    "path": "/compare/google-maps-platform-vs-nextbillion",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Google Maps Platform + Grounding Lite MCP vs NextBillion.ai (2026)",
    "toc": null,
    "updated": "2026-11-07",
    "url": "https://www.anchorterminal.com/compare/google-maps-platform-vs-nextbillion"
  },
  "tokens": {
    "markdown": 5650,
    "slim": 3280
  },
  "version": 1
}
