Skip to main content
Glama
GIS MCP Server
by mahdin75

GIS MCP Server

GIS-MCP is an open-source Model Context Protocol (MCP) server that connects AI assistants and Large Language Models (LLMs) with GIS and geospatial operations.

It enables AI agents to perform geospatial analysis, spatial data processing, vector and raster operations, coordinate transformations, spatial statistics, mapping, and other GIS workflows through MCP-compatible clients.

🌐 Official Documentation: https://gis-mcp.com

📦 PyPI: https://pypi.org/project/gis-mcp/

💻 Source Code: https://github.com/mahdin75/gis-mcp

92+ GIS tools across Shapely, GeoPandas, PyProj, Rasterio, PySAL, visualization, satellite imagery, climate, ecology, movement, and land-cover data.

MCP Toplist

Category

Badges

Package

PyPI version PyPI downloads Tests

Installation & Transport

Docker Installation Transport

Storage

Local Filesystem GCP Cloud Storage

Data Sources

Climate Biodiversity LandCover Movement Satellite Administrative

Agentic AI

LangChain Agent Example OpenAI Agent Example

Community

Discord YouTube DeepWiki

Current version is 0.15.0 (Beta):

We welcome contributions and developers to join us in building this project.

🎥 Demo

Related MCP server: GeoServer MCP Server

📋 Table of Contents

🚀 Features

GIS MCP Server empowers AI assistants with advanced geospatial intelligence. Key features include:

  • 🔹 Comprehensive Geometry Operations – Perform intersection, union, buffer, difference, and other geometric transformations with ease.

  • 🔹 Advanced Coordinate Transformations – Effortlessly reproject and transform geometries between coordinate reference systems.

  • 🔹 Accurate Measurements – Compute distances, areas, lengths, and centroids precisely.

  • 🔹 Spatial Analysis & Validation – Validate geometries, run proximity checks, and perform spatial overlays or joins.

  • 🔹 Raster & Vector Support – Process raster layers, compute indices like NDVI, clip, resample, and merge with vector data.

  • 🔹 Spatial Statistics & Modeling – Leverage PySAL for spatial autocorrelation, clustering, and neighborhood analysis.

  • 🔹 Easy Integration – Connect seamlessly with MCP-compatible clients like Claude Desktop or Cursor IDE.

  • 🔹 HTTP/SSE Transport – Run as HTTP service with RESTful storage endpoints for file upload/download operations.

  • 🔹 Flexible Storage – Local filesystem by default, or Google Cloud Storage when you want files in a GCS bucket.

  • 🔹 Flexible & Extensible – Supports Python-based GIS libraries and is ready for custom tools or workflow extensions.

🌟 Tip: With GIS MCP Server, your AI can now “think spatially,” unlocking new capabilities for environmental analysis, mapping, and location intelligence.


💾 Storage

GIS MCP Server supports two storage backends for file upload, download, and tool outputs:

Backend

When to use

Configure with

Local filesystem

Default; files on disk (including Docker volumes)

--storage-path or GIS_MCP_STORAGE_PATH

Google Cloud Storage (GCP)

When you want files in a GCS bucket

--storage-config / GIS_MCP_STORAGE_CONFIG or GIS_MCP_STORAGE_PROVIDER=gcp

Install GCP support with:

pip install gis-mcp[gcp]

Full setup (paths, IAM, Docker, credentials): Storage Configuration.


📋 Prerequisites

  • Python 3.10 or higher

  • MCP-compatible client (like Claude Desktop or Cursor)

  • Internet connection for package installation

Vibe Coding

If you’re building agents via vibe coding, give the model these generated maps of GIS MCP:

Copies also live in the repository root (llms.txt, llms-full.txt). They are regenerated from the docs during the MkDocs build.

🛠 Installation

Choose the installation method that best suits your needs:

🐳 Docker Installation

GIS MCP Server can be run using Docker, which provides an isolated environment with all dependencies pre-installed.

Important: Both Dockerfile and Dockerfile.local have HTTP transport mode enabled by default. The server runs on port 9010 and is accessible at http://localhost:9010/mcp.

Using Dockerfile

The main Dockerfile installs the package from PyPI:

  1. Build the Docker image:

docker build -t gis-mcp .
  1. Run the container (HTTP mode is enabled by default):

docker run -p 9010:9010 gis-mcp

Using Dockerfile.local

The Dockerfile.local installs the package from local source files (useful for development or custom builds):

  1. Build the Docker image:

docker build -f Dockerfile.local -t gis-mcp:local .
  1. Run the container (HTTP mode is enabled by default):

docker run -p 9010:9010 gis-mcp:local

The server will be available at http://localhost:9010/mcp in HTTP transport mode.

For more details on Docker configuration and environment variables, see the Docker installation guide.

📦 pip Installation

The pip installation is recommended for most users:

  1. Install uv package manager:

pip install uv
  1. Create the Virtual Environment (Python 3.10+):

uv venv --python=3.10
  1. Activate the Virtual Environment:

On Windows (PowerShell):

.\.venv\Scripts\Activate.ps1

On Linux:

source .venv/bin/activate
  1. Install the package:

uv pip install gis-mcp

Install with Visualization Features

To install with visualization capabilities (Folium and PyDeck for interactive maps):

uv pip install gis-mcp[visualize]

