@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.
Files changed (81) hide show
  1. package/AGENTS.md +383 -0
  2. package/CLAUDE.md +383 -0
  3. package/Dockerfile +99 -0
  4. package/LICENSE +201 -0
  5. package/README.md +343 -0
  6. package/changelog/0.1.x/0.1.1.md +31 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +16 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +43 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +8 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +30 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.d.ts +10 -0
  17. package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.d.ts.map +1 -0
  18. package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.js +60 -0
  19. package/dist/mcp-server/prompts/definitions/eurlex-comparative-analysis.prompt.js.map +1 -0
  20. package/dist/mcp-server/prompts/definitions/index.d.ts +9 -0
  21. package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
  22. package/dist/mcp-server/prompts/definitions/index.js +7 -0
  23. package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.d.ts +9 -0
  25. package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.js +91 -0
  27. package/dist/mcp-server/resources/definitions/eurlex-document-relations.resource.js.map +1 -0
  28. package/dist/mcp-server/resources/definitions/eurlex-document.resource.d.ts +9 -0
  29. package/dist/mcp-server/resources/definitions/eurlex-document.resource.d.ts.map +1 -0
  30. package/dist/mcp-server/resources/definitions/eurlex-document.resource.js +61 -0
  31. package/dist/mcp-server/resources/definitions/eurlex-document.resource.js.map +1 -0
  32. package/dist/mcp-server/resources/definitions/index.d.ts +8 -0
  33. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  34. package/dist/mcp-server/resources/definitions/index.js +11 -0
  35. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.d.ts +25 -0
  37. package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.js +121 -0
  39. package/dist/mcp-server/tools/definitions/eurlex-browse-subjects.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.d.ts +44 -0
  41. package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.js +189 -0
  43. package/dist/mcp-server/tools/definitions/eurlex-get-cases.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.d.ts +46 -0
  45. package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.js +222 -0
  47. package/dist/mcp-server/tools/definitions/eurlex-get-document.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.d.ts +38 -0
  49. package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.js +203 -0
  51. package/dist/mcp-server/tools/definitions/eurlex-get-relations.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.d.ts +32 -0
  53. package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.js +152 -0
  55. package/dist/mcp-server/tools/definitions/eurlex-lookup-celex.tool.js.map +1 -0
  56. package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.d.ts +25 -0
  57. package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.js +104 -0
  59. package/dist/mcp-server/tools/definitions/eurlex-query-sparql.tool.js.map +1 -0
  60. package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.d.ts +47 -0
  61. package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.d.ts.map +1 -0
  62. package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.js +203 -0
  63. package/dist/mcp-server/tools/definitions/eurlex-search-documents.tool.js.map +1 -0
  64. package/dist/mcp-server/tools/definitions/index.d.ts +207 -0
  65. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  66. package/dist/mcp-server/tools/definitions/index.js +21 -0
  67. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  68. package/dist/services/cellar-sparql/cellar-sparql-service.d.ts +27 -0
  69. package/dist/services/cellar-sparql/cellar-sparql-service.d.ts.map +1 -0
  70. package/dist/services/cellar-sparql/cellar-sparql-service.js +123 -0
  71. package/dist/services/cellar-sparql/cellar-sparql-service.js.map +1 -0
  72. package/dist/services/cellar-sparql/types.d.ts +62 -0
  73. package/dist/services/cellar-sparql/types.d.ts.map +1 -0
  74. package/dist/services/cellar-sparql/types.js +6 -0
  75. package/dist/services/cellar-sparql/types.js.map +1 -0
  76. package/dist/services/eurlex-content/eurlex-content-service.d.ts +45 -0
  77. package/dist/services/eurlex-content/eurlex-content-service.d.ts.map +1 -0
  78. package/dist/services/eurlex-content/eurlex-content-service.js +93 -0
  79. package/dist/services/eurlex-content/eurlex-content-service.js.map +1 -0
  80. package/package.json +105 -0
  81. package/server.json +161 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview eurlex_search_documents — Search EU legislation, case law, and preparatory acts.
