@cyanheads/eur-lex-mcp-server 0.1.8 → 0.2.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 +1 -1
- package/CLAUDE.md +1 -1
- package/README.md +1 -1
- package/changelog/0.2.x/0.2.0.md +22 -0
- package/changelog/0.2.x/0.2.1.md +16 -0
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.js +12 -0
- package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.d.ts +6 -6
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.js +54 -20
- package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.d.ts +8 -3
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.js +43 -7
- package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.d.ts +9 -4
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.js +56 -21
- package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.js +16 -60
- package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.d.ts +5 -5
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.js +63 -24
- package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +28 -18
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/services/cellar-sparql/cdm-labels.d.ts +9 -0
- package/dist/services/cellar-sparql/cdm-labels.d.ts.map +1 -1
- package/dist/services/cellar-sparql/cdm-labels.js +16 -0
- package/dist/services/cellar-sparql/cdm-labels.js.map +1 -1
- package/dist/services/cellar-sparql/eli-resolution.d.ts +45 -0
- package/dist/services/cellar-sparql/eli-resolution.d.ts.map +1 -0
- package/dist/services/cellar-sparql/eli-resolution.js +71 -0
- package/dist/services/cellar-sparql/eli-resolution.js.map +1 -0
- package/package.json +1 -1
- package/server.json +3 -3
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { CellarSparqlService, getCellarSparqlService, } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
8
|
+
import { escapeSparqlLiteral } from '../../../services/cellar-sparql/eli-resolution.js';
|
|
8
9
|
/** CDM relation predicates traversed by this tool. */
|
|
9
10
|
const CDM_RELATIONS = {
|
|
10
11
|
cites: 'cdm:work_cites_work',
|
|
@@ -34,12 +35,21 @@ export const eurlex_get_relations = tool('eurlex_get_relations', {
|
|
|
34
35
|
input: z.object({
|
|
35
36
|
celex_number: z
|
|
36
37
|
.string()
|
|
37
|
-
.
|
|
38
|
-
.describe('CELEX number of the work to traverse (e.g. 32016R0679).
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('CELEX number of the work to traverse (e.g. 32016R0679). ' +
|
|
40
|
+
'Provide exactly one of celex_number or work_uri.'),
|
|
39
41
|
work_uri: z
|
|
40
42
|
.string()
|
|
43
|
+
.refine((v) => !v ||
|
|
44
|
+
(v.startsWith('http') &&
|
|
45
|
+
!v.includes('>') &&
|
|
46
|
+
!v.includes('<') &&
|
|
47
|
+
!v.includes('"') &&
|
|
48
|
+
!v.includes(' ')), { message: 'work_uri must be a valid http URI with no angle brackets, quotes, or spaces.' })
|
|
41
49
|
.optional()
|
|
42
|
-
.describe('CELLAR work URI
|
|
50
|
+
.describe('CELLAR work resource URI to traverse (e.g. ' +
|
|
51
|
+
'http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1). ' +
|
|
52
|
+
'Used directly without CELEX resolution. Provide exactly one of celex_number or work_uri.'),
|
|
43
53
|
relation_types: z
|
|
44
54
|
.array(z.enum(['cites', 'amends', 'amended_by', 'legal_basis', 'consolidated_version']))
|
|
45
55
|
.optional()
|
|
@@ -50,11 +60,12 @@ export const eurlex_get_relations = tool('eurlex_get_relations', {
|
|
|
50
60
|
output: z.object({
|
|
51
61
|
celex_number: z
|
|
52
62
|
.string()
|
|
53
|
-
.
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('CELEX number of the source work whose relations were traversed. ' +
|
|
65
|
+
'Absent when the work was addressed directly by work_uri.'),
|
|
54
66
|
work_uri: z
|
|
55
67
|
.string()
|
|
56
|
-
.
|
|
57
|
-
.describe('CELLAR URI of the source work (resolved from the CELEX number).'),
|
|
68
|
+
.describe('CELLAR URI of the source work (the work_uri input, or resolved from the CELEX).'),
|
|
58
69
|
relations: z
|
|
59
70
|
.array(z
|
|
60
71
|
.object({
|
|
@@ -75,10 +86,16 @@ export const eurlex_get_relations = tool('eurlex_get_relations', {
|
|
|
75
86
|
total: z.number().describe('Total number of direct CDM relations returned.'),
|
|
76
87
|
}),
|
|
77
88
|
errors: [
|
|
89
|
+
{
|
|
90
|
+
reason: 'invalid_identifier_args',
|
|
91
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
92
|
+
when: 'Neither celex_number nor work_uri was provided, or both were.',
|
|
93
|
+
recovery: 'Provide exactly one of celex_number or work_uri.',
|
|
94
|
+
},
|
|
78
95
|
{
|
|
79
96
|
reason: 'not_found',
|
|
80
97
|
code: JsonRpcErrorCode.NotFound,
|
|
81
|
-
when: 'CELEX
|
|
98
|
+
when: 'CELEX number not found in CELLAR — resolve the identifier with eurlex_lookup_celex first.',
|
|
82
99
|
recovery: 'Use eurlex_lookup_celex to confirm the CELEX number exists, then retry.',
|
|
83
100
|
},
|
|
84
101
|
{
|
|
@@ -90,21 +107,37 @@ export const eurlex_get_relations = tool('eurlex_get_relations', {
|
|
|
90
107
|
],
|
|
91
108
|
async handler(input, ctx) {
|
|
92
109
|
const svc = getCellarSparqlService();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
110
|
+
// Accept exactly one identifier. Treat empty/whitespace as absent so
|
|
111
|
+
// form-based clients sending "" for an omitted field hit the friendly guard.
|
|
112
|
+
const celexNumber = input.celex_number?.trim();
|
|
113
|
+
const workUriInput = input.work_uri?.trim();
|
|
114
|
+
// Step 1: Determine the source work URI. A work_uri is the CELLAR work
|
|
115
|
+
// resource directly — use it as-is, skipping the CELEX→work resolution that
|
|
116
|
+
// would otherwise throw not_found before the URI could be used. A
|
|
117
|
+
// celex_number is resolved to its work first.
|
|
118
|
+
let workUri;
|
|
119
|
+
if (workUriInput && !celexNumber) {
|
|
120
|
+
workUri = workUriInput;
|
|
121
|
+
}
|
|
122
|
+
else if (celexNumber && !workUriInput) {
|
|
123
|
+
const resolveSparql = `
|
|
97
124
|
SELECT ?work WHERE {
|
|
98
125
|
?work cdm:resource_legal_id_celex ?celex .
|
|
99
|
-
FILTER(STR(?celex) = "${
|
|
126
|
+
FILTER(STR(?celex) = "${escapeSparqlLiteral(celexNumber)}")
|
|
100
127
|
} LIMIT 1`;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
128
|
+
const resolveBindings = await svc.query(resolveSparql, ctx);
|
|
129
|
+
if (resolveBindings.length === 0) {
|
|
130
|
+
throw ctx.fail('not_found', `No CELLAR work found for CELEX: ${celexNumber}`, {
|
|
131
|
+
...ctx.recoveryFor('not_found'),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
workUri = CellarSparqlService.bindingValue(resolveBindings[0], 'work') ?? '';
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
throw ctx.fail('invalid_identifier_args', celexNumber
|
|
138
|
+
? 'Provide only one of celex_number or work_uri, not both.'
|
|
139
|
+
: 'Provide either celex_number or work_uri.', { ...ctx.recoveryFor('invalid_identifier_args') });
|
|
106
140
|
}
|
|
107
|
-
const workUri = CellarSparqlService.bindingValue(resolveBindings[0], 'work') ?? input.work_uri ?? '';
|
|
108
141
|
// Step 2: Build relation type filter
|
|
109
142
|
const requestedTypes = input.relation_types ?? [
|
|
110
143
|
'cites',
|
|
@@ -143,7 +176,7 @@ SELECT ?relatedWork ?relatedCelex ?relationType ?direction WHERE {
|
|
|
143
176
|
resultCount: relationBindings.length,
|
|
144
177
|
});
|
|
145
178
|
if (relationBindings.length === 0) {
|
|
146
|
-
throw ctx.fail('no_relations', `Work ${celexNumber} has no CDM relations of the requested types.`, {
|
|
179
|
+
throw ctx.fail('no_relations', `Work ${celexNumber ?? workUri} has no CDM relations of the requested types.`, {
|
|
147
180
|
...ctx.recoveryFor('no_relations'),
|
|
148
181
|
});
|
|
149
182
|
}
|
|
@@ -170,14 +203,16 @@ SELECT ?relatedWork ?relatedCelex ?relationType ?direction WHERE {
|
|
|
170
203
|
relations.push(entry);
|
|
171
204
|
}
|
|
172
205
|
return {
|
|
173
|
-
celex_number: celexNumber,
|
|
206
|
+
...(celexNumber ? { celex_number: celexNumber } : {}),
|
|
174
207
|
work_uri: workUri,
|
|
175
208
|
relations,
|
|
176
209
|
total: relations.length,
|
|
177
210
|
};
|
|
178
211
|
},
|
|
179
212
|
format: (result) => {
|
|
180
|
-
const lines = [
|
|
213
|
+
const lines = [
|
|
214
|
+
`## Relations for ${result.celex_number ?? result.work_uri} (${result.total} found)\n`,
|
|
215
|
+
];
|
|
181
216
|
if (result.work_uri)
|
|
182
217
|
lines.push(`**Work URI:** ${result.work_uri}\n`);
|
|
183
218
|
const grouped = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-get-relations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-relations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"eurlex-get-relations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-relations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAEjF,sDAAsD;AACtD,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,qBAAqB;IAC5B,MAAM,EAAE,0CAA0C;IAClD,UAAU,EAAE,8CAA8C;IAC1D,WAAW,EAAE,4CAA4C;IACzD,oBAAoB,EAAE,6CAA6C;CACpE,CAAC;AAEF,8DAA8D;AAC9D,MAAM,iBAAiB,GAA2B;IAChD,4DAA4D,EAAE,OAAO;IACrE,iFAAiF,EAAE,QAAQ;IAC3F,qFAAqF,EACnF,YAAY;IACd,mFAAmF,EACjF,aAAa;IACf,oFAAoF,EAClF,sBAAsB;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC/D,KAAK,EAAE,+BAA+B;IACtC,WAAW,EACT,6DAA6D;QAC7D,6GAA6G;QAC7G,oIAAoI;QACpI,wFAAwF;QACxF,+GAA+G;QAC/G,4CAA4C;QAC5C,0GAA0G;IAC5G,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,0DAA0D;YACxD,kDAAkD,CACrD;QACH,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC;YACF,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;gBACnB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EACrB,EAAE,OAAO,EAAE,8EAA8E,EAAE,CAC5F;aACA,QAAQ,EAAE;aACV,QAAQ,CACP,6CAA6C;YAC3C,uFAAuF;YACvF,0FAA0F,CAC7F;QACH,cAAc,EAAE,CAAC;aACd,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC,CAAC;aACvF,QAAQ,EAAE;aACV,QAAQ,CACP,gEAAgE;YAC9D,8FAA8F;YAC9F,6GAA6G,CAChH;KACJ,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,kEAAkE;YAChE,0DAA0D,CAC7D;QACH,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CAAC,iFAAiF,CAAC;QAC9F,SAAS,EAAE,CAAC;aACT,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,CACP,iFAAiF,CAClF;YACH,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CACP,kFAAkF,CACnF;YACH,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACxE,oBAAoB,EAAE,CAAC;iBACpB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,iDAAiD,CAAC;SAC/D,CAAC;aACD,QAAQ,CAAC,mEAAmE,CAAC,CACjF;aACA,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;KAC7E,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,yBAAyB;YACjC,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,+DAA+D;YACrE,QAAQ,EAAE,kDAAkD;SAC7D;QACD;YACE,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2FAA2F;YACjG,QAAQ,EAAE,yEAAyE;SACpF;QACD;YACE,MAAM,EAAE,cAAc;YACtB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,8DAA8D;YACpE,QAAQ,EACN,oFAAoF;SACvF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;QAErC,qEAAqE;QACrE,6EAA6E;QAC7E,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE5C,uEAAuE;QACvE,4EAA4E;QAC5E,kEAAkE;QAClE,8CAA8C;QAC9C,IAAI,OAAe,CAAC;QACpB,IAAI,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,OAAO,GAAG,YAAY,CAAC;QACzB,CAAC;aAAM,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG;;;0BAGF,mBAAmB,CAAC,WAAW,CAAC;UAChD,CAAC;YAEL,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC5D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,mCAAmC,WAAW,EAAE,EAAE;oBAC5E,GAAG,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC;iBAChC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,IAAI,CACZ,yBAAyB,EACzB,WAAW;gBACT,CAAC,CAAC,yDAAyD;gBAC3D,CAAC,CAAC,0CAA0C,EAC9C,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,yBAAyB,CAAC,EAAE,CAClD,CAAC;QACJ,CAAC;QAED,qCAAqC;QACrC,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI;YAC7C,OAAO;YACP,QAAQ;YACR,YAAY;YACZ,aAAa;YACb,sBAAsB;SACvB,CAAC;QACF,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE/E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,oCAAoC,EAAE;gBACnE,GAAG,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,0DAA0D;QAC1D,MAAM,cAAc,GAAG;;;;OAIpB,OAAO;;;+BAGiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;;kCAGlB,OAAO;;;+BAGV,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;YAExC,CAAC;QAET,MAAM,gBAAgB,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE;YACjC,WAAW;YACX,OAAO;YACP,WAAW,EAAE,gBAAgB,CAAC,MAAM;SACrC,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,CAAC,IAAI,CACZ,cAAc,EACd,QAAQ,WAAW,IAAI,OAAO,+CAA+C,EAC7E;gBACE,GAAG,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC;aACnC,CACF,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,SAAS,GAKV,EAAE,CAAC;QAER,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjC,MAAM,cAAc,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;YAChF,MAAM,YAAY,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;YAC/E,MAAM,SAAS,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,UAAU,CAAC;YACjF,MAAM,GAAG,GAAG,GAAG,YAAY,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;YAE7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEd,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC;YACrE,MAAM,YAAY,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAEzE,MAAM,KAAK,GAA+B;gBACxC,aAAa,EAAE,YAAY;gBAC3B,SAAS;gBACT,gBAAgB,EAAE,cAAc;aACjC,CAAC;YACF,IAAI,YAAY;gBAAE,KAAK,CAAC,oBAAoB,GAAG,YAAY,CAAC;YAC5D,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QAED,OAAO;YACL,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,QAAQ,EAAE,OAAO;YACjB,SAAS;YACT,KAAK,EAAE,SAAS,CAAC,MAAM;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAa;YACtB,oBAAoB,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,WAAW;SACvF,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAEtE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB;oBACrC,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,gBAAgB,GAAG;oBAC3D,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +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;
|
|
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;AAyBjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;cA8H9B,CAAC"}
|
|
@@ -5,14 +5,11 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { CellarSparqlService, getCellarSparqlService, } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
8
|
+
import { escapeSparqlLiteral, isEliUri, resolveEliToWork, } from '../../../services/cellar-sparql/eli-resolution.js';
|
|
8
9
|
/** Detect CELEX number format: starts with a sector digit. */
|
|
9
10
|
function isCelex(identifier) {
|
|
10
11
|
return /^[1-9]\d{4}[A-Z]+\d+/.test(identifier.trim());
|
|
11
12
|
}
|
|
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
13
|
function detectIdentifierType(identifier) {
|
|
17
14
|
if (isCelex(identifier))
|
|
18
15
|
return 'celex';
|
|
@@ -20,38 +17,6 @@ function detectIdentifierType(identifier) {
|
|
|
20
17
|
return 'eli';
|
|
21
18
|
return null;
|
|
22
19
|
}
|
|
23
|
-
const ELI_NAMESPACE = 'http://data.europa.eu/eli/';
|
|
24
|
-
/**
|
|
25
|
-
* A bare work-level ELI — `…/eli/{type}/{year}/{number}` with no manifestation
|
|
26
|
-
* suffix (no `/oj`, no `/YYYY-MM-DD` consolidation date). CELLAR stores the
|
|
27
|
-
* canonical OJ-manifestation literal (`…/{number}/oj`) rather than the bare
|
|
28
|
-
* work-level form, so these never match on exact lookup and must be normalized
|
|
29
|
-
* to their `/oj` form to resolve.
|
|
30
|
-
*/
|
|
31
|
-
function isBareWorkLevelEli(eli) {
|
|
32
|
-
if (!eli.startsWith(ELI_NAMESPACE))
|
|
33
|
-
return false;
|
|
34
|
-
const path = eli.slice(ELI_NAMESPACE.length).replace(/\/+$/, '');
|
|
35
|
-
return /^[^/]+\/\d{4}\/[^/]+$/.test(path);
|
|
36
|
-
}
|
|
37
|
-
/** Escape backslashes then double-quotes for safe interpolation into a SPARQL string literal. */
|
|
38
|
-
function escapeSparqlLiteral(value) {
|
|
39
|
-
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* ELI exact-match query: resolve the single work whose canonical ELI literal
|
|
43
|
-
* (`cdm:resource_legal_eli`, an `xsd:anyURI` literal) equals `safeEli`, reading
|
|
44
|
-
* its CELEX, type, and date. `safeEli` must be pre-escaped.
|
|
45
|
-
*/
|
|
46
|
-
function buildEliQuery(safeEli) {
|
|
47
|
-
return `
|
|
48
|
-
SELECT ?work ?celexNumber ?type ?date WHERE {
|
|
49
|
-
?work cdm:resource_legal_eli "${safeEli}"^^xsd:anyURI .
|
|
50
|
-
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
51
|
-
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
52
|
-
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
53
|
-
} LIMIT 5`;
|
|
54
|
-
}
|
|
55
20
|
export const eurlex_lookup_celex = tool('eurlex_lookup_celex', {
|
|
56
21
|
title: 'Resolve EU Legal Citation',
|
|
57
22
|
description: 'Resolve an EU legal citation — a CELEX number or an ELI URI — to the canonical CELLAR work. ' +
|
|
@@ -113,50 +78,41 @@ export const eurlex_lookup_celex = tool('eurlex_lookup_celex', {
|
|
|
113
78
|
else {
|
|
114
79
|
effectiveType = input.identifier_type;
|
|
115
80
|
}
|
|
116
|
-
|
|
81
|
+
// ELI resolution (exact-match on cdm:resource_legal_eli, with the bare
|
|
82
|
+
// work-level /oj retry) is shared with eurlex_get_document — see
|
|
83
|
+
// services/cellar-sparql/eli-resolution.ts. The CELEX branch stays here: a
|
|
84
|
+
// direct exact-string match on the CELEX literal.
|
|
85
|
+
let binding;
|
|
117
86
|
if (effectiveType === 'celex') {
|
|
118
|
-
|
|
87
|
+
const celexQuery = `
|
|
119
88
|
SELECT ?work ?celexNumber ?type ?date WHERE {
|
|
120
89
|
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
121
90
|
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
122
91
|
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
123
92
|
FILTER(STR(?celexNumber) = "${escapeSparqlLiteral(identifier)}")
|
|
124
93
|
} LIMIT 5`;
|
|
94
|
+
const bindings = await svc.query(celexQuery, ctx);
|
|
95
|
+
binding = bindings[0] ?? null;
|
|
125
96
|
}
|
|
126
97
|
else {
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
let bindings = await svc.query(sparql, ctx);
|
|
130
|
-
// CELLAR stores only the OJ-manifestation ELI literal (…/{number}/oj), so a
|
|
131
|
-
// bare work-level ELI (…/{type}/{year}/{number}) — the most common citation
|
|
132
|
-
// form — misses on exact match. Retry once with /oj appended: a deterministic,
|
|
133
|
-
// one-to-one normalization to the same act's canonical manifestation. Gated to
|
|
134
|
-
// bare work-level ELIs, so a manifestation-suffixed ELI (e.g. a /YYYY-MM-DD
|
|
135
|
-
// consolidated version) never silently falls back to the original act.
|
|
136
|
-
let bareEliRetry = false;
|
|
137
|
-
if (bindings.length === 0 && effectiveType === 'eli' && isBareWorkLevelEli(identifier)) {
|
|
138
|
-
const ojEli = `${identifier.replace(/\/+$/, '')}/oj`;
|
|
139
|
-
bindings = await svc.query(buildEliQuery(escapeSparqlLiteral(ojEli)), ctx);
|
|
140
|
-
bareEliRetry = true;
|
|
98
|
+
binding = await resolveEliToWork(svc, identifier, ctx);
|
|
141
99
|
}
|
|
142
100
|
ctx.log.info('Citation lookup', {
|
|
143
101
|
identifier,
|
|
144
102
|
type: effectiveType,
|
|
145
|
-
|
|
146
|
-
resultCount: bindings.length,
|
|
103
|
+
found: binding !== null,
|
|
147
104
|
});
|
|
148
|
-
if (
|
|
105
|
+
if (!binding) {
|
|
149
106
|
throw ctx.fail('not_found', `No CELLAR work found for identifier: ${identifier}`, {
|
|
150
107
|
...ctx.recoveryFor('not_found'),
|
|
151
108
|
});
|
|
152
109
|
}
|
|
153
|
-
const first = bindings[0];
|
|
154
110
|
return {
|
|
155
111
|
found: true,
|
|
156
|
-
work_uri: CellarSparqlService.bindingValue(
|
|
157
|
-
celex_number: CellarSparqlService.bindingValue(
|
|
158
|
-
resource_type: CellarSparqlService.bindingValue(
|
|
159
|
-
date: CellarSparqlService.bindingValue(
|
|
112
|
+
work_uri: CellarSparqlService.bindingValue(binding, 'work'),
|
|
113
|
+
celex_number: CellarSparqlService.bindingValue(binding, 'celexNumber'),
|
|
114
|
+
resource_type: CellarSparqlService.bindingValue(binding, 'type'),
|
|
115
|
+
date: CellarSparqlService.bindingValue(binding, 'date'),
|
|
160
116
|
};
|
|
161
117
|
},
|
|
162
118
|
format: (result) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-lookup-celex.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-lookup-celex.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mDAAmD,CAAC;
|
|
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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"}
|
|
@@ -6,7 +6,7 @@ import { z } from '@cyanheads/mcp-ts-core';
|
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
export declare const eurlex_search_documents: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
8
|
keyword: z.ZodOptional<z.ZodString>;
|
|
9
|
-
document_type: z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
document_type: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodEnum<{
|
|
10
10
|
REG: "REG";
|
|
11
11
|
DIR: "DIR";
|
|
12
12
|
DEC: "DEC";
|
|
@@ -15,10 +15,10 @@ export declare const eurlex_search_documents: import("@cyanheads/mcp-ts-core").T
|
|
|
15
15
|
OPIN_AG: "OPIN_AG";
|
|
16
16
|
PROP: "PROP";
|
|
17
17
|
REC: "REC";
|
|
18
|
-
}>>;
|
|
19
|
-
date_from: z.ZodOptional<z.ZodString
|
|
20
|
-
date_to: z.ZodOptional<z.ZodString
|
|
21
|
-
eurovoc_concept: z.ZodOptional<z.ZodString
|
|
18
|
+
}>]>>;
|
|
19
|
+
date_from: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodString]>>;
|
|
20
|
+
date_to: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodString]>>;
|
|
21
|
+
eurovoc_concept: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodString]>>;
|
|
22
22
|
author_institution: z.ZodOptional<z.ZodString>;
|
|
23
23
|
in_force: z.ZodOptional<z.ZodBoolean>;
|
|
24
24
|
offset: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-search-documents.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-search-documents.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"eurlex-search-documents.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-search-documents.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAsBjE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgVlC,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
-
import { ENG_LANGUAGE_URI,
|
|
7
|
+
import { ENG_LANGUAGE_URI, resolveResourceTypeLabels, } from '../../../services/cellar-sparql/cdm-labels.js';
|
|
8
8
|
import { CellarSparqlService, getCellarSparqlService, } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
9
9
|
/** CDM resource type URIs for common document categories. */
|
|
10
10
|
const DOCUMENT_TYPE_URIS = {
|
|
@@ -33,29 +33,54 @@ export const eurlex_search_documents = tool('eurlex_search_documents', {
|
|
|
33
33
|
.optional()
|
|
34
34
|
.describe('Keyword to match against document titles. Single dominant word recommended; multi-word phrase uses substring match.'),
|
|
35
35
|
document_type: z
|
|
36
|
-
.
|
|
36
|
+
.union([
|
|
37
|
+
z.literal(''),
|
|
38
|
+
z
|
|
39
|
+
.enum(['REG', 'DIR', 'DEC', 'TREATY', 'JUDG', 'OPIN_AG', 'PROP', 'REC'])
|
|
40
|
+
.describe('Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, ' +
|
|
41
|
+
'JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation.'),
|
|
42
|
+
])
|
|
37
43
|
.optional()
|
|
38
44
|
.describe('Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, ' +
|
|
39
|
-
'JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation.'
|
|
45
|
+
'JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. ' +
|
|
46
|
+
'Leave blank or omit to search all document types.'),
|
|
40
47
|
date_from: z
|
|
41
|
-
.
|
|
42
|
-
.
|
|
48
|
+
.union([
|
|
49
|
+
z.literal(''),
|
|
50
|
+
z
|
|
51
|
+
.string()
|
|
52
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
53
|
+
.describe('Start date in ISO 8601 format (YYYY-MM-DD).'),
|
|
54
|
+
])
|
|
43
55
|
.optional()
|
|
44
|
-
.describe('Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date.'
|
|
56
|
+
.describe('Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. ' +
|
|
57
|
+
'Leave blank or omit for no lower bound.'),
|
|
45
58
|
date_to: z
|
|
46
|
-
.
|
|
47
|
-
.
|
|
59
|
+
.union([
|
|
60
|
+
z.literal(''),
|
|
61
|
+
z
|
|
62
|
+
.string()
|
|
63
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
64
|
+
.describe('End date in ISO 8601 format (YYYY-MM-DD).'),
|
|
65
|
+
])
|
|
48
66
|
.optional()
|
|
49
|
-
.describe('End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date.'
|
|
67
|
+
.describe('End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. ' +
|
|
68
|
+
'Leave blank or omit for no upper bound.'),
|
|
50
69
|
eurovoc_concept: z
|
|
51
|
-
.
|
|
52
|
-
.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
70
|
+
.union([
|
|
71
|
+
z.literal(''),
|
|
72
|
+
z
|
|
73
|
+
.string()
|
|
74
|
+
.startsWith('http')
|
|
75
|
+
.refine((v) => !v.includes('>') && !v.includes('"') && !v.includes(' '), {
|
|
76
|
+
message: 'EuroVoc URI must be a valid http URI with no angle brackets, quotes, or spaces.',
|
|
77
|
+
})
|
|
78
|
+
.describe('EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).'),
|
|
79
|
+
])
|
|
56
80
|
.optional()
|
|
57
81
|
.describe('EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828). ' +
|
|
58
|
-
'Obtain concept URIs from eurlex_browse_subjects first.'
|
|
82
|
+
'Obtain concept URIs from eurlex_browse_subjects first. ' +
|
|
83
|
+
'Leave blank or omit for no subject filter.'),
|
|
59
84
|
author_institution: z
|
|
60
85
|
.string()
|
|
61
86
|
.optional()
|
|
@@ -88,7 +113,9 @@ export const eurlex_search_documents = tool('eurlex_search_documents', {
|
|
|
88
113
|
resource_type: z
|
|
89
114
|
.string()
|
|
90
115
|
.optional()
|
|
91
|
-
.describe('Human-readable document type label (e.g. "Regulation", "Directive").
|
|
116
|
+
.describe('Human-readable document type label (e.g. "Regulation", "Directive"). ' +
|
|
117
|
+
'Works classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. ' +
|
|
118
|
+
'Absent for some older works.'),
|
|
92
119
|
date: z.string().optional().describe('Document date in ISO 8601 format (YYYY-MM-DD).'),
|
|
93
120
|
title: z
|
|
94
121
|
.string()
|
|
@@ -191,8 +218,20 @@ export const eurlex_search_documents = tool('eurlex_search_documents', {
|
|
|
191
218
|
// ?expr cdm:expression_belongs_to_work ?work (inverse of cdm:work_has_expression)
|
|
192
219
|
// ?expr cdm:expression_uses_language <.../ENG>
|
|
193
220
|
// ?expr cdm:expression_title ?title
|
|
221
|
+
//
|
|
222
|
+
// GROUP BY ?work collapses each work to one row. A work can carry several
|
|
223
|
+
// cdm:work_has_resource-type values (corrigenda hold 2–3); without grouping these
|
|
224
|
+
// cross-product into duplicate rows that SELECT DISTINCT cannot merge (?type
|
|
225
|
+
// differs per row), and LIMIT/OFFSET would then page over raw rows rather than
|
|
226
|
+
// works. GROUP_CONCAT gathers every resource-type URI per work; SAMPLE picks the
|
|
227
|
+
// single-valued display fields. Aggregate aliases are renamed (?celex/?docDate/
|
|
228
|
+
// ?docTitle) because a projected AS-variable cannot reuse a name already in scope.
|
|
194
229
|
const sparql = `
|
|
195
|
-
SELECT
|
|
230
|
+
SELECT ?work
|
|
231
|
+
(SAMPLE(?celexNumber) AS ?celex)
|
|
232
|
+
(GROUP_CONCAT(DISTINCT STR(?type); SEPARATOR=" ") AS ?types)
|
|
233
|
+
(SAMPLE(?date) AS ?docDate)
|
|
234
|
+
(SAMPLE(?title) AS ?docTitle) WHERE {
|
|
196
235
|
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
197
236
|
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
198
237
|
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
@@ -205,7 +244,7 @@ SELECT DISTINCT ?work ?celexNumber ?type ?date ?title WHERE {
|
|
|
205
244
|
${authorClause}
|
|
206
245
|
${inForceClause}
|
|
207
246
|
${filters.join('\n ')}
|
|
208
|
-
} ORDER BY DESC(?
|
|
247
|
+
} GROUP BY ?work ORDER BY DESC(?docDate) LIMIT ${input.limit} OFFSET ${input.offset}`;
|
|
209
248
|
const queryEcho = {
|
|
210
249
|
...(input.keyword ? { keyword: input.keyword } : {}),
|
|
211
250
|
...(input.document_type ? { document_type: input.document_type } : {}),
|
|
@@ -231,15 +270,15 @@ SELECT DISTINCT ?work ?celexNumber ?type ?date ?title WHERE {
|
|
|
231
270
|
const documents = bindings.map((b) => {
|
|
232
271
|
const doc = {
|
|
233
272
|
work_uri: CellarSparqlService.bindingValue(b, 'work') ?? '',
|
|
234
|
-
celex_number: CellarSparqlService.bindingValue(b, '
|
|
273
|
+
celex_number: CellarSparqlService.bindingValue(b, 'celex') ?? '',
|
|
235
274
|
};
|
|
236
|
-
const
|
|
237
|
-
if (
|
|
238
|
-
doc.resource_type =
|
|
239
|
-
const date = CellarSparqlService.bindingValue(b, '
|
|
275
|
+
const resourceType = resolveResourceTypeLabels(CellarSparqlService.bindingValue(b, 'types'));
|
|
276
|
+
if (resourceType)
|
|
277
|
+
doc.resource_type = resourceType;
|
|
278
|
+
const date = CellarSparqlService.bindingValue(b, 'docDate');
|
|
240
279
|
if (date)
|
|
241
280
|
doc.date = date;
|
|
242
|
-
const title = CellarSparqlService.bindingValue(b, '
|
|
281
|
+
const title = CellarSparqlService.bindingValue(b, 'docTitle');
|
|
243
282
|
if (title)
|
|
244
283
|
doc.title = title;
|
|
245
284
|
return doc;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-search-documents.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-search-documents.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"eurlex-search-documents.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-search-documents.tool.ts"],"names":[],"mappings":"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"}
|