gov-data-mcp 1.2.6 → 1.2.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gov-data-mcp",
3
- "version": "1.2.6",
3
+ "version": "1.2.8",
4
4
  "mcpName": "io.github.malonestar/gov-data-mcp",
5
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",
package/src/catalog.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-10-07T07:53:26.647Z",
2
+ "generatedAt": "2026-11-12T02:23:08.774Z",
3
3
  "owner": "malonestar",
4
4
  "count": 123,
5
5
  "actors": [
@@ -85,7 +85,7 @@
85
85
  },
86
86
  "maxResults": {
87
87
  "type": "integer",
88
- "description": "Maximum number of lead rows to emit (caps your cost — you are billed per result row). Hard cap 10,000 per run. Example: 100.",
88
+ "description": "Maximum number of lead rows to emit (caps your cost — you are billed per result row). Hard cap 10,000 per run. Example: 40. Applied by default if omitted: 100.",
89
89
  "minimum": 1,
90
90
  "maximum": 10000
91
91
  }
@@ -95,7 +95,7 @@
95
95
  "county": "cook-il",
96
96
  "absenteeTier": "out_of_state",
97
97
  "propertyClassPrefix": "2",
98
- "maxResults": 100
98
+ "maxResults": 40
99
99
  },
100
100
  "mustSupply": [],
101
101
  "examples": [
@@ -195,6 +195,12 @@
195
195
  "description": "A deed is flagged cash_sale=true when no mortgage (MTGE) is recorded against the same borough-block-lot within this many days of the deed recording date. cash_sale is null (never true) when the mortgage lookup could not be completed for that parcel - see mortgage_status. Applied by default if omitted: 45.",
196
196
  "minimum": 1,
197
197
  "maximum": 180
198
+ },
199
+ "runBudgetSeconds": {
200
+ "type": "integer",
201
+ "description": "Optional wall-clock budget for the whole run. NYC Open Data (data.cityofnewyork.us) is sometimes very slow; with a budget the run ends on time instead of dragging on. If the budget is reached before any deed can be answered, the run FAILS and nothing is billed. If it is reached later, the deeds already joined are emitted and every row says what was cut (run_deadline_hit=true, run_deadline_note): a cut mortgage lookup leaves cash_sale null (never true), a cut Parties batch leaves the buyer/seller flags null, and a cut scan may return fewer deeds than maxResults. Leave empty for no budget (the run takes as long as the source needs). Example: 240.",
202
+ "minimum": 30,
203
+ "maximum": 3600
198
204
  }
199
205
  }
200
206
  },
@@ -204,7 +210,8 @@
204
210
  ],
205
211
  "docTypes": [
206
212
  "DEED"
207
- ]
213
+ ],
214
+ "runBudgetSeconds": 240
208
215
  },
209
216
  "mustSupply": [],
210
217
  "examples": [
@@ -1997,7 +2004,7 @@
1997
2004
  "properties": {
1998
2005
  "cities": {
1999
2006
  "type": "array",
2000
- "description": "City slugs to pull business licenses from. Live and wired: chicago, los-angeles, san-francisco, new-york, seattle. Any other slug produces an explicit unknown_city / not_wired row rather than being silently dropped. Leave empty to query all live cities. Example: [\"chicago\"]. Applied by default if omitted: [\"chicago\",\"los-angeles\",\"san-francisco\",\"new-york\",\"seattle\"].",
2007
+ "description": "City slugs to pull business licenses from. Live and wired: chicago, los-angeles, san-francisco, new-york, seattle. Any other slug produces an explicit unknown_city / not_wired row rather than being silently dropped. Leave empty to query all live cities. Example: [\"chicago\",\"seattle\"]. Applied by default if omitted: [\"chicago\",\"los-angeles\",\"san-francisco\",\"new-york\",\"seattle\"].",
2001
2008
  "items": {
2002
2009
  "type": "string"
2003
2010
  }
@@ -2040,7 +2047,8 @@
2040
2047
  },
2041
2048
  "exampleInput": {
2042
2049
  "cities": [
2043
- "chicago"
2050
+ "chicago",
2051
+ "seattle"
2044
2052
  ],
2045
2053
  "since": "2025-01-01",
2046
2054
  "onlyNewLicenses": true,
@@ -2546,6 +2554,12 @@
2546
2554
  "description": "Maximum number of ranked parcel leads to emit (highest distress score first). You are billed per result, so this caps your spend. Example: 100.",
2547
2555
  "minimum": 1,
2548
2556
  "maximum": 5000
2557
+ },
2558
+ "runBudgetSeconds": {
2559
+ "type": "integer",
2560
+ "description": "Optional wall-clock budget for the New York City leg. NYC Open Data (data.cityofnewyork.us) is sometimes very slow; with a budget the run ends on time instead of dragging on. If the budget runs out before all three distress signal sources are read in full, the run FAILS and nothing is billed (a score over part of the data would be wrong). If it runs out only while owner contacts are being fetched, the ranked parcels are still emitted with complete scores and every row says so: run_deadline_hit=true and owner_contact_checked=false. Leave empty for no budget (the run takes as long as the source needs). Detroit, Philadelphia and Chicago are not budgeted. Example: 240.",
2561
+ "minimum": 30,
2562
+ "maximum": 3600
2549
2563
  }
2550
2564
  }
2551
2565
  },