This will install additional dependencies:

  • folium>=0.15.0 - For creating interactive web maps

  • pydeck>=0.9.0 - For advanced 3D visualizations

  1. Start the server:

gis-mcp

By default, the server runs in STDIO transport mode, which is ideal for local development and integration with Claude Desktop or Cursor IDE.

You can also run the server in HTTP transport mode for network deployments:

export GIS_MCP_TRANSPORT=http
export GIS_MCP_PORT=8080
gis-mcp

When running in HTTP or SSE transport mode, the following endpoints are available:

  • MCP endpoint: http://host:port/mcp (HTTP) or http://host:port/sse (SSE)

  • Storage endpoints:

    • POST /storage/upload - Upload files to server storage

    • GET /storage/download?path=<file> - Download files from server storage

    • GET /storage/list?path=<dir> - List files in server storage

For more details on transport modes and complete endpoint documentation, see:

pip Configuration

To use the pip installation with Claude or Cursor, add the following configuration:

Claude Desktop:

Windows:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "C:\\Users\\YourUsername\\.venv\\Scripts\\gis-mcp",
      "args": []
    }
  }
}

Linux/Mac:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "/home/YourUsername/.venv/bin/gis-mcp",
      "args": []
    }
  }
}

Cursor IDE (create .cursor/mcp.json):

Windows:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "C:\\Users\\YourUsername\\.venv\\Scripts\\gis-mcp",
      "args": []
    }
  }
}

Linux/Mac:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "/home/YourUsername/.venv/bin/gis-mcp",
      "args": []
    }
  }
}

After configuration:

  1. Make sure to replace YourUsername with your actual username

  2. For development installation, replace /path/to/gis-mcp with the actual path to your project

  3. Restart your IDE to apply the changes

  4. You can now use all GIS operations through Claude or Cursor!

🛠 Development Installation

For contributors and developers:

  1. Install uv package manager:

pip install uv
  1. Create the Virtual Environment:

uv venv --python=3.10
  1. Install the package in development mode:

uv pip install -e .
  1. Start the server:

python -m gis_mcp

Development Configuration

To use the development installation with Claude or Cursor, add the following configuration:

Claude Desktop:

Windows:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "C:\\path\\to\\gis-mcp\\.venv\\Scripts\\python",
      "args": ["-m", "gis_mcp"]
    }
  }
}

Linux/Mac:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "/path/to/gis-mcp/.venv/bin/python",
      "args": ["-m", "gis_mcp"]
    }
  }
}

Cursor IDE (create .cursor/mcp.json):

Windows:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "C:\\path\\to\\gis-mcp\\.venv\\Scripts\\python",
      "args": ["-m", "gis_mcp"]
    }
  }
}

Linux/Mac:

{
  "mcpServers": {
    "gis-mcp": {
      "command": "/path/to/gis-mcp/.venv/bin/python",
      "args": ["-m", "gis_mcp"]
    }
  }
}

After configuration:

  1. Make sure to replace YourUsername with your actual username

  2. For development installation, replace /path/to/gis-mcp with the actual path to your project

  3. Restart your IDE to apply the changes

  4. You can now use all GIS operations through Claude or Cursor!

🤖 Build Your First GIS AI Agent

Create agents that call real GIS MCP tools (not invented spatial math).

LangChain (Python) — park buffer proximity

Tutorial: Park buffer proximity agent

Sample: agents/Langchain/

LangGraph (Python) — stateful site coverage

Tutorial: Stateful site-coverage workflow

Sample: agents/LangGraph/

  • Explicit graph: interpret → plan → execute GIS MCP tools → validate → respond

  • Verify without an LLM: python agents/LangGraph/verify_graph.py

LangGraph (Python) — multi-agent setback

Tutorial: Multi-agent setback workflow

  • Planner / Analysis / Validation agents; only Analysis calls GIS MCP

  • Verify: python agents/LangGraph/verify_multi_agent.py

More agent docs

👉 Agent tutorials overview →

Minimal starters: templates/ (langchain-gis-agent, langgraph-gis-workflow, langgraph-multi-agent-gis)

Also available: OpenAI Agents SDK (Node.js)

📝 Medium article (LangChain intro) →

🎥 YouTube →

📚 Available Functions

This section provides a comprehensive list of all available functions organized by library.

🔷 Shapely Functions (29 total)

Basic Geometric Operations:

  • buffer - Create buffer around geometry

  • intersection - Find intersection of two geometries

  • union - Combine two geometries

  • difference - Find difference between geometries

  • symmetric_difference - Find symmetric difference

Geometric Properties:

  • convex_hull - Calculate convex hull

  • envelope - Get bounding box

  • minimum_rotated_rectangle - Get minimum rotated rectangle

  • get_centroid - Get centroid point

  • get_bounds - Get geometry bounds

  • get_coordinates - Extract coordinate array

  • get_geometry_type - Get geometry type name

Transformations:

  • rotate_geometry - Rotate geometry by angle

  • scale_geometry - Scale geometry by factors

  • translate_geometry - Move geometry by offset

Advanced Operations:

  • triangulate_geometry - Create triangulation

  • voronoi - Create Voronoi diagram

  • unary_union_geometries - Union multiple geometries

Measurements:

  • get_length - Calculate geometry length

  • get_area - Calculate geometry area

