@ansvar/ch-farm-safety-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 (109) hide show
  1. package/.github/workflows/check-freshness.yml +53 -0
  2. package/.github/workflows/ci.yml +21 -0
  3. package/.github/workflows/codeql.yml +30 -0
  4. package/.github/workflows/ghcr-build.yml +45 -0
  5. package/.github/workflows/gitleaks.yml +24 -0
  6. package/.github/workflows/ingest.yml +67 -0
  7. package/.github/workflows/publish.yml +24 -0
  8. package/CHANGELOG.md +23 -0
  9. package/CODEOWNERS +1 -0
  10. package/COVERAGE.md +54 -0
  11. package/DISCLAIMER.md +51 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +25 -0
  15. package/README.md +129 -0
  16. package/SECURITY.md +25 -0
  17. package/TOOLS.md +140 -0
  18. package/data/coverage.json +22 -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 +200 -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 +250 -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 +20 -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 +196 -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-freshness.d.ts +15 -0
  46. package/dist/tools/check-freshness.d.ts.map +1 -0
  47. package/dist/tools/check-freshness.js +26 -0
  48. package/dist/tools/check-freshness.js.map +1 -0
  49. package/dist/tools/get-accident-reporting.d.ts +49 -0
  50. package/dist/tools/get-accident-reporting.d.ts.map +1 -0
  51. package/dist/tools/get-accident-reporting.js +31 -0
  52. package/dist/tools/get-accident-reporting.js.map +1 -0
  53. package/dist/tools/get-chemical-safety.d.ts +47 -0
  54. package/dist/tools/get-chemical-safety.d.ts.map +1 -0
  55. package/dist/tools/get-chemical-safety.js +31 -0
  56. package/dist/tools/get-chemical-safety.js.map +1 -0
  57. package/dist/tools/get-machinery-safety.d.ts +46 -0
  58. package/dist/tools/get-machinery-safety.d.ts.map +1 -0
  59. package/dist/tools/get-machinery-safety.js +31 -0
  60. package/dist/tools/get-machinery-safety.js.map +1 -0
  61. package/dist/tools/get-risk-assessment-requirements.d.ts +47 -0
  62. package/dist/tools/get-risk-assessment-requirements.d.ts.map +1 -0
  63. package/dist/tools/get-risk-assessment-requirements.js +31 -0
  64. package/dist/tools/get-risk-assessment-requirements.js.map +1 -0
  65. package/dist/tools/get-young-worker-rules.d.ts +47 -0
  66. package/dist/tools/get-young-worker-rules.d.ts.map +1 -0
  67. package/dist/tools/get-young-worker-rules.js +31 -0
  68. package/dist/tools/get-young-worker-rules.js.map +1 -0
  69. package/dist/tools/list-sources.d.ts +18 -0
  70. package/dist/tools/list-sources.d.ts.map +1 -0
  71. package/dist/tools/list-sources.js +51 -0
  72. package/dist/tools/list-sources.js.map +1 -0
  73. package/dist/tools/search-bul-guidance.d.ts +23 -0
  74. package/dist/tools/search-bul-guidance.d.ts.map +1 -0
  75. package/dist/tools/search-bul-guidance.js +35 -0
  76. package/dist/tools/search-bul-guidance.js.map +1 -0
  77. package/dist/tools/search-safety-rules.d.ts +25 -0
  78. package/dist/tools/search-safety-rules.d.ts.map +1 -0
  79. package/dist/tools/search-safety-rules.js +26 -0
  80. package/dist/tools/search-safety-rules.js.map +1 -0
  81. package/docker-compose.yml +12 -0
  82. package/eslint.config.js +27 -0
  83. package/package.json +54 -0
  84. package/scripts/ingest.ts +879 -0
  85. package/server.json +31 -0
  86. package/src/db.ts +241 -0
  87. package/src/http-server.ts +282 -0
  88. package/src/jurisdiction.ts +30 -0
  89. package/src/metadata.ts +30 -0
  90. package/src/server.ts +219 -0
  91. package/src/tools/about.ts +28 -0
  92. package/src/tools/check-freshness.ts +42 -0
  93. package/src/tools/get-accident-reporting.ts +52 -0
  94. package/src/tools/get-chemical-safety.ts +52 -0
  95. package/src/tools/get-machinery-safety.ts +52 -0
  96. package/src/tools/get-risk-assessment-requirements.ts +52 -0
  97. package/src/tools/get-young-worker-rules.ts +52 -0
  98. package/src/tools/list-sources.ts +65 -0
  99. package/src/tools/search-bul-guidance.ts +51 -0
  100. package/src/tools/search-safety-rules.ts +35 -0
  101. package/tests/db.test.ts +121 -0
  102. package/tests/helpers/seed-db.ts +134 -0
  103. package/tests/jurisdiction.test.ts +54 -0
  104. package/tests/tools/about.test.ts +44 -0
  105. package/tests/tools/check-freshness.test.ts +68 -0
  106. package/tests/tools/list-sources.test.ts +75 -0
  107. package/tests/tools/search-safety-rules.test.ts +75 -0
  108. package/tsconfig.json +19 -0
  109. package/vitest.config.ts +9 -0