@@ -2556,7 +2570,8 @@
2556
2570
  "borough": "BRONX",
2557
2571
  "minSignals": 2,
2558
2572
  "lookbackMonths": 12,
2559
- "maxResults": 100
2573
+ "maxResults": 100,
2574
+ "runBudgetSeconds": 240
2560
2575
  },
2561
2576
  "mustSupply": [],
2562
2577
  "examples": [
@@ -3785,7 +3800,7 @@
3785
3800
  },
3786
3801
  "runBudgetSeconds": {
3787
3802
  "type": "integer",
3788
- "description": "Total time budget for all upstream requests including retries. Requests stop rather than retry past this budget, so a long EPA outage fails loudly instead of hanging. Example: 900.",
3803
+ "description": "Total time budget for all upstream requests including retries. Requests stop rather than retry past this budget, so a long EPA outage fails loudly instead of hanging. Prefilled at 240 s so a demo or QA run finishes inside Apify's 5-minute limit even when EPA is slow; when omitted the run allows 900 s. Example: 240.",
3789
3804
  "minimum": 60,
3790
3805
  "maximum": 7200
3791
3806
  },
@@ -3834,7 +3849,7 @@
3834
3849
  "violationYears": 10,
3835
3850
  "maxViolationDetails": 25,
3836
3851
  "maxAssets": 250,
3837
- "runBudgetSeconds": 900,
3852
+ "runBudgetSeconds": 240,
3838
3853
  "refreshPfasCache": false,
3839
3854
  "simulateOutage": "none"
3840
3855
  },
@@ -5844,7 +5859,7 @@
5844
5859
  "properties": {
5845
5860
  "state": {
5846
5861
  "type": "string",
5847
- "description": "US state to scope the cohort, e.g. CA, TX, NY. Strongly recommended: it focuses the run and makes peer percentiles state-level. Empty = the entire country (slower; national peer scoring). Example: \"TX\"."
5862
+ "description": "US state to scope the cohort, e.g. CA, TX, NY. Strongly recommended: it focuses the run and makes peer percentiles state-level. Empty = the entire country (slower; national peer scoring). Example: \"CO\"."
5848
5863
  },
5849
5864
  "institutionType": {
5850
5865
  "type": "string",
@@ -5914,7 +5929,7 @@
5914
5929
  }
5915
5930
  },
