@cyanheads/epa-mcp-server 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CLAUDE.md +2 -2
  2. package/Dockerfile +10 -6
  3. package/LICENSE +201 -0
  4. package/README.md +7 -7
  5. package/changelog/0.2.x/0.2.0.md +21 -0
  6. package/changelog/0.2.x/0.2.1.md +31 -0
  7. package/dist/config/server-config.d.ts +1 -1
  8. package/dist/config/server-config.d.ts.map +1 -1
  9. package/dist/config/server-config.js +5 -3
  10. package/dist/config/server-config.js.map +1 -1
  11. package/dist/index.js +23 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp-server/tools/definitions/get-air-quality.tool.d.ts.map +1 -1
  14. package/dist/mcp-server/tools/definitions/get-air-quality.tool.js +37 -35
  15. package/dist/mcp-server/tools/definitions/get-air-quality.tool.js.map +1 -1
  16. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.d.ts +4 -0
  17. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.js +26 -2
  19. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/index.d.ts +318 -27
  21. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/index.js +11 -2
  23. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/search-facilities.tool.d.ts +10 -2
  25. package/dist/mcp-server/tools/definitions/search-facilities.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/search-facilities.tool.js +47 -8
  27. package/dist/mcp-server/tools/definitions/search-facilities.tool.js.map +1 -1
  28. package/dist/services/airnow/airnow-service.d.ts.map +1 -1
  29. package/dist/services/airnow/airnow-service.js +10 -4
  30. package/dist/services/airnow/airnow-service.js.map +1 -1
  31. package/dist/services/dmap/dmap-service.d.ts +10 -0
  32. package/dist/services/dmap/dmap-service.d.ts.map +1 -1
  33. package/dist/services/dmap/dmap-service.js +81 -5
  34. package/dist/services/dmap/dmap-service.js.map +1 -1
  35. package/dist/services/dmap/types.d.ts +36 -4
  36. package/dist/services/dmap/types.d.ts.map +1 -1
  37. package/dist/services/echo/echo-service.d.ts +3 -0
  38. package/dist/services/echo/echo-service.d.ts.map +1 -1
  39. package/dist/services/echo/echo-service.js +7 -0
  40. package/dist/services/echo/echo-service.js.map +1 -1
  41. package/package.json +5 -4
  42. package/server.json +7 -7
@@ -14,6 +14,10 @@ export declare const getTriReleasesTool: import("@cyanheads/mcp-ts-core").ToolDe
14
14
  chemicalName: z.ZodString;
15
15
  reportingYear: z.ZodNumber;
16
16
  totalReleasesInLbs: z.ZodOptional<z.ZodNumber>;
17
+ releasesToAirInLbs: z.ZodOptional<z.ZodNumber>;
18
+ releasesToWaterInLbs: z.ZodOptional<z.ZodNumber>;
19
+ releasesToLandInLbs: z.ZodOptional<z.ZodNumber>;
20
+ releasesToUndergroundInjectionInLbs: z.ZodOptional<z.ZodNumber>;
17
21
  }, z.core.$strip>>;
18
22
  facilityId: z.ZodString;
19
23
  message: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"get-tri-releases.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-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;AAGjE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;cA0G7B,CAAC"}
1
+ {"version":3,"file":"get-tri-releases.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-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;AAGjE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;cAgJ7B,CAAC"}
@@ -36,7 +36,23 @@ export const getTriReleasesTool = tool('epa_get_tri_releases', {
36
36
  totalReleasesInLbs: z
37
37
  .number()
38
38
  .optional()
39
- .describe('One-time release quantity in pounds (from tri_reporting_form)'),
39
+ .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.'),
40
+ releasesToAirInLbs: z
41
+ .number()
42
+ .optional()
43
+ .describe('On-site routine air releases (fugitive + stack emissions) in pounds, summed across air release types for this submission.'),
44
+ releasesToWaterInLbs: z
45
+ .number()
46
+ .optional()
47
+ .describe('On-site routine releases to surface water in pounds, summed across all reported outfalls for this submission.'),
48
+ releasesToLandInLbs: z
49
+ .number()
50
+ .optional()
51
+ .describe('On-site routine land releases in pounds — landfills, land treatment, surface impoundment, and other on-site disposal, summed for this submission.'),
52
+ releasesToUndergroundInjectionInLbs: z
53
+ .number()
54
+ .optional()
55
+ .describe('On-site routine releases via underground injection wells in pounds, summed across injection well classes for this submission.'),
40
56
  })