Validation & Utilities:

  • is_valid - Check geometry validity

  • make_valid - Fix invalid geometry

  • simplify - Simplify geometry

  • snap_geometry - Snap to reference geometry

  • nearest_point_on_geometry - Find nearest point

  • normalize_geometry - Normalize orientation

  • geometry_to_geojson - Convert to GeoJSON

  • geojson_to_geometry - Convert from GeoJSON

🔷 PyProj Functions (13 total)

Coordinate Transformations:

  • transform_coordinates - Transform point coordinates

  • project_geometry - Project geometry between CRS

CRS Information:

  • get_crs_info - Get detailed CRS information

  • get_available_crs - List available CRS systems

  • get_utm_zone - Get UTM zone for coordinates

  • get_utm_crs - Get UTM CRS for coordinates

  • get_geocentric_crs - Get geocentric CRS

Geodetic Calculations:

  • get_geod_info - Get ellipsoid information

  • calculate_geodetic_distance - Calculate distance on ellipsoid

  • calculate_geodetic_point - Calculate point at distance/azimuth

  • calculate_geodetic_area - Calculate area on ellipsoid

🔷 GeoPandas Functions (13 total)

I/O Operations:

  • read_file_gpd - Read geospatial file with preview

  • write_file_gpd - Export GeoDataFrame to file

Join & Merge Operations:

  • append_gpd - Concatenate GeoDataFrames vertically

  • merge_gpd - Database-style attribute joins

  • overlay_gpd - Spatial overlay operations

  • dissolve_gpd - Dissolve by attribute

  • explode_gpd - Split multi-part geometries

Spatial Operations:

  • clip_vector - Clip geometries

  • sjoin_gpd - Spatial joins

  • sjoin_nearest_gpd - Nearest neighbor spatial joins

  • point_in_polygon - Point-in-polygon tests

🔷 Rasterio Functions (20 total)

Basic Raster Operations:

  • metadata_raster - Get raster metadata

  • get_raster_crs - Get raster CRS

  • extract_band - Extract single band

  • raster_band_statistics - Calculate band statistics

  • raster_histogram - Compute pixel histograms

Raster Processing:

  • clip_raster_with_shapefile - Clip raster with polygons

  • resample_raster - Resample by scale factor

  • reproject_raster - Reproject to new CRS

  • tile_raster - Split into tiles

Raster Analysis:

  • compute_ndvi - Calculate vegetation index

  • raster_algebra - Mathematical operations on bands

  • concat_bands - Combine single-band rasters

  • weighted_band_sum - Weighted band combination

Advanced Analysis:

  • zonal_statistics - Statistics within polygons

  • reclassify_raster - Reclassify pixel values

  • focal_statistics - Moving window statistics

  • hillshade - Generate hillshade from DEM

  • write_raster - Write array to raster file

🔷 PySAL Functions (18 total)

Spatial Autocorrelation:

  • morans_i - Global Moran's I statistic

  • gearys_c - Global Geary's C statistic

  • gamma_statistic - Gamma index

  • getis_ord_g - Global Getis-Ord G statistic

Local Statistics:

  • moran_local - Local Moran's I

  • getis_ord_g_local - Local Getis-Ord G*

  • join_counts_local - Local join counts

Global Statistics:

  • join_counts - Binary join counts test

  • adbscan - Adaptive density-based clustering

Spatial Weights:

  • weights_from_shapefile - Create weights from shapefile

  • distance_band_weights - Distance-based weights

  • knn_weights - K-nearest neighbors weights

  • build_transform_and_save_weights - Build, transform, and save weights

  • ols_with_spatial_diagnostics_safe - OLS regression with spatial diagnostics

  • build_and_transform_weights - Build and transform weights

Spatial-Temporal Analysis:

  • spatial_markov - Spatial Markov analysis for panel data

  • dynamic_lisa - Dynamic LISA (directional LISA) analysis

Spatial Regression:

  • gm_lag - GM_Lag spatial 2SLS/GMM-IV spatial lag model

🔷 Visualization Functions (2 total)

Static Map Visualization (Matplotlib/GeoPandas):

  • create_map – Generate high-quality static maps (PNG, PDF, JPG) from multiple geospatial data sources including shapefiles, rasters, WKT geometries, and coordinate arrays. Supports multiple layers with individual styling options, legends, titles, and grid overlays.

Interactive Web Map Visualization (Folium):

  • create_web_map – Generate interactive HTML maps using Folium with layer controls, legends, scale bars, dynamic titles, tooltips, and minimap. Supports multiple basemap options and responsive design for web browsers.

🔷 Administrative Boundaries Functions (1 total)

Boundary Download:

  • download_boundaries - Download GADM administrative boundaries and save as GeoJSON

🔷 Climate Data Functions (1 total)

Climate Data Download:

  • download_climate_data - Download climate data (ERA5 or other CDS datasets)

🔷 Ecology Data Functions (2 total)

Ecology Data Download and Info:

  • get_species_info – Retrieve taxonomic information for a given species name

  • download_species_occurrences – Download occurrence records for a given species and save as JSON

🔷 Movement Data Functions (2 total)

Movement Data Download and Routing (via OSMnx):

  • download_street_network – Download a street network for a given place and save as GraphML

  • calculate_shortest_path – Calculate the shortest path between two points using a saved street network

🔷 Land Cover Data Functions (2 total)

Land Cover from Planetary Computer:

  • download_worldcover – Download ESA WorldCover for AOI/year; optional crop and reprojection

  • compute_s2_ndvi – Compute NDVI from Sentinel-2 L2A; crop and reprojection supported

