@ansvar/ch-livestock-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 +52 -0
  2. package/.github/workflows/ci.yml +21 -0
  3. package/.github/workflows/codeql.yml +31 -0
  4. package/.github/workflows/ghcr-build.yml +45 -0
  5. package/.github/workflows/gitleaks.yml +23 -0
  6. package/.github/workflows/ingest.yml +58 -0
  7. package/.github/workflows/publish.yml +24 -0
  8. package/CHANGELOG.md +24 -0
  9. package/CODEOWNERS +1 -0
  10. package/COVERAGE.md +62 -0
  11. package/DISCLAIMER.md +41 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +28 -0
  15. package/README.md +145 -0
  16. package/SECURITY.md +33 -0
  17. package/TOOLS.md +261 -0
  18. package/data/coverage.json +23 -0
  19. package/data/database.db +0 -0
  20. package/data/sources.yml +29 -0
  21. package/dist/db.d.ts +26 -0
  22. package/dist/db.d.ts.map +1 -0
  23. package/dist/db.js +220 -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 +294 -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 +21 -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 +240 -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-breeding-guidance.d.ts +37 -0
  50. package/dist/tools/get-breeding-guidance.d.ts.map +1 -0
  51. package/dist/tools/get-breeding-guidance.js +39 -0
  52. package/dist/tools/get-breeding-guidance.js.map +1 -0
  53. package/dist/tools/get-feed-requirements.d.ts +40 -0
  54. package/dist/tools/get-feed-requirements.d.ts.map +1 -0
  55. package/dist/tools/get-feed-requirements.js +35 -0
  56. package/dist/tools/get-feed-requirements.js.map +1 -0
  57. package/dist/tools/get-housing-requirements.d.ts +39 -0
  58. package/dist/tools/get-housing-requirements.d.ts.map +1 -0
  59. package/dist/tools/get-housing-requirements.js +35 -0
  60. package/dist/tools/get-housing-requirements.js.map +1 -0
  61. package/dist/tools/get-movement-rules.d.ts +36 -0
  62. package/dist/tools/get-movement-rules.d.ts.map +1 -0
  63. package/dist/tools/get-movement-rules.js +31 -0
  64. package/dist/tools/get-movement-rules.js.map +1 -0
  65. package/dist/tools/get-stocking-density.d.ts +37 -0
  66. package/dist/tools/get-stocking-density.d.ts.map +1 -0
  67. package/dist/tools/get-stocking-density.js +35 -0
  68. package/dist/tools/get-stocking-density.js.map +1 -0
  69. package/dist/tools/get-welfare-standards.d.ts +38 -0
  70. package/dist/tools/get-welfare-standards.d.ts.map +1 -0
  71. package/dist/tools/get-welfare-standards.js +32 -0
  72. package/dist/tools/get-welfare-standards.js.map +1 -0
  73. package/dist/tools/list-sources.d.ts +18 -0
  74. package/dist/tools/list-sources.d.ts.map +1 -0
  75. package/dist/tools/list-sources.js +51 -0
  76. package/dist/tools/list-sources.js.map +1 -0
  77. package/dist/tools/search-animal-health.d.ts +28 -0
  78. package/dist/tools/search-animal-health.d.ts.map +1 -0
  79. package/dist/tools/search-animal-health.js +33 -0
  80. package/dist/tools/search-animal-health.js.map +1 -0
  81. package/dist/tools/search-livestock-guidance.d.ts +27 -0
  82. package/dist/tools/search-livestock-guidance.d.ts.map +1 -0
  83. package/dist/tools/search-livestock-guidance.js +25 -0
  84. package/dist/tools/search-livestock-guidance.js.map +1 -0
  85. package/docker-compose.yml +12 -0
  86. package/eslint.config.js +27 -0
  87. package/package.json +54 -0
  88. package/scripts/ingest.ts +553 -0
  89. package/server.json +10 -0
  90. package/src/db.ts +268 -0
  91. package/src/http-server.ts +327 -0
  92. package/src/jurisdiction.ts +30 -0
  93. package/src/metadata.ts +31 -0
  94. package/src/server.ts +264 -0
  95. package/src/tools/about.ts +28 -0
  96. package/src/tools/check-freshness.ts +42 -0
  97. package/src/tools/get-breeding-guidance.ts +53 -0
  98. package/src/tools/get-feed-requirements.ts +53 -0
  99. package/src/tools/get-housing-requirements.ts +52 -0
  100. package/src/tools/get-movement-rules.ts +45 -0
  101. package/src/tools/get-stocking-density.ts +52 -0
  102. package/src/tools/get-welfare-standards.ts +47 -0
  103. package/src/tools/list-sources.ts +65 -0
  104. package/src/tools/search-animal-health.ts +48 -0
  105. package/src/tools/search-livestock-guidance.ts +33 -0
  106. package/tests/db.test.ts +96 -0
  107. package/tests/helpers/seed-db.ts +97 -0
  108. package/tests/jurisdiction.test.ts +41 -0
  109. package/tests/tools/about.test.ts +32 -0
  110. package/tests/tools/check-freshness.test.ts +55 -0
  111. package/tests/tools/list-sources.test.ts +56 -0
  112. package/tests/tools/search-livestock-guidance.test.ts +63 -0
  113. package/tsconfig.json +19 -0
