@ansvar/ch-organic-regen-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 (108) 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 +47 -0
  11. package/DISCLAIMER.md +67 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +23 -0
  15. package/README.md +117 -0
  16. package/SECURITY.md +25 -0
  17. package/TOOLS.md +141 -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 +184 -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 +263 -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 +11 -0
  34. package/dist/metadata.d.ts.map +1 -0
  35. package/dist/metadata.js +31 -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 +209 -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-approved-inputs.d.ts +26 -0
  50. package/dist/tools/get-approved-inputs.d.ts.map +1 -0
  51. package/dist/tools/get-approved-inputs.js +28 -0
  52. package/dist/tools/get-approved-inputs.js.map +1 -0
  53. package/dist/tools/get-conversion-requirements.d.ts +28 -0
  54. package/dist/tools/get-conversion-requirements.d.ts.map +1 -0
  55. package/dist/tools/get-conversion-requirements.js +32 -0
  56. package/dist/tools/get-conversion-requirements.js.map +1 -0
  57. package/dist/tools/get-organic-standards.d.ts +27 -0
  58. package/dist/tools/get-organic-standards.d.ts.map +1 -0
  59. package/dist/tools/get-organic-standards.js +31 -0
  60. package/dist/tools/get-organic-standards.js.map +1 -0
  61. package/dist/tools/get-organic-subsidies.d.ts +28 -0
  62. package/dist/tools/get-organic-subsidies.d.ts.map +1 -0
  63. package/dist/tools/get-organic-subsidies.js +32 -0
  64. package/dist/tools/get-organic-subsidies.js.map +1 -0
  65. package/dist/tools/get-soil-health-guidance.d.ts +25 -0
  66. package/dist/tools/get-soil-health-guidance.d.ts.map +1 -0
  67. package/dist/tools/get-soil-health-guidance.js +27 -0
  68. package/dist/tools/get-soil-health-guidance.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 +61 -0
  72. package/dist/tools/list-sources.js.map +1 -0
  73. package/dist/tools/search-certification-guidance.d.ts +24 -0
  74. package/dist/tools/search-certification-guidance.d.ts.map +1 -0
  75. package/dist/tools/search-certification-guidance.js +24 -0
  76. package/dist/tools/search-certification-guidance.js.map +1 -0
  77. package/dist/tools/search-organic-rules.d.ts +25 -0
  78. package/dist/tools/search-organic-rules.d.ts.map +1 -0
  79. package/dist/tools/search-organic-rules.js +26 -0
  80. package/dist/tools/search-organic-rules.js.map +1 -0
  81. package/docker-compose.yml +12 -0
  82. package/eslint.config.js +26 -0
  83. package/package.json +54 -0
  84. package/scripts/ingest.ts +963 -0
  85. package/server.json +16 -0
  86. package/src/db.ts +225 -0
  87. package/src/http-server.ts +302 -0
  88. package/src/jurisdiction.ts +30 -0
  89. package/src/metadata.ts +45 -0
  90. package/src/server.ts +239 -0
  91. package/src/tools/about.ts +28 -0
  92. package/src/tools/check-freshness.ts +42 -0
  93. package/src/tools/get-approved-inputs.ts +44 -0
  94. package/src/tools/get-conversion-requirements.ts +50 -0
  95. package/src/tools/get-organic-standards.ts +48 -0
  96. package/src/tools/get-organic-subsidies.ts +50 -0
  97. package/src/tools/get-soil-health-guidance.ts +42 -0
  98. package/src/tools/list-sources.ts +75 -0
  99. package/src/tools/search-certification-guidance.ts +41 -0
  100. package/src/tools/search-organic-rules.ts +35 -0
  101. package/tests/db.test.ts +96 -0
  102. package/tests/helpers/seed-db.ts +145 -0
  103. package/tests/jurisdiction.test.ts +35 -0
  104. package/tests/tools/about.test.ts +22 -0
  105. package/tests/tools/check-freshness.test.ts +57 -0
  106. package/tests/tools/list-sources.test.ts +55 -0
  107. package/tests/tools/search-organic-rules.test.ts +56 -0
  108. package/tsconfig.json +19 -0
