maps.guru
Mcp

GIS Integration

Use maps.guru map styles and datasets with QGIS, ArcGIS, and MapLibre through MCP.

Most of the MCP tools return data in formats GIS tools already speak — QGIS connection URIs, MapLibre style JSON, and GeoJSON — so you can load results directly without a conversion step.

QGIS integration

Two MCP servers working together

The workflow that unlocks the most value uses two MCP servers in the same conversation:

  1. maps.guru MCP — provides the map data (tiles, styles, datasets)
  2. QGIS MCP — controls QGIS itself (add layers, set styles, export)

Your AI assistant calls both and coordinates the handoff.

Adding Tile Layers

You: "Add my city-streets map from maps.guru to QGIS"

AI Assistant:
  1. Calls maps_guru.get_tile_url({ style_slug: "city-streets" })
     → Returns QGIS-ready URI

  2. Calls qgis.add_raster_layer({
       path: "type=xyz&url=https://tiles.maps.guru/v1/...&zmax=14",
       provider: "wms"
     })
     → QGIS loads the tile layer

Loading GeoJSON Datasets

You: "Load my earthquake dataset from maps.guru into QGIS"

AI Assistant:
  1. Calls maps_guru.list_datasets({ style_id: "..." })
     → Finds earthquake dataset

  2. Calls maps_guru.get_dataset_geojson({ dataset_id: "abc123" })
     → Returns GeoJSON URL

  3. Calls qgis.add_vector_layer({
       path: "https://maps.guru/api/v1/datasets/abc123/geojson?key=mapx_xxx",
       provider: "ogr"
     })
     → QGIS loads the vector layer with all features

Manual QGIS setup (without a QGIS MCP)

If you don't have the QGIS MCP connected, you can still wire up tiles manually — the assistant just has to hand you the connection URI:

  1. Ask: "Get the tile URL for my city-streets style"
  2. Copy the qgis_uri value from the response
  3. In QGIS: Layer → Add Layer → Add XYZ Tiles
  4. Paste the URI string and click Add

The qgis_uri format looks like:

type=xyz&url=https://tiles.maps.guru/v1/planet-vector/{z}/{x}/{y}.pbf?key=mapx_xxx&zmax=14&zmin=0

MapLibre integration

Style JSON

get_style_json returns a complete MapLibre GL style spec, with all tile, sprite, and glyph URLs already signed with your API key:

You: "Export my maps.guru style for use in MapLibre"

AI Assistant calls maps_guru.get_style_json({ style_id: "..." })
→ Returns full style.json

You get the full style — sources (with ?key= appended), sprites, glyphs, layers, and paint properties — ready to drop into MapLibre GL JS:

const map = new maplibregl.Map({
  container: 'map',
  style: styleJson, // from the MCP response
  center: [2.3522, 48.8566],
  zoom: 12
});

Static map images

get_static_map generates PNGs you can embed in reports, briefs, or chat messages without standing up a map client:

You: "Generate a 1200x800 map of downtown San Francisco at zoom 14"

AI Assistant calls maps_guru.get_static_map({
  style_slug: "city-streets",
  lat: 37.7749,
  lng: -122.4194,
  zoom: 14,
  width: 1200,
  height: 800
})
→ Returns image URL + inline base64

The response carries both a public URL (for links) and inline base64 (so the image renders directly in the chat).


ArcGIS integration

XYZ tiles

Both ArcGIS Pro and ArcGIS Online can consume XYZ tile layers:

  1. Ask the assistant for the tile URL via get_tile_url
  2. In ArcGIS Pro: Insert → New Map → Add Data → Data From Path
  3. Paste: https://tiles.maps.guru/v1/planet-vector/{z}/{x}/{y}.pbf?key=mapx_xxx

GeoJSON

ArcGIS loads GeoJSON directly:

  1. Export via get_dataset_geojson
  2. Save the response to a file
  3. In ArcGIS: Add Data → Browse and pick the file

Workflow examples

Urban planning analysis

1. "Create a light map style called 'Urban Analysis'"
2. "Get the QGIS tile URL for 'urban-analysis'"
3. "Load my zoning-districts dataset into QGIS"
4. "Generate a static overview map at zoom 11"

Field data collection

1. "What datasets do I have on my field-survey style?"
2. "Export the sampling-points dataset as GeoJSON"
3. "Reverse geocode 34.0522, -118.2437"

Report generation

1. "Generate static maps for Paris, London, and Tokyo"
2. "What's my remaining quota for this month?"
Copyright © 2026