@@ -0,0 +1,294 @@
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 { handleSearchLivestockGuidance } from './tools/search-livestock-guidance.js';
12
+ import { handleGetWelfareStandards } from './tools/get-welfare-standards.js';
13
+ import { handleGetStockingDensity } from './tools/get-stocking-density.js';
14
+ import { handleGetFeedRequirements } from './tools/get-feed-requirements.js';
15
+ import { handleSearchAnimalHealth } from './tools/search-animal-health.js';
16
+ import { handleGetHousingRequirements } from './tools/get-housing-requirements.js';
17
+ import { handleGetMovementRules } from './tools/get-movement-rules.js';
18
+ import { handleGetBreedingGuidance } from './tools/get-breeding-guidance.js';
19
+ const SERVER_NAME = 'ch-livestock-mcp';
20
+ const SERVER_VERSION = '0.1.0';
21
+ const PORT = parseInt(process.env.PORT ?? '3000', 10);
22
+ const SearchArgsSchema = z.object({
23
+ query: z.string(),
24
+ species: z.string().optional(),
25
+ jurisdiction: z.string().optional(),
26
+ limit: z.number().optional(),
27
+ });
28
+ const WelfareArgsSchema = z.object({
29
+ species: z.string(),
30
+ production_system: z.string().optional(),
31
+ jurisdiction: z.string().optional(),
32
+ });
33
+ const StockingArgsSchema = z.object({
34
+ species: z.string(),
35
+ age_class: z.string().optional(),
36
+ housing_type: z.string().optional(),
37
+ jurisdiction: z.string().optional(),
38
+ });
39
+ const FeedArgsSchema = z.object({
40
+ species: z.string(),
41
+ age_class: z.string().optional(),
42
+ production_stage: z.string().optional(),
43
+ jurisdiction: z.string().optional(),
44
+ });
45
+ const HealthSearchArgsSchema = z.object({
46
+ query: z.string(),
47
+ species: z.string().optional(),
48
+ jurisdiction: z.string().optional(),
49
+ });
50
+ const HousingArgsSchema = z.object({
51
+ species: z.string(),
52
+ age_class: z.string().optional(),
53
+ system: z.string().optional(),
54
+ jurisdiction: z.string().optional(),
55
+ });
56
+ const MovementArgsSchema = z.object({
57
+ species: z.string(),
58
+ rule_type: z.string().optional(),
59
+ jurisdiction: z.string().optional(),
60
+ });
61
+ const BreedingArgsSchema = z.object({
62
+ species: z.string(),
63
+ topic: z.string().optional(),
64
+ jurisdiction: z.string().optional(),
65
+ });
66
+ const TOOLS = [
67
+ {
68
+ name: 'about',
69
+ description: 'Get server metadata: name, version, coverage, data sources, and links.',
70
+ inputSchema: { type: 'object', properties: {} },
71
+ },
72
+ {
73
+ name: 'list_sources',
74
+ description: 'List all data sources with authority, URL, license, and freshness info.',
75
+ inputSchema: { type: 'object', properties: {} },
76
+ },
77
+ {
78
+ name: 'check_data_freshness',
79
+ description: 'Check when data was last ingested, staleness status, and how to trigger a refresh.',
80
+ inputSchema: { type: 'object', properties: {} },
81
+ },
82
+ {
83
+ name: 'search_livestock_guidance',
84
+ description: 'Search across all Swiss livestock topics: welfare, housing, feeding, health, transport, breeds.',
85
+ inputSchema: {
86
+ type: 'object',
87
+ properties: {
88
+ query: { type: 'string', description: 'Free-text search query (German or English)' },
89
+ species: { type: 'string', description: 'Filter by species (e.g. Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde)' },
90
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
91
+ limit: { type: 'number', description: 'Max results (default: 20, max: 50)' },
92
+ },
93
+ required: ['query'],
94
+ },
95
+ },
96
+ {
97
+ name: 'get_welfare_standards',
98
+ description: 'Get legal minimum welfare requirements and RAUS/BTS programme standards for a species.',
99
+ inputSchema: {
100
+ type: 'object',
101
+ properties: {
102
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
103
+ production_system: { type: 'string', description: 'Production system (e.g. TSchV-Minimum, RAUS, BTS)' },
104
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
105
+ },
106
+ required: ['species'],
107
+ },
108
+ },
109
+ {
110
+ name: 'get_stocking_density',
111
+ description: 'Get animals per m2 and space requirements by species, age class, and housing type.',
112
+ inputSchema: {
113
+ type: 'object',
114
+ properties: {
115
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
116
+ age_class: { type: 'string', description: 'Age/weight class (e.g. Milchkuh, Kalb, Mastschwein >60kg)' },
117
+ housing_type: { type: 'string', description: 'Housing type (e.g. Laufstall, Anbindestall, Voliere)' },
118
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
119
+ },
120
+ required: ['species'],
121
+ },
122
+ },
123
+ {
124
+ name: 'get_feed_requirements',
125
+ description: 'Get nutritional requirements per species and production stage. Includes GMF programme details.',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {
129
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
130
+ age_class: { type: 'string', description: 'Age class (e.g. Milchkuh, Mastschwein, Legehenne)' },
131
+ production_stage: { type: 'string', description: 'Production stage (e.g. Laktation, Mast, Aufzucht)' },
132
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
133
+ },
134
+ required: ['species'],
135
+ },
136
+ },
137
+ {
138
+ name: 'search_animal_health',
139
+ description: 'Search animal health topics: diseases, symptoms, prevention, regulatory reporting requirements.',
140
+ inputSchema: {
141
+ type: 'object',
142
+ properties: {
143
+ query: { type: 'string', description: 'Search query (e.g. Salmonellen, BVD, Moderhinke)' },
144
+ species: { type: 'string', description: 'Filter by species' },
145
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
146
+ },
147
+ required: ['query'],
148
+ },
149
+ },
150
+ {
151
+ name: 'get_housing_requirements',
152
+ description: 'Get detailed housing specs: space, ventilation, flooring, temperature. TSchV minimum vs. BTS.',
153
+ inputSchema: {
154
+ type: 'object',
155
+ properties: {
156
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
157
+ age_class: { type: 'string', description: 'Age class (e.g. Milchkuh, Mastschwein, Legehenne)' },
158
+ system: { type: 'string', description: 'Housing system (e.g. Laufstall, Anbindestall, BTS)' },
159
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
160
+ },
161
+ required: ['species'],
162
+ },
163
+ },
164
+ {
165
+ name: 'get_movement_rules',
166
+ description: 'Get TVD registration, transport rules, standstill, and Soemmerung requirements per species.',
167
+ inputSchema: {
168
+ type: 'object',
169
+ properties: {
170
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
171
+ rule_type: { type: 'string', description: 'Rule type: TVD, Transport, Soemmerung, Schlachtung' },
172
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
173
+ },
174
+ required: ['species'],
175
+ },
176
+ },
177
+ {
178
+ name: 'get_breeding_guidance',
179
+ description: 'Get Swiss breed info, breeding calendars, AI (kuenstliche Besamung), genetics, Soemmerung guidance.',
180
+ inputSchema: {
181
+ type: 'object',
182
+ properties: {
183
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Schafe, Ziegen, Pferde' },
184
+ topic: { type: 'string', description: 'Topic filter (e.g. Zweinutzung, Milch, Fleisch, Alp)' },
185
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
186
+ },
187
+ required: ['species'],
188
+ },
189
+ },
190
+ ];
191
+ function textResult(data) {
192
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
193
+ }
194
+ function errorResult(message) {
195
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
196
+ }
197
+ function registerTools(server, db) {
198
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
199
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
200
+ const { name, arguments: args = {} } = request.params;
201
+ try {
202
+ switch (name) {
203
+ case 'about':
204
+ return textResult(handleAbout());
205
+ case 'list_sources':
206
+ return textResult(handleListSources(db));
207
+ case 'check_data_freshness':
208
+ return textResult(handleCheckFreshness(db));
209
+ case 'search_livestock_guidance':
210
+ return textResult(handleSearchLivestockGuidance(db, SearchArgsSchema.parse(args)));
211
+ case 'get_welfare_standards':
212
+ return textResult(handleGetWelfareStandards(db, WelfareArgsSchema.parse(args)));
213
+ case 'get_stocking_density':
214
+ return textResult(handleGetStockingDensity(db, StockingArgsSchema.parse(args)));
215
+ case 'get_feed_requirements':
216
+ return textResult(handleGetFeedRequirements(db, FeedArgsSchema.parse(args)));
217
+ case 'search_animal_health':
218
+ return textResult(handleSearchAnimalHealth(db, HealthSearchArgsSchema.parse(args)));
219
+ case 'get_housing_requirements':
220
+ return textResult(handleGetHousingRequirements(db, HousingArgsSchema.parse(args)));
221
+ case 'get_movement_rules':
222
+ return textResult(handleGetMovementRules(db, MovementArgsSchema.parse(args)));
223
+ case 'get_breeding_guidance':
224
+ return textResult(handleGetBreedingGuidance(db, BreedingArgsSchema.parse(args)));
225
+ default:
226
+ return errorResult(`Unknown tool: ${name}`);
227
+ }
228
+ }
229
+ catch (err) {
230
+ return errorResult(err instanceof Error ? err.message : String(err));
231
+ }
232
+ });
233
+ }
234
+ const db = createDatabase();
235
+ const sessions = new Map();
236
+ function createMcpServer() {
237
+ const mcpServer = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
238
+ registerTools(mcpServer, db);
239
+ return mcpServer;
240
+ }
241
+ async function handleMCPRequest(req, res) {
242
+ const sessionId = req.headers['mcp-session-id'];
243
+ if (sessionId && sessions.has(sessionId)) {
244
+ const session = sessions.get(sessionId);
245
+ await session.transport.handleRequest(req, res);
246
+ return;
247
+ }
248
+ if (req.method === 'GET' || req.method === 'DELETE') {
249
+ res.writeHead(400, { 'Content-Type': 'application/json' });
250
+ res.end(JSON.stringify({ error: 'Invalid or missing session ID' }));
251
+ return;
252
+ }
253
+ const mcpServer = createMcpServer();
254
+ const transport = new StreamableHTTPServerTransport({
255
+ sessionIdGenerator: () => randomUUID(),
256
+ });
257
+ await mcpServer.connect(transport);
258
+ transport.onclose = () => {
259
+ if (transport.sessionId) {
260
+ sessions.delete(transport.sessionId);
261
+ }
262
+ mcpServer.close().catch(() => { });
263
+ };
264
+ await transport.handleRequest(req, res);
265
+ if (transport.sessionId) {
266
+ sessions.set(transport.sessionId, { transport, server: mcpServer });
267
+ }
268
+ }
269
+ const httpServer = createServer(async (req, res) => {
270
+ const url = new URL(req.url || '/', `http://localhost:${PORT}`);
271
+ if (url.pathname === '/health' && req.method === 'GET') {
272
+ res.writeHead(200, { 'Content-Type': 'application/json' });
273
+ res.end(JSON.stringify({ status: 'healthy', server: SERVER_NAME, version: SERVER_VERSION }));
274
+ return;
275
+ }
276
+ if (url.pathname === '/mcp' || url.pathname === '/') {
277
+ try {
278
+ await handleMCPRequest(req, res);
279
+ }
280
+ catch (err) {
281
+ if (!res.headersSent) {
282
+ res.writeHead(500, { 'Content-Type': 'application/json' });
283
+ res.end(JSON.stringify({ error: err instanceof Error ? err.message : 'Internal server error' }));
284
+ }
285
+ }
286
+ return;
287
+ }
288
+ res.writeHead(404, { 'Content-Type': 'application/json' });
289
+ res.end(JSON.stringify({ error: 'Not found' }));
290
+ });
291
+ httpServer.listen(PORT, () => {
292
+ console.log(`${SERVER_NAME} v${SERVER_VERSION} listening on port ${PORT}`);
293
+ });
294
+ //# 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;AAaD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAUzD"}
@@ -0,0 +1,21 @@
1
+ const DISCLAIMER = 'Diese Daten dienen ausschliesslich der Information und stellen keine Rechtsberatung oder ' +
2
+ 'veterinaermedizinische Beratung dar. Massgebend sind die Tierschutzverordnung (TSchV, SR 455.1), ' +
3
+ 'die Tierschutzgesetzgebung (TSchG, SR 455) sowie die Weisungen des BLV und BLW. Vor Entscheidungen ' +
4
+ 'zur Tierhaltung ist stets die zustaendige kantonale Veterinaerbehoerde oder eine anerkannte ' +
5
+ 'Fachberatung zu konsultieren. / ' +
6
+ 'This data is provided for informational purposes only and does not constitute legal or veterinary ' +
7
+ 'advice. The authoritative sources are the Swiss Animal Welfare Ordinance (TSchV), the Animal Welfare ' +
8
+ 'Act (TSchG), and guidance from BLV and BLW. Always consult the cantonal veterinary authority before ' +
9
+ 'making livestock management decisions.';
10
+ export function buildMeta(overrides) {
11
+ return {
12
+ disclaimer: DISCLAIMER,
13
+ data_age: overrides?.data_age ?? 'unknown',
14
+ source_url: overrides?.source_url ?? 'https://www.blv.admin.ch/blv/de/home/tiere/tierschutz.html',
15
+ copyright: 'Data: BLV, BLW, Agroscope, Zuchtorganisationen — used under public-sector information principles. Server: Apache-2.0 Ansvar Systems.',
16
+ server: 'ch-livestock-mcp',
17
+ version: '0.1.0',
18
+ ...overrides,
19
+ };
20
+ }
21
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,GACd,2FAA2F;IAC3F,mGAAmG;IACnG,qGAAqG;IACrG,8FAA8F;IAC9F,kCAAkC;IAClC,oGAAoG;IACpG,uGAAuG;IACvG,sGAAsG;IACtG,wCAAwC,CAAC;AAE3C,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,4DAA4D;QACjG,SAAS,EAAE,sIAAsI;QACjJ,MAAM,EAAE,kBAAkB;QAC1B,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,240 @@
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 { handleSearchLivestockGuidance } from './tools/search-livestock-guidance.js';
11
+ import { handleGetWelfareStandards } from './tools/get-welfare-standards.js';
12
+ import { handleGetStockingDensity } from './tools/get-stocking-density.js';
13
+ import { handleGetFeedRequirements } from './tools/get-feed-requirements.js';
14
+ import { handleSearchAnimalHealth } from './tools/search-animal-health.js';
15
+ import { handleGetHousingRequirements } from './tools/get-housing-requirements.js';
16
+ import { handleGetMovementRules } from './tools/get-movement-rules.js';
17
+ import { handleGetBreedingGuidance } from './tools/get-breeding-guidance.js';
18
+ const SERVER_NAME = 'ch-livestock-mcp';
19
+ const SERVER_VERSION = '0.1.0';
20
+ const TOOLS = [
21
+ {
22
+ name: 'about',
23
+ description: 'Get server metadata: name, version, coverage, data sources, and links.',
24
+ inputSchema: { type: 'object', properties: {} },
25
+ },
26
+ {
27
+ name: 'list_sources',
28
+ description: 'List all data sources with authority, URL, license, and freshness info.',
29
+ inputSchema: { type: 'object', properties: {} },
30
+ },
31
+ {
32
+ name: 'check_data_freshness',
33
+ description: 'Check when data was last ingested, staleness status, and how to trigger a refresh.',
34
+ inputSchema: { type: 'object', properties: {} },
35
+ },
36
+ {
37
+ name: 'search_livestock_guidance',
38
+ description: 'Search across all Swiss livestock topics: welfare, housing, feeding, health, transport, breeds. Use for broad queries about Swiss livestock regulations and guidance.',
39
+ inputSchema: {
40
+ type: 'object',
41
+ properties: {
42
+ query: { type: 'string', description: 'Free-text search query (German or English)' },
43
+ species: { type: 'string', description: 'Filter by species (e.g. Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde)' },
44
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
45
+ limit: { type: 'number', description: 'Max results (default: 20, max: 50)' },
46
+ },
47
+ required: ['query'],
48
+ },
49
+ },
50
+ {
51
+ name: 'get_welfare_standards',
52
+ description: 'Get legal minimum welfare requirements and RAUS/BTS programme standards for a species. Based on TSchV and DZV.',
53
+ inputSchema: {
54
+ type: 'object',
55
+ properties: {
56
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
57
+ production_system: { type: 'string', description: 'Production system filter (e.g. TSchV-Minimum, RAUS, BTS)' },
58
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
59
+ },
60
+ required: ['species'],
61
+ },
62
+ },
63
+ {
64
+ name: 'get_stocking_density',
65
+ description: 'Get animals per m2 and space requirements by species, age class, and housing type. Based on TSchV Anhang 1.',
66
+ inputSchema: {
67
+ type: 'object',
68
+ properties: {
69
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
70
+ age_class: { type: 'string', description: 'Age/weight class (e.g. Milchkuh, Kalb, Mastschwein >60kg, Legehenne)' },
71
+ housing_type: { type: 'string', description: 'Housing type (e.g. Laufstall, Anbindestall, Voliere, Freilandhaltung)' },
72
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
73
+ },
74
+ required: ['species'],
75
+ },
76
+ },
77
+ {
78
+ name: 'get_feed_requirements',
79
+ description: 'Get nutritional requirements per species and production stage. Includes GMF (graslandbasierte Milch- und Fleischproduktion) programme details.',
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
84
+ age_class: { type: 'string', description: 'Age class (e.g. Milchkuh, Aufzuchtrind, Mastschwein, Legehenne)' },
85
+ production_stage: { type: 'string', description: 'Production stage (e.g. Laktation, Trockenstehend, Mast, Aufzucht)' },
86
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
87
+ },
88
+ required: ['species'],
89
+ },
90
+ },
91
+ {
92
+ name: 'search_animal_health',
93
+ description: 'Search animal health topics: diseases, symptoms, prevention, regulatory reporting requirements.',
94
+ inputSchema: {
95
+ type: 'object',
96
+ properties: {
97
+ query: { type: 'string', description: 'Search query (e.g. Salmonellen, BVD, Moderhinke, Mastitits)' },
98
+ species: { type: 'string', description: 'Filter by species' },
99
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
100
+ },
101
+ required: ['query'],
102
+ },
103
+ },
104
+ {
105
+ name: 'get_housing_requirements',
106
+ description: 'Get detailed housing specifications: space, ventilation, flooring, temperature. Compares TSchV minimum vs. BTS standard.',
107
+ inputSchema: {
108
+ type: 'object',
109
+ properties: {
110
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
111
+ age_class: { type: 'string', description: 'Age class (e.g. Milchkuh, Mastschwein, Legehenne)' },
112
+ system: { type: 'string', description: 'Housing system (e.g. Laufstall, Anbindestall, Voliere, BTS)' },
113
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
114
+ },
115
+ required: ['species'],
116
+ },
117
+ },
118
+ {
119
+ name: 'get_movement_rules',
120
+ description: 'Get TVD registration, transport regulations, standstill rules, and Soemmerung/Alpung requirements per species.',
121
+ inputSchema: {
122
+ type: 'object',
123
+ properties: {
124
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Gefluegel, Schafe, Ziegen, Pferde' },
125
+ rule_type: { type: 'string', description: 'Rule type: TVD, Transport, Soemmerung, Schlachtung' },
126
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
127
+ },
128
+ required: ['species'],
129
+ },
130
+ },
131
+ {
132
+ name: 'get_breeding_guidance',
133
+ description: 'Get Swiss breed information, breeding calendars, AI (kuenstliche Besamung), genetics, and Soemmerung guidance.',
134
+ inputSchema: {
135
+ type: 'object',
136
+ properties: {
137
+ species: { type: 'string', description: 'Species: Rinder, Schweine, Schafe, Ziegen, Pferde' },
138
+ topic: { type: 'string', description: 'Topic filter (e.g. Zweinutzung, Milch, Fleisch, Alp)' },
139
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
140
+ },
141
+ required: ['species'],
142
+ },
143
+ },
144
+ ];
145
+ const SearchArgsSchema = z.object({
146
+ query: z.string(),
147
+ species: z.string().optional(),
148
+ jurisdiction: z.string().optional(),
149
+ limit: z.number().optional(),
150
+ });
151
+ const WelfareArgsSchema = z.object({
152
+ species: z.string(),
153
+ production_system: z.string().optional(),
154
+ jurisdiction: z.string().optional(),
155
+ });
156
+ const StockingArgsSchema = z.object({
157
+ species: z.string(),
158
+ age_class: z.string().optional(),
159
+ housing_type: z.string().optional(),
160
+ jurisdiction: z.string().optional(),
161
+ });
162
+ const FeedArgsSchema = z.object({
163
+ species: z.string(),
164
+ age_class: z.string().optional(),
165
+ production_stage: z.string().optional(),
166
+ jurisdiction: z.string().optional(),
167
+ });
168
+ const HealthSearchArgsSchema = z.object({
169
+ query: z.string(),
170
+ species: z.string().optional(),
171
+ jurisdiction: z.string().optional(),
172
+ });
173
+ const HousingArgsSchema = z.object({
174
+ species: z.string(),
175
+ age_class: z.string().optional(),
176
+ system: z.string().optional(),
177
+ jurisdiction: z.string().optional(),
178
+ });
179
+ const MovementArgsSchema = z.object({
180
+ species: z.string(),
181
+ rule_type: z.string().optional(),
182
+ jurisdiction: z.string().optional(),
183
+ });
184
+ const BreedingArgsSchema = z.object({
185
+ species: z.string(),
186
+ topic: z.string().optional(),
187
+ jurisdiction: z.string().optional(),
188
+ });
189
+ function textResult(data) {
190
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
191
+ }
192
+ function errorResult(message) {
193
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
194
+ }
195
+ const db = createDatabase();
196
+ const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
197
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
198
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
199
+ const { name, arguments: args = {} } = request.params;
200
+ try {
201
+ switch (name) {
202
+ case 'about':
203
+ return textResult(handleAbout());
204
+ case 'list_sources':
205
+ return textResult(handleListSources(db));
206
+ case 'check_data_freshness':
207
+ return textResult(handleCheckFreshness(db));
208
+ case 'search_livestock_guidance':
209
+ return textResult(handleSearchLivestockGuidance(db, SearchArgsSchema.parse(args)));
210
+ case 'get_welfare_standards':
211
+ return textResult(handleGetWelfareStandards(db, WelfareArgsSchema.parse(args)));
212
+ case 'get_stocking_density':
213
+ return textResult(handleGetStockingDensity(db, StockingArgsSchema.parse(args)));
214
+ case 'get_feed_requirements':
215
+ return textResult(handleGetFeedRequirements(db, FeedArgsSchema.parse(args)));
216
+ case 'search_animal_health':
217
+ return textResult(handleSearchAnimalHealth(db, HealthSearchArgsSchema.parse(args)));
218
+ case 'get_housing_requirements':
219
+ return textResult(handleGetHousingRequirements(db, HousingArgsSchema.parse(args)));
220
+ case 'get_movement_rules':
221
+ return textResult(handleGetMovementRules(db, MovementArgsSchema.parse(args)));
222
+ case 'get_breeding_guidance':
223
+ return textResult(handleGetBreedingGuidance(db, BreedingArgsSchema.parse(args)));
224
+ default:
225
+ return errorResult(`Unknown tool: ${name}`);
226
+ }
227
+ }
228
+ catch (err) {
229
+ return errorResult(err instanceof Error ? err.message : String(err));
230
+ }
231
+ });
232
+ async function main() {
233
+ const transport = new StdioServerTransport();
234
+ await server.connect(transport);
235
+ }
236
+ main().catch((err) => {
237
+ process.stderr.write(`Fatal error: ${err.message}\n`);
238
+ process.exit(1);
239
+ });
240
+ //# sourceMappingURL=server.js.map