@@ -0,0 +1,263 @@
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 { handleSearchOrganicRules } from './tools/search-organic-rules.js';
12
+ import { handleGetConversionRequirements } from './tools/get-conversion-requirements.js';
13
+ import { handleGetOrganicStandards } from './tools/get-organic-standards.js';
14
+ import { handleGetApprovedInputs } from './tools/get-approved-inputs.js';
15
+ import { handleGetOrganicSubsidies } from './tools/get-organic-subsidies.js';
16
+ import { handleGetSoilHealthGuidance } from './tools/get-soil-health-guidance.js';
17
+ import { handleSearchCertificationGuidance } from './tools/search-certification-guidance.js';
18
+ const SERVER_NAME = 'ch-organic-regen-mcp';
19
+ const SERVER_VERSION = '0.1.0';
20
+ const PORT = parseInt(process.env.PORT ?? '3000', 10);
21
+ const SearchOrganicRulesSchema = z.object({
22
+ query: z.string(),
23
+ topic: z.string().optional(),
24
+ jurisdiction: z.string().optional(),
25
+ limit: z.number().optional(),
26
+ });
27
+ const ConversionArgsSchema = z.object({
28
+ farm_type: z.string().optional(),
29
+ current_system: z.string().optional(),
30
+ jurisdiction: z.string().optional(),
31
+ });
32
+ const StandardsArgsSchema = z.object({
33
+ production_type: z.string().optional(),
34
+ standard: z.string().optional(),
35
+ jurisdiction: z.string().optional(),
36
+ });
37
+ const InputsArgsSchema = z.object({
38
+ input_type: z.string().optional(),
39
+ jurisdiction: z.string().optional(),
40
+ });
41
+ const SubsidiesArgsSchema = z.object({
42
+ subsidy_type: z.string().optional(),
43
+ zone: z.string().optional(),
44
+ jurisdiction: z.string().optional(),
45
+ });
46
+ const SoilHealthArgsSchema = z.object({
47
+ topic: z.string().optional(),
48
+ jurisdiction: z.string().optional(),
49
+ });
50
+ const CertArgsSchema = z.object({
51
+ query: z.string(),
52
+ jurisdiction: z.string().optional(),
53
+ });
54
+ const TOOLS = [
55
+ {
56
+ name: 'about',
57
+ description: 'Get server metadata: name, version, coverage, data sources, and links.',
58
+ inputSchema: { type: 'object', properties: {} },
59
+ },
60
+ {
61
+ name: 'list_sources',
62
+ description: 'List all data sources with authority, URL, license, and freshness info.',
63
+ inputSchema: { type: 'object', properties: {} },
64
+ },
65
+ {
66
+ name: 'check_data_freshness',
67
+ description: 'Check when data was last ingested, staleness status, and how to trigger a refresh.',
68
+ inputSchema: { type: 'object', properties: {} },
69
+ },
70
+ {
71
+ name: 'search_organic_rules',
72
+ description: 'Volltextsuche ueber Bio-Richtlinien, Umstellung, Bodenfruchtbarkeit und regenerative Landwirtschaft. ' +
73
+ 'Search organic farming rules, conversion guidance, soil health, and regenerative agriculture topics.',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {
77
+ query: { type: 'string', description: 'Suchbegriff / free-text search query (German or English)' },
78
+ topic: { type: 'string', description: 'Filter by topic (e.g. knospe, demeter, umstellung, bodenfruchtbarkeit)' },
79
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
80
+ limit: { type: 'number', description: 'Max results (default: 20, max: 50)' },
81
+ },
82
+ required: ['query'],
83
+ },
84
+ },
85
+ {
86
+ name: 'get_conversion_requirements',
87
+ description: 'Umstellungsanforderungen fuer den Biobetrieb: Zeitrahmen, Voraussetzungen, Unterstuetzungsmassnahmen. ' +
88
+ 'Get organic conversion timeline, requirements, and support measures by farm type.',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ farm_type: { type: 'string', description: 'Betriebstyp (e.g. ackerbau, milchwirtschaft, obstbau, rebbau, gemuese)' },
93
+ current_system: { type: 'string', description: 'Aktuelles System (e.g. oeln, konventionell, ip)' },
94
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
95
+ },
96
+ },
97
+ },
98
+ {
99
+ name: 'get_organic_standards',
100
+ description: 'Bio-Richtlinien nach Standard (Knospe, Bio-Verordnung, Demeter) und Produktionsbereich. ' +
101
+ 'Get organic production rules comparing Bio Suisse Knospe, federal Bio-Verordnung, and Demeter standards.',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ production_type: { type: 'string', description: 'Produktionsbereich (e.g. tierhaltung, pflanzenbau, verarbeitung, futtermittel)' },
106
+ standard: { type: 'string', description: 'Standard: bio_verordnung, knospe, demeter' },
107
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
108
+ },
109
+ },
110
+ },
111
+ {
112
+ name: 'get_approved_inputs',
113
+ description: 'Zugelassene Betriebsmittel fuer Biolandbau (FiBL-Liste): Duenger, Pflanzenschutz, Futtermittel. ' +
114
+ 'Get approved inputs for organic farming from the FiBL Betriebsmittelliste.',
115
+ inputSchema: {
116
+ type: 'object',
117
+ properties: {
118
+ input_type: { type: 'string', description: 'Betriebsmitteltyp: duenger, pflanzenschutz, futtermittel' },
119
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
120
+ },
121
+ },
122
+ },
123
+ {
124
+ name: 'get_organic_subsidies',
125
+ description: 'Bio-Beitrag und weitere Direktzahlungen fuer Biobetriebe: Beitragshoehe, Bedingungen, Kumulierung. ' +
126
+ 'Get organic farming subsidies (Bio-Beitrag) rates, conditions, and stacking rules.',
127
+ inputSchema: {
128
+ type: 'object',
129
+ properties: {
130
+ subsidy_type: { type: 'string', description: 'Beitragstyp (e.g. bio_beitrag, extenso, bff, tierwohl)' },
131
+ zone: { type: 'string', description: 'Zone: talzone, huegelzone, bergzone_i, bergzone_ii, bergzone_iii, bergzone_iv' },
132
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
133
+ },
134
+ },
135
+ },
136
+ {
137
+ name: 'get_soil_health_guidance',
138
+ description: 'Bodenfruchtbarkeit und regenerative Methoden: Kompost, Gruenduengung, Fruchtfolge, Conservation Agriculture. ' +
139
+ 'Get soil health and regenerative agriculture guidance: composting, cover crops, rotation, agroforestry.',
140
+ inputSchema: {
141
+ type: 'object',
142
+ properties: {
143
+ topic: { type: 'string', description: 'Thema (e.g. kompost, gruenduengung, fruchtfolge, agroforstwirtschaft, untersaat, direktsaat)' },
144
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
145
+ },
146
+ },
147
+ },
148
+ {
149
+ name: 'search_certification_guidance',
150
+ description: 'Zertifizierungsprozess Bio Suisse Knospe: Schritte, Inspektionsstellen, Kosten, Haeufigkeit. ' +
151
+ 'Search organic certification guidance: bio.inspecta, Bio Test Agro process, Knospe application steps.',
152
+ inputSchema: {
153
+ type: 'object',
154
+ properties: {
155
+ query: { type: 'string', description: 'Suchbegriff (e.g. anmeldung, kontrolle, kosten, inspektion)' },
156
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
157
+ },
158
+ required: ['query'],
159
+ },
160
+ },
161
+ ];
162
+ function textResult(data) {
163
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
164
+ }
165
+ function errorResult(message) {
166
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
167
+ }
168
+ function registerTools(server, db) {
169
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
170
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
171
+ const { name, arguments: args = {} } = request.params;
172
+ try {
173
+ switch (name) {
174
+ case 'about':
175
+ return textResult(handleAbout());
176
+ case 'list_sources':
177
+ return textResult(handleListSources(db));
178
+ case 'check_data_freshness':
179
+ return textResult(handleCheckFreshness(db));
180
+ case 'search_organic_rules':
181
+ return textResult(handleSearchOrganicRules(db, SearchOrganicRulesSchema.parse(args)));
182
+ case 'get_conversion_requirements':
183
+ return textResult(handleGetConversionRequirements(db, ConversionArgsSchema.parse(args)));
184
+ case 'get_organic_standards':
185
+ return textResult(handleGetOrganicStandards(db, StandardsArgsSchema.parse(args)));
186
+ case 'get_approved_inputs':
187
+ return textResult(handleGetApprovedInputs(db, InputsArgsSchema.parse(args)));
188
+ case 'get_organic_subsidies':
189
+ return textResult(handleGetOrganicSubsidies(db, SubsidiesArgsSchema.parse(args)));
190
+ case 'get_soil_health_guidance':
191
+ return textResult(handleGetSoilHealthGuidance(db, SoilHealthArgsSchema.parse(args)));
192
+ case 'search_certification_guidance':
193
+ return textResult(handleSearchCertificationGuidance(db, CertArgsSchema.parse(args)));
194
+ default:
195
+ return errorResult(`Unknown tool: ${name}`);
196
+ }
197
+ }
198
+ catch (err) {
199
+ return errorResult(err instanceof Error ? err.message : String(err));
200
+ }
201
+ });
202
+ }
203
+ const db = createDatabase();
204
+ const sessions = new Map();
205
+ function createMcpServer() {
206
+ const mcpServer = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
207
+ registerTools(mcpServer, db);
208
+ return mcpServer;
209
+ }
210
+ async function handleMCPRequest(req, res) {
211
+ const sessionId = req.headers['mcp-session-id'];
212
+ if (sessionId && sessions.has(sessionId)) {
213
+ const session = sessions.get(sessionId);
214
+ await session.transport.handleRequest(req, res);
215
+ return;
216
+ }
217
+ if (req.method === 'GET' || req.method === 'DELETE') {
218
+ res.writeHead(400, { 'Content-Type': 'application/json' });
219
+ res.end(JSON.stringify({ error: 'Invalid or missing session ID' }));
220
+ return;
221
+ }
222
+ const mcpServer = createMcpServer();
223
+ const transport = new StreamableHTTPServerTransport({
224
+ sessionIdGenerator: () => randomUUID(),
225
+ });
226
+ await mcpServer.connect(transport);
227
+ transport.onclose = () => {
228
+ if (transport.sessionId) {
229
+ sessions.delete(transport.sessionId);
230
+ }
231
+ mcpServer.close().catch(() => { });
232
+ };
233
+ await transport.handleRequest(req, res);
234
+ if (transport.sessionId) {
235
+ sessions.set(transport.sessionId, { transport, server: mcpServer });
236
+ }
237
+ }
238
+ const httpServer = createServer(async (req, res) => {
239
+ const url = new URL(req.url || '/', `http://localhost:${PORT}`);
240
+ if (url.pathname === '/health' && req.method === 'GET') {
241
+ res.writeHead(200, { 'Content-Type': 'application/json' });
242
+ res.end(JSON.stringify({ status: 'healthy', server: SERVER_NAME, version: SERVER_VERSION }));
243
+ return;
244
+ }
245
+ if (url.pathname === '/mcp' || url.pathname === '/') {
246
+ try {
247
+ await handleMCPRequest(req, res);
248
+ }
249
+ catch (err) {
250
+ if (!res.headersSent) {
251
+ res.writeHead(500, { 'Content-Type': 'application/json' });
252
+ res.end(JSON.stringify({ error: err instanceof Error ? err.message : 'Internal server error' }));
253
+ }
254
+ }
255
+ return;
256
+ }
257
+ res.writeHead(404, { 'Content-Type': 'application/json' });
258
+ res.end(JSON.stringify({ error: 'Not found' }));
259
+ });
260
+ httpServer.listen(PORT, () => {
261
+ console.log(`${SERVER_NAME} v${SERVER_VERSION} listening on port ${PORT}`);
262
+ });
263
+ //# 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,11 @@
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
+ export declare function buildStalenessWarning(publishedDate: string): string | undefined;
11
+ //# 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;AAcD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAUzD;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW/E"}
@@ -0,0 +1,31 @@
1
+ const DISCLAIMER = 'Diese Daten dienen ausschliesslich der Information und stellen keine professionelle landwirtschaftliche ' +
2
+ 'Beratung dar. Vor der Umstellung auf biologische Landwirtschaft oder der Anwendung regenerativer Methoden ' +
3
+ 'ist stets eine qualifizierte Fachberatung (FiBL, Bio Suisse, kantonale Fachstelle, AGRIDEA oder ' +
4
+ 'akkreditierter Bio-Berater) hinzuzuziehen. Die Daten basieren auf den Bio Suisse Richtlinien (Knospe), ' +
5
+ 'der Bio-Verordnung (SR 910.18), der FiBL-Betriebsmittelliste und den Demeter-Richtlinien. Kantonale ' +
6
+ 'Abweichungen und betriebsspezifische Anpassungen sind eigenstaendig zu pruefen. / ' +
7
+ 'This data is provided for informational purposes only and does not constitute professional agricultural ' +
8
+ 'advice. Always consult a qualified organic farming advisor (FiBL, Bio Suisse, cantonal authority) before ' +
9
+ 'making conversion or management decisions. Data sourced from Bio Suisse (Knospe), Swiss Bio-Verordnung, ' +
10
+ 'FiBL Betriebsmittelliste, and Demeter standards.';
11
+ export function buildMeta(overrides) {
12
+ return {
13
+ disclaimer: DISCLAIMER,
14
+ data_age: overrides?.data_age ?? 'unknown',
15
+ source_url: overrides?.source_url ?? 'https://www.bio-suisse.ch/de/richtlinien',
16
+ copyright: 'Data: Bio Suisse, FiBL, BLW, Demeter Schweiz — used under public-sector information principles. Server: Apache-2.0 Ansvar Systems.',
17
+ server: 'ch-organic-regen-mcp',
18
+ version: '0.1.0',
19
+ ...overrides,
20
+ };
21
+ }
22
+ export function buildStalenessWarning(publishedDate) {
23
+ const published = new Date(publishedDate);
24
+ const now = new Date();
25
+ const daysSincePublished = Math.floor((now.getTime() - published.getTime()) / (1000 * 60 * 60 * 24));
26
+ if (daysSincePublished > 14) {
27
+ return `Daten sind ${daysSincePublished} Tage alt (Stand ${publishedDate}). Aktuelle Angaben bei Bio Suisse / FiBL pruefen.`;
28
+ }
29
+ return undefined;
30
+ }
31
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,GACd,0GAA0G;IAC1G,4GAA4G;IAC5G,kGAAkG;IAClG,yGAAyG;IACzG,sGAAsG;IACtG,oFAAoF;IACpF,0GAA0G;IAC1G,2GAA2G;IAC3G,0GAA0G;IAC1G,kDAAkD,CAAC;AAErD,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,0CAA0C;QAC/E,SAAS,EAAE,oIAAoI;QAC/I,MAAM,EAAE,sBAAsB;QAC9B,OAAO,EAAE,OAAO;QAChB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IACzD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC9D,CAAC;IAEF,IAAI,kBAAkB,GAAG,EAAE,EAAE,CAAC;QAC5B,OAAO,cAAc,kBAAkB,oBAAoB,aAAa,oDAAoD,CAAC;IAC/H,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,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,209 @@
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 { handleSearchOrganicRules } from './tools/search-organic-rules.js';
11
+ import { handleGetConversionRequirements } from './tools/get-conversion-requirements.js';
12
+ import { handleGetOrganicStandards } from './tools/get-organic-standards.js';
13
+ import { handleGetApprovedInputs } from './tools/get-approved-inputs.js';
14
+ import { handleGetOrganicSubsidies } from './tools/get-organic-subsidies.js';
15
+ import { handleGetSoilHealthGuidance } from './tools/get-soil-health-guidance.js';
16
+ import { handleSearchCertificationGuidance } from './tools/search-certification-guidance.js';
17
+ const SERVER_NAME = 'ch-organic-regen-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_organic_rules',
37
+ description: 'Volltextsuche ueber Bio-Richtlinien, Umstellung, Bodenfruchtbarkeit und regenerative Landwirtschaft. ' +
38
+ 'Search organic farming rules, conversion guidance, soil health, and regenerative agriculture topics.',
39
+ inputSchema: {
40
+ type: 'object',
41
+ properties: {
42
+ query: { type: 'string', description: 'Suchbegriff / free-text search query (German or English)' },
43
+ topic: { type: 'string', description: 'Filter by topic (e.g. knospe, demeter, umstellung, bodenfruchtbarkeit)' },
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_conversion_requirements',
52
+ description: 'Umstellungsanforderungen fuer den Biobetrieb: Zeitrahmen, Voraussetzungen, Unterstuetzungsmassnahmen. ' +
53
+ 'Get organic conversion timeline, requirements, and support measures by farm type.',
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ farm_type: { type: 'string', description: 'Betriebstyp (e.g. ackerbau, milchwirtschaft, obstbau, rebbau, gemuese)' },
58
+ current_system: { type: 'string', description: 'Aktuelles System (e.g. oeln, konventionell, ip)' },
59
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
60
+ },
61
+ },
62
+ },
63
+ {
64
+ name: 'get_organic_standards',
65
+ description: 'Bio-Richtlinien nach Standard (Knospe, Bio-Verordnung, Demeter) und Produktionsbereich. ' +
66
+ 'Get organic production rules comparing Bio Suisse Knospe, federal Bio-Verordnung, and Demeter standards.',
67
+ inputSchema: {
68
+ type: 'object',
69
+ properties: {
70
+ production_type: { type: 'string', description: 'Produktionsbereich (e.g. tierhaltung, pflanzenbau, verarbeitung, futtermittel)' },
71
+ standard: { type: 'string', description: 'Standard: bio_verordnung, knospe, demeter' },
72
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
73
+ },
74
+ },
75
+ },
76
+ {
77
+ name: 'get_approved_inputs',
78
+ description: 'Zugelassene Betriebsmittel fuer Biolandbau (FiBL-Liste): Duenger, Pflanzenschutz, Futtermittel. ' +
79
+ 'Get approved inputs for organic farming from the FiBL Betriebsmittelliste.',
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ input_type: { type: 'string', description: 'Betriebsmitteltyp: duenger, pflanzenschutz, futtermittel' },
84
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
85
+ },
86
+ },
87
+ },
88
+ {
89
+ name: 'get_organic_subsidies',
90
+ description: 'Bio-Beitrag und weitere Direktzahlungen fuer Biobetriebe: Beitragshoehe, Bedingungen, Kumulierung. ' +
91
+ 'Get organic farming subsidies (Bio-Beitrag) rates, conditions, and stacking rules.',
92
+ inputSchema: {
93
+ type: 'object',
94
+ properties: {
95
+ subsidy_type: { type: 'string', description: 'Beitragstyp (e.g. bio_beitrag, extenso, bff, tierwohl)' },
96
+ zone: { type: 'string', description: 'Zone: talzone, huegelzone, bergzone_i, bergzone_ii, bergzone_iii, bergzone_iv' },
97
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
98
+ },
99
+ },
100
+ },
101
+ {
102
+ name: 'get_soil_health_guidance',
103
+ description: 'Bodenfruchtbarkeit und regenerative Methoden: Kompost, Gruenduengung, Fruchtfolge, Conservation Agriculture. ' +
104
+ 'Get soil health and regenerative agriculture guidance: composting, cover crops, rotation, agroforestry.',
105
+ inputSchema: {
106
+ type: 'object',
107
+ properties: {
108
+ topic: { type: 'string', description: 'Thema (e.g. kompost, gruenduengung, fruchtfolge, agroforstwirtschaft, untersaat, direktsaat)' },
109
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
110
+ },
111
+ },
112
+ },
113
+ {
114
+ name: 'search_certification_guidance',
115
+ description: 'Zertifizierungsprozess Bio Suisse Knospe: Schritte, Inspektionsstellen, Kosten, Haeufigkeit. ' +
116
+ 'Search organic certification guidance: bio.inspecta, Bio Test Agro process, Knospe application steps.',
117
+ inputSchema: {
118
+ type: 'object',
119
+ properties: {
120
+ query: { type: 'string', description: 'Suchbegriff (e.g. anmeldung, kontrolle, kosten, inspektion)' },
121
+ jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
122
+ },
123
+ required: ['query'],
124
+ },
125
+ },
126
+ ];
127
+ const SearchOrganicRulesSchema = z.object({
128
+ query: z.string(),
129
+ topic: z.string().optional(),
130
+ jurisdiction: z.string().optional(),
131
+ limit: z.number().optional(),
132
+ });
133
+ const ConversionArgsSchema = z.object({
134
+ farm_type: z.string().optional(),
135
+ current_system: z.string().optional(),
136
+ jurisdiction: z.string().optional(),
137
+ });
138
+ const StandardsArgsSchema = z.object({
139
+ production_type: z.string().optional(),
140
+ standard: z.string().optional(),
141
+ jurisdiction: z.string().optional(),
142
+ });
143
+ const InputsArgsSchema = z.object({
144
+ input_type: z.string().optional(),
145
+ jurisdiction: z.string().optional(),
146
+ });
147
+ const SubsidiesArgsSchema = z.object({
148
+ subsidy_type: z.string().optional(),
149
+ zone: z.string().optional(),
150
+ jurisdiction: z.string().optional(),
151
+ });
152
+ const SoilHealthArgsSchema = z.object({
153
+ topic: z.string().optional(),
154
+ jurisdiction: z.string().optional(),
155
+ });
156
+ const CertArgsSchema = z.object({
157
+ query: z.string(),
158
+ jurisdiction: z.string().optional(),
159
+ });
160
+ function textResult(data) {
161
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
162
+ }
163
+ function errorResult(message) {
164
+ return { content: [{ type: 'text', text: JSON.stringify({ error: message }) }], isError: true };
165
+ }
166
+ const db = createDatabase();
167
+ const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
168
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
169
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
170
+ const { name, arguments: args = {} } = request.params;
171
+ try {
172
+ switch (name) {
173
+ case 'about':
174
+ return textResult(handleAbout());
175
+ case 'list_sources':
176
+ return textResult(handleListSources(db));
177
+ case 'check_data_freshness':
178
+ return textResult(handleCheckFreshness(db));
179
+ case 'search_organic_rules':
180
+ return textResult(handleSearchOrganicRules(db, SearchOrganicRulesSchema.parse(args)));
181
+ case 'get_conversion_requirements':
182
+ return textResult(handleGetConversionRequirements(db, ConversionArgsSchema.parse(args)));
183
+ case 'get_organic_standards':
184
+ return textResult(handleGetOrganicStandards(db, StandardsArgsSchema.parse(args)));
185
+ case 'get_approved_inputs':
186
+ return textResult(handleGetApprovedInputs(db, InputsArgsSchema.parse(args)));
187
+ case 'get_organic_subsidies':
188
+ return textResult(handleGetOrganicSubsidies(db, SubsidiesArgsSchema.parse(args)));
189
+ case 'get_soil_health_guidance':
190
+ return textResult(handleGetSoilHealthGuidance(db, SoilHealthArgsSchema.parse(args)));
191
+ case 'search_certification_guidance':
192
+ return textResult(handleSearchCertificationGuidance(db, CertArgsSchema.parse(args)));
193
+ default:
194
+ return errorResult(`Unknown tool: ${name}`);
195
+ }
196
+ }
197
+ catch (err) {
198
+ return errorResult(err instanceof Error ? err.message : String(err));
199
+ }
200
+ });
201
+ async function main() {
202
+ const transport = new StdioServerTransport();
203
+ await server.connect(transport);
204
+ }
205
+ main().catch((err) => {
206
+ process.stderr.write(`Fatal error: ${err.message}\n`);
207
+ process.exit(1);
208
+ });
209
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,wCAAwC,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,iCAAiC,EAAE,MAAM,0CAA0C,CAAC;AAE7F,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAC3C,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,KAAK,GAAG;IACZ;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,wEAAwE;QACrF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,UAAU,EAAE,EAAE,EAAE;KACzD;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,yEAAyE;QACtF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,UAAU,EAAE,EAAE,EAAE;KACzD;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,oFAAoF;QACjG,WAAW,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,UAAU,EAAE,EAAE,EAAE;KACzD;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,uGAAuG;YACvG,sGAAsG;QACxG,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;gBAClG,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wEAAwE,EAAE;gBAChH,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;gBACtF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;aAC7E;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,WAAW,EACT,wGAAwG;YACxG,mFAAmF;QACrF,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wEAAwE,EAAE;gBACpH,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;gBAClG,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACvF;SACF;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,0FAA0F;YAC1F,0GAA0G;QAC5G,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gFAAgF,EAAE;gBAClI,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;gBACtF,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACvF;SACF;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,kGAAkG;YAClG,4EAA4E;QAC9E,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;gBACvG,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACvF;SACF;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,qGAAqG;YACrG,oFAAoF;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;gBACvG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+EAA+E,EAAE;gBACtH,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACvF;SACF;KACF;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,+GAA+G;YAC/G,yGAAyG;QAC3G,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8FAA8F,EAAE;gBACtI,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACvF;SACF;KACF;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,WAAW,EACT,+FAA+F;YAC/F,uGAAuG;QACzG,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;gBACrG,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;aACvF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;CACF,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;AAE5B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAEjF,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEtD,IAAI,CAAC;QACH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YACnC,KAAK,cAAc;gBACjB,OAAO,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,KAAK,sBAAsB;gBACzB,OAAO,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,KAAK,sBAAsB;gBACzB,OAAO,UAAU,CAAC,wBAAwB,CAAC,EAAE,EAAE,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxF,KAAK,6BAA6B;gBAChC,OAAO,UAAU,CAAC,+BAA+B,CAAC,EAAE,EAAE,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3F,KAAK,uBAAuB;gBAC1B,OAAO,UAAU,CAAC,yBAAyB,CAAC,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpF,KAAK,qBAAqB;gBACxB,OAAO,UAAU,CAAC,uBAAuB,CAAC,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/E,KAAK,uBAAuB;gBAC1B,OAAO,UAAU,CAAC,yBAAyB,CAAC,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpF,KAAK,0BAA0B;gBAC7B,OAAO,UAAU,CAAC,2BAA2B,CAAC,EAAE,EAAE,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvF,KAAK,+BAA+B;gBAClC,OAAO,UAAU,CAAC,iCAAiC,CAAC,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvF;gBACE,OAAO,WAAW,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -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"}