GIS Toolkit MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GIS Toolkit MCPBuffer cities.geojson by 500 meters into cities_buffered.geojson"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GIS Toolkit MCP
A standalone Model Context Protocol server exposing common file-level GIS operations — buffer, clip, reproject, overlay, spatial join, zonal statistics, nearest neighbor, dissolve, centroid, length/area fields. Built with FastMCP.
This package has no dependency on any other project. Any MCP client can use it as long as it can reach the server over HTTP and share a filesystem with it (see "Data access" below).
Why file-level, not geometry-level
Most GIS MCP servers expose single-geometry operations (e.g. buffer(geometry: str, distance)).
That's the wrong granularity for "process this whole dataset" tasks — buffering a 1,000-feature
shapefile that way means 1,000 separate tool calls. Every tool here instead takes a file path in,
a file path out, and processes the whole dataset in one call.
Related MCP server: Eddie MCP Server
Tools
Tool | What it does |
| Buffer every feature by a distance in meters (auto-projects geographic CRS) |
| Clip a vector or raster file to a vector mask's boundary |
| Reproject a vector or raster file to a target CRS |
| Union / intersection / difference / symmetric_difference of two vector files |
| Spatial join two vector files by a predicate (intersects, contains, ...) |
| Merge features sharing the same value in a field |
| Replace geometries with their centroids, keeping attributes |
| Per-zone raster statistic (min/max/mean/sum/std/count/median) as a new field |
| k-nearest-neighbor distance + index from one file to another |
| Add a length (lines) or area (polygons) field, computed in meters |
| Keep only features where a field compares true against a value (==, !=, >, <, contains); supports string-encoded dict fields like OSM |
| Save base64-encoded content into the server's data directory, for clients with no shared filesystem access |
| Read back a file's content as base64, e.g. to retrieve another tool's output |
Running it
pip install -r requirements.txt
python3 server.pyOr via Docker:
docker build -t gis-toolkit-mcp .
docker run -p 9020:9020 -v /path/to/your/data:/data -e GIS_TOOLKIT_DATA_DIR=/data gis-toolkit-mcpThe server listens on http://0.0.0.0:9020/mcp by default (Streamable HTTP transport).
Configuration
Env var | Default | Meaning |
| current working directory | Base directory relative tool paths are resolved against. Absolute paths pass through unchanged. |
|
|
|
|
| Port for HTTP-based transports |
Data access
Every tool takes plain file paths (input and output) and reads/writes them directly. If your
client shares a filesystem with the server (e.g. a shared Docker volume, or both running on the
same host), just mount your data directory and point GIS_TOOLKIT_DATA_DIR (or pass absolute
paths) accordingly — no code changes needed.
If your client does not share a filesystem with the server (e.g. a remote user calling a publicly hosted instance from their own machine), there are two ways to get data in and out:
MCP tools:
upload_filetakes base64 content and returns a path to use as another tool'sinput_path;download_filereads a path back out as base64. Good for an MCP client or an LLM driving the tools programmatically.Plain HTTP (for a human, or a chat UI's browser — base64 in a chat message is unwieldy):
GET /uploadserves a small HTML form to pick and submit a file directly;GET /files/<path>streams a file back withContent-Disposition: attachment, so pasting that URL as a link gives a real, clickable download in any browser.
Both paths are restricted to GIS_TOOLKIT_DATA_DIR — they refuse to read/write outside it. Note
the base64 tools return one file at a time, so prefer single-file output formats (.geojson,
.gpkg) over multi-file ones (.shp + its sidecars) when a remote client needs to retrieve the
result.
Connecting a client
Any MCP client that supports Streamable HTTP can connect directly to http://<host>:9020/mcp.
For example, in a librechat.yaml:
mcpServers:
gis-toolkit:
type: streamable-http
url: http://<host>:9020/mcpThis server cannot be deployed
Maintenance
Related MCP Connectors
Query, join, profile, clean and convert CSV/JSON/Parquet with server-side DuckDB over MCP.
Hosted MCP tools for FFmpeg-style video and audio processing through FFMPEG API.
Query, browse, and automate OmegaAI workspaces from any MCP client. Streamable HTTP with OAuth 2.0.
Unified gateway exposing 150+ tools across all NexGenData MCP servers via one endpoint.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMachine-native GIS processing API for AI agents and developers. Convert, reproject, validate, repair, buffer, clip, dissolve, and tile vector geodata across 25 endpoints. Pay-per-use USDC on Solana Mainnet ($0.01/op). No accounts, no API keys. Remote MCP SSE.-
- FlicenseNot gradedqualityDmaintenanceContainerized MCP server with 15 geospatial data tools exposed via HTTP API for Intercom integration.-
- AlicenseNot gradedqualityCmaintenanceFree remote MCP server for GIS/ArcGIS Online automation — coordinate/EPSG conversion, GeoJSON validation and geometry operations, ArcGIS FeatureServer inspection (feature count/query, schema, health check), and Shapefile/KML/GPX/WKT format conversion. Works with public ArcGIS layers without a token;MIT
- FlicenseNot gradedqualityCmaintenanceConverts raster and vector geospatial data into H3-indexed Parquet files and serves them via a local MCP server with DuckDB SQL querying.-