@matematicsolutions/mcp-eu-sparql 1.1.1 → 1.2.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/README.md CHANGED
@@ -1,41 +1,71 @@
1
1
  # mcp-eu-sparql
2
+
3
+ ## Installation (one command)
4
+
5
+ Published on npm + the MCP Registry (`io.github.matematicsolutions/mcp-eu-sparql`). Run without cloning:
6
+
7
+ ```bash
8
+ npx -y @matematicsolutions/mcp-eu-sparql
9
+ ```
10
+
11
+ MCP client configuration (stdio):
12
+
13
+ ```json
14
+ { "mcpServers": { "mcp-eu-sparql": { "command": "npx", "args": ["-y", "@matematicsolutions/mcp-eu-sparql"] } } }
15
+ ```
16
+
17
+ (Building from source - below.)
18
+
2
19
  [![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
20
 
4
- MCP server dla prawa UE i orzecznictwa CJEU przez Publications Office SPARQL
5
- (Cellar / EUR-Lex).
21
+ MCP server for EU law and CJEU case law via the Publications Office SPARQL
22
+ endpoint (Cellar / EUR-Lex), plus national data-protection authority decisions via GDPRhub.
6
23
 
7
- ## Tooly
24
+ CJEU corpus in Cellar (SPARQL COUNT, 2026-07-08): **34,261 judgments (JUDG),
25
+ 8,362 orders (ORDER), 14,480 Advocate-General opinions (OPIN_AG)** -
26
+ 57,103 judgments and opinions in total, each with CELEX + ECLI.
8
27
 
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.
28
+ ## Tools
15
29
 
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)".
30
+ - **`search_by_celex(celex, lang?)`** - act or judgment by CELEX number
31
+ (e.g. `32016R0679` = GDPR, `62018CJ0311` = Schrems II).
32
+ - **`search_by_date_range(date_from, date_to, document_type?, lang?, limit?)`**
33
+ - acts within a date range, optionally narrowed to a type (REG / DIR / DEC / RECO / OPIN).
34
+ - **`search_cjeu(query?, date_from?, date_to?, document_type?, lang?, limit?)`** -
35
+ judgments (JUDG), orders (ORDER) and Advocate-General opinions (OPIN_AG)
36
+ of the Court of Justice of the EU; optional keyword in the title (parties to the case,
37
+ case number, keywords of the judgment).
38
+ - **`search_cjeu_by_ecli(ecli, lang?)`** - CJEU judgment by ECLI
39
+ identifier (e.g. `ECLI:EU:C:2020:559` = Schrems II).
40
+ - **`search_gdprhub(query, limit?)`** - full-text search in
41
+ [GDPRhub](https://gdprhub.eu) (the noyb project wiki): decisions of national
42
+ data-protection authorities across the EU + commentary on GDPR articles. **Content license:
43
+ CC BY-NC-SA 4.0** - flagged in the `license` field of every citation.
44
+
45
+ Every response includes `structuredContent.citations` with the fields `title`, `url`,
46
+ `celex?`, `ecli?`, `publication_date?`, `document_type?`, `snippet?`, `license?` -
47
+ Patron reads this field and renders it in the UI panel as the "EU legal acts (EUR-Lex / CJEU)" section.
19
48
 
20
49
  ## Stack
21
50
 
22
51
  - Node 18+
23
52
  - `@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`
53
+ - Stdio transport (like `mcp-saos`)
54
+ - Backend: HTTP POST to `https://publications.europa.eu/webapi/rdf/sparql`
55
+ with `format=application/sparql-results+json`; GET to `https://gdprhub.eu/api.php`
56
+ (MediaWiki API)
27
57
 
28
- ## Build + uruchomienie
58
+ ## Build + run
29
59
 
30
60
  ```bash
31
61
  npm install
32
62
  npm run build
33
- node dist/index.js # uruchomi serwer na stdio
63
+ node dist/index.js # starts the server on stdio
34
64
  ```
35
65
 
36
- ## Wpięcie do Patrona
66
+ ## Wiring into Patron
37
67
 
38
- W `patron/backend/mcp-servers.json`:
68
+ In `patron/backend/mcp-servers.json`:
39
69
 
40
70
  ```json
41
71
  [
@@ -43,29 +73,26 @@ W `patron/backend/mcp-servers.json`:
43
73
  "name": "saos",
44
74
  "transport": "stdio",
45
75
  "command": "node",
46
- "args": ["C:/Users/<TWOJ-UZYTKOWNIK>/mcp-saos/dist/index.js"]
76
+ "args": ["C:/Users/<YOUR-USER>/mcp-saos/dist/index.js"]
47
77
  },
48
78
  {
49
79
  "name": "eu-sparql",
50
80
  "transport": "stdio",
51
81
  "command": "node",
52
- "args": ["C:/Users/<TWOJ-UZYTKOWNIK>/mcp-eu-sparql/dist/index.js"]
82
+ "args": ["C:/Users/<YOUR-USER>/mcp-eu-sparql/dist/index.js"]
53
83
  }
54
84
  ]
55
85
  ```
56
86
 
57
- ## Smoke test
87
+ ## Tests
58
88
 
59
89
  ```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
90
+ npm run drift # offline: INSTRUCTIONS consistent with TOOLS and ErrorCode
91
+ npm run test:offline # offline: query builders + parsers on fixtures (no network)
92
+ npm run smoke # live: all 5 tools against Cellar + GDPRhub
63
93
  ```
64
94
 
65
- Powinno zwrócić `Rozporzadzenie Parlamentu Europejskiego ...` z polskim tytułem
66
- i URL EUR-Lex.
67
-
68
- ## Licencja
95
+ ## License
69
96
 
70
97
  MIT.
71
98
 
@@ -75,11 +102,11 @@ This server is one of five MCP connectors covering Polish jurisdiction +
75
102
  EU law, used by [Patron](https://github.com/matematicsolutions/patron)
76
103
  (AGPL-3.0) and any other MCP-aware legal AI agent.
77
104
 
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)
105
+ - **mcp-eu-sparql** (this repo) - EU law + CJEU (EUR-Lex / Cellar)
106
+ - [mcp-saos](https://github.com/matematicsolutions/mcp-saos) - common courts, SN, TK, KIO
107
+ - [mcp-nsa](https://github.com/matematicsolutions/mcp-nsa) - NSA + 16 WSA administrative courts
108
+ - [mcp-isap](https://github.com/matematicsolutions/mcp-isap) - Polish legislation (Dz.U. + M.P.)
109
+ - [mcp-krs](https://github.com/matematicsolutions/mcp-krs) - Polish company registry (KRS)
83
110
 
84
111
 
85
112
  All five MCP servers share the same `structuredContent.citations`
@@ -0,0 +1,52 @@
1
+ export interface SparqlBinding {
2
+ [key: string]: {
3
+ type: string;
4
+ value: string;
5
+ } | undefined;
6
+ }
7
+ export interface SparqlResponse {
8
+ head: {
9
+ vars: string[];
10
+ };
11
+ results: {
12
+ bindings: SparqlBinding[];
13
+ };
14
+ }
15
+ export interface EuCitation {
16
+ title: string;
17
+ url: string;
18
+ snippet?: string;
19
+ celex?: string;
20
+ ecli?: string;
21
+ publication_date?: string;
22
+ document_type?: string;
23
+ license?: string;
24
+ }
25
+ export declare function eurLexUrl(celex: string, lang?: string): string;
26
+ export declare function shortTypeFromUri(uri: string): string;
27
+ export declare function buildCitations(rows: SparqlBinding[], lang: string): EuCitation[];
28
+ export declare function formatRows(rows: SparqlBinding[], header: string): string;
29
+ export declare const GDPRHUB_LICENSE = "CC BY-NC-SA 4.0";
30
+ export interface GdprhubSearchResult {
31
+ ns: number;
32
+ title: string;
33
+ pageid: number;
34
+ snippet: string;
35
+ timestamp?: string;
36
+ }
37
+ export interface GdprhubSearchResponse {
38
+ query?: {
39
+ searchinfo?: {
40
+ totalhits?: number;
41
+ };
42
+ search?: GdprhubSearchResult[];
43
+ };
44
+ }
45
+ export declare function gdprhubPageUrl(title: string): string;
46
+ export declare function stripHtml(s: string): string;
47
+ export declare function buildGdprhubCitations(data: GdprhubSearchResponse): {
48
+ citations: EuCitation[];
49
+ totalHits: number;
50
+ };
51
+ export declare function formatGdprhubRows(data: GdprhubSearchResponse, header: string): string;
52
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzB,OAAO,EAAE;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,MAAM,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,wBAAgB,cAAc,CAC1B,IAAI,EAAE,aAAa,EAAE,EACrB,IAAI,EAAE,MAAM,GACb,UAAU,EAAE,CAmBd;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuBxE;AAOD,eAAO,MAAM,eAAe,oBAAoB,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IAClC,KAAK,CAAC,EAAE;QACJ,UAAU,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACpC,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;KAClC,CAAC;CACL;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,qBAAqB,GAC5B;IAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAUhD;AAED,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GACf,MAAM,CAmBR"}
package/dist/format.js ADDED
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ // Parsowanie odpowiedzi + budowanie citations i tekstu dla czlowieka.
3
+ // Czyste funkcje (bez I/O) - testowane offline w test/offline.mjs.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.GDPRHUB_LICENSE = void 0;
6
+ exports.eurLexUrl = eurLexUrl;
7
+ exports.shortTypeFromUri = shortTypeFromUri;
8
+ exports.buildCitations = buildCitations;
9
+ exports.formatRows = formatRows;
10
+ exports.gdprhubPageUrl = gdprhubPageUrl;
11
+ exports.stripHtml = stripHtml;
12
+ exports.buildGdprhubCitations = buildGdprhubCitations;
13
+ exports.formatGdprhubRows = formatGdprhubRows;
14
+ function eurLexUrl(celex, lang = "PL") {
15
+ return `https://eur-lex.europa.eu/legal-content/${lang}/TXT/?uri=CELEX:${encodeURIComponent(celex)}`;
16
+ }
17
+ function shortTypeFromUri(uri) {
18
+ // URI: http://publications.europa.eu/resource/authority/resource-type/REG
19
+ const m = uri.match(/\/resource-type\/([A-Z_]+)$/);
20
+ return m ? m[1] : uri;
21
+ }
22
+ function buildCitations(rows, lang) {
23
+ const out = [];
24
+ for (const row of rows) {
25
+ const celex = row.celex?.value;
26
+ if (!celex)
27
+ continue;
28
+ const title = row.title?.value;
29
+ const date = row.date?.value;
30
+ const typeUri = row.type?.value;
31
+ const ecli = row.ecli?.value;
32
+ out.push({
33
+ title: title ?? celex,
34
+ url: eurLexUrl(celex, lang === "POL" ? "PL" : "EN"),
35
+ ...(date && { publication_date: date }),
36
+ ...(celex && { celex }),
37
+ ...(ecli && { ecli }),
38
+ ...(typeUri && { document_type: shortTypeFromUri(typeUri) }),
39
+ });
40
+ }
41
+ return out;
42
+ }
43
+ function formatRows(rows, header) {
44
+ if (rows.length === 0) {
45
+ return (header +
46
+ "\n\nBrak wynikow. Sprobuj szerszego zakresu dat lub innego CELEX-a.");
47
+ }
48
+ const lines = [header, ""];
49
+ for (const row of rows) {
50
+ const celex = row.celex?.value ?? "brak_celex";
51
+ const date = row.date?.value ?? "?";
52
+ const typeUri = row.type?.value;
53
+ const type = typeUri ? shortTypeFromUri(typeUri) : "?";
54
+ const title = row.title?.value;
55
+ const ecli = row.ecli?.value;
56
+ lines.push(`CELEX: ${celex}`);
57
+ lines.push(` Data : ${date} | Typ: ${type}`);
58
+ if (ecli)
59
+ lines.push(` ECLI : ${ecli}`);
60
+ if (title)
61
+ lines.push(` Tytul: ${title}`);
62
+ lines.push(` URL : ${eurLexUrl(celex)}`);
63
+ lines.push("");
64
+ }
65
+ return lines.join("\n");
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // GDPRhub (MediaWiki API) - agregator decyzji krajowych organow ochrony danych.
69
+ // Tresc na licencji CC BY-NC-SA 4.0 - kazda citation niesie pole license.
70
+ // ---------------------------------------------------------------------------
71
+ exports.GDPRHUB_LICENSE = "CC BY-NC-SA 4.0";
72
+ function gdprhubPageUrl(title) {
73
+ return `https://gdprhub.eu/index.php?title=${encodeURIComponent(title.replace(/ /g, "_"))}`;
74
+ }
75
+ function stripHtml(s) {
76
+ return s.replace(/<[^>]*>/g, "");
77
+ }
78
+ function buildGdprhubCitations(data) {
79
+ const results = data.query?.search ?? [];
80
+ const totalHits = data.query?.searchinfo?.totalhits ?? results.length;
81
+ const citations = results.map((r) => ({
82
+ title: r.title,
83
+ url: gdprhubPageUrl(r.title),
84
+ snippet: stripHtml(r.snippet),
85
+ license: exports.GDPRHUB_LICENSE,
86
+ }));
87
+ return { citations, totalHits };
88
+ }
89
+ function formatGdprhubRows(data, header) {
90
+ const results = data.query?.search ?? [];
91
+ if (results.length === 0) {
92
+ return header + "\n\nBrak wynikow. Sprobuj innego zapytania.";
93
+ }
94
+ const totalHits = data.query?.searchinfo?.totalhits;
95
+ const lines = [header];
96
+ if (typeof totalHits === "number") {
97
+ lines.push(`Trafien lacznie: ${totalHits}`);
98
+ }
99
+ lines.push("");
100
+ for (const r of results) {
101
+ lines.push(`Tytul : ${r.title}`);
102
+ lines.push(` Snippet: ${stripHtml(r.snippet)}`);
103
+ lines.push(` URL : ${gdprhubPageUrl(r.title)}`);
104
+ lines.push(` Licencja tresci: ${exports.GDPRHUB_LICENSE}`);
105
+ lines.push("");
106
+ }
107
+ return lines.join("\n");
108
+ }
109
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,26 +1,34 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
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.
4
+ // (Cellar / EUR-Lex) + GDPRhub (MediaWiki API, decyzje krajowych DPA).
5
+ // Stdio transport - wpinany do Patrona przez mcp-servers.json.
5
6
  //
6
- // Endpoint: https://publications.europa.eu/webapi/rdf/sparql
7
+ // Endpointy:
8
+ // - https://publications.europa.eu/webapi/rdf/sparql (Cellar)
9
+ // - https://gdprhub.eu/api.php (MediaWiki, CC BY-NC-SA 4.0)
7
10
  //
8
11
  // Tooly:
9
- // - search_by_celex - znajdz akt po sygnaturze CELEX
12
+ // - search_by_celex - znajdz akt / orzeczenie po sygnaturze CELEX
10
13
  // - search_by_date_range - akty z zakresu dat (REG/DIR/DEC + opcjonalnie typ)
11
- // - search_cjeu - orzecznictwo CJEU z zakresu dat
14
+ // - search_cjeu - orzecznictwo CJEU (JUDG/ORDER/OPIN_AG, keyword, daty)
15
+ // - search_cjeu_by_ecli - orzeczenie CJEU po identyfikatorze ECLI
16
+ // - search_gdprhub - decyzje krajowych DPA + komentarze RODO (GDPRhub)
12
17
  //
13
18
  // Kazda zwrotka zawiera structuredContent.citations - lista obiektow
14
- // { title, url, snippet?, celex, publication_date?, document_type }.
19
+ // { title, url, snippet?, celex?, ecli?, publication_date?, document_type?, license? }.
15
20
  // Patron czyta to pole automatycznie i wystawia w panelu UI.
16
21
  Object.defineProperty(exports, "__esModule", { value: true });
17
22
  const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
18
23
  const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
19
24
  const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
25
+ const queries_js_1 = require("./queries.js");
26
+ const format_js_1 = require("./format.js");
20
27
  // ---------------------------------------------------------------------------
21
- // SPARQL client
28
+ // HTTP clients
22
29
  // ---------------------------------------------------------------------------
23
30
  const SPARQL_ENDPOINT = "https://publications.europa.eu/webapi/rdf/sparql";
31
+ const GDPRHUB_API = "https://gdprhub.eu/api.php";
24
32
  const HTTP_TIMEOUT_MS = 30000;
25
33
  async function runSparql(query) {
26
34
  const params = new URLSearchParams();
@@ -48,188 +56,77 @@ async function runSparql(query) {
48
56
  clearTimeout(timer);
49
57
  }
50
58
  }
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) }),
59
+ async function runGdprhubSearch(query, limit) {
60
+ const params = new URLSearchParams({
61
+ action: "query",
62
+ list: "search",
63
+ srsearch: query,
64
+ srlimit: String(limit),
65
+ format: "json",
66
+ });
67
+ const controller = new AbortController();
68
+ const timer = setTimeout(() => controller.abort(), HTTP_TIMEOUT_MS + 5000);
69
+ try {
70
+ const res = await fetch(`${GDPRHUB_API}?${params.toString()}`, {
71
+ headers: {
72
+ Accept: "application/json",
73
+ "User-Agent": "mcp-eu-sparql (https://github.com/matematicsolutions/mcp-eu-sparql)",
74
+ },
75
+ signal: controller.signal,
166
76
  });
77
+ if (!res.ok) {
78
+ throw new Error(`GDPRhub API returned HTTP ${res.status} ${res.statusText}`);
79
+ }
80
+ return (await res.json());
167
81
  }
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("");
82
+ finally {
83
+ clearTimeout(timer);
191
84
  }
192
- return lines.join("\n");
193
85
  }
194
86
  // ---------------------------------------------------------------------------
195
87
  // Instructions (procedural orchestration) - wstrzykiwane przez Server.
196
88
  // Drift test (test/drift.mjs) sprawdza spojnosc z TOOLS i ErrorCode.
197
89
  // Pattern z dograh-hq/dograh v1.31.0 (BSD-2) via mcp-eu-compliance v0.2.0.
198
90
  // ---------------------------------------------------------------------------
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.
91
+ const INSTRUCTIONS = `Ten serwer MCP odpytuje oficjalny endpoint SPARQL Publications Office (publications.europa.eu/webapi/rdf/sparql) i graf wiedzy Cellar (ontologia CDM) oraz API MediaWiki GDPRhub (gdprhub.eu). Zwraca akty prawne UE, orzeczenia CJEU (z CELEX i ECLI) oraz decyzje krajowych organow ochrony danych.
200
92
 
201
93
  ## Kolejnosc wywolan
202
94
 
203
- ### Konkretny akt prawny
204
- 1. \`search_by_celex\` - jesli znasz CELEX (np. RODO=32016R0679, AI Act=32024R1689, DORA=32022R2554). Najszybciej i najpewniej.
95
+ ### Konkretny akt prawny lub orzeczenie
96
+ 1. \`search_by_celex\` - jesli znasz CELEX (np. RODO=32016R0679, AI Act=32024R1689, DORA=32022R2554, wyrok Schrems II=62018CJ0311). Najszybciej i najpewniej.
97
+ 2. \`search_cjeu_by_ecli\` - jesli znasz ECLI orzeczenia CJEU (np. ECLI:EU:C:2020:559 = Schrems II). Zwraca CELEX, date, tytul (strony + sygnatura + slowa kluczowe).
205
98
 
206
99
  ### 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.
100
+ 3. \`search_by_date_range\` - akty UE z zakresu dat. Opcjonalnie filtruj typ (REG/DIR/DEC/RECO/OPIN). Maks 50 wynikow.
208
101
 
209
102
  ### 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).
103
+ 4. \`search_cjeu\` - orzeczenia Trybunalu Sprawiedliwosci UE: wyroki (JUDG, 34 tys.), postanowienia (ORDER, 8 tys.), opinie rzecznikow generalnych (OPIN_AG, 14 tys.). Opcjonalny zakres dat, typ dokumentu i \`query\` (keyword w tytule - tytul CJEU zawiera strony, sygnature i slowa kluczowe wyroku). Format CELEX dla CJEU: 6 + rok + kod (CJ=wyrok C, CO=postanowienie, CC=opinia AG) + nr sprawy (np. 62018CJ0311).
104
+
105
+ ### Decyzje krajowych DPA (RODO w praktyce panstw czlonkowskich)
106
+ 5. \`search_gdprhub\` - pelnotekstowe wyszukiwanie w GDPRhub (gdprhub.eu, projekt noyb) - decyzje krajowych organow ochrony danych z calej UE + komentarze do artykulow RODO. UWAGA licencja tresci: CC BY-NC-SA 4.0 (niekomercyjna, share-alike) - kazda citation niesie pole \`license\` - przy wykorzystaniu tresci (nie samego linku) uprzedz uzytkownika o ograniczeniu NC.
211
107
 
212
108
  ## Twarde ograniczenia
213
109
 
214
- - **CELEX kluczowy dla cytowalnosci** - kazda odpowiedz zawiera CELEX w \`structuredContent.citations\`. Bez CELEX brak cytowalnosci.
110
+ - **CELEX/ECLI kluczowe dla cytowalnosci** - odpowiedzi Cellar zawieraja CELEX (i ECLI dla case-law) w \`structuredContent.citations\`. Bez identyfikatora brak cytowalnosci.
215
111
  - **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.
112
+ - **Stateless** - kazde wywolanie idzie do zrodla live. NIE cachuj wynikow (akty konsoliduja sie / status sie zmienia).
113
+ - **Bez scrapingu** - Cellar przez oficjalny SPARQL endpoint, GDPRhub przez oficjalne API MediaWiki.
114
+ - **\`structuredContent.citations\`**: title, url, celex?, ecli?, publication_date?, document_type?, snippet?, license?. Cytuj te citations w odpowiedzi koncowej.
219
115
 
220
116
  ## Iteracja po bledach
221
117
 
222
118
  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.
119
+ - \`missing_arg\` - brakujacy wymagany parametr (celex w search_by_celex; ecli w search_cjeu_by_ecli; query w search_gdprhub; date_from/date_to w search_by_date_range). Przeczytaj inputSchema.
224
120
  - \`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).
121
+ - \`upstream_error\` - blad endpointu (HTTP, timeout, malformed response). Retry raz przed surface do uzytkownika.
122
+ - \`empty_result\` - brak wynikow dla danego CELEX/ECLI/zakresu. Zwery zewnetrznym katalogiem (eur-lex.europa.eu / curia.europa.eu / gdprhub.eu).
227
123
 
228
124
  ## Styl odpowiedzi
229
125
 
230
126
  - 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\`.
127
+ - Dla CJEU: "Wyrok C-311/18 Schrems II (62018CJ0311, ECLI:EU:C:2020:559) z dnia 16.07.2020".
128
+ - Dla GDPRhub: tytul strony + URL + adnotacja o licencji CC BY-NC-SA 4.0.
129
+ - NIE wymyslaj CELEX-ow, ECLI ani dat - wszystko z \`structuredContent.citations\`.
233
130
  - Disclaimer wielojezycznosci: jesli zwracasz angielskie tytuly dla aktow ktore powinny miec PL, oznacz to.`;
234
131
  // ---------------------------------------------------------------------------
235
132
  // Tool definitions
@@ -238,16 +135,16 @@ const READ_ONLY_ANNOTATIONS = {
238
135
  readOnlyHint: true,
239
136
  idempotentHint: true,
240
137
  destructiveHint: false,
241
- openWorldHint: true, // upstream SPARQL endpoint live
138
+ openWorldHint: true, // upstream endpoints live
242
139
  };
243
140
  const TOOLS = [
244
141
  {
245
142
  name: "search_by_celex",
246
143
  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.",
144
+ description: "Znajdz akt prawny UE lub orzeczenie CJEU po numerze CELEX. " +
145
+ "Numer CELEX jest unikalny i identyfikuje dokument niezaleznie od jezyka. " +
146
+ "Przyklady: 32016R0679 (RODO), 31995L0046 (uchylona dyrektywa o ochronie danych), " +
147
+ "62018CJ0311 (wyrok Schrems II). Zwraca tytul w wybranym jezyku, ECLI (dla case-law) i EUR-Lex URL.",
251
148
  inputSchema: {
252
149
  type: "object",
253
150
  properties: {
@@ -305,12 +202,18 @@ const TOOLS = [
305
202
  {
306
203
  name: "search_cjeu",
307
204
  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.",
205
+ description: "Wyszukaj orzecznictwo Trybunalu Sprawiedliwosci UE (CJEU): wyroki (JUDG), " +
206
+ "postanowienia (ORDER) i opinie rzecznikow generalnych (OPIN_AG). " +
207
+ "Opcjonalnie zawez do zakresu dat, typu dokumentu i keyworda w tytule " +
208
+ "(tytul CJEU zawiera strony sprawy, sygnature i slowa kluczowe wyroku). " +
209
+ "Zwraca CELEX (np. 62018CJ0311), ECLI, date wydania, tytul (jezyk wg lang) i EUR-Lex URL.",
311
210
  inputSchema: {
312
211
  type: "object",
313
212
  properties: {
213
+ query: {
214
+ type: "string",
215
+ description: "Keyword wyszukiwany w tytule orzeczenia (case-insensitive), np. 'personal data' albo 'Schrems'. Opcjonalny.",
216
+ },
314
217
  date_from: {
315
218
  type: "string",
316
219
  description: "Data od (YYYY-MM-DD). Opcjonalna.",
@@ -319,6 +222,11 @@ const TOOLS = [
319
222
  type: "string",
320
223
  description: "Data do (YYYY-MM-DD). Opcjonalna.",
321
224
  },
225
+ document_type: {
226
+ type: "string",
227
+ description: "Typ dokumentu: JUDG=wyrok, ORDER=postanowienie, OPIN_AG=opinia rzecznika generalnego. Pomin zeby objac wszystkie trzy.",
228
+ enum: ["JUDG", "ORDER", "OPIN_AG"],
229
+ },
322
230
  lang: {
323
231
  type: "string",
324
232
  description: "ISO 639-3 jezyka tytulow. Domyslnie POL.",
@@ -334,6 +242,52 @@ const TOOLS = [
334
242
  required: [],
335
243
  },
336
244
  },
245
+ {
246
+ name: "search_cjeu_by_ecli",
247
+ annotations: READ_ONLY_ANNOTATIONS,
248
+ description: "Znajdz orzeczenie CJEU po identyfikatorze ECLI (European Case Law Identifier), " +
249
+ "np. 'ECLI:EU:C:2020:559' (Schrems II). Zwraca CELEX, date wydania, tytul " +
250
+ "(strony + sygnatura + slowa kluczowe) i EUR-Lex URL.",
251
+ inputSchema: {
252
+ type: "object",
253
+ properties: {
254
+ ecli: {
255
+ type: "string",
256
+ description: "Identyfikator ECLI orzeczenia CJEU, np. 'ECLI:EU:C:2020:559'.",
257
+ },
258
+ lang: {
259
+ type: "string",
260
+ description: "ISO 639-3 jezyka tytulu. Domyslnie POL.",
261
+ enum: ["POL", "ENG", "FRA", "DEU"],
262
+ },
263
+ },
264
+ required: ["ecli"],
265
+ },
266
+ },
267
+ {
268
+ name: "search_gdprhub",
269
+ annotations: READ_ONLY_ANNOTATIONS,
270
+ description: "Pelnotekstowe wyszukiwanie w GDPRhub (gdprhub.eu) - wiki projektu noyb " +
271
+ "agregujaca decyzje krajowych organow ochrony danych (DPA) z calej UE " +
272
+ "oraz komentarze do artykulow RODO. Zwraca tytul, snippet i URL strony. " +
273
+ "Licencja tresci: CC BY-NC-SA 4.0 (pole license w kazdej citation).",
274
+ inputSchema: {
275
+ type: "object",
276
+ properties: {
277
+ query: {
278
+ type: "string",
279
+ description: "Zapytanie pelnotekstowe, np. 'Schrems', 'UODO fine', 'Article 33 notification'.",
280
+ },
281
+ limit: {
282
+ type: "number",
283
+ description: "Maks. liczba wynikow (1-50). Domyslnie 10.",
284
+ minimum: 1,
285
+ maximum: 50,
286
+ },
287
+ },
288
+ required: ["query"],
289
+ },
290
+ },
337
291
  ];
338
292
  function errorResult(text, code) {
339
293
  return {
@@ -343,7 +297,7 @@ function errorResult(text, code) {
343
297
  };
344
298
  }
345
299
  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 });
300
+ const server = new index_js_1.Server({ name: "mcp-eu-sparql", version: "1.2.0" }, { capabilities: { tools: {} }, instructions: INSTRUCTIONS });
347
301
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
348
302
  tools: TOOLS.map((t) => ({
349
303
  name: t.name,
@@ -362,14 +316,14 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
362
316
  if (!a.celex || typeof a.celex !== "string") {
363
317
  return errorResult("parametr 'celex' jest wymagany (string).", "missing_arg");
364
318
  }
365
- const sparql = searchByCelexQuery(a.celex, lang);
319
+ const sparql = (0, queries_js_1.searchByCelexQuery)(a.celex, lang);
366
320
  const data = await runSparql(sparql);
367
321
  const rows = data.results.bindings;
368
- const text = formatRows(rows, `Wynik search_by_celex(celex="${a.celex}", lang=${lang}):`);
322
+ const text = (0, format_js_1.formatRows)(rows, `Wynik search_by_celex(celex="${a.celex}", lang=${lang}):`);
369
323
  return {
370
324
  content: [{ type: "text", text }],
371
325
  structuredContent: {
372
- citations: buildCitations(rows, lang),
326
+ citations: (0, format_js_1.buildCitations)(rows, lang),
373
327
  },
374
328
  };
375
329
  }
@@ -387,46 +341,93 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
387
341
  }
388
342
  const typeShort = typeof a.document_type === "string" ? a.document_type : null;
389
343
  const typeUri = typeShort
390
- ? (RESOURCE_TYPES[typeShort] ?? null)
344
+ ? (queries_js_1.RESOURCE_TYPES[typeShort] ?? null)
391
345
  : null;
392
346
  const limit = typeof a.limit === "number"
393
347
  ? Math.min(50, Math.max(1, Math.floor(a.limit)))
394
348
  : 20;
395
- const sparql = searchByDateRangeQuery(dateFrom, dateTo, typeUri, lang, limit);
349
+ const sparql = (0, queries_js_1.searchByDateRangeQuery)(dateFrom, dateTo, typeUri, lang, limit);
396
350
  const data = await runSparql(sparql);
397
351
  const rows = data.results.bindings;
398
- const text = formatRows(rows, `Wynik search_by_date_range(${dateFrom}..${dateTo}, type=${typeShort ?? "ALL"}, lang=${lang}):`);
352
+ const text = (0, format_js_1.formatRows)(rows, `Wynik search_by_date_range(${dateFrom}..${dateTo}, type=${typeShort ?? "ALL"}, lang=${lang}):`);
399
353
  return {
400
354
  content: [{ type: "text", text }],
401
355
  structuredContent: {
402
- citations: buildCitations(rows, lang),
356
+ citations: (0, format_js_1.buildCitations)(rows, lang),
403
357
  },
404
358
  };
405
359
  }
406
360
  case "search_cjeu": {
407
361
  const dateFrom = typeof a.date_from === "string" ? a.date_from : null;
408
362
  const dateTo = typeof a.date_to === "string" ? a.date_to : null;
363
+ if ((dateFrom && !DATE_RE.test(dateFrom)) ||
364
+ (dateTo && !DATE_RE.test(dateTo))) {
365
+ return errorResult(`daty musza byc w formacie YYYY-MM-DD. Otrzymano: from='${dateFrom}', to='${dateTo}'.`, "invalid_date");
366
+ }
367
+ if (dateFrom && dateTo && dateTo < dateFrom) {
368
+ return errorResult(`date_to ('${dateTo}') wczesniejsza niz date_from ('${dateFrom}').`, "invalid_date");
369
+ }
370
+ const docType = typeof a.document_type === "string" &&
371
+ ["JUDG", "ORDER", "OPIN_AG"].includes(a.document_type)
372
+ ? a.document_type
373
+ : null;
374
+ const keyword = typeof a.query === "string" && a.query.trim().length > 0
375
+ ? a.query.trim()
376
+ : null;
409
377
  const limit = typeof a.limit === "number"
410
378
  ? Math.min(50, Math.max(1, Math.floor(a.limit)))
411
379
  : 20;
412
- const sparql = searchCjeuQuery(dateFrom, dateTo, lang, limit);
380
+ const sparql = (0, queries_js_1.searchCjeuQuery)(dateFrom, dateTo, docType, keyword, lang, limit);
413
381
  const data = await runSparql(sparql);
414
382
  const rows = data.results.bindings;
415
- const text = formatRows(rows, `Wynik search_cjeu(${dateFrom ?? "*"}..${dateTo ?? "*"}, lang=${lang}):`);
383
+ const text = (0, format_js_1.formatRows)(rows, `Wynik search_cjeu(${dateFrom ?? "*"}..${dateTo ?? "*"}, type=${docType ?? "ALL"}, query=${keyword ?? "-"}, lang=${lang}):`);
416
384
  return {
417
385
  content: [{ type: "text", text }],
418
386
  structuredContent: {
419
- citations: buildCitations(rows, lang),
387
+ citations: (0, format_js_1.buildCitations)(rows, lang),
420
388
  },
421
389
  };
422
390
  }
391
+ case "search_cjeu_by_ecli": {
392
+ if (!a.ecli || typeof a.ecli !== "string") {
393
+ return errorResult("parametr 'ecli' jest wymagany (string), np. 'ECLI:EU:C:2020:559'.", "missing_arg");
394
+ }
395
+ const sparql = (0, queries_js_1.searchCjeuByEcliQuery)(a.ecli, lang);
396
+ const data = await runSparql(sparql);
397
+ const rows = data.results.bindings;
398
+ if (rows.length === 0) {
399
+ return errorResult(`brak orzeczenia CJEU o ECLI '${a.ecli}'. Sprawdz format (ECLI:EU:C:YYYY:NNN) lub zweryfikuj na curia.europa.eu.`, "empty_result");
400
+ }
401
+ const text = (0, format_js_1.formatRows)(rows, `Wynik search_cjeu_by_ecli(ecli="${a.ecli}", lang=${lang}):`);
402
+ return {
403
+ content: [{ type: "text", text }],
404
+ structuredContent: {
405
+ citations: (0, format_js_1.buildCitations)(rows, lang),
406
+ },
407
+ };
408
+ }
409
+ case "search_gdprhub": {
410
+ if (!a.query || typeof a.query !== "string") {
411
+ return errorResult("parametr 'query' jest wymagany (string).", "missing_arg");
412
+ }
413
+ const limit = typeof a.limit === "number"
414
+ ? Math.min(50, Math.max(1, Math.floor(a.limit)))
415
+ : 10;
416
+ const data = await runGdprhubSearch(a.query, limit);
417
+ const { citations } = (0, format_js_1.buildGdprhubCitations)(data);
418
+ const text = (0, format_js_1.formatGdprhubRows)(data, `Wynik search_gdprhub(query="${a.query}", limit=${limit}):`);
419
+ return {
420
+ content: [{ type: "text", text }],
421
+ structuredContent: { citations },
422
+ };
423
+ }
423
424
  default:
424
425
  return errorResult(`Nieznane narzedzie: ${name}`, "missing_arg");
425
426
  }
426
427
  }
427
428
  catch (err) {
428
429
  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
+ return errorResult(`Blad komunikacji ze zrodlem upstream: ${msg}. Sprobuj ponownie za chwile lub zawez zakres dat / dodaj typ dokumentu.`, "upstream_error");
430
431
  }
431
432
  });
432
433
  // ---------------------------------------------------------------------------
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const PREFIXES = "\nPREFIX cdm: <http://publications.europa.eu/ontology/cdm#>\nPREFIX dc: <http://purl.org/dc/elements/1.1/>\nPREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n";
2
+ export declare const RESOURCE_TYPES: Record<string, string>;
3
+ export declare const CJEU_TYPES: readonly ["JUDG", "ORDER", "OPIN_AG"];
4
+ export declare function sparqlEscape(value: string): string;
5
+ export declare function searchByCelexQuery(celex: string, lang: string): string;
6
+ export declare function searchByDateRangeQuery(dateFrom: string, dateTo: string, typeUri: string | null, lang: string, limit: number): string;
7
+ export declare function searchCjeuQuery(dateFrom: string | null, dateTo: string | null, documentType: string | null, keyword: string | null, lang: string, limit: number): string;
8
+ export declare function searchCjeuByEcliQuery(ecli: string, lang: string): string;
9
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,mKAIpB,CAAC;AAKF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUjD,CAAC;AAGF,eAAO,MAAM,UAAU,uCAAwC,CAAC;AAEhE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBtE;AAED,wBAAgB,sBAAsB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACd,MAAM,CA0BR;AAED,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACd,MAAM,CAuCR;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBxE"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ // SPARQL query builders - Publications Office Cellar (ontologia CDM).
3
+ // Czyste funkcje (bez I/O) - testowane offline w test/offline.mjs.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.CJEU_TYPES = exports.RESOURCE_TYPES = exports.PREFIXES = void 0;
6
+ exports.sparqlEscape = sparqlEscape;
7
+ exports.searchByCelexQuery = searchByCelexQuery;
8
+ exports.searchByDateRangeQuery = searchByDateRangeQuery;
9
+ exports.searchCjeuQuery = searchCjeuQuery;
10
+ exports.searchCjeuByEcliQuery = searchCjeuByEcliQuery;
11
+ exports.PREFIXES = `
12
+ PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
13
+ PREFIX dc: <http://purl.org/dc/elements/1.1/>
14
+ PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
15
+ `;
16
+ // Mapowanie typu aktu (skrot uzytkownika) -> URI Resource-Type.
17
+ // UWAGA feature-002: postanowienia CJEU maja w Cellar typ .../ORDER (8 362 works),
18
+ // NIE .../ORDER_CJ (0 works) - stary URI byl cichym no-opem (zero wynikow, zero bledu).
19
+ exports.RESOURCE_TYPES = {
20
+ REG: "http://publications.europa.eu/resource/authority/resource-type/REG",
21
+ DIR: "http://publications.europa.eu/resource/authority/resource-type/DIR",
22
+ DEC: "http://publications.europa.eu/resource/authority/resource-type/DEC",
23
+ RECO: "http://publications.europa.eu/resource/authority/resource-type/RECO",
24
+ OPIN: "http://publications.europa.eu/resource/authority/resource-type/OPIN",
25
+ JUDG: "http://publications.europa.eu/resource/authority/resource-type/JUDG",
26
+ ORDER: "http://publications.europa.eu/resource/authority/resource-type/ORDER",
27
+ OPIN_AG: "http://publications.europa.eu/resource/authority/resource-type/OPIN_AG",
28
+ };
29
+ // Typy case-law CJEU dostepne w search_cjeu (wyrok / postanowienie / opinia AG).
30
+ exports.CJEU_TYPES = ["JUDG", "ORDER", "OPIN_AG"];
31
+ function sparqlEscape(value) {
32
+ // Eskapuj cudzyslowy w SPARQL - tylko " i \ wymagaja escape'u.
33
+ return value.replace(/["\\]/g, "\\$&");
34
+ }
35
+ function searchByCelexQuery(celex, lang) {
36
+ const safeCelex = sparqlEscape(celex);
37
+ const safeLang = sparqlEscape(lang);
38
+ return `${exports.PREFIXES}
39
+ SELECT DISTINCT ?work ?celex ?ecli ?date ?type ?title
40
+ WHERE {
41
+ ?work cdm:resource_legal_id_celex ?celex .
42
+ FILTER(STR(?celex) = "${safeCelex}")
43
+ OPTIONAL { ?work cdm:case-law_ecli ?ecli }
44
+ OPTIONAL { ?work cdm:work_date_document ?date }
45
+ OPTIONAL { ?work cdm:work_has_resource-type ?type }
46
+ OPTIONAL {
47
+ ?expr cdm:expression_belongs_to_work ?work ;
48
+ cdm:expression_uses_language ?lang ;
49
+ cdm:expression_title ?title .
50
+ ?lang dc:identifier "${safeLang}" .
51
+ }
52
+ }
53
+ LIMIT 1
54
+ `;
55
+ }
56
+ function searchByDateRangeQuery(dateFrom, dateTo, typeUri, lang, limit) {
57
+ const safeFrom = sparqlEscape(dateFrom);
58
+ const safeTo = sparqlEscape(dateTo);
59
+ const safeLang = sparqlEscape(lang);
60
+ const typeFilter = typeUri
61
+ ? `?work cdm:work_has_resource-type <${typeUri}> .`
62
+ : "";
63
+ return `${exports.PREFIXES}
64
+ SELECT DISTINCT ?work ?celex ?date ?type ?title
65
+ WHERE {
66
+ ${typeFilter}
67
+ ?work cdm:work_date_document ?date .
68
+ OPTIONAL { ?work cdm:resource_legal_id_celex ?celex }
69
+ OPTIONAL { ?work cdm:work_has_resource-type ?type }
70
+ OPTIONAL {
71
+ ?expr cdm:expression_belongs_to_work ?work ;
72
+ cdm:expression_uses_language ?lang ;
73
+ cdm:expression_title ?title .
74
+ ?lang dc:identifier "${safeLang}" .
75
+ }
76
+ FILTER (?date >= "${safeFrom}"^^xsd:date && ?date <= "${safeTo}"^^xsd:date)
77
+ FILTER NOT EXISTS { ?work cdm:do_not_index "true"^^xsd:boolean }
78
+ }
79
+ ORDER BY DESC(?date)
80
+ LIMIT ${limit}
81
+ `;
82
+ }
83
+ function searchCjeuQuery(dateFrom, dateTo, documentType, keyword, lang, limit) {
84
+ const safeLang = sparqlEscape(lang);
85
+ const dateFilter = dateFrom && dateTo
86
+ ? `FILTER (?date >= "${sparqlEscape(dateFrom)}"^^xsd:date && ?date <= "${sparqlEscape(dateTo)}"^^xsd:date)`
87
+ : "";
88
+ // Bez document_type: wszystkie 3 typy case-law (JUDG + ORDER + OPIN_AG).
89
+ const typeUris = (documentType ? [documentType] : [...exports.CJEU_TYPES])
90
+ .map((t) => `<${exports.RESOURCE_TYPES[t]}>`)
91
+ .join(", ");
92
+ // Keyword przeszukuje tytul ekspresji (tytul CJEU zawiera strony, sygnature
93
+ // sprawy i slowa kluczowe wyroku) - tytul przestaje byc OPTIONAL.
94
+ const titleBlock = keyword
95
+ ? `?expr cdm:expression_belongs_to_work ?work ;
96
+ cdm:expression_uses_language ?lang ;
97
+ cdm:expression_title ?title .
98
+ ?lang dc:identifier "${safeLang}" .
99
+ FILTER(CONTAINS(LCASE(STR(?title)), "${sparqlEscape(keyword.toLowerCase())}"))`
100
+ : `OPTIONAL {
101
+ ?expr cdm:expression_belongs_to_work ?work ;
102
+ cdm:expression_uses_language ?lang ;
103
+ cdm:expression_title ?title .
104
+ ?lang dc:identifier "${safeLang}" .
105
+ }`;
106
+ return `${exports.PREFIXES}
107
+ SELECT DISTINCT ?work ?celex ?ecli ?date ?type ?title
108
+ WHERE {
109
+ ?work cdm:work_has_resource-type ?type .
110
+ FILTER(?type IN (${typeUris}))
111
+ ?work cdm:work_date_document ?date .
112
+ OPTIONAL { ?work cdm:resource_legal_id_celex ?celex }
113
+ OPTIONAL { ?work cdm:case-law_ecli ?ecli }
114
+ ${titleBlock}
115
+ ${dateFilter}
116
+ FILTER NOT EXISTS { ?work cdm:do_not_index "true"^^xsd:boolean }
117
+ }
118
+ ORDER BY DESC(?date)
119
+ LIMIT ${limit}
120
+ `;
121
+ }
122
+ function searchCjeuByEcliQuery(ecli, lang) {
123
+ // ECLI w Cellar to literal typu xsd:string - rowanie przez STR(),
124
+ // golym literalem "..." nie zmatchuje (zweryfikowane live 2026-07-08).
125
+ const safeEcli = sparqlEscape(ecli);
126
+ const safeLang = sparqlEscape(lang);
127
+ const typeUris = exports.CJEU_TYPES.map((t) => `<${exports.RESOURCE_TYPES[t]}>`).join(", ");
128
+ return `${exports.PREFIXES}
129
+ SELECT DISTINCT ?work ?celex ?ecli ?date ?type ?title
130
+ WHERE {
131
+ ?work cdm:case-law_ecli ?ecli .
132
+ FILTER(STR(?ecli) = "${safeEcli}")
133
+ ?work cdm:work_has_resource-type ?type .
134
+ FILTER(?type IN (${typeUris}))
135
+ OPTIONAL { ?work cdm:resource_legal_id_celex ?celex }
136
+ OPTIONAL { ?work cdm:work_date_document ?date }
137
+ OPTIONAL {
138
+ ?expr cdm:expression_belongs_to_work ?work ;
139
+ cdm:expression_uses_language ?lang ;
140
+ cdm:expression_title ?title .
141
+ ?lang dc:identifier "${safeLang}" .
142
+ }
143
+ }
144
+ LIMIT 5
145
+ `;
146
+ }
147
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@matematicsolutions/mcp-eu-sparql",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "MCP server - EU legislation and CJEU case law via Publications Office SPARQL (Cellar / EUR-Lex)",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
7
7
  "build": "tsc",
8
+ "prepare": "tsc",
8
9
  "start": "node dist/index.js",
9
10
  "dev": "tsx src/index.ts",
10
- "drift": "node test/drift.mjs"
11
+ "drift": "node test/drift.mjs",
12
+ "test:offline": "node test/offline.mjs",
13
+ "smoke": "node test/smoke.mjs",
14
+ "test": "npm run drift && npm run test:offline"
11
15
  },
12
16
  "keywords": [
13
17
  "mcp",
@@ -16,7 +20,10 @@
16
20
  "cellar",
17
21
  "sparql",
18
22
  "cjeu",
19
- "legal"
23
+ "legal",
24
+ "gdpr",
25
+ "ecli",
26
+ "case-law"
20
27
  ],
21
28
  "author": "MateMatic / Wieslaw Mazur",
22
29
  "license": "MIT",