geotap-mcp-server 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -13
- package/package.json +2 -2
- package/src/index.js +2 -2
- package/src/sources.js +9 -9
- package/src/tools.js +2 -2
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/geotap-mcp-server)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
**One API for
|
|
6
|
+
**One API for 37 US federal environmental and infrastructure data sources.**
|
|
7
7
|
|
|
8
8
|
GeoTap aggregates data from FEMA, USGS, EPA, NOAA, USDA, USFWS, DOT, Census, and more into a single REST API. This repository contains:
|
|
9
9
|
|
|
@@ -131,18 +131,54 @@ Every response includes:
|
|
|
131
131
|
curl "https://geotapdata.com/api/v1/geocode?address=456+Oak+Ave+Houston+TX"
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
+
#### Quick Start: Query an Address (Recommended)
|
|
135
|
+
|
|
136
|
+
The fastest way to get environmental data — geocode + query in one call:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# One call: geocodes address + returns flood zone, soils, wetlands, contamination
|
|
140
|
+
curl "https://geotapdata.com/api/v1/query-address?address=123+Main+St+Houston+TX"
|
|
141
|
+
|
|
142
|
+
# With specific layers
|
|
143
|
+
curl "https://geotapdata.com/api/v1/query-address?address=123+Main+St+Houston+TX&layers=flood_zones,soil_map_units"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Response includes plain-English `_interpretation` fields:
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"properties": {
|
|
150
|
+
"zone": "AE",
|
|
151
|
+
"_interpretation": "High-risk flood zone with base flood elevations determined. Flood insurance required."
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
#### Point Query (by coordinates)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# What's at this exact point? (properties only, no geometry — always <5KB)
|
|
160
|
+
curl "https://geotapdata.com/api/v1/spatial/point?lat=30.267&lng=-97.743&layers=flood_zones,wetlands"
|
|
161
|
+
```
|
|
162
|
+
|
|
134
163
|
#### Spatial Queries
|
|
135
164
|
|
|
136
165
|
| Method | Endpoint | Description |
|
|
137
166
|
|--------|----------|-------------|
|
|
138
|
-
| GET | `/
|
|
139
|
-
|
|
|
167
|
+
| GET | `/query-address?address=...` | **Geocode + point query in one call (recommended)** |
|
|
168
|
+
| GET | `/spatial/point?lat=...&lng=...` | Point-in-polygon query (properties only, with interpretations) |
|
|
169
|
+
| GET | `/spatial/near?lat={lat}&lng={lng}&radius={km}` | Query layers near a point |
|
|
170
|
+
| POST | `/spatial/in-polygon` | Query layers within a polygon |
|
|
140
171
|
| POST | `/spatial/summary` | Feature counts per layer (fast) |
|
|
141
172
|
| GET | `/spatial/bbox?bbox={w,s,e,n}` | Query layers in a bounding box |
|
|
142
173
|
|
|
174
|
+
**`geometry` parameter** — available on `/near`, `/bbox`, `/in-polygon`, and `/layers/:name/features`:
|
|
175
|
+
- `geometry=none` — strips all coordinates (smallest response, best for LLM consumers)
|
|
176
|
+
- `geometry=simplified` — reduces coordinate density
|
|
177
|
+
- `geometry=full` — complete geometry (default)
|
|
178
|
+
|
|
143
179
|
```bash
|
|
144
|
-
# All environmental data within 0.5 km of a point
|
|
145
|
-
curl "https://geotapdata.com/api/v1/spatial/near?lat=34.05&lng=-118.25&radius=0.5"
|
|
180
|
+
# All environmental data within 0.5 km of a point (no geometry for smaller response)
|
|
181
|
+
curl "https://geotapdata.com/api/v1/spatial/near?lat=34.05&lng=-118.25&radius=0.5&geometry=none"
|
|
146
182
|
|
|
147
183
|
# Specific layers only
|
|
148
184
|
curl "https://geotapdata.com/api/v1/spatial/near?lat=34.05&lng=-118.25&radius=0.5&layers=flood_zones,wetlands,soil_map_units"
|
|
@@ -154,7 +190,8 @@ curl -X POST "https://geotapdata.com/api/v1/spatial/in-polygon" \
|
|
|
154
190
|
"polygon": {
|
|
155
191
|
"type": "Polygon",
|
|
156
192
|
"coordinates": [[[-97.75,30.26],[-97.74,30.26],[-97.74,30.27],[-97.75,30.27],[-97.75,30.26]]]
|
|
157
|
-
}
|
|
193
|
+
},
|
|
194
|
+
"geometry": "none"
|
|
158
195
|
}'
|
|
159
196
|
```
|
|
160
197
|
|
|
@@ -492,21 +529,30 @@ With API key:
|
|
|
492
529
|
- *"What permits do I need to build near this stream?"*
|
|
493
530
|
- *"Export this data as a shapefile"*
|
|
494
531
|
|
|
495
|
-
### Available Tools (
|
|
532
|
+
### Available Tools (85)
|
|
533
|
+
|
|
534
|
+
**Core tools (start here):**
|
|
535
|
+
- **query_address** — Geocode + environmental query in one call. Returns properties with plain-English interpretations. (<5KB response)
|
|
536
|
+
- **identify_features_at_point** — Same as above but for lat/lng coordinates
|
|
537
|
+
- **get_rainfall_data** — NOAA Atlas 14 precipitation data
|
|
538
|
+
- **get_environmental_summary** — Quick feature counts per layer
|
|
539
|
+
- **geocode_address** — Convert address to coordinates
|
|
496
540
|
|
|
497
541
|
<details>
|
|
498
|
-
<summary>Spatial Queries (
|
|
542
|
+
<summary>All Spatial Queries (6)</summary>
|
|
499
543
|
|
|
500
|
-
- **
|
|
501
|
-
- **
|
|
544
|
+
- **query_address** — Geocode + point query in one call (recommended starting tool)
|
|
545
|
+
- **identify_features_at_point** — Point-in-polygon query (properties only, no geometry)
|
|
546
|
+
- **get_environmental_data_for_area** — Query all 37 data sources within a polygon (supports geometry=none)
|
|
547
|
+
- **get_environmental_data_near_point** — Query all data sources near a lat/lng point (supports geometry=none)
|
|
502
548
|
- **get_environmental_summary** — Quick feature counts per layer for an area
|
|
503
|
-
- **get_environmental_data_in_bbox** — Query data within a bounding box
|
|
549
|
+
- **get_environmental_data_in_bbox** — Query data within a bounding box (supports geometry=none)
|
|
504
550
|
</details>
|
|
505
551
|
|
|
506
552
|
<details>
|
|
507
553
|
<summary>Data Layers (3)</summary>
|
|
508
554
|
|
|
509
|
-
- **list_data_layers** — List all
|
|
555
|
+
- **list_data_layers** — List all 37 available data sources
|
|
510
556
|
- **get_layer_details** — Get metadata about a specific layer
|
|
511
557
|
- **get_layer_features** — Get features from a specific data layer
|
|
512
558
|
</details>
|
|
@@ -687,7 +733,7 @@ With API key:
|
|
|
687
733
|
- Water quality impairment assessment (EPA ATTAINS 303(d) list)
|
|
688
734
|
|
|
689
735
|
### AI-Powered Research
|
|
690
|
-
- Natural language queries across
|
|
736
|
+
- Natural language queries across 37 federal databases
|
|
691
737
|
- Automated environmental screening reports
|
|
692
738
|
- Cross-agency data correlation and analysis
|
|
693
739
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "geotap-mcp-server",
|
|
3
|
-
"version": "1.2.
|
|
4
|
-
"description": "MCP server for GeoTap — access
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "MCP server for GeoTap — access 37 US federal environmental and infrastructure data sources from Claude, Cursor, and other AI tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
7
7
|
"bin": {
|
package/src/index.js
CHANGED
|
@@ -10,8 +10,8 @@ import { toolSources } from './sources.js';
|
|
|
10
10
|
const server = new McpServer({
|
|
11
11
|
name: 'geotap',
|
|
12
12
|
version: '1.2.0',
|
|
13
|
-
description: 'Access
|
|
14
|
-
instructions: `You have access to GeoTap, which provides real-time data from
|
|
13
|
+
description: 'Access 37 US federal environmental and infrastructure data sources. Query flood zones, wetlands, soils, rainfall, watersheds, water quality, endangered species, elevation, land use, and more for any location in the United States.',
|
|
14
|
+
instructions: `You have access to GeoTap, which provides real-time data from 37 US federal agencies (FEMA, USGS, NOAA, EPA, NRCS, USFWS, USACE, and more).
|
|
15
15
|
|
|
16
16
|
START HERE — CORE TOOLS (use these for 90% of queries):
|
|
17
17
|
1. query_address — Geocode + environmental lookup in ONE call. Always start here when user gives an address.
|
package/src/sources.js
CHANGED
|
@@ -71,8 +71,8 @@ export const toolSources = {
|
|
|
71
71
|
get_environmental_data_in_bbox: MULTI_SOURCE,
|
|
72
72
|
|
|
73
73
|
// ── Data Layers ──
|
|
74
|
-
list_data_layers: [{ agency: 'GeoTap', dataset: 'Layer Catalog (
|
|
75
|
-
get_layer_details: [{ agency: 'GeoTap', dataset: 'Layer Catalog', url: 'https://
|
|
74
|
+
list_data_layers: [{ agency: 'GeoTap', dataset: 'Layer Catalog (37 federal sources)', url: 'https://geotapdata.com' }],
|
|
75
|
+
get_layer_details: [{ agency: 'GeoTap', dataset: 'Layer Catalog', url: 'https://geotapdata.com' }],
|
|
76
76
|
get_layer_features: MULTI_SOURCE,
|
|
77
77
|
|
|
78
78
|
// ── Rainfall & Precipitation ──
|
|
@@ -141,7 +141,7 @@ export const toolSources = {
|
|
|
141
141
|
// ── Monitoring Stations ──
|
|
142
142
|
find_monitoring_stations: [...src(AGENCIES.USGS, 'nwis'), { agency: 'NOAA', dataset: 'Tide Stations, Weather Stations', url: 'https://tidesandcurrents.noaa.gov/' }],
|
|
143
143
|
search_stations: [...src(AGENCIES.USGS, 'nwis'), { agency: 'NOAA', dataset: 'Tide Stations, Weather Stations', url: 'https://tidesandcurrents.noaa.gov/' }],
|
|
144
|
-
get_station_types: [{ agency: 'GeoTap', dataset: 'Station Type Configuration', url: 'https://
|
|
144
|
+
get_station_types: [{ agency: 'GeoTap', dataset: 'Station Type Configuration', url: 'https://geotapdata.com' }],
|
|
145
145
|
|
|
146
146
|
// ── Gage Intelligence: Gauged ──
|
|
147
147
|
get_flood_frequency_analysis: [...src(AGENCIES.USGS, 'nwis'), { agency: 'USGS', dataset: 'Bulletin 17C Guidelines', url: 'https://pubs.usgs.gov/tm/04/b05/tm4b5.pdf' }],
|
|
@@ -171,22 +171,22 @@ export const toolSources = {
|
|
|
171
171
|
get_site_analysis_status: MULTI_SOURCE,
|
|
172
172
|
generate_constraints_report: MULTI_SOURCE,
|
|
173
173
|
get_constraints_report_status: MULTI_SOURCE,
|
|
174
|
-
get_constraints_config: [{ agency: 'GeoTap', dataset: 'Constraints Configuration', url: 'https://
|
|
174
|
+
get_constraints_config: [{ agency: 'GeoTap', dataset: 'Constraints Configuration', url: 'https://geotapdata.com' }],
|
|
175
175
|
generate_developability_report: MULTI_SOURCE,
|
|
176
|
-
get_developability_config: [{ agency: 'GeoTap', dataset: 'Developability Configuration', url: 'https://
|
|
176
|
+
get_developability_config: [{ agency: 'GeoTap', dataset: 'Developability Configuration', url: 'https://geotapdata.com' }],
|
|
177
177
|
|
|
178
178
|
// ── Export ──
|
|
179
|
-
get_export_options: [{ agency: 'GeoTap', dataset: 'Export Configuration', url: 'https://
|
|
179
|
+
get_export_options: [{ agency: 'GeoTap', dataset: 'Export Configuration', url: 'https://geotapdata.com' }],
|
|
180
180
|
export_data: MULTI_SOURCE,
|
|
181
|
-
get_export_status: [{ agency: 'GeoTap', dataset: 'Export Job Status', url: 'https://
|
|
181
|
+
get_export_status: [{ agency: 'GeoTap', dataset: 'Export Job Status', url: 'https://geotapdata.com' }],
|
|
182
182
|
|
|
183
183
|
// ── Utilities ──
|
|
184
184
|
geocode_address: [
|
|
185
185
|
{ agency: 'Census Bureau', dataset: 'Census Geocoder', url: 'https://geocoding.geo.census.gov/' },
|
|
186
186
|
{ agency: 'OpenStreetMap', dataset: 'Photon / Nominatim Geocoder', url: 'https://photon.komoot.io/' },
|
|
187
187
|
],
|
|
188
|
-
check_api_status: [{ agency: 'GeoTap', dataset: 'API Health Check', url: 'https://
|
|
189
|
-
check_specific_api_status: [{ agency: 'GeoTap', dataset: 'API Health Check', url: 'https://
|
|
188
|
+
check_api_status: [{ agency: 'GeoTap', dataset: 'API Health Check', url: 'https://geotapdata.com' }],
|
|
189
|
+
check_specific_api_status: [{ agency: 'GeoTap', dataset: 'API Health Check', url: 'https://geotapdata.com' }],
|
|
190
190
|
get_firm_panels: src(AGENCIES.FEMA, 'nfhl'),
|
|
191
191
|
get_huc_watersheds: src(AGENCIES.USGS, 'wbd'),
|
|
192
192
|
get_huc_watershed_by_code: src(AGENCIES.USGS, 'wbd'),
|
package/src/tools.js
CHANGED
|
@@ -40,7 +40,7 @@ export const tools = [
|
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
name: 'get_environmental_data_for_area',
|
|
43
|
-
description: `Query all available US federal environmental and infrastructure data within a geographic area (polygon). Returns features from
|
|
43
|
+
description: `Query all available US federal environmental and infrastructure data within a geographic area (polygon). Returns features from 37 data sources. WARNING: responses can be very large (100KB-2MB+) in urban areas with full geometry. ALWAYS set geometry="none" unless the user specifically needs coordinates. Specify layers to reduce response size. For simple "what's at this location?" questions, use query_address or identify_features_at_point instead — they're faster and return <5KB.`,
|
|
44
44
|
parameters: {
|
|
45
45
|
polygon: z.object({
|
|
46
46
|
type: z.literal('Polygon'),
|
|
@@ -95,7 +95,7 @@ export const tools = [
|
|
|
95
95
|
// ═══════════════════════════════════════════════════════════════════
|
|
96
96
|
{
|
|
97
97
|
name: 'list_data_layers',
|
|
98
|
-
description: `List all available environmental and infrastructure data layers in GeoTap. Returns the full catalog of
|
|
98
|
+
description: `List all available environmental and infrastructure data layers in GeoTap. Returns the full catalog of 37 data sources with their names, descriptions, and data providers. Use this tool when someone asks "what data do you have?" or "what sources are available?" or wants to know what types of environmental data can be queried. Includes layers from FEMA, USGS, EPA, NOAA, USDA, USFWS, DOT, Census, and more.`,
|
|
99
99
|
parameters: {},
|
|
100
100
|
endpoint: '/layers',
|
|
101
101
|
method: 'GET'
|