@cyanheads/eur-lex-mcp-server 0.1.5 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** eur-lex-mcp-server
4
- **Version:** 0.1.5
4
+ **Version:** 0.1.6
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.5
4
+ **Version:** 0.1.6
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
- [![Version](https://img.shields.io/badge/Version-0.1.5-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/eur-lex-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/eur-lex-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/eur-lex-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.11-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.1.6-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/eur-lex-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/eur-lex-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/eur-lex-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.11-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -0,0 +1,21 @@
1
+ ---
2
+ summary: "eurlex_query_sparql enforces its read-only contract (non-SELECT queries rejected locally) and honors the previously-ignored timeout_hint parameter"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.1.6 — 2026-06-30
8
+
9
+ ## Fixed
10
+
11
+ - **`eurlex_query_sparql` read-only enforcement** ([#9](https://github.com/cyanheads/eur-lex-mcp-server/issues/9)) — non-SELECT queries are now rejected locally, before any request reaches CELLAR. A new `leadingSparqlKeyword()` helper skips the query prologue (whitespace, `#` comments, `PREFIX`/`BASE` declarations) to find the first keyword; update forms (`DELETE`, `INSERT`, `LOAD`, `CLEAR`, `CREATE`, `DROP`, `COPY`, `MOVE`, `ADD`) and other query forms (`ASK`, `CONSTRUCT`, `DESCRIBE`) fail with the new `not_read_only` `ValidationError`.
12
+ - **`timeout_hint` now honored** ([#10](https://github.com/cyanheads/eur-lex-mcp-server/issues/10)) — the parameter was advertised but ignored. It is now threaded through `CellarSparqlService.query()` as an optional per-call timeout, falling back to the server-configured `SPARQL_QUERY_TIMEOUT_MS` (55000) default when omitted.
13
+
14
+ ## Changed
15
+
16
+ - **`eurlex_query_sparql` schema descriptions** — the tool description and the `sparql_query` / `timeout_hint` field descriptions now document the read-only SELECT-only contract and the per-call timeout semantics.
17
+
18
+ ### Dependency bumps
19
+
20
+ - `@biomejs/biome` `^2.5.0` → `^2.5.1`
21
+ - `@types/node` `^26.0.0` → `^26.0.1`
@@ -12,6 +12,11 @@ export declare const eurlex_query_sparql: import("@cyanheads/mcp-ts-core").ToolD
12
12
  variables: z.ZodArray<z.ZodString>;
13
13
  total: z.ZodNumber;
14
14
  }, z.core.$strip>, readonly [{
15
+ readonly reason: "not_read_only";
16
+ readonly code: JsonRpcErrorCode.ValidationError;
17
+ readonly when: "The query is not a read-only SELECT — an update or non-SELECT query form was supplied.";
18
+ readonly recovery: "Rewrite the request as a SPARQL SELECT query; this tool is read-only and does not run updates (DELETE/INSERT) or other query forms (ASK/CONSTRUCT/DESCRIBE).";
19
+ }, {
15
20
  readonly reason: "sparql_error";
16
21
  readonly code: JsonRpcErrorCode.ValidationError;
17
22
  readonly when: "Virtuoso returned a syntax or semantic error — the query is malformed.";
@@ -1 +1 @@
1
- {"version":3,"file":"eurlex-query-sparql.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-query-sparql.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;cAiH9B,CAAC"}
1
+ {"version":3,"file":"eurlex-query-sparql.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-query-sparql.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAsCjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;cAqI9B,CAAC"}
@@ -5,9 +5,45 @@
5
5
  import { tool, z } from '@cyanheads/mcp-ts-core';
6
6
  import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
7
  import { getCellarSparqlService } from '../../../services/cellar-sparql/cellar-sparql-service.js';
8
+ /**
9
+ * Returns the first significant SPARQL keyword (uppercased) after skipping the
10
+ * query prologue — leading whitespace, `#` line comments, and `BASE`/`PREFIX`
11
+ * declarations. Returns `undefined` for an empty or prologue-only query.
12
+ *
13
+ * Enforces the tool's read-only contract: only a leading `SELECT` is accepted;
14
+ * update forms (DELETE/INSERT/…) and other query forms (ASK/CONSTRUCT/DESCRIBE)
15
+ * are rejected before any request reaches CELLAR. IRIs in PREFIX/BASE (which
16
+ * routinely contain `#`, e.g. the cdm: namespace) are consumed whole, so their
17
+ * `#` is never mistaken for the start of a comment.
18
+ */
19
+ function leadingSparqlKeyword(query) {
20
+ let rest = query;
21
+ for (;;) {
22
+ const trimmed = rest.replace(/^\s+/, '');
23
+ if (trimmed.length === 0)
24
+ return;
25
+ if (trimmed.startsWith('#')) {
26
+ const newline = trimmed.indexOf('\n');
27
+ rest = newline === -1 ? '' : trimmed.slice(newline + 1);
28
+ continue;
29
+ }
30
+ const base = /^BASE\s*<[^>]*>/i.exec(trimmed);
31
+ if (base) {
32
+ rest = trimmed.slice(base[0].length);
33
+ continue;
34
+ }
35
+ const prefix = /^PREFIX\s+[^\s:]*:\s*<[^>]*>/i.exec(trimmed);
36
+ if (prefix) {
37
+ rest = trimmed.slice(prefix[0].length);
38
+ continue;
39
+ }
40
+ return /^[A-Za-z]+/.exec(trimmed)?.[0]?.toUpperCase();
41
+ }
42
+ }
8
43
  export const eurlex_query_sparql = tool('eurlex_query_sparql', {
9
44
  title: 'Raw CELLAR SPARQL Query',
10
- description: 'Execute a raw SPARQL SELECT query against the CELLAR Virtuoso endpoint. ' +
45
+ description: 'Execute a raw, read-only SPARQL SELECT query against the CELLAR Virtuoso endpoint. ' +
46
+ 'Only SELECT is accepted: update forms (DELETE, INSERT, LOAD, CLEAR, CREATE, DROP, COPY, MOVE, ADD) and other query forms (ASK, CONSTRUCT, DESCRIBE) are rejected locally before any request is sent. ' +
11
47
  'Use only when the curated tools (eurlex_search_documents, eurlex_get_relations, etc.) do not cover the needed traversal. ' +
12
48
  'The server caps all queries at 100 results — include an explicit LIMIT in your query to control the count; ' +
13
49
  'if omitted or above 100 it will be injected or capped automatically. ' +
@@ -23,7 +59,8 @@ export const eurlex_query_sparql = tool('eurlex_query_sparql', {
23
59
  sparql_query: z
24
60
  .string()
25
61
  .min(10)
26
- .describe('A SPARQL SELECT query to execute against CELLAR. The cdm:, skos:, and xsd: prefixes are auto-injected. ' +
62
+ .describe('A read-only SPARQL SELECT query to execute against CELLAR. Non-SELECT queries (updates such as DELETE/INSERT, or ASK/CONSTRUCT/DESCRIBE) are rejected before execution. ' +
63
+ 'Leading comments and PREFIX/BASE declarations are allowed before the SELECT keyword. The cdm:, skos:, and xsd: prefixes are auto-injected. ' +
27
64
  'LIMIT is injected at 100 if absent or capped to 100 if above that threshold.'),
28
65
  timeout_hint: z
29
66
  .number()
@@ -31,8 +68,8 @@ export const eurlex_query_sparql = tool('eurlex_query_sparql', {
31
68
  .min(1000)
32
69
  .max(55000)
33
70
  .optional()
34
- .describe('Optional client-side timeout hint in milliseconds (1000–55000). ' +
35
- 'Defaults to server-configured SPARQL_QUERY_TIMEOUT_MS (55000). Virtuoso hard limit is 60 seconds.'),
71
+ .describe('Optional client-side timeout for this request, in milliseconds (1000–55000). ' +
72
+ 'When omitted, the server-configured default (SPARQL_QUERY_TIMEOUT_MS, 55000) applies. Virtuoso hard limit is 60 seconds.'),
36
73
  }),
37
74
  output: z.object({
38
75
  bindings: z
@@ -47,6 +84,12 @@ export const eurlex_query_sparql = tool('eurlex_query_sparql', {
47
84
  total: z.number().describe('Number of binding rows returned (capped at 100 by the server).'),
48
85
  }),
49
86
  errors: [
87
+ {
88
+ reason: 'not_read_only',
89
+ code: JsonRpcErrorCode.ValidationError,
90
+ when: 'The query is not a read-only SELECT — an update or non-SELECT query form was supplied.',
91
+ recovery: 'Rewrite the request as a SPARQL SELECT query; this tool is read-only and does not run updates (DELETE/INSERT) or other query forms (ASK/CONSTRUCT/DESCRIBE).',
92
+ },
50
93
  {
51
94
  reason: 'sparql_error',
52
95
  code: JsonRpcErrorCode.ValidationError,
@@ -61,8 +104,14 @@ export const eurlex_query_sparql = tool('eurlex_query_sparql', {
61
104
  },
62
105
  ],
63
106
  async handler(input, ctx) {
107
+ const keyword = leadingSparqlKeyword(input.sparql_query);
108
+ if (keyword !== 'SELECT') {
109
+ throw ctx.fail('not_read_only', keyword
110
+ ? `Only read-only SELECT queries are accepted; received a ${keyword} query.`
111
+ : 'Only read-only SELECT queries are accepted; no SELECT keyword was found.', { ...ctx.recoveryFor('not_read_only') });
112
+ }
64
113
  const svc = getCellarSparqlService();
65
- const bindings = await svc.query(input.sparql_query, ctx);
114
+ const bindings = await svc.query(input.sparql_query, ctx, input.timeout_hint);
66
115
  ctx.log.info('Raw SPARQL query executed', { resultCount: bindings.length });
67
116
  // Extract variable names from first binding or return empty
68
117
  const variables = bindings.length > 0 ? Object.keys(bindings[0]) : [];
@@ -1 +1 @@
1
- {"version":3,"file":"eurlex-query-sparql.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-query-sparql.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eurlex-query-sparql.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurlex-query-sparql.tool.ts"],"names":[],"mappings":"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"}
@@ -164,6 +164,11 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
164
164
  variables: import("zod").ZodArray<import("zod").ZodString>;
165
165
  total: import("zod").ZodNumber;
166
166
  }, import("zod/v4/core").$strip>, readonly [{
167
+ readonly reason: "not_read_only";
168
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
169
+ readonly when: "The query is not a read-only SELECT — an update or non-SELECT query form was supplied.";
170
+ readonly recovery: "Rewrite the request as a SPARQL SELECT query; this tool is read-only and does not run updates (DELETE/INSERT) or other query forms (ASK/CONSTRUCT/DESCRIBE).";
171
+ }, {
167
172
  readonly reason: "sparql_error";
168
173
  readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ValidationError;
169
174
  readonly when: "Virtuoso returned a syntax or semantic error — the query is malformed.";
@@ -1 +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"}
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"}
@@ -17,8 +17,11 @@ export declare class CellarSparqlService {
17
17
  /**
18
18
  * Execute a raw SPARQL SELECT query. Prefixes are prepended automatically
19
19
  * if not already present. LIMIT is injected/capped at `maxResults`.
20
+ *
21
+ * @param timeoutMs - Optional per-call client-side timeout in milliseconds.
22
+ * Falls back to the server-configured `sparqlQueryTimeoutMs` when omitted.
20
23
  */
21
- query(rawQuery: string, ctx: Context): Promise<SparqlBinding[]>;
24
+ query(rawQuery: string, ctx: Context, timeoutMs?: number): Promise<SparqlBinding[]>;
22
25
  /** Extract a string value from a binding field, returning undefined if absent. */
23
26
  static bindingValue(binding: SparqlBinding | undefined, field: string): string | undefined;
24
27
  }
@@ -1 +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"}
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;;;;;;OAMG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAwEzF,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"}
@@ -43,8 +43,12 @@ export class CellarSparqlService {
43
43
  /**
44
44
  * Execute a raw SPARQL SELECT query. Prefixes are prepended automatically
45
45
  * if not already present. LIMIT is injected/capped at `maxResults`.
46
+ *
47
+ * @param timeoutMs - Optional per-call client-side timeout in milliseconds.
48
+ * Falls back to the server-configured `sparqlQueryTimeoutMs` when omitted.
46
49
  */
47
- async query(rawQuery, ctx) {
50
+ async query(rawQuery, ctx, timeoutMs) {
51
+ const effectiveTimeoutMs = timeoutMs ?? this.timeoutMs;
48
52
  const withPrefixes = rawQuery.includes('PREFIX cdm:') ? rawQuery : SPARQL_PREFIXES + rawQuery;
49
53
  const cappedQuery = enforceLimitInQuery(withPrefixes, this.maxResults);
50
54
  return withRetry(async () => {
@@ -59,7 +63,7 @@ export class CellarSparqlService {
59
63
  Accept: 'application/sparql-results+json',
60
64
  },
61
65
  body: body.toString(),
62
- signal: AbortSignal.timeout(this.timeoutMs),
66
+ signal: AbortSignal.timeout(effectiveTimeoutMs),
63
67
  });
64
68
  const text = await response.text();
65
69
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"cellar-sparql-service.js","sourceRoot":"","sources":["../../../src/services/cellar-sparql/cellar-sparql-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cellar-sparql-service.js","sourceRoot":"","sources":["../../../src/services/cellar-sparql/cellar-sparql-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/eur-lex-mcp-server",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "mcpName": "io.github.cyanheads/eur-lex-mcp-server",
5
5
  "description": "Search EU legislation, CJEU case law, and treaties; traverse the CELLAR relationship graph; resolve EuroVoc concepts via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
@@ -94,8 +94,8 @@
94
94
  "zod": "^4.4.3"
95
95
  },
96
96
  "devDependencies": {
97
- "@biomejs/biome": "^2.5.0",
98
- "@types/node": "^26.0.0",
97
+ "@biomejs/biome": "^2.5.1",
98
+ "@types/node": "^26.0.1",
99
99
  "depcheck": "^1.4.7",
100
100
  "ignore": "^7.0.5",
101
101
  "tsc-alias": "^1.8.17",
package/server.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/cyanheads/eur-lex-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.1.5",
9
+ "version": "0.1.6",
10
10
  "remotes": [
11
11
  {
12
12
  "type": "streamable-http",
@@ -19,7 +19,7 @@
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/eur-lex-mcp-server",
21
21
  "runtimeHint": "bun",
22
- "version": "0.1.5",
22
+ "version": "0.1.6",
23
23
  "packageArguments": [
24
24
  {
25
25
  "type": "positional",
@@ -76,7 +76,7 @@
76
76
  "registryBaseUrl": "https://registry.npmjs.org",
77
77
  "identifier": "@cyanheads/eur-lex-mcp-server",
78
78
  "runtimeHint": "bun",
79
- "version": "0.1.5",
79
+ "version": "0.1.6",
80
80
  "packageArguments": [
81
81
  {
82
82
  "type": "positional",