@cyanheads/epa-mcp-server 0.4.0 → 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.
Files changed (60) hide show
  1. package/AGENTS.md +5 -5
  2. package/CLAUDE.md +5 -5
  3. package/Dockerfile +3 -3
  4. package/README.md +24 -19
  5. package/changelog/0.4.x/0.4.1.md +34 -0
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/mcp-server/resources/definitions/facility.resource.d.ts +8 -1
  9. package/dist/mcp-server/resources/definitions/facility.resource.d.ts.map +1 -1
  10. package/dist/mcp-server/resources/definitions/facility.resource.js +13 -7
  11. package/dist/mcp-server/resources/definitions/facility.resource.js.map +1 -1
  12. package/dist/mcp-server/resources/definitions/index.d.ts +7 -1
  13. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -1
  14. package/dist/mcp-server/tools/definitions/get-facility.tool.d.ts +30 -2
  15. package/dist/mcp-server/tools/definitions/get-facility.tool.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/get-facility.tool.js +208 -43
  17. package/dist/mcp-server/tools/definitions/get-facility.tool.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.d.ts +4 -2
  19. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.js +12 -5
  21. package/dist/mcp-server/tools/definitions/get-tri-releases.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/index.d.ts +116 -16
  23. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/search-facilities.tool.d.ts.map +1 -1
  25. package/dist/mcp-server/tools/definitions/search-facilities.tool.js +34 -16
  26. package/dist/mcp-server/tools/definitions/search-facilities.tool.js.map +1 -1
  27. package/dist/mcp-server/tools/definitions/search-superfund.tool.d.ts +3 -1
  28. package/dist/mcp-server/tools/definitions/search-superfund.tool.d.ts.map +1 -1
  29. package/dist/mcp-server/tools/definitions/search-superfund.tool.js +11 -1
  30. package/dist/mcp-server/tools/definitions/search-superfund.tool.js.map +1 -1
  31. package/dist/mcp-server/tools/definitions/search-tri-releases.tool.d.ts +7 -0
  32. package/dist/mcp-server/tools/definitions/search-tri-releases.tool.d.ts.map +1 -1
  33. package/dist/mcp-server/tools/definitions/search-tri-releases.tool.js +21 -9
  34. package/dist/mcp-server/tools/definitions/search-tri-releases.tool.js.map +1 -1
  35. package/dist/mcp-server/tools/definitions/search-violations.tool.d.ts +20 -3
  36. package/dist/mcp-server/tools/definitions/search-violations.tool.d.ts.map +1 -1
  37. package/dist/mcp-server/tools/definitions/search-violations.tool.js +84 -15
  38. package/dist/mcp-server/tools/definitions/search-violations.tool.js.map +1 -1
  39. package/dist/services/airnow/airnow-service.d.ts.map +1 -1
  40. package/dist/services/airnow/airnow-service.js +9 -3
  41. package/dist/services/airnow/airnow-service.js.map +1 -1
  42. package/dist/services/call-budget.d.ts +22 -0
  43. package/dist/services/call-budget.d.ts.map +1 -0
  44. package/dist/services/call-budget.js +28 -0
  45. package/dist/services/call-budget.js.map +1 -0
  46. package/dist/services/dmap/dmap-service.d.ts +43 -13
  47. package/dist/services/dmap/dmap-service.d.ts.map +1 -1
  48. package/dist/services/dmap/dmap-service.js +270 -68
  49. package/dist/services/dmap/dmap-service.js.map +1 -1
  50. package/dist/services/echo/echo-service.d.ts +38 -11
  51. package/dist/services/echo/echo-service.d.ts.map +1 -1
  52. package/dist/services/echo/echo-service.js +417 -223
  53. package/dist/services/echo/echo-service.js.map +1 -1
  54. package/dist/services/echo/types.d.ts +167 -80
  55. package/dist/services/echo/types.d.ts.map +1 -1
  56. package/dist/services/ejscreen/ejscreen-service.d.ts.map +1 -1
  57. package/dist/services/ejscreen/ejscreen-service.js +9 -3
  58. package/dist/services/ejscreen/ejscreen-service.js.map +1 -1
  59. package/package.json +6 -6
  60. package/server.json +3 -3
@@ -8,16 +8,26 @@ import type { Context } from '@cyanheads/mcp-ts-core';
8
8
  import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
9
9
  import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
10
10
  import type { EpaCase, EpaFacility, EpaFacilityProfile } from './types.js';
