@ansvar/ch-environmental-compliance-mcp 0.1.0

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 (113) hide show
  1. package/.github/workflows/check-freshness.yml +49 -0
  2. package/.github/workflows/ci.yml +21 -0
  3. package/.github/workflows/codeql.yml +25 -0
  4. package/.github/workflows/ghcr-build.yml +45 -0
  5. package/.github/workflows/gitleaks.yml +18 -0
  6. package/.github/workflows/ingest.yml +59 -0
  7. package/.github/workflows/publish.yml +24 -0
  8. package/CHANGELOG.md +15 -0
  9. package/CODEOWNERS +1 -0
  10. package/COVERAGE.md +50 -0
  11. package/DISCLAIMER.md +48 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +23 -0
  15. package/README.md +116 -0
  16. package/SECURITY.md +25 -0
  17. package/TOOLS.md +142 -0
  18. package/data/coverage.json +24 -0
  19. package/data/database.db +0 -0
  20. package/data/sources.yml +36 -0
  21. package/dist/db.d.ts +25 -0
  22. package/dist/db.d.ts.map +1 -0
  23. package/dist/db.js +197 -0
  24. package/dist/db.js.map +1 -0
  25. package/dist/http-server.d.ts +2 -0
  26. package/dist/http-server.d.ts.map +1 -0
  27. package/dist/http-server.js +274 -0
  28. package/dist/http-server.js.map +1 -0
  29. package/dist/jurisdiction.d.ts +18 -0
  30. package/dist/jurisdiction.d.ts.map +1 -0
  31. package/dist/jurisdiction.js +16 -0
  32. package/dist/jurisdiction.js.map +1 -0
  33. package/dist/metadata.d.ts +10 -0
  34. package/dist/metadata.d.ts.map +1 -0
  35. package/dist/metadata.js +22 -0
  36. package/dist/metadata.js.map +1 -0
  37. package/dist/server.d.ts +3 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +220 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/tools/about.d.ts +15 -0
  42. package/dist/tools/about.d.ts.map +1 -0
  43. package/dist/tools/about.js +27 -0
  44. package/dist/tools/about.js.map +1 -0
  45. package/dist/tools/check-environmental-compliance.d.ts +30 -0
  46. package/dist/tools/check-environmental-compliance.d.ts.map +1 -0
  47. package/dist/tools/check-environmental-compliance.js +103 -0
  48. package/dist/tools/check-environmental-compliance.js.map +1 -0
  49. package/dist/tools/check-freshness.d.ts +15 -0
  50. package/dist/tools/check-freshness.d.ts.map +1 -0
  51. package/dist/tools/check-freshness.js +26 -0
  52. package/dist/tools/check-freshness.js.map +1 -0
  53. package/dist/tools/get-ammonia-rules.d.ts +24 -0
  54. package/dist/tools/get-ammonia-rules.d.ts.map +1 -0
  55. package/dist/tools/get-ammonia-rules.js +31 -0
  56. package/dist/tools/get-ammonia-rules.js.map +1 -0
  57. package/dist/tools/get-bff-requirements.d.ts +26 -0
  58. package/dist/tools/get-bff-requirements.d.ts.map +1 -0
  59. package/dist/tools/get-bff-requirements.js +36 -0
  60. package/dist/tools/get-bff-requirements.js.map +1 -0
  61. package/dist/tools/get-buffer-zone-rules.d.ts +23 -0
  62. package/dist/tools/get-buffer-zone-rules.d.ts.map +1 -0
  63. package/dist/tools/get-buffer-zone-rules.js +30 -0
  64. package/dist/tools/get-buffer-zone-rules.js.map +1 -0
  65. package/dist/tools/get-eip-requirements.d.ts +31 -0
  66. package/dist/tools/get-eip-requirements.d.ts.map +1 -0
  67. package/dist/tools/get-eip-requirements.js +40 -0
  68. package/dist/tools/get-eip-requirements.js.map +1 -0
  69. package/dist/tools/get-nutrient-loss-limits.d.ts +24 -0
  70. package/dist/tools/get-nutrient-loss-limits.d.ts.map +1 -0
  71. package/dist/tools/get-nutrient-loss-limits.js +31 -0
  72. package/dist/tools/get-nutrient-loss-limits.js.map +1 -0
  73. package/dist/tools/get-water-protection-zones.d.ts +32 -0
  74. package/dist/tools/get-water-protection-zones.d.ts.map +1 -0
  75. package/dist/tools/get-water-protection-zones.js +36 -0
  76. package/dist/tools/get-water-protection-zones.js.map +1 -0
  77. package/dist/tools/list-sources.d.ts +18 -0
  78. package/dist/tools/list-sources.d.ts.map +1 -0
  79. package/dist/tools/list-sources.js +61 -0
  80. package/dist/tools/list-sources.js.map +1 -0
  81. package/dist/tools/search-environmental-rules.d.ts +25 -0
  82. package/dist/tools/search-environmental-rules.d.ts.map +1 -0
  83. package/dist/tools/search-environmental-rules.js +26 -0
  84. package/dist/tools/search-environmental-rules.js.map +1 -0
  85. package/docker-compose.yml +12 -0
  86. package/eslint.config.js +26 -0
  87. package/package.json +54 -0
  88. package/scripts/ingest.ts +911 -0
  89. package/server.json +16 -0
  90. package/src/db.ts +238 -0
  91. package/src/http-server.ts +307 -0
  92. package/src/jurisdiction.ts +30 -0
  93. package/src/metadata.ts +32 -0
  94. package/src/server.ts +244 -0
  95. package/src/tools/about.ts +28 -0
  96. package/src/tools/check-environmental-compliance.ts +143 -0
  97. package/src/tools/check-freshness.ts +42 -0
  98. package/src/tools/get-ammonia-rules.ts +44 -0
  99. package/src/tools/get-bff-requirements.ts +52 -0
  100. package/src/tools/get-buffer-zone-rules.ts +43 -0
  101. package/src/tools/get-eip-requirements.ts +57 -0
  102. package/src/tools/get-nutrient-loss-limits.ts +44 -0
  103. package/src/tools/get-water-protection-zones.ts +50 -0
  104. package/src/tools/list-sources.ts +75 -0
  105. package/src/tools/search-environmental-rules.ts +35 -0
  106. package/tests/db.test.ts +80 -0
  107. package/tests/helpers/seed-db.ts +173 -0
  108. package/tests/jurisdiction.test.ts +35 -0
  109. package/tests/tools/about.test.ts +26 -0
  110. package/tests/tools/check-freshness.test.ts +50 -0
  111. package/tests/tools/list-sources.test.ts +61 -0
  112. package/tests/tools/search-environmental-rules.test.ts +47 -0
  113. package/tsconfig.json +19 -0
