Local MCP server exposing 100 ArcGIS Pro ArcPy geoprocessing tools via secure stdio JSON-RPC with worker isolation.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Arcgis MCP Bridge.
arcgis-mcp-bridge requires Windows, a licensed ArcGIS Pro installation, and
Python 3.11 or newer for the bridge package.
Install the bootstrap package using one package manager:
Then clone ArcGIS Pro's Python environment:
If the installed console command is available on PATH,
arcgis-mcp-setup is equivalent to py -m arcgis_mcp.setup_env.
Important for Windows systems with multiple Python installations: the setup is not complete until
arcgis-mcp-bridgeis installed into the reportedarcgis-mcp-env\python.exe. Use that same interpreter for both the MCP servercommandandARCPY_PYTHON_PATH. This prevents worker failures caused by packages or native extensions being loaded from another Python environment.
See 05 β Installation for the complete setup and configuration.
100 declarative geoprocessing tools. Two isolated processes. One security floor.
A secure, local-first, asynchronous MCP server exposing ArcGIS Pro's ArcPy engine to Claude Desktop and other MCP hosts over stdio JSON-RPC.
Technical write-up: Building a Secure MCP Bridge for ArcGIS Pro and ArcPy
| Catalog | 100 tools Β· 10 verticals |
| Tests | 86 unit tests Β· 86/86 passing Β· arcpy mocked |
| Real runtime evidence | Reproducible ArcGIS Pro MCP smoke benchmark |
| Static analysis | Ruff clean Β· Mypy strict clean |
| Transport | JSON-RPC 2.0 over stdio |
| License | Apache-2.0 |
| Feature | arcgis-mcp-bridge | geo2004/MCP-ArcGISPro | nicogis (C#/.NET) |
|---|---|---|---|
| Tools | 100 | ~15 | ~10 |
| Dependency Sync | Deterministic (uv.lock) | Imperative (requirements.txt) | Native NuGet |
| Transport | stdio JSON-RPC | file-based IPC | Named Pipes |
| Security Architecture | Documented PathGuard sandbox | None specified / default host access | None specified / default host access |
| arcpy Isolation | Two-process architecture | Single process execution | Add-In in-process execution |
| CI (Offline Verification) | β Supported | β Not available | β Not available |
| License | Apache-2.0 | MIT | MIT |
Hand-drawn parcel boundary β photo β geodatabase feature class. ORB+RANSAC image registration, HSV ink segmentation, direct GDB commit. No manual digitizing required.
Demo coming soon. To preview the sketch-to-GIS pipeline:
- Draw a polygon on paper and photograph it.
- Ask Claude: "Use extract_sketch_to_gis to register this photo against my basemap and commit the result to my GDB."
- The feature class appears in ArcGIS Pro β no manual digitizing.
After health_check succeeds, talk to Claude naturally:
Layer A β Async Event-Driven Server (arcgis_mcp/server.py).
FastMCP on the bridge interpreter. Owns the stdio channel, validates every
request against frozen Pydantic v2 contracts, dispatches work via
asyncio.create_subprocess_exec β the event loop never blocks on a
geoprocessing call and never holds a thread lock. Layer A contains zero
module-level arcpy or cv2 imports (verified by grep in the audit
gate); it cannot crash on Esri's native code because it never touches it.
Layer B β Subprocess ArcPy Isolation Worker (arcgis_mcp/worker.py).
Spawned per job on the licensed ArcGIS Pro interpreter
(ARCPY_PYTHON_PATH). The only place import arcpy is legal; cv2 loads
lazily inside the one vision tool that needs it. Worker stdout is rebound
to stderr at startup β the single sanctioned stdout write is the final
NDJSON result frame, so native ArcObjects chatter can never corrupt the
JSON-RPC channel. A native crash terminates the worker, not the server:
the parent converts a non-zero exit into a structured error frame.
Declarative registry (arcgis_mcp/registry.py).
Each tool is one ToolSpec(name, category, description, input_model, worker_fn, destructive). One generic proxy factory materializes all 100
catalog MCP endpoints in Layer A; one generic run_tool dispatcher serves
them in Layer B. The catalog is exposed alongside three core endpoints:
health_check, list_layers, and execute_spatial_tool. Adding catalog
tool #101 touches two files β never the runtime loops.
Every failure crossing the process boundary is classified:
validation Β· security Β· license Β· geoprocessing (with the full
arcpy.GetMessages() stack) Β· internal.
| # | Vertical | Tools | Key capabilities |
|---|---|---|---|
| 1 | map_layer_management | 10 | .aprx maps, layer order/visibility/symbology, camera, save |
| 2 | data_management | 22 | FC/GDB lifecycle, fields, Describe, Excel/GeoJSON/CSV exchange |
| 3 | geometry_analysis | 23 | Overlays, dissolve/merge, selections, joins, proximity, fishnet |
| 4 | coordinate_reference_projection | 4 | WKID-driven define/project for vector + raster, CRS lookup |
| 5 | raster_operations | 15 | Map algebra, zonal stats, DEM slope/aspect/hillshade, hydrology |
| 6 | vision_analytics | 1 | Sketch-to-GIS: ORB+RANSAC registration β HSV ink β GDB commit |
| 7 | export_layout | 9 | PDF/PNG plots, DPI control, map frames, text/legend, page size |
| 8 | editing_topology | 7 | Repair/check geometry, append, dedupe, diff, topology validation |
| 9 | network_analysis | 4 | Service areas, routing, OD cost matrix, closest facility |
| 10 | spatial_statistics | 5 | Mean center, ellipse, kernel density, Gi* hot spots, Moran's I |
| Total | 100 |
Esri extension licenses (Spatial, Network) are managed through one shared
context manager and checked back in via finally on normal Python exception
paths. Worker-process isolation contains native failures to the current job,
while unavailable licenses return a structured error frame instead of
terminating the MCP server.
Ten state-mutating tools refuse to run without an explicit
confirm: true payload token. The gate fires in the dispatcher before
the 10β30 s arcpy import is paid, and the registry refuses to even
register a destructive spec whose contract lacks a confirm field:
calculate_field carries an additional expression-channel floor: the
default expression_type is ARCADE (Esri's sandboxed expression
language), and PYTHON3 β which executes code inside the worker β is
rejected at the Layer-A contract boundary unless confirm: true is
explicitly supplied. raster_calculator expressions are constrained to a
pure map-algebra grammar (identifiers, numbers, operators; no quotes, no
dunder access) by a contract validator.
Licensed-runtime evidence is reported separately in the
benchmarks/ method card. Its committed result uses a real
ArcGIS Pro worker and a dedicated scratch GDB; it is not pooled with the mocked
unit-test count or presented as validation of all 100 geoprocessing tools.
Scope, stated plainly: the automated gate currently consists of
86 unit tests spanning the PathGuard boundary, the Pydantic contracts,
the generic registry path-guard and registration invariants, the worker's
error-boundary mapping, and Settings environment validation. It exercises
the catalog's structural contracts and every security-critical seam β it does
not claim multi-scenario validation of the 100 geoprocessing tools themselves,
which execute against a licensed ArcGIS runtime that no CI runner has.
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/muend-arcgis-mcp-bridge)<a href="https://allmcps.com/mcp/muend-arcgis-mcp-bridge"><img src="https://allmcps.com/api/badge/muend-arcgis-mcp-bridge?style=directory" alt="Arcgis MCP Bridge on AllMCPs" /></a>