5916
5931
  "exampleInput": {
5917
- "state": "TX",
5932
+ "state": "CO",
5918
5933
  "institutionType": "bank",
5919
5934
  "mode": "stress",
5920
5935
  "peerBasis": "business_line",
@@ -6466,7 +6481,7 @@
6466
6481
  "slug": "fema-repetitive-loss-flood-market-screener",
6467
6482
  "actorId": "malonestar/fema-repetitive-loss-flood-market-screener",
6468
6483
  "title": "FEMA NFIP Repetitive Loss & Flood Insurance Market Screener",
6469
- "description": "Resolve any US coordinate to its NFIP community, then return that community's repetitive-loss and severe-repetitive-loss property rollup, CRS class and premium discounts, NFIP participation status, and county flood-insurance market penetration. Four FEMA OpenFEMA datasets joined in one call.",
6484
+ "description": "Resolve any US coordinate to its NFIP community using FEMA's flood-map (NFHL) jurisdictions, then return that community's repetitive-loss and severe-repetitive-loss rollup, CRS class and premium discount, NFIP participation, and county flood-insurance penetration. FEMA NFHL + 3 OpenFEMA datasets.",
6470
6485
  "categories": [
6471
6486
  "REAL_ESTATE",
6472
6487
  "DEVELOPER_TOOLS",
@@ -6496,18 +6511,18 @@
6496
6511
  "properties": {
6497
6512
  "assets": {
6498
6513
  "type": "array",
6499
- "description": "Sites to screen. Each item is {\"lat\": <number>, \"lon\": <number>, \"label\": \"<your reference>\"}. Each site is resolved to the NFIP community whose published boundary contains it, then answered at community and county scope. FEMA redacts repetitive-loss property coordinates to one decimal place (roughly +/-5 to +/-55 km), so no radius or nearest-property distance is derivable from this data and none is offered. Maximum 25 sites per run; each distinct state costs one community-boundary download. Example: [{\"lat\":39.7392,\"lon\":-104.9903,\"label\":\"Denver City Hall, CO\"},{\"lat\":39.7047,\"lon\":-105.0814,\"label\":\"Lakewood, CO (city inside Jefferson County)\"},{\"lat\":40.015,\"lon\":-105.2705,\"label\":\"Boulder, CO\"},{\"lat\":40.53,\"lon\":-104.3,\"label\":\"Rural Weld County, CO (unincorporated)\"},{\"lat\":29.9511,\"lon\":-90.0715,\"label\":\"New Orleans, LA\"}].",
6514
+ "description": "Sites to screen. Each item is {\"lat\": <number>, \"lon\": <number>, \"label\": \"<your reference>\"}. Each site is resolved to the NFIP community whose FEMA NFHL Political Jurisdictions polygon contains it, then answered at community and county scope. A site outside every NFHL polygon is reported as not mapped, with null metrics, never as \"no community\". FEMA redacts repetitive-loss property coordinates to one decimal place (roughly +/-5 to +/-55 km), so no radius or nearest-property distance is derivable from this data and none is offered. Maximum 25 sites per run. Example: [{\"lat\":39.7392,\"lon\":-104.9903,\"label\":\"Denver City Hall, CO\"},{\"lat\":39.7047,\"lon\":-105.0814,\"label\":\"Lakewood, CO (city inside Jefferson County)\"},{\"lat\":40.015,\"lon\":-105.2705,\"label\":\"Boulder, CO\"},{\"lat\":40.53,\"lon\":-104.3,\"label\":\"Rural Weld County, CO (unincorporated)\"},{\"lat\":29.9511,\"lon\":-90.0715,\"label\":\"New Orleans, LA\"}].",
6500
6515
  "items": {
6501
6516
  "type": "string"
6502
6517
  }
6503
6518
  },
6504
6519
  "includeCountyCommunity": {
6505
6520
  "type": "boolean",
6506
- "description": "When a site sits inside an incorporated place, the county or parish is usually ALSO an NFIP community covering unincorporated areas, with its own CRS class and its own repetitive-loss rollup. Leave on to receive a profile row for both. Turn off to receive only the governing municipal community. Defaults to on when omitted. Example: true."
6521
+ "description": "When a site sits inside an incorporated place, the county or parish is usually ALSO an NFIP community covering unincorporated areas, with its own CRS class and its own repetitive-loss rollup. Leave on to receive a profile row for both: the county community is looked up from FEMA NFHL and reported as not identified (never guessed) where NFHL naming cannot single it out, for example in township states. Turn off to receive only the governing community. Defaults to on when omitted. Example: true."
6507
6522
  },
6508
6523
  "includeTribalEtjLayer": {
6509
6524
  "type": "boolean",
6510
- "description": "FEMA publishes 608 tribal nation, extraterritorial-jurisdiction and special land-use-authority community polygons with no state or county code, so a state-scoped boundary read is structurally blind to them. Leave on to include them (one extra request per state). When off, tribal/ETJ coverage is reported as not checked rather than as a negative. Defaults to on when omitted. Example: true."
6525
+ "description": "Kept for compatibility. Since 2026-11-12 there is no separate tribal / extraterritorial-jurisdiction pass: FEMA retired the OpenFEMA layer that carried those polygons. Tribal NFIP communities that FEMA maps in NFHL are resolved by the same point lookup as any other community whether this is on or off; NFHL has no ETJ or SLUA layer. Every row carries a tribal_etj_note saying so. Example: true."
6511
6526
  },
6512
6527
  "includeLossProperties": {
6513
6528
  "type": "boolean",
@@ -6533,7 +6548,9 @@
6533
6548
  "geo",
6534
6549
  "canary",
6535
6550
  "negative_control",
6536
- "tribal_etj"
6551
+ "tribal_etj",
6552
+ "nfhl",
6553
+ "county_community"
6537
6554
  ]
6538
6555
  }
6539
6556
  },
@@ -8622,7 +8639,7 @@
8622
8639
  },