41
57
  .describe('Per-chemical TRI release record for this facility and year'))
42
58
  .describe('Per-chemical annual TRI release records for the queried facility'),
@@ -83,8 +99,16 @@ export const getTriReleasesTool = tool('epa_get_tri_releases', {
83
99
  for (const r of result.releases) {
84
100
  lines.push(`\n### ${r.chemicalName} (${r.reportingYear})`);
85
101
  lines.push(`**Facility ID:** ${r.facilityId}`);
102
+ if (r.releasesToAirInLbs !== undefined)
103
+ lines.push(`**Air Releases:** ${r.releasesToAirInLbs.toLocaleString()} lbs`);
104
+ if (r.releasesToWaterInLbs !== undefined)
105
+ lines.push(`**Water Releases:** ${r.releasesToWaterInLbs.toLocaleString()} lbs`);
106
+ if (r.releasesToLandInLbs !== undefined)
107
+ lines.push(`**Land Releases:** ${r.releasesToLandInLbs.toLocaleString()} lbs`);
108
+ if (r.releasesToUndergroundInjectionInLbs !== undefined)
109
+ lines.push(`**Underground Injection:** ${r.releasesToUndergroundInjectionInLbs.toLocaleString()} lbs`);
86
110
  if (r.totalReleasesInLbs !== undefined)
87
- lines.push(`**Release Quantity:** ${r.totalReleasesInLbs.toLocaleString()} lbs`);
111
+ lines.push(`**One-Time / Non-Routine Release:** ${r.totalReleasesInLbs.toLocaleString()} lbs`);
88
112
  }
89
113
  return [{ type: 'text', text: lines.join('\n') }];
90
114
  },
@@ -1 +1 @@
1
- {"version":3,"file":"get-tri-releases.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-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,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC7D,KAAK,EAAE,wCAAwC;IAC/C,WAAW,EACT,obAAob;IACtb,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IAE9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,+EAA+E,CAAC;QAC5F,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,IAAI,CAAC;aACT,GAAG,CAAC,IAAI,CAAC;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,0IAA0I,CAC3I;QACH,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,8FAA8F,CAC/F;KACJ,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC;aACR,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC1D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACrE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAChE,kBAAkB,EAAE,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,+DAA+D,CAAC;SAC7E,CAAC;aACD,QAAQ,CAAC,4DAA4D,CAAC,CAC1E;aACA,QAAQ,CAAC,kEAAkE,CAAC;QAC/E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC1D,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,uIAAuI,CACxI;KACJ,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,6DAA6D;YACnE,QAAQ,EACN,kGAAkG;SACrG;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAE1F,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC,cAAc,CACpD;YACE,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;YACpC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YACrD,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;SACtC,EACD,GAAG,CACJ,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAE3E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,uBAAuB,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1F,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,OAAO,EAAE,uCAAuC,KAAK,CAAC,WAAW,IAAI,QAAQ,GAAG,QAAQ,yCAAyC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,iEAAiE;aAC/N,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,uCAAuC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAExD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,CAAC,kBAAkB,KAAK,SAAS;gBACpC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACrF,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"}
1
+ {"version":3,"file":"get-tri-releases.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tri-releases.tool.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,17 @@ export { searchSuperfundTool } from './search-superfund.tool.js';
10
10
  export { searchTriReleasesTool } from './search-tri-releases.tool.js';
11
11
  export { searchViolationsTool } from './search-violations.tool.js';
12
12
  export { searchWaterSystemsTool } from './search-water-systems.tool.js';
13
- export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
13
+ /**
14
+ * Tools backed only by keyless public APIs (ECHO, DMAP). Always registered —
15
+ * these require no API key.
16
+ */
17
+ export declare const coreToolDefinitions: readonly [import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
14
18
  zip_code: import("zod").ZodOptional<import("zod").ZodString>;
15
19
  state: import("zod").ZodOptional<import("zod").ZodString>;
16
20
  city: import("zod").ZodOptional<import("zod").ZodString>;
21
+ latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
22
+ longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
23
+ radius_miles: import("zod").ZodOptional<import("zod").ZodNumber>;
17
24
  active_only: import("zod").ZodOptional<import("zod").ZodBoolean>;
18
25
  programs: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
19
26
  CAA: "CAA";
@@ -53,8 +60,13 @@ export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-cor
53
60
  }, import("zod/v4/core").$strip>, readonly [{
54
61
  readonly reason: "no_geographic_filter";
55
62
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
56
- readonly when: "No geographic filter (zip_code, state, or city) was provided.";
57
- readonly recovery: "Provide at least one of zip_code, state, or city to scope the search.";
63
+ readonly when: "No geographic filter (zip_code, state, city, or a latitude+longitude+radius_miles triple) was provided.";
64
+ readonly recovery: "Provide at least one of zip_code, state, or city, or a complete latitude + longitude + radius_miles triple, to scope the search.";
65
+ }, {
66
+ readonly reason: "incomplete_proximity";
67
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
68
+ readonly when: "A proximity search was started but latitude, longitude, and radius_miles were not all provided.";
69
+ readonly recovery: "Proximity search needs all three of latitude, longitude, and radius_miles. Provide the missing value, or use zip_code / state / city instead.";
58
70
  }, {
59
71
  readonly reason: "no_match";
60
72
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
@@ -154,43 +166,280 @@ export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-cor
154
166
  readonly when: "Neither state nor zip_code was provided.";
155
167
  readonly recovery: "Provide at least one of state or zip_code to scope the enforcement case search.";
156
168
  }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
169
+ facility_id: import("zod").ZodString;
170
+ year: import("zod").ZodOptional<import("zod").ZodNumber>;
171
+ chemical_name: import("zod").ZodOptional<import("zod").ZodString>;
172
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
173
+ releases: import("zod").ZodArray<import("zod").ZodObject<{
174
+ facilityId: import("zod").ZodString;
175
+ chemicalName: import("zod").ZodString;
176
+ reportingYear: import("zod").ZodNumber;
177
+ totalReleasesInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
178
+ releasesToAirInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
179
+ releasesToWaterInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
180
+ releasesToLandInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
181
+ releasesToUndergroundInjectionInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
182
+ }, import("zod/v4/core").$strip>>;
183
+ facilityId: import("zod").ZodString;
184
+ message: import("zod").ZodOptional<import("zod").ZodString>;
185
+ }, import("zod/v4/core").$strip>, readonly [{
186
+ readonly reason: "no_releases_found";
187
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
188
+ readonly when: "No TRI records found for the given facility ID and filters.";
189
+ readonly recovery: "Verify the facility ID via epa_search_facilities. TRI data lags 18 months — try an earlier year.";
190
+ }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
191
+ state: import("zod").ZodString;
192
+ county: import("zod").ZodOptional<import("zod").ZodString>;
193
+ year: import("zod").ZodOptional<import("zod").ZodNumber>;
194
+ chemical_name: import("zod").ZodOptional<import("zod").ZodString>;
195
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
196
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
197
+ releases: import("zod").ZodArray<import("zod").ZodObject<{
198
+ facilityId: import("zod").ZodString;
199
+ facilityName: import("zod").ZodOptional<import("zod").ZodString>;
200
+ chemicalName: import("zod").ZodString;
201
+ reportingYear: import("zod").ZodNumber;
202
+ totalReleasesInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
203
+ }, import("zod/v4/core").$strip>>;
204
+ state: import("zod").ZodString;
205
+ message: import("zod").ZodOptional<import("zod").ZodString>;
206
+ }, import("zod/v4/core").$strip>, readonly [{
207
+ readonly reason: "no_releases_found";
208
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
209
+ readonly when: "No TRI records found for the given state and filters.";
210
+ readonly recovery: "Verify the state abbreviation is valid. TRI data lags 18 months — try removing the year filter or using an earlier year.";
211
+ }], {
212
+ readonly truncated: import("zod").ZodBoolean;
213
+ readonly shown: import("zod").ZodNumber;
214
+ readonly cap: import("zod").ZodNumber;
215
+ }>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
216
+ state: import("zod").ZodOptional<import("zod").ZodString>;
217
+ city: import("zod").ZodOptional<import("zod").ZodString>;
157
218
  zip_code: import("zod").ZodOptional<import("zod").ZodString>;
158
219
  latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
159
220
  longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
160
- mode: import("zod").ZodDefault<import("zod").ZodEnum<{
161
- current: "current";
162
- forecast: "forecast";
221
+ radius_miles: import("zod").ZodOptional<import("zod").ZodNumber>;
222
+ npl_status: import("zod").ZodDefault<import("zod").ZodEnum<{
223
+ all: "all";
224
+ listed: "listed";
225
+ "not-listed": "not-listed";
226
+ proposed: "proposed";
163
227
  }>>;
164
- forecast_date: import("zod").ZodOptional<import("zod").ZodString>;
165
- distance_miles: import("zod").ZodDefault<import("zod").ZodNumber>;
228
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
166
229
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
167
- observations: import("zod").ZodArray<import("zod").ZodObject<{
168
- reportingArea: import("zod").ZodOptional<import("zod").ZodString>;
169
- stateCode: import("zod").ZodOptional<import("zod").ZodString>;
230
+ sites: import("zod").ZodArray<import("zod").ZodObject<{
231
+ siteId: import("zod").ZodString;
232
+ name: import("zod").ZodString;
233
+ street: import("zod").ZodOptional<import("zod").ZodString>;
234
+ city: import("zod").ZodOptional<import("zod").ZodString>;
235
+ state: import("zod").ZodOptional<import("zod").ZodString>;
236
+ zip: import("zod").ZodOptional<import("zod").ZodString>;
237
+ county: import("zod").ZodOptional<import("zod").ZodString>;
238
+ fipsCode: import("zod").ZodOptional<import("zod").ZodString>;
239
+ nplStatus: import("zod").ZodOptional<import("zod").ZodString>;
240
+ cleanupStatus: import("zod").ZodOptional<import("zod").ZodString>;
170
241
  latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
171
242
  longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
172
- dateObserved: import("zod").ZodOptional<import("zod").ZodString>;
173
- hourObserved: import("zod").ZodOptional<import("zod").ZodNumber>;
174
- localTimeZone: import("zod").ZodOptional<import("zod").ZodString>;
175
- readings: import("zod").ZodArray<import("zod").ZodObject<{
176
- parameterName: import("zod").ZodString;
177
- aqi: import("zod").ZodNumber;
178
- categoryNumber: import("zod").ZodOptional<import("zod").ZodNumber>;
179
- categoryName: import("zod").ZodOptional<import("zod").ZodString>;
180
- }, import("zod/v4/core").$strip>>;
181
243
  }, import("zod/v4/core").$strip>>;
182
- mode: import("zod").ZodString;
244
+ totalCount: import("zod").ZodNumber;
183
245
  message: import("zod").ZodOptional<import("zod").ZodString>;
184
246
  }, import("zod/v4/core").$strip>, readonly [{
185
- readonly reason: "no_location";
247
+ readonly reason: "no_location_filter";
186
248
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
187
- readonly when: "Neither zip_code nor latitude+longitude was provided.";
188
- readonly recovery: "Provide either zip_code or both latitude and longitude to identify the location.";
249
+ readonly when: "No location filter (state, city, zip_code, or latitude+longitude) was provided.";
250
+ readonly recovery: "Provide at least one location filter: state, city, zip_code, or latitude+longitude+radius_miles.";
189
251
  }, {
190
- readonly reason: "forecast_date_required";
252
+ readonly reason: "radius_required";
191
253
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
192
- readonly when: "Mode is \"forecast\" but forecast_date was not provided.";
193
- readonly recovery: "Provide forecast_date as YYYY-MM-DD when using mode=\"forecast\".";
254
+ readonly when: "Latitude and longitude were provided without radius_miles.";
255
+ readonly recovery: "Provide radius_miles together with latitude and longitude for a proximity search.";
256
+ }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
257
+ state: import("zod").ZodOptional<import("zod").ZodString>;
258
+ zip_code: import("zod").ZodOptional<import("zod").ZodString>;
259
+ has_violation: import("zod").ZodOptional<import("zod").ZodBoolean>;
260
+ pws_type: import("zod").ZodOptional<import("zod").ZodEnum<{
261
+ community: "community";
262
+ "non-transient": "non-transient";
263
+ transient: "transient";
264
+ }>>;
265
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
266
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
267
+ systems: import("zod").ZodArray<import("zod").ZodObject<{
268
+ pwsid: import("zod").ZodString;
269
+ name: import("zod").ZodString;
270
+ state: import("zod").ZodOptional<import("zod").ZodString>;
271
+ city: import("zod").ZodOptional<import("zod").ZodString>;
272
+ zip: import("zod").ZodOptional<import("zod").ZodString>;
273
+ type: import("zod").ZodOptional<import("zod").ZodString>;
274
+ populationServed: import("zod").ZodOptional<import("zod").ZodNumber>;
275
+ primarySourceCode: import("zod").ZodOptional<import("zod").ZodString>;
276
+ hasViolation: import("zod").ZodOptional<import("zod").ZodBoolean>;
277
+ isActive: import("zod").ZodOptional<import("zod").ZodBoolean>;
278
+ }, import("zod/v4/core").$strip>>;
279
+ totalCount: import("zod").ZodNumber;
280
+ message: import("zod").ZodOptional<import("zod").ZodString>;
281
+ }, import("zod/v4/core").$strip>, readonly [{
282
+ readonly reason: "no_geographic_filter";
283
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
284
+ readonly when: "Neither state nor zip_code was provided.";
285
+ readonly recovery: "Provide at least one of state or zip_code to search drinking water systems.";
286
+ }], undefined>];
287
+ /**
288
+ * Full tool surface, adding epa_get_air_quality (requires AIRNOW_API_KEY).
289
+ * index.ts registers this set when the key is configured, falling back to
290
+ * coreToolDefinitions when it is absent.
291
+ */
292
+ export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
293
+ zip_code: import("zod").ZodOptional<import("zod").ZodString>;
294
+ state: import("zod").ZodOptional<import("zod").ZodString>;
295
+ city: import("zod").ZodOptional<import("zod").ZodString>;
296
+ latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
297
+ longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
298
+ radius_miles: import("zod").ZodOptional<import("zod").ZodNumber>;
299
+ active_only: import("zod").ZodOptional<import("zod").ZodBoolean>;
300
+ programs: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
301
+ CAA: "CAA";
302
+ CWA: "CWA";
303
+ RCRA: "RCRA";
304
+ TRI: "TRI";
305
+ SDWA: "SDWA";
306
+ }>>>;
307
+ has_violation: import("zod").ZodOptional<import("zod").ZodBoolean>;
308
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
309
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
310
+ facilities: import("zod").ZodArray<import("zod").ZodObject<{
311
+ registryId: import("zod").ZodString;
312
+ name: import("zod").ZodString;
313
+ street: import("zod").ZodOptional<import("zod").ZodString>;
314
+ city: import("zod").ZodOptional<import("zod").ZodString>;
315
+ state: import("zod").ZodOptional<import("zod").ZodString>;
316
+ zip: import("zod").ZodOptional<import("zod").ZodString>;
317
+ county: import("zod").ZodOptional<import("zod").ZodString>;
318
+ fipsCode: import("zod").ZodOptional<import("zod").ZodString>;
319
+ latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
320
+ longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
321
+ complianceStatus: import("zod").ZodOptional<import("zod").ZodString>;
322
+ programs: import("zod").ZodObject<{
323
+ air: import("zod").ZodBoolean;
324
+ water: import("zod").ZodBoolean;
325
+ rcra: import("zod").ZodBoolean;
326
+ tri: import("zod").ZodBoolean;
327
+ sdwa: import("zod").ZodBoolean;
328
+ }, import("zod/v4/core").$strip>;
329
+ triReleasesTransfersInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
330
+ inspectionCount: import("zod").ZodOptional<import("zod").ZodNumber>;
331
+ totalPenaltiesInDollars: import("zod").ZodOptional<import("zod").ZodNumber>;
332
+ }, import("zod/v4/core").$strip>>;
333
+ totalCount: import("zod").ZodNumber;
334
+ message: import("zod").ZodOptional<import("zod").ZodString>;
335
+ }, import("zod/v4/core").$strip>, readonly [{
336
+ readonly reason: "no_geographic_filter";
337
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
338
+ readonly when: "No geographic filter (zip_code, state, city, or a latitude+longitude+radius_miles triple) was provided.";
339
+ readonly recovery: "Provide at least one of zip_code, state, or city, or a complete latitude + longitude + radius_miles triple, to scope the search.";
340
+ }, {
341
+ readonly reason: "incomplete_proximity";
342
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
343
+ readonly when: "A proximity search was started but latitude, longitude, and radius_miles were not all provided.";
344
+ readonly recovery: "Proximity search needs all three of latitude, longitude, and radius_miles. Provide the missing value, or use zip_code / state / city instead.";
345
+ }, {
346
+ readonly reason: "no_match";
347
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
348
+ readonly when: "No facilities matched the search criteria.";
349
+ readonly recovery: "Broaden the search by removing filters or expanding the geographic area.";
350
+ }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
351
+ registry_id: import("zod").ZodString;
352
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
353
+ registryId: import("zod").ZodString;
354
+ name: import("zod").ZodString;
355
+ street: import("zod").ZodOptional<import("zod").ZodString>;
356
+ city: import("zod").ZodOptional<import("zod").ZodString>;
357
+ state: import("zod").ZodOptional<import("zod").ZodString>;
358
+ zip: import("zod").ZodOptional<import("zod").ZodString>;
359
+ county: import("zod").ZodOptional<import("zod").ZodString>;
360
+ fipsCode: import("zod").ZodOptional<import("zod").ZodString>;
361
+ latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
362
+ longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
363
+ complianceStatus: import("zod").ZodOptional<import("zod").ZodString>;
364
+ programs: import("zod").ZodObject<{
365
+ air: import("zod").ZodBoolean;
366
+ water: import("zod").ZodBoolean;
367
+ rcra: import("zod").ZodBoolean;
368
+ tri: import("zod").ZodBoolean;
369
+ sdwa: import("zod").ZodBoolean;
370
+ }, import("zod/v4/core").$strip>;
371
+ triReleasesTransfersInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
372
+ compliance: import("zod").ZodOptional<import("zod").ZodObject<{
373
+ mediaStatusCode: import("zod").ZodOptional<import("zod").ZodString>;
374
+ mediaStatusDescription: import("zod").ZodOptional<import("zod").ZodString>;
375
+ quartersInViolation: import("zod").ZodOptional<import("zod").ZodNumber>;
376
+ }, import("zod/v4/core").$strip>>;
377
+ inspections: import("zod").ZodArray<import("zod").ZodObject<{
378
+ activityType: import("zod").ZodOptional<import("zod").ZodString>;
379
+ activityDate: import("zod").ZodOptional<import("zod").ZodString>;
380
+ description: import("zod").ZodOptional<import("zod").ZodString>;
381
+ }, import("zod/v4/core").$strip>>;
382
+ formalActions: import("zod").ZodArray<import("zod").ZodObject<{
383
+ caseId: import("zod").ZodOptional<import("zod").ZodString>;
384
+ settlementDate: import("zod").ZodOptional<import("zod").ZodString>;
385
+ penaltyAssessedInDollars: import("zod").ZodOptional<import("zod").ZodNumber>;
386
+ actionType: import("zod").ZodOptional<import("zod").ZodString>;
387
+ }, import("zod/v4/core").$strip>>;
388
+ airCompliance: import("zod").ZodOptional<import("zod").ZodObject<{
389
+ programId: import("zod").ZodOptional<import("zod").ZodString>;
390
+ status: import("zod").ZodOptional<import("zod").ZodString>;
391
+ statusDate: import("zod").ZodOptional<import("zod").ZodString>;
392
+ }, import("zod/v4/core").$strip>>;
393
+ waterCompliance: import("zod").ZodOptional<import("zod").ZodObject<{
394
+ programId: import("zod").ZodOptional<import("zod").ZodString>;
395
+ status: import("zod").ZodOptional<import("zod").ZodString>;
396
+ permitId: import("zod").ZodOptional<import("zod").ZodString>;
397
+ }, import("zod/v4/core").$strip>>;
398
+ }, import("zod/v4/core").$strip>, readonly [{
399
+ readonly reason: "facility_not_found";
400
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
401
+ readonly when: "ECHO returned no facility record for the given Registry ID.";
402
+ readonly recovery: "Verify the Registry ID using epa_search_facilities and retry with a valid ID.";
403
+ }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
404
+ state: import("zod").ZodOptional<import("zod").ZodString>;
405
+ zip_code: import("zod").ZodOptional<import("zod").ZodString>;
406
+ program: import("zod").ZodOptional<import("zod").ZodEnum<{
407
+ CAA: "CAA";
408
+ CWA: "CWA";
409
+ RCRA: "RCRA";
410
+ SDWA: "SDWA";
411
+ CERCLA: "CERCLA";
412
+ FIFRA: "FIFRA";
413
+ TSCA: "TSCA";
414
+ }>>;
415
+ case_type: import("zod").ZodDefault<import("zod").ZodEnum<{
416
+ all: "all";
417
+ criminal: "criminal";
418
+ civil: "civil";
419
+ }>>;
420
+ date_filed_start: import("zod").ZodOptional<import("zod").ZodString>;
421
+ date_filed_end: import("zod").ZodOptional<import("zod").ZodString>;
422
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
423
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
424
+ cases: import("zod").ZodArray<import("zod").ZodObject<{
425
+ caseId: import("zod").ZodOptional<import("zod").ZodString>;
426
+ caseName: import("zod").ZodOptional<import("zod").ZodString>;
427
+ facilityName: import("zod").ZodOptional<import("zod").ZodString>;
428
+ registryId: import("zod").ZodOptional<import("zod").ZodString>;
429
+ programsViolated: import("zod").ZodOptional<import("zod").ZodString>;
430
+ caseType: import("zod").ZodOptional<import("zod").ZodString>;
431
+ penaltyAssessedInDollars: import("zod").ZodOptional<import("zod").ZodNumber>;
432
+ settlementDate: import("zod").ZodOptional<import("zod").ZodString>;
433
+ filedDate: import("zod").ZodOptional<import("zod").ZodString>;
434
+ state: import("zod").ZodOptional<import("zod").ZodString>;
435
+ }, import("zod/v4/core").$strip>>;
436
+ totalCount: import("zod").ZodNumber;
437
+ message: import("zod").ZodOptional<import("zod").ZodString>;
438
+ }, import("zod/v4/core").$strip>, readonly [{
439
+ readonly reason: "no_geographic_filter";
440
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
441
+ readonly when: "Neither state nor zip_code was provided.";
442
+ readonly recovery: "Provide at least one of state or zip_code to scope the enforcement case search.";
194
443
  }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
195
444
  facility_id: import("zod").ZodString;
196
445
  year: import("zod").ZodOptional<import("zod").ZodNumber>;
@@ -201,6 +450,10 @@ export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-cor
201
450
  chemicalName: import("zod").ZodString;
202
451
  reportingYear: import("zod").ZodNumber;
203
452
  totalReleasesInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
453
+ releasesToAirInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
454
+ releasesToWaterInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
455
+ releasesToLandInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
456
+ releasesToUndergroundInjectionInLbs: import("zod").ZodOptional<import("zod").ZodNumber>;
204
457
  }, import("zod/v4/core").$strip>>;