@@ -0,0 +1,250 @@
1
+ import { createServer } from 'http';
2
+ import { randomUUID } from 'crypto';
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { z } from 'zod';
7
+ import { createDatabase } from './db.js';
8
+ import { handleAbout } from './tools/about.js';
9
+ import { handleListSources } from './tools/list-sources.js';
10
+ import { handleCheckFreshness } from './tools/check-freshness.js';
11
+ import { handleSearchSafetyRules } from './tools/search-safety-rules.js';
12
+ import { handleGetRiskAssessmentRequirements } from './tools/get-risk-assessment-requirements.js';
13
+ import { handleGetMachinerySafety } from './tools/get-machinery-safety.js';
14
+ import { handleGetChemicalSafety } from './tools/get-chemical-safety.js';
15
+ import { handleGetYoungWorkerRules } from './tools/get-young-worker-rules.js';
16
+ import { handleGetAccidentReporting } from './tools/get-accident-reporting.js';
17
+ import { handleSearchBulGuidance } from './tools/search-bul-guidance.js';
18
+ const SERVER_NAME = 'ch-farm-safety-mcp';
19
+ const SERVER_VERSION = '0.1.0';
20
+ const PORT = parseInt(process.env.PORT ?? '3000', 10);
21
+ const SearchArgsSchema = z.object({
22
+ query: z.string(),
23
+ topic: z.string().optional(),
24
+ jurisdiction: z.string().optional(),
25
+ limit: z.number().optional(),
26
+ });
27
+ const RiskAssessmentArgsSchema = z.object({
28
+ activity_type: z.string().optional(),
29
+ jurisdiction: z.string().optional(),
30
+ });
31
+ const MachinerySafetyArgsSchema = z.object({
32
+ machine_type: z.string().optional(),
33
+ jurisdiction: z.string().optional(),
34
+ });
35
+ const ChemicalSafetyArgsSchema = z.object({
36
+ substance_type: z.string().optional(),
37
+ jurisdiction: z.string().optional(),
38
+ });
39
+ const YoungWorkerArgsSchema = z.object({
40
+ age_group: z.string().optional(),
41
+ jurisdiction: z.string().optional(),
42
+ });
43
+ const AccidentReportingArgsSchema = z.object({
44
+ severity: z.string().optional(),
45
+ jurisdiction: z.string().optional(),
46
+ });
47
+ const BulGuidanceArgsSchema = z.object({
48
+ query: z.string(),
49
+ jurisdiction: z.string().optional(),
50
+ });
51
+ const TOOLS = [
52
+ {
53
+ name: 'about',
54
+ description: 'Get server metadata: name, version, coverage, data sources, and links.',
55
+ inputSchema: { type: 'object', properties: {} },
56
+ },
57
+ {
58
+ name: 'list_sources',
59
+ description: 'List all data sources with authority, URL, license, and freshness info.',
60
+ inputSchema: { type: 'object', properties: {} },
61
+ },
62
+ {
63
+ name: 'check_data_freshness',
64
+ description: 'Check when data was last ingested, staleness status, and how to trigger a refresh.',
65
+ inputSchema: { type: 'object', properties: {} },
66
+ },
67
+ {
68
+ name: 'search_safety_rules',
69
+ description: 'Search Swiss farm workplace safety rules (BUL lebenswichtige Regeln, Suva, EKAS). Use for broad queries about farm safety in Switzerland.',
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties: {
73
+ query: { type: 'string', description: 'Free-text search query (German or English)' },
74
+ topic: { type: 'string', description: 'Filter by safety area: maschinen, tiere, wald, hoehe, chemie, silogas, allgemein' },
75
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
76
+ limit: { type: 'number', description: 'Max results (default: 20, max: 50)' },
77
+ },
78
+ required: ['query'],
79
+ },
80
+ },
81
+ {
82
+ name: 'get_risk_assessment_requirements',
83
+ description: 'Get risk assessment (Risikobeurteilung) obligations for farm activities. Based on EKAS Branchenloesung Landwirtschaft and VUV.',
84
+ inputSchema: {
85
+ type: 'object',
86
+ properties: {
87
+ activity_type: { type: 'string', description: 'Activity type (e.g. Alleinarbeit, Siloarbeiten, Holzerei, Tierhaltung)' },
88
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
89
+ },
90
+ },
91
+ },
92
+ {
93
+ name: 'get_machinery_safety',
94
+ description: 'Get safety requirements for agricultural machinery. Covers ROPS, Gurtpflicht, MFK, speed limits, PTO guards.',
95
+ inputSchema: {
96
+ type: 'object',
97
+ properties: {
98
+ machine_type: { type: 'string', description: 'Machine type (e.g. Traktor, Maehdrescher, Motorsaege, Kreiselmaeher)' },
99
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
100
+ },
101
+ },
102
+ },
103
+ {
104
+ name: 'get_chemical_safety',
105
+ description: 'Get chemical safety data: exposure limits (MAK), required PPE, and storage rules. Covers PSM (Pflanzenschutzmittel), Silogas, Duenger.',
106
+ inputSchema: {
107
+ type: 'object',
108
+ properties: {
109
+ substance_type: { type: 'string', description: 'Substance type (e.g. Pflanzenschutzmittel, Silogas, Ammoniak, Dieselkraftstoff)' },
110
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
111
+ },
112
+ },
113
+ },
114
+ {
115
+ name: 'get_young_worker_rules',
116
+ description: 'Get restrictions for young workers (Jugendarbeitsschutz) on Swiss farms. Covers age thresholds, allowed/forbidden tasks, exceptions for family farms.',
117
+ inputSchema: {
118
+ type: 'object',
119
+ properties: {
120
+ age_group: { type: 'string', description: 'Age group (e.g. unter-13, 13-15, 15-18)' },
121
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
122
+ },
123
+ },
124
+ },
125
+ {
126
+ name: 'get_accident_reporting',
127
+ description: 'Get accident reporting obligations: deadlines, forms, and responsible insurer (Suva for employees, private for self-employed).',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ severity: { type: 'string', description: 'Accident severity (e.g. toedlich, schwer, leicht, Berufskrankheit)' },
132
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
133
+ },
134
+ },
135
+ },
136
+ {
137
+ name: 'search_bul_guidance',
138
+ description: 'Search BUL/SPAA safety guidance documents, fact sheets, and campaigns. Returns topic, title, description, and URL.',
139
+ inputSchema: {
140
+ type: 'object',
141
+ properties: {
142
+ query: { type: 'string', description: 'Free-text search query (German or English)' },
143
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
144
+ },
145
+ required: ['query'],
146
+ },
147
+ },
148
+ ];
149
+ function textResult(data) {
150
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
151
+ }
152
+ function errorResult(message) {
153
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
154
+ }
155
+ function registerTools(server, db) {
156
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
157
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
158
+ const { name, arguments: args = {} } = request.params;
159
+ try {
160
+ switch (name) {
161
+ case 'about':
162
+ return textResult(handleAbout());
163
+ case 'list_sources':
164
+ return textResult(handleListSources(db));
165
+ case 'check_data_freshness':
166
+ return textResult(handleCheckFreshness(db));
167
+ case 'search_safety_rules':
168
+ return textResult(handleSearchSafetyRules(db, SearchArgsSchema.parse(args)));
169
+ case 'get_risk_assessment_requirements':
170
+ return textResult(handleGetRiskAssessmentRequirements(db, RiskAssessmentArgsSchema.parse(args)));
171
+ case 'get_machinery_safety':
172
+ return textResult(handleGetMachinerySafety(db, MachinerySafetyArgsSchema.parse(args)));
173
+ case 'get_chemical_safety':
174
+ return textResult(handleGetChemicalSafety(db, ChemicalSafetyArgsSchema.parse(args)));
175
+ case 'get_young_worker_rules':
176
+ return textResult(handleGetYoungWorkerRules(db, YoungWorkerArgsSchema.parse(args)));
177
+ case 'get_accident_reporting':
178
+ return textResult(handleGetAccidentReporting(db, AccidentReportingArgsSchema.parse(args)));
179
+ case 'search_bul_guidance':
180
+ return textResult(handleSearchBulGuidance(db, BulGuidanceArgsSchema.parse(args)));
181
+ default:
182
+ return errorResult(`Unknown tool: ${name}`);
183
+ }
184
+ }
185
+ catch (err) {
186
+ return errorResult(err instanceof Error ? err.message : String(err));
187
+ }
188
+ });
189
+ }
190
+ const db = createDatabase();
191
+ const sessions = new Map();
192
+ function createMcpServer() {
193
+ const mcpServer = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
194
+ registerTools(mcpServer, db);
195
+ return mcpServer;
196
+ }
197
+ async function handleMCPRequest(req, res) {
198
+ const sessionId = req.headers['mcp-session-id'];
199
+ if (sessionId && sessions.has(sessionId)) {
200
+ const session = sessions.get(sessionId);
201
+ await session.transport.handleRequest(req, res);
202
+ return;
203
+ }
204
+ if (req.method === 'GET' || req.method === 'DELETE') {
205
+ res.writeHead(400, { 'Content-Type': 'application/json' });
206
+ res.end(JSON.stringify({ error: 'Invalid or missing session ID' }));
207
+ return;
208
+ }
209
+ const mcpServer = createMcpServer();
210
+ const transport = new StreamableHTTPServerTransport({
211
+ sessionIdGenerator: () => randomUUID(),
212
+ });
213
+ await mcpServer.connect(transport);
214
+ transport.onclose = () => {
215
+ if (transport.sessionId) {
216
+ sessions.delete(transport.sessionId);
217
+ }
218
+ mcpServer.close().catch(() => { });
219
+ };
220
+ await transport.handleRequest(req, res);
221
+ if (transport.sessionId) {
222
+ sessions.set(transport.sessionId, { transport, server: mcpServer });
223
+ }
224
+ }
225
+ const httpServer = createServer(async (req, res) => {
226
+ const url = new URL(req.url || '/', `http://localhost:${PORT}`);
227
+ if (url.pathname === '/health' && req.method === 'GET') {
228
+ res.writeHead(200, { 'Content-Type': 'application/json' });
229
+ res.end(JSON.stringify({ status: 'healthy', server: SERVER_NAME, version: SERVER_VERSION }));
230
+ return;
231
+ }
232
+ if (url.pathname === '/mcp' || url.pathname === '/') {
233
+ try {
234
+ await handleMCPRequest(req, res);
235
+ }
236
+ catch (err) {
237
+ if (!res.headersSent) {
238
+ res.writeHead(500, { 'Content-Type': 'application/json' });
239
+ res.end(JSON.stringify({ error: err instanceof Error ? err.message : 'Internal server error' }));
240
+ }
241
+ }
242
+ return;
243
+ }
244
+ res.writeHead(404, { 'Content-Type': 'application/json' });
245
+ res.end(JSON.stringify({ error: 'Not found' }));
246
+ });
247
+ httpServer.listen(PORT, () => {
248
+ console.log(`${SERVER_NAME} v${SERVER_VERSION} listening on port ${PORT}`);
249
+ });
250
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const SUPPORTED_JURISDICTIONS: readonly ["CH"];
2
+ export type Jurisdiction = (typeof SUPPORTED_JURISDICTIONS)[number];
3
+ type ValidationSuccess = {
4
+ valid: true;
5
+ jurisdiction: Jurisdiction;
6
+ };
7
+ type ValidationFailure = {
8
+ valid: false;
9
+ error: {
10
+ error: string;
11
+ supported: readonly string[];
12
+ message: string;
13
+ };
14
+ };
15
+ type ValidationResult = ValidationSuccess | ValidationFailure;
16
+ export declare function validateJurisdiction(input: string | undefined): ValidationResult;
17
+ export {};
18
+ //# sourceMappingURL=jurisdiction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jurisdiction.d.ts","sourceRoot":"","sources":["../src/jurisdiction.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,iBAAkB,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,KAAK,iBAAiB,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAE,CAAC;AACrE,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AACF,KAAK,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAE9D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAehF"}
@@ -0,0 +1,16 @@
1
+ export const SUPPORTED_JURISDICTIONS = ['CH'];
2
+ export function validateJurisdiction(input) {
3
+ const normalised = (input ?? 'CH').toUpperCase();
4
+ if (SUPPORTED_JURISDICTIONS.includes(normalised)) {
5
+ return { valid: true, jurisdiction: normalised };
6
+ }
7
+ return {
8
+ valid: false,
9
+ error: {
10
+ error: 'jurisdiction_not_supported',
11
+ supported: SUPPORTED_JURISDICTIONS,
12
+ message: 'This server currently covers Switzerland. More jurisdictions are planned.',
13
+ },
14
+ };
15
+ }
16
+ //# sourceMappingURL=jurisdiction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jurisdiction.js","sourceRoot":"","sources":["../src/jurisdiction.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAI,CAAU,CAAC;AAcvD,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,IAAI,uBAAuB,CAAC,QAAQ,CAAC,UAA0B,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,UAA0B,EAAE,CAAC;IACnE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE;YACL,KAAK,EAAE,4BAA4B;YACnC,SAAS,EAAE,uBAAuB;YAClC,OAAO,EAAE,2EAA2E;SACrF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface Meta {
2
+ disclaimer: string;
3
+ data_age: string;
4
+ source_url: string;
5
+ copyright: string;
6
+ server: string;
7
+ version: string;
8
+ }
9
+ export declare function buildMeta(overrides?: Partial<Meta>): Meta;
10
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAYD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAUzD"}
@@ -0,0 +1,20 @@
1
+ const DISCLAIMER = 'Diese Daten dienen ausschliesslich der Information und ersetzen keine Sicherheitsberatung. ' +
2
+ 'Vor Umsetzung von Sicherheitsmassnahmen ist die BUL/SPAA (Beratungsstelle fuer Unfallverhuetung ' +
3
+ 'in der Landwirtschaft), Suva oder eine qualifizierte Sicherheitsfachperson beizuziehen. ' +
4
+ 'Die Daten basieren auf den Sicherheitsregeln der BUL, den Richtlinien der EKAS, der Agriss-Unfallstatistik ' +
5
+ 'und den Vorgaben der Suva. Betriebsspezifische Risikobeurteilungen sind eigenstaendig durchzufuehren. / ' +
6
+ 'This data is provided for informational purposes only and does not constitute professional safety advice. ' +
7
+ 'Always consult BUL/SPAA, Suva, or a qualified safety professional before implementing safety measures. ' +
8
+ 'Data sourced from BUL safety rules, EKAS guidelines, Agriss accident statistics, and Suva requirements.';
9
+ export function buildMeta(overrides) {
10
+ return {
11
+ disclaimer: DISCLAIMER,
12
+ data_age: overrides?.data_age ?? 'unknown',
13
+ source_url: overrides?.source_url ?? 'https://www.bul.ch',
14
+ copyright: 'Data: BUL/SPAA, Suva, EKAS, Agriss — used under public-sector information principles. Server: Apache-2.0 Ansvar Systems.',
15
+ server: 'ch-farm-safety-mcp',
16
+ version: '0.1.0',
17
+ ...overrides,
18
+ };
19
+ }
20
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,GACd,6FAA6F;IAC7F,kGAAkG;IAClG,0FAA0F;IAC1F,6GAA6G;IAC7G,0GAA0G;IAC1G,4GAA4G;IAC5G,yGAAyG;IACzG,yGAAyG,CAAC;AAE5G,MAAM,UAAU,SAAS,CAAC,SAAyB;IACjD,OAAO;QACL,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,SAAS;QAC1C,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,oBAAoB;QACzD,SAAS,EAAE,0HAA0H;QACrI,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,OAAO;QAChB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,196 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { z } from 'zod';
6
+ import { createDatabase } from './db.js';
7
+ import { handleAbout } from './tools/about.js';
8
+ import { handleListSources } from './tools/list-sources.js';
9
+ import { handleCheckFreshness } from './tools/check-freshness.js';
10
+ import { handleSearchSafetyRules } from './tools/search-safety-rules.js';
11
+ import { handleGetRiskAssessmentRequirements } from './tools/get-risk-assessment-requirements.js';
12
+ import { handleGetMachinerySafety } from './tools/get-machinery-safety.js';
13
+ import { handleGetChemicalSafety } from './tools/get-chemical-safety.js';
14
+ import { handleGetYoungWorkerRules } from './tools/get-young-worker-rules.js';
15
+ import { handleGetAccidentReporting } from './tools/get-accident-reporting.js';
16
+ import { handleSearchBulGuidance } from './tools/search-bul-guidance.js';
17
+ const SERVER_NAME = 'ch-farm-safety-mcp';
18
+ const SERVER_VERSION = '0.1.0';
19
+ const TOOLS = [
20
+ {
21
+ name: 'about',
22
+ description: 'Get server metadata: name, version, coverage, data sources, and links.',
23
+ inputSchema: { type: 'object', properties: {} },
24
+ },
25
+ {
26
+ name: 'list_sources',
27
+ description: 'List all data sources with authority, URL, license, and freshness info.',
28
+ inputSchema: { type: 'object', properties: {} },
29
+ },
30
+ {
31
+ name: 'check_data_freshness',
32
+ description: 'Check when data was last ingested, staleness status, and how to trigger a refresh.',
33
+ inputSchema: { type: 'object', properties: {} },
34
+ },
35
+ {
36
+ name: 'search_safety_rules',
37
+ description: 'Search Swiss farm workplace safety rules (BUL lebenswichtige Regeln, Suva, EKAS). Use for broad queries about farm safety in Switzerland.',
38
+ inputSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ query: { type: 'string', description: 'Free-text search query (German or English)' },
42
+ topic: { type: 'string', description: 'Filter by safety area: maschinen, tiere, wald, hoehe, chemie, silogas, allgemein' },
43
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
44
+ limit: { type: 'number', description: 'Max results (default: 20, max: 50)' },
45
+ },
46
+ required: ['query'],
47
+ },
48
+ },
49
+ {
50
+ name: 'get_risk_assessment_requirements',
51
+ description: 'Get risk assessment (Risikobeurteilung) obligations for farm activities. Based on EKAS Branchenloesung Landwirtschaft and VUV.',
52
+ inputSchema: {
53
+ type: 'object',
54
+ properties: {
55
+ activity_type: { type: 'string', description: 'Activity type (e.g. Alleinarbeit, Siloarbeiten, Holzerei, Tierhaltung)' },
56
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
57
+ },
58
+ },
59
+ },
60
+ {
61
+ name: 'get_machinery_safety',
62
+ description: 'Get safety requirements for agricultural machinery. Covers ROPS, Gurtpflicht, MFK, speed limits, PTO guards.',
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ machine_type: { type: 'string', description: 'Machine type (e.g. Traktor, Maehdrescher, Motorsaege, Kreiselmaeher)' },
67
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
68
+ },
69
+ },
70
+ },
71
+ {
72
+ name: 'get_chemical_safety',
73
+ description: 'Get chemical safety data: exposure limits (MAK), required PPE, and storage rules. Covers PSM (Pflanzenschutzmittel), Silogas, Duenger.',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {
77
+ substance_type: { type: 'string', description: 'Substance type (e.g. Pflanzenschutzmittel, Silogas, Ammoniak, Dieselkraftstoff)' },
78
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
79
+ },
80
+ },
81
+ },
82
+ {
83
+ name: 'get_young_worker_rules',
84
+ description: 'Get restrictions for young workers (Jugendarbeitsschutz) on Swiss farms. Covers age thresholds, allowed/forbidden tasks, exceptions for family farms.',
85
+ inputSchema: {
86
+ type: 'object',
87
+ properties: {
88
+ age_group: { type: 'string', description: 'Age group (e.g. unter-13, 13-15, 15-18)' },
89
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
90
+ },
91
+ },
92
+ },
93
+ {
94
+ name: 'get_accident_reporting',
95
+ description: 'Get accident reporting obligations: deadlines, forms, and responsible insurer (Suva for employees, private for self-employed).',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ severity: { type: 'string', description: 'Accident severity (e.g. toedlich, schwer, leicht, Berufskrankheit)' },
100
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
101
+ },
102
+ },
103
+ },
104
+ {
105
+ name: 'search_bul_guidance',
106
+ description: 'Search BUL/SPAA safety guidance documents, fact sheets, and campaigns. Returns topic, title, description, and URL.',
107
+ inputSchema: {
108
+ type: 'object',
109
+ properties: {
110
+ query: { type: 'string', description: 'Free-text search query (German or English)' },
111
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
112
+ },
113
+ required: ['query'],
114
+ },
115
+ },
116
+ ];
117
+ const SearchArgsSchema = z.object({
118
+ query: z.string(),
119
+ topic: z.string().optional(),
120
+ jurisdiction: z.string().optional(),
121
+ limit: z.number().optional(),
122
+ });
123
+ const RiskAssessmentArgsSchema = z.object({
124
+ activity_type: z.string().optional(),
125
+ jurisdiction: z.string().optional(),
126
+ });
127
+ const MachinerySafetyArgsSchema = z.object({
128
+ machine_type: z.string().optional(),
129
+ jurisdiction: z.string().optional(),
130
+ });
131
+ const ChemicalSafetyArgsSchema = z.object({
132
+ substance_type: z.string().optional(),
133
+ jurisdiction: z.string().optional(),
134
+ });
135
+ const YoungWorkerArgsSchema = z.object({
136
+ age_group: z.string().optional(),
137
+ jurisdiction: z.string().optional(),
138
+ });
139
+ const AccidentReportingArgsSchema = z.object({
140
+ severity: z.string().optional(),
141
+ jurisdiction: z.string().optional(),
142
+ });
143
+ const BulGuidanceArgsSchema = z.object({
144
+ query: z.string(),
145
+ jurisdiction: z.string().optional(),
146
+ });
147
+ function textResult(data) {
148
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
149
+ }
150
+ function errorResult(message) {
151
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
152
+ }
153
+ const db = createDatabase();
154
+ const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
155
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
156
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
157
+ const { name, arguments: args = {} } = request.params;
158
+ try {
159
+ switch (name) {
160
+ case 'about':
161
+ return textResult(handleAbout());
162
+ case 'list_sources':
163
+ return textResult(handleListSources(db));
164
+ case 'check_data_freshness':
165
+ return textResult(handleCheckFreshness(db));
166
+ case 'search_safety_rules':
167
+ return textResult(handleSearchSafetyRules(db, SearchArgsSchema.parse(args)));
168
+ case 'get_risk_assessment_requirements':
169
+ return textResult(handleGetRiskAssessmentRequirements(db, RiskAssessmentArgsSchema.parse(args)));
170
+ case 'get_machinery_safety':
171
+ return textResult(handleGetMachinerySafety(db, MachinerySafetyArgsSchema.parse(args)));
172
+ case 'get_chemical_safety':
173
+ return textResult(handleGetChemicalSafety(db, ChemicalSafetyArgsSchema.parse(args)));
174
+ case 'get_young_worker_rules':
175
+ return textResult(handleGetYoungWorkerRules(db, YoungWorkerArgsSchema.parse(args)));
176
+ case 'get_accident_reporting':
177
+ return textResult(handleGetAccidentReporting(db, AccidentReportingArgsSchema.parse(args)));
178
+ case 'search_bul_guidance':
179
+ return textResult(handleSearchBulGuidance(db, BulGuidanceArgsSchema.parse(args)));
180
+ default:
181
+ return errorResult(`Unknown tool: ${name}`);
182
+ }
183
+ }
184
+ catch (err) {
185
+ return errorResult(err instanceof Error ? err.message : String(err));
186
+ }
187
+ });
188
+ async function main() {
189
+ const transport = new StdioServerTransport();
190
+ await server.connect(transport);
191
+ }
192
+ main().catch((err) => {
193
+ process.stderr.write(`Fatal error: ${err.message}\n`);
194
+ process.exit(1);
195
+ });
196
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function handleAbout(): {
2
+ name: string;
3
+ description: string;
4
+ version: string;
5
+ jurisdiction: "CH"[];
6
+ data_sources: string[];
7
+ tools_count: number;
8
+ links: {
9
+ homepage: string;
10
+ repository: string;
11
+ mcp_network: string;
12
+ };
13
+ _meta: import("../metadata.js").Meta;
14
+ };
15
+ //# sourceMappingURL=about.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../src/tools/about.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW;;;;;;;;;;;;;EAwB1B"}
@@ -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 Farm Safety MCP',
6
+ description: 'Swiss farm workplace safety data based on BUL/SPAA safety rules, Suva requirements, ' +
7
+ 'EKAS Branchenloesung Landwirtschaft, and Agriss accident statistics. Covers machinery safety (ROPS, MFK), ' +
8
+ 'chemical exposure (PSM-Anwenderschutz), young worker restrictions, accident reporting obligations, ' +
9
+ 'risk assessment requirements, and first aid / emergency numbers for Swiss agriculture.',
10
+ version: '0.1.0',
11
+ jurisdiction: [...SUPPORTED_JURISDICTIONS],
12
+ data_sources: [
13
+ 'BUL/SPAA — Sicherheitsregeln, Merkblaetter',
14
+ 'Suva — Arbeitssicherheit Landwirtschaft, MAK-Werte',
15
+ 'EKAS — Branchenloesung Landwirtschaft',
16
+ 'Agriss — Unfallstatistik Schweizer Landwirtschaft',
17
+ ],
18
+ tools_count: 10,
19
+ links: {
20
+ homepage: 'https://ansvar.eu/open-agriculture',
21
+ repository: 'https://github.com/ansvar-systems/ch-farm-safety-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,6BAA6B;QACnC,WAAW,EACT,sFAAsF;YACtF,4GAA4G;YAC5G,qGAAqG;YACrG,wFAAwF;QAC1F,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,CAAC,GAAG,uBAAuB,CAAC;QAC1C,YAAY,EAAE;YACZ,4CAA4C;YAC5C,oDAAoD;YACpD,uCAAuC;YACvC,mDAAmD;SACpD;QACD,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,QAAQ,EAAE,oCAAoC;YAC9C,UAAU,EAAE,sDAAsD;YAClE,WAAW,EAAE,uBAAuB;SACrC;QACD,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"}