gov-data-mcp 1.0.2 → 1.0.4
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 -5
- package/package.json +5 -4
- package/src/catalog.json +184 -17
- package/src/index.js +4 -1
- package/src/tools.js +78 -8
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# gov-data-mcp
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**116 US government open-data tools, as one MCP server.**
|
|
4
4
|
|
|
5
5
|
EPA, FEMA, USGS, NOAA, FAA, USACE, FDIC, HUD, NRCS, HRSA, CMS, county assessor rolls and state licensing boards — all reachable as agent-callable tools, all reading directly from official government APIs and bulk files. No scraping, no HTML parsing, no rate-limit roulette.
|
|
6
6
|
|
|
@@ -49,13 +49,13 @@ Claude Desktop reads `claude_desktop_config.json`; Claude Code reads `.mcp.json`
|
|
|
49
49
|
| `parcel-owner-lookup` | Assessor-roll owner of record for an address |
|
|
50
50
|
| `license-verifier` | 19 professional licensing boards across 9 states + OIG exclusions |
|
|
51
51
|
|
|
52
|
-
**Plus three tools that reach the other
|
|
52
|
+
**Plus three tools that reach the other 104:**
|
|
53
53
|
|
|
54
54
|
- `search_gov_data_tools` — find a tool by keyword, agency or topic
|
|
55
55
|
- `describe_gov_data_tool` — full input schema for any tool in the catalog
|
|
56
56
|
- `run_gov_data_tool` — run any tool in the catalog
|
|
57
57
|
|
|
58
|
-
The catalog is bundled, so discovery costs nothing. Ask your agent *"what government data tools do you have for flood risk?"* and it will search all
|
|
58
|
+
The catalog is bundled, so discovery costs nothing. Ask your agent *"what government data tools do you have for flood risk?"* and it will search all 116.
|
|
59
59
|
|
|
60
60
|
## Example prompts
|
|
61
61
|
|
|
@@ -88,11 +88,65 @@ So this server:
|
|
|
88
88
|
|
|
89
89
|
The underlying actors carry the same discipline: per-source status on every row, `null` meaning *not checked* rather than *checked and negative*, live drift assertions that fail the run when an upstream silently truncates, and pagination guards on sources that answer HTTP 200 with a partial payload. Each actor's Store page documents the specific traps it defends against.
|
|
90
90
|
|
|
91
|
+
<!-- COVERAGE:START -->
|
|
91
92
|
## Coverage
|
|
92
93
|
|
|
93
|
-
|
|
94
|
+
**116 tools**, every one reading an official US government API or bulk file. The MCP server exposes 15 of them directly — twelve named tools plus `search_gov_data_tools`, `describe_gov_data_tool` and `run_gov_data_tool`, which reach the rest — because agents choose badly when handed more than about twenty tools.
|
|
94
95
|
|
|
95
|
-
|
|
96
|
+
Each entry links to its full input/output schema, pricing and worked examples.
|
|
97
|
+
|
|
98
|
+
**Contamination & environmental due diligence** (18)
|
|
99
|
+
|
|
100
|
+
[epa-airtoxscreen-cancer-risk-screener](https://apify.com/malonestar/epa-airtoxscreen-cancer-risk-screener) · [epa-contaminated-site-screener](https://apify.com/malonestar/epa-contaminated-site-screener) · [epa-drinking-water-quality-screener](https://apify.com/malonestar/epa-drinking-water-quality-screener) · [epa-ghgrp-emitter-screener](https://apify.com/malonestar/epa-ghgrp-emitter-screener) · [epa-impaired-waters-303d-screener](https://apify.com/malonestar/epa-impaired-waters-303d-screener) · [epa-nonattainment-air-permit-screener](https://apify.com/malonestar/epa-nonattainment-air-permit-screener) · [epa-rcra-corrective-action-cleanup-monitor](https://apify.com/malonestar/epa-rcra-corrective-action-cleanup-monitor) · [epa-rcra-hazwaste-generator-rollup](https://apify.com/malonestar/epa-rcra-hazwaste-generator-rollup) · [epa-repowering-brownfield-to-solar-site-finder](https://apify.com/malonestar/epa-repowering-brownfield-to-solar-site-finder) · [epa-sole-source-aquifer-screener](https://apify.com/malonestar/epa-sole-source-aquifer-screener) · [epa-tri-facility-release-rollup](https://apify.com/malonestar/epa-tri-facility-release-rollup) · [epa-tsca-cdr-chemical-site-screener](https://apify.com/malonestar/epa-tsca-cdr-chemical-site-screener) · [erns-nrc-release-incident-screener](https://apify.com/malonestar/erns-nrc-release-incident-screener) · [fuds-defense-site-screener](https://apify.com/malonestar/fuds-defense-site-screener) · [historic-land-use-sic-contaminant-screener](https://apify.com/malonestar/historic-land-use-sic-contaminant-screener) · [site-due-diligence-bundle](https://apify.com/malonestar/site-due-diligence-bundle) · [state-tank-spill-registry-screener](https://apify.com/malonestar/state-tank-spill-registry-screener) · [usgs-historical-topo-records-review](https://apify.com/malonestar/usgs-historical-topo-records-review)
|
|
101
|
+
|
|
102
|
+
**Flood, fire, quake & ground hazard** (13)
|
|
103
|
+
|
|
104
|
+
[calfire-fhsz-screener](https://apify.com/malonestar/calfire-fhsz-screener) · [cbrs-coastal-barrier-screener](https://apify.com/malonestar/cbrs-coastal-barrier-screener) · [fema-nri-county-risk-profile](https://apify.com/malonestar/fema-nri-county-risk-profile) · [fema-repetitive-loss-flood-market-screener](https://apify.com/malonestar/fema-repetitive-loss-flood-market-screener) · [karst-sinkhole-risk-screener](https://apify.com/malonestar/karst-sinkhole-risk-screener) · [nfip-flood-loss-risk-screener](https://apify.com/malonestar/nfip-flood-loss-risk-screener) · [noaa-slr-inundation-threshold-screener](https://apify.com/malonestar/noaa-slr-inundation-threshold-screener) · [noaa-storm-events-peril-climatology](https://apify.com/malonestar/noaa-storm-events-peril-climatology) · [usace-levee-flood-risk-screener](https://apify.com/malonestar/usace-levee-flood-risk-screener) · [usgs-bedrock-geology-lithology-screener](https://apify.com/malonestar/usgs-bedrock-geology-lithology-screener) · [usgs-landslide-proximity-screener](https://apify.com/malonestar/usgs-landslide-proximity-screener) · [usgs-seismic-design-screener](https://apify.com/malonestar/usgs-seismic-design-screener) · [wildfire-asset-exposure-screener](https://apify.com/malonestar/wildfire-asset-exposure-screener)
|
|
105
|
+
|
|
106
|
+
**Habitat, wetlands, protected & historic land** (9)
|
|
107
|
+
|
|
108
|
+
[blm-sage-grouse-siting-screener](https://apify.com/malonestar/blm-sage-grouse-siting-screener) · [fws-critical-habitat-screener](https://apify.com/malonestar/fws-critical-habitat-screener) · [fws-wetlands-proximity-screener](https://apify.com/malonestar/fws-wetlands-proximity-screener) · [nhd-surface-water-404-screener](https://apify.com/malonestar/nhd-surface-water-404-screener) · [noaa-efh-consultation-screener](https://apify.com/malonestar/noaa-efh-consultation-screener) · [nrhp-historic-place-screener](https://apify.com/malonestar/nrhp-historic-place-screener) · [padus-protected-lands-screener](https://apify.com/malonestar/padus-protected-lands-screener) · [tribal-land-jurisdiction-screener](https://apify.com/malonestar/tribal-land-jurisdiction-screener) · [wild-scenic-river-proximity-screener](https://apify.com/malonestar/wild-scenic-river-proximity-screener)
|
|
109
|
+
|
|
110
|
+
**Energy siting, grid & pipelines** (14)
|
|
111
|
+
|
|
112
|
+
[blm-mining-claims](https://apify.com/malonestar/blm-mining-claims) · [blm-solar-siting-area-screener](https://apify.com/malonestar/blm-solar-siting-area-screener) · [boem-offshore-wind-lease-tracker](https://apify.com/malonestar/boem-offshore-wind-lease-tracker) · [cdfi-nmtc-lowincome-energy-bonus-screener](https://apify.com/malonestar/cdfi-nmtc-lowincome-energy-bonus-screener) · [eia-v2-site-energy-economics](https://apify.com/malonestar/eia-v2-site-energy-economics) · [energy-corridor-368-screener](https://apify.com/malonestar/energy-corridor-368-screener) · [hifld-grid-proximity-screener](https://apify.com/malonestar/hifld-grid-proximity-screener) · [interconnection-queue-tracker](https://apify.com/malonestar/interconnection-queue-tracker) · [ira-energy-community-bonus-screener](https://apify.com/malonestar/ira-energy-community-bonus-screener) · [nrel-pvwatts-solar-resource-scorer](https://apify.com/malonestar/nrel-pvwatts-solar-resource-scorer) · [ntad-gas-pipeline-proximity-screener](https://apify.com/malonestar/ntad-gas-pipeline-proximity-screener) · [oil-gas-well-permits](https://apify.com/malonestar/oil-gas-well-permits) · [orphaned-well-proximity-screener](https://apify.com/malonestar/orphaned-well-proximity-screener) · [uswtdb-turbine-proximity-screener](https://apify.com/malonestar/uswtdb-turbine-proximity-screener)
|
|
113
|
+
|
|
114
|
+
**Farmland, soil & water** (5)
|
|
115
|
+
|
|
116
|
+
[ssurgo-soil-suitability-screener](https://apify.com/malonestar/ssurgo-soil-suitability-screener) · [usda-cdl-farmland-siting-screener](https://apify.com/malonestar/usda-cdl-farmland-siting-screener) · [usgs-groundwater-depth-screener](https://apify.com/malonestar/usgs-groundwater-depth-screener) · [usgs-nwis-streamflow-monitor](https://apify.com/malonestar/usgs-nwis-streamflow-monitor) · [water-rights-availability-screener](https://apify.com/malonestar/water-rights-availability-screener)
|
|
117
|
+
|
|
118
|
+
**Banking, lending & credit** (8)
|
|
119
|
+
|
|
120
|
+
[bank-enforcement-tracker](https://apify.com/malonestar/bank-enforcement-tracker) · [fdic-branch-network-churn-rollup](https://apify.com/malonestar/fdic-branch-network-churn-rollup) · [fdic-ncua-health-rollup](https://apify.com/malonestar/fdic-ncua-health-rollup) · [fdic-sod-deposit-market-share-rollup](https://apify.com/malonestar/fdic-sod-deposit-market-share-rollup) · [fdic-structure-change-delta-monitor](https://apify.com/malonestar/fdic-structure-change-delta-monitor) · [fhlbank-membership-delta-monitor](https://apify.com/malonestar/fhlbank-membership-delta-monitor) · [hmda-fair-lending-disparity-rollup](https://apify.com/malonestar/hmda-fair-lending-disparity-rollup) · [sba-loan-portfolio-explorer](https://apify.com/malonestar/sba-loan-portfolio-explorer)
|
|
121
|
+
|
|
122
|
+
**Securities, audit, pensions & sanctions** (8)
|
|
123
|
+
|
|
124
|
+
[adcvd-trade-remedy-tracker](https://apify.com/malonestar/adcvd-trade-remedy-tracker) · [consolidated-screening-list-delta](https://apify.com/malonestar/consolidated-screening-list-delta) · [fec-campaign-finance-delta](https://apify.com/malonestar/fec-campaign-finance-delta) · [pbgc-pension-failure-monitor](https://apify.com/malonestar/pbgc-pension-failure-monitor) · [pcaob-auditor-engagement-monitor](https://apify.com/malonestar/pcaob-auditor-engagement-monitor) · [reg-cf-lifecycle-monitor](https://apify.com/malonestar/reg-cf-lifecycle-monitor) · [ria-registration-delta-monitor](https://apify.com/malonestar/ria-registration-delta-monitor) · [short-interest-ftd-monitor](https://apify.com/malonestar/short-interest-ftd-monitor)
|
|
125
|
+
|
|
126
|
+
**Licensing, exclusion & workforce screening** (10)
|
|
127
|
+
|
|
128
|
+
[city-business-license-leads](https://apify.com/malonestar/city-business-license-leads) · [gleif-ownership-graph](https://apify.com/malonestar/gleif-ownership-graph) · [hrsa-clinician-workforce-monitor](https://apify.com/malonestar/hrsa-clinician-workforce-monitor) · [hrsa-shortage-designation-monitor](https://apify.com/malonestar/hrsa-shortage-designation-monitor) · [kyb-company-verifier](https://apify.com/malonestar/kyb-company-verifier) · [license-verifier](https://apify.com/malonestar/license-verifier) · [liquor-license-new-openings-tracker](https://apify.com/malonestar/liquor-license-new-openings-tracker) · [medicaid-exclusion-screener](https://apify.com/malonestar/medicaid-exclusion-screener) · [realtor-license-roster-delta](https://apify.com/malonestar/realtor-license-roster-delta) · [sos-registry-monitor](https://apify.com/malonestar/sos-registry-monitor)
|
|
129
|
+
|
|
130
|
+
**Real estate, parcels, deeds & leads** (9)
|
|
131
|
+
|
|
132
|
+
[absentee-owner-lead-list-builder](https://apify.com/malonestar/absentee-owner-lead-list-builder) · [acris-deed-transfer-intel](https://apify.com/malonestar/acris-deed-transfer-intel) · [childcare-provider-leads](https://apify.com/malonestar/childcare-provider-leads) · [distressed-property-signal-stacker](https://apify.com/malonestar/distressed-property-signal-stacker) · [hud-affordable-housing-explorer](https://apify.com/malonestar/hud-affordable-housing-explorer) · [hud-qct-lihtc-boost-screener](https://apify.com/malonestar/hud-qct-lihtc-boost-screener) · [hud-section8-contract-expiration-monitor](https://apify.com/malonestar/hud-section8-contract-expiration-monitor) · [nyc-landlord-registry-lead-list](https://apify.com/malonestar/nyc-landlord-registry-lead-list) · [parcel-owner-lookup](https://apify.com/malonestar/parcel-owner-lookup)
|
|
133
|
+
|
|
134
|
+
**Infrastructure, transport & airspace** (9)
|
|
135
|
+
|
|
136
|
+
[bts-airline-ontime-delay-climatology](https://apify.com/malonestar/bts-airline-ontime-delay-climatology) · [dod-mirta-military-installation-siting-screener](https://apify.com/malonestar/dod-mirta-military-installation-siting-screener) · [faa-drone-airspace-checker](https://apify.com/malonestar/faa-drone-airspace-checker) · [fhwa-nbi-bridge-risk-monitor](https://apify.com/malonestar/fhwa-nbi-bridge-risk-monitor) · [gsa-site-scanning-auditor](https://apify.com/malonestar/gsa-site-scanning-auditor) · [national-tunnel-inventory-risk-monitor](https://apify.com/malonestar/national-tunnel-inventory-risk-monitor) · [nhtsa-vpic-vin-decoder](https://apify.com/malonestar/nhtsa-vpic-vin-decoder) · [nid-dam-risk-monitor](https://apify.com/malonestar/nid-dam-risk-monitor) · [ntad-fra-rail-crossing-risk-screener](https://apify.com/malonestar/ntad-fra-rail-crossing-risk-screener)
|
|
137
|
+
|
|
138
|
+
**Health, clinical & drug supply** (7)
|
|
139
|
+
|
|
140
|
+
[cdc-nndss-outbreak-monitor](https://apify.com/malonestar/cdc-nndss-outbreak-monitor) · [clinical-trials-meta-search](https://apify.com/malonestar/clinical-trials-meta-search) · [cms-open-payments](https://apify.com/malonestar/cms-open-payments) · [cms-part-d-prescriber-delta](https://apify.com/malonestar/cms-part-d-prescriber-delta) · [drug-shortage-delta-monitor](https://apify.com/malonestar/drug-shortage-delta-monitor) · [nadac-price-movers](https://apify.com/malonestar/nadac-price-movers) · [usmin-mine-feature-proximity-screener](https://apify.com/malonestar/usmin-mine-feature-proximity-screener)
|
|
141
|
+
|
|
142
|
+
**Patents, IP & company data** (4)
|
|
143
|
+
|
|
144
|
+
[npm-package-health-scorer](https://apify.com/malonestar/npm-package-health-scorer) · [ptab-trial-tracker](https://apify.com/malonestar/ptab-trial-tracker) · [sbom-vulnerability-rollup](https://apify.com/malonestar/sbom-vulnerability-rollup) · [uspto-patent-lapse-fto-monitor](https://apify.com/malonestar/uspto-patent-lapse-fto-monitor)
|
|
145
|
+
|
|
146
|
+
**Labor & enforcement** (2)
|
|
147
|
+
|
|
148
|
+
[dol-enforcement-rollup](https://apify.com/malonestar/dol-enforcement-rollup) · [warn-layoff-aggregator](https://apify.com/malonestar/warn-layoff-aggregator)
|
|
149
|
+
<!-- COVERAGE:END -->
|
|
96
150
|
|
|
97
151
|
## Development
|
|
98
152
|
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gov-data-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"mcpName": "io.github.malonestar/gov-data-mcp",
|
|
5
|
-
"description": "MCP server exposing
|
|
5
|
+
"description": "MCP server exposing published US government open-data tools (EPA, FEMA, USGS, NOAA, FAA, USACE, FDIC, HUD, state licensing boards) as agent-callable tools, backed by Apify Actors.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "src/index.js",
|
|
8
8
|
"bin": {
|
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
20
|
"start": "node src/index.js",
|
|
21
|
-
"test": "node --test test/tools.test.js test/apify.test.js test/catalog.test.js",
|
|
21
|
+
"test": "node --test test/tools.test.js test/apify.test.js test/catalog.test.js test/agent-surface.test.js",
|
|
22
22
|
"catalog": "node tools/gen-catalog.cjs",
|
|
23
|
-
"check:catalog": "node tools/check-catalog-live.cjs"
|
|
23
|
+
"check:catalog": "node tools/check-catalog-live.cjs",
|
|
24
|
+
"readme": "node tools/gen-readme-coverage.cjs"
|
|
24
25
|
},
|
|
25
26
|
"keywords": [
|
|
26
27
|
"mcp",
|
package/src/catalog.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-
|
|
2
|
+
"generatedAt": "2026-09-01T00:04:50.680Z",
|
|
3
3
|
"owner": "malonestar",
|
|
4
|
-
"count":
|
|
4
|
+
"count": 116,
|
|
5
5
|
"actors": [
|
|
6
6
|
{
|
|
7
7
|
"slug": "absentee-owner-lead-list-builder",
|
|
@@ -446,6 +446,79 @@
|
|
|
446
446
|
}
|
|
447
447
|
}
|
|
448
448
|
},
|
|
449
|
+
{
|
|
450
|
+
"slug": "bts-airline-ontime-delay-climatology",
|
|
451
|
+
"actorId": "malonestar/bts-airline-ontime-delay-climatology",
|
|
452
|
+
"title": "US Airline On-Time & Flight Delay Statistics by Route (BTS)",
|
|
453
|
+
"description": "Historical US flight delay, cancellation and on-time statistics from official BTS data. Rollups by route, airline or airport and month with full delay-cause breakdowns — carrier, weather, NAS, security, late aircraft — honest denominators, cancellation causes and data-vintage on every row.",
|
|
454
|
+
"categories": [
|
|
455
|
+
"TRAVEL",
|
|
456
|
+
"DEVELOPER_TOOLS",
|
|
457
|
+
"AGENTS"
|
|
458
|
+
],
|
|
459
|
+
"storeUrl": "https://apify.com/malonestar/bts-airline-ontime-delay-climatology",
|
|
460
|
+
"inputSchema": {
|
|
461
|
+
"type": "object",
|
|
462
|
+
"properties": {
|
|
463
|
+
"sinceMonth": {
|
|
464
|
+
"type": "string",
|
|
465
|
+
"description": "First month of BTS on-time data to include, as YYYY-MM (e.g. \"2026-05\"). Leave blank to default to the month before the latest published month. The BTS series begins 1987-10 and is published with a ~2-3 month lag; the run discovers the latest available month live and reports it on every row. An unusable value (slash dates, bare years, month 13) FAILS the run loudly — it is never silently ignored. Example: \"2026-05\"."
|
|
466
|
+
},
|
|
467
|
+
"untilMonth": {
|
|
468
|
+
"type": "string",
|
|
469
|
+
"description": "Last month of BTS on-time data to include, as YYYY-MM. Leave blank to default to the latest published month. A window spanning more than 12 months is rejected (each month is a ~30 MB BTS download). A month BTS has not yet published is reported as missing — with allowPartial false (the default) the run fails loudly rather than quietly narrowing your window. Example: \"2026-06\"."
|
|
470
|
+
},
|
|
471
|
+
"airlines": {
|
|
472
|
+
"type": "array",
|
|
473
|
+
"description": "Optional. BTS reporting-carrier codes to include, e.g. [\"WN\",\"AA\",\"DL\",\"UA\",\"B6\"]. Leave empty for all reporting carriers (13 in 2026-05: AA, AS, B6, DL, F9, G4, MQ, NK, OH, OO, UA, WN, YX). A code matching no flights fails the run with the list of carriers actually present — never a silent empty dataset. Example: [\"WN\"].",
|
|
474
|
+
"items": {
|
|
475
|
+
"type": "string"
|
|
476
|
+
}
|
|
477
|
+
},
|
|
478
|
+
"origins": {
|
|
479
|
+
"type": "array",
|
|
480
|
+
"description": "Optional. IATA origin airport codes, e.g. [\"DEN\",\"MDW\"]. Leave empty for all origins.",
|
|
481
|
+
"items": {
|
|
482
|
+
"type": "string"
|
|
483
|
+
}
|
|
484
|
+
},
|
|
485
|
+
"dests": {
|
|
486
|
+
"type": "array",
|
|
487
|
+
"description": "Optional. IATA destination airport codes, e.g. [\"LGA\",\"DCA\"]. Leave empty for all destinations.",
|
|
488
|
+
"items": {
|
|
489
|
+
"type": "string"
|
|
490
|
+
}
|
|
491
|
+
},
|
|
492
|
+
"groupBy": {
|
|
493
|
+
"type": "string",
|
|
494
|
+
"description": "How to roll flights up. \"route\" = one row per (origin-dest x month) across airlines; \"airline\" = one row per (carrier x month); \"origin_airport\" / \"dest_airport\" = one row per (airport x month); \"airline_route\" = one row per (carrier x origin-dest x month). Omitted = \"route\". Example: \"route\".",
|
|
495
|
+
"enum": [
|
|
496
|
+
"route",
|
|
497
|
+
"airline",
|
|
498
|
+
"origin_airport",
|
|
499
|
+
"dest_airport",
|
|
500
|
+
"airline_route"
|
|
501
|
+
]
|
|
502
|
+
},
|
|
503
|
+
"minFlights": {
|
|
504
|
+
"type": "integer",
|
|
505
|
+
"description": "Suppress groups with fewer than this many scheduled flights in a month (noise control — a 2-flight 'route' produces meaningless rates). Suppressed-group count is disclosed on every emitted row as groups_suppressed_below_min_flights. Set 0 to keep everything. Omitted = 30. Example: 30.",
|
|
506
|
+
"minimum": 0,
|
|
507
|
+
"maximum": 100000
|
|
508
|
+
},
|
|
509
|
+
"maxResults": {
|
|
510
|
+
"type": "integer",
|
|
511
|
+
"description": "Hard cap on emitted rows — each row is one billed result. Enforced by a single audited code path for every groupBy mode; when the cap bites, rows are dropped smallest-groups-first and every emitted row carries results_truncated=true. Omitted = 500. Example: 500.",
|
|
512
|
+
"minimum": 1,
|
|
513
|
+
"maximum": 20000
|
|
514
|
+
},
|
|
515
|
+
"allowPartial": {
|
|
516
|
+
"type": "boolean",
|
|
517
|
+
"description": "If a requested month cannot be retrieved (not yet published by BTS, or the download failed), the run FAILS loudly by default so a partial window is never mistaken for a complete one. Set true to proceed with the months that did arrive — every row then reports months_missing and data_complete=false. Applied by default if omitted: false."
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
},
|
|
449
522
|
{
|
|
450
523
|
"slug": "calfire-fhsz-screener",
|
|
451
524
|
"actorId": "malonestar/calfire-fhsz-screener",
|
|
@@ -784,8 +857,8 @@
|
|
|
784
857
|
{
|
|
785
858
|
"slug": "clinical-trials-meta-search",
|
|
786
859
|
"actorId": "malonestar/clinical-trials-meta-search",
|
|
787
|
-
"title": "Clinical Trials
|
|
788
|
-
"description": "Clinical trials API: search ClinicalTrials.gov, ISRCTN and EU
|
|
860
|
+
"title": "Clinical Trials API - ClinicalTrials.gov, ISRCTN, EU CTIS",
|
|
861
|
+
"description": "Clinical trials API: search ClinicalTrials.gov, ISRCTN and the EU CTIS register in one call and get deduplicated trial records in a unified schema, with per-registry status on every row and optional patent linkage. Query by condition, drug, sponsor or status. Keyless, official registries.",
|
|
789
862
|
"categories": [
|
|
790
863
|
"AI",
|
|
791
864
|
"DEVELOPER_TOOLS",
|
|
@@ -801,7 +874,7 @@
|
|
|
801
874
|
},
|
|
802
875
|
"sources": {
|
|
803
876
|
"type": "array",
|
|
804
|
-
"description": "Which trial registries to include.
|
|
877
|
+
"description": "Which trial registries to include. ClinicalTrials.gov (US NIH), ISRCTN (UK/international) and EU CTIS are all keyless. The maxResults budget is shared FAIRLY across whichever you enable, so no single registry can fill the cap alone. Applied by default if omitted: [\"clinicaltrials\",\"isrctn\",\"euctis\"].",
|
|
805
878
|
"items": {
|
|
806
879
|
"type": "string",
|
|
807
880
|
"enum": [
|
|
@@ -812,23 +885,23 @@
|
|
|
812
885
|
"enumTitles": [
|
|
813
886
|
"ClinicalTrials.gov (US)",
|
|
814
887
|
"ISRCTN (UK/Intl)",
|
|
815
|
-
"EU CTIS (
|
|
888
|
+
"EU CTIS (EU/EEA)"
|
|
816
889
|
]
|
|
817
890
|
}
|
|
818
891
|
},
|
|
819
892
|
"maxResults": {
|
|
820
893
|
"type": "integer",
|
|
821
|
-
"description": "Maximum number of deduplicated trial records to return. Applied by default if omitted: 100.",
|
|
894
|
+
"description": "Maximum number of deduplicated trial records to return. This is a true emit cap and therefore also your bill cap: one row written = one billable result. The budget is split max-min fairly across the registries you enabled, with trials found in 2+ distinct registries reserved off the top. Applied by default if omitted: 100.",
|
|
822
895
|
"minimum": 1,
|
|
823
896
|
"maximum": 5000
|
|
824
897
|
},
|
|
825
898
|
"onlyMultiRegistry": {
|
|
826
899
|
"type": "boolean",
|
|
827
|
-
"description": "Return only trials
|
|
900
|
+
"description": "Return only trials found in more than one DISTINCT registry - the unique value of a meta-search. Applied before the maxResults cap. Corrected 2026-08-25: this previously also kept trials whose two merged records came from the same registry. Applied by default if omitted: false."
|
|
828
901
|
},
|
|
829
902
|
"includePatents": {
|
|
830
903
|
"type": "boolean",
|
|
831
|
-
"description": "Enrich each trial with related US patents matched on its interventions
|
|
904
|
+
"description": "Enrich each trial with related US patents matched on its interventions. Requires a free PatentsView API key; setting this to true without a key FAILS the run rather than silently returning zero patents on every row. Patents add columns, not rows, so they do not change what you are billed. Applied by default if omitted: false."
|
|
832
905
|
},
|
|
833
906
|
"patentsViewApiKey": {
|
|
834
907
|
"type": "string",
|
|
@@ -2310,7 +2383,7 @@
|
|
|
2310
2383
|
"slug": "faa-drone-airspace-checker",
|
|
2311
2384
|
"actorId": "malonestar/faa-drone-airspace-checker",
|
|
2312
2385
|
"title": "FAA Drone Airspace Checker - Batch LAANC & No-Fly Verdicts",
|
|
2313
|
-
"description": "Batch lat/lon to FAA UAS airspace verdicts: LAANC ceilings AND whether LAANC is actually offered, charted Class B/C/D/E surface areas, prohibited areas, national-defense TFR areas, special use airspace, NSUFR, stadium TFRs.
|
|
2386
|
+
"description": "Batch lat/lon to FAA UAS airspace verdicts at $0.02 per check: LAANC ceilings AND whether LAANC is actually offered, charted Class B/C/D/E surface areas, prohibited areas, national-defense TFR areas, special use airspace, NSUFR, stadium TFRs. Never reads clear when a layer did not answer.",
|
|
2314
2387
|
"categories": [
|
|
2315
2388
|
"DEVELOPER_TOOLS",
|
|
2316
2389
|
"LEAD_GENERATION",
|
|
@@ -5264,11 +5337,15 @@
|
|
|
5264
5337
|
},
|
|
5265
5338
|
"apiNumber": {
|
|
5266
5339
|
"type": "string",
|
|
5267
|
-
"description": "Look up one exact API well number (
|
|
5340
|
+
"description": "Look up one exact identifier. North Dakota matches its API well number (raw column api_no, e.g. 33-053-10805-00-00). Colorado matches its facility number (raw column fac_num, e.g. 4-8) — which is NOT an API number, so it is published in the facility_number output field and Colorado rows carry api_number: null."
|
|
5268
5341
|
},
|
|
5269
5342
|
"sinceModified": {
|
|
5270
5343
|
"type": "string",
|
|
5271
|
-
"description": "
|
|
5344
|
+
"description": "Lower bound on the state's own date column. READ THIS BEFORE USING IT FOR PERMIT MONITORING: no state configured here publishes a permit-ISSUE date. North Dakota publishes SPUD_DATE only, so this window selects wells DRILLED since the date, not permits ISSUED since it — and because SQL treats a null date as not-greater-than, it structurally EXCLUDES all 630 permitted-but-not-yet-drilled (status LOC) wells, measured live 2026-08-25. For permitted inventory use status=\"LOC\", or set includeUndatedRecords to keep undated records (each labelled date_filter_match=\"undated_included\"). Colorado's layer has NO date column at all: a Colorado-only run with this field set now FAILS rather than returning an unfiltered result set labelled as filtered. Every row publishes date_filter_basis, date_filter_applied and date_filter_is_permit_issue_date. Format MUST be YYYY-MM-DD (e.g. 2026-01-15); any other format is rejected and the run fails without billing rather than being silently reinterpreted by ArcGIS's own date parser. Slash forms are rejected on purpose: live-measured against North Dakota, an ambiguous 05/06/2025 is silently read as May 6 (US order) and differs from the June 5 (EU) reading by 8.0% of matching wells, with nothing in the response indicating a format was guessed. Empty = no lower bound."
|
|
5345
|
+
},
|
|
5346
|
+
"includeUndatedRecords": {
|
|
5347
|
+
"type": "boolean",
|
|
5348
|
+
"description": "Only meaningful together with sinceModified, and only on a state that has a date column (North Dakota). When false (the default) a date window drops every record whose date is null — which on North Dakota means all 630 permitted-but-not-yet-drilled LOC wells, i.e. exactly the set a new-permit buyer wants. When true the window becomes (date > value OR date IS NULL) and each undated row is labelled date_filter_match=\"undated_included\", so a record that was never verified to fall inside the window is never presented as though it had been. Note this widens the result set: on North Dakota 6,988 of 43,835 wells carry a null spud date. Applied by default if omitted: false."
|
|
5272
5349
|
},
|
|
5273
5350
|
"maxResults": {
|
|
5274
5351
|
"type": "integer",
|
|
@@ -5279,6 +5356,21 @@
|
|
|
5279
5356
|
"monitor": {
|
|
5280
5357
|
"type": "boolean",
|
|
5281
5358
|
"description": "When scheduled, emit only wells/permits not seen in previous runs — a recurring new-permit alert backed by a key-value store of seen IDs. Applied by default if omitted: false."
|
|
5359
|
+
},
|
|
5360
|
+
"verifyUpstream": {
|
|
5361
|
+
"type": "boolean",
|
|
5362
|
+
"description": "Runs a live drift gate against each selected state layer BEFORE any billable row is fetched — a handful of cheap metadata, count-only and group-by requests, none of them billable. It checks that the layer still holds at least its measured floor of records (North Dakota 43,835 and Colorado 84,927 on 2026-08-25), still publishes every column this Actor reads, still returns one pinned canary record with its historical values intact, returns ZERO for an impossible status code, and still publishes its documented status vocabulary. A probe that completes and measures something wrong fails the run and bills nothing; a probe that never completes is treated as an availability problem, and only a load-bearing one of those is fatal. Turn this off only if you accept that a silently emptied or re-scoped layer would go undetected — every row then carries drift_gate_status=\"skipped\". Applied by default if omitted: true."
|
|
5363
|
+
},
|
|
5364
|
+
"simulateOutage": {
|
|
5365
|
+
"type": "string",
|
|
5366
|
+
"description": "Diagnostic only. Forces one class of drift-probe outcome so the gate's own failure paths can be re-proved on demand instead of only during a real outage. 'drift_required_unavailable' and 'drift_positive_unavailable' must FAIL the run and bill nothing; 'drift_corroborating_unavailable' must SUCCEED with drift_gate_status=\"verified_degraded\"; 'drift_measured_wrong' forces a completed-but-wrong measurement and must fail the run. Leave as 'none' for normal use. Applied by default if omitted: \"none\".",
|
|
5367
|
+
"enum": [
|
|
5368
|
+
"none",
|
|
5369
|
+
"drift_required_unavailable",
|
|
5370
|
+
"drift_positive_unavailable",
|
|
5371
|
+
"drift_corroborating_unavailable",
|
|
5372
|
+
"drift_measured_wrong"
|
|
5373
|
+
]
|
|
5282
5374
|
}
|
|
5283
5375
|
},
|
|
5284
5376
|
"required": [
|
|
@@ -5679,6 +5771,77 @@
|
|
|
5679
5771
|
]
|
|
5680
5772
|
}
|
|
5681
5773
|
},
|
|
5774
|
+
{
|
|
5775
|
+
"slug": "reg-cf-lifecycle-monitor",
|
|
5776
|
+
"actorId": "malonestar/reg-cf-lifecycle-monitor",
|
|
5777
|
+
"title": "Reg CF Crowdfunding Lifecycle & Outcomes Monitor — SEC EDGAR",
|
|
5778
|
+
"description": "Track US Regulation Crowdfunding beyond the offering feed: new Form C filings, C-U funding progress, C-AR annual reports with two-year revenue and net income, and C-TR/C-W terminations — straight from SEC EDGAR, keyless. Feed, issuer, outcomes and delta modes with honest per-row provenance.",
|
|
5779
|
+
"categories": [
|
|
5780
|
+
"BUSINESS",
|
|
5781
|
+
"DEVELOPER_TOOLS",
|
|
5782
|
+
"AGENTS"
|
|
5783
|
+
],
|
|
5784
|
+
"storeUrl": "https://apify.com/malonestar/reg-cf-lifecycle-monitor",
|
|
5785
|
+
"inputSchema": {
|
|
5786
|
+
"type": "object",
|
|
5787
|
+
"properties": {
|
|
5788
|
+
"mode": {
|
|
5789
|
+
"type": "string",
|
|
5790
|
+
"description": "What to return. \"feed\" = Regulation Crowdfunding lifecycle events (Form C offerings, C-U progress updates, C-AR annual reports, C-TR terminations, C-W withdrawals) in a date window. \"outcomes\" = Form C-AR annual reports with the issuer's two-year financials (total assets, revenue, net income, debt) parsed from each filing's XML. \"issuer\" = every Reg CF filing for one company (by cik or issuerQuery), XML-enriched. \"delta\" = only filings new since your last run for this scope, tracked in the named key-value store 'reg-cf-lifecycle-baseline'; the FIRST delta run stores a baseline and fails with an explanatory message rather than billing the whole feed as new. Example: \"feed\".",
|
|
5791
|
+
"enum": [
|
|
5792
|
+
"feed",
|
|
5793
|
+
"outcomes",
|
|
5794
|
+
"issuer",
|
|
5795
|
+
"delta"
|
|
5796
|
+
]
|
|
5797
|
+
},
|
|
5798
|
+
"formTypes": {
|
|
5799
|
+
"type": "array",
|
|
5800
|
+
"description": "Which Reg CF form types to include (feed and delta modes; outcomes mode always uses C-AR only). Allowed values: C (new offering), C-U (progress update), C-AR (annual report), C-TR (termination of reporting), C-W (offering withdrawal). Leave empty for all five. Amendments (e.g. C/A) are included under their base form and flagged is_amendment. Example: [\"C\",\"C-U\",\"C-AR\",\"C-TR\",\"C-W\"].",
|
|
5801
|
+
"items": {
|
|
5802
|
+
"type": "string"
|
|
5803
|
+
}
|
|
5804
|
+
},
|
|
5805
|
+
"startDate": {
|
|
5806
|
+
"type": "string",
|
|
5807
|
+
"description": "Only include filings filed on or after this date. STRICTLY YYYY-MM-DD (e.g. 2026-08-01) — slash dates, month names and compact dates are rejected with a loud failure because they cannot be applied unambiguously. Leave blank for no lower bound (Regulation Crowdfunding began 2016-05-16). Example: \"2026-08-01\"."
|
|
5808
|
+
},
|
|
5809
|
+
"endDate": {
|
|
5810
|
+
"type": "string",
|
|
5811
|
+
"description": "Only include filings filed on or before this date. STRICTLY YYYY-MM-DD. Leave blank for no upper bound (today). An unusable value fails the run loudly; nothing is billed."
|
|
5812
|
+
},
|
|
5813
|
+
"state": {
|
|
5814
|
+
"type": "string",
|
|
5815
|
+
"description": "Optional 2-letter US state/territory code (e.g. TX) filtering on the issuer's principal business address. Applied server-side via the EDGAR locationCodes parameter AND re-validated on every returned row — if EDGAR ever stops applying the filter the run fails loudly instead of shipping a national feed labelled as one state."
|
|
5816
|
+
},
|
|
5817
|
+
"portalQuery": {
|
|
5818
|
+
"type": "string",
|
|
5819
|
+
"description": "Optional funding-portal (intermediary) name, e.g. \"Wefunder Portal\" or \"Honeycomb Portal\". Matched as an exact phrase via EDGAR full-text search against the filing documents (the portal's legal name appears in every Form C / C-U XML), so use the portal's legal name as it appears in filings. This is a document-text match, not a structured field filter."
|
|
5820
|
+
},
|
|
5821
|
+
"cik": {
|
|
5822
|
+
"type": "string",
|
|
5823
|
+
"description": "SEC CIK number of the issuer for issuer mode, with or without leading zeros (e.g. 1373217). Find it on any EDGAR filing page. issuer mode requires cik or issuerQuery."
|
|
5824
|
+
},
|
|
5825
|
+
"issuerQuery": {
|
|
5826
|
+
"type": "string",
|
|
5827
|
+
"description": "Company-name phrase for issuer mode when you do not know the CIK, e.g. \"Bean Box\". Matched as a phrase via EDGAR full-text search; prefer cik for an exact match."
|
|
5828
|
+
},
|
|
5829
|
+
"enrichXml": {
|
|
5830
|
+
"type": "boolean",
|
|
5831
|
+
"description": "In feed/delta modes, also fetch each filing's primary_doc.xml to add issuer website, legal status, funding portal name/CIK/CRD, offering amounts and deadline, C-U progress-update text, and the two-year financials. Adds one polite EDGAR request per row (slower). outcomes and issuer modes always enrich. When off, those columns are null with xml_status=\"not_fetched\" — null means NOT FETCHED, never \"none\". Applied by default if omitted: false."
|
|
5832
|
+
},
|
|
5833
|
+
"maxResults": {
|
|
5834
|
+
"type": "integer",
|
|
5835
|
+
"description": "Hard cap on rows emitted AND billed this run (newest filings first). Every row carries matched_total and results_truncated so a capped answer is never mistaken for a complete one. Example: 200.",
|
|
5836
|
+
"minimum": 1,
|
|
5837
|
+
"maximum": 5000
|
|
5838
|
+
}
|
|
5839
|
+
},
|
|
5840
|
+
"required": [
|
|
5841
|
+
"mode"
|
|
5842
|
+
]
|
|
5843
|
+
}
|
|
5844
|
+
},
|
|
5682
5845
|
{
|
|
5683
5846
|
"slug": "ria-registration-delta-monitor",
|
|
5684
5847
|
"actorId": "malonestar/ria-registration-delta-monitor",
|
|
@@ -5793,7 +5956,7 @@
|
|
|
5793
5956
|
},
|
|
5794
5957
|
"query": {
|
|
5795
5958
|
"type": "string",
|
|
5796
|
-
"description": "
|
|
5959
|
+
"description": "Case-insensitive substring match over the borrower name AND the lender name, e.g. 'acme diner' or 'wells fargo'. A row is kept if EITHER name contains the text. data.sba.gov has no query API, so this is applied while the published CSVs are streamed - it narrows the answer, it does not speed up the scan. Combined with the other filters using AND. Empty = no free-text filter. Every emitted row reports query_applied so you can see it was honoured."
|
|
5797
5960
|
},
|
|
5798
5961
|
"sinceDate": {
|
|
5799
5962
|
"type": "string",
|
|
@@ -5808,6 +5971,10 @@
|
|
|
5808
5971
|
"description": "Only return loans whose gross approval amount is at least this many dollars. Empty = no minimum.",
|
|
5809
5972
|
"minimum": 0
|
|
5810
5973
|
},
|
|
5974
|
+
"order": {
|
|
5975
|
+
"type": "string",
|
|
5976
|
+
"description": "Which SBA FOIA file the run reads FIRST: 'newest' (default) starts with the file covering the most recent fiscal years, 'oldest' starts with FY1991. Empty means newest. Any other value is rejected and the run FAILS without billing, rather than quietly giving you the opposite of what you asked for. This matters because results are the first N matches in read order: before this existed, files were read in SBA's own catalog order, which is oldest-first, so a bare {program:'7a', state:'CA'} returned loans approved in 1990. IMPORTANT - this orders FILES, not ROWS. SBA publishes each file ascending by ApprovalDate (measured 2026-08-25), and this Actor does not re-sort rows, so 'newest' returns the OLDEST rows of the NEWEST file. Use sinceDate / untilDate / fiscalYear to place a recent window. Every row reports file_order and row_order_note. Example: \"newest\"."
|
|
5977
|
+
},
|
|
5811
5978
|
"mode": {
|
|
5812
5979
|
"type": "string",
|
|
5813
5980
|
"description": "'loans' emits one normalized loan row per result (with risk flags). 'rollup-by-lender', 'rollup-by-naics', and 'rollup-by-state' instead emit one aggregate row per lender / NAICS industry / state (loan count, total & avg approved $, charge-off/default proxy rate, jobs supported). Example: \"loans\".",
|
|
@@ -5824,13 +5991,13 @@
|
|
|
5824
5991
|
},
|
|
5825
5992
|
"maxResults": {
|
|
5826
5993
|
"type": "integer",
|
|
5827
|
-
"description": "Hard cap on the number of
|
|
5994
|
+
"description": "Hard cap on the number of rows EMITTED, and therefore on what the run can bill: one emitted row is one billable result. Applies to loan rows and rollup rows alike. Bounds emission only - use maxScanRows to bound how much of the (large) source files is read. In rollup modes, rollups are computed over the loans fetched under this cap. WHICH rows you get is decided by the read order: results are the first N matches in read order, which the `order` input controls (newest-first by default). Example: 50. Applied by default if omitted: 1000.",
|
|
5828
5995
|
"minimum": 1,
|
|
5829
5996
|
"maximum": 200000
|
|
5830
5997
|
},
|
|
5831
5998
|
"maxScanRows": {
|
|
5832
5999
|
"type": "integer",
|
|
5833
|
-
"description": "Upper bound on how many CSV rows are scanned per FOIA file before
|
|
6000
|
+
"description": "Upper bound on how many CSV rows are scanned per FOIA file before the scan of that file stops. This bounds READING, not emission, and it is not a cost cap - only maxResults bounds what a run can charge for. The read order (the `order` input) decides which file this budget lands on first: with the default newest-first it is spent on the most recent fiscal-year file. Raise for exhaustive rollups over the full loan history; lower for faster sampling. Only matters when filters match few rows. Applied by default if omitted: 500000.",
|
|
5834
6001
|
"minimum": 1000,
|
|
5835
6002
|
"maximum": 5000000
|
|
5836
6003
|
}
|
|
@@ -5841,7 +6008,7 @@
|
|
|
5841
6008
|
"slug": "sbom-vulnerability-rollup",
|
|
5842
6009
|
"actorId": "malonestar/sbom-vulnerability-rollup",
|
|
5843
6010
|
"title": "SBOM Vulnerability Scanner — Lockfile CVE Scan (OSV/KEV)",
|
|
5844
|
-
"description": "SBOM vulnerability scanner: paste an npm, pip or go lockfile and get a prioritized CVE report with upgrade targets. Batch-queries OSV.dev, flags CISA KEV known-exploited vulns, adds NVD CVSS, and computes the minimum fix version per package plus a severity rollup. Keyless.",
|
|
6011
|
+
"description": "SBOM vulnerability scanner at $0.02 per finding: paste an npm, pip or go lockfile and get a prioritized CVE report with upgrade targets. Batch-queries OSV.dev, flags CISA KEV known-exploited vulns, adds NVD CVSS, and computes the minimum fix version per package plus a severity rollup. Keyless.",
|
|
5845
6012
|
"categories": [
|
|
5846
6013
|
"DEVELOPER_TOOLS",
|
|
5847
6014
|
"AI",
|
|
@@ -5962,7 +6129,7 @@
|
|
|
5962
6129
|
"slug": "site-due-diligence-bundle",
|
|
5963
6130
|
"actorId": "malonestar/site-due-diligence-bundle",
|
|
5964
6131
|
"title": "Environmental Due Diligence Bundle: 20-Layer Site Scorecard",
|
|
5965
|
-
"description": "Environmental due diligence
|
|
6132
|
+
"description": "Environmental due diligence at $0.10 per property - one row per site, not per layer. Lat/lon plus radius returns a go/caution/no-go fatal-flaw verdict and 0-100 score across 20 federal layers: EPA contamination, FEMA flood, NWI wetlands, ESA habitat, karst, landslide, levee, dams, CBRS, pipelines.",
|
|
5966
6133
|
"categories": [
|
|
5967
6134
|
"REAL_ESTATE",
|
|
5968
6135
|
"DEVELOPER_TOOLS",
|
package/src/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* gov-data-mcp — MCP server exposing
|
|
3
|
+
* gov-data-mcp — MCP server exposing every published US government open-data
|
|
4
|
+
* Actor in the bundled catalog. The count is deliberately NOT written down
|
|
5
|
+
* here; it is read from src/catalog.json at runtime, because a number in a
|
|
6
|
+
* comment rots the moment a batch ships and nothing fails when it does.
|
|
4
7
|
*
|
|
5
8
|
* Wiring only. All decision logic lives in src/tools.js (pure, offline-tested)
|
|
6
9
|
* and src/apify.js (fetch injected). A test asserts this file holds no logic
|
package/src/tools.js
CHANGED
|
@@ -4,10 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Actors promoted to first-class MCP tools. The catalog holds
|
|
8
|
-
* an agent
|
|
9
|
-
* of every request. These are the
|
|
10
|
-
*
|
|
7
|
+
* Actors promoted to first-class MCP tools. The catalog holds well over a
|
|
8
|
+
* hundred actors; handing an agent that many tool definitions degrades tool
|
|
9
|
+
* selection and blows up the context of every request. These are the
|
|
10
|
+
* highest-signal ones (revenue-proven plus the flagships); every other actor
|
|
11
|
+
* stays reachable through search/describe/run.
|
|
12
|
+
*
|
|
13
|
+
* No count is written down in this file on purpose — the catalog is the only
|
|
14
|
+
* source of truth for how many there are, and prose counts here rotted from
|
|
15
|
+
* 95 to 109 to 114 to 116 without a single test going red.
|
|
11
16
|
*/
|
|
12
17
|
export const FEATURED = [
|
|
13
18
|
'site-due-diligence-bundle',
|
|
@@ -47,13 +52,74 @@ function truncate(s, n) {
|
|
|
47
52
|
return s.length <= n ? s : s.slice(0, n - 1).trimEnd() + '…';
|
|
48
53
|
}
|
|
49
54
|
|
|
55
|
+
/**
|
|
56
|
+
* MCP tool annotations — the machine-readable half of "what does this do to the
|
|
57
|
+
* world before I call it".
|
|
58
|
+
*
|
|
59
|
+
* WHY `readOnlyHint: false` ON THE DATA TOOLS, despite them only ever reading:
|
|
60
|
+
* they never write to any government system, but every call starts a metered
|
|
61
|
+
* run on the caller's own Apify account and costs them money. `readOnlyHint`
|
|
62
|
+
* means "does not modify its environment", and an agent that reads `true`
|
|
63
|
+
* reasonably concludes the call is free to make speculatively — which is the
|
|
64
|
+
* one wrong conclusion that costs the caller real money. Billing is a side
|
|
65
|
+
* effect. We declare it rather than hide it behind a comfortable `true`, and
|
|
66
|
+
* `destructiveHint: false` carries the other half of the truth: nothing is
|
|
67
|
+
* destroyed, no external state is altered, and a call is always safe to make
|
|
68
|
+
* once you accept its cost.
|
|
69
|
+
*
|
|
70
|
+
* `idempotentHint: false` because these read live sources — the same input
|
|
71
|
+
* tomorrow can legitimately return different rows, and a caller must not cache
|
|
72
|
+
* a flood or sanctions answer as if it were fixed.
|
|
73
|
+
*/
|
|
74
|
+
export const ANNOTATIONS = {
|
|
75
|
+
/** Reads the bundled catalog. No network, no run, no charge. */
|
|
76
|
+
CATALOG_LOCAL: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
77
|
+
/** Starts a billed Apify run against a live government source. */
|
|
78
|
+
BILLED_LIVE_READ: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const COST_NOTE =
|
|
82
|
+
'COST AND SIDE EFFECTS: read-only with respect to the government source — it never writes to any external system — '
|
|
83
|
+
+ 'but each call starts a metered run on YOUR Apify account and is billed per result row at the rate published on the Store page. '
|
|
84
|
+
+ 'Nothing is charged when a run fails.';
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Routing notes for tools whose scope genuinely overlaps.
|
|
88
|
+
*
|
|
89
|
+
* Four of the featured tools answer adjacent questions about the same
|
|
90
|
+
* coordinate, and an agent handed all four with no guidance picks by keyword
|
|
91
|
+
* overlap rather than by which regulatory question is actually being asked.
|
|
92
|
+
* These sentences say, in each tool's own description, when it is the wrong
|
|
93
|
+
* choice — which is the part a bare capability blurb never tells you.
|
|
94
|
+
*/
|
|
95
|
+
export const ROUTING = {
|
|
96
|
+
'site-due-diligence-bundle':
|
|
97
|
+
'CHOOSE THIS when you want one combined go / caution / no-go verdict for a coordinate across many unrelated layers. '
|
|
98
|
+
+ 'It is NOT an ASTM records review: its contamination layer reads RCRA and TRI through ECHO only and omits coordinate-less Superfund records. '
|
|
99
|
+
+ 'For a contamination-first question use epa-contaminated-site-screener.',
|
|
100
|
+
'epa-contaminated-site-screener':
|
|
101
|
+
'CHOOSE THIS for the ASTM E1527-21 Phase I records search at regulation distances around one or more properties. '
|
|
102
|
+
+ 'For a single combined verdict across twenty unrelated layers use site-due-diligence-bundle; for drinking-water quality use epa-drinking-water-quality-screener.',
|
|
103
|
+
'fws-wetlands-proximity-screener':
|
|
104
|
+
'CHOOSE THIS for National Wetlands Inventory polygons and their decode columns within a radius. '
|
|
105
|
+
+ 'It does NOT answer Clean Water Act §404 jurisdiction — for surface-water features and relative permanence use nhd-surface-water-404-screener. The two are usually needed together.',
|
|
106
|
+
'nhd-surface-water-404-screener':
|
|
107
|
+
'CHOOSE THIS for Clean Water Act §404 surface-water screening — streams, waterbodies and their relative permanence. '
|
|
108
|
+
+ 'For mapped wetland polygons use fws-wetlands-proximity-screener.',
|
|
109
|
+
'epa-drinking-water-quality-screener':
|
|
110
|
+
'CHOOSE THIS for public water-system quality: SDWA violations, lead 90th-percentile results and PFAS occurrence. '
|
|
111
|
+
+ 'It is NOT a property contamination screen — for soil and groundwater records at a site use epa-contaminated-site-screener.',
|
|
112
|
+
};
|
|
113
|
+
|
|
50
114
|
export function featuredToolDefinitions(index) {
|
|
51
115
|
return FEATURED.filter(s => index.bySlug.has(s)).map(slug => {
|
|
52
116
|
const a = index.bySlug.get(slug);
|
|
117
|
+
const routing = ROUTING[slug] ? ` ${ROUTING[slug]}` : '';
|
|
53
118
|
return {
|
|
54
119
|
name: toolNameFor(slug),
|
|
55
|
-
description: `${a.title}. ${truncate(a.description, 400)} Reads live from the official government source. Store page: ${a.storeUrl}`,
|
|
120
|
+
description: `${a.title}. ${truncate(a.description, 400)}${routing} Reads live from the official government source. ${COST_NOTE} Store page: ${a.storeUrl}`,
|
|
56
121
|
inputSchema: a.inputSchema,
|
|
122
|
+
annotations: { title: a.title, ...ANNOTATIONS.BILLED_LIVE_READ },
|
|
57
123
|
};
|
|
58
124
|
});
|
|
59
125
|
}
|
|
@@ -63,7 +129,8 @@ export function metaToolDefinitions(index) {
|
|
|
63
129
|
return [
|
|
64
130
|
{
|
|
65
131
|
name: META_TOOLS.SEARCH,
|
|
66
|
-
description: `Search the full catalog of ${n} US government data tools by keyword, agency, or topic (e.g. "wetlands", "FDIC", "flood", "drone airspace", "business licenses"). Returns matching tool names with descriptions. Use this first when the task is not covered by one of the dedicated tools above.`,
|
|
132
|
+
description: `Search the full catalog of ${n} US government data tools by keyword, agency, or topic (e.g. "wetlands", "FDIC", "flood", "drone airspace", "business licenses"). Returns matching tool names with descriptions. Use this first when the task is not covered by one of the dedicated tools above. FREE: reads a catalog bundled with this server — no network call, no run, nothing charged.`,
|
|
133
|
+
annotations: { title: 'Search the government data catalog', ...ANNOTATIONS.CATALOG_LOCAL },
|
|
67
134
|
inputSchema: {
|
|
68
135
|
type: 'object',
|
|
69
136
|
properties: {
|
|
@@ -75,7 +142,8 @@ export function metaToolDefinitions(index) {
|
|
|
75
142
|
},
|
|
76
143
|
{
|
|
77
144
|
name: META_TOOLS.DESCRIBE,
|
|
78
|
-
description: `Return the full input schema and documentation for any one of the ${n} tools in the catalog. Call this before ${META_TOOLS.RUN} so the input is correctly shaped.`,
|
|
145
|
+
description: `Return the full input schema and documentation for any one of the ${n} tools in the catalog. Call this before ${META_TOOLS.RUN} so the input is correctly shaped. FREE: reads a catalog bundled with this server — no network call, no run, nothing charged.`,
|
|
146
|
+
annotations: { title: 'Describe one government data tool', ...ANNOTATIONS.CATALOG_LOCAL },
|
|
79
147
|
inputSchema: {
|
|
80
148
|
type: 'object',
|
|
81
149
|
properties: {
|
|
@@ -86,7 +154,9 @@ export function metaToolDefinitions(index) {
|
|
|
86
154
|
},
|
|
87
155
|
{
|
|
88
156
|
name: META_TOOLS.RUN,
|
|
89
|
-
description: `Run any one of the ${n} catalog tools with the given input and return its rows.
|
|
157
|
+
description: `Run any one of the ${n} catalog tools with the given input and return its rows. Call ${META_TOOLS.DESCRIBE} first to shape the input. `
|
|
158
|
+
+ `${COST_NOTE} A run that FAILS returns an error and no rows rather than an empty result, so a zero-row answer here always means the source was reached and genuinely matched nothing.`,
|
|
159
|
+
annotations: { title: 'Run any government data tool', ...ANNOTATIONS.BILLED_LIVE_READ },
|
|
90
160
|
inputSchema: {
|
|
91
161
|
type: 'object',
|
|
92
162
|
properties: {
|