205
458
  facilityId: import("zod").ZodString;
206
459
  message: import("zod").ZodOptional<import("zod").ZodString>;
@@ -305,5 +558,43 @@ export declare const allToolDefinitions: readonly [import("@cyanheads/mcp-ts-cor
305
558
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
306
559
  readonly when: "Neither state nor zip_code was provided.";
307
560
  readonly recovery: "Provide at least one of state or zip_code to search drinking water systems.";
561
+ }], undefined>, import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
562
+ zip_code: import("zod").ZodOptional<import("zod").ZodString>;
563
+ latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
564
+ longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
565
+ mode: import("zod").ZodDefault<import("zod").ZodEnum<{
566
+ current: "current";
567
+ forecast: "forecast";
568
+ }>>;
569
+ forecast_date: import("zod").ZodOptional<import("zod").ZodString>;
570
+ distance_miles: import("zod").ZodDefault<import("zod").ZodNumber>;
571
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
572
+ observations: import("zod").ZodArray<import("zod").ZodObject<{
573
+ reportingArea: import("zod").ZodOptional<import("zod").ZodString>;
574
+ stateCode: import("zod").ZodOptional<import("zod").ZodString>;
575
+ latitude: import("zod").ZodOptional<import("zod").ZodNumber>;
576
+ longitude: import("zod").ZodOptional<import("zod").ZodNumber>;
577
+ dateObserved: import("zod").ZodOptional<import("zod").ZodString>;
578
+ hourObserved: import("zod").ZodOptional<import("zod").ZodNumber>;
579
+ localTimeZone: import("zod").ZodOptional<import("zod").ZodString>;
580
+ readings: import("zod").ZodArray<import("zod").ZodObject<{
581
+ parameterName: import("zod").ZodString;
582
+ aqi: import("zod").ZodNumber;
583
+ categoryNumber: import("zod").ZodOptional<import("zod").ZodNumber>;
584
+ categoryName: import("zod").ZodOptional<import("zod").ZodString>;
585
+ }, import("zod/v4/core").$strip>>;
586
+ }, import("zod/v4/core").$strip>>;
587
+ mode: import("zod").ZodString;
588
+ message: import("zod").ZodOptional<import("zod").ZodString>;
589
+ }, import("zod/v4/core").$strip>, readonly [{
590
+ readonly reason: "no_location";
591
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
592
+ readonly when: "Neither zip_code nor latitude+longitude was provided.";
593
+ readonly recovery: "Provide either zip_code or both latitude and longitude to identify the location.";
594
+ }, {
595
+ readonly reason: "forecast_date_required";
596
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
597
+ readonly when: "Mode is \"forecast\" but forecast_date was not provided.";
598
+ readonly recovery: "Provide forecast_date as YYYY-MM-DD when using mode=\"forecast\".";
308
599
  }], undefined>];