8623
8640
  "maxResults": {
8624
8641
  "type": "integer",
8625
- "description": "Maximum number of unified property rows to push to the dataset (each row = 1 billed result). 1-25000. Example: 500. Applied by default if omitted: 1000.",
8642
+ "description": "Maximum number of unified property rows to push to the dataset (each row = 1 billed result). 1-25000. Example: 150. Applied by default if omitted: 1000.",
8626
8643
  "minimum": 1,
8627
8644
  "maximum": 25000
8628
8645
  }
@@ -8641,7 +8658,7 @@
8641
8658
  "PUBLIC_HOUSING"
8642
8659
  ],
8643
8660
  "includeOpportunityZoneFlag": true,
8644
- "maxResults": 500
8661
+ "maxResults": 150
8645
8662
  },
8646
8663
  "mustSupply": [
8647
8664
  "states"
@@ -8699,7 +8716,7 @@
8699
8716
  "properties": {
8700
8717
  "assets": {
8701
8718
  "type": "array",
8702
- "description": "List of points to check against the HUD designations that grant the 130% LIHTC eligible-basis boost under IRC Sec. 42(d)(5)(B): Qualified Census Tracts (current and prior year) and Difficult Development Areas. Each item is an object with numeric lat and lon (WGS84 decimal degrees) and an optional label echoed into the output. One billable result row is produced per asset. Example: [{\"lat\":40.815,\"lon\":-73.904,\"label\":\"South Bronx, NY (Qualified Census Tract)\"},{\"lat\":34.073,\"lon\":-118.4,\"label\":\"Beverly Hills, CA (Small Area DDA - boost via DDA, not QCT)\"},{\"lat\":39.07095,\"lon\":-108.55684,\"label\":\"Grand Junction, CO (QCT in the prior year, not the current one)\"},{\"lat\":39,\"lon\":-101.5,\"label\":\"Rural Kansas (genuine clear - neither QCT nor DDA)\"}].",
8719
+ "description": "List of points to check against the HUD designations that grant the 130% LIHTC eligible-basis boost under IRC Sec. 42(d)(5)(B): Qualified Census Tracts (current and prior year) and Difficult Development Areas. Each item is an object with numeric lat and lon (WGS84 decimal degrees) and an optional label echoed into the output. One billable result row is produced per asset. Example: [{\"lat\":40.815,\"lon\":-73.904,\"label\":\"South Bronx, NY (Qualified Census Tract)\"},{\"lat\":34.073,\"lon\":-118.4,\"label\":\"Beverly Hills, CA (Small Area DDA - boost via DDA, not QCT)\"},{\"lat\":39.07095,\"lon\":-108.55684,\"label\":\"Grand Junction, CO (QCT in an earlier vintage, not the current one)\"},{\"lat\":39,\"lon\":-101.5,\"label\":\"Rural Kansas (genuine clear - neither QCT nor DDA)\"}].",
8703
8720
  "items": {
8704
8721
  "type": "string"
8705
8722
  }
@@ -8730,7 +8747,7 @@
8730
8747
  {
8731
8748
  "lat": 39.07095,
8732
8749
  "lon": -108.55684,
8733
- "label": "Grand Junction, CO (QCT in the prior year, not the current one)"
8750
+ "label": "Grand Junction, CO (QCT in an earlier vintage, not the current one)"
8734
8751
  },
8735
8752
  {
8736
8753
  "lat": 39,
@@ -8869,7 +8886,7 @@
8869
8886
  },
8870
8887
  "contractStatuses": {
8871
8888
  "type": "array",
8872
- "description": "TRACS statuses to keep: Active, Expired, Pending, Suspended, Terminated, Executed. Leave empty for all statuses - not defaulted to Active, because a hidden status filter is a hidden answer. Example: [\"Active\"].",
8889
+ "description": "TRACS statuses to keep: Active, Expired, Pending, Suspended, Terminated, Executed. Leave empty for all statuses - not defaulted to Active, because a hidden status filter is a hidden answer. DELIBERATELY NOT PREFILLED: contract status is published by the contract-level table and by the Access substitute, but NOT by the contract-renewal file this actor falls back to when neither is available. A prefilled status filter would make the advertised example unanswerable on that last-resort source, and the run would blame the caller input for an upstream outage.",
8873
8890
  "items": {
8874
8891
  "type": "string"
8875
8892
  }
@@ -8922,9 +8939,6 @@
8922
8939
  "CA"
8923
8940
  ],
8924
8941
  "expiringWithinMonths": 36,
8925
- "contractStatuses": [
8926
- "Active"
8927
- ],
8928
8942
  "maxResults": 300
8929
8943
  },
8930
8944
  "mustSupply": [],
@@ -9025,7 +9039,7 @@
9025
9039
  },
9026
9040
  "maxResults": {
9027
9041
  "type": "integer",
9028
- "description": "Maximum number of queue records to fetch across ALL selected ISOs combined. The cap is applied in ISO order, so a low value truncates the last ISOs: any ISO that is cut short or never reached is marked iso_status=truncated / not_fetched on its iso_summary row and is excluded from withdrawn-project detection for that run. The default is deliberately low (500) so an unconfigured call cannot run away; raise it to about 20000 to pull the whole federation (~18,200 records). Applied by default if omitted: 500.",
9042
+ "description": "Maximum number of queue records to fetch across ALL selected ISOs combined. The cap is applied in ISO order, so a low value truncates the last ISOs: any ISO that is cut short or never reached is marked iso_status=truncated / not_fetched on its iso_summary row and is excluded from withdrawn-project detection for that run. The default is deliberately low (500) so an unconfigured call cannot run away; raise it to about 20000 to pull the whole federation (~18,200 records). Example: 100. Applied by default if omitted: 500.",
9029
9043
  "minimum": 1,
9030
9044
  "maximum": 500000
9031
9045
  }
@@ -9034,7 +9048,8 @@
9034
9048
  "exampleInput": {
9035
9049
  "isos": [
9036
9050
  "SPP"
9037
- ]
9051
+ ],
9052
+ "maxResults": 100
9038
9053
  },