3
+ * @module mcp-server/tools/definitions/eurlex-search-documents
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const eurlex_search_documents: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ keyword: z.ZodOptional<z.ZodString>;
9
+ document_type: z.ZodOptional<z.ZodEnum<{
10
+ REG: "REG";
11
+ DIR: "DIR";
12
+ DEC: "DEC";
13
+ TREATY: "TREATY";
14
+ JUDG: "JUDG";
15
+ OPIN_AG: "OPIN_AG";
16
+ PROP: "PROP";
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>;
22
+ author_institution: z.ZodOptional<z.ZodString>;
23
+ in_force: z.ZodOptional<z.ZodBoolean>;
24
+ offset: z.ZodDefault<z.ZodNumber>;
25
+ limit: z.ZodDefault<z.ZodNumber>;
26
+ }, z.core.$strip>, z.ZodObject<{
27
+ documents: z.ZodArray<z.ZodObject<{
28
+ work_uri: z.ZodString;
29
+ celex_number: z.ZodString;
30
+ resource_type: z.ZodOptional<z.ZodString>;
31
+ date: z.ZodOptional<z.ZodString>;
32
+ title: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>>;
34
+ total: z.ZodNumber;
35
+ offset: z.ZodNumber;
36
+ }, z.core.$strip>, readonly [{
37
+ readonly reason: "no_results";
38
+ readonly code: JsonRpcErrorCode.NotFound;
39
+ readonly when: "The query returned zero bindings — no matching documents in CELLAR.";
40
+ readonly recovery: "Broaden the search by removing filters, trying a shorter keyword, or expanding the date range.";
41
+ }, {
42
+ readonly reason: "sparql_error";
43
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
44
+ readonly when: "Virtuoso returned HTTP 200 with an error body — query malformed or timed out.";
45
+ readonly recovery: "Simplify the query or reduce the date range and retry.";
46
+ }], undefined>;
47
+ //# sourceMappingURL=eurlex-search-documents.tool.d.ts.map
@@ -0,0 +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;AAkBjE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2NlC,CAAC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * @fileoverview eurlex_search_documents — Search EU legislation, case law, and preparatory acts.
3
+ * @module mcp-server/tools/definitions/eurlex-search-documents
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 resource type URIs for common document categories. */
9
+ const DOCUMENT_TYPE_URIS = {
10
+ REG: 'http://publications.europa.eu/resource/authority/resource-type/REG',
11
+ DIR: 'http://publications.europa.eu/resource/authority/resource-type/DIR',
12
+ DEC: 'http://publications.europa.eu/resource/authority/resource-type/DEC',
13
+ TREATY: 'http://publications.europa.eu/resource/authority/resource-type/TREATY',
14
+ JUDG: 'http://publications.europa.eu/resource/authority/resource-type/JUDG',
15
+ OPIN_AG: 'http://publications.europa.eu/resource/authority/resource-type/OPIN_AG',
16
+ PROP: 'http://publications.europa.eu/resource/authority/resource-type/PROP_DIR',
17
+ REC: 'http://publications.europa.eu/resource/authority/resource-type/REC_SOFT',
18
+ };
19
+ export const eurlex_search_documents = tool('eurlex_search_documents', {
20
+ title: 'Search EU Documents',
21
+ description: 'Search EU legislation, treaties, and preparatory acts across the CELLAR corpus of 2.7M+ works. ' +
22
+ 'Filters by document type, date range, EuroVoc subject concept, author institution, and in-force status. ' +
23
+ 'Keyword search applies to document titles and CELEX strings only — full-text body search is not available via this API. ' +
24
+ 'For multi-word searches, supply a single dominant keyword; use other filters to narrow results. ' +
25
+ 'Returns CELEX numbers, work URIs, document types, and dates — use these with eurlex_get_document to fetch full content. ' +
26
+ 'To filter by EuroVoc subject, first call eurlex_browse_subjects to obtain the concept URI. ' +
27
+ 'Case law (CJEU/GC judgments) is better searched via eurlex_get_cases which has court-specific parameters.',
28
+ annotations: { readOnlyHint: true, openWorldHint: true },
29
+ input: z.object({
30
+ keyword: z
31
+ .string()
32
+ .optional()
33
+ .describe('Keyword to match against document titles. Single dominant word recommended; multi-word phrase uses substring match.'),
34
+ document_type: z
35
+ .enum(['REG', 'DIR', 'DEC', 'TREATY', 'JUDG', 'OPIN_AG', 'PROP', 'REC'])
36
+ .optional()
37
+ .describe('Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, ' +
38
+ 'JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation.'),
39
+ date_from: z
40
+ .string()
41
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
42
+ .optional()
43
+ .describe('Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date.'),
44
+ date_to: z
45
+ .string()
46
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
47
+ .optional()
48
+ .describe('End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date.'),
49
+ eurovoc_concept: z
50
+ .string()
51
+ .startsWith('http')
52
+ .refine((v) => !v.includes('>') && !v.includes('"') && !v.includes(' '), {
53
+ message: 'EuroVoc URI must be a valid http URI with no angle brackets, quotes, or spaces.',
54
+ })
55
+ .optional()
56
+ .describe('EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828). ' +
57
+ 'Obtain concept URIs from eurlex_browse_subjects first.'),
58
+ author_institution: z
59
+ .string()
60
+ .optional()
61
+ .describe('Author institution name filter (e.g. "European Parliament", "Council"). Substring match.'),
62
+ in_force: z
63
+ .boolean()
64
+ .optional()
65
+ .describe('If true, restrict to acts currently in force. Omit to return all regardless of in-force status.'),
66
+ offset: z
67
+ .number()
68
+ .int()
69
+ .min(0)
70
+ .default(0)
71
+ .describe('Pagination offset — number of results to skip. Defaults to 0.'),
72
+ limit: z
73
+ .number()
74
+ .int()
75
+ .min(1)
76
+ .max(100)
77
+ .default(20)
78
+ .describe('Maximum number of results to return (1–100). Defaults to 20.'),
79
+ }),
80
+ output: z.object({
81
+ documents: z
82
+ .array(z
83
+ .object({
84
+ work_uri: z.string().describe('CELLAR work URI (stable resource identifier).'),
85
+ celex_number: z.string().describe('CELEX identifier for the work.'),
86
+ resource_type: z
87
+ .string()
88
+ .optional()
89
+ .describe('CDM resource type URI indicating the document category (e.g. .../resource-type/REG for Regulation). Absent for some older works.'),
90
+ date: z.string().optional().describe('Document date in ISO 8601 format (YYYY-MM-DD).'),
91
+ title: z
92
+ .string()
93
+ .optional()
94
+ .describe('Document title in English where available; absent for many older works and judgments.'),
95
+ })
96
+ .describe('A single EU legislative work with its CELEX number, type, and date.'))
97
+ .describe('Matching EU documents ordered by date descending.'),
98
+ total: z
99
+ .number()
100
+ .describe('Number of documents returned in this page (not a corpus-wide count).'),
101
+ offset: z.number().describe('Pagination offset used for this response.'),
102
+ }),
103
+ errors: [
104
+ {
105
+ reason: 'no_results',
106
+ code: JsonRpcErrorCode.NotFound,
107
+ when: 'The query returned zero bindings — no matching documents in CELLAR.',
108
+ recovery: 'Broaden the search by removing filters, trying a shorter keyword, or expanding the date range.',
109
+ },
110
+ {
111
+ reason: 'sparql_error',
112
+ code: JsonRpcErrorCode.ServiceUnavailable,
113
+ when: 'Virtuoso returned HTTP 200 with an error body — query malformed or timed out.',
114
+ recovery: 'Simplify the query or reduce the date range and retry.',
115
+ },
116
+ ],
117
+ async handler(input, ctx) {
118
+ const svc = getCellarSparqlService();
119
+ const filters = [];
120
+ if (input.keyword && input.keyword.trim()) {
121
+ const kw = input.keyword.trim().toLowerCase().replace(/"/g, '\\"');
122
+ filters.push(`FILTER(CONTAINS(LCASE(COALESCE(STR(?title), "")), "${kw}") || CONTAINS(LCASE(STR(?celexNumber)), "${kw}"))`);
123
+ }
124
+ if (input.document_type) {
125
+ const typeUri = DOCUMENT_TYPE_URIS[input.document_type];
126
+ if (typeUri) {
127
+ filters.push(`FILTER(?type = <${typeUri}>)`);
128
+ }
129
+ }
130
+ if (input.date_from && input.date_from.trim()) {
131
+ filters.push(`FILTER(?date >= "${input.date_from.trim()}"^^xsd:date)`);
132
+ }
133
+ if (input.date_to && input.date_to.trim()) {
134
+ filters.push(`FILTER(?date <= "${input.date_to.trim()}"^^xsd:date)`);
135
+ }
136
+ if (input.in_force === true) {
137
+ filters.push(`FILTER(?inForce = true)`);
138
+ }
139
+ const eurovocClause = input.eurovoc_concept && input.eurovoc_concept.trim()
140
+ ? `?work cdm:work_is_about_concept_eurovoc <${input.eurovoc_concept.trim()}> .`
141
+ : '';
142
+ const authorClause = input.author_institution && input.author_institution.trim()
143
+ ? `OPTIONAL { ?work cdm:work_created_by_agent ?agent . ?agent cdm:corporate-body_label ?agentLabel . FILTER(LANG(?agentLabel) = "en") FILTER(CONTAINS(LCASE(STR(?agentLabel)), "${input.author_institution.trim().toLowerCase().replace(/"/g, '\\"')}")) }`
144
+ : '';
145
+ const inForceClause = input.in_force === true ? `OPTIONAL { ?work cdm:resource_legal_in-force ?inForce . }` : '';
146
+ const sparql = `
147
+ SELECT DISTINCT ?work ?celexNumber ?type ?date ?title WHERE {
148
+ ?work cdm:resource_legal_id_celex ?celexNumber .
149
+ OPTIONAL { ?work cdm:work_has_resource-type ?type . }
150
+ OPTIONAL { ?work cdm:work_date_document ?date . }
151
+ OPTIONAL { ?work cdm:work_title ?titleNode . ?titleNode cdm:expression_title ?title . FILTER(LANG(?title) = "en") }
152
+ ${eurovocClause}
153
+ ${authorClause}
154
+ ${inForceClause}
155
+ ${filters.join('\n ')}
156
+ } ORDER BY DESC(?date) LIMIT ${input.limit} OFFSET ${input.offset}`;
157
+ const bindings = await svc.query(sparql, ctx);
158
+ ctx.log.info('Document search', {
159
+ keyword: input.keyword,
160
+ documentType: input.document_type,
161
+ resultCount: bindings.length,
162
+ offset: input.offset,
163
+ });
164
+ if (bindings.length === 0) {
165
+ throw ctx.fail('no_results', 'No documents matched the search criteria.', {
166
+ ...ctx.recoveryFor('no_results'),
167
+ });
168
+ }
169
+ const documents = bindings.map((b) => {
170
+ const doc = {
171
+ work_uri: CellarSparqlService.bindingValue(b, 'work') ?? '',
172
+ celex_number: CellarSparqlService.bindingValue(b, 'celexNumber') ?? '',
173
+ };
174
+ const type = CellarSparqlService.bindingValue(b, 'type');
175
+ if (type)
176
+ doc.resource_type = type;
177
+ const date = CellarSparqlService.bindingValue(b, 'date');
178
+ if (date)
179
+ doc.date = date;
180
+ const title = CellarSparqlService.bindingValue(b, 'title');
181
+ if (title)
182
+ doc.title = title;
183
+ return doc;
184
+ });
185
+ return { documents, total: documents.length, offset: input.offset };
186
+ },
187
+ format: (result) => {
188
+ const lines = [
189
+ `## EU Documents (${result.total} results, offset ${result.offset})\n`,
190
+ ];
191
+ for (const doc of result.documents) {
192
+ lines.push(`### ${doc.celex_number}${doc.title ? ` — ${doc.title}` : ''}`);
193
+ if (doc.date)
194
+ lines.push(`**Date:** ${doc.date}`);
195
+ if (doc.resource_type)
196
+ lines.push(`**Type:** ${doc.resource_type}`);
197
+ lines.push(`**Work URI:** ${doc.work_uri}`);
198
+ lines.push('');
199
+ }
200
+ return [{ type: 'text', text: lines.join('\n') }];
201
+ },
202
+ });
203
+ //# sourceMappingURL=eurlex-search-documents.tool.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * @fileoverview Barrel export for all EUR-Lex MCP tool definitions.
3
+ * @module mcp-server/tools/definitions/index
4
+ */
5
+ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
6
+ keyword: import("zod").ZodString;
7
+ language: import("zod").ZodDefault<import("zod").ZodString>;
8
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
9
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
10
+ concepts: import("zod").ZodArray<import("zod").ZodObject<{
11
+ concept_uri: import("zod").ZodString;
12
+ pref_label: import("zod").ZodString;
13
+ concept_code: import("zod").ZodOptional<import("zod").ZodString>;
14
+ broader_label: import("zod").ZodOptional<import("zod").ZodString>;
15
+ }, import("zod/v4/core").$strip>>;
16
+ total: import("zod").ZodNumber;
17
+ }, import("zod/v4/core").$strip>, readonly [{
18
+ readonly reason: "no_concepts";
19
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
20
+ readonly when: "No EuroVoc concepts matched the keyword in the requested language.";
21
+ readonly recovery: "Try a broader or simpler term, or retry with language \"en\" for wider coverage.";
22
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
23
+ case_number: import("zod").ZodOptional<import("zod").ZodString>;
24
+ keyword: import("zod").ZodOptional<import("zod").ZodString>;
25
+ court: import("zod").ZodOptional<import("zod").ZodEnum<{
26
+ CJEU: "CJEU";
27
+ GC: "GC";
28
+ }>>;
29
+ case_type: import("zod").ZodOptional<import("zod").ZodEnum<{
30
+ judgment: "judgment";
31
+ order: "order";
32
+ ag_opinion: "ag_opinion";
33
+ }>>;
34
+ date_from: import("zod").ZodOptional<import("zod").ZodString>;
35
+ date_to: import("zod").ZodOptional<import("zod").ZodString>;
36
+ offset: import("zod").ZodDefault<import("zod").ZodNumber>;
37
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
38
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
39
+ cases: import("zod").ZodArray<import("zod").ZodObject<{
40
+ work_uri: import("zod").ZodString;
41
+ celex_number: import("zod").ZodString;
42
+ resource_type: import("zod").ZodOptional<import("zod").ZodString>;
43
+ date: import("zod").ZodOptional<import("zod").ZodString>;
44
+ title: import("zod").ZodOptional<import("zod").ZodString>;
45
+ }, import("zod/v4/core").$strip>>;
46
+ total: import("zod").ZodNumber;
47
+ offset: import("zod").ZodNumber;
48
+ }, import("zod/v4/core").$strip>, readonly [{
49
+ readonly reason: "no_results";
50
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
51
+ readonly when: "The query returned zero bindings — no matching cases in CELLAR sector 6.";
52
+ readonly recovery: "Try a different keyword, broader date range, or remove the court/case_type filter.";
53
+ }, {
54
+ readonly reason: "sparql_error";
55
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
56
+ readonly when: "Virtuoso returned HTTP 200 with an error body — query malformed or timed out.";
57
+ readonly recovery: "Simplify the query or reduce the date range and retry.";
58
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
59
+ celex_number: import("zod").ZodString;
60
+ eli_uri: import("zod").ZodOptional<import("zod").ZodString>;
61
+ language: import("zod").ZodDefault<import("zod").ZodString>;
62
+ format: import("zod").ZodDefault<import("zod").ZodEnum<{
63
+ html: "html";
64
+ xml: "xml";
65
+ }>>;
66
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
67
+ celex_number: import("zod").ZodString;
68
+ work_uri: import("zod").ZodOptional<import("zod").ZodString>;
69
+ title: import("zod").ZodOptional<import("zod").ZodString>;
70
+ date: import("zod").ZodOptional<import("zod").ZodString>;
71
+ resource_type: import("zod").ZodOptional<import("zod").ZodString>;
72
+ author_institution: import("zod").ZodOptional<import("zod").ZodString>;
73
+ legal_basis: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
74
+ eurovoc_subjects: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
75
+ in_force: import("zod").ZodOptional<import("zod").ZodBoolean>;
76
+ content: import("zod").ZodOptional<import("zod").ZodString>;
77
+ content_available: import("zod").ZodBoolean;
78
+ language: import("zod").ZodString;
79
+ language_fallback: import("zod").ZodOptional<import("zod").ZodString>;
80
+ content_format: import("zod").ZodString;
81
+ }, import("zod/v4/core").$strip>, readonly [{
82
+ readonly reason: "not_found";
83
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
84
+ readonly when: "CELEX number not found in CELLAR — the work does not exist in the corpus.";
85
+ readonly recovery: "Verify the CELEX number or use eurlex_lookup_celex to confirm it exists.";
86
+ }, {
87
+ readonly reason: "language_unavailable";
88
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
89
+ readonly when: "Requested language has no content in EUR-Lex after fallback to English also failed.";
90
+ readonly recovery: "Retry with language \"EN\" explicitly, or accept content_available: false and use metadata only.";
91
+ }, {
92
+ readonly reason: "content_fetch_failed";
93
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
94
+ readonly when: "EUR-Lex content API returned non-200 after language fallback attempts.";
95
+ readonly recovery: "The EUR-Lex content API may be temporarily unavailable. Retry after a short delay.";
96
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
97
+ celex_number: import("zod").ZodString;
98
+ work_uri: import("zod").ZodOptional<import("zod").ZodString>;
99
+ relation_types: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
100
+ cites: "cites";
101
+ amends: "amends";
102
+ amended_by: "amended_by";
103
+ legal_basis: "legal_basis";
104
+ consolidated_version: "consolidated_version";
105
+ }>>>;
106
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
107
+ celex_number: import("zod").ZodString;
108
+ work_uri: import("zod").ZodOptional<import("zod").ZodString>;
109
+ relations: import("zod").ZodArray<import("zod").ZodObject<{
110
+ relation_type: import("zod").ZodString;
111
+ direction: import("zod").ZodString;
112
+ related_work_uri: import("zod").ZodString;
113
+ related_celex_number: import("zod").ZodOptional<import("zod").ZodString>;
114
+ }, import("zod/v4/core").$strip>>;
115
+ total: import("zod").ZodNumber;
116
+ }, import("zod/v4/core").$strip>, readonly [{
117
+ readonly reason: "not_found";
118
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
119
+ readonly when: "CELEX/work URI not found in CELLAR — resolve the identifier with eurlex_lookup_celex first.";
120
+ readonly recovery: "Use eurlex_lookup_celex to confirm the CELEX number exists, then retry.";
121
+ }, {
122
+ readonly reason: "no_relations";
123
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
124
+ readonly when: "Work exists but has no CDM relations of the requested types.";
125
+ readonly recovery: "Try other relation_types or omit the filter to fetch all available relation types.";
126
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
127
+ identifier: import("zod").ZodString;
128
+ identifier_type: import("zod").ZodDefault<import("zod").ZodEnum<{
129
+ auto: "auto";
130
+ celex: "celex";
131
+ eli: "eli";
132
+ oj: "oj";
133
+ }>>;
134
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
135
+ found: import("zod").ZodBoolean;
136
+ work_uri: import("zod").ZodOptional<import("zod").ZodString>;
137
+ celex_number: import("zod").ZodOptional<import("zod").ZodString>;
138
+ resource_type: import("zod").ZodOptional<import("zod").ZodString>;
139
+ date: import("zod").ZodOptional<import("zod").ZodString>;
140
+ }, import("zod/v4/core").$strip>, readonly [{
141
+ readonly reason: "not_found";
142
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
143
+ readonly when: "The identifier resolves to no CELLAR work — check the CELEX/ELI/OJ format and try again.";
144
+ readonly recovery: "Verify the CELEX number format or try eurlex_search_documents to find the work by keyword.";
145
+ }, {
146
+ readonly reason: "ambiguous_identifier";
147
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
148
+ readonly when: "identifier_type is \"auto\" and the identifier format could not be determined.";
149
+ readonly recovery: "Supply identifier_type explicitly as \"celex\", \"eli\", or \"oj\" to resolve the ambiguity.";
150
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
151
+ sparql_query: import("zod").ZodString;
152
+ timeout_hint: import("zod").ZodOptional<import("zod").ZodNumber>;
153
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
154
+ bindings: import("zod").ZodArray<import("zod").ZodObject<{}, import("zod/v4/core").$loose>>;
155
+ variables: import("zod").ZodArray<import("zod").ZodString>;
156
+ total: import("zod").ZodNumber;
157
+ }, import("zod/v4/core").$strip>, readonly [{
158
+ readonly reason: "sparql_error";
159
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
160
+ readonly when: "Virtuoso returned a syntax or semantic error — the query is malformed.";
161
+ readonly recovery: "Fix the SPARQL query syntax, ensure predicates use the cdm: prefix, and verify variable names.";
162
+ }, {
163
+ readonly reason: "sparql_timeout";
164
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
165
+ readonly when: "Query exceeded the 60-second Virtuoso hard limit.";
166
+ readonly recovery: "Add more specific FILTER conditions, reduce the scope, or use LIMIT with a smaller value.";
167
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
168
+ keyword: import("zod").ZodOptional<import("zod").ZodString>;
169
+ document_type: import("zod").ZodOptional<import("zod").ZodEnum<{
170
+ REG: "REG";
171
+ DIR: "DIR";
172
+ DEC: "DEC";
173
+ TREATY: "TREATY";
174
+ JUDG: "JUDG";
175
+ OPIN_AG: "OPIN_AG";
176
+ PROP: "PROP";
177
+ REC: "REC";
178
+ }>>;
179
+ date_from: import("zod").ZodOptional<import("zod").ZodString>;
180
+ date_to: import("zod").ZodOptional<import("zod").ZodString>;
181
+ eurovoc_concept: import("zod").ZodOptional<import("zod").ZodString>;
182
+ author_institution: import("zod").ZodOptional<import("zod").ZodString>;
183
+ in_force: import("zod").ZodOptional<import("zod").ZodBoolean>;
184
+ offset: import("zod").ZodDefault<import("zod").ZodNumber>;
185
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
186
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
187
+ documents: import("zod").ZodArray<import("zod").ZodObject<{
188
+ work_uri: import("zod").ZodString;
189
+ celex_number: import("zod").ZodString;
190
+ resource_type: import("zod").ZodOptional<import("zod").ZodString>;
191
+ date: import("zod").ZodOptional<import("zod").ZodString>;
192
+ title: import("zod").ZodOptional<import("zod").ZodString>;
193
+ }, import("zod/v4/core").$strip>>;
194
+ total: import("zod").ZodNumber;
195
+ offset: import("zod").ZodNumber;
196
+ }, import("zod/v4/core").$strip>, readonly [{
197
+ readonly reason: "no_results";
198
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
199
+ readonly when: "The query returned zero bindings — no matching documents in CELLAR.";
200
+ readonly recovery: "Broaden the search by removing filters, trying a shorter keyword, or expanding the date range.";
201
+ }, {
202
+ readonly reason: "sparql_error";
203
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
204
+ readonly when: "Virtuoso returned HTTP 200 with an error body — query malformed or timed out.";
205
+ readonly recovery: "Simplify the query or reduce the date range and retry.";
206
+ }], undefined>)[];
207
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ9B,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Barrel export for all EUR-Lex MCP tool definitions.
3
+ * @module mcp-server/tools/definitions/index
4
+ */
5
+ import { eurlex_browse_subjects } from './eurlex-browse-subjects.tool.js';
6
+ import { eurlex_get_cases } from './eurlex-get-cases.tool.js';
7
+ import { eurlex_get_document } from './eurlex-get-document.tool.js';
8
+ import { eurlex_get_relations } from './eurlex-get-relations.tool.js';
9
+ import { eurlex_lookup_celex } from './eurlex-lookup-celex.tool.js';
10
+ import { eurlex_query_sparql } from './eurlex-query-sparql.tool.js';
11
+ import { eurlex_search_documents } from './eurlex-search-documents.tool.js';
12
+ export const allToolDefinitions = [
13
+ eurlex_lookup_celex,
14
+ eurlex_browse_subjects,
15
+ eurlex_search_documents,
16
+ eurlex_get_cases,
17
+ eurlex_get_document,
18
+ eurlex_get_relations,
19
+ eurlex_query_sparql,
20
+ ];
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,mBAAmB;IACnB,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;CACpB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fileoverview CellarSparqlService — HTTP client for the EU Publications Office CELLAR
3
+ * Virtuoso SPARQL endpoint. Handles POST queries, LIMIT enforcement, and Virtuoso-specific
4
+ * error detection (HTTP 200 with error body).
5
+ * @module services/cellar-sparql/cellar-sparql-service
6
+ */
7
+ import type { Context } from '@cyanheads/mcp-ts-core';
8
+ import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
9
+ import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
10
+ import type { ServerConfig } from '../../config/server-config.js';
11
+ import type { SparqlBinding } from './types.js';
12
+ export declare class CellarSparqlService {
13
+ private readonly endpoint;
14
+ private readonly timeoutMs;
15
+ private readonly maxResults;
16
+ constructor(_config: AppConfig, _storage: StorageService, serverConfig: ServerConfig);
17
+ /**
18
+ * Execute a raw SPARQL SELECT query. Prefixes are prepended automatically
19
+ * if not already present. LIMIT is injected/capped at `maxResults`.
20
+ */
21
+ query(rawQuery: string, ctx: Context): Promise<SparqlBinding[]>;
22
+ /** Extract a string value from a binding field, returning undefined if absent. */
23
+ static bindingValue(binding: SparqlBinding | undefined, field: string): string | undefined;
24
+ }
25
+ export declare function initCellarSparqlService(config: AppConfig, storage: StorageService, serverConfig: ServerConfig): void;
26
+ export declare function getCellarSparqlService(): CellarSparqlService;
27
+ //# sourceMappingURL=cellar-sparql-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cellar-sparql-service.d.ts","sourceRoot":"","sources":["../../../src/services/cellar-sparql/cellar-sparql-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AA8BnE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY;IAMpF;;;OAGG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuErE,kFAAkF;IAClF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG3F;AAMD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,YAAY,GACzB,IAAI,CAEN;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAO5D"}