🔷 Satellite Imagery Functions (1 total)

STAC-based Satellite Download:

  • download_satellite_imagery – Download and stack bands from STAC items (e.g., Sentinel-2, Landsat), with optional crop and reprojection

Total Functions Available: 92

🛠 Client Development

Example usage of the tools:

Buffer Operation

Tool: buffer
Parameters: {
    "geometry": "POINT(0 0)",
    "distance": 10,
    "resolution": 16,
    "join_style": 1,
    "mitre_limit": 5.0,
    "single_sided": false
}

Coordinate Transformation

Tool: transform_coordinates
Parameters: {
    "coordinates": [0, 0],
    "source_crs": "EPSG:4326",
    "target_crs": "EPSG:3857"
}

Geodetic Distance

Tool: calculate_geodetic_distance
Parameters: {
    "point1": [0, 0],
    "point2": [10, 10],
    "ellps": "WGS84"
}

Static Map Creation

Tool: create_map
Parameters: {
    "layers": [
        {
            "data": "buildings.shp",
            "style": {"label": "Buildings", "color": "red", "alpha": 0.7}
        },
        {
            "data": "roads.shp",
            "style": {"label": "Roads", "color": "black", "linewidth": 1}
        }
    ],
    "filename": "city_analysis",
    "filetype": "png",
    "title": "City Infrastructure Analysis",
    "show_grid": true,
    "add_legend": true
}

Interactive Web Map Creation

Tool: create_web_map
Parameters: {
    "layers": [
        {
            "data": "buildings.shp",
            "style": {"label": "Buildings", "color": "red"}
        },
        {
            "data": "parks.geojson",
            "style": {"label": "Parks", "color": "green"}
        }
    ],
    "filename": "city_interactive.html",
    "title": "City Infrastructure Map",
    "basemap": "CartoDB positron",
    "show_grid": true,
    "add_legend": true,
    "add_minimap": true
}

🔮 Planned Features

  • Implement advanced spatial indexing

  • Implement network analysis capabilities

  • Add support for 3D geometries

  • Implement performance optimizations

  • Add support for more GIS libraries

🤝 Contributing

We welcome contributions! Here's how you can help:

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/AmazingFeature)

  3. Commit your changes (git commit -m 'Add some AmazingFeature')

  4. Push to the branch (git push origin feature/AmazingFeature)

  5. Open a Pull Request

Please ensure your PR description clearly describes the problem and solution. Include the relevant issue number if applicable.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

Project Name

Category

Description

Model Context Protocol

MCP Related

The core MCP Specification

FastMCP

MCP Related

The fast, Pythonic way to build MCP servers and clients

Shapely

Geospatial Analysis

Python package for manipulation and analysis of geometric objects

PyProj

Geospatial Analysis

Python interface to PROJ library

GeoPandas

Geospatial Analysis

Python package for working with geospatial data

Rasterio

Geospatial Analysis

Python package for reading and writing geospatial raster data

Fiona

Geospatial Analysis

Python interface to OGR library for reading and writing vector geospatial data formats

PySAL

Geospatial Analysis

Python spatial analysis library for geospatial data science

Folium

Visualization

Python library for creating interactive web maps using Leaflet.js

PyDeck

Visualization

Python library for creating advanced 3D visualizations and interactive maps

Matplotlib

Visualization

Python plotting library for creating static maps and visualizations

cdsapi

Geospatial Data Collecting

Python API to access the Copernicus Climate Data Store (CDS)

pygadm

Geospatial Data Collecting

Easy access to administrative boundary defined by GADM from Python scripts

pygbif

Geospatial Data Collecting

Python client for the GBIF API (ecology and biodiversity data)

OSMnx

Geospatial Data Collecting

Python package for downloading, modeling, and analyzing street networks and urban features from OpenStreetMap

pystac-client

Geospatial Data Collecting

Python client for STAC catalogs; search and access spatiotemporal assets

Planetary Computer SDK for Python

Geospatial Data Collecting

Python SDK for Microsoft Planetary Computer; auth and helpers for STAC/COGs

Server Name

Description

GeoServer MCP

A Model Context Protocol (MCP) server implementation that connects LLMs to the GeoServer REST API

📞 Support

For support, please open an issue in the GitHub repository.

💬 Community

Join our Discord community for discussions, updates, and support:

Join our Discord

👥 Contributors

Made with contrib.rocks.

🏆 Badges

PyPI version PyPI downloads

MCP Toplist

Trust Score

Available Tools

87 tools
adbscanB

Adaptive DBSCAN clustering (requires coordinates, no dependent_var).

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold, +2 more. Returns: object

append_gpdC

Reads two shapefiles directly, concatenates them vertically.

Inputs: shapefile1_path (required), shapefile2_path (required), output_path (required). Returns: object

bufferC

Create a buffer around a geometry.

Inputs: geometry (required), distance (required), resolution, join_style, +2 more. Returns: object

build_and_transform_weightsB

Build and transform spatial weights in one step.

Parameters:

  • data_path: Path to point shapefile or GeoPackage

  • method: 'queen', 'rook', 'distance_band', or 'knn'

  • id_field: Optional field name for IDs

  • threshold: Distance threshold (required if method='distance_band')

  • k: Number of neighbors (required if method='knn')

  • binary: True for binary weights, False for inverse distance (DistanceBand only)

  • transform_type: 'r', 'v', 'b', 'o', or 'd'