9039
9054
  "mustSupply": [],
9040
9055
  "examples": [
@@ -9361,18 +9376,18 @@
9361
9376
  "event": "apify-default-dataset-item",
9362
9377
  "perResult": true,
9363
9378
  "unit": "result",
9364
- "usdPerUnit": 0.003,
9365
- "usdPer1000": 3,
9379
+ "usdPerUnit": 0.01,
9380
+ "usdPer1000": 10,
9366
9381
  "tierDiscountsUsdPerUnit": {
9367
- "FREE": 0.003,
9368
- "BRONZE": 0.0024,
9369
- "SILVER": 0.0021,
9370
- "GOLD": 0.00165,
9371
- "PLATINUM": 0.0012,
9372
- "DIAMOND": 0.0009
9382
+ "FREE": 0.01,
9383
+ "BRONZE": 0.008,
9384
+ "SILVER": 0.007,
9385
+ "GOLD": 0.0055,
9386
+ "PLATINUM": 0.0055,
9387
+ "DIAMOND": 0.0055
9373
9388
  },
9374
9389
  "actorStartUsd": 0.00005,
9375
- "since": "2026-08-24T23:57:42.560Z"
9390
+ "since": "2026-10-10T23:31:38.895Z"
9376
9391
  },
9377
9392
  "inputSchema": {
9378
9393
  "type": "object",
@@ -9634,11 +9649,11 @@
9634
9649
  "BRONZE": 0.012,
9635
9650
  "SILVER": 0.0105,
9636
9651
  "GOLD": 0.00825,
9637
- "PLATINUM": 0.006,
9638
- "DIAMOND": 0.0045
9652
+ "PLATINUM": 0.00825,
9653
+ "DIAMOND": 0.00825
9639
9654
  },
