Skip to main content
Glama

directions

Read-onlyIdempotent

Generate routes, ETAs, and turn-by-turn directions between locations. Live traffic is post-route ETA enrichment and does not change the returned path (path_influenced=false); truck traffic adjustments are slowdown-only. Supports car / truck / motorcycle / pedestrian / bicycle, with hazmat + dimension + toll avoidance for commercial routing. ETAs are returned as ISO 8601 with timezone offset (in the destination's local timezone). Use vehicle_profile presets (10 total — DRY_VAN_53, FLATBED_48/_40, STEP_DECK, TANKER, BOX_TRUCK_26, AUTO_CARRIER, SPRINTER_VAN, DOUBLE_TRAILER, OVERSIZE) when routing trucks — they set height/weight/length in one parameter.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
toYesDestination: address string ('Houston, TX'), 'lat,lon' string, or { lat, lon } object
viaNoIntermediate stops in order; same shape as from/to. Up to 48 waypoints (max 50 total locations).
fromYesOrigin: address string ('Houston, TX'), 'lat,lon' string, or { lat, lon } object
unitsNoDistance units (default: miles). Accepts 'km'/'mi' as aliases.
hazmatNoSet true when transporting hazardous materials to avoid restricted routes
costingNoTransport mode (default: auto). Use 'truck' for commercial vehicles
axle_loadNoAxle weight in metric tons (e.g. 9.07t = 20,000 lbs per axle)
top_speedNoMaximum speed in km/h (default 105 for trucks)
use_ferryNoFerry preference 0-1 (0=avoid, 1=allow)
alternatesNoNumber of genuine motorized alternate routes to request (0, 1, or 2). Positive values require no via waypoints.
axle_countNoNumber of axles (default 5 for semi-trailer)
avoid_tollsNoAvoid toll roads when user requests toll-free routing
truck_widthNoTruck width in meters (e.g. 2.6m = 8'6")
truck_heightNoTruck height in meters (e.g. 4.11m = 13'6"). Triggers bridge avoidance
truck_lengthNoTruck length in meters (e.g. 16.2m = 53')
truck_weightNoTruck weight in metric tons (e.g. 36.3t = 80,000 lbs). Triggers weight-restricted road avoidance
use_highwaysNoHighway preference 0-1 (0=avoid, 1=prefer)
include_trafficNoApply post-route live-traffic ETA enrichment (default: true). Traffic does not change the returned path; truck adjustments are slowdown-only.
include_weatherNoAttach current conditions sampled along the route corridor (default: false). Post-route annotation only: weather does not change the returned path. Extra upstream lookup, opt-in only.
vehicle_profileNoPreset vehicle profile (10): DRY_VAN_53, FLATBED_48, FLATBED_40, STEP_DECK, TANKER, BOX_TRUCK_26, AUTO_CARRIER, SPRINTER_VAN, DOUBLE_TRAILER, OVERSIZE. Each sets height/weight/length/axle_count for that vehicle class in one parameter (e.g. DRY_VAN_53 = 4.11m tall, 36.3t, 22.25m long, 5 axles; OVERSIZE = 4.88m tall, 3.66m wide, 45.36t). The response echoes the applied dims in costing_options.truck. Any individual truck_height/truck_weight/etc. overrides a single field.
include_geometryNoRoute geometry shape control. "none" returns origin/destination Points only. "encoded" returns an encoded polyline6 string in a top-level `geometry` field plus origin/destination Points (≈95% smaller than raw GeoJSON; decode with @mapbox/polyline at precision 6). "full" emits decoded coordinates as a LineString in `geojson.features[0]`. When omitted (default), small routes use "full" and long routes auto-downgrade to "encoded" with a `geometry_truncated` warning.
include_elevationNoWhen true, include available route elevation fields. Point elevation may be returned for the origin and destination. Cumulative gain/loss is returned only when route-profile elevation is available.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
itemsNo
geojsonNo
metricsNo
summaryNoMap of scalar facts the LLM should surface verbatim
alternatesNo
display_hintNo
timezone_endNoIANA timezone at the route destination, or null when unresolved. Contains information from timezone-boundary-builder, which is made available under the Open Database License (ODbL) v1.0. Timezone boundaries © OpenStreetMap contributors. US legal-zone cross-check: U.S. Department of Transportation, Bureau of Transportation Statistics (public domain).
traffic_routeNo
timezone_startNoIANA timezone at the route origin, or null when unresolved. Contains information from timezone-boundary-builder, which is made available under the Open Database License (ODbL) v1.0. Timezone boundaries © OpenStreetMap contributors. US legal-zone cross-check: U.S. Department of Transportation, Bureau of Transportation Statistics (public domain).
costing_optionsNo
elevation_end_mNo
base_arrival_utcYesArrival time derived from the base duration, expressed as an ISO 8601 UTC timestamp.
elevation_end_ftNo
elevation_gain_mNo
elevation_loss_mNo
elevation_gain_ftNo
elevation_loss_ftNo
elevation_start_mNo
base_arrival_localYesArrival time derived from the base duration in the destination's local time, or null when the local timezone is unavailable.
elevation_start_ftNo
traffic_provenanceYes
timezone_end_statusNo
base_duration_secondsYesRoute duration before any traffic-based adjustment, in seconds.
effective_arrival_utcYesAuthoritative arrival time for this response, expressed as an ISO 8601 UTC timestamp.
timezone_start_statusNo
traffic_delay_secondsYesEffective duration minus base duration, in seconds. Positive means traffic made the ETA slower, negative means it made the ETA faster, and zero means the duration was unchanged. For truck costing, general traffic evidence is slowdown-only, so this value is never negative.
effective_arrival_localYesAuthoritative arrival time in the destination's local time, or null when the local timezone is unavailable.
timezone_artifact_versionNo
effective_duration_secondsYesAuthoritative duration for this response, in seconds, after any applicable traffic-based adjustment.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedOutput schema / properties / timezone_artifact_version
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / timezone_end / description
      Added value: +"IANA timezone at the route destination, or null when unresolved. Contains information from timezone-boundary-builder, which is made available under the Open Database License (ODbL) v1.0. Timezone boundaries © OpenStreetMap contributors. US legal-zone cross-check: U.S. Department of Transportation, Bureau of Transportation Statistics (public domain)."
    • addedOutput schema / properties / timezone_end_status
      Added value: +{
      +  "enum": [
      +    "resolved",
      +    "boundary_ambiguous",
      +    "source_conflict",
      +    "not_covered",
      +    "unavailable"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / timezone_start / description
      Added value: +"IANA timezone at the route origin, or null when unresolved. Contains information from timezone-boundary-builder, which is made available under the Open Database License (ODbL) v1.0. Timezone boundaries © OpenStreetMap contributors. US legal-zone cross-check: U.S. Department of Transportation, Bureau of Transportation Statistics (public domain)."
    • addedOutput schema / properties / timezone_start_status
      Added value: +{
      +  "enum": [
      +    "resolved",
      +    "boundary_ambiguous",
      +    "source_conflict",
      +    "not_covered",
      +    "unavailable"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / include_weather
      Added value: +{
      +  "description": "Attach current conditions sampled along the route corridor (default: false). Post-route annotation only: weather does not change the returned path. Extra upstream lookup, opt-in only.",
      +  "type": "boolean"
      +}
  3. Changed7 schema fields changed
    • changedInput schema / properties / include_traffic / description
      Previous value: -"Include live traffic conditions along route (default: true)"New value: +"Apply post-route live-traffic ETA enrichment (default: true). Traffic does not change the returned path; truck adjustments are slowdown-only."
    • changedOutput schema / properties / traffic_delay_seconds / description
      Previous value: -"Difference between effective and base duration, in seconds; zero when traffic did not change the duration."New value: +"Effective duration minus base duration, in seconds. Positive means traffic made the ETA slower, negative means it made the ETA faster, and zero means the duration was unchanged. For truck costing, general traffic evidence is slowdown-only, so this value is never negative."
    • changedOutput schema / properties / traffic_provenance / properties / outcome / description
      Previous value: -"Neutral, stable reason code for what happened to traffic evidence on this request. `TRAFFIC_DISABLED`: no traffic evidence was sought. `PROVIDER_DISABLED`: evidence was sought but the traffic backend was unreachable or unconfigured. `QUOTA_EXHAUSTED`: the traffic backend's spend allotment was exhausted. `NO_SEGMENT_MATCH`: the backend answered but no sample matched a live road segment. `INSUFFICIENT_COVERAGE`: the backend reported no sensor coverage for the sampled area. `STALE_EVIDENCE`: an adjustment was computed, but the oldest observation behind it is older than this response is willing to call current. `UPSTREAM_ERROR`: a generic or network failure prevented reading traffic evidence. `APPLIED`: an adjustment was computed and reached this response; inspect the nullable freshness and source-time fields to determine whether its observation age is known. "New value: +"Neutral, stable reason code for what happened to traffic evidence on this request. `TRAFFIC_DISABLED`: no traffic evidence was sought. `PROVIDER_DISABLED`: evidence was sought but the traffic backend was not configured. `QUOTA_EXHAUSTED`: the traffic backend's spend allotment was exhausted. `NO_SEGMENT_MATCH`: the backend answered but no sample matched a live road segment. `INSUFFICIENT_COVERAGE`: the backend reported no sensor coverage for the sampled area. `STALE_EVIDENCE`: an adjustment was computed, but the oldest observation behind it is older than this response is willing to call current. `UPSTREAM_ERROR`: a configured backend or network failure prevented reading all requested traffic evidence. `APPLIED`: an adjustment was computed and reached this response; inspect the nullable freshness and source-time fields to determine whether its observation age is known. Material failure codes take precedence over `APPLIED` when only partial evidence adjusted the duration; `duration_influenced` remains true in that case."
    • addedOutput schema / properties / traffic_provenance / properties / retrieval_age_seconds
      Added value: +{
      +  "description": "Age, in seconds, of the oldest retrieved traffic tile bytes used by this response. This is cache/acquisition age, not traffic-observation freshness. Null for point traffic or when tile cache metadata is unavailable.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / traffic_provenance / properties / retrieved_at
      Added value: +{
      +  "description": "ISO 8601 time when the oldest traffic tile bytes used by this response were retrieved or cached. This is acquisition metadata, not the time the traffic was observed. Null for point traffic or when tile cache metadata is unavailable.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / traffic_provenance / properties / route_coverage_pct / description
      Previous value: -"Percentage of the route's distance backed by a live traffic observation. Null today: traffic is sampled at a few points along the route and each answer covers a point rather than a measured length of road, so no honest percentage can be derived."New value: +"Percentage of the route's distance backed by a live traffic observation. This is a MEASURED figure, not an attributed one: it sums the length of road each traffic observation actually matched and divides by the route distance. Coverage can range from sparse observations to most of a corridor, depending on the evidence available for this request; use the returned value rather than assuming a sampling pattern. A low percentage does not mean the ETA is unreliable; it means most of the route's duration comes from the road network's own speeds rather than from live observation. Null when no live traffic observation carried a measurable length."
    • changedOutput schema / properties / traffic_provenance / required
      Previous value: -[
      -  "mode",
      -  "outcome",
      -  "path_influenced",
      -  "duration_influenced",
      -  "source_as_of",
      -  "route_coverage_pct",
      -  "freshness_seconds",
      -  "routing_release_id",
      -  "overlay_epoch"
      -]New value: +[
      +  "mode",
      +  "outcome",
      +  "path_influenced",
      +  "duration_influenced",
      +  "source_as_of",
      +  "route_coverage_pct",
      +  "freshness_seconds",
      +  "retrieved_at",
      +  "retrieval_age_seconds",
      +  "routing_release_id",
      +  "overlay_epoch"
      +]
  4. Changed48 schema fields changed
    • addedInput schema / properties / alternates
      Added value: +{
      +  "description": "Number of genuine motorized alternate routes to request (0, 1, or 2). Positive values require no via waypoints.",
      +  "maximum": 2,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / axle_count / maximum
      Added value: +20
    • addedInput schema / properties / axle_count / minimum
      Added value: +1
    • addedInput schema / properties / axle_load / maximum
      Added value: +100
    • addedInput schema / properties / axle_load / minimum
      Added value: +0
    • addedInput schema / properties / from / maxLength
      Added value: +2000
    • addedInput schema / properties / include_elevation
      Added value: +{
      +  "description": "When true, include available route elevation fields. Point elevation may be returned for the origin and destination. Cumulative gain/loss is returned only when route-profile elevation is available.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / include_geometry / description
      Previous value: -"Route geometry shape control. \"none\" returns origin/destination Points only. \"encoded\" returns the Valhalla polyline6 string in a top-level `geometry` field plus origin/destination Points (≈95% smaller than raw GeoJSON; decode with @mapbox/polyline at precision 6). \"full\" emits decoded coordinates as a LineString in `geojson.features[0]`. When omitted (default), small routes use \"full\" and long routes auto-downgrade to \"encoded\" with a `geometry_truncated` warning."New value: +"Route geometry shape control. \"none\" returns origin/destination Points only. \"encoded\" returns an encoded polyline6 string in a top-level `geometry` field plus origin/destination Points (≈95% smaller than raw GeoJSON; decode with @mapbox/polyline at precision 6). \"full\" emits decoded coordinates as a LineString in `geojson.features[0]`. When omitted (default), small routes use \"full\" and long routes auto-downgrade to \"encoded\" with a `geometry_truncated` warning."
    • addedInput schema / properties / top_speed / maximum
      Added value: +300
    • addedInput schema / properties / top_speed / minimum
      Added value: +0
    • addedInput schema / properties / truck_height / maximum
      Added value: +30
    • addedInput schema / properties / truck_height / minimum
      Added value: +0
    • addedInput schema / properties / truck_length / maximum
      Added value: +60
    • addedInput schema / properties / truck_length / minimum
      Added value: +0
    • addedInput schema / properties / truck_weight / maximum
      Added value: +200
    • addedInput schema / properties / truck_weight / minimum
      Added value: +0
    • addedInput schema / properties / truck_width / maximum
      Added value: +10
    • addedInput schema / properties / truck_width / minimum
      Added value: +0
    • addedInput schema / properties / use_ferry / maximum
      Added value: +1
    • addedInput schema / properties / use_ferry / minimum
      Added value: +0
    • addedInput schema / properties / use_highways / maximum
      Added value: +1
    • addedInput schema / properties / use_highways / minimum
      Added value: +0
    • changedInput schema / properties / vehicle_profile / description
      Previous value: -"Preset vehicle (10 total, see lib/truck-costing.ts:VEHICLE_PROFILE_IDS): DRY_VAN_53, FLATBED_48, FLATBED_40, STEP_DECK, TANKER, BOX_TRUCK_26, AUTO_CARRIER, SPRINTER_VAN, DOUBLE_TRAILER, OVERSIZE. Sets height/weight/length automatically. Individual params override."New value: +"Preset vehicle profile (10): DRY_VAN_53, FLATBED_48, FLATBED_40, STEP_DECK, TANKER, BOX_TRUCK_26, AUTO_CARRIER, SPRINTER_VAN, DOUBLE_TRAILER, OVERSIZE. Each sets height/weight/length/axle_count for that vehicle class in one parameter (e.g. DRY_VAN_53 = 4.11m tall, 36.3t, 22.25m long, 5 axles; OVERSIZE = 4.88m tall, 3.66m wide, 45.36t). The response echoes the applied dims in costing_options.truck. Any individual truck_height/truck_weight/etc. overrides a single field."
    • addedInput schema / properties / vehicle_profile / maxLength
      Added value: +64
    • changedInput schema / properties / via / description
      Previous value: -"Intermediate stops in order; same shape as from/to"New value: +"Intermediate stops in order; same shape as from/to. Up to 48 waypoints (max 50 total locations)."
    • addedInput schema / properties / via / maxItems
      Added value: +48
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / alternates
      Added value: +{
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "distance": {
      +        "type": "number"
      +      },
      +      "distance_units": {
      +        "enum": [
      +          "miles",
      +          "kilometers"
      +        ],
      +        "type": "string"
      +      },
      +      "duration_seconds": {
      +        "type": "number"
      +      },
      +      "geojson": {
      +        "$ref": "#/properties/geojson"
      +      },
      +      "geometry": {
      +        "additionalProperties": {},
      +        "type": "object"
      +      },
      +      "legs": {
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "distance": {
      +              "type": "number"
      +            },
      +            "duration_seconds": {
      +              "type": "number"
      +            },
      +            "leg": {
      +              "type": "number"
      +            },
      +            "maneuvers": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "leg",
      +            "distance",
      +            "duration_seconds",
      +            "maneuvers"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "maneuvers": {
      +        "items": {
      +          "$ref": "#/properties/items/items"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "distance",
      +      "distance_units",
      +      "duration_seconds",
      +      "legs",
      +      "maneuvers"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / base_arrival_local
      Added value: +{
      +  "description": "Arrival time derived from the base duration in the destination's local time, or null when the local timezone is unavailable.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / base_arrival_utc
      Added value: +{
      +  "description": "Arrival time derived from the base duration, expressed as an ISO 8601 UTC timestamp.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / base_duration_seconds
      Added value: +{
      +  "description": "Route duration before any traffic-based adjustment, in seconds.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / effective_arrival_local
      Added value: +{
      +  "description": "Authoritative arrival time in the destination's local time, or null when the local timezone is unavailable.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / effective_arrival_utc
      Added value: +{
      +  "description": "Authoritative arrival time for this response, expressed as an ISO 8601 UTC timestamp.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / effective_duration_seconds
      Added value: +{
      +  "description": "Authoritative duration for this response, in seconds, after any applicable traffic-based adjustment.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / elevation_end_ft
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_end_m
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_gain_ft
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_gain_m
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_loss_ft
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_loss_m
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_start_ft
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / elevation_start_m
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / timezone_end
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / timezone_start
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / traffic_delay_seconds
      Added value: +{
      +  "description": "Difference between effective and base duration, in seconds; zero when traffic did not change the duration.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / traffic_provenance
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "duration_influenced": {
      +      "description": "Whether traffic actually changed the duration returned by THIS request. False when no traffic adjustment was applied, even if traffic was requested and fetched successfully.",
      +      "type": "boolean"
      +    },
      +    "freshness_seconds": {
      +      "description": "Age, in seconds, of the oldest traffic observation behind this response. Null when the traffic provider did not report an observation age.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "mode": {
      +      "description": "Which traffic-processing rung this request attempted. `none`: no traffic data was consulted. `eta_enrichment`: after the route was chosen, traffic evidence was sought only to adjust its estimated duration; the roads returned are unchanged. The attempt may fail or produce no adjustment, so inspect `outcome` and `duration_influenced` for what reached this answer. `candidate_ranking`: traffic re-ranked several candidate routes against each other. `native_live_routing`: live speeds were used to choose which roads to take. `native_predicted_routing`: as above, plus time-of-day predicted speeds for a future departure.",
      +      "enum": [
      +        "none",
      +        "eta_enrichment",
      +        "candidate_ranking",
      +        "native_live_routing",
      +        "native_predicted_routing"
      +      ],
      +      "type": "string"
      +    },
      +    "outcome": {
      +      "description": "Neutral, stable reason code for what happened to traffic evidence on this request. `TRAFFIC_DISABLED`: no traffic evidence was sought. `PROVIDER_DISABLED`: evidence was sought but the traffic backend was unreachable or unconfigured. `QUOTA_EXHAUSTED`: the traffic backend's spend allotment was exhausted. `NO_SEGMENT_MATCH`: the backend answered but no sample matched a live road segment. `INSUFFICIENT_COVERAGE`: the backend reported no sensor coverage for the sampled area. `STALE_EVIDENCE`: an adjustment was computed, but the oldest observation behind it is older than this response is willing to call current. `UPSTREAM_ERROR`: a generic or network failure prevented reading traffic evidence. `APPLIED`: an adjustment was computed and reached this response; inspect the nullable freshness and source-time fields to determine whether its observation age is known. ",
      +      "enum": [
      +        "TRAFFIC_DISABLED",
      +        "PROVIDER_DISABLED",
      +        "QUOTA_EXHAUSTED",
      +        "NO_SEGMENT_MATCH",
      +        "INSUFFICIENT_COVERAGE",
      +        "STALE_EVIDENCE",
      +        "UPSTREAM_ERROR",
      +        "APPLIED"
      +      ],
      +      "type": "string"
      +    },
      +    "overlay_epoch": {
      +      "description": "Identifier of the live-speed overlay applied to the road network. Null today: no live-speed overlay is in use.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "path_influenced": {
      +      "description": "Whether traffic could have changed WHICH roads were returned. False today: the route is selected from the road network's own speeds, so traffic never changes the path — only the estimated duration.",
      +      "type": "boolean"
      +    },
      +    "route_coverage_pct": {
      +      "description": "Percentage of the route's distance backed by a live traffic observation. Null today: traffic is sampled at a few points along the route and each answer covers a point rather than a measured length of road, so no honest percentage can be derived.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "routing_release_id": {
      +      "description": "Identifier of the road-network build that produced this route. Null today: the routing engine does not report one.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source_as_of": {
      +      "description": "ISO 8601 time at which the traffic observations behind this response were made. Null when the traffic provider did not report an observation time.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "mode",
      +    "outcome",
      +    "path_influenced",
      +    "duration_influenced",
      +    "source_as_of",
      +    "route_coverage_pct",
      +    "freshness_seconds",
      +    "routing_release_id",
      +    "overlay_epoch"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / traffic_route
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "current_speed_admitted": {
      +      "const": true,
      +      "type": "boolean"
      +    },
      +    "max_age_seconds": {
      +      "exclusiveMinimum": 0,
      +      "type": "integer"
      +    },
      +    "observed_at": {
      +      "type": "string"
      +    },
      +    "release_id": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "current_speed_admitted"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / required
      Added value: +[
      +  "base_duration_seconds",
      +  "effective_duration_seconds",
      +  "traffic_delay_seconds",
      +  "base_arrival_utc",
      +  "base_arrival_local",
      +  "effective_arrival_utc",
      +  "effective_arrival_local",
      +  "traffic_provenance"
      +]
  5. Changed1 schema field changed
    • addedInput schema / properties / include_geometry
      Added value: +{
      +  "description": "Route geometry shape control. \"none\" returns origin/destination Points only. \"encoded\" returns the Valhalla polyline6 string in a top-level `geometry` field plus origin/destination Points (≈95% smaller than raw GeoJSON; decode with @mapbox/polyline at precision 6). \"full\" emits decoded coordinates as a LineString in `geojson.features[0]`. When omitted (default), small routes use \"full\" and long routes auto-downgrade to \"encoded\" with a `geometry_truncated` warning.",
      +  "enum": [
      +    "none",
      +    "encoded",
      +    "full"
      +  ],
      +  "type": "string"
      +}
  6. Changed8 schema fields changed
    • changedInput schema / properties / from / description
      Previous value: -"Origin address or 'lat,lon'"New value: +"Origin: address string ('Houston, TX'), 'lat,lon' string, or { lat, lon } object"
    • addedInput schema / properties / from / minLength
      Added value: +1
    • addedInput schema / properties / to / $ref
      Added value: +"#/properties/from"
    • changedInput schema / properties / to / description
      Previous value: -"Destination address or 'lat,lon'"New value: +"Destination: address string ('Houston, TX'), 'lat,lon' string, or { lat, lon } object"
    • removedInput schema / properties / to / type
      Removed value: -"string"
    • changedInput schema / properties / via / description
      Previous value: -"Intermediate stops in order"New value: +"Intermediate stops in order; same shape as from/to"
    • addedInput schema / properties / via / items / $ref
      Added value: +"#/properties/from"
    • removedInput schema / properties / via / items / type
      Removed value: -"string"
  7. Changed1 schema field changed
    • changedInput schema / properties / units / description
      Previous value: -"Distance units (default: miles)"New value: +"Distance units (default: miles). Accepts 'km'/'mi' as aliases."
  8. Changed1 schema field changed
    • changedInput schema / properties / vehicle_profile / description
      Previous value: -"Preset vehicle: DRY_VAN_53, FLATBED_48, TANKER, BOX_TRUCK_26, SPRINTER_VAN, DOUBLE_TRAILER, OVERSIZE. Sets height/weight/length automatically. Individual params override."New value: +"Preset vehicle (10 total, see lib/truck-costing.ts:VEHICLE_PROFILE_IDS): DRY_VAN_53, FLATBED_48, FLATBED_40, STEP_DECK, TANKER, BOX_TRUCK_26, AUTO_CARRIER, SPRINTER_VAN, DOUBLE_TRAILER, OVERSIZE. Sets height/weight/length automatically. Individual params override."
  9. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "costing_options": {
      +      "additionalProperties": {},
      +      "type": "object"
      +    },
      +    "display_hint": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "layout": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "summary",
      +                "table",
      +                "summary+table",
      +                "map",
      +                "chart+table"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "string"
      +            }
      +          ]
      +        },
      +        "map_layers": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "preferred_charts": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "sections": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "layout"
      +      ],
      +      "type": "object"
      +    },
      +    "geojson": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "features": {
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "geometry": {
      +                "anyOf": [
      +                  {
      +                    "additionalProperties": true,
      +                    "properties": {
      +                      "coordinates": {},
      +                      "geometries": {
      +                        "items": {},
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "anyOf": [
      +                          {
      +                            "enum": [
      +                              "Point",
      +                              "LineString",
      +                              "Polygon",
      +                              "MultiPoint",
      +                              "MultiLineString",
      +                              "MultiPolygon",
      +                              "GeometryCollection"
      +                            ],
      +                            "type": "string"
      +                          },
      +                          {
      +                            "type": "string"
      +                          }
      +                        ]
      +                      }
      +                    },
      +                    "required": [
      +                      "type"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "id": {
      +                "type": [
      +                  "string",
      +                  "number"
      +                ]
      +              },
      +              "properties": {
      +                "additionalProperties": {},
      +                "type": "object"
      +              },
      +              "type": {
      +                "const": "Feature",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type",
      +              "geometry"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "type": {
      +          "const": "FeatureCollection",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type",
      +        "features"
      +      ],
      +      "type": "object"
      +    },
      +    "items": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "begin_shape_index": {
      +            "type": "number"
      +          },
      +          "distance": {
      +            "type": [
      +              "number",
      +              "string"
      +            ]
      +          },
      +          "instruction": {
      +            "type": "string"
      +          },
      +          "time": {
      +            "type": "number"
      +          },
      +          "type": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "metrics": {
      +      "items": {
      +        "additionalProperties": {},
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "summary": {
      +      "additionalProperties": {},
      +      "description": "Map of scalar facts the LLM should surface verbatim",
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  10. Changed1 schema field changed
    • addedInput schema / additionalProperties
      Added value: +false
  11. First observed

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only/idempotent annotations, the description discloses critical non-obvious behavior: live traffic is post-route ETA enrichment that does not alter the path, truck adjustments are slowdown-only, and ETAs are ISO 8601 with destination-local timezone offsets. It also flags include_weather behavior as post-route and opt-in. These details prevent incorrect expectations without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences with a front-loaded purpose, followed by high-value caveats (traffic behavior, timezone, vehicle profiles) and no filler. It is dense but appropriately sized for a 22-parameter routing tool, though it duplicates some schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with this many parameters and an output schema present, the description covers the non-obvious behavioral caveats an agent needs to invoke it correctly: traffic doesn't reroute, truck adjustments are slowdown-only, ETAs are timezone-aware, and vehicle profiles are provided. Required params and shapes are in the schema, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter and the vehicle_profile presets in detail. The description repeats the preset list and adds the 'when routing trucks' recommendation, but adds no parameter semantics beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Generate routes, ETAs, and turn-by-turn directions between locations,' a specific verb+resource phrase that clearly distinguishes the tool from siblings like distance_matrix, isochrone, and map_match. It further lists supported travel modes and commercial-routing features, reinforcing the tool's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states clear context for when to use the tool (routing/ETA/turn-by-turn needs) and gives parameter-level guidance ('Use vehicle_profile presets ... when routing trucks'). However, it never names an alternative tool or states when not to use this one, so routing to it versus distance_matrix or map_match is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources