@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
package/AGENTS.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Developer Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** eur-lex-mcp-server
|
|
4
|
-
**Version:** 0.1
|
|
4
|
+
**Version:** 0.2.1
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.9`
|
|
6
6
|
**Engines:** Bun ≥1.3.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
|
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Developer Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** eur-lex-mcp-server
|
|
4
|
-
**Version:** 0.1
|
|
4
|
+
**Version:** 0.2.1
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.9`
|
|
6
6
|
**Engines:** Bun ≥1.3.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/eur-lex-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/eur-lex-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "eurlex_get_document accepts eli_uri and eurlex_get_relations accepts work_uri as functional identifier alternatives (exactly one of the pair required); eurlex_browse_subjects restricts results to EuroVoc concepts so every concept_uri is usable as an eurovoc_concept filter"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.0 — 2026-06-30
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`eli_uri` on `eurlex_get_document`** ([#8](https://github.com/cyanheads/eur-lex-mcp-server/issues/8)) — accepts a work-level ELI URI (e.g. `http://data.europa.eu/eli/reg/2016/679`, with or without `/oj`) as an alternative to `celex_number`, resolved to its CELLAR work by an exact `cdm:resource_legal_eli` match with a bare-work `/oj` retry. The resolution is now shared with `eurlex_lookup_celex` via the new `services/cellar-sparql/eli-resolution.ts`.
|
|
12
|
+
- **`work_uri` on `eurlex_get_relations`** ([#8](https://github.com/cyanheads/eur-lex-mcp-server/issues/8)) — accepts a CELLAR work resource URI used directly to seed the relation traversal, skipping the CELEX→work resolution step.
|
|
13
|
+
|
|
14
|
+
## Changed
|
|
15
|
+
|
|
16
|
+
- **`celex_number` is now optional** on `eurlex_get_document` and `eurlex_get_relations` ([#8](https://github.com/cyanheads/eur-lex-mcp-server/issues/8)) — each call takes exactly one of its identifier pair. Passing neither or both raises a new `invalid_identifier_args` (`ValidationError`), and an empty-string field from form-based clients is treated as absent. Existing `celex_number`-only calls are unaffected.
|
|
17
|
+
- **`eurlex_get_relations` output** ([#8](https://github.com/cyanheads/eur-lex-mcp-server/issues/8)) — `work_uri` is now always present; `celex_number` is now optional, omitted when the work was addressed directly by `work_uri`.
|
|
18
|
+
|
|
19
|
+
## Fixed
|
|
20
|
+
|
|
21
|
+
- **Advertised URI alternatives were unreachable** ([#8](https://github.com/cyanheads/eur-lex-mcp-server/issues/8)) — `eli_uri` (`eurlex_get_document`) and `work_uri` (`eurlex_get_relations`) were documented as alternatives, but a required `celex_number` meant they could never be supplied alone. Both now resolve.
|
|
22
|
+
- **`eurlex_browse_subjects` returned unusable URIs** ([#11](https://github.com/cyanheads/eur-lex-mcp-server/issues/11)) — a `STRSTARTS` filter limits results to the `http://eurovoc.europa.eu/` namespace, so every returned `concept_uri` works in the `eurlex_search_documents` `eurovoc_concept` filter. Other Publications Office authority concepts (e.g. `class-sum-leg`, `fd_*`), which that filter cannot match, are no longer returned.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "eurlex_search_documents and eurlex_get_cases return one row per work, so multi-resource-type works (corrigenda) no longer duplicate or miscount LIMIT/total; constrained optional filters now accept empty string from form-based clients"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.1 — 2026-06-30
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **`resource_type` may be comma-joined** ([#14](https://github.com/cyanheads/eur-lex-mcp-server/issues/14)) — on `eurlex_search_documents` and `eurlex_get_cases`, a work classified under several CDM resource-types (e.g. corrigenda) now reports all of them as one de-duplicated, sorted, comma-separated label string instead of a single arbitrary type. The field stays a `string`. New `resolveResourceTypeLabels` helper in `services/cellar-sparql/cdm-labels.ts`.
|
|
12
|
+
|
|
13
|
+
## Fixed
|
|
14
|
+
|
|
15
|
+
- **Multi-resource-type works returned duplicate rows** ([#14](https://github.com/cyanheads/eur-lex-mcp-server/issues/14)) — the shared search query used `SELECT DISTINCT`, so a work carrying several `cdm:work_has_resource-type` values (corrigenda hold two or three) cross-produced into one row per type, which `DISTINCT` could not merge. The query now `GROUP BY ?work` with `GROUP_CONCAT(DISTINCT …)` for the resource-type and `SAMPLE` for the single-valued fields, returning one row per work. `LIMIT`/`OFFSET` and `total` now bound distinct works rather than raw rows. Affects `eurlex_search_documents` and `eurlex_get_cases`.
|
|
16
|
+
- **Optional filters rejected empty strings from form-based clients** ([#15](https://github.com/cyanheads/eur-lex-mcp-server/issues/15)) — form clients that send `""` for a blank optional field hit a `-32602` validation error on the constrained filters. `document_type`, `date_from`, `date_to`, and `eurovoc_concept` (`eurlex_search_documents`) plus `court`, `case_type`, `date_from`, and `date_to` (`eurlex_get_cases`) now accept `""` as "filter absent" via a `z.union` with a literal-empty variant; a non-empty value still must satisfy its original constraint.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-browse-subjects.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-browse-subjects.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-browse-subjects.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-browse-subjects.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgBjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;cAqIjC,CAAC"}
|
|
@@ -5,11 +5,22 @@
|
|
|
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
|
+
/**
|
|
9
|
+
* Namespace of actual EuroVoc concepts. CELLAR's skos:Concept space also holds
|
|
10
|
+
* other Publications Office authority concepts (class-sum-leg, fd_*, …) whose
|
|
11
|
+
* URIs the eurlex_search_documents `eurovoc_concept` filter accepts but cannot
|
|
12
|
+
* match — only `http://eurovoc.europa.eu/` concepts are bound by
|
|
13
|
+
* `cdm:work_is_about_concept_eurovoc`. Results are restricted to this namespace
|
|
14
|
+
* so every URI returned is usable in that filter (#11).
|
|
15
|
+
*/
|
|
16
|
+
const EUROVOC_CONCEPT_NAMESPACE = 'http://eurovoc.europa.eu/';
|
|
8
17
|
export const eurlex_browse_subjects = tool('eurlex_browse_subjects', {
|
|
9
18
|
title: 'Browse EuroVoc Subjects',
|
|
10
19
|
description: 'Search the EuroVoc multilingual thesaurus to resolve a human-readable term or keyword into EuroVoc concept IDs. ' +
|
|
11
20
|
'This tool is required before using the eurovoc_concept filter in eurlex_search_documents — ' +
|
|
12
21
|
'agents cannot guess numeric EuroVoc concept IDs. ' +
|
|
22
|
+
'Every returned concept_uri is a EuroVoc concept (http://eurovoc.europa.eu/…) directly usable in that filter; ' +
|
|
23
|
+
'other Publications Office authority concepts are excluded because the filter cannot match them. ' +
|
|
13
24
|
'Returns concept URI, preferred label in the requested language, concept code, and broader/narrower hierarchy hints. ' +
|
|
14
25
|
'EuroVoc covers all EU policy domains: agriculture, environment, finance, health, trade, transport, and more. ' +
|
|
15
26
|
'If no results are found in a non-English language, retry with language "en" and a broader English term.',
|
|
@@ -75,6 +86,7 @@ SELECT ?concept ?label ?code ?broaderLabel WHERE {
|
|
|
75
86
|
?broader skos:prefLabel ?broaderLabel .
|
|
76
87
|
FILTER(LANG(?broaderLabel) = "${lang}")
|
|
77
88
|
}
|
|
89
|
+
FILTER(STRSTARTS(STR(?concept), "${EUROVOC_CONCEPT_NAMESPACE}"))
|
|
78
90
|
FILTER(LANG(?label) = "${lang}")
|
|
79
91
|
FILTER(CONTAINS(LCASE(STR(?label)), "${keyword.replace(/"/g, '\\"')}"))
|
|
80
92
|
} LIMIT ${limit}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-browse-subjects.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-browse-subjects.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;AAE3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,wBAAwB,EAAE;IACnE,KAAK,EAAE,yBAAyB;IAChC,WAAW,EACT,kHAAkH;QAClH,6FAA6F;QAC7F,mDAAmD;QACnD,sHAAsH;QACtH,+GAA+G;QAC/G,yGAAyG;IAC3G,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,+FAA+F,CAChG;QACH,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,KAAK,CAAC,cAAc,CAAC;aACrB,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,gFAAgF,CAAC;QAC7F,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,sEAAsE,CAAC;KACpF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC;aACR,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,yEAAyE,CAAC;YACtF,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,CAAC,4DAA4D,CAAC;YACzE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC7E,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gEAAgE,CAAC;SAC9E,CAAC;aACD,QAAQ,CAAC,4EAA4E,CAAC,CAC1F;aACA,QAAQ,CAAC,oEAAoE,CAAC;QACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;KAC5E,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,oEAAoE;YAC1E,QAAQ,EAAE,gFAAgF;SAC3F;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAE1B,MAAM,MAAM,GAAG;;;;;;;;oCAQiB,IAAI;;
|
|
1
|
+
{"version":3,"file":"eurlex-browse-subjects.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-browse-subjects.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,17 +7,17 @@ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
|
7
7
|
export declare const eurlex_get_cases: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
8
|
case_number: z.ZodOptional<z.ZodString>;
|
|
9
9
|
keyword: z.ZodOptional<z.ZodString>;
|
|
10
|
-
court: z.ZodOptional<z.ZodEnum<{
|
|
10
|
+
court: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodEnum<{
|
|
11
11
|
CJEU: "CJEU";
|
|
12
12
|
GC: "GC";
|
|
13
|
-
}>>;
|
|
14
|
-
case_type: z.ZodOptional<z.ZodEnum<{
|
|
13
|
+
}>]>>;
|
|
14
|
+
case_type: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodEnum<{
|
|
15
15
|
judgment: "judgment";
|
|
16
16
|
order: "order";
|
|
17
17
|
ag_opinion: "ag_opinion";
|
|
18
|
-
}>>;
|
|
19
|
-
date_from: z.ZodOptional<z.ZodString
|
|
20
|
-
date_to: 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
21
|
offset: z.ZodDefault<z.ZodNumber>;
|
|
22
22
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
23
23
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-get-cases.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-cases.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-get-cases.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-cases.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAqCjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyS3B,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
|
/** Case type to CELEX type substring mapping. */
|
|
10
10
|
const CASE_TYPE_PATTERN = {
|
|
@@ -52,23 +52,43 @@ export const eurlex_get_cases = tool('eurlex_get_cases', {
|
|
|
52
52
|
.optional()
|
|
53
53
|
.describe('Keyword to match against case titles and CELEX strings.'),
|
|
54
54
|
court: z
|
|
55
|
-
.
|
|
55
|
+
.union([
|
|
56
|
+
z.literal(''),
|
|
57
|
+
z.enum(['CJEU', 'GC']).describe('CJEU = Court of Justice of the EU, GC = General Court.'),
|
|
58
|
+
])
|
|
56
59
|
.optional()
|
|
57
|
-
.describe('Court filter: CJEU = Court of Justice of the EU, GC = General Court.'
|
|
60
|
+
.describe('Court filter: CJEU = Court of Justice of the EU, GC = General Court. ' +
|
|
61
|
+
'Leave blank or omit to search both courts.'),
|
|
58
62
|
case_type: z
|
|
59
|
-
.
|
|
63
|
+
.union([
|
|
64
|
+
z.literal(''),
|
|
65
|
+
z
|
|
66
|
+
.enum(['judgment', 'order', 'ag_opinion'])
|
|
67
|
+
.describe('judgment, order (procedural decision), or ag_opinion (Advocate General opinion).'),
|
|
68
|
+
])
|
|
60
69
|
.optional()
|
|
61
|
-
.describe('Case type filter: judgment, order (procedural decision), or ag_opinion (Advocate General opinion).'
|
|
70
|
+
.describe('Case type filter: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). ' +
|
|
71
|
+
'Leave blank or omit to search all case types.'),
|
|
62
72
|
date_from: z
|
|
63
|
-
.
|
|
64
|
-
.
|
|
73
|
+
.union([
|
|
74
|
+
z.literal(''),
|
|
75
|
+
z
|
|
76
|
+
.string()
|
|
77
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
78
|
+
.describe('Start date in ISO 8601 format (YYYY-MM-DD).'),
|
|
79
|
+
])
|
|
65
80
|
.optional()
|
|
66
|
-
.describe('Start of date range in ISO 8601 format (YYYY-MM-DD).'),
|
|
81
|
+
.describe('Start of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound.'),
|
|
67
82
|
date_to: z
|
|
68
|
-
.
|
|
69
|
-
.
|
|
83
|
+
.union([
|
|
84
|
+
z.literal(''),
|
|
85
|
+
z
|
|
86
|
+
.string()
|
|
87
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
88
|
+
.describe('End date in ISO 8601 format (YYYY-MM-DD).'),
|
|
89
|
+
])
|
|
70
90
|
.optional()
|
|
71
|
-
.describe('End of date range in ISO 8601 format (YYYY-MM-DD).'),
|
|
91
|
+
.describe('End of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound.'),
|
|
72
92
|
offset: z
|
|
73
93
|
.number()
|
|
74
94
|
.int()
|
|
@@ -92,7 +112,9 @@ export const eurlex_get_cases = tool('eurlex_get_cases', {
|
|
|
92
112
|
resource_type: z
|
|
93
113
|
.string()
|
|
94
114
|
.optional()
|
|
95
|
-
.describe('Human-readable case type label (e.g. "Judgment", "Order", "AG Opinion").
|
|
115
|
+
.describe('Human-readable case type label (e.g. "Judgment", "Order", "AG Opinion"). ' +
|
|
116
|
+
'Cases classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. ' +
|
|
117
|
+
'Absent for some older cases.'),
|
|
96
118
|
date: z.string().optional().describe('Judgment/opinion date in ISO 8601 format.'),
|
|
97
119
|
title: z
|
|
98
120
|
.string()
|
|
@@ -176,8 +198,20 @@ export const eurlex_get_cases = tool('eurlex_get_cases', {
|
|
|
176
198
|
// ?expr cdm:expression_belongs_to_work ?work (inverse of cdm:work_has_expression)
|
|
177
199
|
// ?expr cdm:expression_uses_language <.../ENG>
|
|
178
200
|
// ?expr cdm:expression_title ?title
|
|
201
|
+
//
|
|
202
|
+
// GROUP BY ?work collapses each work to one row. A work can carry several
|
|
203
|
+
// cdm:work_has_resource-type values (corrigenda hold 2–3); without grouping these
|
|
204
|
+
// cross-product into duplicate rows that SELECT DISTINCT cannot merge (?type
|
|
205
|
+
// differs per row), and LIMIT/OFFSET would then page over raw rows rather than
|
|
206
|
+
// works. GROUP_CONCAT gathers every resource-type URI per work; SAMPLE picks the
|
|
207
|
+
// single-valued display fields. Aggregate aliases are renamed (?celex/?docDate/
|
|
208
|
+
// ?docTitle) because a projected AS-variable cannot reuse a name already in scope.
|
|
179
209
|
const sparql = `
|
|
180
|
-
SELECT
|
|
210
|
+
SELECT ?work
|
|
211
|
+
(SAMPLE(?celexNumber) AS ?celex)
|
|
212
|
+
(GROUP_CONCAT(DISTINCT STR(?type); SEPARATOR=" ") AS ?types)
|
|
213
|
+
(SAMPLE(?date) AS ?docDate)
|
|
214
|
+
(SAMPLE(?title) AS ?docTitle) WHERE {
|
|
181
215
|
?work cdm:resource_legal_id_celex ?celexNumber .
|
|
182
216
|
OPTIONAL { ?work cdm:work_has_resource-type ?type . }
|
|
183
217
|
OPTIONAL { ?work cdm:work_date_document ?date . }
|
|
@@ -187,7 +221,7 @@ SELECT DISTINCT ?work ?celexNumber ?type ?date ?title WHERE {
|
|
|
187
221
|
?expr cdm:expression_title ?title .
|
|
188
222
|
}
|
|
189
223
|
${filters.join('\n ')}
|
|
190
|
-
} ORDER BY DESC(?
|
|
224
|
+
} GROUP BY ?work ORDER BY DESC(?docDate) LIMIT ${input.limit} OFFSET ${input.offset}`;
|
|
191
225
|
const queryEcho = {
|
|
192
226
|
...(input.case_number ? { case_number: input.case_number } : {}),
|
|
193
227
|
...(celexFragment ? { celex_fragment: celexFragment } : {}),
|
|
@@ -215,15 +249,15 @@ SELECT DISTINCT ?work ?celexNumber ?type ?date ?title WHERE {
|
|
|
215
249
|
const cases = bindings.map((b) => {
|
|
216
250
|
const c = {
|
|
217
251
|
work_uri: CellarSparqlService.bindingValue(b, 'work') ?? '',
|
|
218
|
-
celex_number: CellarSparqlService.bindingValue(b, '
|
|
252
|
+
celex_number: CellarSparqlService.bindingValue(b, 'celex') ?? '',
|
|
219
253
|
};
|
|
220
|
-
const
|
|
221
|
-
if (
|
|
222
|
-
c.resource_type =
|
|
223
|
-
const date = CellarSparqlService.bindingValue(b, '
|
|
254
|
+
const resourceType = resolveResourceTypeLabels(CellarSparqlService.bindingValue(b, 'types'));
|
|
255
|
+
if (resourceType)
|
|
256
|
+
c.resource_type = resourceType;
|
|
257
|
+
const date = CellarSparqlService.bindingValue(b, 'docDate');
|
|
224
258
|
if (date)
|
|
225
259
|
c.date = date;
|
|
226
|
-
const title = CellarSparqlService.bindingValue(b, '
|
|
260
|
+
const title = CellarSparqlService.bindingValue(b, 'docTitle');
|
|
227
261
|
if (title)
|
|
228
262
|
c.title = title;
|
|
229
263
|
return c;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-get-cases.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-cases.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-get-cases.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-cases.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
export declare const eurlex_get_document: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
-
celex_number: z.ZodString
|
|
8
|
+
celex_number: z.ZodOptional<z.ZodString>;
|
|
9
9
|
eli_uri: z.ZodOptional<z.ZodString>;
|
|
10
10
|
language: z.ZodDefault<z.ZodString>;
|
|
11
11
|
format: z.ZodDefault<z.ZodEnum<{
|
|
@@ -28,10 +28,15 @@ export declare const eurlex_get_document: import("@cyanheads/mcp-ts-core").ToolD
|
|
|
28
28
|
language_fallback: z.ZodOptional<z.ZodString>;
|
|
29
29
|
content_format: z.ZodString;
|
|
30
30
|
}, z.core.$strip>, readonly [{
|
|
31
|
+
readonly reason: "invalid_identifier_args";
|
|
32
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
33
|
+
readonly when: "Neither celex_number nor eli_uri was provided, or both were.";
|
|
34
|
+
readonly recovery: "Provide exactly one of celex_number or eli_uri.";
|
|
35
|
+
}, {
|
|
31
36
|
readonly reason: "not_found";
|
|
32
37
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
33
|
-
readonly when: "CELEX number not found in CELLAR — the work does not exist in the corpus.";
|
|
34
|
-
readonly recovery: "Verify the
|
|
38
|
+
readonly when: "CELEX number or ELI URI not found in CELLAR — the work does not exist in the corpus.";
|
|
39
|
+
readonly recovery: "Verify the identifier or use eurlex_lookup_celex to confirm it exists.";
|
|
35
40
|
}, {
|
|
36
41
|
readonly reason: "language_unavailable";
|
|
37
42
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-get-document.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-document.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-get-document.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-document.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAiBjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgS9B,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { ENG_LANGUAGE_URI, resolveCorporateBodyLabel, resolveResourceTypeLabel, } from '../../../services/cellar-sparql/cdm-labels.js';
|
|
8
8
|
import { CellarSparqlService, getCellarSparqlService, } from '../../../services/cellar-sparql/cellar-sparql-service.js';
|
|
9
|
+
import { escapeSparqlLiteral, resolveEliToWork } from '../../../services/cellar-sparql/eli-resolution.js';
|
|
9
10
|
import { getEurLexContentService, } from '../../../services/eurlex-content/eurlex-content-service.js';
|
|
10
11
|
export const eurlex_get_document = tool('eurlex_get_document', {
|
|
11
12
|
title: 'Get EU Document',
|
|
@@ -22,12 +23,15 @@ export const eurlex_get_document = tool('eurlex_get_document', {
|
|
|
22
23
|
input: z.object({
|
|
23
24
|
celex_number: z
|
|
24
25
|
.string()
|
|
25
|
-
.
|
|
26
|
-
.describe('CELEX number of the act to fetch (e.g. 32016R0679 for GDPR).
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). ' +
|
|
28
|
+
'Provide exactly one of celex_number or eli_uri.'),
|
|
27
29
|
eli_uri: z
|
|
28
30
|
.string()
|
|
29
31
|
.optional()
|
|
30
|
-
.describe('ELI URI
|
|
32
|
+
.describe('Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. ' +
|
|
33
|
+
'http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). ' +
|
|
34
|
+
'Provide exactly one of celex_number or eli_uri.'),
|
|
31
35
|
language: z
|
|
32
36
|
.string()
|
|
33
37
|
.regex(/^[A-Za-z]{2,3}$/)
|
|
@@ -77,11 +81,17 @@ export const eurlex_get_document = tool('eurlex_get_document', {
|
|
|
77
81
|
content_format: z.string().describe('Format of the returned content: "html" or "xml".'),
|
|
78
82
|
}),
|
|
79
83
|
errors: [
|
|
84
|
+
{
|
|
85
|
+
reason: 'invalid_identifier_args',
|
|
86
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
87
|
+
when: 'Neither celex_number nor eli_uri was provided, or both were.',
|
|
88
|
+
recovery: 'Provide exactly one of celex_number or eli_uri.',
|
|
89
|
+
},
|
|
80
90
|
{
|
|
81
91
|
reason: 'not_found',
|
|
82
92
|
code: JsonRpcErrorCode.NotFound,
|
|
83
|
-
when: 'CELEX number not found in CELLAR — the work does not exist in the corpus.',
|
|
84
|
-
recovery: 'Verify the
|
|
93
|
+
when: 'CELEX number or ELI URI not found in CELLAR — the work does not exist in the corpus.',
|
|
94
|
+
recovery: 'Verify the identifier or use eurlex_lookup_celex to confirm it exists.',
|
|
85
95
|
},
|
|
86
96
|
{
|
|
87
97
|
reason: 'language_unavailable',
|
|
@@ -99,10 +109,36 @@ export const eurlex_get_document = tool('eurlex_get_document', {
|
|
|
99
109
|
async handler(input, ctx) {
|
|
100
110
|
const sparqlSvc = getCellarSparqlService();
|
|
101
111
|
const contentSvc = getEurLexContentService();
|
|
102
|
-
|
|
112
|
+
// Accept exactly one identifier: a CELEX number, or an ELI URI resolved to
|
|
113
|
+
// its CELLAR work. Treat empty/whitespace as absent so form-based clients
|
|
114
|
+
// that send "" for an omitted field route to the friendly guard, not -32602.
|
|
115
|
+
// An ELI is resolved to its CELLAR work via the shared #5 resolution
|
|
116
|
+
// (cdm:resource_legal_eli exact-match + bare-work /oj retry), then the rest
|
|
117
|
+
// of the flow (metadata + content) is keyed on the confirmed CELEX.
|
|
118
|
+
const celexInput = input.celex_number?.trim();
|
|
119
|
+
const eliInput = input.eli_uri?.trim();
|
|
120
|
+
let celexNumber;
|
|
121
|
+
if (eliInput && !celexInput) {
|
|
122
|
+
const binding = await resolveEliToWork(sparqlSvc, eliInput, ctx);
|
|
123
|
+
const resolvedCelex = binding && CellarSparqlService.bindingValue(binding, 'celexNumber');
|
|
124
|
+
if (!resolvedCelex) {
|
|
125
|
+
throw ctx.fail('not_found', `No CELLAR work found for ELI: ${eliInput}`, {
|
|
126
|
+
...ctx.recoveryFor('not_found'),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
celexNumber = resolvedCelex;
|
|
130
|
+
}
|
|
131
|
+
else if (celexInput && !eliInput) {
|
|
132
|
+
celexNumber = celexInput;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
throw ctx.fail('invalid_identifier_args', celexInput
|
|
136
|
+
? 'Provide only one of celex_number or eli_uri, not both.'
|
|
137
|
+
: 'Provide either celex_number or eli_uri.', { ...ctx.recoveryFor('invalid_identifier_args') });
|
|
138
|
+
}
|
|
103
139
|
const language = (input.language.trim().toUpperCase() || 'EN');
|
|
104
140
|
const format = input.format;
|
|
105
|
-
const safeCelexNumber = celexNumber
|
|
141
|
+
const safeCelexNumber = escapeSparqlLiteral(celexNumber);
|
|
106
142
|
// Step 1: Fetch metadata via SPARQL
|
|
107
143
|
const metaSparql = `
|
|
108
144
|
SELECT ?work ?celexNumber ?type ?date ?title ?inForce ?author ?legalBasis ?eurovoc WHERE {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurlex-get-document.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-get-document.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,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAGL,uBAAuB,GACxB,MAAM,qDAAqD,CAAC;AAE7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,EAAE;IAC7D,KAAK,EAAE,iBAAiB;IACxB,WAAW,EACT,qFAAqF;QACrF,gHAAgH;QAChH,kEAAkE;QAClE,wFAAwF;QACxF,iDAAiD;QACjD,mHAAmH;QACnH,uEAAuE;QACvE,8EAA8E;QAC9E,4GAA4G;IAC9G,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,
|
|
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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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
export declare const eurlex_get_relations: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
-
celex_number: z.ZodString
|
|
8
|
+
celex_number: z.ZodOptional<z.ZodString>;
|
|
9
9
|
work_uri: z.ZodOptional<z.ZodString>;
|
|
10
10
|
relation_types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
11
11
|
cites: "cites";
|
|
@@ -15,8 +15,8 @@ export declare const eurlex_get_relations: import("@cyanheads/mcp-ts-core").Tool
|
|
|
15
15
|
consolidated_version: "consolidated_version";
|
|
16
16
|
}>>>;
|
|
17
17
|
}, z.core.$strip>, z.ZodObject<{
|
|
18
|
-
celex_number: z.ZodString
|
|
19
|
-
work_uri: z.
|
|
18
|
+
celex_number: z.ZodOptional<z.ZodString>;
|
|
19
|
+
work_uri: z.ZodString;
|
|
20
20
|
relations: z.ZodArray<z.ZodObject<{
|
|
21
21
|
relation_type: z.ZodString;
|
|
22
22
|
direction: z.ZodString;
|
|
@@ -25,9 +25,14 @@ export declare const eurlex_get_relations: import("@cyanheads/mcp-ts-core").Tool
|
|
|
25
25
|
}, z.core.$strip>>;
|
|
26
26
|
total: z.ZodNumber;
|
|
27
27
|
}, z.core.$strip>, readonly [{
|
|
28
|
+
readonly reason: "invalid_identifier_args";
|
|
29
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
30
|
+
readonly when: "Neither celex_number nor work_uri was provided, or both were.";
|
|
31
|
+
readonly recovery: "Provide exactly one of celex_number or work_uri.";
|
|
32
|
+
}, {
|
|
28
33
|
readonly reason: "not_found";
|
|
29
34
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
30
|
-
readonly when: "CELEX
|
|
35
|
+
readonly when: "CELEX number not found in CELLAR — resolve the identifier with eurlex_lookup_celex first.";
|
|
31
36
|
readonly recovery: "Use eurlex_lookup_celex to confirm the CELEX number exists, then retry.";
|
|
32
37
|
}, {
|
|
33
38
|
readonly reason: "no_relations";
|
|
@@ -1 +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;
|
|
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;AA4BjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAkQ/B,CAAC"}
|