9640
9655
  "actorStartUsd": null,
9641
- "since": "2026-07-23T06:11:59.065Z"
9656
+ "since": "2026-10-11T00:07:46.034Z"
9642
9657
  },
9643
9658
  "inputSchema": {
9644
9659
  "type": "object",
@@ -14803,6 +14818,15 @@
14803
14818
  "description": "In assets mode: caps how many of your assets are screened (one billed row per asset). In inventory mode: how many top leveed areas to output, ranked by leveeRiskScore descending (each row is one billed result). Default 500. Example: 500.",
14804
14819
  "minimum": 1,
14805
14820
  "maximum": 5000
14821
+ },
14822
+ "backend": {
14823
+ "type": "string",
14824
+ "description": "Which copy of the National Levee Database to read. \"auto\" (default) reads the first-party USACE service and falls back to the Esri US Federal Datasets mirror ONLY when the USACE host cannot be reached — never when it answers and contradicts the actor's checks. \"primary_only\" refuses the fallback. \"secondary_only\" pins the mirror. The mirror is republished annually, so every row it serves is labelled with source_backend, backend_failover and backend_vintage_note. Applied by default if omitted: \"auto\".",
14825
+ "enum": [
14826
+ "auto",
14827
+ "primary_only",
14828
+ "secondary_only"
14829
+ ]
14806
14830
  }
14807
14831
  }
14808
14832
  },
@@ -16547,7 +16571,7 @@
16547
16571
  "slug": "warn-layoff-aggregator",
16548
16572
  "actorId": "malonestar/warn-layoff-aggregator",
16549
16573
  "title": "US WARN Layoff Notice Aggregator & Delta Monitor (OR/TX API)",
16550
- "description": "Aggregate US state WARN Act layoff & closure notices into one normalized schema and track new / updated / removed deltas. Oregon (HECC export) and Texas (Socrata) live and keyless; CA/NY/WA/WI/IL/NJ scaffolded. For RevOps, recruiting, econ research and CRE. No API key.",
16574
+ "description": "Aggregate US state WARN Act layoff & closure notices into one normalized schema and track new / updated / removed deltas. Oregon (HECC export) and Texas (TWC workbooks) live and keyless; CA/NY/WA/WI/IL/NJ scaffolded. For RevOps, recruiting, econ research and CRE. No API key.",
16551
16575
  "categories": [
16552
16576
  "LEAD_GENERATION",
16553
16577
  "BUSINESS",
@@ -16607,7 +16631,7 @@
16607
16631
  },
16608
16632
  "maxResults": {
16609
16633
  "type": "integer",
16610
- "description": "Maximum number of WARN notices to fetch. The budget is split evenly across the selected states, so a small value returns some of every state rather than all of the first one. Rows carry source_truncated when a state was cut short. Applied by default if omitted: 500.",
16634
+ "description": "Maximum number of WARN notices to fetch. The budget is split evenly across the selected states, so a small value returns some of every state rather than all of the first one. Rows carry source_truncated when a state was cut short. Example: 100. Applied by default if omitted: 500.",
16611
16635
  "minimum": 1,
16612
16636
  "maximum": 500000
16613
16637
  },
@@ -16622,6 +16646,7 @@
16622
16646
  "OR",
16623
16647
  "TX"
16624
16648
  ],
16649
+ "maxResults": 100,
16625
16650
  "deltaStoreName": "warn-layoff-delta"
16626
16651
  },
16627
16652
  "mustSupply": [],
@@ -16808,6 +16833,12 @@
16808
16833
  "minimum": 1,
16809
16834
  "maximum": 2000
16810
16835
  },
