@cyanheads/eur-lex-mcp-server 0.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/AGENTS.md +383 -0
- package/CLAUDE.md +383 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +343 -0
- package/changelog/0.1.x/0.1.1.md +31 -0
- package/changelog/template.md +127 -0
- package/dist/config/server-config.d.ts +16 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +43 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.d.ts +10 -0
- package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.js +60 -0
- package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts +9 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.js +7 -0
- package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.js +91 -0
- package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/eurlex-document.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/eurlex-document.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/eurlex-document.resource.js +61 -0
- package/dist/mcp-server/resources/definitions/eurlex-document.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +8 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +11 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.d.ts +25 -0
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.js +121 -0
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.d.ts +44 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.js +189 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.js +222 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.d.ts +38 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.js +203 -0
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.d.ts +32 -0
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.js +152 -0
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.d.ts +25 -0
- package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.js +104 -0
- package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.d.ts +47 -0
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.js +203 -0
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +207 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +21 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/services/cellar-sparql/cellar-sparql-service.d.ts +27 -0
- package/dist/services/cellar-sparql/cellar-sparql-service.d.ts.map +1 -0
- package/dist/services/cellar-sparql/cellar-sparql-service.js +123 -0
- package/dist/services/cellar-sparql/cellar-sparql-service.js.map +1 -0
- package/dist/services/cellar-sparql/types.d.ts +62 -0
- package/dist/services/cellar-sparql/types.d.ts.map +1 -0
- package/dist/services/cellar-sparql/types.js +6 -0
- package/dist/services/cellar-sparql/types.js.map +1 -0
- package/dist/services/eurlex-content/eurlex-content-service.d.ts +45 -0
- package/dist/services/eurlex-content/eurlex-content-service.d.ts.map +1 -0
- package/dist/services/eurlex-content/eurlex-content-service.js +93 -0
- package/dist/services/eurlex-content/eurlex-content-service.js.map +1 -0
- package/package.json +105 -0
- package/server.json +161 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-get-document.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-document.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview eurlex_get_relations — Traverse the CELLAR CDM relationship graph for a work.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurlex-get-relations
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const eurlex_get_relations: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
celex_number: z.ZodString;
|
|
9
|
+
work_uri: z.ZodOptional<z.ZodString>;
|
|
10
|
+
relation_types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
11
|
+
cites: "cites";
|
|
12
|
+
amends: "amends";
|
|
13
|
+
amended_by: "amended_by";
|
|
14
|
+
legal_basis: "legal_basis";
|
|
15
|
+
consolidated_version: "consolidated_version";
|
|
16
|
+
}>>>;
|
|
17
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
18
|
+
celex_number: z.ZodString;
|
|
19
|
+
work_uri: z.ZodOptional<z.ZodString>;
|
|
20
|
+
relations: z.ZodArray<z.ZodObject<{
|
|
21
|
+
relation_type: z.ZodString;
|
|
22
|
+
direction: z.ZodString;
|
|
23
|
+
related_work_uri: z.ZodString;
|
|
24
|
+
related_celex_number: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
total: z.ZodNumber;
|
|
27
|
+
}, z.core.$strip>, readonly [{
|
|
28
|
+
readonly reason: "not_found";
|
|
29
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
30
|
+
readonly when: "CELEX/work URI not found in CELLAR — resolve the identifier with eurlex_lookup_celex first.";
|
|
31
|
+
readonly recovery: "Use eurlex_lookup_celex to confirm the CELEX number exists, then retry.";
|
|
32
|
+
}, {
|
|
33
|
+
readonly reason: "no_relations";
|
|
34
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
35
|
+
readonly when: "Work exists but has no CDM relations of the requested types.";
|
|
36
|
+
readonly recovery: "Try other relation_types or omit the filter to fetch all available relation types.";
|
|
37
|
+
}], undefined>;
|
|
38
|
+
//# sourceMappingURL=eurlex-get-relations.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-get-relations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-relations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA2BjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuN/B,CAAC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview eurlex_get_relations — Traverse the CELLAR CDM relationship graph for a work.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurlex-get-relations
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { CellarSparqlService, getCellarSparqlService, } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
8
|
+
/** CDM relation predicates traversed by this tool. */
|
|
9
|
+
const CDM_RELATIONS = {
|
|
10
|
+
cites: 'cdm:work_cites_work',
|
|
11
|
+
amends: 'cdm:resource_legal_amends_resource_legal',
|
|
12
|
+
amended_by: 'cdm:resource_legal_amended_by_resource_legal',
|
|
13
|
+
legal_basis: 'cdm:resource_legal_based_on_resource_legal',
|
|
14
|
+
consolidated_version: 'cdm:resource_legal_has_consolidated_version',
|
|
15
|
+
};
|
|
16
|
+
/** Map predicate URI to human-readable relation type name. */
|
|
17
|
+
const PREDICATE_TO_TYPE = {
|
|
18
|
+
'http://publications.europa.eu/ontology/cdm#work_cites_work': 'cites',
|
|
19
|
+
'http://publications.europa.eu/ontology/cdm#resource_legal_amends_resource_legal': 'amends',
|
|
20
|
+
'http://publications.europa.eu/ontology/cdm#resource_legal_amended_by_resource_legal': 'amended_by',
|
|
21
|
+
'http://publications.europa.eu/ontology/cdm#resource_legal_based_on_resource_legal': 'legal_basis',
|
|
22
|
+
'http://publications.europa.eu/ontology/cdm#resource_legal_has_consolidated_version': 'consolidated_version',
|
|
23
|
+
};
|
|
24
|
+
export const eurlex_get_relations = tool('eurlex_get_relations', {
|
|
25
|
+
title: 'Get CELLAR Relationship Graph',
|
|
26
|
+
description: 'Traverse the CELLAR CDM relationship graph for an EU work: ' +
|
|
27
|
+
'what it amends, what amends it, its current consolidated version, its legal basis, and works that cite it. ' +
|
|
28
|
+
"This is CELLAR's primary value over HTML scraping — the graph traversal that exposes the lifecycle and dependencies of an EU act. " +
|
|
29
|
+
'Returns one-hop direct relations only. For deeper traversal, use eurlex_query_sparql. ' +
|
|
30
|
+
'The "consolidated_version" relation links to the current consolidated text (a separate CELEX-numbered work); ' +
|
|
31
|
+
'fetch that work with eurlex_get_document. ' +
|
|
32
|
+
'Requires a valid CELEX number or CELLAR work URI — use eurlex_lookup_celex to resolve identifiers first.',
|
|
33
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
34
|
+
input: z.object({
|
|
35
|
+
celex_number: z
|
|
36
|
+
.string()
|
|
37
|
+
.min(1)
|
|
38
|
+
.describe('CELEX number of the work to traverse (e.g. 32016R0679). Preferred identifier.'),
|
|
39
|
+
work_uri: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe('CELLAR work URI as alternative to celex_number. Used if celex_number resolves to no work.'),
|
|
43
|
+
relation_types: z
|
|
44
|
+
.array(z.enum(['cites', 'amends', 'amended_by', 'legal_basis', 'consolidated_version']))
|
|
45
|
+
.optional()
|
|
46
|
+
.describe('Subset of relation types to return. Omit to return all types: ' +
|
|
47
|
+
'cites (citation graph), amends (what this work amends), amended_by (what amends this work), ' +
|
|
48
|
+
'legal_basis (treaty/treaty article this act is based on), consolidated_version (current consolidated text).'),
|
|
49
|
+
}),
|
|
50
|
+
output: z.object({
|
|
51
|
+
celex_number: z
|
|
52
|
+
.string()
|
|
53
|
+
.describe('CELEX number of the source work whose relations were traversed.'),
|
|
54
|
+
work_uri: z
|
|
55
|
+
.string()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('CELLAR URI of the source work (resolved from the CELEX number).'),
|
|
58
|
+
relations: z
|
|
59
|
+
.array(z
|
|
60
|
+
.object({
|
|
61
|
+
relation_type: z
|
|
62
|
+
.string()
|
|
63
|
+
.describe('Type of relation: cites, amends, amended_by, legal_basis, consolidated_version.'),
|
|
64
|
+
direction: z
|
|
65
|
+
.string()
|
|
66
|
+
.describe('Direction: "outgoing" (this work → related) or "incoming" (related → this work).'),
|
|
67
|
+
related_work_uri: z.string().describe('CELLAR URI of the related work.'),
|
|
68
|
+
related_celex_number: z
|
|
69
|
+
.string()
|
|
70
|
+
.optional()
|
|
71
|
+
.describe('CELEX number of the related work, if available.'),
|
|
72
|
+
})
|
|
73
|
+
.describe('A single CDM relation between the source work and a related work.'))
|
|
74
|
+
.describe('Direct CDM relations for the requested work.'),
|
|
75
|
+
total: z.number().describe('Total number of direct CDM relations returned.'),
|
|
76
|
+
}),
|
|
77
|
+
errors: [
|
|
78
|
+
{
|
|
79
|
+
reason: 'not_found',
|
|
80
|
+
code: JsonRpcErrorCode.NotFound,
|
|
81
|
+
when: 'CELEX/work URI not found in CELLAR — resolve the identifier with eurlex_lookup_celex first.',
|
|
82
|
+
recovery: 'Use eurlex_lookup_celex to confirm the CELEX number exists, then retry.',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
reason: 'no_relations',
|
|
86
|
+
code: JsonRpcErrorCode.NotFound,
|
|
87
|
+
when: 'Work exists but has no CDM relations of the requested types.',
|
|
88
|
+
recovery: 'Try other relation_types or omit the filter to fetch all available relation types.',
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
async handler(input, ctx) {
|
|
92
|
+
const svc = getCellarSparqlService();
|
|
93
|
+
const celexNumber = input.celex_number.trim();
|
|
94
|
+
const safeCelexNumber = celexNumber.replace(/"/g, '\\"');
|
|
95
|
+
// Step 1: Resolve CELEX to work URI
|
|
96
|
+
const resolveSparql = `
|
|
97
|
+
SELECT ?work WHERE {
|
|
98
|
+
?work cdm:resource_legal_id_celex ?celex .
|
|
99
|
+
FILTER(STR(?celex) = "${safeCelexNumber}")
|
|
100
|
+
} LIMIT 1`;
|
|
101
|
+
const resolveBindings = await svc.query(resolveSparql, ctx);
|
|
102
|
+
if (resolveBindings.length === 0) {
|
|
103
|
+
throw ctx.fail('not_found', `No CELLAR work found for CELEX: ${celexNumber}`, {
|
|
104
|
+
...ctx.recoveryFor('not_found'),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const workUri = CellarSparqlService.bindingValue(resolveBindings[0], 'work') ?? input.work_uri ?? '';
|
|
108
|
+
// Step 2: Build relation type filter
|
|
109
|
+
const requestedTypes = input.relation_types ?? [
|
|
110
|
+
'cites',
|
|
111
|
+
'amends',
|
|
112
|
+
'amended_by',
|
|
113
|
+
'legal_basis',
|
|
114
|
+
'consolidated_version',
|
|
115
|
+
];
|
|
116
|
+
const predicates = requestedTypes.map((t) => CDM_RELATIONS[t]).filter(Boolean);
|
|
117
|
+
if (predicates.length === 0) {
|
|
118
|
+
throw ctx.fail('no_relations', `No valid relation types requested.`, {
|
|
119
|
+
...ctx.recoveryFor('no_relations'),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Step 3: Traverse relation graph (outgoing and incoming)
|
|
123
|
+
const relationSparql = `
|
|
124
|
+
SELECT ?relatedWork ?relatedCelex ?relationType ?direction WHERE {
|
|
125
|
+
{
|
|
126
|
+
# Outgoing: this work → related work
|
|
127
|
+
<${workUri}> ?relationType ?relatedWork .
|
|
128
|
+
OPTIONAL { ?relatedWork cdm:resource_legal_id_celex ?relatedCelex . }
|
|
129
|
+
BIND("outgoing" AS ?direction)
|
|
130
|
+
FILTER(?relationType IN (${predicates.join(', ')}))
|
|
131
|
+
} UNION {
|
|
132
|
+
# Incoming: related work → this work
|
|
133
|
+
?relatedWork ?relationType <${workUri}> .
|
|
134
|
+
OPTIONAL { ?relatedWork cdm:resource_legal_id_celex ?relatedCelex . }
|
|
135
|
+
BIND("incoming" AS ?direction)
|
|
136
|
+
FILTER(?relationType IN (${predicates.join(', ')}))
|
|
137
|
+
}
|
|
138
|
+
} LIMIT 100`;
|
|
139
|
+
const relationBindings = await svc.query(relationSparql, ctx);
|
|
140
|
+
ctx.log.info('Relation traversal', {
|
|
141
|
+
celexNumber,
|
|
142
|
+
workUri,
|
|
143
|
+
resultCount: relationBindings.length,
|
|
144
|
+
});
|
|
145
|
+
if (relationBindings.length === 0) {
|
|
146
|
+
throw ctx.fail('no_relations', `Work ${celexNumber} has no CDM relations of the requested types.`, {
|
|
147
|
+
...ctx.recoveryFor('no_relations'),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// Deduplicate relations
|
|
151
|
+
const seen = new Set();
|
|
152
|
+
const relations = [];
|
|
153
|
+
for (const b of relationBindings) {
|
|
154
|
+
const relatedWorkUri = CellarSparqlService.bindingValue(b, 'relatedWork') ?? '';
|
|
155
|
+
const predicateUri = CellarSparqlService.bindingValue(b, 'relationType') ?? '';
|
|
156
|
+
const direction = CellarSparqlService.bindingValue(b, 'direction') ?? 'outgoing';
|
|
157
|
+
const key = `${predicateUri}|${relatedWorkUri}|${direction}`;
|
|
158
|
+
if (seen.has(key))
|
|
159
|
+
continue;
|
|
160
|
+
seen.add(key);
|
|
161
|
+
const relationType = PREDICATE_TO_TYPE[predicateUri] ?? predicateUri;
|
|
162
|
+
const relatedCelex = CellarSparqlService.bindingValue(b, 'relatedCelex');
|
|
163
|
+
const entry = {
|
|
164
|
+
relation_type: relationType,
|
|
165
|
+
direction,
|
|
166
|
+
related_work_uri: relatedWorkUri,
|
|
167
|
+
};
|
|
168
|
+
if (relatedCelex)
|
|
169
|
+
entry.related_celex_number = relatedCelex;
|
|
170
|
+
relations.push(entry);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
celex_number: celexNumber,
|
|
174
|
+
work_uri: workUri,
|
|
175
|
+
relations,
|
|
176
|
+
total: relations.length,
|
|
177
|
+
};
|
|
178
|
+
},
|
|
179
|
+
format: (result) => {
|
|
180
|
+
const lines = [`## Relations for ${result.celex_number} (${result.total} found)\n`];
|
|
181
|
+
if (result.work_uri)
|
|
182
|
+
lines.push(`**Work URI:** ${result.work_uri}\n`);
|
|
183
|
+
const grouped = new Map();
|
|
184
|
+
for (const r of result.relations) {
|
|
185
|
+
const key = `${r.relation_type} (${r.direction})`;
|
|
186
|
+
if (!grouped.has(key))
|
|
187
|
+
grouped.set(key, []);
|
|
188
|
+
grouped.get(key).push(r);
|
|
189
|
+
}
|
|
190
|
+
for (const [group, items] of grouped) {
|
|
191
|
+
lines.push(`### ${group}`);
|
|
192
|
+
for (const item of items) {
|
|
193
|
+
const label = item.related_celex_number
|
|
194
|
+
? `${item.related_celex_number} (${item.related_work_uri})`
|
|
195
|
+
: item.related_work_uri;
|
|
196
|
+
lines.push(`- ${label}`);
|
|
197
|
+
}
|
|
198
|
+
lines.push('');
|
|
199
|
+
}
|
|
200
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=eurlex-get-relations.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-get-relations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-relations.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview eurlex_lookup_celex — Resolve any EU legal citation to a canonical CELLAR work.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurlex-lookup-celex
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const eurlex_lookup_celex: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
identifier: z.ZodString;
|
|
9
|
+
identifier_type: z.ZodDefault<z.ZodEnum<{
|
|
10
|
+
auto: "auto";
|
|
11
|
+
celex: "celex";
|
|
12
|
+
eli: "eli";
|
|
13
|
+
oj: "oj";
|
|
14
|
+
}>>;
|
|
15
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
16
|
+
found: z.ZodBoolean;
|
|
17
|
+
work_uri: z.ZodOptional<z.ZodString>;
|
|
18
|
+
celex_number: z.ZodOptional<z.ZodString>;
|
|
19
|
+
resource_type: z.ZodOptional<z.ZodString>;
|
|
20
|
+
date: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>, readonly [{
|
|
22
|
+
readonly reason: "not_found";
|
|
23
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
24
|
+
readonly when: "The identifier resolves to no CELLAR work — check the CELEX/ELI/OJ format and try again.";
|
|
25
|
+
readonly recovery: "Verify the CELEX number format or try eurlex_search_documents to find the work by keyword.";
|
|
26
|
+
}, {
|
|
27
|
+
readonly reason: "ambiguous_identifier";
|
|
28
|
+
readonly code: JsonRpcErrorCode.InvalidParams;
|
|
29
|
+
readonly when: "identifier_type is \"auto\" and the identifier format could not be determined.";
|
|
30
|
+
readonly recovery: "Supply identifier_type explicitly as \"celex\", \"eli\", or \"oj\" to resolve the ambiguity.";
|
|
31
|
+
}], undefined>;
|
|
32
|
+
//# sourceMappingURL=eurlex-lookup-celex.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-lookup-celex.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-lookup-celex.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA8BjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;cA2I9B,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview eurlex_lookup_celex — Resolve any EU legal citation to a canonical CELLAR work.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurlex-lookup-celex
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { CellarSparqlService, getCellarSparqlService, } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
8
|
+
/** Detect CELEX number format: starts with a sector digit. */
|
|
9
|
+
function isCelex(identifier) {
|
|
10
|
+
return /^[1-9]\d{4}[A-Z]+\d+/.test(identifier.trim());
|
|
11
|
+
}
|
|
12
|
+
/** Detect ELI URI format: starts with http://data.europa.eu/eli/ */
|
|
13
|
+
function isEliUri(identifier) {
|
|
14
|
+
return identifier.trim().startsWith('http://data.europa.eu/eli/');
|
|
15
|
+
}
|
|
16
|
+
/** Detect Official Journal reference format: e.g. OJ L 119, 4.5.2016 or L:2016:119 */
|
|
17
|
+
function isOjRef(identifier) {
|
|
18
|
+
return /^OJ\s+[LC]\s+\d+/i.test(identifier.trim()) || /^[LC]:\d{4}:\d+/.test(identifier.trim());
|
|
19
|
+
}
|
|
20
|
+
function detectIdentifierType(identifier) {
|
|
21
|
+
if (isCelex(identifier))
|
|
22
|
+
return 'celex';
|
|
23
|
+
if (isEliUri(identifier))
|
|
24
|
+
return 'eli';
|
|
25
|
+
if (isOjRef(identifier))
|
|
26
|
+
return 'oj';
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
export const eurlex_lookup_celex = tool('eurlex_lookup_celex', {
|
|
30
|
+
title: 'Resolve EU Legal Citation',
|
|
31
|
+
description: 'Resolve any EU legal citation — CELEX number, ELI URI, or Official Journal reference — to the canonical CELLAR work. ' +
|
|
32
|
+
'Returns the work URI, confirmed CELEX number, document type, document date, and whether the work exists in the CELLAR corpus. ' +
|
|
33
|
+
'Use this to validate identifiers before passing them to eurlex_get_document or eurlex_get_relations. ' +
|
|
34
|
+
'CELEX format: {sector}{year}{type}{number} e.g. 32016R0679 (GDPR). ' +
|
|
35
|
+
'ELI format: http://data.europa.eu/eli/{type}/{year}/{number}/oj. ' +
|
|
36
|
+
'OJ format: OJ L 119 or L:2016:119.',
|
|
37
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
38
|
+
input: z.object({
|
|
39
|
+
identifier: z
|
|
40
|
+
.string()
|
|
41
|
+
.min(1)
|
|
42
|
+
.describe('The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), ELI URI, or Official Journal reference (e.g. OJ L 119).'),
|
|
43
|
+
identifier_type: z
|
|
44
|
+
.enum(['celex', 'eli', 'oj', 'auto'])
|
|
45
|
+
.default('auto')
|
|
46
|
+
.describe('Format of the identifier. Use "auto" to let the server detect the format automatically. ' +
|
|
47
|
+
'Supply explicitly if auto-detection fails or if the identifier is ambiguous.'),
|
|
48
|
+
}),
|
|
49
|
+
output: z.object({
|
|
50
|
+
found: z
|
|
51
|
+
.boolean()
|
|
52
|
+
.describe('Always true on success (the tool throws not_found when the identifier does not resolve). Present as a discriminator for downstream logic.'),
|
|
53
|
+
work_uri: z.string().optional().describe('CELLAR work URI (stable resource identifier).'),
|
|
54
|
+
celex_number: z.string().optional().describe('Confirmed CELEX number for the resolved work.'),
|
|
55
|
+
resource_type: z
|
|
56
|
+
.string()
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('CDM resource type URI indicating the document category (e.g. .../resource-type/REG for Regulation). Absent for some works.'),
|
|
59
|
+
date: z.string().optional().describe('Document date in ISO 8601 format (YYYY-MM-DD).'),
|
|
60
|
+
}),
|
|
61
|
+
errors: [
|
|
62
|
+
{
|
|
63
|
+
reason: 'not_found',
|
|
64
|
+
code: JsonRpcErrorCode.NotFound,
|
|
65
|
+
when: 'The identifier resolves to no CELLAR work — check the CELEX/ELI/OJ format and try again.',
|
|
66
|
+
recovery: 'Verify the CELEX number format or try eurlex_search_documents to find the work by keyword.',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
reason: 'ambiguous_identifier',
|
|
70
|
+
code: JsonRpcErrorCode.InvalidParams,
|
|
71
|
+
when: 'identifier_type is "auto" and the identifier format could not be determined.',
|
|
72
|
+
recovery: 'Supply identifier_type explicitly as "celex", "eli", or "oj" to resolve the ambiguity.',
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
async handler(input, ctx) {
|
|
76
|
+
const svc = getCellarSparqlService();
|
|
77
|
+
const identifier = input.identifier.trim();
|
|
78
|
+
let effectiveType;
|
|
79
|
+
if (input.identifier_type === 'auto') {
|
|
80
|
+
const detected = detectIdentifierType(identifier);
|
|
81
|
+
if (!detected) {
|
|
82
|
+
throw ctx.fail('ambiguous_identifier', `Cannot determine format of identifier: ${identifier}`, {
|
|
83
|
+
...ctx.recoveryFor('ambiguous_identifier'),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
effectiveType = detected;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
effectiveType = input.identifier_type;
|
|
90
|
+
}
|
|
91
|
+
// Escape double-quotes in all identifier values before interpolating into SPARQL literals.
|
|
92
|
+
const safeIdentifier = identifier.replace(/"/g, '\\"');
|
|
93
|
+
let sparql;
|
|
94
|
+
if (effectiveType === 'celex') {
|
|
95
|
+
sparql = `
|
|
96
|
+
SELECT ?work ?celexNumber ?type ?date WHERE {
|
|
97
|
+
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
98
|
+
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
99
|
+
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
100
|
+
FILTER(STR(?celexNumber) = "${safeIdentifier}")
|
|
101
|
+
} LIMIT 5`;
|
|
102
|
+
}
|
|
103
|
+
else if (effectiveType === 'eli') {
|
|
104
|
+
// ELI URIs are mapped via cdm:work_id_document_official-journal or owl:sameAs
|
|
105
|
+
sparql = `
|
|
106
|
+
SELECT ?work ?celexNumber ?type ?date WHERE {
|
|
107
|
+
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
108
|
+
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
109
|
+
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
110
|
+
FILTER(CONTAINS(STR(?work), "${safeIdentifier}"))
|
|
111
|
+
} LIMIT 5`;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// OJ reference: extract year and number for a loose filter on CELEX
|
|
115
|
+
sparql = `
|
|
116
|
+
SELECT ?work ?celexNumber ?type ?date WHERE {
|
|
117
|
+
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
118
|
+
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
119
|
+
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
120
|
+
FILTER(CONTAINS(LCASE(STR(?celexNumber)), LCASE("${safeIdentifier}")))
|
|
121
|
+
} LIMIT 5`;
|
|
122
|
+
}
|
|
123
|
+
const bindings = await svc.query(sparql, ctx);
|
|
124
|
+
ctx.log.info('CELEX lookup', { identifier, type: effectiveType, resultCount: bindings.length });
|
|
125
|
+
if (bindings.length === 0) {
|
|
126
|
+
throw ctx.fail('not_found', `No CELLAR work found for identifier: ${identifier}`, {
|
|
127
|
+
...ctx.recoveryFor('not_found'),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const first = bindings[0];
|
|
131
|
+
return {
|
|
132
|
+
found: true,
|
|
133
|
+
work_uri: CellarSparqlService.bindingValue(first, 'work'),
|
|
134
|
+
celex_number: CellarSparqlService.bindingValue(first, 'celexNumber'),
|
|
135
|
+
resource_type: CellarSparqlService.bindingValue(first, 'type'),
|
|
136
|
+
date: CellarSparqlService.bindingValue(first, 'date'),
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
format: (result) => {
|
|
140
|
+
const lines = [`## CELLAR Work Resolved\n**Found:** ${result.found}`];
|
|
141
|
+
if (result.celex_number)
|
|
142
|
+
lines.push(`**CELEX:** ${result.celex_number}`);
|
|
143
|
+
if (result.work_uri)
|
|
144
|
+
lines.push(`**Work URI:** ${result.work_uri}`);
|
|
145
|
+
if (result.resource_type)
|
|
146
|
+
lines.push(`**Type:** ${result.resource_type}`);
|
|
147
|
+
if (result.date)
|
|
148
|
+
lines.push(`**Date:** ${result.date}`);
|
|
149
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=eurlex-lookup-celex.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-lookup-celex.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-lookup-celex.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview eurlex_query_sparql — Execute a raw SPARQL SELECT against the CELLAR endpoint.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurlex-query-sparql
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const eurlex_query_sparql: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
sparql_query: z.ZodString;
|
|
9
|
+
timeout_hint: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
11
|
+
bindings: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
|
|
12
|
+
variables: z.ZodArray<z.ZodString>;
|
|
13
|
+
total: z.ZodNumber;
|
|
14
|
+
}, z.core.$strip>, readonly [{
|
|
15
|
+
readonly reason: "sparql_error";
|
|
16
|
+
readonly code: JsonRpcErrorCode.InvalidParams;
|
|
17
|
+
readonly when: "Virtuoso returned a syntax or semantic error — the query is malformed.";
|
|
18
|
+
readonly recovery: "Fix the SPARQL query syntax, ensure predicates use the cdm: prefix, and verify variable names.";
|
|
19
|
+
}, {
|
|
20
|
+
readonly reason: "sparql_timeout";
|
|
21
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
22
|
+
readonly when: "Query exceeded the 60-second Virtuoso hard limit.";
|
|
23
|
+
readonly recovery: "Add more specific FILTER conditions, reduce the scope, or use LIMIT with a smaller value.";
|
|
24
|
+
}], undefined>;
|
|
25
|
+
//# sourceMappingURL=eurlex-query-sparql.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-query-sparql.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-query-sparql.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;cAiH9B,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview eurlex_query_sparql — Execute a raw SPARQL SELECT against the CELLAR endpoint.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurlex-query-sparql
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getCellarSparqlService } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
8
|
+
export const eurlex_query_sparql = tool('eurlex_query_sparql', {
|
|
9
|
+
title: 'Raw CELLAR SPARQL Query',
|
|
10
|
+
description: 'Execute a raw SPARQL SELECT query against the CELLAR Virtuoso endpoint. ' +
|
|
11
|
+
'Use only when the curated tools (eurlex_search_documents, eurlex_get_relations, etc.) do not cover the needed traversal. ' +
|
|
12
|
+
'The server caps all queries at 100 results — include an explicit LIMIT in your query to control the count; ' +
|
|
13
|
+
'if omitted or above 100 it will be injected or capped automatically. ' +
|
|
14
|
+
'The CDM ontology prefix is prepended automatically: cdm: = http://publications.europa.eu/ontology/cdm#. ' +
|
|
15
|
+
'Also auto-includes skos: and xsd: prefixes. ' +
|
|
16
|
+
'Requires familiarity with the CELLAR CDM ontology. ' +
|
|
17
|
+
'Key predicates: cdm:resource_legal_id_celex (CELEX number), cdm:work_date_document (date), ' +
|
|
18
|
+
'cdm:work_has_resource-type (document type), cdm:work_is_about_concept_eurovoc (EuroVoc subject), ' +
|
|
19
|
+
'cdm:work_cites_work (citation). ' +
|
|
20
|
+
'Virtuoso does not support bif:contains for multi-word phrases; use FILTER(CONTAINS(LCASE(?title), "keyword")).',
|
|
21
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
22
|
+
input: z.object({
|
|
23
|
+
sparql_query: z
|
|
24
|
+
.string()
|
|
25
|
+
.min(10)
|
|
26
|
+
.describe('A SPARQL SELECT query to execute against CELLAR. The cdm:, skos:, and xsd: prefixes are auto-injected. ' +
|
|
27
|
+
'LIMIT is injected at 100 if absent or capped to 100 if above that threshold.'),
|
|
28
|
+
timeout_hint: z
|
|
29
|
+
.number()
|
|
30
|
+
.int()
|
|
31
|
+
.min(1000)
|
|
32
|
+
.max(55000)
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Optional client-side timeout hint in milliseconds (1000–55000). ' +
|
|
35
|
+
'Defaults to server-configured SPARQL_QUERY_TIMEOUT_MS (55000). Virtuoso hard limit is 60 seconds.'),
|
|
36
|
+
}),
|
|
37
|
+
output: z.object({
|
|
38
|
+
bindings: z
|
|
39
|
+
.array(z
|
|
40
|
+
.object({})
|
|
41
|
+
.passthrough()
|
|
42
|
+
.describe('A single SPARQL result row. Each key is a SELECT variable name; each value is a SPARQL term object with "type" (e.g. "uri", "literal") and "value" (the string value) fields.'))
|
|
43
|
+
.describe('Raw SPARQL binding rows. To extract a value from a row: row["varName"]?.value. Use the variables array to iterate in query order.'),
|
|
44
|
+
variables: z
|
|
45
|
+
.array(z.string().describe('A SELECT variable name, in the order declared in the query.'))
|
|
46
|
+
.describe('Variable names from the SELECT head, in query order.'),
|
|
47
|
+
total: z.number().describe('Number of binding rows returned (capped at 100 by the server).'),
|
|
48
|
+
}),
|
|
49
|
+
errors: [
|
|
50
|
+
{
|
|
51
|
+
reason: 'sparql_error',
|
|
52
|
+
code: JsonRpcErrorCode.InvalidParams,
|
|
53
|
+
when: 'Virtuoso returned a syntax or semantic error — the query is malformed.',
|
|
54
|
+
recovery: 'Fix the SPARQL query syntax, ensure predicates use the cdm: prefix, and verify variable names.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
reason: 'sparql_timeout',
|
|
58
|
+
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
59
|
+
when: 'Query exceeded the 60-second Virtuoso hard limit.',
|
|
60
|
+
recovery: 'Add more specific FILTER conditions, reduce the scope, or use LIMIT with a smaller value.',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
async handler(input, ctx) {
|
|
64
|
+
const svc = getCellarSparqlService();
|
|
65
|
+
const bindings = await svc.query(input.sparql_query, ctx);
|
|
66
|
+
ctx.log.info('Raw SPARQL query executed', { resultCount: bindings.length });
|
|
67
|
+
// Extract variable names from first binding or return empty
|
|
68
|
+
const variables = bindings.length > 0 ? Object.keys(bindings[0]) : [];
|
|
69
|
+
return {
|
|
70
|
+
bindings,
|
|
71
|
+
variables,
|
|
72
|
+
total: bindings.length,
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
format: (result) => {
|
|
76
|
+
const lines = [`## SPARQL Results (${result.total} rows)\n`];
|
|
77
|
+
if (result.variables.length > 0) {
|
|
78
|
+
lines.push(`**Variables:** ${result.variables.join(', ')}\n`);
|
|
79
|
+
}
|
|
80
|
+
if (result.total === 0) {
|
|
81
|
+
lines.push('*No bindings returned.*');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Render first 20 rows as a table
|
|
85
|
+
const displayRows = result.bindings.slice(0, 20);
|
|
86
|
+
const header = `| ${result.variables.join(' | ')} |`;
|
|
87
|
+
const sep = `| ${result.variables.map(() => '---').join(' | ')} |`;
|
|
88
|
+
lines.push(header);
|
|
89
|
+
lines.push(sep);
|
|
90
|
+
for (const row of displayRows) {
|
|
91
|
+
const cells = result.variables.map((v) => {
|
|
92
|
+
const cell = row[v];
|
|
93
|
+
return cell?.value ?? '';
|
|
94
|
+
});
|
|
95
|
+
lines.push(`| ${cells.join(' | ')} |`);
|
|
96
|
+
}
|
|
97
|
+
if (result.total > 20) {
|
|
98
|
+
lines.push(`\n*Showing first 20 of ${result.total} rows.*`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=eurlex-query-sparql.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurlex-query-sparql.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-query-sparql.tool.ts"],"names":[],"mappings":"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"}
|