@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 +21 -0
- package/README.md +90 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +444 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
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
|
+
[](https://modelcontextprotocol.io) [](./LICENSE) [](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.
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|