16836
+ "runBudgetSeconds": {
16837
+ "type": "integer",
16838
+ "description": "Whole-run wall clock shared by every request to the USFS EDW service. That service stalls in bursts: a stalled request sits on its own ~60 s instance-pool wait timeout before answering HTTP 200 with an embedded 503 \"Wait timeout for the request exceeded\", and the identical request then succeeds in ~150 ms. Each attempt is therefore capped at 5 s and re-asked, and this budget guarantees the run still reaches a terminal state. If it is exhausted the run FAILS LOUDLY as an upstream availability failure and bills nothing - it never returns a partial answer as though it were complete. Raise it for large batches. Clamped to 30-280 s; omit it and the actor uses 240 s, chosen to stay inside Apify’s 5-minute run-quality budget. Example: 240.",
16839
+ "minimum": 30,
16840
+ "maximum": 280
16841
+ },
16811
16842
  "skipDriftChecks": {
16812
16843
  "type": "boolean",
16813
16844
  "description": "Every run first verifies the live USFS service against measured bands (layer counts, classification vocabulary, a known-positive canary on the Rogue, a known-positive canary in the Rio Grande layer-1 coverage gap, and a known-clear negative control on Denver). If any check fails the run fails and nothing is billed. Set true only for very large batches where the ~12 extra requests matter; you then accept results from an unverified upstream. Default false. Example: false."
@@ -16851,6 +16882,7 @@
16851
16882
  }
16852
16883
  ],
16853
16884
  "radiusMeters": 5000,
16885
+ "runBudgetSeconds": 240,
16854
16886
  "skipDriftChecks": false
16855
16887
  },