@@ -0,0 +1,27 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { SUPPORTED_JURISDICTIONS } from '../jurisdiction.js';
3
+ export function handleAbout() {
4
+ return {
5
+ name: 'Switzerland Environmental Compliance MCP',
6
+ description: 'Swiss environmental compliance data for agriculture: Gewaesserschutz (GSchG), Grundwasserschutzzonen, ' +
7
+ 'Pufferstreifen, Ammoniakemissionen (LRV, Agrammon), Biodiversitaetsfoerderflaechen (BFF), ' +
8
+ 'Naehrstoffverlust-Absenkpfad (Pa.Iv. 19.475), UVP-Schwellenwerte, and Bodenbelastung (VBBo). ' +
9
+ 'Covers federal regulations and cantonal implementation for Swiss agricultural operations.',
10
+ version: '0.1.0',
11
+ jurisdiction: [...SUPPORTED_JURISDICTIONS],
12
+ data_sources: [
13
+ 'BAFU — Gewaesserschutz, Luftreinhaltung, Biodiversitaet',
14
+ 'BLW — OELN-Auflagen, BFF-Typen, DZV',
15
+ 'Agroscope — Agrammon Ammoniakemissionsfaktoren',
16
+ 'Kantonale Umweltaemter — Grundwasserschutzzonen',
17
+ ],
18
+ tools_count: 11,
19
+ links: {
20
+ homepage: 'https://ansvar.eu/open-agriculture',
21
+ repository: 'https://github.com/ansvar-systems/ch-environmental-compliance-mcp',
22
+ mcp_network: 'https://ansvar.ai/mcp',
23
+ },
24
+ _meta: buildMeta(),
25
+ };
26
+ }
27
+ //# sourceMappingURL=about.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/tools/about.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,0CAA0C;QAChD,WAAW,EACT,wGAAwG;YACxG,4FAA4F;YAC5F,+FAA+F;YAC/F,2FAA2F;QAC7F,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,CAAC,GAAG,uBAAuB,CAAC;QAC1C,YAAY,EAAE;YACZ,yDAAyD;YACzD,qCAAqC;YACrC,gDAAgD;YAChD,iDAAiD;SAClD;QACD,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,QAAQ,EAAE,oCAAoC;YAC9C,UAAU,EAAE,mEAAmE;YAC/E,WAAW,EAAE,uBAAuB;SACrC;QACD,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Database } from '../db.js';
2
+ interface ComplianceArgs {
3
+ facility_type: string;
4
+ animal_count?: number;
5
+ area_ha?: number;
6
+ jurisdiction?: string;
7
+ }
8
+ export declare function handleCheckEnvironmentalCompliance(db: Database, args: ComplianceArgs): {
9
+ error: string;
10
+ supported: readonly string[];
11
+ message: string;
12
+ } | {
13
+ facility_type: string;
14
+ animal_count: number | null;
15
+ area_ha: number | null;
16
+ jurisdiction: "CH";
17
+ applicable_rules: number;
18
+ rules: {
19
+ category: string;
20
+ rule: string;
21
+ requirement: string;
22
+ legal_basis: string;
23
+ applies: boolean;
24
+ reason: string;
25
+ }[];
26
+ note: string;
27
+ _meta: import("../metadata.js").Meta;
28
+ };
29
+ export {};
30
+ //# sourceMappingURL=check-environmental-compliance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-environmental-compliance.d.ts","sourceRoot":"","sources":["../../src/tools/check-environmental-compliance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,cAAc;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,kCAAkC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc;;;;;;;;;;;kBAKvE,MAAM;cACV,MAAM;qBACC,MAAM;qBACN,MAAM;iBACV,OAAO;gBACR,MAAM;;;;EAyHjB"}
@@ -0,0 +1,103 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleCheckEnvironmentalCompliance(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ const applicable = [];
8
+ // Check water protection requirements
9
+ const waterZones = db.all('SELECT zone_type, restrictions, legal_basis FROM water_protection_zones WHERE jurisdiction = ?', [jv.jurisdiction]);
10
+ for (const z of waterZones) {
11
+ applicable.push({
12
+ category: 'Gewaesserschutz',
13
+ rule: `Grundwasserschutzzone ${z.zone_type}`,
14
+ requirement: z.restrictions,
15
+ legal_basis: z.legal_basis ?? 'GSchG Art. 20',
16
+ applies: true,
17
+ reason: 'Pruefen Sie, ob Ihr Standort in einer Schutzzone liegt (kantonaler Zonenplan).',
18
+ });
19
+ }
20
+ // Check buffer zone requirements
21
+ const buffers = db.all('SELECT type, distance_m, requirement, source_law FROM buffer_zones WHERE jurisdiction = ?', [jv.jurisdiction]);
22
+ for (const b of buffers) {
23
+ applicable.push({
24
+ category: 'Pufferstreifen',
25
+ rule: `${b.type} — ${b.distance_m}m`,
26
+ requirement: b.requirement,
27
+ legal_basis: b.source_law,
28
+ applies: true,
29
+ reason: 'OELN-Pflicht fuer alle Direktzahlungsempfaenger.',
30
+ });
31
+ }
32
+ // Check ammonia rules
33
+ const ammoniaRules = db.all('SELECT technique, requirement, legal_basis FROM ammonia_rules WHERE jurisdiction = ?', [jv.jurisdiction]);
34
+ const hasLivestock = args.animal_count !== undefined && args.animal_count > 0;
35
+ for (const a of ammoniaRules) {
36
+ applicable.push({
37
+ category: 'Ammoniakemissionen',
38
+ rule: a.technique,
39
+ requirement: a.requirement,
40
+ legal_basis: a.legal_basis ?? 'LRV Anhang 2',
41
+ applies: hasLivestock,
42
+ reason: hasLivestock
43
+ ? `Relevant bei ${args.animal_count} Tieren.`
44
+ : 'Nur relevant bei Tierhaltung.',
45
+ });
46
+ }
47
+ // Check BFF minimum
48
+ const bffMin = db.get(`SELECT min_area_pct FROM bff_types WHERE min_area_pct > 0 AND jurisdiction = ? ORDER BY min_area_pct DESC LIMIT 1`, [jv.jurisdiction]);
49
+ if (bffMin && args.area_ha) {
50
+ applicable.push({
51
+ category: 'Biodiversitaetsfoerderflaechen',
52
+ rule: 'Mindestanteil BFF',
53
+ requirement: `Mindestens ${bffMin.min_area_pct}% der LN als BFF (${(args.area_ha * bffMin.min_area_pct / 100).toFixed(2)} ha bei ${args.area_ha} ha LN)`,
54
+ legal_basis: 'DZV Art. 14',
55
+ applies: true,
56
+ reason: 'OELN-Pflicht fuer alle Direktzahlungsempfaenger.',
57
+ });
58
+ }
59
+ // Check UVP thresholds
60
+ const uvpRules = db.all(`SELECT rule, threshold, legal_basis FROM environmental_rules WHERE topic = 'UVP' AND jurisdiction = ?`, [jv.jurisdiction]);
61
+ for (const u of uvpRules) {
62
+ const uvpApplies = args.animal_count !== undefined && args.animal_count >= 150;
63
+ applicable.push({
64
+ category: 'UVP (Umweltvertraeglichkeitspruefung)',
65
+ rule: u.rule,
66
+ requirement: u.threshold ?? '',
67
+ legal_basis: u.legal_basis,
68
+ applies: uvpApplies,
69
+ reason: uvpApplies
70
+ ? `Bei ${args.animal_count} Tieren ist eine UVP-Pruefung wahrscheinlich erforderlich.`
71
+ : 'UVP-Schwellenwerte pruefen (kantonal, ab ca. 150 GVE).',
72
+ });
73
+ }
74
+ // Check Pa.Iv. 19.475 nutrient loss limits
75
+ const currentYear = new Date().getFullYear();
76
+ const limits = db.all('SELECT nutrient, limit_pct, target FROM nutrient_loss_limits WHERE year <= ? AND jurisdiction = ? ORDER BY year DESC', [currentYear, jv.jurisdiction]);
77
+ const latestN = limits.find(l => l.nutrient === 'N');
78
+ const latestP = limits.find(l => l.nutrient === 'P');
79
+ if (latestN || latestP) {
80
+ applicable.push({
81
+ category: 'Naehrstoffverluste (Pa.Iv. 19.475)',
82
+ rule: 'Absenkpfad Stickstoff und Phosphor',
83
+ requirement: [
84
+ latestN ? `N: -${latestN.limit_pct}% (${latestN.target})` : '',
85
+ latestP ? `P: -${latestP.limit_pct}% (${latestP.target})` : '',
86
+ ].filter(Boolean).join('; '),
87
+ legal_basis: 'LwG Art. 6a (Pa.Iv. 19.475)',
88
+ applies: true,
89
+ reason: 'Betrifft alle Betriebe mit Direktzahlungen.',
90
+ });
91
+ }
92
+ return {
93
+ facility_type: args.facility_type,
94
+ animal_count: args.animal_count ?? null,
95
+ area_ha: args.area_ha ?? null,
96
+ jurisdiction: jv.jurisdiction,
97
+ applicable_rules: applicable.length,
98
+ rules: applicable,
99
+ note: 'Diese Zusammenstellung ist indikativ. Kantonale Auflagen und standortspezifische Anforderungen sind separat zu pruefen.',
100
+ _meta: buildMeta(),
101
+ };
102
+ }
103
+ //# sourceMappingURL=check-environmental-compliance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-environmental-compliance.js","sourceRoot":"","sources":["../../src/tools/check-environmental-compliance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAU1D,MAAM,UAAU,kCAAkC,CAAC,EAAY,EAAE,IAAoB;IACnF,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,MAAM,UAAU,GAOV,EAAE,CAAC;IAET,sCAAsC;IACtC,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,CACvB,gGAAgG,EAChG,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,iBAAiB;YAC3B,IAAI,EAAE,yBAAyB,CAAC,CAAC,SAAS,EAAE;YAC5C,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,eAAe;YAC7C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gFAAgF;SACzF,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CACpB,2FAA2F,EAC3F,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,UAAU,GAAG;YACpC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,kDAAkD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,EAAE,CAAC,GAAG,CACzB,sFAAsF,EACtF,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,oBAAoB;YAC9B,IAAI,EAAE,CAAC,CAAC,SAAS;YACjB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,cAAc;YAC5C,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,YAAY;gBAClB,CAAC,CAAC,gBAAgB,IAAI,CAAC,YAAY,UAAU;gBAC7C,CAAC,CAAC,+BAA+B;SACpC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CACnB,mHAAmH,EACnH,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,gCAAgC;YAC1C,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,cAAc,MAAM,CAAC,YAAY,qBAAqB,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,OAAO,SAAS;YACxJ,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,kDAAkD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CACrB,uGAAuG,EACvG,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC;QAC/E,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,uCAAuC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;YAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,UAAU;gBAChB,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,4DAA4D;gBACtF,CAAC,CAAC,wDAAwD;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CACnB,sHAAsH,EACtH,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,CAC/B,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;IACrD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,oCAAoC;YAC9C,IAAI,EAAE,oCAAoC;YAC1C,WAAW,EAAE;gBACX,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC9D,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;aAC/D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,6CAA6C;SACtD,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACvC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,gBAAgB,EAAE,UAAU,CAAC,MAAM;QACnC,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,yHAAyH;QAC/H,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import type { Database } from '../db.js';
3
+ interface FreshnessResult {
4
+ status: 'fresh' | 'stale' | 'unknown';
5
+ last_ingest: string | null;
6
+ build_date: string | null;
7
+ schema_version: string | null;
8
+ days_since_ingest: number | null;
9
+ staleness_threshold_days: number;
10
+ refresh_command: string;
11
+ _meta: ReturnType<typeof buildMeta>;
12
+ }
13
+ export declare function handleCheckFreshness(db: Database): FreshnessResult;
14
+ export {};
15
+ //# sourceMappingURL=check-freshness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-freshness.d.ts","sourceRoot":"","sources":["../../src/tools/check-freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;CACrC;AAID,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,GAAG,eAAe,CAyBlE"}
@@ -0,0 +1,26 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ const STALENESS_THRESHOLD_DAYS = 90;
3
+ export function handleCheckFreshness(db) {
4
+ const lastIngest = db.get('SELECT value FROM db_metadata WHERE key = ?', ['last_ingest']);
5
+ const buildDate = db.get('SELECT value FROM db_metadata WHERE key = ?', ['build_date']);
6
+ const schemaVersion = db.get('SELECT value FROM db_metadata WHERE key = ?', ['schema_version']);
7
+ let status = 'unknown';
8
+ let daysSinceIngest = null;
9
+ if (lastIngest?.value) {
10
+ const ingestDate = new Date(lastIngest.value);
11
+ const now = new Date();
12
+ daysSinceIngest = Math.floor((now.getTime() - ingestDate.getTime()) / (1000 * 60 * 60 * 24));
13
+ status = daysSinceIngest <= STALENESS_THRESHOLD_DAYS ? 'fresh' : 'stale';
14
+ }
15
+ return {
16
+ status,
17
+ last_ingest: lastIngest?.value ?? null,
18
+ build_date: buildDate?.value ?? null,
19
+ schema_version: schemaVersion?.value ?? null,
20
+ days_since_ingest: daysSinceIngest,
21
+ staleness_threshold_days: STALENESS_THRESHOLD_DAYS,
22
+ refresh_command: 'gh workflow run ingest.yml -R ansvar-systems/ch-environmental-compliance-mcp',
23
+ _meta: buildMeta(),
24
+ };
25
+ }
26
+ //# sourceMappingURL=check-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-freshness.js","sourceRoot":"","sources":["../../src/tools/check-freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAc3C,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3G,MAAM,aAAa,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEnH,IAAI,MAAM,GAAkC,SAAS,CAAC;IACtD,IAAI,eAAe,GAAkB,IAAI,CAAC;IAE1C,IAAI,UAAU,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7F,MAAM,GAAG,eAAe,IAAI,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,MAAM;QACN,WAAW,EAAE,UAAU,EAAE,KAAK,IAAI,IAAI;QACtC,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;QACpC,cAAc,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI;QAC5C,iBAAiB,EAAE,eAAe;QAClC,wBAAwB,EAAE,wBAAwB;QAClD,eAAe,EAAE,8EAA8E;QAC/F,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Database } from '../db.js';
2
+ interface AmmoniaArgs {
3
+ technique?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetAmmoniaRules(db: Database, args: AmmoniaArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ jurisdiction: "CH";
12
+ rules_count: number;
13
+ rules: {
14
+ technique: string;
15
+ emission_factor_pct: number;
16
+ requirement: string;
17
+ legal_basis: string;
18
+ effective_date: string;
19
+ notes: string;
20
+ }[];
21
+ _meta: import("../metadata.js").Meta;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=get-ammonia-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ammonia-rules.d.ts","sourceRoot":"","sources":["../../src/tools/get-ammonia-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW;;;;;;;;;;;;;;;;EAkCpE"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetAmmoniaRules(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM ammonia_rules WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.technique) {
10
+ sql += ' AND LOWER(technique) LIKE LOWER(?)';
11
+ params.push(`%${args.technique}%`);
12
+ }
13
+ sql += ' ORDER BY technique';
14
+ const rules = db.all(sql, params);
15
+ return {
16
+ jurisdiction: jv.jurisdiction,
17
+ rules_count: rules.length,
18
+ rules: rules.map(r => ({
19
+ technique: r.technique,
20
+ emission_factor_pct: r.emission_factor,
21
+ requirement: r.requirement,
22
+ legal_basis: r.legal_basis,
23
+ effective_date: r.effective_date,
24
+ notes: r.notes,
25
+ })),
26
+ _meta: buildMeta({
27
+ source_url: 'https://www.bafu.admin.ch/bafu/de/home/themen/luft/fachinformationen/luftschadstoffquellen/emissionen-der-landwirtschaft.html',
28
+ }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-ammonia-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ammonia-rules.js","sourceRoot":"","sources":["../../src/tools/get-ammonia-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,qBAAqB,CAAC,EAAY,EAAE,IAAiB;IACnE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,oDAAoD,CAAC;IAC/D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,GAAG,IAAI,qCAAqC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,IAAI,qBAAqB,CAAC;IAE7B,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAGjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,mBAAmB,EAAE,CAAC,CAAC,eAAe;YACtC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,+HAA+H;SAC5I,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Database } from '../db.js';
2
+ interface BffArgs {
3
+ bff_type?: string;
4
+ quality_level?: string;
5
+ jurisdiction?: string;
6
+ }
7
+ export declare function handleGetBffRequirements(db: Database, args: BffArgs): {
8
+ error: string;
9
+ supported: readonly string[];
10
+ message: string;
11
+ } | {
12
+ jurisdiction: "CH";
13
+ types_count: number;
14
+ types: {
15
+ id: string;
16
+ name: string;
17
+ quality_level: string;
18
+ payment_chf_ha: number;
19
+ min_area_pct: number;
20
+ botanical_criteria: string;
21
+ notes: string;
22
+ }[];
23
+ _meta: import("../metadata.js").Meta;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=get-bff-requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-bff-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/get-bff-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,OAAO;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;EAyCnE"}
@@ -0,0 +1,36 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetBffRequirements(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM bff_types WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.bff_type) {
10
+ sql += ' AND (LOWER(id) LIKE LOWER(?) OR LOWER(name) LIKE LOWER(?))';
11
+ params.push(`%${args.bff_type}%`, `%${args.bff_type}%`);
12
+ }
13
+ if (args.quality_level) {
14
+ sql += ' AND UPPER(quality_level) = UPPER(?)';
15
+ params.push(args.quality_level);
16
+ }
17
+ sql += ' ORDER BY name, quality_level';
18
+ const types = db.all(sql, params);
19
+ return {
20
+ jurisdiction: jv.jurisdiction,
21
+ types_count: types.length,
22
+ types: types.map(t => ({
23
+ id: t.id,
24
+ name: t.name,
25
+ quality_level: t.quality_level,
26
+ payment_chf_ha: t.payment_chf_ha,
27
+ min_area_pct: t.min_area_pct,
28
+ botanical_criteria: t.botanical_criteria,
29
+ notes: t.notes,
30
+ })),
31
+ _meta: buildMeta({
32
+ source_url: 'https://www.blw.admin.ch/blw/de/home/instrumente/direktzahlungen/biodiversitaetsbeitraege.html',
33
+ }),
34
+ };
35
+ }
36
+ //# sourceMappingURL=get-bff-requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-bff-requirements.js","sourceRoot":"","sources":["../../src/tools/get-bff-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAa;IAClE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,gDAAgD,CAAC;IAC3D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,GAAG,IAAI,6DAA6D,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,GAAG,IAAI,sCAAsC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,IAAI,+BAA+B,CAAC;IAEvC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAIjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,gGAAgG;SAC7G,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Database } from '../db.js';
2
+ interface BufferZoneArgs {
3
+ zone_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetBufferZoneRules(db: Database, args: BufferZoneArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ jurisdiction: "CH";
12
+ rules_count: number;
13
+ rules: {
14
+ type: string;
15
+ distance_m: number;
16
+ requirement: string;
17
+ source_law: string;
18
+ notes: string;
19
+ }[];
20
+ _meta: import("../metadata.js").Meta;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=get-buffer-zone-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-buffer-zone-rules.d.ts","sourceRoot":"","sources":["../../src/tools/get-buffer-zone-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc;;;;;;;;;;;;;;;EAiC1E"}
@@ -0,0 +1,30 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetBufferZoneRules(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM buffer_zones WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.zone_type) {
10
+ sql += ' AND LOWER(type) LIKE LOWER(?)';
11
+ params.push(`%${args.zone_type}%`);
12
+ }
13
+ sql += ' ORDER BY distance_m DESC';
14
+ const zones = db.all(sql, params);
15
+ return {
16
+ jurisdiction: jv.jurisdiction,
17
+ rules_count: zones.length,
18
+ rules: zones.map(z => ({
19
+ type: z.type,
20
+ distance_m: z.distance_m,
21
+ requirement: z.requirement,
22
+ source_law: z.source_law,
23
+ notes: z.notes,
24
+ })),
25
+ _meta: buildMeta({
26
+ source_url: 'https://www.blw.admin.ch/blw/de/home/instrumente/direktzahlungen/oekologischer-leistungsnachweis.html',
27
+ }),
28
+ };
29
+ }
30
+ //# sourceMappingURL=get-buffer-zone-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-buffer-zone-rules.js","sourceRoot":"","sources":["../../src/tools/get-buffer-zone-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAoB;IACzE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,mDAAmD,CAAC;IAC9D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,GAAG,IAAI,gCAAgC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,IAAI,2BAA2B,CAAC;IAEnC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAGjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,uGAAuG;SACpH,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Database } from '../db.js';
2
+ interface EipArgs {
3
+ project_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetEipRequirements(db: Database, args: EipArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ jurisdiction: "CH";
12
+ uvp_rules_count: number;
13
+ uvp_rules: {
14
+ rule: string;
15
+ authority: string;
16
+ legal_basis: string;
17
+ threshold: string;
18
+ notes: string;
19
+ }[];
20
+ vbbo_rules_count: number;
21
+ vbbo_rules: {
22
+ rule: string;
23
+ authority: string;
24
+ legal_basis: string;
25
+ threshold: string;
26
+ notes: string;
27
+ }[];
28
+ _meta: import("../metadata.js").Meta;
29
+ };
30
+ export {};
31
+ //# sourceMappingURL=get-eip-requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-eip-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/get-eip-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,OAAO;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;EA+CnE"}
@@ -0,0 +1,40 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetEipRequirements(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = `SELECT * FROM environmental_rules WHERE topic = 'UVP' AND jurisdiction = ?`;
8
+ const params = [jv.jurisdiction];
9
+ if (args.project_type) {
10
+ sql += ' AND LOWER(rule) LIKE LOWER(?)';
11
+ params.push(`%${args.project_type}%`);
12
+ }
13
+ sql += ' ORDER BY id';
14
+ const rules = db.all(sql, params);
15
+ // Also get VBBo (soil contamination) rules
16
+ const vbbo = db.all(`SELECT * FROM environmental_rules WHERE topic = 'VBBo' AND jurisdiction = ? ORDER BY id`, [jv.jurisdiction]);
17
+ return {
18
+ jurisdiction: jv.jurisdiction,
19
+ uvp_rules_count: rules.length,
20
+ uvp_rules: rules.map(r => ({
21
+ rule: r.rule,
22
+ authority: r.authority,
23
+ legal_basis: r.legal_basis,
24
+ threshold: r.threshold,
25
+ notes: r.notes,
26
+ })),
27
+ vbbo_rules_count: vbbo.length,
28
+ vbbo_rules: vbbo.map(r => ({
29
+ rule: r.rule,
30
+ authority: r.authority,
31
+ legal_basis: r.legal_basis,
32
+ threshold: r.threshold,
33
+ notes: r.notes,
34
+ })),
35
+ _meta: buildMeta({
36
+ source_url: 'https://www.bafu.admin.ch/bafu/de/home/themen/uvp.html',
37
+ }),
38
+ };
39
+ }
40
+ //# sourceMappingURL=get-eip-requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-eip-requirements.js","sourceRoot":"","sources":["../../src/tools/get-eip-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAa;IAClE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,4EAA4E,CAAC;IACvF,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,GAAG,IAAI,gCAAgC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,IAAI,cAAc,CAAC;IAEtB,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAGjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,2CAA2C;IAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAGhB,yFAAyF,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjH,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,eAAe,EAAE,KAAK,CAAC,MAAM;QAC7B,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,gBAAgB,EAAE,IAAI,CAAC,MAAM;QAC7B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,wDAAwD;SACrE,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Database } from '../db.js';
2
+ interface NutrientLossArgs {
3
+ nutrient?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetNutrientLossLimits(db: Database, args: NutrientLossArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ jurisdiction: "CH";
12
+ limits_count: number;
13
+ limits: {
14
+ nutrient: string;
15
+ year: number;
16
+ reduction_target_pct: number;
17
+ target: string;
18
+ legal_basis: string;
19
+ notes: string;
20
+ }[];
21
+ _meta: import("../metadata.js").Meta;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=get-nutrient-loss-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-nutrient-loss-limits.d.ts","sourceRoot":"","sources":["../../src/tools/get-nutrient-loss-limits.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB;;;;;;;;;;;;;;;;EAkC/E"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetNutrientLossLimits(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM nutrient_loss_limits WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.nutrient) {
10
+ sql += ' AND LOWER(nutrient) = LOWER(?)';
11
+ params.push(args.nutrient);
12
+ }
13
+ sql += ' ORDER BY nutrient, year';
14
+ const limits = db.all(sql, params);
15
+ return {
16
+ jurisdiction: jv.jurisdiction,
17
+ limits_count: limits.length,
18
+ limits: limits.map(l => ({
19
+ nutrient: l.nutrient,
20
+ year: l.year,
21
+ reduction_target_pct: l.limit_pct,
22
+ target: l.target,
23
+ legal_basis: l.legal_basis,
24
+ notes: l.notes,
25
+ })),
26
+ _meta: buildMeta({
27
+ source_url: 'https://www.blw.admin.ch/blw/de/home/nachhaltige-produktion/umwelt/naehrstoffe.html',
28
+ }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-nutrient-loss-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-nutrient-loss-limits.js","sourceRoot":"","sources":["../../src/tools/get-nutrient-loss-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,2BAA2B,CAAC,EAAY,EAAE,IAAsB;IAC9E,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,2DAA2D,CAAC;IACtE,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,GAAG,IAAI,iCAAiC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,IAAI,0BAA0B,CAAC;IAElC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAGlB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,oBAAoB,EAAE,CAAC,CAAC,SAAS;YACjC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,qFAAqF;SAClG,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Database } from '../db.js';
2
+ interface WaterProtectionArgs {
3
+ zone_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetWaterProtectionZones(db: Database, args: WaterProtectionArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ error: string;
12
+ message: string;
13
+ jurisdiction?: undefined;
14
+ zones_count?: undefined;
15
+ zones?: undefined;
16
+ _meta?: undefined;
17
+ } | {
18
+ jurisdiction: "CH";
19
+ zones_count: number;
20
+ zones: {
21
+ zone_type: string;
22
+ name: string;
23
+ restrictions: string;
24
+ description: string;
25
+ legal_basis: string;
26
+ }[];
27
+ _meta: import("../metadata.js").Meta;
28
+ error?: undefined;
29
+ message?: undefined;
30
+ };
31
+ export {};
32
+ //# sourceMappingURL=get-water-protection-zones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-water-protection-zones.d.ts","sourceRoot":"","sources":["../../src/tools/get-water-protection-zones.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;EAwCpF"}