309
600
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAWxE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eASrB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAWxE;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAQtB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAAuD,CAAC"}
@@ -18,14 +18,23 @@ import { searchSuperfundTool } from './search-superfund.tool.js';
18
18
  import { searchTriReleasesTool } from './search-tri-releases.tool.js';
19
19
  import { searchViolationsTool } from './search-violations.tool.js';
20
20
  import { searchWaterSystemsTool } from './search-water-systems.tool.js';
21
- export const allToolDefinitions = [
21
+ /**
22
+ * Tools backed only by keyless public APIs (ECHO, DMAP). Always registered —
23
+ * these require no API key.
24
+ */
25
+ export const coreToolDefinitions = [
22
26
  searchFacilitiesTool,
23
27
  getFacilityTool,
24
28
  searchViolationsTool,
25
- getAirQualityTool,
26
29
  getTriReleasesTool,
27
30
  searchTriReleasesTool,
28
31
  searchSuperfundTool,
29
32
  searchWaterSystemsTool,
30
33
  ];
34
+ /**
35
+ * Full tool surface, adding epa_get_air_quality (requires AIRNOW_API_KEY).
36
+ * index.ts registers this set when the key is configured, falling back to
37
+ * coreToolDefinitions when it is absent.
38
+ */
39
+ export const allToolDefinitions = [...coreToolDefinitions, getAirQualityTool];
31
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,sBAAsB;CACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,sBAAsB;CACd,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,mBAAmB,EAAE,iBAAiB,CAAU,CAAC"}
@@ -8,6 +8,9 @@ export declare const searchFacilitiesTool: import("@cyanheads/mcp-ts-core").Tool
8
8
  zip_code: z.ZodOptional<z.ZodString>;
9
9
  state: z.ZodOptional<z.ZodString>;
10
10
  city: z.ZodOptional<z.ZodString>;
11
+ latitude: z.ZodOptional<z.ZodNumber>;
12
+ longitude: z.ZodOptional<z.ZodNumber>;
13
+ radius_miles: z.ZodOptional<z.ZodNumber>;
11
14
  active_only: z.ZodOptional<z.ZodBoolean>;
12
15
  programs: z.ZodOptional<z.ZodArray<z.ZodEnum<{
13
16
  CAA: "CAA";
@@ -47,8 +50,13 @@ export declare const searchFacilitiesTool: import("@cyanheads/mcp-ts-core").Tool
47
50
  }, z.core.$strip>, readonly [{
48
51
  readonly reason: "no_geographic_filter";
49
52
  readonly code: JsonRpcErrorCode.ValidationError;
50
- readonly when: "No geographic filter (zip_code, state, or city) was provided.";
51
- readonly recovery: "Provide at least one of zip_code, state, or city to scope the search.";
53
+ readonly when: "No geographic filter (zip_code, state, city, or a latitude+longitude+radius_miles triple) was provided.";
54
+ readonly recovery: "Provide at least one of zip_code, state, or city, or a complete latitude + longitude + radius_miles triple, to scope the search.";
55
+ }, {
56
+ readonly reason: "incomplete_proximity";
57
+ readonly code: JsonRpcErrorCode.ValidationError;
58
+ readonly when: "A proximity search was started but latitude, longitude, and radius_miles were not all provided.";
59
+ readonly recovery: "Proximity search needs all three of latitude, longitude, and radius_miles. Provide the missing value, or use zip_code / state / city instead.";
52
60
  }, {
53
61
  readonly reason: "no_match";
54
62
  readonly code: JsonRpcErrorCode.NotFound;
@@ -1 +1 @@
1
- {"version":3,"file":"search-facilities.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-facilities.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,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuM/B,CAAC"}
1
+ {"version":3,"file":"search-facilities.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-facilities.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,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2P/B,CAAC"}