16856
16888
  "mustSupply": [
package/src/tools.js CHANGED
@@ -252,8 +252,51 @@ export const ROUTING = {
252
252
  'epa-drinking-water-quality-screener':
253
253
  'CHOOSE THIS for public water-system quality: SDWA violations, lead 90th-percentile results and PFAS occurrence. '
254
254
  + 'It is NOT a property contamination screen — for soil and groundwater records at a site use epa-contaminated-site-screener.',
255
+ 'faa-drone-airspace-checker':
256
+ 'CHOOSE THIS for drone (Part 107) airspace questions at specific US points: airspace class, LAANC ceiling, restricted and special-use areas, temporary flight restrictions. '
257
+ + 'It does NOT screen ground conditions — for a site environmental or hazard screen use site-due-diligence-bundle. It reports what the FAA layers say; it does not request or grant an authorization.',
255
258
  };
256
259
 
260
+ /**
261
+ * Parameter guidance for the featured tools: which inputs matter, how they
262
+ * interact, and how to keep a first call small. Input schemas already document
263
+ * each field on its own; what they cannot say is which combinations an agent
264
+ * should reach for, which inputs override others, and which one is the cost cap.
265
+ * Every input named here in backticks is asserted to exist in the live schema
266
+ * (test/guidance.test.js), so a renamed field fails the build rather than
267
+ * leaving advice that points at nothing.
268
+ */
269
+ export const SCOPING = {
270
+ 'site-due-diligence-bundle':
271
+ 'INPUTS: `assets` is required (lat/lon per site). `radiusMiles` sets the proximity layers only; point-in-polygon layers ignore it. `maxAssets` is the cost cap, one billed row per site, so start with 1-3 sites.',
272
+ 'epa-contaminated-site-screener':
273
+ 'INPUTS: `mode` decides everything else. In "assets" mode supply `assets` (address or lat/lon) and `radiusMiles`; `states`, `onlyNpl` and `onlyWithCoords` are ignored. In "inventory" mode supply `states` and the asset inputs are ignored. One row per site hit is billed, so `maxHitsPerProgram` and `maxResults` are the cost levers; keep them low on a first call near dense industrial areas.',
274
+ 'faa-drone-airspace-checker':
275
+ 'INPUTS: `points` is required. `layers` narrows which FAA layers are checked; leave it empty for all eight. `maxPoints` is the cost cap, one billed row per point.',
276
+ 'hifld-grid-proximity-screener':
277
+ 'INPUTS: `assets` is required. `radiusMiles` bounds every layer. `minVoltageKv` filters lines only, never substations or plants, and drops lines with unknown voltage. `includeSubstations`, `includePowerPlants` and `includeUtility` add columns, not rows; turn them off to speed up large batches. `maxResults` caps assets, one billed row each.',
278
+ 'interconnection-queue-tracker':
279
+ 'INPUTS: leave `isos` empty for all seven ISOs, or name one or two to keep a first call small. `maxResults` is applied in ISO order, so a low value silently drops the later ISOs; raise it or narrow `isos` instead. For change monitoring use `deltaOnly` in snapshot mode rather than re-pulling the full queue.',
280
+ 'fdic-ncua-health-rollup':
281
+ 'INPUTS: always set `state`; an empty state scores the whole country and bills far more rows. `minAssets` and `maxAssets` are in THOUSANDS of dollars (1000000 = $1B) and together with `peerBasis` define who counts as a peer. `institutionType` "credit_union" is not available yet and fails the run. `maxResults` is the cost cap.',
282
+ 'fema-nri-county-risk-profile':
283
+ 'INPUTS: supply `assets` (FIPS, state+county, or lat/lon) for specific places; `states` and `counties` are used ONLY when `assets` is empty (inventory mode). `resolution` "tract" applies only to lat/lon assets and inventory pulls; FIPS or state+county assets always get county data. `maxResults` caps rows in both modes.',
284
+ 'fws-wetlands-proximity-screener':
285
+ 'INPUTS: `assets` is required. `radiusMeters` is the presence check (a true circle); `nearestSearchRadiusMeters` is independent and only bounds the nearest-wetland distance, so a site can read no wetland in radius and still report a nearest one. `maxResults` caps assets, one billed row each.',
286
+ 'nhd-surface-water-404-screener':
287
+ 'INPUTS: `assets` is required. `radiusMeters` 1000 covers a typical Phase I adjacent-property review; widen it only on purpose. Keep `includeNonNetworkFlowlines` on for a conservative screen. `runBudgetSeconds` trades completeness for speed when the USGS service is slow; a site cut by the budget reports null counts, not zero. `maxResults` caps sites, exactly one row each.',
288
+ 'epa-drinking-water-quality-screener':
289
+ 'INPUTS: supply `assets` (lat/lon, matched to a water system boundary) or `pwsids` (9-character EPA system ids) or both. `includePfas` is the slow leg; turn it off when PFAS is not the question. `violationYears` only changes the recent-violation flags, not the history summary. `maxAssets` is the cost cap.',
290
+ 'parcel-owner-lookup':
291
+ 'INPUTS: `addresses` is required, one full street address with city and state per entry. Coverage is a fixed list of county and state assessor rolls; every address still yields exactly one row, so read its lookup_status before treating a missing owner as an answer. `maxResults` caps addresses, one billed row each.',
292
+ 'license-verifier':
293
+ 'INPUTS: always scope with `states` (a state code searches every board in it; a board id targets one). The most precise search is `licenseNumber`; otherwise `lastName` plus `firstName`. `roster` runs a batch instead of a single search, and `mode` "roster-delta" switches to the newly-credentialed feed with `professions` and `sinceDays`. `maxResults` applies PER BOARD, so a bare state code can bill several boards; start with a low value.',
294
+ };
295
+
296
+ export function scopingNoteFor(slug) {
297
+ return SCOPING[slug] ? ` ${SCOPING[slug]}` : '';
298
+ }
299
+
257
300
  /**
258
301
  * A routing note is only shown when every tool it points at is reachable on
259
302
  * THIS server. Under a preset, a note that sends the agent to a tool outside
@@ -276,7 +319,7 @@ export function featuredToolDefinitions(index) {
276
319
  const routing = routingNoteFor(index, slug);
277
320
  return {
278
321
  name: toolNameFor(slug),
279
- description: `${a.title}. ${truncate(a.description, 400)}${routing} Reads live from the official government source. Call ${META_TOOLS.DESCRIBE} (free) for a verified example input. ${costNote(a.pricing)} Store page: ${a.storeUrl}`,
322
+ description: `${a.title}. ${truncate(a.description, 400)}${routing}${scopingNoteFor(slug)} Reads live from the official government source. Call ${META_TOOLS.DESCRIBE} (free) for a verified example input. ${costNote(a.pricing)} Store page: ${a.storeUrl}`,
280
323
  inputSchema: a.inputSchema,
281
324
  annotations: { title: a.title, ...ANNOTATIONS.BILLED_LIVE_READ },
282
325
  };