@cyanheads/epa-mcp-server 0.3.3 → 0.4.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/AGENTS.md +5 -5
- package/CLAUDE.md +5 -5
- package/Dockerfile +3 -3
- package/README.md +58 -23
- package/changelog/0.4.x/0.4.0.md +35 -0
- package/changelog/0.4.x/0.4.1.md +34 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/resources/definitions/facility.resource.d.ts +8 -1
- package/dist/mcp-server/resources/definitions/facility.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/facility.resource.js +13 -7
- package/dist/mcp-server/resources/definitions/facility.resource.js.map +1 -1
- package/dist/mcp-server/resources/definitions/index.d.ts +7 -1
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-air-quality.tool.d.ts +23 -9
- package/dist/mcp-server/tools/definitions/get-air-quality.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-air-quality.tool.js +165 -93
- package/dist/mcp-server/tools/definitions/get-air-quality.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-facility.tool.d.ts +30 -2
- package/dist/mcp-server/tools/definitions/get-facility.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-facility.tool.js +211 -53
- package/dist/mcp-server/tools/definitions/get-facility.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tri-releases.tool.d.ts +5 -2
- package/dist/mcp-server/tools/definitions/get-tri-releases.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tri-releases.tool.js +18 -15
- package/dist/mcp-server/tools/definitions/get-tri-releases.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +165 -32
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-facilities.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-facilities.tool.js +39 -26
- package/dist/mcp-server/tools/definitions/search-facilities.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-superfund.tool.d.ts +3 -1
- package/dist/mcp-server/tools/definitions/search-superfund.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-superfund.tool.js +13 -9
- package/dist/mcp-server/tools/definitions/search-superfund.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-tri-releases.tool.d.ts +17 -3
- package/dist/mcp-server/tools/definitions/search-tri-releases.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-tri-releases.tool.js +64 -12
- package/dist/mcp-server/tools/definitions/search-tri-releases.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-violations.tool.d.ts +20 -3
- package/dist/mcp-server/tools/definitions/search-violations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-violations.tool.js +84 -15
- package/dist/mcp-server/tools/definitions/search-violations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-water-systems.tool.d.ts +3 -1
- package/dist/mcp-server/tools/definitions/search-water-systems.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-water-systems.tool.js +22 -7
- package/dist/mcp-server/tools/definitions/search-water-systems.tool.js.map +1 -1
- package/dist/mcp-server/tools/format-lbs.d.ts +14 -0
- package/dist/mcp-server/tools/format-lbs.d.ts.map +1 -0
- package/dist/mcp-server/tools/format-lbs.js +16 -0
- package/dist/mcp-server/tools/format-lbs.js.map +1 -0
- package/dist/mcp-server/tools/format-location.d.ts +18 -0
- package/dist/mcp-server/tools/format-location.d.ts.map +1 -0
- package/dist/mcp-server/tools/format-location.js +26 -0
- package/dist/mcp-server/tools/format-location.js.map +1 -0
- package/dist/mcp-server/tools/format-tri-release.d.ts +16 -0
- package/dist/mcp-server/tools/format-tri-release.d.ts.map +1 -0
- package/dist/mcp-server/tools/format-tri-release.js +23 -0
- package/dist/mcp-server/tools/format-tri-release.js.map +1 -0
- package/dist/services/airnow/airnow-service.d.ts +10 -29
- package/dist/services/airnow/airnow-service.d.ts.map +1 -1
- package/dist/services/airnow/airnow-service.js +156 -97
- package/dist/services/airnow/airnow-service.js.map +1 -1
- package/dist/services/airnow/types.d.ts +62 -23
- package/dist/services/airnow/types.d.ts.map +1 -1
- package/dist/services/airnow/types.js +2 -1
- package/dist/services/airnow/types.js.map +1 -1
- package/dist/services/call-budget.d.ts +22 -0
- package/dist/services/call-budget.d.ts.map +1 -0
- package/dist/services/call-budget.js +28 -0
- package/dist/services/call-budget.js.map +1 -0
- package/dist/services/dmap/dmap-service.d.ts +76 -7
- package/dist/services/dmap/dmap-service.d.ts.map +1 -1
- package/dist/services/dmap/dmap-service.js +461 -144
- package/dist/services/dmap/dmap-service.js.map +1 -1
- package/dist/services/dmap/types.d.ts +17 -4
- package/dist/services/dmap/types.d.ts.map +1 -1
- package/dist/services/echo/echo-service.d.ts +38 -11
- package/dist/services/echo/echo-service.d.ts.map +1 -1
- package/dist/services/echo/echo-service.js +417 -223
- package/dist/services/echo/echo-service.js.map +1 -1
- package/dist/services/echo/types.d.ts +167 -80
- package/dist/services/echo/types.d.ts.map +1 -1
- package/dist/services/ejscreen/ejscreen-service.d.ts.map +1 -1
- package/dist/services/ejscreen/ejscreen-service.js +9 -3
- package/dist/services/ejscreen/ejscreen-service.js.map +1 -1
- package/package.json +7 -7
- package/server.json +9 -3
|
@@ -45,5 +45,7 @@ export declare const searchSuperfundTool: import("@cyanheads/mcp-ts-core").ToolD
|
|
|
45
45
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
46
46
|
readonly when: "Latitude and longitude were provided without radius_miles.";
|
|
47
47
|
readonly recovery: "Provide radius_miles together with latitude and longitude for a proximity search.";
|
|
48
|
-
}],
|
|
48
|
+
}], {
|
|
49
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}>;
|
|
49
51
|
//# sourceMappingURL=search-superfund.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-superfund.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-superfund.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-superfund.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-superfund.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkL9B,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { formatLocationLines } from '../format-location.js';
|
|
7
8
|
import { getDmapService } from '../../../services/dmap/dmap-service.js';
|
|
8
9
|
export const searchSuperfundTool = tool('epa_search_superfund', {
|
|
9
10
|
title: 'Search Superfund Sites',
|
|
@@ -11,7 +12,11 @@ export const searchSuperfundTool = tool('epa_search_superfund', {
|
|
|
11
12
|
annotations: { readOnlyHint: true, openWorldHint: true, idempotentHint: true },
|
|
12
13
|
input: z.object({
|
|
13
14
|
state: z.string().optional().describe('2-letter US state abbreviation to filter sites'),
|
|
14
|
-
city: z
|
|
15
|
+
city: z
|
|
16
|
+
.string()
|
|
17
|
+
.max(4094)
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('City name (partial match within state, case-insensitive). Punctuation is matched as written ("St. Louis", "Coeur d\'Alene").'),
|
|
15
20
|
zip_code: z.string().optional().describe('5-digit ZIP code to filter sites'),
|
|
16
21
|
latitude: z
|
|
17
22
|
.number()
|
|
@@ -69,6 +74,12 @@ export const searchSuperfundTool = tool('epa_search_superfund', {
|
|
|
69
74
|
.optional()
|
|
70
75
|
.describe('Recovery hint when no sites are found. Absent when sites are returned.'),
|
|
71
76
|
}),
|
|
77
|
+
enrichment: {
|
|
78
|
+
notice: z
|
|
79
|
+
.string()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('Present when a punctuated city filter read its page limit before finding limit sites spelled as given, so more matching sites may exist.'),
|
|
82
|
+
},
|
|
72
83
|
errors: [
|
|
73
84
|
{
|
|
74
85
|
reason: 'no_location_filter',
|
|
@@ -132,14 +143,7 @@ export const searchSuperfundTool = tool('epa_search_superfund', {
|
|
|
132
143
|
for (const s of result.sites) {
|
|
133
144
|
lines.push(`\n### ${s.name}`);
|
|
134
145
|
lines.push(`**Site ID:** ${s.siteId}`);
|
|
135
|
-
|
|
136
|
-
if (location)
|
|
137
|
-
lines.push(`**Location:** ${location}`);
|
|
138
|
-
if (s.county)
|
|
139
|
-
lines.push(`**County:** ${s.county}${s.fipsCode ? ` (FIPS: ${s.fipsCode})` : ''}`);
|
|
140
|
-
if (s.latitude !== undefined && s.longitude !== undefined) {
|
|
141
|
-
lines.push(`**Coordinates:** ${s.latitude}, ${s.longitude}`);
|
|
142
|
-
}
|
|
146
|
+
lines.push(...formatLocationLines(s));
|
|
143
147
|
if (s.nplStatus)
|
|
144
148
|
lines.push(`**NPL Status:** ${s.nplStatus}`);
|
|
145
149
|
if (s.cleanupStatus)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-superfund.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-superfund.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC9D,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,8UAA8U;IAChV,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IAE9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QACvF,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"search-superfund.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-superfund.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC9D,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,8UAA8U;IAChV,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IAE9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QACvF,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,IAAI,CAAC;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,8HAA8H,CAC/H;QACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC5E,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,4FAA4F,CAC7F;QACH,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;aACjD,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,0IAA0I,CAC3I;QACH,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,GAAG,CAAC;aACR,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,2CAA2C,CAAC;KACzD,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC;aACL,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YACvD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACpE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YACpE,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;YACpE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAChF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACvE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAC1E,CAAC;aACD,QAAQ,CAAC,qEAAqE,CAAC,CACnF;aACA,QAAQ,CAAC,0BAA0B,CAAC;QACvC,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,CAAC,wEAAwE,CAAC;QACrF,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,wEAAwE,CAAC;KACtF,CAAC;IAEF,UAAU,EAAE;QACV,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,0IAA0I,CAC3I;KACJ;IAED,MAAM,EAAE;QACN;YACE,MAAM,EAAE,oBAAoB;YAC5B,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,iFAAiF;YACvF,QAAQ,EACN,kGAAkG;SACrG;QACD;YACE,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,4DAA4D;YAClE,QAAQ,EAAE,mFAAmF;SAC9F;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzF,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;QAEhF,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,MAAM,GAAG,CAAC,IAAI,CACZ,oBAAoB,EACpB,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,GAAG,CAAC,IAAI,CACZ,iBAAiB,EACjB,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACnC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,KAAK,CAAC,QAAQ;YACnB,SAAS,EAAE,KAAK,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC,eAAe,CAClD;YACE,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;YACpE,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;YAC5E,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YAClE,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,EACD,GAAG,CACJ,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAExE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,SAAS,YAAY,KAAK,CAAC,YAAY,QAAQ;gBACrF,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzE,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,iCAAiC,QAAQ,qBAAqB,KAAK,CAAC,UAAU,uFAAuF;aAC/K,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAExD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,aAAa;gBAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -4,19 +4,32 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
/**
|
|
8
|
+
* A county name as TRI stores it: trimmed, uppercase, and without a trailing County, Parish, or
|
|
9
|
+
* Borough ("KING", never "KING COUNTY"), so a suffixed input still matches. Linear in the name:
|
|
10
|
+
* the suffix match anchors on one whitespace character rather than a run of them.
|
|
11
|
+
*/
|
|
12
|
+
export declare function bareCountyName(county: string): string;
|
|
7
13
|
export declare const searchTriReleasesTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
14
|
state: z.ZodString;
|
|
9
15
|
county: z.ZodOptional<z.ZodString>;
|
|
10
16
|
year: z.ZodOptional<z.ZodNumber>;
|
|
11
17
|
chemical_name: z.ZodOptional<z.ZodString>;
|
|
12
18
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
include_release_breakdown: z.ZodDefault<z.ZodBoolean>;
|
|
13
20
|
}, z.core.$strip>, z.ZodObject<{
|
|
14
21
|
releases: z.ZodArray<z.ZodObject<{
|
|
15
22
|
facilityId: z.ZodString;
|
|
16
23
|
facilityName: z.ZodOptional<z.ZodString>;
|
|
24
|
+
countyName: z.ZodOptional<z.ZodString>;
|
|
17
25
|
chemicalName: z.ZodString;
|
|
18
26
|
reportingYear: z.ZodNumber;
|
|
27
|
+
reportedUnit: z.ZodOptional<z.ZodLiteral<"grams">>;
|
|
19
28
|
totalReleasesInLbs: z.ZodOptional<z.ZodNumber>;
|
|
29
|
+
releasesToAirInLbs: z.ZodOptional<z.ZodNumber>;
|
|
30
|
+
releasesToWaterInLbs: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
releasesToLandInLbs: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
releasesToUndergroundInjectionInLbs: z.ZodOptional<z.ZodNumber>;
|
|
20
33
|
}, z.core.$strip>>;
|
|
21
34
|
state: z.ZodString;
|
|
22
35
|
message: z.ZodOptional<z.ZodString>;
|
|
@@ -26,8 +39,9 @@ export declare const searchTriReleasesTool: import("@cyanheads/mcp-ts-core").Too
|
|
|
26
39
|
readonly when: "No TRI records found for the given state and filters.";
|
|
27
40
|
readonly recovery: "Verify the state abbreviation is valid. TRI data lags 18 months — try removing the year filter or using an earlier year.";
|
|
28
41
|
}], {
|
|
29
|
-
readonly truncated: z.ZodBoolean
|
|
30
|
-
readonly shown: z.ZodNumber
|
|
31
|
-
readonly cap: z.ZodNumber
|
|
42
|
+
readonly truncated: z.ZodOptional<z.ZodBoolean>;
|
|
43
|
+
readonly shown: z.ZodOptional<z.ZodNumber>;
|
|
44
|
+
readonly cap: z.ZodOptional<z.ZodNumber>;
|
|
45
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
32
46
|
}>;
|
|
33
47
|
//# sourceMappingURL=search-tri-releases.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-tri-releases.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-tri-releases.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-tri-releases.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-tri-releases.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuMhC,CAAC"}
|
|
@@ -4,10 +4,21 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { formatTriReleaseLines } from '../format-tri-release.js';
|
|
7
8
|
import { getDmapService } from '../../../services/dmap/dmap-service.js';
|
|
9
|
+
/**
|
|
10
|
+
* A county name as TRI stores it: trimmed, uppercase, and without a trailing County, Parish, or
|
|
11
|
+
* Borough ("KING", never "KING COUNTY"), so a suffixed input still matches. Linear in the name:
|
|
12
|
+
* the suffix match anchors on one whitespace character rather than a run of them.
|
|
13
|
+
*/
|
|
14
|
+
export function bareCountyName(county) {
|
|
15
|
+
const name = county.trim();
|
|
16
|
+
const suffix = /\s(county|parish|borough)$/i.exec(name);
|
|
17
|
+
return (suffix ? name.slice(0, suffix.index).trimEnd() : name).toUpperCase();
|
|
18
|
+
}
|
|
8
19
|
export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
9
20
|
title: 'Search TRI Releases by Region',
|
|
10
|
-
description: 'Search Toxic Release Inventory data across facilities in a state or county for
|
|
21
|
+
description: 'Search Toxic Release Inventory data across facilities in a state or county, for one reporting year or, without year, every available year newest first. Returns facility name and county, TRI facility ID, chemical name, and the one-time / non-routine release quantity; set include_release_breakdown to add routine on-site releases by medium (air, water, land, and underground-injection), at the cost of a slower call. Quantities are in pounds; dioxin and dioxin-like compounds, which TRI has facilities report in grams, are converted and marked with reportedUnit. Use to identify top polluters in an area or build an environmental exposure profile. Use epa_get_tri_releases for detailed release records for a single facility. TRI data lags ~18 months from the current calendar year.',
|
|
11
22
|
annotations: { readOnlyHint: true, openWorldHint: true, idempotentHint: true },
|
|
12
23
|
input: z.object({
|
|
13
24
|
state: z
|
|
@@ -17,19 +28,21 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
17
28
|
.describe('2-letter US state abbreviation (required, e.g. "WA", "TX")'),
|
|
18
29
|
county: z
|
|
19
30
|
.string()
|
|
31
|
+
.max(4094)
|
|
20
32
|
.optional()
|
|
21
|
-
.describe('County name to narrow results within the state
|
|
33
|
+
.describe('County name to narrow results within the state, e.g. "King". Case-insensitive partial match on the bare name, so a short name can also match a longer one (LAKE matches LAKE OF THE WOODS; check countyName on each record); a trailing "County", "Parish", or "Borough" is dropped before matching. Punctuation is matched as written ("Prince George\'s").'),
|
|
22
34
|
year: z
|
|
23
35
|
.number()
|
|
24
36
|
.int()
|
|
25
37
|
.min(1987)
|
|
26
38
|
.max(2030)
|
|
27
39
|
.optional()
|
|
28
|
-
.describe('Reporting year.
|
|
40
|
+
.describe('Reporting year. Omit to search every available year in the state, newest reporting year first, so limit keeps the most recent filings. TRI data lags ~18 months.'),
|
|
29
41
|
chemical_name: z
|
|
30
42
|
.string()
|
|
43
|
+
.max(4094)
|
|
31
44
|
.optional()
|
|
32
|
-
.describe('Optional filter to restrict results to a specific chemical (partial match, case-insensitive)'),
|
|
45
|
+
.describe('Optional filter to restrict results to a specific chemical (partial match, case-insensitive). Commas, apostrophes, brackets, and Greek letters are matched as written, e.g. "4,4\'-Methylenedianiline".'),
|
|
33
46
|
limit: z
|
|
34
47
|
.number()
|
|
35
48
|
.int()
|
|
@@ -37,6 +50,10 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
37
50
|
.max(200)
|
|
38
51
|
.default(50)
|
|
39
52
|
.describe('Maximum number of release records to return (1–200)'),
|
|
53
|
+
include_release_breakdown: z
|
|
54
|
+
.boolean()
|
|
55
|
+
.default(false)
|
|
56
|
+
.describe('Add routine on-site releases by medium (air, water, land, underground injection) to each record. Costs one extra upstream request, which can add about 20 seconds when EPA has not cached it.'),
|
|
40
57
|
}),
|
|
41
58
|
output: z.object({
|
|
42
59
|
releases: z
|
|
@@ -44,12 +61,36 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
44
61
|
.object({
|
|
45
62
|
facilityId: z.string().describe('TRI facility identifier'),
|
|
46
63
|
facilityName: z.string().optional().describe('Facility name'),
|
|
64
|
+
countyName: z
|
|
65
|
+
.string()
|
|
66
|
+
.optional()
|
|
67
|
+
.describe('County as TRI records the facility\'s location (e.g. "KING", "CALCASIEU PARISH"). The county filter is a partial match, so a short name can also match a longer one (LAKE matches LAKE OF THE WOODS); check this field to keep only the county you meant.'),
|
|
47
68
|
chemicalName: z.string().describe('Chemical name as reported to TRI'),
|
|
48
69
|
reportingYear: z.number().describe('Year of the TRI submission'),
|
|
70
|
+
reportedUnit: z
|
|
71
|
+
.literal('grams')
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Present as "grams" when TRI had the facility report this chemical in grams (dioxin and dioxin-like compounds); its quantities here are converted to pounds (1 lb = 453.59237 g). Absent for chemicals reported in pounds.'),
|
|
49
74
|
totalReleasesInLbs: z
|
|
50
75
|
.number()
|
|
51
76
|
.optional()
|
|
52
|
-
.describe('
|
|
77
|
+
.describe('TRI one-time / non-routine release quantity in pounds (spills, accidents) — a distinct TRI category, NOT the sum of the per-medium routine releases below.'),
|
|
78
|
+
releasesToAirInLbs: z
|
|
79
|
+
.number()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('On-site routine air releases (fugitive + stack emissions) in pounds, summed across air release types for this submission. Only with include_release_breakdown.'),
|
|
82
|
+
releasesToWaterInLbs: z
|
|
83
|
+
.number()
|
|
84
|
+
.optional()
|
|
85
|
+
.describe('On-site routine releases to surface water in pounds, summed across all reported outfalls for this submission. Only with include_release_breakdown.'),
|
|
86
|
+
releasesToLandInLbs: z
|
|
87
|
+
.number()
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('On-site routine land releases in pounds — landfills, land treatment, surface impoundment, and other on-site disposal, summed for this submission. Only with include_release_breakdown.'),
|
|
90
|
+
releasesToUndergroundInjectionInLbs: z
|
|
91
|
+
.number()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe('On-site routine releases via underground injection wells in pounds, summed across injection well classes for this submission. Only with include_release_breakdown.'),
|
|
53
94
|
})
|
|
54
95
|
.describe('TRI release record for a facility-chemical-year combination'))
|
|
55
96
|
.describe('TRI release records for facilities in the queried state and filters'),
|
|
@@ -62,9 +103,17 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
62
103
|
enrichment: {
|
|
63
104
|
truncated: z
|
|
64
105
|
.boolean()
|
|
65
|
-
.
|
|
66
|
-
|
|
67
|
-
|
|
106
|
+
.optional()
|
|
107
|
+
.describe('True when the result list was capped at the limit — more records may exist. Absent below the limit.'),
|
|
108
|
+
shown: z
|
|
109
|
+
.number()
|
|
110
|
+
.optional()
|
|
111
|
+
.describe('Number of release records returned. Present only when truncated.'),
|
|
112
|
+
cap: z.number().optional().describe('The limit that was applied. Present only when truncated.'),
|
|
113
|
+
notice: z
|
|
114
|
+
.string()
|
|
115
|
+
.optional()
|
|
116
|
+
.describe('Present when a punctuated county or chemical_name filter read its page limit before finding limit matches spelled as given, so more matching records may exist.'),
|
|
68
117
|
},
|
|
69
118
|
errors: [
|
|
70
119
|
{
|
|
@@ -79,8 +128,9 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
79
128
|
state: input.state,
|
|
80
129
|
year: input.year,
|
|
81
130
|
county: input.county,
|
|
131
|
+
includeReleaseBreakdown: input.include_release_breakdown,
|
|
82
132
|
});
|
|
83
|
-
const county = input.county
|
|
133
|
+
const county = input.county === undefined ? undefined : bareCountyName(input.county);
|
|
84
134
|
const chemicalName = input.chemical_name?.trim();
|
|
85
135
|
const releases = await getDmapService().searchTriReleases({
|
|
86
136
|
state: input.state.trim().toUpperCase(),
|
|
@@ -88,11 +138,12 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
88
138
|
...(input.year !== undefined && { year: input.year }),
|
|
89
139
|
...(chemicalName && { chemicalName }),
|
|
90
140
|
limit: input.limit,
|
|
141
|
+
includeReleaseBreakdown: input.include_release_breakdown,
|
|
91
142
|
}, ctx);
|
|
92
143
|
ctx.log.info('epa_search_tri_releases completed', { count: releases.length });
|
|
93
144
|
if (releases.length === 0) {
|
|
94
145
|
const yearNote = input.year ? ` for year ${input.year}` : '';
|
|
95
|
-
const countyNote =
|
|
146
|
+
const countyNote = county ? ` in ${county} county` : '';
|
|
96
147
|
const chemNote = input.chemical_name ? ` for chemical "${input.chemical_name}"` : '';
|
|
97
148
|
return {
|
|
98
149
|
releases: [],
|
|
@@ -114,8 +165,9 @@ export const searchTriReleasesTool = tool('epa_search_tri_releases', {
|
|
|
114
165
|
for (const r of result.releases) {
|
|
115
166
|
const facilityLabel = r.facilityName ? `${r.facilityName} (${r.facilityId})` : r.facilityId;
|
|
116
167
|
lines.push(`\n### ${r.chemicalName} — ${facilityLabel} (${r.reportingYear})`);
|
|
117
|
-
if (r.
|
|
118
|
-
lines.push(`**
|
|
168
|
+
if (r.countyName)
|
|
169
|
+
lines.push(`**County:** ${r.countyName}`);
|
|
170
|
+
lines.push(...formatTriReleaseLines(r));
|
|
119
171
|
}
|
|
120
172
|
return [{ type: 'text', text: lines.join('\n') }];
|
|
121
173
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-tri-releases.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-tri-releases.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,yBAAyB,EAAE;IACnE,KAAK,EAAE,+BAA+B;IACtC,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"search-tri-releases.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-tri-releases.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,8 @@ export declare const searchViolationsTool: import("@cyanheads/mcp-ts-core").Tool
|
|
|
21
21
|
civil: "civil";
|
|
22
22
|
criminal: "criminal";
|
|
23
23
|
}>>;
|
|
24
|
-
date_filed_start: z.ZodOptional<z.ZodString
|
|
25
|
-
date_filed_end: z.ZodOptional<z.ZodString
|
|
24
|
+
date_filed_start: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>;
|
|
25
|
+
date_filed_end: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodString]>>;
|
|
26
26
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
27
27
|
}, z.core.$strip>, z.ZodObject<{
|
|
28
28
|
cases: z.ZodArray<z.ZodObject<{
|
|
@@ -44,5 +44,22 @@ export declare const searchViolationsTool: import("@cyanheads/mcp-ts-core").Tool
|
|
|
44
44
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
45
45
|
readonly when: "Neither state nor zip_code was provided.";
|
|
46
46
|
readonly recovery: "Provide at least one of state or zip_code to scope the enforcement case search.";
|
|
47
|
-
}
|
|
47
|
+
}, {
|
|
48
|
+
readonly reason: "invalid_date";
|
|
49
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
50
|
+
readonly when: "date_filed_start or date_filed_end is not a real calendar date, such as 2024-02-30.";
|
|
51
|
+
readonly recovery: "Pass a real calendar date in YYYY-MM-DD form, such as 2024-02-29.";
|
|
52
|
+
}, {
|
|
53
|
+
readonly reason: "date_range_inverted";
|
|
54
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
55
|
+
readonly when: "date_filed_start is later than date_filed_end.";
|
|
56
|
+
readonly recovery: "Swap the two dates so date_filed_start is on or before date_filed_end.";
|
|
57
|
+
}, {
|
|
58
|
+
readonly reason: "criminal_date_filter";
|
|
59
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
60
|
+
readonly when: "case_type \"criminal\" was combined with a filing-date bound, which ECHO records for civil cases only.";
|
|
61
|
+
readonly recovery: "Drop date_filed_start and date_filed_end to search criminal cases, or set case_type to civil.";
|
|
62
|
+
}], {
|
|
63
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}>;
|
|
48
65
|
//# sourceMappingURL=search-violations.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-violations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-violations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-violations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-violations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAsBjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyP/B,CAAC"}
|
|
@@ -5,32 +5,47 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { getEchoService } from '../../../services/echo/echo-service.js';
|
|
8
|
+
/**
|
|
9
|
+
* A YYYY-MM-DD date, or a blank string for none; surrounding whitespace is trimmed. Calendar
|
|
10
|
+
* validity is checked in the handler.
|
|
11
|
+
*/
|
|
12
|
+
const filingDate = z.union([
|
|
13
|
+
z.string().trim().length(0).describe('No bound'),
|
|
14
|
+
z
|
|
15
|
+
.string()
|
|
16
|
+
.trim()
|
|
17
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, 'Use the YYYY-MM-DD form, e.g. 2024-01-31.')
|
|
18
|
+
.describe('Date in YYYY-MM-DD form'),
|
|
19
|
+
]);
|
|
20
|
+
/** True when a YYYY-MM-DD string names a real calendar day (rejects 2024-02-30). */
|
|
21
|
+
const isCalendarDate = (iso) => {
|
|
22
|
+
const parsed = new Date(`${iso}T00:00:00Z`);
|
|
23
|
+
return !Number.isNaN(parsed.getTime()) && parsed.toISOString().startsWith(iso);
|
|
24
|
+
};
|
|
8
25
|
export const searchViolationsTool = tool('epa_search_violations', {
|
|
9
26
|
title: 'Search EPA Enforcement Cases',
|
|
10
|
-
description: "Search EPA civil and criminal enforcement cases by state, regulatory program, or date range. Returns case identifier,
|
|
27
|
+
description: "Search EPA civil and criminal enforcement cases by state, ZIP code, regulatory program, case type, or filing-date range. Returns case identifier, programs involved, penalty assessed, settlement and filing dates, and case type. Designed for area-level violation discovery — for a single known facility's enforcement history use epa_get_facility instead. At least one of state or zip_code is required.",
|
|
11
28
|
annotations: { readOnlyHint: true, openWorldHint: true, idempotentHint: true },
|
|
12
29
|
input: z.object({
|
|
13
30
|
state: z
|
|
14
31
|
.string()
|
|
15
32
|
.optional()
|
|
16
33
|
.describe('2-letter US state abbreviation to filter cases (e.g. "TX", "CA")'),
|
|
17
|
-
zip_code: z.string().optional().describe(
|
|
34
|
+
zip_code: z.string().optional().describe("5-digit ZIP code of the case's facility location"),
|
|
18
35
|
program: z
|
|
19
36
|
.enum(['CAA', 'CWA', 'RCRA', 'SDWA', 'CERCLA', 'FIFRA', 'TSCA'])
|
|
20
37
|
.optional()
|
|
21
|
-
.describe(
|
|
38
|
+
.describe("Filter by regulatory program: CAA=Clean Air Act, CWA=Clean Water Act, RCRA=hazardous waste, SDWA=drinking water, CERCLA=Superfund, FIFRA=pesticides, TSCA=toxic substances. Matches any law a case cites, so a returned case's programsViolated (its primary law) can differ."),
|
|
22
39
|
case_type: z
|
|
23
40
|
.enum(['civil', 'criminal', 'all'])
|
|
24
41
|
.default('all')
|
|
25
|
-
.describe('Filter by case type: civil (regulatory violations), criminal (willful violations), or all'),
|
|
26
|
-
date_filed_start:
|
|
27
|
-
.string()
|
|
42
|
+
.describe('Filter by case type: civil (regulatory violations), criminal (willful violations), or all. A filing-date range covers civil cases only: with a date, all returns civil cases and criminal is rejected.'),
|
|
43
|
+
date_filed_start: filingDate
|
|
28
44
|
.optional()
|
|
29
|
-
.describe('
|
|
30
|
-
date_filed_end:
|
|
31
|
-
.string()
|
|
45
|
+
.describe('Earliest filing date, inclusive (YYYY-MM-DD). Civil cases only. Omit, or pass "", for no lower bound.'),
|
|
46
|
+
date_filed_end: filingDate
|
|
32
47
|
.optional()
|
|
33
|
-
.describe('
|
|
48
|
+
.describe('Latest filing date, inclusive (YYYY-MM-DD). Civil cases only. Omit, or pass "", for no upper bound.'),
|
|
34
49
|
limit: z
|
|
35
50
|
.number()
|
|
36
51
|
.int()
|
|
@@ -63,13 +78,19 @@ export const searchViolationsTool = tool('epa_search_violations', {
|
|
|
63
78
|
caseType: z
|
|
64
79
|
.string()
|
|
65
80
|
.optional()
|
|
66
|
-
.describe('Case category (e.g. "Judicial", "Administrative")'),
|
|
81
|
+
.describe('Case category (e.g. "Judicial", "Administrative - Formal")'),
|
|
67
82
|
penaltyAssessedInDollars: z
|
|
68
83
|
.number()
|
|
69
84
|
.optional()
|
|
70
85
|
.describe('Federal penalty assessed in dollars (parsed from ECHO dollar string)'),
|
|
71
|
-
settlementDate: z
|
|
72
|
-
|
|
86
|
+
settlementDate: z
|
|
87
|
+
.string()
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('Settlement or resolution date (MM/DD/YYYY)'),
|
|
90
|
+
filedDate: z
|
|
91
|
+
.string()
|
|
92
|
+
.optional()
|
|
93
|
+
.describe('Date the enforcement case was filed (MM/DD/YYYY) — the date the filing-date range bounds'),
|
|
73
94
|
state: z
|
|
74
95
|
.string()
|
|
75
96
|
.optional()
|
|
@@ -83,6 +104,12 @@ export const searchViolationsTool = tool('epa_search_violations', {
|
|
|
83
104
|
.optional()
|
|
84
105
|
.describe('Recovery hint when no cases are found — echoes filters and suggests broadening. Absent when cases are returned.'),
|
|
85
106
|
}),
|
|
107
|
+
enrichment: {
|
|
108
|
+
notice: z
|
|
109
|
+
.string()
|
|
110
|
+
.optional()
|
|
111
|
+
.describe('Present when a filing-date range with case_type "all" left criminal cases out of the results.'),
|
|
112
|
+
},
|
|
86
113
|
errors: [
|
|
87
114
|
{
|
|
88
115
|
reason: 'no_geographic_filter',
|
|
@@ -90,20 +117,55 @@ export const searchViolationsTool = tool('epa_search_violations', {
|
|
|
90
117
|
when: 'Neither state nor zip_code was provided.',
|
|
91
118
|
recovery: 'Provide at least one of state or zip_code to scope the enforcement case search.',
|
|
92
119
|
},
|
|
120
|
+
{
|
|
121
|
+
reason: 'invalid_date',
|
|
122
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
123
|
+
when: 'date_filed_start or date_filed_end is not a real calendar date, such as 2024-02-30.',
|
|
124
|
+
recovery: 'Pass a real calendar date in YYYY-MM-DD form, such as 2024-02-29.',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
reason: 'date_range_inverted',
|
|
128
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
129
|
+
when: 'date_filed_start is later than date_filed_end.',
|
|
130
|
+
recovery: 'Swap the two dates so date_filed_start is on or before date_filed_end.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
reason: 'criminal_date_filter',
|
|
134
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
135
|
+
when: 'case_type "criminal" was combined with a filing-date bound, which ECHO records for civil cases only.',
|
|
136
|
+
recovery: 'Drop date_filed_start and date_filed_end to search criminal cases, or set case_type to civil.',
|
|
137
|
+
},
|
|
93
138
|
],
|
|
94
139
|
async handler(input, ctx) {
|
|
95
140
|
if (!input.state?.trim() && !input.zip_code?.trim()) {
|
|
96
141
|
throw ctx.fail('no_geographic_filter', 'At least one of state or zip_code is required to search enforcement cases.');
|
|
97
142
|
}
|
|
143
|
+
const dateFiledStart = input.date_filed_start || undefined;
|
|
144
|
+
const dateFiledEnd = input.date_filed_end || undefined;
|
|
145
|
+
for (const [field, value] of [
|
|
146
|
+
['date_filed_start', dateFiledStart],
|
|
147
|
+
['date_filed_end', dateFiledEnd],
|
|
148
|
+
]) {
|
|
149
|
+
if (value !== undefined && !isCalendarDate(value)) {
|
|
150
|
+
throw ctx.fail('invalid_date', `${field} "${value}" is not a calendar date.`, { field });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (dateFiledStart && dateFiledEnd && dateFiledStart > dateFiledEnd) {
|
|
154
|
+
throw ctx.fail('date_range_inverted', `date_filed_start ${dateFiledStart} is after date_filed_end ${dateFiledEnd}.`);
|
|
155
|
+
}
|
|
156
|
+
const dated = dateFiledStart !== undefined || dateFiledEnd !== undefined;
|
|
157
|
+
if (dated && input.case_type === 'criminal') {
|
|
158
|
+
throw ctx.fail('criminal_date_filter', 'ECHO records filing dates for civil cases only, so a filing-date range cannot select criminal cases.');
|
|
159
|
+
}
|
|
98
160
|
ctx.log.info('epa_search_violations', {
|
|
99
161
|
state: input.state,
|
|
100
162
|
program: input.program,
|
|
101
163
|
caseType: input.case_type,
|
|
164
|
+
dateFiledStart,
|
|
165
|
+
dateFiledEnd,
|
|
102
166
|
});
|
|
103
167
|
const state = input.state?.trim();
|
|
104
168
|
const zipCode = input.zip_code?.trim();
|
|
105
|
-
const dateFiledStart = input.date_filed_start?.trim();
|
|
106
|
-
const dateFiledEnd = input.date_filed_end?.trim();
|
|
107
169
|
const { cases, totalCount } = await getEchoService().searchViolations({
|
|
108
170
|
...(state && { state }),
|
|
109
171
|
...(zipCode && { zipCode }),
|
|
@@ -114,6 +176,9 @@ export const searchViolationsTool = tool('epa_search_violations', {
|
|
|
114
176
|
limit: input.limit,
|
|
115
177
|
}, ctx);
|
|
116
178
|
ctx.log.info('epa_search_violations completed', { count: cases.length, totalCount });
|
|
179
|
+
if (dated && input.case_type === 'all') {
|
|
180
|
+
ctx.enrich.notice('Criminal cases are excluded: ECHO records filing dates for civil cases only, so a filing-date range returns civil cases. Search case_type "criminal" without dates for criminal cases.');
|
|
181
|
+
}
|
|
117
182
|
if (cases.length === 0) {
|
|
118
183
|
const parts = [];
|
|
119
184
|
if (input.state)
|
|
@@ -124,6 +189,10 @@ export const searchViolationsTool = tool('epa_search_violations', {
|
|
|
124
189
|
parts.push(`program="${input.program}"`);
|
|
125
190
|
if (input.case_type && input.case_type !== 'all')
|
|
126
191
|
parts.push(`case_type="${input.case_type}"`);
|
|
192
|
+
if (dateFiledStart)
|
|
193
|
+
parts.push(`date_filed_start="${dateFiledStart}"`);
|
|
194
|
+
if (dateFiledEnd)
|
|
195
|
+
parts.push(`date_filed_end="${dateFiledEnd}"`);
|
|
127
196
|
return {
|
|
128
197
|
cases: [],
|
|
129
198
|
totalCount: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-violations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-violations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,EAAE;IAChE,KAAK,EAAE,8BAA8B;IACrC,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"search-violations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-violations.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,5 +34,7 @@ export declare const searchWaterSystemsTool: import("@cyanheads/mcp-ts-core").To
|
|
|
34
34
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
35
35
|
readonly when: "Neither state nor zip_code was provided.";
|
|
36
36
|
readonly recovery: "Provide at least one of state or zip_code to search drinking water systems.";
|
|
37
|
-
}],
|
|
37
|
+
}], {
|
|
38
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}>;
|
|
38
40
|
//# sourceMappingURL=search-water-systems.tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-water-systems.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-water-systems.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"search-water-systems.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-water-systems.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmLjC,CAAC"}
|