Inputs: data_path (required), method, id_field, threshold, +3 more. Returns: object

build_transform_and_save_weightsA

Pipeline: Read shapefile, build spatial weights, optionally transform, and save to file.

Parameters:

  • data_path: Path to point shapefile or GeoPackage

  • method: 'queen', 'rook', 'distance_band', 'knn'

  • id_field: Optional field name for IDs

  • threshold: Distance threshold (required if method='distance_band')

  • k: Number of neighbors (required if method='knn')

  • binary: True for binary weights, False for inverse distance (DistanceBand only)

  • transform_type: 'r', 'v', 'b', 'o', or 'd' (optional)

  • output_path: File path to save weights

  • format: 'gal' or 'gwt'

  • overwrite: Allow overwriting if file exists

Inputs: data_path (required), method, id_field, threshold, +6 more. Returns: object

calculate_geodetic_areaC

Calculate area of a polygon using geodetic calculations.

Inputs: geometry (required), ellps. Returns: object

calculate_geodetic_distanceC

Calculate geodetic distance between points.

Inputs: point1 (required), point2 (required), ellps. Returns: object

calculate_geodetic_pointC

Calculate point at given distance and azimuth.

Inputs: start_point (required), azimuth (required), distance (required), ellps. Returns: object

clip_raster_with_shapefileA

Clip a raster dataset using polygons from a shapefile and write the result. Converts the shapefile's CRS to match the raster's CRS if they are different.

Parameters:

  • raster_path_or_url: local path or HTTPS URL of the source raster.

  • shapefile_path: local filesystem path to a .shp file containing polygons.

  • destination: local path where the masked raster will be written.

Inputs: raster_path_or_url (required), shapefile_path (required), destination (required). Returns: object

clip_vectorC

Clip vector geometries using geopandas.clip. Args: gdf_path: Path to the input geospatial file. clip_path: Path to the clipping geometry file. output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: gdf_path (required), clip_path (required), output_path. Returns: object

compute_ndviB

Compute NDVI (Normalized Difference Vegetation Index) and save to GeoTIFF.

Parameters:

  • source: input raster path.

  • red_band_index: index of red band (1-based).

  • nir_band_index: index of near-infrared band (1-based).

  • destination: output NDVI raster path.

Inputs: source (required), red_band_index (required), nir_band_index (required), destination (required). Returns: object

concat_bandsA

Concatenate multiple single-band raster files into one multi-band raster, handling alignment issues automatically.

Parameters:

  • folder_path: Path to folder containing input raster files (e.g. GeoTIFFs).

  • destination: Path to output multi-band raster file.

Notes:

  • Files are read in sorted order by filename.

  • If rasters have mismatched CRS, resolution, or dimensions, they are aligned automatically.

Inputs: folder_path (required), destination (required). Returns: object

convex_hullC

Calculate convex hull of a geometry.

Inputs: geometry (required). Returns: object

differenceC

Find difference between geometries.

Inputs: geometry1 (required), geometry2 (required). Returns: object

dissolve_gpdB

Dissolve geometries by attribute using geopandas.dissolve. Args: gdf_path: Path to the geospatial file. by: Column to dissolve by (optional). output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: gdf_path (required), by, output_path. Returns: object

distance_band_weightsA

Create a distance-based spatial weights (W) object from point data.

  • data_path: path to point shapefile or GeoPackage

  • threshold: distance threshold for neighbors (in CRS units, e.g., meters)

  • binary: True for binary weights, False for inverse distance weights

  • id_field: optional attribute name to use as observation IDs

Inputs: data_path (required), threshold (required), binary, id_field. Returns: object

dynamic_lisaC

Run dynamic LISA (directional LISA) with giddy.directional.Rose.

Returns sector counts, angles, vector lengths, and (optionally) permutation p-values.

Inputs: shapefile_path (required), value_columns (required), target_crs, weights_method, +6 more. Returns: object

envelopeC

Get bounding box of a geometry.

Inputs: geometry (required). Returns: object

explode_gpdA

Split multi-part geometries into single parts using geopandas.explode. Args: gdf_path: Path to the geospatial file. output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: gdf_path (required), output_path. Returns: object

extract_bandA

Extract a specific band from a multi-band raster and save it as a single-band GeoTIFF.

Parameters:

  • source: path or URL of the input raster.

  • band_index: index of the band to extract (1-based).

  • destination: path to save the extracted band raster.

Inputs: source (required), band_index (required), destination (required). Returns: object

focal_statisticsB

Compute focal (moving window) statistics on a raster. Args: raster_path: Path to the input raster. statistic: Statistic to compute ('mean', 'min', 'max', 'std'). size: Window size (odd integer). output_path: Optional path to save the result. Returns: Dictionary with status, message, and output path if saved.

Inputs: raster_path (required), statistic (required), size, output_path. Returns: object

gamma_statisticC

Compute Gamma Statistic for spatial autocorrelation.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

gearys_cC

Compute Global Geary's C Autocorrelation Statistic.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

geojson_to_geometryB

Convert GeoJSON to a Shapely geometry using shapely.geometry.shape. Args: geojson: GeoJSON dictionary. Returns: Dictionary with status, message, and geometry as WKT.

