GIS skill-pack for Hermes
Build GIS agents on Hermes.
A skill-pack and tool layer for the open-source Hermes agent from Nous Research. Esri Feature Layers, FEMA flood data, and PostGIS — wired into Hermes as tools and skills. Point it at the layers you already publish.
$ hermes gis init
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.feature_layer.query",
"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's the flood risk for that parcel?
<tool_call>
{"name": "fema.flood.assess",
"arguments": {"apn": "007-1420-118"}}
</tool_call>
← Zone X · minimal risk
The parcel is in FEMA Flood Zone X. Minimal flood risk;
no mandatory flood-insurance requirement.Built on the open Hermes agent
The runtime is Nous Research's MIT-licensed Hermes agent — skills, a learning loop, and a toolset system. The GIS pack is a plugin, not a fork.
$ hermes gis init
added gis toolset (esri, fema, postgis)
added 6 skills to ~/.hermes/skills/gisYour model, your endpoint
Hermes is model-agnostic. Run Hermes 4 on Nous Portal, route through OpenRouter, or point at your own vLLM server — no code changes.
$ hermes model
▸ Hermes-4-70B Nous Portal
Hermes-4-405B OpenRouter
Hermes-4-70B http://localhost:8000Your data stays put
The GIS tools query the Feature Layers and databases you already run. Nothing is copied to a vendor cloud; parcels stay in your PostGIS.
tools:
postgis:
url: $POSTGIS_URL # your database
esri:
token: $ARCGIS_TOKENWhat you get
The GIS parts, wired into an agent that already ships.
A GIS toolset for Hermes
Esri Feature Layers, FEMA flood data, and PostGIS arrive as a single Hermes toolset. Enable it once and the agent can query the layers you publish through its normal tool-calling.
# Zoning lookups
The zoning layer is Zoning/FeatureServer/2. The district
code field is ZONE_CODE; height limits are HEIGHT_LIMIT (ft).
Always cite the district code, and prefer the esri toolset
over raw SQL for anything address-based.Skills that speak GIS
The pack ships agentskills.io-compatible skills that teach Hermes your layers, field names, and conventions. They're plain markdown in ~/.hermes/skills/, versioned in your repo like any other code.
{
"name": "esri.feature_layer.query",
"arguments": {
"layer": "Zoning/2",
"where": "ZONING = 'C-3'",
"outFields": ["APN", "ADDRESS", "HEIGHT_LIMIT"]
}
}Real function calling
Hermes 4 emits <tool_call> JSON in a single turn — no parsing hacks. The GIS tools declare typed schemas, so the agent calls FeatureLayer.query with the right arguments and gets structured features back.
$ hermes skills
gis/zoning used 41× last edited by loop 2d ago
gis/parcels used 28× last edited by you 6d ago
gis/flood-risk used 12× agentskills.io v1Skills that improve with use
Hermes has a learning loop: it curates skills from experience and refines them across sessions. Correct it once on how your parcel schema works and it remembers — no retraining, no prompt archaeology.
# serve Hermes 4 locally, then point Hermes at it
$ vllm serve NousResearch/Hermes-4-70B
$ hermes config set model.base_url http://localhost:8000Run it where you run everything
The Hermes agent runs on a VPS, a GPU box, or serverless (Modal, Daytona). Point it at Hermes 4 on your own vLLM endpoint and nothing leaves your network — air-gapped GIS included.
Built on your stack
Made for the way GIS teams already work.
The GIS pack doesn't ask you to migrate anything. Its 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.
# the esri tool the agent calls under the hood
from hermes_gis import esri
parcels = esri.feature_layer.query(
url="https://services.arcgis.com/org/Parcels/FeatureServer/0",
where="ZONING = 'C-3'",
out_fields=["APN", "ADDRESS", "HEIGHT_LIMIT"],
)
# 412 features → returned to Hermes as structured tool outputThe stack behind it
- NOUS HERMES
- HERMES 4
- AGENTSKILLS.IO
- ESRI
- FEMA
- POSTGIS
Get started in 60 seconds
Three commands to a GIS agent.
Already running Hermes? hermes gis init adds the pack to your existing install.