11
+ /** Programs a facility search filters on. */
12
+ export type FacilityProgram = 'CAA' | 'CWA' | 'RCRA' | 'TRI' | 'SDWA';
13
+ /** Enforcement case types a case search filters on. */
14
+ export type CaseType = 'civil' | 'criminal' | 'all';
11
15
  export declare class EchoService {
12
16
  private readonly baseUrl;
13
- constructor(_config: AppConfig, _storage: StorageService);
17
+ private readonly userAgent;
18
+ constructor(config: AppConfig, _storage: StorageService);
14
19
  /** Build URL with query params. */
15
20
  private buildUrl;
16
- /** Fetch JSON from ECHO with retry. */
21
+ /**
22
+ * Fetch JSON from ECHO with retry. `retry.deadlineMs` bounds every attempt and backoff and is
23
+ * required, so no ECHO request runs without a share of its tool call's budget; `maxRetries`
24
+ * narrows the attempt count.
25
+ */
17
26
  private fetchJson;
18
27
  /**
19
- * Search EPA-regulated facilities using ECHO get_facility_info.
20
- * At least one geographic parameter must be supplied.
28
+ * Search EPA-regulated facilities using ECHO get_facility_info, then get_qid for the first
29
+ * page when ECHO does not return the rows inline. At least one geographic parameter must be
30
+ * supplied.
21
31
  */
22
32
  searchFacilities(params: {
23
33
  zipCode?: string;
@@ -27,7 +37,7 @@ export declare class EchoService {
27
37
  longitude?: number;
28
38
  radiusMiles?: number;
29
39
  activeOnly?: boolean;
30
- programs?: string[];
40
+ program?: FacilityProgram;
31
41
  hasViolation?: boolean;
32
42
  limit?: number;
33
43
  }, ctx: Context): Promise<{
@@ -35,14 +45,26 @@ export declare class EchoService {
35
45
  totalCount: number;
36
46
  }>;
37
47
  /**
38
- * Retrieve a full compliance profile for a single facility, aggregating multiple DFR endpoints.
48
+ * Retrieve a full compliance profile for a single facility from one
49
+ * dfr_rest_services.get_dfr response, plus a best-effort facility search row for the
50
+ * facility-level compliance status that no DFR section carries.
39
51
  *
40
- * Step 1 uses dfr_rest_services.get_dfr (accepts Registry IDs directly) to obtain base facility
41
- * data. The previous approach used echo_rest_services.get_facility_info?p_id=registryId, which
42
- * only accepts program-specific IDs (e.g. RCRA handler IDs), never numeric Registry IDs — so it
43
- * always returned 0 results. Steps 2-5 run in parallel after the initial DFR fetch.
52
+ * get_dfr takes a Registry ID or a program ID (a TRI or RCRA ID resolves to its Registry ID);
53
+ * echo_rest_services.get_facility_info takes the resolved Registry ID only as `p_frs`.
54
+ * A failed status lookup is disclosed as an enrichment notice.
44
55
  */
45
56
  getFacility(registryId: string, ctx: Context): Promise<EpaFacilityProfile>;
57
+ /** The getFacility profile, with the notice to show when the status lookup failed. */
58
+ getFacilityReport(registryId: string, ctx: Context): Promise<{
59
+ profile: EpaFacilityProfile;
60
+ notice?: string;
61
+ }>;
62
+ /**
63
+ * Best-effort echo_rest_services.get_facility_info?p_frs row, the only source of ECHO's
64
+ * facility-level compliance status. Two attempts within what is left of the call's budget;
65
+ * any failure but caller cancellation returns `failed` instead of throwing.
66
+ */
67
+ private fetchFacilityStatusRow;
46
68
  /**
47
69
  * Search EPA enforcement cases using a two-step ECHO case_rest_services flow.
48
70
  *
@@ -51,12 +73,17 @@ export declare class EchoService {
51
73
  *
52
74
  * The single-step approach (reading Cases from get_case_info) always returns empty because
53
75
  * get_case_info is a discovery/cluster endpoint that does not include paginated case records.
76
+ *
77
+ * Filing dates are validated YYYY-MM-DD strings. A date bound sends both MM/DD/YYYY ends ECHO
78
+ * requires — an open end reads 01/01/1900 or today (UTC), and each end is clamped to that span —
79
+ * with the civil filing milestones. A range that clamps empty returns no cases without a
80
+ * request: ECHO answers an inverted range with an in-band error, not an empty result.
54
81
  */
55
82
  searchViolations(params: {
56
83
  state?: string;
57
84
  zipCode?: string;
58
85
  program?: string;
59
- caseType?: string;
86
+ caseType?: CaseType;
60
87
  dateFiledStart?: string;
61
88
  dateFiledEnd?: string;
62
89
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"echo-service.d.ts","sourceRoot":"","sources":["../../../src/services/echo/echo-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EASnB,MAAM,YAAY,CAAC;AA0CpB,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAGjC,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAEvD;IAED,mCAAmC;IACnC,OAAO,CAAC,QAAQ;IAahB,uCAAuC;YAEzB,SAAS;IAiCvB;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EACD,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAqE5D;IAED;;;;;;;OAOG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiJ/E;IAED;;;;;;;;OAQG;IACG,gBAAgB,CACpB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EACD,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CA8DnD;CACF;AAMD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEhF;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
1
+ {"version":3,"file":"echo-service.d.ts","sourceRoot":"","sources":["../../../src/services/echo/echo-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAO/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAWnB,MAAM,YAAY,CAAC;AA4BpB,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AActE,uDAAuD;AACvD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;AA+MpD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAGnC,YAAY,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAGtD;IAED,mCAAmC;IACnC,OAAO,CAAC,QAAQ;IAahB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAmCjB;;;;OAIG;IACG,gBAAgB,CACpB,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,eAAe,CAAC;QAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EACD,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAgE5D;IAED;;;;;;;;OAQG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAI/E;IAED,sFAAsF;IAChF,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAkK3D;IAED;;;;OAIG;YACW,sBAAsB;IA6BpC;;;;;;;;;;;;;OAaG;IACG,gBAAgB,CACpB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EACD,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAiFnD;CACF;AAMD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEhF;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}