Inputs: geojson (required). Returns: object

geometry_to_geojsonA

Convert a Shapely geometry (WKT) to GeoJSON using shapely.geometry.mapping. Args: geometry: WKT string of the geometry. Returns: Dictionary with status, message, and GeoJSON representation.

Inputs: geometry (required). Returns: object

get_areaC

Get the area of a geometry.

Inputs: geometry (required). Returns: object

get_available_crsB

Get list of available CRS.

Inputs: no named parameters. Returns: object

get_boundsC

Get the bounds of a geometry.

Inputs: geometry (required). Returns: object

get_centroidB

Get the centroid of a geometry.

Inputs: geometry (required). Returns: object

get_coordinatesC

Get the coordinates of a geometry.

Inputs: geometry (required). Returns: object

get_crs_infoC

Get information about a CRS.

Inputs: crs (required). Returns: object

get_geocentric_crsC

Get geocentric CRS for given coordinates.

Inputs: coordinates (required). Returns: object

get_geod_infoD

Get information about a geodetic calculation.

Inputs: ellps, a, b, f. Returns: object

get_geometry_typeC

Get the type of a geometry.

Inputs: geometry (required). Returns: object

getis_ord_gC

Compute Getis-Ord G for global hot spot analysis.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

getis_ord_g_localC

Local Getis-Ord G.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

get_lengthC

Get the length of a geometry.

Inputs: geometry (required). Returns: object

get_raster_crsA

Retrieve the Coordinate Reference System (CRS) of a raster dataset.

Opens the raster (local path or HTTPS URL), reads its DatasetReader.crs attribute as a PROJ.4-style dict, and also returns the WKT representation.

Inputs: path_or_url (required). Returns: object

get_utm_crsC

Get UTM CRS for given coordinates.

Inputs: coordinates (required). Returns: object

get_utm_zoneC

Get UTM zone for given coordinates.

Inputs: coordinates (required). Returns: object

gm_lagC

Run spreg.GM_Lag (spatial 2SLS / GMM-IV spatial lag model) on a cross-section.

Returns coefficients with SE/z/p, fit metrics, (optional) AK test, and a small data preview.

Inputs: shapefile_path (required), y_col (required), x_cols (required), target_crs, +11 more. Returns: object

hillshadeA

Generate hillshade from a DEM raster. Args: raster_path: Path to the DEM raster. azimuth: Sun azimuth angle in degrees. angle_altitude: Sun altitude angle in degrees. output_path: Optional path to save the hillshade raster. Returns: Dictionary with status, message, and output path if saved.

Inputs: raster_path (required), azimuth, angle_altitude, output_path. Returns: object

intersectionC

Find intersection of two geometries.

Inputs: geometry1 (required), geometry2 (required). Returns: object

is_validC

Check if a geometry is valid.

Inputs: geometry (required). Returns: object

join_countsD

Global Binary Join Counts.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

join_counts_localD

Local Join Counts.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

knn_weightsB

Create a k-nearest neighbors spatial weights (W) object from point data.

  • data_path: path to point shapefile or GeoPackage

  • k: number of nearest neighbors

  • id_field: optional attribute name to use as observation IDs

Inputs: data_path (required), k (required), id_field. Returns: object

make_validC

Make a geometry valid.

Inputs: geometry (required). Returns: object

merge_gpdB

Merges two shapefiles based on common attribute columns, This function performs a database-style join, not a spatial join. Args: left_shapefile_path: Path to the left shapefile. The geometry from this file is preserved. right_shapefile_path: Path to the right shapefile to merge. output_path: Path to save the merged output shapefile. how: Type of merge. One of 'left', 'right', 'outer', 'inner'. Defaults to 'inner'. on: Column name to join on. Must be found in both shapefiles. left_on: Column name to join on in the left shapefile. right_on: Column name to join on in the right shapefile. suffixes: Suffix to apply to overlapping column names.

Inputs: shapefile1_path (required), shapefile2_path (required), output_path (required). Returns: object

metadata_rasterA

Open a raster dataset in read-only mode and return metadata.

This tool supports two modes based on the provided string:

  1. A local filesystem path (e.g., "D:\Data\my_raster.tif").

  2. An HTTPS URL (e.g., "https://example.com/my_raster.tif").

The input must be a single string that is either a valid file path on the local machine or a valid HTTPS URL pointing to a raster.

Inputs: path_or_url (required). Returns: object

minimum_rotated_rectangleC

Get minimum rotated rectangle of a geometry.

Inputs: geometry (required). Returns: object

moran_localD

Local Moran's I.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

morans_iC

Compute Moran's I Global Autocorrelation Statistic.

Inputs: shapefile_path (required), dependent_var, target_crs, distance_threshold. Returns: object

nearest_point_on_geometryB

Find the nearest point on geometry2 to geometry1 using shapely.ops.nearest_points. Args: geometry1: WKT string of the first geometry (e.g., a point). geometry2: WKT string of the second geometry. Returns: Dictionary with status, message, and the nearest point as WKT.

Inputs: geometry1 (required), geometry2 (required). Returns: object

normalize_geometryA

Normalize the orientation/order of a geometry using shapely.normalize. Args: geometry: WKT string of the geometry. Returns: Dictionary with status, message, and normalized geometry as WKT.

Inputs: geometry (required). Returns: object

ols_with_spatial_diagnostics_safeB

