Skip to main content

GeoEDGE-MCP

Category Badges
Package PyPI version PyPI downloads Tests
Installation & Transport Docker Installation Transport Storage
Data Sources Climate Biodiversity LandCover Movement Satellite Administrative
Agentic AI LangChain Agent Example OpenAI Agent Example
Community Discord YouTube DeepWiki

✨ Want to perform accurate geospatial analysis in your chatbot? ✨

Install GeoEDGE-MCP and transform your AI's spatial capabilities!


GeoEDGE-MCP Logo

A Model Context Protocol (MCP) server implementation that connects Large Language Models (LLMs) to GIS operations using GIS libraries, enabling AI assistants to perform geospatial operations and transformations.

🌐 Website: gis-mcp.com

Current version is 0.15.0 (Beta):

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

🎥 Demo

GeoEDGE-MCP Demo

📋 Table of Contents

🚀 Features

GeoEDGE-MCP 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 & Extensible – Supports Python-based GIS libraries and is ready for custom tools or workflow extensions.

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


📋 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, use these context files in your editor so the LLM understands the GeoEDGE-MCP server:

  • llms.txt: summarized context for smaller windows.
  • llms-full.txt: full context when your model has a larger window.

🛠 Installation

Choose the installation method that best suits your needs:

🐳 Docker Installation

GeoEDGE-MCP 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 geoedge-mcp .
  1. Run the container (HTTP mode is enabled by default):
docker run -p 9010:9010 geoedge-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 geoedge-mcp:local .
  1. Run the container (HTTP mode is enabled by default):
docker run -p 9010:9010 geoedge-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 geoedge-mcp

Install with Visualization Features

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

uv pip install geoedge-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:

Default output packaging

Spatial-analysis tools that write a result file (vector ops, raster ops, MCDA, topology checks) default to a zipped GeoPackage (vector) or zipped GeoTIFF (raster) whenever the caller omits output_path/ destination or gives one without a recognized extension. The zip bundles the data file plus a small metadata.json/metadata.txt (CRS, feature/band count, source tool, timestamp) — a single portable artifact instead of scattered Shapefile sidecars.

Passing an explicit, recognized extension (.shp, .geojson, .gpkg, .tif, ...) is always honored as-is with no zip wrapping. Set GIS_MCP_DISABLE_AUTO_ZIP=1 to disable the smart default server-wide and fall back to legacy raw-file behavior.

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

Ready to create your own AI agent that can perform geospatial operations? Our comprehensive tutorial will guide you from zero to hero!

What You'll Learn

  • ✅ How to set up the GeoEDGE-MCP server in HTTP mode
  • ✅ How to build a LangChain agent from scratch
  • ✅ How to connect your agent to GIS tools
  • ✅ How to use OpenRouter to access multiple AI models (DeepSeek, Gemini, GPT-4, Claude, etc.)
  • ✅ How to customize and extend your agent

Get Started

👉 Follow the complete tutorial →

📝 Read the Medium article →

🎥 Watch tutorials on YouTube →

The tutorial is beginner-friendly and requires no prior AI or GIS experience. You'll build a working agent that can:

  • Calculate distances between points
  • Transform coordinates between different systems
  • Create buffers around locations
  • Perform spatial analysis
  • And much more!

Perfect for: Developers, data scientists, GIS professionals, and anyone interested in building AI-powered geospatial applications.

📚 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 vector layers (shapefile/GeoJSON/WKT/GeoDataFrame) and raster layers (GeoTIFF, auto-reprojected to WGS84, single-band+colormap by default or explicit RGB via style={"bands": [r, g, b]}), plus a registered layer name (see register_layer) in place of a raw path. Multiple basemap options and responsive design for web browsers.

Visualize your results

After a spatial-analysis tool finishes, its response includes a visualize_hint field suggesting you ask whether the user wants to see the result on a map, then call create_web_map with the output path or layer_name from that same response — e.g.:

{"status": "success", "output_path": "...", "layer_name": "compute_ndvi_20260705_...", "visualize_hint": "Ask the user if they'd like to see this result on an interactive map..."}
create_web_map(layers=[{"data": "compute_ndvi_20260705_...", "style": {"cmap": "RdYlGn", "vmin": -1, "vmax": 1}}])

🔷 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.

🔗 Related Projects

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

🔗 Related MCP Servers

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

geoedge_mcp-0.17.0.tar.gz (255.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

geoedge_mcp-0.17.0-py3-none-any.whl (210.2 kB view details)

Uploaded Python 3

File details

Details for the file geoedge_mcp-0.17.0.tar.gz.

File metadata

  • Download URL: geoedge_mcp-0.17.0.tar.gz
  • Upload date:
  • Size: 255.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for geoedge_mcp-0.17.0.tar.gz
Algorithm Hash digest
SHA256 674a5ff765369b5ded64d80498ba70b4d7733f9b59790597c341b96d55759da5
MD5 86731a0db213e319f418f149526607f3
BLAKE2b-256 5f775ff90c12fdcf45143fd3116ce14480fe2a0fef5a42aa460d2289b732bf9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoedge_mcp-0.17.0.tar.gz:

Publisher: publish.yml on GeoEDGE-git/geoedge-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoedge_mcp-0.17.0-py3-none-any.whl.

File metadata

  • Download URL: geoedge_mcp-0.17.0-py3-none-any.whl
  • Upload date:
  • Size: 210.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for geoedge_mcp-0.17.0-py3-none-any.whl
Algorithm Hash digest
SHA256 da3a9427882034ba99a14478a0c59639a05c4489c358e9121e103b8c4a06b77f
MD5 51f332cc9198e9795db759846294c38d
BLAKE2b-256 b0ecfd1146a849796a5f3951236163713500a91adce71076536a9af3e94867ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoedge_mcp-0.17.0-py3-none-any.whl:

Publisher: publish.yml on GeoEDGE-git/geoedge-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

0.17.1

2 files

This release

0.17.0 This release

2 files

0.16.0

2 files

0.15.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page