Site-Screen MCP
by Graysonf12
README.md
# Site-Screen MCP Connector (Hutton server #5)
Soils · wetlands · environmental screen · seismic design values — the fifth custom MCP server in the Hutton SIR/AHJ connector family. Same architecture as the other four: **TypeScript / MCP SDK / streamable HTTP, deploy on Render, keyless public sources, no secrets.**
## Why this server exists (evidence basis, 2026-08-26 runs)
| Gap it closes | Evidence |
|---|---|
| **Hydrologic soil group / drainage class / water table "not desk-answerable through any keyless service"** (Portal Registry standing entry, 2026-08-26) | The gap existed because USDA **Soil Data Access is POST-only** and every existing connector is GET-only. `soils_at_parcel` speaks POST SQL to `SDMDataAccess.sc.egov.usda.gov/Tabular/post.rest` (keyless, JSON out, verified 2026-08-28). |
| **NWI wetlands logged "unreachable" 2026-08-19** | The service **moved hosts** — `www.fws.gov/wetlandsmapservice` 302-redirects to `fwspublicservices.wim.usgs.gov`, where layer 0 (Wetlands) answers queries (verified 2026-08-28). `wetlands_at_parcel` queries the new host directly. |
| **Quality Rule 6 screen hand-assembled from 3–4 raw sources per run** (Acworth: owner-name patterns + EMEF + UST Finder found a dry cleaner at 156 ft and open USTs at 193 ft that no parcel layer carried) | `env_screen_near` runs SEMS/NPL + RCRAInfo + Brownfields + UST facilities + LUST + any registered state layer in one call, with computed distances and the geocode-point caveat baked into the output. |
| **Seismic desk-answerable, wind not — repeatedly conflated risk** | `seismic_design_at_point` wraps the verified USGS designmaps service (asce7-22 / -16 / -10) and its output restates the wind boundary every time. |
**Deliberate scope limits** (same doctrine as the Territory server): no telecom (FCC's documented API needs an account token — not keyless; field stays on the Utilities Routine §2D path), no attempt on walled sources (subscription recorders, ASP.NET tax portals), and the PE-input boundary is unchanged — soils output is screening-grade and says so.
## Tools
| Tool | What it does |
|---|---|
| `screen_registry_list` | Sources + vintages + gaps + the canonical §0C owner-name pattern list |
| `soils_at_parcel` | SSURGO map units intersecting the parcel polygon: HSG, drainage class, hydric %, water-table min depth, flood/pond frequency, bedrock depth, ENG small-commercial rating, dominant component, survey-area currency date |
| `sda_raw_sql` | SELECT-only escape hatch into SDA (mapunit/muaggatt/component/chorizon/sacatalog + SDA_* spatial helpers) |
| `wetlands_at_parcel` | NWI polygons intersecting parcel (optional buffer), new host |
| `env_screen_near` | One-call Quality Rule 6 database screen with distances (ft) |
| `seismic_design_at_point` | USGS Ss/S1/SDS/SD1/SDC etc. at the real centroid |
| `env_raw_query` | Raw GET against any public ArcGIS layer (state env layers → promote to registry once proven) |
## Deploy (Render — same as the other four)
1. New Web Service → this repo. Build: `npm install && npm run build`. Start: `npm start`.
2. No environment variables required (`PORT` provided by Render).
3. Health check path: `/healthz`.
4. Connector URL for Claude: `https://<service>.onrender.com/mcp` (streamable HTTP).
## First-run live verification checklist (before it goes in §10 as standing infrastructure)
Per project doctrine, code delivered ≠ verified. On the next run:
1. `screen_registry_list` — server answers, registry renders.
2. `soils_at_parcel` on the **Covington parcel polygon** (Assessment 1040006750) — expect Myatt fine sandy loam, hydric indication TRUE (matches the 2026-08-26 run's parish-layer finding, this time from SSURGO with HSG + water table attached).
3. `wetlands_at_parcel` same polygon — record presence/absence; St. Tammany's own hydric layer is the cross-check.
4. `env_screen_near` on the **Acworth centroid**, radius 1000, state GA — expect KEN'S CLEANERS (RCRAInfo) and the Kroger UST facility to reproduce with distances ≈ the run record's 156/193 ft (point-to-point, so close but not identical — that difference is itself the method note).
5. `seismic_design_at_point` on the Acworth centroid, asce7-22 — compare to the 2026-08-26 WebFetch result.
6. Log every outcome (clean/timeout/error) to the Jurisdiction Portal Registry and flip `verified` dates in `src/registry.ts`.
Then update instructions §10: the v010 draft already carries this server as **"code delivered 2026-08-28 — pending Render deployment + live verification"**; promote the wording to standing-infrastructure once the checklist passes.
## Design notes
- Result envelope on every tool: `status` (`ok` / `no_features` / `outside_coverage` / `layer_error`), `source`, `vintage`, `retrieved_at`, `caveats[]` — the Territory server's honesty taxonomy.
- Retry-once on network failure; 25 s fetch timeout; identifying User-Agent.
- `sda_raw_sql` refuses anything but a single SELECT (no `;`, no comments, no DML/DDL keywords).
- Stateless streamable-HTTP: a fresh `McpServer` + transport per POST — no session state to leak between runs.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues