mapbox/mapbox-location-grounding
Compose Mapbox MCP tools to produce grounded, cited location-aware responses from live data instead of training data
npx skills add https://github.com/mapbox/mapbox-agent-skills --skill mapbox-location-grounding
Teaches AI assistants how to ground location-aware responses in live Mapbox data by composing MCP tools into a structured, cited answer. Use this instead of relying on training data for place names, POIs, ratings, or travel times — which are stale and prone to hallucination.
Ground responses when the user asks about:
Never answer location questions from training data alone. Always retrieve live data.
If ground_location_tool is available, use it — it handles reverse geocoding, POI search, place details enrichment, isochrone, and a static map image in one call:
ground_location_tool(
longitude, latitude,
query: "restaurant", // optional — category or subcategory of nearby places to find
profile: "mapbox/walking", // optional — travel profile for isochrone
contours_minutes: [5, 10, 15]
)
Returns:
Do not call reverse_geocode_tool, category_search_tool, place_details_tool, or isochrone_tool separately — they are already composed inside this tool.
The query parameter accepts category or subcategory terms — not attribute preferences:
"restaurant", "coffee", "park", "Italian restaurant", "EV charging station""family-friendly", "fast charging", "outdoor seating" — these are not filterable attributes in Mapbox dataTo help users find places matching a preference (e.g. "family-friendly"), search by category ("restaurant") and use the returned rating and price data to inform the recommendation.
If ground_location_tool is not available, build the grounded response by composing these tools in order:
reverse_geocode_tool(longitude, latitude, types: "neighborhood,locality,place")
Returns: neighborhood, city, region, country. This is the anchor for the response.
For specific names or brands:
search_and_geocode_tool(query, proximity: {longitude, latitude}, limit: 10)
For generic categories:
category_search_tool(category, proximity: {longitude, latitude}, limit: 10)
For each POI with a mapbox_id, call in parallel:
place_details_tool(mapbox_id, attribute_sets: ["visit"])
Returns: rating, price level, popularity, and opening hours per place.
isochrone_tool(
coordinates: {longitude, latitude},
profile: "mapbox/walking", // or "mapbox/driving", "mapbox/cycling", "mapbox/driving-traffic"
contours_minutes: [5, 10, 15]
)
Returns a polygon showing what's reachable within each time threshold.
static_map_image_tool(longitude, latitude, zoom: 14)
Returns a map image that can be included in the response for visual context.
Always structure grounded responses with explicit citations:
Place: [neighborhood, city from reverse_geocode]
Nearby [category]: [list from search/category tool, with names, ratings, prices, and distances]
Travel context: [X min walk / Y min drive from isochrone]
Sources: Mapbox Search, Mapbox Directions (live data)
Example grounded response:
> SoMa, San Francisco, CA (live Mapbox data)
>
> Restaurants within walking distance:
>
> - Bix Restaurant $$ ★8.4 — 56 Gold St (180m)
> - The Bird $ ★7.9 — 115 New Montgomery St (320m)
> - Oren's Hummus $$ ★8.1 — 131 Townsend St (510m)
>
> Reachable by walking: 5 min, 10 min, 15 min
>
> _Sources: Mapbox Geocoding API, Mapbox Search API, Mapbox Place Details API, Mapbox Isochrone API, Mapbox Static Images API_
For questions about travel between two locations, use directions_tool. For questions about reachable area, use isochrone_tool. For comparing travel times across multiple locations, use matrix_tool.
> "How long does it take to drive from Pike Place Market to Capitol Hill?"
> "What's the fastest route from the hotel to the airport?"
directions_tool(
waypoints: [{longitude, latitude}, {longitude, latitude}],
profile: "mapbox/driving-traffic" // live traffic; or "mapbox/walking", "mapbox/cycling", "mapbox/driving"
)
Returns: duration (with live traffic), distance, turn-by-turn steps, and an encoded polyline for map rendering. Supports up to 25 waypoints for multi-stop routes.
> "What's reachable within a 10-minute walk?"
> "Show me what I can reach in 15 minutes by car from here"
isochrone_tool(
coordinates: {longitude, latitude},
profile: "mapbox/walking",
contours_minutes: [5, 10, 15]
)
Returns a polygon showing the area reachable within each time threshold. Combine with category_search_tool or ground_location_tool to answer "what restaurants are within a 10-minute walk?" — use the isochrone to define the boundary, then search within it.
> "Which of these three offices is closest to my location?"
> "What are travel times from this warehouse to each of our delivery zones?"
> "Compare commute times to multiple locations"
Use matrix_tool — do NOT call directions_tool separately for each pair. Matrix batches all pairs in a single API call.
matrix_tool(
sources: [{longitude, latitude}, ...],
destinations: [{longitude, latitude}, ...],
profile: "mapbox/driving-traffic"
)
Returns a matrix of durations and distances between every source/destination pair. Rank results by duration to find the nearest location. One matrix_tool call replaces N separate directions_tool calls.
For "find [category] within X minutes of [location]":
search_and_geocode_tool(address)isochrone_tool(coordinates, profile, contours_minutes)ground_location_tool(longitude, latitude, query: "category") — the isochronecontours tell the user what's within each time band
Or more directly: ground_location_tool returns both nearby POIs and isochrone reachability in one
call, which covers most proximity + routing use cases without additional composition.
> Pike Place Market → Capitol Hill, Seattle
>
> By car (with traffic): 12 min, 3.2 km via Pine St
> By walking: 28 min, 2.1 km
> By cycling: 14 min, 2.3 km
>
> _Source: Mapbox Directions API (live traffic)_
| | Training Data | Mapbox Grounding |
| ------------------ | ------------------- | --------------------------- |
| POI accuracy | Stale, hallucinated | Live, verified |
| Ratings/price | Often wrong | Live via Place Details |
| Business hours | Often wrong | Live via Place Details |
| Travel times | Estimated | Live traffic via Directions |
| Reachable area | Not available | Isochrone polygons |
| Multi-stop routing | Not available | Up to 25 waypoints |
| New places | Missing | Indexed |
| Map image | None | Inline static map |
| Citations | None | Tool + API source |
search_and_geocode_tool before running category search.directions_tool or isochrone_toolreverse_geocode_tool + category_search_tool + place_details_tool separately when ground_location_tool is availableTake mapbox/mapbox-location-grounding from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.