Safe MCP pipeline: Read shapefile, build/load W, convert numeric, check NaNs, run OLS.

Parameters:

  • data_path: path to shapefile or GeoPackage

  • y_field: dependent variable column name

  • x_fields: list of independent variable column names

  • weights_path: optional path to existing weights file (.gal or .gwt)

  • weights_method: 'queen', 'rook', 'distance_band', or 'knn' (used if weights_path not provided)

  • id_field: optional attribute name to use as observation IDs

  • threshold: required if method='distance_band'

  • k: required if method='knn'

  • binary: True for binary weights (DistanceBand only)

Inputs: data_path (required), y_field (required), x_fields (required), weights_path, +5 more. Returns: object

overlay_gpdB

Overlay two GeoDataFrames using geopandas.overlay. Args: gdf1_path: Path to the first geospatial file. gdf2_path: Path to the second geospatial file. how: Overlay method ('intersection', 'union', 'identity', 'symmetric_difference', 'difference'). output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: gdf1_path (required), gdf2_path (required), how, output_path. Returns: object

point_in_polygonB

Check if points are inside polygons using spatial join (predicate='within'). Args: points_path: Path to the point geospatial file. polygons_path: Path to the polygon geospatial file. output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: points_path (required), polygons_path (required), output_path. Returns: object

project_geometryC

Project a geometry between CRS.

Inputs: geometry (required), source_crs (required), target_crs (required). Returns: object

raster_algebraA

Perform algebraic operations (addition or subtraction) on two raster bands, handling alignment issues automatically.

Parameters:

  • raster1: Path to the first raster (.tif).

  • raster2: Path to the second raster (.tif).

  • band_index: Index of the band to process (1-based index).

  • operation: Either "add" or "subtract" to specify the calculation.

  • destination: Path to save the result as a new raster.

The function aligns rasters if needed, applies the selected operation, and saves the result.

Inputs: raster1 (required), raster2 (required), band_index (required), operation (required), +1 more. Returns: object

raster_band_statisticsB

Calculate min, max, mean, and std for each band of a raster.

Parameters:

  • source: path to input raster (local or URL).

Inputs: source (required). Returns: object

raster_histogramB

Compute histogram of pixel values for each band.

Parameters:

  • source: path to input raster.

  • bins: number of histogram bins.

Inputs: source (required), bins. Returns: object

read_file_gpdB

Reads a geospatial file and returns stats and a data preview.

Inputs: file_path (required). Returns: object

reclassify_rasterA

Reclassify raster values using a mapping dictionary. Args: raster_path: Path to the input raster. reclass_map: Dictionary mapping old values to new values (e.g., {1: 10, 2: 20}). output_path: Path to save the reclassified raster. Returns: Dictionary with status and message.

Inputs: raster_path (required), reclass_map (required), output_path (required). Returns: object

reproject_rasterA

Reproject a raster dataset to a new CRS and save the result.

Parameters:

  • source: local path or HTTPS URL of the source raster.

  • target_crs: target CRS string (e.g., "EPSG:4326").

  • destination: local filesystem path for the reprojected raster.

  • resampling: resampling method: "nearest", "bilinear", "cubic", etc.

Inputs: source (required), target_crs (required), destination (required), resampling. Returns: object

resample_rasterA

Resample a raster dataset by a scale factor and save the result.

Parameters:

  • source: local path or HTTPS URL of the source raster.

  • scale_factor: multiplicative factor for width/height (e.g., 0.5 to halve resolution, 2.0 to double).

  • resampling: resampling method name: "nearest", "bilinear", "cubic", etc.

  • destination: local filesystem path for the resampled raster.

Inputs: source (required), scale_factor (required), resampling (required), destination (required). Returns: object

rotate_geometryC

Rotate a geometry.

Inputs: geometry (required), angle (required), origin, use_radians. Returns: object

save_resultsA

MCP Tool: Save any GIS-MCP result dict to files, only when the user requests.

Args: data: The dictionary returned by any GIS-MCP tool. filename: Base filename without extension. formats: List of formats to save (default = all). folder: Target folder (relative to configured storage directory, or absolute path).

Returns: Dict with 'saved_files' mapping format -> path.

Inputs: data (required), filename, formats, folder. Returns: object

scale_geometryC

Scale a geometry.

Inputs: geometry (required), xfact (required), yfact (required), origin. Returns: object

simplifyC

Simplify a geometry.

Inputs: geometry (required), tolerance (required), preserve_topology. Returns: object

sjoin_gpdB

Spatial join between two GeoDataFrames using geopandas.sjoin. Args: left_path: Path to the left geospatial file. right_path: Path to the right geospatial file. how: Type of join ('left', 'right', 'inner'). predicate: Spatial predicate ('intersects', 'within', 'contains', etc.). output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: left_path (required), right_path (required), how, predicate, +1 more. Returns: object

sjoin_nearest_gpdB

Nearest neighbor spatial join using geopandas.sjoin_nearest. Args: left_path: Path to the left geospatial file. right_path: Path to the right geospatial file. how: Type of join ('left', 'right'). max_distance: Optional maximum search distance. output_path: Optional path to save the result. Returns: Dictionary with status, message, and output info.

Inputs: left_path (required), right_path (required), how, max_distance, +1 more. Returns: object

snap_geometryC

