A GIS configuration for Hermes

A GIS agent, configured.

Hermes for GIS is the documented setup behind Mercator, a working GIS agent on the open-source Hermes agent from Nous Research. Esri and open-data tools, a local PostGIS and QGIS stack, and a library of GIS skills you pull from GitHub into your own Hermes profile.

$ git clone github.com/daraobeirnecode/hermes-gis-skills

hermes agent · GIS toolset enabled · learning loop on

› which zoning district covers 1234 J Street?

  <think> spatial lookup → query the zoning Feature Layer </think>

  <tool_call>
  {"name": "esri.query_features",
   "arguments": {"layer": "Zoning/2",
                 "where": "intersects('1234 J Street')"}}
  </tool_call>

  ← 1 feature · ZONE_CODE = C-3

  1234 J Street is in Zoning District C-3 (Central Business
  District). Mixed-use residential/commercial is permitted up
  to 65 feet. Full district text at /docs/zoning/c-3.

› what open datasets cover that parcel?

  <tool_call>
  {"name": "open_data.search",
   "arguments": {"bbox": "-121.50,38.57,-121.49,38.58",
                 "keywords": "parcels zoning land use"}}
  </tool_call>

  ← 3 datasets · county open data portal

  The parcel appears in 3 published open datasets: parcels,
  zoning, and general plan land use, all from the county open
  data portal.
hermes

A configured Hermes profile

Mercator runs on Nous Research's open-source Hermes agent with 16 toolsets, MCP servers for Esri, Census, and open data, plus persistent memory and session search.

$ hermes tools
 terminal  file  browser  web  vision
  skills  memory  session_search  todo
  delegation  cronjob  computer_use

A real local GIS stack

The agent drives the tools you already run: PostGIS, QGIS, GDAL, DuckDB, Tippecanoe, and a Python geo environment with GeoPandas, Shapely, Rasterio, and pyproj.

postgis   PostgreSQL 18.4 · PostGIS 3.6.3
qgis      4.0.3
gdal      ogr2ogr · gdalinfo
duckdb    spatial · tippecanoe

Skills you pull from GitHub

A library of GIS skills, versioned as agentskills.io markdown. Clone the repo into your Hermes skills directory and the agent loads them on the next run.

$ git clone \
    github.com/daraobeirnecode/hermes-gis-skills \
    ~/.hermes/skills/gis
added 21 GIS skills

What is configured

The GIS parts, wired into an agent that already ships.

hermes agentemits <tool_call>gis toolsetroutes the callesriFeature Layersopen-datapublic portalspostgisyour DB

An Esri and open-data toolset

The Esri MCP exposes portal search, layer inspection, feature queries, and geocoding. An open-data tool covers public portals such as ArcGIS Hub, Socrata, and data.gov. Census enrichment sits alongside them.

~/.hermes/skills/gis/
arcgis-rest-service-validator   geospatial-data-qa-pipeline
arcgis-rest-to-product-app      open-source-gis-stack-builder
esri-experience-builder         spatial-ai-operations-console
feature-style-cookbook          static-vector-tile-product-app
maplibre-from-stac              ... and 12 more

GIS skills, pulled from GitHub

The library is 21 agentskills.io skills covering service validation, app scaffolds, cartography, QA pipelines, and spatial AI. They are plain markdown in your repo, cloned into the Hermes skills directory and versioned like any other code.

tool schema
{
  "name": "esri.query_features",
  "arguments": {
    "layer": "Zoning/2",
    "where": "ZONING = 'C-3'",
    "out_fields": ["APN", "ADDRESS", "HEIGHT_LIMIT"]
  }
}

Real function calling

Hermes emits <tool_call> JSON in a single turn, no parsing hacks. Each GIS tool declares a typed schema, so the agent calls query_features with the right arguments and gets structured features back.

analysis/parcels_in_zone.sql
SELECT p.apn, p.address, z.zone_code
FROM   source.parcels p
JOIN   source.zoning z
  ON   ST_Intersects(p.geom, z.geom)
WHERE  z.zone_code = 'C-3'
LIMIT  500;

PostGIS as the truth engine

A local gis_lab database holds the source, staging, analysis, app_public, and audit schemas. Read-only spatial SQL answers the hard questions; derived layers are written back under provenance columns.

$ claude --model opus --fallback-model sonnet
$ git push origin main
$ vercel deploy --prod

Build with Claude Code, ship to Vercel

The agent builds apps with Claude Code, verifies them with local commands and browser QA, then pushes to GitHub and deploys to Vercel. It checks its own output rather than trusting a self-report.

Built on your stack

Made for the way GIS teams already work.

The configuration does not ask you to migrate anything. The tools query the Feature Layers you already publish, respect your ArcGIS authentication, and read from the databases you already run. Yes, it works with your existing shapefiles.

gis-lab/.venv-esri (arcgis)
from arcgis.gis import GIS
gis = GIS("home")  # read-only, no plaintext secrets

item = gis.content.get("<item_id>")
layer = item.layers[0]
rows = layer.query(where="ZONING = 'C-3'",
                   out_fields="APN,ADDRESS,HEIGHT_LIMIT")
# returned to Hermes as structured tool output

The stack behind it

  • NOUS HERMES
  • ESRI
  • POSTGIS
  • QGIS
  • GDAL
  • DUCKDB
  • TIPPECANOE

Get started in 60 seconds

Install Hermes, pull the skills.

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
git clone github.com/daraobeirnecode/hermes-gis-skills ~/.hermes/skills/gis
hermes

The skills repo is not published yet. Once it is, this pulls all 21 skills into your Hermes profile.