Worcester GIS MCP
Provides tools to search, query, and analyze geospatial data from an ArcGIS Hub portal, including dataset discovery, schema inspection, attribute querying, geocoding, and spatial point-in-polygon lookups.
Click on "Install 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., "@Worcester GIS MCPhow many active building permits are there?"
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.
OpenContext
San Diego City GIS MCP — a City of San Diego fork of OpenContext (forked from the Worcester GIS fork). It serves the City's ArcGIS Server REST services directory (webmaps.sandiego.gov/arcgis/rest/services, ArcGIS Enterprise 11.5) through the built-in arcgis plugin.
It is a sibling to the San Diego regional (SANDAG/SanGIS) and Worcester servers: identical tool names and signatures, so it composes with them at the MCP client with zero new orchestration. The regional server covers county-wide layers; this one covers City-authored layers (MHPA, Base Zones, Community Plan Land Use, and ~700 more).
How discovery works (no Hub here)
webmaps.sandiego.gov is a bare services directory — there is no ArcGIS Hub / Open Data catalog in front of it, so the Hub-search discovery used by the Worcester fork does not apply. Instead:
scripts/crawl_catalog.pywalks the directory offline: folders → MapServer/FeatureServer services → each service's/layers?f=json, capturing layer id, name, geometry type, description, extent, andmaxRecordCount.The result is serialized to
plugins/arcgis/catalog.json— a versioned, diffable deploy artifact (~718 layers from 329 services at last crawl).The running server loads that manifest at startup — instant, no live crawl, no cold-start penalty.
search_datasetsdoes substring/fuzzy/acronym matching over it.Services that require an ArcGIS account (HTTP 401/403 or ArcGIS error codes 498/499) are skipped during the crawl and recorded in the manifest's
skippedlist — 15 folders on this host at last crawl (AMPGIS, GetItDone, TED, …).
To refresh the catalog: python scripts/crawl_catalog.py, review the diff, commit, redeploy.
Related MCP server: MCP Data Vermont
Dataset IDs
A dataset id is the layer's services-directory path:
{folder}/{service}/{MapServer|FeatureServer}/{layerId}Known-good public layers (all in the anonymous Planning/PLN_LongRangePlanning MapServer):
Layer | dataset_id | Notes |
Multi-Habitat Planning Area (MHPA) |
| Polygon. Key fields: |
Base Zones (official City zoning) |
| Polygon. Zone codes like |
Community Plan Land Use |
| Polygon |
These are curated as featured_datasets in config.yaml (aliases + notes boost search; edits take effect on deploy without re-crawling).
The WGS84 contract
The layers are authored in EPSG:2230 (NAD83 State Plane California Zone VI, US survey feet). Every query this server sends sets inSR=4326 and outSR=4326, so all tools take and return WGS84 lon/lat — same as the sibling servers. Without inSR, WGS84 coordinates would be interpreted as State Plane feet and silently return zero rows.
Pagination is metadata-driven: each layer's maxRecordCount comes from the catalog (it varies by layer), and query_data pages with resultOffset/resultRecordCount when needed.
Connect to the server
Add it as a custom connector in Claude (same steps on Claude.ai and Claude Desktop):
Settings → Connectors (or Customize → Connectors on claude.ai)
Add custom connector
Name it e.g.
San Diego City GISand paste the URL:https://sandiego-city-gis.codeforanchorage.org/mcp
Quick health check from a terminal:
curl -sS -X POST https://sandiego-city-gis.codeforanchorage.org/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"ping"}'
# → {"jsonrpc":"2.0","id":1,"result":{"status":"ok"}}Tools exposed
Tool | Purpose |
| Discover layers by keyword (e.g. "MHPA", "zoning"). Matches names, service/folder names, descriptions, acronyms. Optional |
| Fetch a layer's metadata: geometry type, record cap, extent, layer URL |
| List a layer's fields (name, type, alias, coded values), optionally filtered by |
| List the distinct values in a field (with optional |
| Query features (supports |
| Point-in-polygon: which polygon(s) contain a point — by |
| Convert a street address to |
| Facet counts of the catalog by |
Raw JSON-RPC example:
curl -sS -X POST https://sandiego-city-gis.codeforanchorage.org/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"arcgis__search_datasets",
"arguments":{"q":"MHPA","limit":5}}}'Verified end-to-end
The definition-of-done check is a WGS84 point-in-polygon on MHPA at the Tijuana River Valley (32.5539, -117.0846) — a point that returns null on the regional server's County MSCP_CN layer but sits inside a City MHPA preserve:
// arcgis__spatial_query_point
{
"item_id": "Planning/PLN_LongRangePlanning/MapServer/7",
"lon": -117.0846,
"lat": 32.5539,
"out_fields": "HABPRES,INHABPRES,SUBAREA,ACRES"
}returns the containing preserve polygon:
Record 1:
HABPRES: 100
INHABPRES: Yes
SUBAREA: 113
ACRES: 2734.79scripts/smoke_prod.py runs this plus 12 more checks (search resolution for "MHPA" and "zoning", schema, TOTAL MATCHING counts, geocode → zoning chain at City Hall) against any deployment:
python scripts/smoke_prod.py # production
python scripts/smoke_prod.py http://localhost:8000/mcp # localLocal development
uv sync # or: pip install -r requirements.txt
python scripts/crawl_catalog.py # (re)build plugins/arcgis/catalog.json
python scripts/local_server.py # serves http://localhost:8000/mcp
python -m pytest tests/ -q # testsSee CLAUDE.md and docs/ for architecture, deployment, and plugin development.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/codeforanchorage/sandiego-city-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server