Snap one geometry to another using shapely.ops.snap. Args: geometry1: WKT string of the geometry to be snapped. geometry2: WKT string of the reference geometry. tolerance: Distance tolerance for snapping. Returns: Dictionary with status, message, and snapped geometry as WKT.

Inputs: geometry1 (required), geometry2 (required), tolerance (required). Returns: object

spatial_markovB

Run giddy Spatial Markov on a panel (n regions x t periods) from a shapefile.

Inputs: shapefile_path (required), value_columns (required), target_crs, weights_method, +8 more. Returns: object

symmetric_differenceC

Find symmetric difference between geometries.

Inputs: geometry1 (required), geometry2 (required). Returns: object

tile_rasterC

Split a raster into square tiles of a given size and save them individually.

Parameters:

  • source: input raster path.

  • tile_size: size of each tile (e.g., 256 or 512).

  • destination_dir: directory to store the tiles.

Inputs: source (required), tile_size (required), destination_dir (required). Returns: object

transform_coordinatesC

Transform coordinates between CRS.

Inputs: coordinates (required), source_crs (required), target_crs (required). Returns: object

translate_geometryC

Translate a geometry.

Inputs: geometry (required), xoff (required), yoff (required), zoff. Returns: object

triangulate_geometryC

Create a triangulation of a geometry.

Inputs: geometry (required). Returns: object

unary_union_geometriesC

Create a union of multiple geometries.

Inputs: geometries (required). Returns: object

unionD

Combine two geometries.

Inputs: geometry1 (required), geometry2 (required). Returns: object

voronoiC

Create a Voronoi diagram from points.

Inputs: geometry (required). Returns: object

weighted_band_sumA

Compute a weighted sum of all bands in a raster using specified weights.

Parameters:

  • source: Path to the input multi-band raster file.

  • weights: List of weights (must match number of bands and sum to 1).

  • destination: Path to save the output single-band raster.

Inputs: source (required), weights (required), destination (required). Returns: object

weights_from_shapefileA

Create a spatial weights (W) from a shapefile using contiguity.

  • contiguity: 'queen' or 'rook' (default 'queen')

  • id_field: optional attribute name to use as observation IDs

Inputs: shapefile_path (required), contiguity, id_field. Returns: object

write_file_gpdA

Export a GeoDataFrame to a file (Shapefile, GeoJSON, GPKG, etc.). Args: gdf_path: Path to the input geospatial file. output_path: Path to save the exported file. driver: Optional OGR driver name (e.g., 'ESRI Shapefile', 'GeoJSON', 'GPKG'). Returns: Dictionary with status and message.

Inputs: gdf_path (required), output_path (required), driver. Returns: object

write_rasterA

Write a numpy array to a raster file using metadata from a reference raster. Args: array: 2D or 3D list (or numpy array) of raster values. reference_raster: Path to a raster whose metadata will be copied. output_path: Path to save the new raster. dtype: Optional data type (e.g., 'float32', 'uint8'). Returns: Dictionary with status and message.

Inputs: array (required), reference_raster (required), output_path (required), dtype. Returns: object

zonal_statisticsB

Calculate statistics of raster values within polygons (zonal statistics). Args: raster_path: Path to the raster file. vector_path: Path to the vector file (polygons). stats: List of statistics to compute (e.g., ["mean", "min", "max", "std"]). Returns: Dictionary with status, message, and statistics per polygon.

Inputs: raster_path (required), vector_path (required), stats. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.3/5.0

    Scored across 87 tools

    Disambiguation2/5

    Many tools have overlapping functionality (e.g., union vs unary_union_geometries, merge_gpd vs append_gpd, build_transform_and_save_weights vs build_and_transform_weights, getis_ord_g vs getis_ord_g_local, morans_i vs moran_local). Some tools like 'read_file_gpd' vs 'write_file_gpd' are clearly opposite, but the presence of near-duplicates creates ambiguity.

    Naming Consistency2/5

    Naming is inconsistent: some tools use verb_noun (e.g., get_centroid, buffer, union), some include '_gpd' suffix (e.g., merge_gpd, sjoin_gpd), some are camelCase (e.g., morans_i, adbscan), and some are longer descriptive phrases (e.g., build_transform_and_save_weights). No clear pattern emerges across the entire set.

    Tool Count1/5

    With 87 tools, this far exceeds the typical well-scoped count (3-15). Even for a comprehensive GIS server, this is excessive, and many tools are near-duplicates or could be combined, leading to cognitive overload and increased risk of misselection.

    Completeness4/5

    The surface covers an extensive range of vector, raster, and spatial statistics operations, including CRUD-like file operations, geometry analysis, raster processing, and spatial autocorrelation. Minor gaps exist (e.g., no explicit raster classification or network analysis), but the domain is well-covered overall.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      A Model Context Protocol server that connects Claude AI to QGIS, enabling direct interaction with the GIS software for project creation, layer manipulation, code execution, and processing algorithms through natural language prompts.
      15
      10
      Creative Commons Zero v1.0 Universal
    • A
      license
      A
      quality
      D
      maintenance
      A Model Context Protocol server that connects Large Language Models to the GeoServer REST API, enabling AI assistants to query and manipulate geospatial data through natural language.
      9
      97
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A geographic ontology layer MCP server that exposes hierarchical relations, topological adjacency, toponym disambiguation, spatial operations, and geo-constraint verification, enabling LLMs to reason with geographic structures instead of raw SQL.
      -