@ansvar/ch-farm-grants-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.
- package/.github/workflows/check-freshness.yml +18 -0
- package/.github/workflows/ci.yml +21 -0
- package/.github/workflows/codeql.yml +25 -0
- package/.github/workflows/ghcr-build.yml +45 -0
- package/.github/workflows/gitleaks.yml +18 -0
- package/.github/workflows/ingest.yml +28 -0
- package/.github/workflows/publish.yml +24 -0
- package/CHANGELOG.md +22 -0
- package/CODEOWNERS +1 -0
- package/COVERAGE.md +45 -0
- package/DISCLAIMER.md +39 -0
- package/Dockerfile +26 -0
- package/LICENSE +17 -0
- package/PRIVACY.md +36 -0
- package/README.md +80 -0
- package/SECURITY.md +31 -0
- package/TOOLS.md +154 -0
- package/data/coverage.json +19 -0
- package/data/database.db +0 -0
- package/data/sources.yml +29 -0
- package/dist/db.d.ts +25 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +167 -0
- package/dist/db.js.map +1 -0
- package/dist/http-server.d.ts +2 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +261 -0
- package/dist/http-server.js.map +1 -0
- package/dist/jurisdiction.d.ts +18 -0
- package/dist/jurisdiction.d.ts.map +1 -0
- package/dist/jurisdiction.js +16 -0
- package/dist/jurisdiction.js.map +1 -0
- package/dist/metadata.d.ts +10 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +22 -0
- package/dist/metadata.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +207 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/about.d.ts +15 -0
- package/dist/tools/about.d.ts.map +1 -0
- package/dist/tools/about.js +28 -0
- package/dist/tools/about.js.map +1 -0
- package/dist/tools/check-eligibility.d.ts +31 -0
- package/dist/tools/check-eligibility.d.ts.map +1 -0
- package/dist/tools/check-eligibility.js +57 -0
- package/dist/tools/check-eligibility.js.map +1 -0
- package/dist/tools/check-freshness.d.ts +15 -0
- package/dist/tools/check-freshness.d.ts.map +1 -0
- package/dist/tools/check-freshness.js +26 -0
- package/dist/tools/check-freshness.js.map +1 -0
- package/dist/tools/get-application-deadlines.d.ts +27 -0
- package/dist/tools/get-application-deadlines.d.ts.map +1 -0
- package/dist/tools/get-application-deadlines.js +40 -0
- package/dist/tools/get-application-deadlines.js.map +1 -0
- package/dist/tools/get-grant-details.d.ts +42 -0
- package/dist/tools/get-grant-details.d.ts.map +1 -0
- package/dist/tools/get-grant-details.js +24 -0
- package/dist/tools/get-grant-details.js.map +1 -0
- package/dist/tools/get-payment-rates.d.ts +49 -0
- package/dist/tools/get-payment-rates.d.ts.map +1 -0
- package/dist/tools/get-payment-rates.js +37 -0
- package/dist/tools/get-payment-rates.js.map +1 -0
- package/dist/tools/list-grant-options.d.ts +56 -0
- package/dist/tools/list-grant-options.d.ts.map +1 -0
- package/dist/tools/list-grant-options.js +39 -0
- package/dist/tools/list-grant-options.js.map +1 -0
- package/dist/tools/list-sources.d.ts +18 -0
- package/dist/tools/list-sources.d.ts.map +1 -0
- package/dist/tools/list-sources.js +51 -0
- package/dist/tools/list-sources.js.map +1 -0
- package/dist/tools/search-application-guidance.d.ts +36 -0
- package/dist/tools/search-application-guidance.d.ts.map +1 -0
- package/dist/tools/search-application-guidance.js +52 -0
- package/dist/tools/search-application-guidance.js.map +1 -0
- package/dist/tools/search-grants.d.ts +25 -0
- package/dist/tools/search-grants.d.ts.map +1 -0
- package/dist/tools/search-grants.js +26 -0
- package/dist/tools/search-grants.js.map +1 -0
- package/docker-compose.yml +12 -0
- package/eslint.config.js +26 -0
- package/package.json +54 -0
- package/scripts/ingest.ts +742 -0
- package/server.json +41 -0
- package/src/db.ts +208 -0
- package/src/http-server.ts +293 -0
- package/src/jurisdiction.ts +30 -0
- package/src/metadata.ts +32 -0
- package/src/server.ts +230 -0
- package/src/tools/about.ts +29 -0
- package/src/tools/check-eligibility.ts +81 -0
- package/src/tools/check-freshness.ts +42 -0
- package/src/tools/get-application-deadlines.ts +55 -0
- package/src/tools/get-grant-details.ts +51 -0
- package/src/tools/get-payment-rates.ts +60 -0
- package/src/tools/list-grant-options.ts +63 -0
- package/src/tools/list-sources.ts +65 -0
- package/src/tools/search-application-guidance.ts +59 -0
- package/src/tools/search-grants.ts +35 -0
- package/tests/db.test.ts +69 -0
- package/tests/helpers/seed-db.ts +188 -0
- package/tests/jurisdiction.test.ts +35 -0
- package/tests/tools/about.test.ts +23 -0
- package/tests/tools/check-freshness.test.ts +53 -0
- package/tests/tools/list-sources.test.ts +47 -0
- package/tests/tools/search-grants.test.ts +57 -0
- package/tsconfig.json +19 -0
package/data/sources.yml
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Data sources for ch-farm-grants-mcp
|
|
2
|
+
sources:
|
|
3
|
+
- name: Strukturverbesserungsverordnung (SVV, SR 913.1)
|
|
4
|
+
authority: Bundesamt fuer Landwirtschaft (BLW)
|
|
5
|
+
url: https://www.blw.admin.ch/blw/de/home/instrumente/strukturverbesserungen.html
|
|
6
|
+
license: Swiss Federal Administration — free reuse
|
|
7
|
+
update_frequency: annual (with ordinance updates)
|
|
8
|
+
last_retrieved: "2026-04-05"
|
|
9
|
+
|
|
10
|
+
- name: BLW Weisungen Investitionskredite und Beitraege
|
|
11
|
+
authority: Bundesamt fuer Landwirtschaft (BLW)
|
|
12
|
+
url: https://www.blw.admin.ch/blw/de/home/instrumente/strukturverbesserungen/investitionskredite.html
|
|
13
|
+
license: Swiss Federal Administration — free reuse
|
|
14
|
+
update_frequency: annual
|
|
15
|
+
last_retrieved: "2026-04-05"
|
|
16
|
+
|
|
17
|
+
- name: Kantonale Landwirtschaftsaemter
|
|
18
|
+
authority: 26 kantonale Landwirtschaftsaemter
|
|
19
|
+
url: https://www.agridea.ch
|
|
20
|
+
license: Cantonal public information
|
|
21
|
+
update_frequency: variable (per canton)
|
|
22
|
+
last_retrieved: "2026-04-05"
|
|
23
|
+
|
|
24
|
+
- name: AGRIDEA Beratungsunterlagen
|
|
25
|
+
authority: AGRIDEA
|
|
26
|
+
url: https://www.agridea.ch
|
|
27
|
+
license: AGRIDEA — educational use
|
|
28
|
+
update_frequency: periodic
|
|
29
|
+
last_retrieved: "2026-04-05"
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import BetterSqlite3 from 'better-sqlite3';
|
|
2
|
+
export interface Database {
|
|
3
|
+
get<T>(sql: string, params?: unknown[]): T | undefined;
|
|
4
|
+
all<T>(sql: string, params?: unknown[]): T[];
|
|
5
|
+
run(sql: string, params?: unknown[]): void;
|
|
6
|
+
close(): void;
|
|
7
|
+
readonly instance: BetterSqlite3.Database;
|
|
8
|
+
}
|
|
9
|
+
export declare function createDatabase(dbPath?: string): Database;
|
|
10
|
+
export declare function ftsSearch(db: Database, query: string, limit?: number): {
|
|
11
|
+
title: string;
|
|
12
|
+
body: string;
|
|
13
|
+
grant_type: string;
|
|
14
|
+
jurisdiction: string;
|
|
15
|
+
rank: number;
|
|
16
|
+
}[];
|
|
17
|
+
/**
|
|
18
|
+
* Tiered FTS5 search with automatic fallback.
|
|
19
|
+
* Tiers: exact phrase -> AND -> prefix -> stemmed prefix -> OR -> LIKE
|
|
20
|
+
*/
|
|
21
|
+
export declare function tieredFtsSearch(db: Database, table: string, columns: string[], query: string, limit?: number): {
|
|
22
|
+
tier: string;
|
|
23
|
+
results: Record<string, unknown>[];
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAI3C,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IACvD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IAC7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;CAC3C;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CA4BxD;AA6DD,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAG3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CAAE,CA4DtD"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import BetterSqlite3 from 'better-sqlite3';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
export function createDatabase(dbPath) {
|
|
5
|
+
const resolvedPath = dbPath ??
|
|
6
|
+
join(dirname(fileURLToPath(import.meta.url)), '..', 'data', 'database.db');
|
|
7
|
+
const db = new BetterSqlite3(resolvedPath);
|
|
8
|
+
db.pragma('journal_mode = DELETE');
|
|
9
|
+
db.pragma('foreign_keys = ON');
|
|
10
|
+
initSchema(db);
|
|
11
|
+
return {
|
|
12
|
+
get(sql, params = []) {
|
|
13
|
+
return db.prepare(sql).get(...params);
|
|
14
|
+
},
|
|
15
|
+
all(sql, params = []) {
|
|
16
|
+
return db.prepare(sql).all(...params);
|
|
17
|
+
},
|
|
18
|
+
run(sql, params = []) {
|
|
19
|
+
db.prepare(sql).run(...params);
|
|
20
|
+
},
|
|
21
|
+
close() {
|
|
22
|
+
db.close();
|
|
23
|
+
},
|
|
24
|
+
get instance() {
|
|
25
|
+
return db;
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function initSchema(db) {
|
|
30
|
+
db.exec(`
|
|
31
|
+
CREATE TABLE IF NOT EXISTS grants (
|
|
32
|
+
id TEXT PRIMARY KEY,
|
|
33
|
+
name TEXT NOT NULL,
|
|
34
|
+
grant_type TEXT NOT NULL,
|
|
35
|
+
description TEXT,
|
|
36
|
+
federal_rate_pct REAL,
|
|
37
|
+
max_amount REAL,
|
|
38
|
+
duration_years INTEGER,
|
|
39
|
+
zone_bonus TEXT,
|
|
40
|
+
legal_basis TEXT,
|
|
41
|
+
language TEXT DEFAULT 'DE',
|
|
42
|
+
jurisdiction TEXT NOT NULL DEFAULT 'CH'
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IF NOT EXISTS grant_options (
|
|
46
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
+
grant_id TEXT NOT NULL REFERENCES grants(id),
|
|
48
|
+
option_name TEXT NOT NULL,
|
|
49
|
+
description TEXT,
|
|
50
|
+
rate TEXT,
|
|
51
|
+
conditions TEXT
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
CREATE TABLE IF NOT EXISTS eligibility_rules (
|
|
55
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
56
|
+
grant_id TEXT NOT NULL REFERENCES grants(id),
|
|
57
|
+
farm_type TEXT,
|
|
58
|
+
investment_type TEXT,
|
|
59
|
+
zone TEXT,
|
|
60
|
+
requirement TEXT NOT NULL
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE IF NOT EXISTS application_deadlines (
|
|
64
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
65
|
+
grant_id TEXT NOT NULL REFERENCES grants(id),
|
|
66
|
+
canton TEXT,
|
|
67
|
+
deadline_date TEXT,
|
|
68
|
+
notes TEXT
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS search_index USING fts5(
|
|
72
|
+
title, body, grant_type, jurisdiction
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE IF NOT EXISTS db_metadata (
|
|
76
|
+
key TEXT PRIMARY KEY,
|
|
77
|
+
value TEXT
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
INSERT OR IGNORE INTO db_metadata (key, value) VALUES ('schema_version', '1.0');
|
|
81
|
+
INSERT OR IGNORE INTO db_metadata (key, value) VALUES ('mcp_name', 'Switzerland Farm Grants MCP');
|
|
82
|
+
INSERT OR IGNORE INTO db_metadata (key, value) VALUES ('jurisdiction', 'CH');
|
|
83
|
+
`);
|
|
84
|
+
}
|
|
85
|
+
const FTS_COLUMNS = ['title', 'body', 'grant_type', 'jurisdiction'];
|
|
86
|
+
export function ftsSearch(db, query, limit = 20) {
|
|
87
|
+
const { results } = tieredFtsSearch(db, 'search_index', FTS_COLUMNS, query, limit);
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Tiered FTS5 search with automatic fallback.
|
|
92
|
+
* Tiers: exact phrase -> AND -> prefix -> stemmed prefix -> OR -> LIKE
|
|
93
|
+
*/
|
|
94
|
+
export function tieredFtsSearch(db, table, columns, query, limit = 20) {
|
|
95
|
+
const sanitized = sanitizeFtsInput(query);
|
|
96
|
+
if (!sanitized.trim())
|
|
97
|
+
return { tier: 'empty', results: [] };
|
|
98
|
+
const columnList = columns.join(', ');
|
|
99
|
+
const select = `SELECT ${columnList}, rank FROM ${table}`;
|
|
100
|
+
const order = `ORDER BY rank LIMIT ?`;
|
|
101
|
+
// Tier 1: Exact phrase
|
|
102
|
+
const phrase = `"${sanitized}"`;
|
|
103
|
+
let results = tryFts(db, select, table, order, phrase, limit);
|
|
104
|
+
if (results.length > 0)
|
|
105
|
+
return { tier: 'phrase', results };
|
|
106
|
+
// Tier 2: AND
|
|
107
|
+
const words = sanitized.split(/\s+/).filter(w => w.length > 1);
|
|
108
|
+
if (words.length > 1) {
|
|
109
|
+
const andQuery = words.join(' AND ');
|
|
110
|
+
results = tryFts(db, select, table, order, andQuery, limit);
|
|
111
|
+
if (results.length > 0)
|
|
112
|
+
return { tier: 'and', results };
|
|
113
|
+
}
|
|
114
|
+
// Tier 3: Prefix
|
|
115
|
+
const prefixQuery = words.map(w => `${w}*`).join(' AND ');
|
|
116
|
+
results = tryFts(db, select, table, order, prefixQuery, limit);
|
|
117
|
+
if (results.length > 0)
|
|
118
|
+
return { tier: 'prefix', results };
|
|
119
|
+
// Tier 4: Stemmed prefix
|
|
120
|
+
const stemmed = words.map(w => stemWord(w) + '*');
|
|
121
|
+
const stemmedQuery = stemmed.join(' AND ');
|
|
122
|
+
if (stemmedQuery !== prefixQuery) {
|
|
123
|
+
results = tryFts(db, select, table, order, stemmedQuery, limit);
|
|
124
|
+
if (results.length > 0)
|
|
125
|
+
return { tier: 'stemmed', results };
|
|
126
|
+
}
|
|
127
|
+
// Tier 5: OR
|
|
128
|
+
if (words.length > 1) {
|
|
129
|
+
const orQuery = words.join(' OR ');
|
|
130
|
+
results = tryFts(db, select, table, order, orQuery, limit);
|
|
131
|
+
if (results.length > 0)
|
|
132
|
+
return { tier: 'or', results };
|
|
133
|
+
}
|
|
134
|
+
// Tier 6: LIKE fallback
|
|
135
|
+
const baseCols = ['name', 'grant_type'];
|
|
136
|
+
const likeConditions = words.map(() => `(${baseCols.map(c => `${c} LIKE ?`).join(' OR ')})`).join(' AND ');
|
|
137
|
+
const likeParams = words.flatMap(w => baseCols.map(() => `%${w}%`));
|
|
138
|
+
try {
|
|
139
|
+
const likeResults = db.all(`SELECT name as title, COALESCE(description, '') as body, grant_type, jurisdiction FROM grants WHERE ${likeConditions} LIMIT ?`, [...likeParams, limit]);
|
|
140
|
+
if (likeResults.length > 0)
|
|
141
|
+
return { tier: 'like', results: likeResults };
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// LIKE fallback failed
|
|
145
|
+
}
|
|
146
|
+
return { tier: 'none', results: [] };
|
|
147
|
+
}
|
|
148
|
+
function tryFts(db, select, table, order, matchExpr, limit) {
|
|
149
|
+
try {
|
|
150
|
+
return db.all(`${select} WHERE ${table} MATCH ? ${order}`, [matchExpr, limit]);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function sanitizeFtsInput(query) {
|
|
157
|
+
return query
|
|
158
|
+
.replace(/["""'',,,,]/g, '"')
|
|
159
|
+
.replace(/[^a-zA-Z0-9\s*"_\u00C0-\u024F-]/g, ' ')
|
|
160
|
+
.replace(/\s+/g, ' ')
|
|
161
|
+
.trim();
|
|
162
|
+
}
|
|
163
|
+
function stemWord(word) {
|
|
164
|
+
return word
|
|
165
|
+
.replace(/(ung|heit|keit|lich|isch|ieren|tion|ment|ness|able|ible|ous|ive|ing|ers|ed|es|er|en|ly|s)$/i, '');
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,261 @@
|
|
|
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 { handleSearchGrants } from './tools/search-grants.js';
|
|
12
|
+
import { handleGetGrantDetails } from './tools/get-grant-details.js';
|
|
13
|
+
import { handleGetPaymentRates } from './tools/get-payment-rates.js';
|
|
14
|
+
import { handleCheckEligibility } from './tools/check-eligibility.js';
|
|
15
|
+
import { handleListGrantOptions } from './tools/list-grant-options.js';
|
|
16
|
+
import { handleGetApplicationDeadlines } from './tools/get-application-deadlines.js';
|
|
17
|
+
import { handleSearchApplicationGuidance } from './tools/search-application-guidance.js';
|
|
18
|
+
const SERVER_NAME = 'ch-farm-grants-mcp';
|
|
19
|
+
const SERVER_VERSION = '0.1.0';
|
|
20
|
+
const PORT = parseInt(process.env.PORT ?? '3000', 10);
|
|
21
|
+
const SearchGrantsArgsSchema = z.object({
|
|
22
|
+
query: z.string(),
|
|
23
|
+
grant_type: z.string().optional(),
|
|
24
|
+
jurisdiction: z.string().optional(),
|
|
25
|
+
limit: z.number().optional(),
|
|
26
|
+
});
|
|
27
|
+
const GrantDetailsArgsSchema = z.object({
|
|
28
|
+
grant_id: z.string(),
|
|
29
|
+
jurisdiction: z.string().optional(),
|
|
30
|
+
});
|
|
31
|
+
const PaymentRatesArgsSchema = z.object({
|
|
32
|
+
grant_id: z.string(),
|
|
33
|
+
zone: z.string().optional(),
|
|
34
|
+
jurisdiction: z.string().optional(),
|
|
35
|
+
});
|
|
36
|
+
const EligibilityArgsSchema = z.object({
|
|
37
|
+
farm_type: z.string(),
|
|
38
|
+
investment_type: z.string().optional(),
|
|
39
|
+
zone: z.string().optional(),
|
|
40
|
+
jurisdiction: z.string().optional(),
|
|
41
|
+
});
|
|
42
|
+
const ListGrantOptionsArgsSchema = z.object({
|
|
43
|
+
grant_id: z.string().optional(),
|
|
44
|
+
jurisdiction: z.string().optional(),
|
|
45
|
+
});
|
|
46
|
+
const DeadlinesArgsSchema = z.object({
|
|
47
|
+
grant_id: z.string().optional(),
|
|
48
|
+
canton: z.string().optional(),
|
|
49
|
+
jurisdiction: z.string().optional(),
|
|
50
|
+
});
|
|
51
|
+
const GuidanceArgsSchema = z.object({
|
|
52
|
+
query: z.string(),
|
|
53
|
+
jurisdiction: z.string().optional(),
|
|
54
|
+
});
|
|
55
|
+
const TOOLS = [
|
|
56
|
+
{
|
|
57
|
+
name: 'about',
|
|
58
|
+
description: 'Get server metadata: name, version, coverage, data sources, and links.',
|
|
59
|
+
inputSchema: { type: 'object', properties: {} },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'list_sources',
|
|
63
|
+
description: 'List all data sources with authority, URL, license, and freshness info.',
|
|
64
|
+
inputSchema: { type: 'object', properties: {} },
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'check_data_freshness',
|
|
68
|
+
description: 'Check when data was last ingested, staleness status, and how to trigger a refresh.',
|
|
69
|
+
inputSchema: { type: 'object', properties: {} },
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'search_grants',
|
|
73
|
+
description: 'Search Swiss agricultural structural improvement grants, investment credits, and funding programmes. Use for broad queries about Investitionskredite, Beitraege, Meliorationen, PRE.',
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: {
|
|
77
|
+
query: { type: 'string', description: 'Free-text search query (German or English)' },
|
|
78
|
+
grant_type: { type: 'string', description: 'Filter by type: investitionskredit, beitrag, meliorationsbeitrag, pre, ressourcenprogramm, gewaesserschutz, starthilfe' },
|
|
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_grant_details',
|
|
87
|
+
description: 'Get full details for a specific grant programme: objectives, contribution rates, conditions, eligibility rules, and sub-options.',
|
|
88
|
+
inputSchema: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
grant_id: { type: 'string', description: 'Grant ID or name (e.g. investitionskredit-oekonomiegebaeude, starthilfe-junglandwirte)' },
|
|
92
|
+
jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
|
|
93
|
+
},
|
|
94
|
+
required: ['grant_id'],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'get_payment_rates',
|
|
99
|
+
description: 'Get federal and cantonal contribution rates for a grant programme, with zone-specific bonuses (Berggebiet, Huegelzone).',
|
|
100
|
+
inputSchema: {
|
|
101
|
+
type: 'object',
|
|
102
|
+
properties: {
|
|
103
|
+
grant_id: { type: 'string', description: 'Grant ID or name' },
|
|
104
|
+
zone: { type: 'string', description: 'Altitude zone: talzone, huegelzone, bergzone_i-iv, soemmerungsgebiet' },
|
|
105
|
+
jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
|
|
106
|
+
},
|
|
107
|
+
required: ['grant_id'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'check_eligibility',
|
|
112
|
+
description: 'Check which grants a farm is eligible for based on farm type, planned investment, and altitude zone.',
|
|
113
|
+
inputSchema: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
properties: {
|
|
116
|
+
farm_type: { type: 'string', description: 'Farm type: milchwirtschaft, ackerbau, mutterkuhhaltung, bergbetrieb, alpwirtschaft, gemischt, gemeinschaft, junglandwirt' },
|
|
117
|
+
investment_type: { type: 'string', description: 'Investment type: stallbau, hofduengerlager, wohnhaus, diversifikation, alpgebaeude, wegebau, wasserversorgung, biogasanlage, kaeserei' },
|
|
118
|
+
zone: { type: 'string', description: 'Altitude zone: talzone, huegelzone, bergzone_i-iv, soemmerungsgebiet' },
|
|
119
|
+
jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
|
|
120
|
+
},
|
|
121
|
+
required: ['farm_type'],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'list_grant_options',
|
|
126
|
+
description: 'List all sub-options (Massnahmen) within a grant programme, or list all grants with their option counts.',
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: 'object',
|
|
129
|
+
properties: {
|
|
130
|
+
grant_id: { type: 'string', description: 'Grant ID to list options for. If omitted, lists all grants.' },
|
|
131
|
+
jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'get_application_deadlines',
|
|
137
|
+
description: 'Get application deadlines for grants, optionally filtered by canton (2-letter code: ZH, BE, LU, etc.).',
|
|
138
|
+
inputSchema: {
|
|
139
|
+
type: 'object',
|
|
140
|
+
properties: {
|
|
141
|
+
grant_id: { type: 'string', description: 'Grant ID to check deadlines for' },
|
|
142
|
+
canton: { type: 'string', description: 'Canton code (e.g. ZH, BE, LU, SG, GR, VS, TI)' },
|
|
143
|
+
jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'search_application_guidance',
|
|
149
|
+
description: 'How to apply for Swiss farm grants: required documents, cantonal contacts, general process, and AGRIDEA advisory support.',
|
|
150
|
+
inputSchema: {
|
|
151
|
+
type: 'object',
|
|
152
|
+
properties: {
|
|
153
|
+
query: { type: 'string', description: 'Free-text search query about the application process' },
|
|
154
|
+
jurisdiction: { type: 'string', description: 'ISO 3166-1 alpha-2 code (default: CH)' },
|
|
155
|
+
},
|
|
156
|
+
required: ['query'],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
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
|
+
function registerTools(server, db) {
|
|
167
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
168
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
169
|
+
const { name, arguments: args = {} } = request.params;
|
|
170
|
+
try {
|
|
171
|
+
switch (name) {
|
|
172
|
+
case 'about':
|
|
173
|
+
return textResult(handleAbout());
|
|
174
|
+
case 'list_sources':
|
|
175
|
+
return textResult(handleListSources(db));
|
|
176
|
+
case 'check_data_freshness':
|
|
177
|
+
return textResult(handleCheckFreshness(db));
|
|
178
|
+
case 'search_grants':
|
|
179
|
+
return textResult(handleSearchGrants(db, SearchGrantsArgsSchema.parse(args)));
|
|
180
|
+
case 'get_grant_details':
|
|
181
|
+
return textResult(handleGetGrantDetails(db, GrantDetailsArgsSchema.parse(args)));
|
|
182
|
+
case 'get_payment_rates':
|
|
183
|
+
return textResult(handleGetPaymentRates(db, PaymentRatesArgsSchema.parse(args)));
|
|
184
|
+
case 'check_eligibility':
|
|
185
|
+
return textResult(handleCheckEligibility(db, EligibilityArgsSchema.parse(args)));
|
|
186
|
+
case 'list_grant_options':
|
|
187
|
+
return textResult(handleListGrantOptions(db, ListGrantOptionsArgsSchema.parse(args)));
|
|
188
|
+
case 'get_application_deadlines':
|
|
189
|
+
return textResult(handleGetApplicationDeadlines(db, DeadlinesArgsSchema.parse(args)));
|
|
190
|
+
case 'search_application_guidance':
|
|
191
|
+
return textResult(handleSearchApplicationGuidance(db, GuidanceArgsSchema.parse(args)));
|
|
192
|
+
default:
|
|
193
|
+
return errorResult(`Unknown tool: ${name}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const db = createDatabase();
|
|
202
|
+
const sessions = new Map();
|
|
203
|
+
function createMcpServer() {
|
|
204
|
+
const mcpServer = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
|
|
205
|
+
registerTools(mcpServer, db);
|
|
206
|
+
return mcpServer;
|
|
207
|
+
}
|
|
208
|
+
async function handleMCPRequest(req, res) {
|
|
209
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
210
|
+
if (sessionId && sessions.has(sessionId)) {
|
|
211
|
+
const session = sessions.get(sessionId);
|
|
212
|
+
await session.transport.handleRequest(req, res);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (req.method === 'GET' || req.method === 'DELETE') {
|
|
216
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
217
|
+
res.end(JSON.stringify({ error: 'Invalid or missing session ID' }));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const mcpServer = createMcpServer();
|
|
221
|
+
const transport = new StreamableHTTPServerTransport({
|
|
222
|
+
sessionIdGenerator: () => randomUUID(),
|
|
223
|
+
});
|
|
224
|
+
await mcpServer.connect(transport);
|
|
225
|
+
transport.onclose = () => {
|
|
226
|
+
if (transport.sessionId) {
|
|
227
|
+
sessions.delete(transport.sessionId);
|
|
228
|
+
}
|
|
229
|
+
mcpServer.close().catch(() => { });
|
|
230
|
+
};
|
|
231
|
+
await transport.handleRequest(req, res);
|
|
232
|
+
if (transport.sessionId) {
|
|
233
|
+
sessions.set(transport.sessionId, { transport, server: mcpServer });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const httpServer = createServer(async (req, res) => {
|
|
237
|
+
const url = new URL(req.url || '/', `http://localhost:${PORT}`);
|
|
238
|
+
if (url.pathname === '/health' && req.method === 'GET') {
|
|
239
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
240
|
+
res.end(JSON.stringify({ status: 'healthy', server: SERVER_NAME, version: SERVER_VERSION }));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (url.pathname === '/mcp' || url.pathname === '/') {
|
|
244
|
+
try {
|
|
245
|
+
await handleMCPRequest(req, res);
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
if (!res.headersSent) {
|
|
249
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
250
|
+
res.end(JSON.stringify({ error: err instanceof Error ? err.message : 'Internal server error' }));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
256
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
257
|
+
});
|
|
258
|
+
httpServer.listen(PORT, () => {
|
|
259
|
+
console.log(`${SERVER_NAME} v${SERVER_VERSION} listening on port ${PORT}`);
|
|
260
|
+
});
|
|
261
|
+
//# 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;AAcD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAUzD"}
|
package/dist/metadata.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const DISCLAIMER = 'Diese Daten dienen ausschliesslich der Information und stellen keine Zusicherung fuer die Gewaehrung ' +
|
|
2
|
+
'von Foerdermitteln dar. Foerderentscheide liegen bei den zustaendigen kantonalen Landwirtschaftsaemtern ' +
|
|
3
|
+
'und dem Bundesamt fuer Landwirtschaft (BLW). Vor der Einreichung eines Gesuchs ist stets die kantonale ' +
|
|
4
|
+
'Fachstelle oder AGRIDEA zu konsultieren. Die Daten basieren auf der Strukturverbesserungsverordnung ' +
|
|
5
|
+
'(SVV, SR 913.1), den BLW-Weisungen zu Investitionskrediten und Beitraegen, sowie kantonalen ' +
|
|
6
|
+
'Ausfuehrungsbestimmungen. Kantonale Beitragssaetze und Fristen koennen abweichen. / ' +
|
|
7
|
+
'This data is provided for informational purposes only and does not guarantee grant approval. ' +
|
|
8
|
+
'Funding decisions are made by cantonal agricultural offices and the Federal Office for Agriculture (BLW). ' +
|
|
9
|
+
'Always consult the relevant cantonal authority before submitting an application. Data sourced from ' +
|
|
10
|
+
'SVV (SR 913.1), BLW investment credit guidelines, and cantonal implementation rules.';
|
|
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.blw.admin.ch/blw/de/home/instrumente/strukturverbesserungen.html',
|
|
16
|
+
copyright: 'Data: BLW, SVV, AGRIDEA, kantonale Landwirtschaftsaemter — used under public-sector information principles. Server: Apache-2.0 Ansvar Systems.',
|
|
17
|
+
server: 'ch-farm-grants-mcp',
|
|
18
|
+
version: '0.1.0',
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,GACd,uGAAuG;IACvG,0GAA0G;IAC1G,yGAAyG;IACzG,sGAAsG;IACtG,8FAA8F;IAC9F,sFAAsF;IACtF,+FAA+F;IAC/F,4GAA4G;IAC5G,qGAAqG;IACrG,sFAAsF,CAAC;AAEzF,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,8EAA8E;QACnH,SAAS,EAAE,gJAAgJ;QAC3J,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,OAAO;QAChB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|