@matematicsolutions/mcp-eu-sparql 1.1.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MateMatic / Wieslaw Mazur
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # mcp-eu-sparql
2
+ [![MCP](https://img.shields.io/badge/MCP-Server-blue)](https://modelcontextprotocol.io) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![Node](https://img.shields.io/badge/Node-18%2B-brightgreen)](https://nodejs.org)
3
+
4
+ MCP server dla prawa UE i orzecznictwa CJEU przez Publications Office SPARQL
5
+ (Cellar / EUR-Lex).
6
+
7
+ ## Tooly
8
+
9
+ - **`search_by_celex(celex, lang?)`** — pojedynczy akt po numerze CELEX
10
+ (np. `32016R0679` = RODO).
11
+ - **`search_by_date_range(date_from, date_to, document_type?, lang?, limit?)`**
12
+ — akty z zakresu dat, opcjonalnie zawęzone do typu (REG / DIR / DEC / RECO / OPIN).
13
+ - **`search_cjeu(date_from?, date_to?, lang?, limit?)`** — wyroki (JUDG)
14
+ i postanowienia (ORDER) Trybunału Sprawiedliwości UE.
15
+
16
+ Każda zwrotka zawiera `structuredContent.citations` z polami `title`, `url` (EUR-Lex),
17
+ `celex`, `publication_date`, `document_type` — Patron czyta to pole i wystawia
18
+ w panelu UI jako sekcję "Akty prawa UE (EUR-Lex / CJEU)".
19
+
20
+ ## Stack
21
+
22
+ - Node 18+
23
+ - `@modelcontextprotocol/sdk`
24
+ - Stdio transport (jak `mcp-saos`)
25
+ - Backend: HTTP POST na `https://publications.europa.eu/webapi/rdf/sparql`
26
+ z `format=application/sparql-results+json`
27
+
28
+ ## Build + uruchomienie
29
+
30
+ ```bash
31
+ npm install
32
+ npm run build
33
+ node dist/index.js # uruchomi serwer na stdio
34
+ ```
35
+
36
+ ## Wpięcie do Patrona
37
+
38
+ W `patron/backend/mcp-servers.json`:
39
+
40
+ ```json
41
+ [
42
+ {
43
+ "name": "saos",
44
+ "transport": "stdio",
45
+ "command": "node",
46
+ "args": ["C:/Users/<TWOJ-UZYTKOWNIK>/mcp-saos/dist/index.js"]
47
+ },
48
+ {
49
+ "name": "eu-sparql",
50
+ "transport": "stdio",
51
+ "command": "node",
52
+ "args": ["C:/Users/<TWOJ-UZYTKOWNIK>/mcp-eu-sparql/dist/index.js"]
53
+ }
54
+ ]
55
+ ```
56
+
57
+ ## Smoke test
58
+
59
+ ```bash
60
+ # RODO po CELEX, tytuł po polsku
61
+ echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_by_celex","arguments":{"celex":"32016R0679","lang":"POL"}}}' \
62
+ | node dist/index.js
63
+ ```
64
+
65
+ Powinno zwrócić `Rozporzadzenie Parlamentu Europejskiego ...` z polskim tytułem
66
+ i URL EUR-Lex.
67
+
68
+ ## Licencja
69
+
70
+ MIT.
71
+
72
+ ## Part of the MateMatic legal stack
73
+
74
+ This server is one of five MCP connectors covering Polish jurisdiction +
75
+ EU law, used by [Patron](https://github.com/matematicsolutions/patron)
76
+ (AGPL-3.0) and any other MCP-aware legal AI agent.
77
+
78
+ - **mcp-eu-sparql** (this repo) — EU law + CJEU (EUR-Lex / Cellar)
79
+ - [mcp-saos](https://github.com/matematicsolutions/mcp-saos) — common courts, SN, TK, KIO
80
+ - [mcp-nsa](https://github.com/matematicsolutions/mcp-nsa) — NSA + 16 WSA administrative courts
81
+ - [mcp-isap](https://github.com/matematicsolutions/mcp-isap) — Polish legislation (Dz.U. + M.P.)
82
+ - [mcp-krs](https://github.com/matematicsolutions/mcp-krs) — Polish company registry (KRS)
83
+
84
+
85
+ All five MCP servers share the same `structuredContent.citations`
86
+ contract: each tool returns an array of `{title, url, snippet?, ...metadata}`
87
+ that legal agents can render directly in their citation panel.
88
+
89
+ See [matematicsolutions/.github](https://github.com/matematicsolutions)
90
+ for the full org profile.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,444 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // MCP server - EU legislation + CJEU case law via Publications Office SPARQL
4
+ // (Cellar / EUR-Lex). Stdio transport - wpinany do Patrona przez mcp-servers.json.
5
+ //
6
+ // Endpoint: https://publications.europa.eu/webapi/rdf/sparql
7
+ //
8
+ // Tooly:
9
+ // - search_by_celex - znajdz akt po sygnaturze CELEX
10
+ // - search_by_date_range - akty z zakresu dat (REG/DIR/DEC + opcjonalnie typ)
11
+ // - search_cjeu - orzecznictwo CJEU z zakresu dat
12
+ //
13
+ // Kazda zwrotka zawiera structuredContent.citations - lista obiektow
14
+ // { title, url, snippet?, celex, publication_date?, document_type }.
15
+ // Patron czyta to pole automatycznie i wystawia w panelu UI.
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
18
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
19
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
20
+ // ---------------------------------------------------------------------------
21
+ // SPARQL client
22
+ // ---------------------------------------------------------------------------
23
+ const SPARQL_ENDPOINT = "https://publications.europa.eu/webapi/rdf/sparql";
24
+ const HTTP_TIMEOUT_MS = 30000;
25
+ async function runSparql(query) {
26
+ const params = new URLSearchParams();
27
+ params.set("query", query);
28
+ params.set("format", "application/sparql-results+json");
29
+ params.set("timeout", String(HTTP_TIMEOUT_MS));
30
+ const controller = new AbortController();
31
+ const timer = setTimeout(() => controller.abort(), HTTP_TIMEOUT_MS + 5000);
32
+ try {
33
+ const res = await fetch(SPARQL_ENDPOINT, {
34
+ method: "POST",
35
+ headers: {
36
+ "Content-Type": "application/x-www-form-urlencoded",
37
+ Accept: "application/sparql-results+json",
38
+ },
39
+ body: params.toString(),
40
+ signal: controller.signal,
41
+ });
42
+ if (!res.ok) {
43
+ throw new Error(`SPARQL endpoint returned HTTP ${res.status} ${res.statusText}`);
44
+ }
45
+ return (await res.json());
46
+ }
47
+ finally {
48
+ clearTimeout(timer);
49
+ }
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // SPARQL queries
53
+ // ---------------------------------------------------------------------------
54
+ const PREFIXES = `
55
+ PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
56
+ PREFIX dc: <http://purl.org/dc/elements/1.1/>
57
+ PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
58
+ `;
59
+ // Mapowanie typu aktu (skrot uzytkownika) -> URI Resource-Type.
60
+ const RESOURCE_TYPES = {
61
+ REG: "http://publications.europa.eu/resource/authority/resource-type/REG",
62
+ DIR: "http://publications.europa.eu/resource/authority/resource-type/DIR",
63
+ DEC: "http://publications.europa.eu/resource/authority/resource-type/DEC",
64
+ RECO: "http://publications.europa.eu/resource/authority/resource-type/RECO",
65
+ OPIN: "http://publications.europa.eu/resource/authority/resource-type/OPIN",
66
+ JUDG: "http://publications.europa.eu/resource/authority/resource-type/JUDG",
67
+ ORDER: "http://publications.europa.eu/resource/authority/resource-type/ORDER_CJ",
68
+ };
69
+ function searchByCelexQuery(celex, lang) {
70
+ // Eskapuj cudzyslowy w SPARQL - tylko " i \ wymagaja escape'u.
71
+ const safeCelex = celex.replace(/["\\]/g, "\\$&");
72
+ const safeLang = lang.replace(/["\\]/g, "\\$&");
73
+ return `${PREFIXES}
74
+ SELECT DISTINCT ?work ?celex ?date ?type ?title
75
+ WHERE {
76
+ ?work cdm:resource_legal_id_celex ?celex .
77
+ FILTER(STR(?celex) = "${safeCelex}")
78
+ OPTIONAL { ?work cdm:work_date_document ?date }
79
+ OPTIONAL { ?work cdm:work_has_resource-type ?type }
80
+ OPTIONAL {
81
+ ?expr cdm:expression_belongs_to_work ?work ;
82
+ cdm:expression_uses_language ?lang ;
83
+ cdm:expression_title ?title .
84
+ ?lang dc:identifier "${safeLang}" .
85
+ }
86
+ }
87
+ LIMIT 1
88
+ `;
89
+ }
90
+ function searchByDateRangeQuery(dateFrom, dateTo, typeUri, lang, limit) {
91
+ const safeFrom = dateFrom.replace(/["\\]/g, "\\$&");
92
+ const safeTo = dateTo.replace(/["\\]/g, "\\$&");
93
+ const safeLang = lang.replace(/["\\]/g, "\\$&");
94
+ const typeFilter = typeUri
95
+ ? `?work cdm:work_has_resource-type <${typeUri}> .`
96
+ : "";
97
+ return `${PREFIXES}
98
+ SELECT DISTINCT ?work ?celex ?date ?type ?title
99
+ WHERE {
100
+ ${typeFilter}
101
+ ?work cdm:work_date_document ?date .
102
+ OPTIONAL { ?work cdm:resource_legal_id_celex ?celex }
103
+ OPTIONAL { ?work cdm:work_has_resource-type ?type }
104
+ OPTIONAL {
105
+ ?expr cdm:expression_belongs_to_work ?work ;
106
+ cdm:expression_uses_language ?lang ;
107
+ cdm:expression_title ?title .
108
+ ?lang dc:identifier "${safeLang}" .
109
+ }
110
+ FILTER (?date >= "${safeFrom}"^^xsd:date && ?date <= "${safeTo}"^^xsd:date)
111
+ FILTER NOT EXISTS { ?work cdm:do_not_index "true"^^xsd:boolean }
112
+ }
113
+ ORDER BY DESC(?date)
114
+ LIMIT ${limit}
115
+ `;
116
+ }
117
+ function searchCjeuQuery(dateFrom, dateTo, lang, limit) {
118
+ const safeLang = lang.replace(/["\\]/g, "\\$&");
119
+ const dateFilter = dateFrom && dateTo
120
+ ? `FILTER (?date >= "${dateFrom.replace(/["\\]/g, "\\$&")}"^^xsd:date && ?date <= "${dateTo.replace(/["\\]/g, "\\$&")}"^^xsd:date)`
121
+ : "";
122
+ return `${PREFIXES}
123
+ SELECT DISTINCT ?work ?celex ?date ?title
124
+ WHERE {
125
+ { ?work cdm:work_has_resource-type <${RESOURCE_TYPES.JUDG}> }
126
+ UNION
127
+ { ?work cdm:work_has_resource-type <${RESOURCE_TYPES.ORDER}> }
128
+ ?work cdm:work_date_document ?date .
129
+ OPTIONAL { ?work cdm:resource_legal_id_celex ?celex }
130
+ OPTIONAL {
131
+ ?expr cdm:expression_belongs_to_work ?work ;
132
+ cdm:expression_uses_language ?lang ;
133
+ cdm:expression_title ?title .
134
+ ?lang dc:identifier "${safeLang}" .
135
+ }
136
+ ${dateFilter}
137
+ FILTER NOT EXISTS { ?work cdm:do_not_index "true"^^xsd:boolean }
138
+ }
139
+ ORDER BY DESC(?date)
140
+ LIMIT ${limit}
141
+ `;
142
+ }
143
+ function eurLexUrl(celex, lang = "PL") {
144
+ return `https://eur-lex.europa.eu/legal-content/${lang}/TXT/?uri=CELEX:${encodeURIComponent(celex)}`;
145
+ }
146
+ function shortTypeFromUri(uri) {
147
+ // URI: http://publications.europa.eu/resource/authority/resource-type/REG
148
+ const m = uri.match(/\/resource-type\/([A-Z_]+)$/);
149
+ return m ? m[1] : uri;
150
+ }
151
+ function buildCitations(rows, lang) {
152
+ const out = [];
153
+ for (const row of rows) {
154
+ const celex = row.celex?.value;
155
+ if (!celex)
156
+ continue;
157
+ const title = row.title?.value;
158
+ const date = row.date?.value;
159
+ const typeUri = row.type?.value;
160
+ out.push({
161
+ title: title ?? celex,
162
+ url: eurLexUrl(celex, lang === "POL" ? "PL" : "EN"),
163
+ ...(date && { publication_date: date }),
164
+ ...(celex && { celex }),
165
+ ...(typeUri && { document_type: shortTypeFromUri(typeUri) }),
166
+ });
167
+ }
168
+ return out;
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Human-readable text formatter
172
+ // ---------------------------------------------------------------------------
173
+ function formatRows(rows, header) {
174
+ if (rows.length === 0) {
175
+ return (header +
176
+ "\n\nBrak wynikow. Sprobuj szerszego zakresu dat lub innego CELEX-a.");
177
+ }
178
+ const lines = [header, ""];
179
+ for (const row of rows) {
180
+ const celex = row.celex?.value ?? "brak_celex";
181
+ const date = row.date?.value ?? "?";
182
+ const typeUri = row.type?.value;
183
+ const type = typeUri ? shortTypeFromUri(typeUri) : "?";
184
+ const title = row.title?.value;
185
+ lines.push(`CELEX: ${celex}`);
186
+ lines.push(` Data : ${date} | Typ: ${type}`);
187
+ if (title)
188
+ lines.push(` Tytul: ${title}`);
189
+ lines.push(` URL : ${eurLexUrl(celex)}`);
190
+ lines.push("");
191
+ }
192
+ return lines.join("\n");
193
+ }
194
+ // ---------------------------------------------------------------------------
195
+ // Instructions (procedural orchestration) - wstrzykiwane przez Server.
196
+ // Drift test (test/drift.mjs) sprawdza spojnosc z TOOLS i ErrorCode.
197
+ // Pattern z dograh-hq/dograh v1.31.0 (BSD-2) via mcp-eu-compliance v0.2.0.
198
+ // ---------------------------------------------------------------------------
199
+ const INSTRUCTIONS = `Ten serwer MCP odpytuje oficjalny endpoint SPARQL Publications Office (publications.europa.eu/webapi/rdf/sparql) i graf wiedzy Cellar (ontologia CDM). Zwraca akty prawne UE i orzeczenia CJEU z stabilnymi identyfikatorami CELEX i URL EUR-Lex.
200
+
201
+ ## Kolejnosc wywolan
202
+
203
+ ### Konkretny akt prawny
204
+ 1. \`search_by_celex\` - jesli znasz CELEX (np. RODO=32016R0679, AI Act=32024R1689, DORA=32022R2554). Najszybciej i najpewniej.
205
+
206
+ ### Przeglad legislacji w okresie
207
+ 2. \`search_by_date_range\` - akty UE z zakresu dat. Opcjonalnie filtruj typ (REG/DIR/DEC/RECO/OPIN). Maks 50 wynikow.
208
+
209
+ ### Orzecznictwo CJEU
210
+ 3. \`search_cjeu\` - orzeczenia Trybunalu Sprawiedliwosci UE (wyroki JUDG, postanowienia ORDER). Opcjonalny zakres dat. Format CELEX dla CJEU: 6 cyfr roku + CJ + nr sprawy (np. 62022CJ0252).
211
+
212
+ ## Twarde ograniczenia
213
+
214
+ - **CELEX kluczowy dla cytowalnosci** - kazda odpowiedz zawiera CELEX w \`structuredContent.citations\`. Bez CELEX brak cytowalnosci.
215
+ - **Wielojezycznosc 24 jezyki UE** - default jezyk POL. Parametr \`lang\` (POL/ENG/FRA/DEU). Polskie tytuly nie zawsze sa - fallback na ENG dla CJEU jesli brak.
216
+ - **Stateless** - kazde wywolanie idzie do SPARQL live. NIE cachuj wynikow (akty konsoliduja sie / status sie zmienia).
217
+ - **Bez scrapingu EUR-Lex** - korzystamy z oficjalnego SPARQL endpoint.
218
+ - **\`structuredContent.citations\`**: title, url (EUR-Lex), celex, publication_date, document_type. Cytuj te citations w odpowiedzi koncowej.
219
+
220
+ ## Iteracja po bledach
221
+
222
+ Tool zwraca \`isError: true\` + tekst z prefixem \`[code]\`. Typowe kody:
223
+ - \`missing_arg\` - brakujacy wymagany parametr (celex w search_by_celex; date_from/date_to w search_by_date_range). Przeczytaj inputSchema.
224
+ - \`invalid_date\` - data nie w formacie YYYY-MM-DD lub date_to przed date_from.
225
+ - \`upstream_error\` - blad SPARQL endpoint (HTTP, timeout, malformed response). Retry raz przed surface do uzytkownika.
226
+ - \`empty_result\` - brak wynikow dla danego CELEX/zakresu. Zwery zewnetrznym katalogiem (eur-lex.europa.eu).
227
+
228
+ ## Styl odpowiedzi
229
+
230
+ - Cytuj akty w formacie "AI Act (32024R1689)" lub "RODO (32016R0679)" - skrocony tytul + CELEX.
231
+ - Dla CJEU: "Wyrok C-252/22 (62022CJ0252) z dnia ...".
232
+ - NIE wymyslaj CELEX-ow ani dat - wszystko z \`structuredContent.citations\`.
233
+ - Disclaimer wielojezycznosci: jesli zwracasz angielskie tytuly dla aktow ktore powinny miec PL, oznacz to.`;
234
+ // ---------------------------------------------------------------------------
235
+ // Tool definitions
236
+ // ---------------------------------------------------------------------------
237
+ const READ_ONLY_ANNOTATIONS = {
238
+ readOnlyHint: true,
239
+ idempotentHint: true,
240
+ destructiveHint: false,
241
+ openWorldHint: true, // upstream SPARQL endpoint live
242
+ };
243
+ const TOOLS = [
244
+ {
245
+ name: "search_by_celex",
246
+ annotations: READ_ONLY_ANNOTATIONS,
247
+ description: "Znajdz akt prawny UE po numerze CELEX. " +
248
+ "Numer CELEX jest unikalny i identyfikuje akt niezaleznie od jezyka. " +
249
+ "Przyklady: 32016R0679 (RODO), 31995L0046 (uchylony dyrektywa o ochronie danych), " +
250
+ "62022CJ0252 (orzeczenie CJEU). Zwraca tytul w wybranym jezyku + EUR-Lex URL.",
251
+ inputSchema: {
252
+ type: "object",
253
+ properties: {
254
+ celex: {
255
+ type: "string",
256
+ description: "Numer CELEX, np. '32016R0679' (RODO).",
257
+ },
258
+ lang: {
259
+ type: "string",
260
+ description: "ISO 639-3 jezyka tytulu (POL/ENG/FRA/DEU). Domyslnie POL.",
261
+ enum: ["POL", "ENG", "FRA", "DEU"],
262
+ },
263
+ },
264
+ required: ["celex"],
265
+ },
266
+ },
267
+ {
268
+ name: "search_by_date_range",
269
+ annotations: READ_ONLY_ANNOTATIONS,
270
+ description: "Znajdz akty prawne UE z zakresu dat (po dacie dokumentu). " +
271
+ "Opcjonalnie filtruj po typie (REG=rozporzadzenie, DIR=dyrektywa, " +
272
+ "DEC=decyzja, RECO=zalecenie, OPIN=opinia). Maks. 50 wynikow na zapytanie. " +
273
+ "Uzyteczne do przegladu aktow z konkretnego okresu legislacyjnego.",
274
+ inputSchema: {
275
+ type: "object",
276
+ properties: {
277
+ date_from: {
278
+ type: "string",
279
+ description: "Data od (YYYY-MM-DD).",
280
+ },
281
+ date_to: {
282
+ type: "string",
283
+ description: "Data do (YYYY-MM-DD).",
284
+ },
285
+ document_type: {
286
+ type: "string",
287
+ description: "Skrot typu aktu: REG, DIR, DEC, RECO, OPIN. Pomin zeby objac wszystkie.",
288
+ enum: ["REG", "DIR", "DEC", "RECO", "OPIN"],
289
+ },
290
+ lang: {
291
+ type: "string",
292
+ description: "ISO 639-3 jezyka tytulow. Domyslnie POL.",
293
+ enum: ["POL", "ENG", "FRA", "DEU"],
294
+ },
295
+ limit: {
296
+ type: "number",
297
+ description: "Maks. liczba wynikow (1-50). Domyslnie 20.",
298
+ minimum: 1,
299
+ maximum: 50,
300
+ },
301
+ },
302
+ required: ["date_from", "date_to"],
303
+ },
304
+ },
305
+ {
306
+ name: "search_cjeu",
307
+ annotations: READ_ONLY_ANNOTATIONS,
308
+ description: "Wyszukaj orzeczenia Trybunalu Sprawiedliwosci UE (CJEU) - wyroki (JUDG) " +
309
+ "i postanowienia (ORDER). Opcjonalnie zawez do zakresu dat. " +
310
+ "Zwraca CELEX (np. 62022CJ0252), date wydania, tytul (jezyk wg lang) i EUR-Lex URL.",
311
+ inputSchema: {
312
+ type: "object",
313
+ properties: {
314
+ date_from: {
315
+ type: "string",
316
+ description: "Data od (YYYY-MM-DD). Opcjonalna.",
317
+ },
318
+ date_to: {
319
+ type: "string",
320
+ description: "Data do (YYYY-MM-DD). Opcjonalna.",
321
+ },
322
+ lang: {
323
+ type: "string",
324
+ description: "ISO 639-3 jezyka tytulow. Domyslnie POL.",
325
+ enum: ["POL", "ENG", "FRA", "DEU"],
326
+ },
327
+ limit: {
328
+ type: "number",
329
+ description: "Maks. liczba wynikow (1-50). Domyslnie 20.",
330
+ minimum: 1,
331
+ maximum: 50,
332
+ },
333
+ },
334
+ required: [],
335
+ },
336
+ },
337
+ ];
338
+ function errorResult(text, code) {
339
+ return {
340
+ content: [{ type: "text", text: `[${code}] ${text}` }],
341
+ structuredContent: { error_code: code },
342
+ isError: true,
343
+ };
344
+ }
345
+ const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
346
+ const server = new index_js_1.Server({ name: "mcp-eu-sparql", version: "1.1.0" }, { capabilities: { tools: {} }, instructions: INSTRUCTIONS });
347
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
348
+ tools: TOOLS.map((t) => ({
349
+ name: t.name,
350
+ description: t.description,
351
+ inputSchema: t.inputSchema,
352
+ annotations: t.annotations,
353
+ })),
354
+ }));
355
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
356
+ const { name, arguments: args } = request.params;
357
+ const a = (args ?? {});
358
+ const lang = typeof a.lang === "string" ? a.lang : "POL";
359
+ try {
360
+ switch (name) {
361
+ case "search_by_celex": {
362
+ if (!a.celex || typeof a.celex !== "string") {
363
+ return errorResult("parametr 'celex' jest wymagany (string).", "missing_arg");
364
+ }
365
+ const sparql = searchByCelexQuery(a.celex, lang);
366
+ const data = await runSparql(sparql);
367
+ const rows = data.results.bindings;
368
+ const text = formatRows(rows, `Wynik search_by_celex(celex="${a.celex}", lang=${lang}):`);
369
+ return {
370
+ content: [{ type: "text", text }],
371
+ structuredContent: {
372
+ citations: buildCitations(rows, lang),
373
+ },
374
+ };
375
+ }
376
+ case "search_by_date_range": {
377
+ const dateFrom = a.date_from;
378
+ const dateTo = a.date_to;
379
+ if (typeof dateFrom !== "string" || typeof dateTo !== "string") {
380
+ return errorResult("'date_from' i 'date_to' sa wymagane (format YYYY-MM-DD).", "missing_arg");
381
+ }
382
+ if (!DATE_RE.test(dateFrom) || !DATE_RE.test(dateTo)) {
383
+ return errorResult(`daty musza byc w formacie YYYY-MM-DD. Otrzymano: from='${dateFrom}', to='${dateTo}'.`, "invalid_date");
384
+ }
385
+ if (dateTo < dateFrom) {
386
+ return errorResult(`date_to ('${dateTo}') wczesniejsza niz date_from ('${dateFrom}').`, "invalid_date");
387
+ }
388
+ const typeShort = typeof a.document_type === "string" ? a.document_type : null;
389
+ const typeUri = typeShort
390
+ ? (RESOURCE_TYPES[typeShort] ?? null)
391
+ : null;
392
+ const limit = typeof a.limit === "number"
393
+ ? Math.min(50, Math.max(1, Math.floor(a.limit)))
394
+ : 20;
395
+ const sparql = searchByDateRangeQuery(dateFrom, dateTo, typeUri, lang, limit);
396
+ const data = await runSparql(sparql);
397
+ const rows = data.results.bindings;
398
+ const text = formatRows(rows, `Wynik search_by_date_range(${dateFrom}..${dateTo}, type=${typeShort ?? "ALL"}, lang=${lang}):`);
399
+ return {
400
+ content: [{ type: "text", text }],
401
+ structuredContent: {
402
+ citations: buildCitations(rows, lang),
403
+ },
404
+ };
405
+ }
406
+ case "search_cjeu": {
407
+ const dateFrom = typeof a.date_from === "string" ? a.date_from : null;
408
+ const dateTo = typeof a.date_to === "string" ? a.date_to : null;
409
+ const limit = typeof a.limit === "number"
410
+ ? Math.min(50, Math.max(1, Math.floor(a.limit)))
411
+ : 20;
412
+ const sparql = searchCjeuQuery(dateFrom, dateTo, lang, limit);
413
+ const data = await runSparql(sparql);
414
+ const rows = data.results.bindings;
415
+ const text = formatRows(rows, `Wynik search_cjeu(${dateFrom ?? "*"}..${dateTo ?? "*"}, lang=${lang}):`);
416
+ return {
417
+ content: [{ type: "text", text }],
418
+ structuredContent: {
419
+ citations: buildCitations(rows, lang),
420
+ },
421
+ };
422
+ }
423
+ default:
424
+ return errorResult(`Nieznane narzedzie: ${name}`, "missing_arg");
425
+ }
426
+ }
427
+ catch (err) {
428
+ const msg = err instanceof Error ? err.message : String(err);
429
+ return errorResult(`Blad komunikacji z Publications Office SPARQL: ${msg}. Sprobuj ponownie za chwile lub zawez zakres dat / dodaj typ dokumentu.`, "upstream_error");
430
+ }
431
+ });
432
+ // ---------------------------------------------------------------------------
433
+ // Start
434
+ // ---------------------------------------------------------------------------
435
+ async function main() {
436
+ const transport = new stdio_js_1.StdioServerTransport();
437
+ await server.connect(transport);
438
+ process.stderr.write("mcp-eu-sparql server started (stdio transport)\n");
439
+ }
440
+ main().catch((err) => {
441
+ process.stderr.write(`Fatal error: ${err}\n`);
442
+ process.exit(1);
443
+ });
444
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@matematicsolutions/mcp-eu-sparql",
3
+ "version": "1.1.1",
4
+ "description": "MCP server - EU legislation and CJEU case law via Publications Office SPARQL (Cellar / EUR-Lex)",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "start": "node dist/index.js",
9
+ "dev": "tsx src/index.ts",
10
+ "drift": "node test/drift.mjs"
11
+ },
12
+ "keywords": [
13
+ "mcp",
14
+ "eu-law",
15
+ "eur-lex",
16
+ "cellar",
17
+ "sparql",
18
+ "cjeu",
19
+ "legal"
20
+ ],
21
+ "author": "MateMatic / Wieslaw Mazur",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.12.0"
25
+ },
26
+ "devDependencies": {
27
+ "typescript": "^5.4.5",
28
+ "tsx": "^4.19.3",
29
+ "@types/node": "^20.14.0"
30
+ },
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "mcpName": "io.github.matematicsolutions/mcp-eu-sparql",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/matematicsolutions/mcp-eu-sparql.git"
38
+ },
39
+ "bin": {
40
+ "mcp-eu-sparql": "dist/index.js"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "publishConfig": {
46
+ "access": "public",
47
+ "provenance": true
48
+ }
49
+ }