@cyanheads/eurostat-mcp-server 0.6.1 → 0.6.2

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 (33) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +14 -12
  4. package/changelog/0.6.x/0.6.2.md +21 -0
  5. package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js +2 -2
  6. package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js.map +1 -1
  7. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts.map +1 -1
  8. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js +7 -4
  9. package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js.map +1 -1
  10. package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js +2 -2
  11. package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js.map +1 -1
  12. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts +13 -1
  13. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts.map +1 -1
  14. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js +24 -3
  15. package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js.map +1 -1
  16. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts +4 -3
  17. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js +40 -21
  19. package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js.map +1 -1
  20. package/dist/services/eurostat-data/eurostat-data-service.d.ts +17 -55
  21. package/dist/services/eurostat-data/eurostat-data-service.d.ts.map +1 -1
  22. package/dist/services/eurostat-data/eurostat-data-service.js +88 -155
  23. package/dist/services/eurostat-data/eurostat-data-service.js.map +1 -1
  24. package/dist/services/eurostat-data/sdmx-metadata.d.ts +16 -0
  25. package/dist/services/eurostat-data/sdmx-metadata.d.ts.map +1 -0
  26. package/dist/services/eurostat-data/sdmx-metadata.js +330 -0
  27. package/dist/services/eurostat-data/sdmx-metadata.js.map +1 -0
  28. package/dist/services/eurostat-data/types.d.ts +21 -19
  29. package/dist/services/eurostat-data/types.d.ts.map +1 -1
  30. package/dist/services/eurostat-data/types.js +3 -3
  31. package/dist/services/eurostat-data/types.js.map +1 -1
  32. package/package.json +1 -1
  33. package/server.json +3 -3
@@ -0,0 +1,330 @@
1
+ /**
2
+ * @fileoverview Dataset-scoped SDMX 2.1 structure and content-constraint parser.
3
+ * @module services/eurostat-data/sdmx-metadata
4
+ */
5
+ function decodeXml(value) {
6
+ return value.replace(/&(#x[\da-f]+|#\d+|amp|apos|gt|lt|quot);/gi, (entity, token) => {
7
+ if (token[0] === '#') {
8
+ const radix = token[1]?.toLowerCase() === 'x' ? 16 : 10;
9
+ const digits = radix === 16 ? token.slice(2) : token.slice(1);
10
+ const codePoint = Number.parseInt(digits, radix);
11
+ return Number.isNaN(codePoint) ? entity : String.fromCodePoint(codePoint);
12
+ }
13
+ return ({
14
+ amp: '&',
15
+ apos: "'",
16
+ gt: '>',
17
+ lt: '<',
18
+ quot: '"',
19
+ }[token.toLowerCase()] ?? entity);
20
+ });
21
+ }
22
+ function localName(qualifiedName) {
23
+ return qualifiedName.slice(qualifiedName.lastIndexOf(':') + 1);
24
+ }
25
+ function findTagEnd(xml, start) {
26
+ let quote;
27
+ for (let index = start; index < xml.length; index++) {
28
+ const char = xml[index];
29
+ if (quote) {
30
+ if (char === quote)
31
+ quote = undefined;
32
+ }
33
+ else if (char === '"' || char === "'") {
34
+ quote = char;
35
+ }
36
+ else if (char === '>') {
37
+ return index;
38
+ }
39
+ }
40
+ throw new Error('Unterminated XML tag');
41
+ }
42
+ function currentNode(stack) {
43
+ const current = stack.at(-1);
44
+ if (!current)
45
+ throw new Error('XML parser lost its document root');
46
+ return current;
47
+ }
48
+ /** Parse only ordinary XML syntax; DTDs and custom entities are deliberately unsupported. */
49
+ function parseXml(xml) {
50
+ const root = {
51
+ attributes: {},
52
+ children: [],
53
+ name: '#document',
54
+ qualifiedName: '#document',
55
+ text: '',
56
+ };
57
+ const stack = [root];
58
+ let cursor = 0;
59
+ while (cursor < xml.length) {
60
+ const opening = xml.indexOf('<', cursor);
61
+ if (opening === -1) {
62
+ currentNode(stack).text += decodeXml(xml.slice(cursor));
63
+ break;
64
+ }
65
+ if (opening > cursor)
66
+ currentNode(stack).text += decodeXml(xml.slice(cursor, opening));
67
+ if (xml.startsWith('<!--', opening)) {
68
+ const end = xml.indexOf('-->', opening + 4);
69
+ if (end === -1)
70
+ throw new Error('Unterminated XML comment');
71
+ cursor = end + 3;
72
+ continue;
73
+ }
74
+ if (xml.startsWith('<![CDATA[', opening)) {
75
+ const end = xml.indexOf(']]>', opening + 9);
76
+ if (end === -1)
77
+ throw new Error('Unterminated CDATA section');
78
+ currentNode(stack).text += xml.slice(opening + 9, end);
79
+ cursor = end + 3;
80
+ continue;
81
+ }
82
+ if (xml.startsWith('<?', opening)) {
83
+ const end = xml.indexOf('?>', opening + 2);
84
+ if (end === -1)
85
+ throw new Error('Unterminated XML declaration');
86
+ cursor = end + 2;
87
+ continue;
88
+ }
89
+ if (/^<!DOCTYPE\b/i.test(xml.slice(opening, opening + 10))) {
90
+ throw new Error('SDMX XML must not contain a DOCTYPE');
91
+ }
92
+ if (xml.startsWith('<!', opening)) {
93
+ const end = findTagEnd(xml, opening + 2);
94
+ cursor = end + 1;
95
+ continue;
96
+ }
97
+ const end = findTagEnd(xml, opening + 1);
98
+ const rawTag = xml.slice(opening + 1, end).trim();
99
+ if (rawTag.startsWith('/')) {
100
+ const closingName = rawTag.slice(1).trim();
101
+ const node = stack.pop();
102
+ if (!node || node.qualifiedName !== closingName) {
103
+ throw new Error(`Mismatched XML closing tag: ${closingName}`);
104
+ }
105
+ cursor = end + 1;
106
+ continue;
107
+ }
108
+ const selfClosing = rawTag.endsWith('/');
109
+ const body = selfClosing ? rawTag.slice(0, -1).trimEnd() : rawTag;
110
+ const nameEnd = body.search(/\s/);
111
+ const qualifiedName = nameEnd === -1 ? body : body.slice(0, nameEnd);
112
+ const attributes = {};
113
+ const attributeSource = nameEnd === -1 ? '' : body.slice(nameEnd + 1);
114
+ const attributePattern = /([^\s=]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
115
+ for (const match of attributeSource.matchAll(attributePattern)) {
116
+ const attributeName = match[1];
117
+ if (attributeName)
118
+ attributes[attributeName] = decodeXml(match[2] ?? match[3] ?? '');
119
+ }
120
+ const node = {
121
+ attributes,
122
+ children: [],
123
+ name: localName(qualifiedName),
124
+ qualifiedName,
125
+ text: '',
126
+ };
127
+ currentNode(stack).children.push(node);
128
+ if (!selfClosing)
129
+ stack.push(node);
130
+ cursor = end + 1;
131
+ }
132
+ if (stack.length !== 1)
133
+ throw new Error('Unclosed XML tag');
134
+ return root;
135
+ }
136
+ function children(node, name) {
137
+ return node.children.filter((child) => child.name === name);
138
+ }
139
+ function descendants(node, name) {
140
+ const matches = [];
141
+ const pending = [...node.children].reverse();
142
+ while (pending.length > 0) {
143
+ const current = pending.pop();
144
+ if (!current)
145
+ continue;
146
+ if (current.name === name)
147
+ matches.push(current);
148
+ for (let index = current.children.length - 1; index >= 0; index--) {
149
+ const child = current.children[index];
150
+ if (child)
151
+ pending.push(child);
152
+ }
153
+ }
154
+ return matches;
155
+ }
156
+ function firstDescendant(node, name) {
157
+ return descendants(node, name)[0];
158
+ }
159
+ function nodeText(node) {
160
+ if (!node)
161
+ return undefined;
162
+ const text = [node.text, ...node.children.map((child) => nodeText(child) ?? '')].join('').trim();
163
+ return text || undefined;
164
+ }
165
+ function localizedName(node) {
166
+ const names = children(node, 'Name');
167
+ const english = names.find((name) => (name.attributes['xml:lang'] ?? name.attributes.lang)?.toLowerCase() === 'en');
168
+ return nodeText(english ?? names[0]);
169
+ }
170
+ function normalizeDimensionCode(code) {
171
+ return code.toUpperCase() === 'TIME_PERIOD' ? 'time' : code;
172
+ }
173
+ function annotationValue(dataflow, type, field) {
174
+ const annotation = descendants(dataflow, 'Annotation').find((candidate) => nodeText(children(candidate, 'AnnotationType')[0]) === type);
175
+ return nodeText(annotation ? children(annotation, field)[0] : undefined);
176
+ }
177
+ function parseGeoLevel(value) {
178
+ return {
179
+ '0': 'country',
180
+ '1': 'nuts1',
181
+ '2': 'nuts2',
182
+ '3': 'nuts3',
183
+ AGG: 'aggregate',
184
+ }[value ?? ''];
185
+ }
186
+ function parseCodelists(root) {
187
+ const codelists = new Map();
188
+ for (const codelist of descendants(root, 'Codelist')) {
189
+ const id = codelist.attributes.id;
190
+ if (!id)
191
+ continue;
192
+ const values = new Map();
193
+ for (const code of children(codelist, 'Code')) {
194
+ const value = code.attributes.id;
195
+ if (!value)
196
+ continue;
197
+ const geoLevel = id === 'GEO' ? parseGeoLevel(annotationValue(code, 'LEVEL', 'AnnotationTitle')) : undefined;
198
+ values.set(value, {
199
+ label: localizedName(code) ?? value,
200
+ ...(geoLevel && { geoLevel }),
201
+ });
202
+ }
203
+ codelists.set(id, values);
204
+ }
205
+ return codelists;
206
+ }
207
+ function parseConceptLabels(root) {
208
+ const concepts = new Map();
209
+ for (const concept of descendants(root, 'Concept')) {
210
+ const id = concept.attributes.id;
211
+ if (id)
212
+ concepts.set(id, localizedName(concept) ?? id);
213
+ }
214
+ return concepts;
215
+ }
216
+ function parseDimensions(root, conceptLabels) {
217
+ const dimensionList = firstDescendant(root, 'DimensionList');
218
+ if (!dimensionList)
219
+ throw new Error('SDMX dataflow descendants omitted the dimension list');
220
+ return dimensionList.children
221
+ .filter(({ name }) => name === 'Dimension' || name === 'TimeDimension')
222
+ .map((dimension, index) => {
223
+ const rawCode = dimension.attributes.id;
224
+ if (!rawCode)
225
+ throw new Error('SDMX dimension omitted its id');
226
+ const code = normalizeDimensionCode(rawCode);
227
+ const conceptIdentity = children(dimension, 'ConceptIdentity')[0];
228
+ const conceptId = conceptIdentity
229
+ ? firstDescendant(conceptIdentity, 'Ref')?.attributes.id
230
+ : undefined;
231
+ const enumeration = firstDescendant(dimension, 'Enumeration');
232
+ const codelistId = enumeration
233
+ ? firstDescendant(enumeration, 'Ref')?.attributes.id
234
+ : undefined;
235
+ return {
236
+ code,
237
+ ...(codelistId && { codelistId }),
238
+ label: (conceptId && conceptLabels.get(conceptId)) ?? conceptLabels.get(rawCode) ?? code,
239
+ position: Number.parseInt(dimension.attributes.position ?? '', 10) || index + 1,
240
+ };
241
+ })
242
+ .sort((left, right) => left.position - right.position);
243
+ }
244
+ function parseConstraintValues(root) {
245
+ const valuesByDimension = new Map();
246
+ for (const region of descendants(root, 'CubeRegion')) {
247
+ if (region.attributes.include?.toLowerCase() === 'false')
248
+ continue;
249
+ for (const keyValue of children(region, 'KeyValue')) {
250
+ const rawCode = keyValue.attributes.id;
251
+ if (!rawCode)
252
+ continue;
253
+ const dimensionCode = normalizeDimensionCode(rawCode);
254
+ const values = valuesByDimension.get(dimensionCode) ?? [];
255
+ const seen = new Set(values);
256
+ for (const value of children(keyValue, 'Value')) {
257
+ const code = nodeText(value);
258
+ if (code && !seen.has(code)) {
259
+ values.push(code);
260
+ seen.add(code);
261
+ }
262
+ }
263
+ valuesByDimension.set(dimensionCode, values);
264
+ }
265
+ }
266
+ return valuesByDimension;
267
+ }
268
+ /** Combine one dataflow's referencepartial descendants with its dataset content constraint. */
269
+ export function parseSdmxDatasetMetadata(dataflowXml, constraintXml, datasetCode) {
270
+ const dataflowRoot = parseXml(dataflowXml);
271
+ const constraintRoot = parseXml(constraintXml);
272
+ const dataflow = descendants(dataflowRoot, 'Dataflow').find((candidate) => candidate.attributes.id?.toLowerCase() === datasetCode.toLowerCase());
273
+ if (!dataflow)
274
+ throw new Error(`SDMX dataflow response omitted dataset "${datasetCode}"`);
275
+ const codelists = parseCodelists(dataflowRoot);
276
+ const conceptLabels = parseConceptLabels(dataflowRoot);
277
+ const dimensions = parseDimensions(dataflowRoot, conceptLabels);
278
+ const constraintValues = parseConstraintValues(constraintRoot);
279
+ const geoLevelsByCode = {};
280
+ const valuesByDimension = {};
281
+ const measuredDimensions = new Set();
282
+ for (const dimension of dimensions) {
283
+ const codeDefinitions = dimension.codelistId ? codelists.get(dimension.codelistId) : undefined;
284
+ const constrainedCodes = constraintValues.get(dimension.code);
285
+ if (constrainedCodes !== undefined || codeDefinitions !== undefined) {
286
+ measuredDimensions.add(dimension.code);
287
+ }
288
+ const codes = constrainedCodes ?? [...(codeDefinitions?.keys() ?? [])];
289
+ valuesByDimension[dimension.code] = codes.map((code) => ({
290
+ code,
291
+ label: codeDefinitions?.get(code)?.label ?? code,
292
+ }));
293
+ if (dimension.code === 'geo') {
294
+ for (const code of codes) {
295
+ const level = codeDefinitions?.get(code)?.geoLevel;
296
+ if (level)
297
+ geoLevelsByCode[code] = level;
298
+ }
299
+ }
300
+ }
301
+ const observationCount = Number.parseInt(annotationValue(dataflow, 'OBS_COUNT', 'AnnotationTitle') ?? '', 10);
302
+ const start = annotationValue(dataflow, 'OBS_PERIOD_OVERALL_OLDEST', 'AnnotationTitle');
303
+ const end = annotationValue(dataflow, 'OBS_PERIOD_OVERALL_LATEST', 'AnnotationTitle');
304
+ const lastUpdated = annotationValue(dataflow, 'UPDATE_DATA', 'AnnotationTitle');
305
+ const metadataUrl = annotationValue(dataflow, 'ESMS_HTML', 'AnnotationURL');
306
+ return {
307
+ geoLevelsByCode,
308
+ meta: {
309
+ code: datasetCode,
310
+ label: localizedName(dataflow) ?? datasetCode,
311
+ dimensions: dimensions.map(({ code, label }) => {
312
+ const values = valuesByDimension[code] ?? [];
313
+ return {
314
+ code,
315
+ label,
316
+ ...(measuredDimensions.has(code) && {
317
+ valuesCount: values.length,
318
+ sampleValues: values.slice(0, 10),
319
+ }),
320
+ };
321
+ }),
322
+ timeRange: { ...(start && { start }), ...(end && { end }) },
323
+ ...(!Number.isNaN(observationCount) && { obsCount: observationCount }),
324
+ ...(lastUpdated && { lastUpdated }),
325
+ ...(metadataUrl && { metadataUrl }),
326
+ },
327
+ valuesByDimension,
328
+ };
329
+ }
330
+ //# sourceMappingURL=sdmx-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdmx-metadata.js","sourceRoot":"","sources":["../../../src/services/eurostat-data/sdmx-metadata.ts"],"names":[],"mappings":"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"}
@@ -81,7 +81,7 @@ export interface Observation {
81
81
  */
82
82
  export type ObservationRow = Record<string, string | number | null>;
83
83
  /**
84
- * Metadata about a dataset extracted from a JSON-stat response.
84
+ * Metadata about a dataset extracted from its dataset-scoped SDMX structures.
85
85
  *
86
86
  * Annotation-derived fields are absent when Eurostat does not report them, rather than
87
87
  * defaulted — a missing count is not a zero, and a missing period bound is not an empty string.
@@ -101,11 +101,10 @@ export interface DatasetMeta {
101
101
  /**
102
102
  * One dimension of a dataset.
103
103
  *
104
- * `valuesCount`/`sampleValues` are absent when the dimension's value set could not be
105
- * measured. That happens for `time`, whose real period range takes a second request the
106
- * rest of the metadata does not depend on: when that request fails, the fields are omitted
107
- * rather than filled from the one-period slice, which would report a period count of 1 for
108
- * every dataset.
104
+ * `valuesCount`/`sampleValues` describe the values the dataset-scoped SDMX content
105
+ * constraint permits. They are absent when that constraint does not enumerate the
106
+ * dimension, rather than inferred from an observation slice that may cover only part of
107
+ * the dataset.
109
108
  */
110
109
  export interface DimensionInfo {
111
110
  code: string;
@@ -116,14 +115,17 @@ export interface DimensionInfo {
116
115
  label: string;
117
116
  }>;
118
117
  /**
119
- * Distinct values for this dimension: the dataset's full period set for `time`, the most
120
- * recent period's codelist otherwise. Absent when the value set was not measured.
118
+ * Distinct values permitted by the dataset-scoped content constraint, falling back to the
119
+ * referenced codelist when the constraint omits the dimension. Absent when neither source
120
+ * supplies a measurable value set.
121
121
  */
122
122
  valuesCount?: number;
123
123
  }
124
124
  export interface DimensionValuesResult {
125
125
  dimensionCode: string;
126
126
  dimensionLabel: string;
127
+ /** Effective hierarchy level for `geo`, including the omitted-input default. */
128
+ geoLevel?: GeoLevel;
127
129
  totalCount: number;
128
130
  values: Array<{
129
131
  code: string;
@@ -133,10 +135,10 @@ export interface DimensionValuesResult {
133
135
  /**
134
136
  * A decoded query result.
135
137
  *
136
- * `observations` is capped at `OBS_CAP`; `obsCount`, `missingObsCount` and `timeRange`
137
- * describe the whole match, so `obsCount` and `observations.length` diverge whenever the
138
- * cap bites. They are counted from the response's cell keys rather than from the decoded
139
- * array, so capping never changes what they report.
138
+ * `observations` is the caller-bounded deterministic prefix; `obsCount`,
139
+ * `missingObsCount` and `timeRange` describe the whole match. They are counted from the
140
+ * response's cell keys rather than from the decoded array, so previewing never changes
141
+ * what they report.
140
142
  *
141
143
  * `timeRange` bounds are absent when neither the returned observations nor the dataset-wide
142
144
  * annotations report them — an unknown bound is not an empty period.
@@ -149,9 +151,9 @@ export interface QueryResult {
149
151
  dimensionsUsed: string[];
150
152
  /** Observations with no value across the whole match, not just the decoded page. */
151
153
  missingObsCount: number;
152
- /** Observations matched upstream, before the `OBS_CAP` decode cap. */
154
+ /** Observations matched upstream, before the inline preview bound. */
153
155
  obsCount: number;
154
- /** Decoded observations, capped at `OBS_CAP` — the first cap rows in linear-index order. */
156
+ /** Decoded observations — the requested prefix in linear-index order. */
155
157
  observations: Observation[];
156
158
  timeRange: {
157
159
  start?: string;
@@ -161,8 +163,8 @@ export interface QueryResult {
161
163
  /**
162
164
  * A query result plus a lazy row source over everything it matched.
163
165
  *
164
- * `observations` stops at `OBS_CAP`; `rows()` does not. Both read the same
165
- * single walk of the response, so the capped list is always a prefix of the row
166
+ * `observations` stops at the requested preview bound; `rows()` does not. Both
167
+ * read the same response, so the preview is always a prefix of the row
166
168
  * source rather than a separately-derived set that can drift from it.
167
169
  */
168
170
  export interface QueryExecution extends QueryResult {
@@ -175,10 +177,10 @@ export interface QueryExecution extends QueryResult {
175
177
  rows: () => Generator<ObservationRow>;
176
178
  }
177
179
  /**
178
- * Upper bound on decoded observations returned for one query.
180
+ * Decode safety limit and threshold for staging a full matched result.
179
181
  *
180
- * Applied inside the decoder, so an oversized match never materializes as observation
181
- * objects. The totals alongside `observations` stay honest about the full match.
182
+ * The public preview limit is lower, but the decoder still enforces this ceiling. Matches
183
+ * above it are the only ones eligible for Canvas staging; totals remain uncapped.
182
184
  */
183
185
  export declare const OBS_CAP = 5000;
184
186
  export type GeoLevel = 'aggregate' | 'country' | 'nuts1' | 'nuts2' | 'nuts3';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/eurostat-data/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/eurostat-data/types.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,10 @@
3
3
  * @module services/eurostat-data/types
4
4
  */
5
5
  /**
6
- * Upper bound on decoded observations returned for one query.
6
+ * Decode safety limit and threshold for staging a full matched result.
7
7
  *
8
- * Applied inside the decoder, so an oversized match never materializes as observation
9
- * objects. The totals alongside `observations` stay honest about the full match.
8
+ * The public preview limit is lower, but the decoder still enforces this ceiling. Matches
9
+ * above it are the only ones eligible for Canvas staging; totals remain uncapped.
10
10
  */
11
11
  export const OBS_CAP = 5_000;
12
12
  /** Tuple of valid GeoLevel values — use with `z.enum(GEO_LEVEL_VALUES)` in tool schemas. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/eurostat-data/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4JH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAI7B,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;CAC+B,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/eurostat-data/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8JH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAI7B,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;CAC+B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/eurostat-mcp-server",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "mcpName": "io.github.cyanheads/eurostat-mcp-server",
5
5
  "description": "Search and query the Eurostat catalogue — EU economy, demography, trade, health, and NUTS regional data via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
package/server.json CHANGED
@@ -12,14 +12,14 @@
12
12
  "url": "https://eurostat.caseyjhand.com/mcp"
13
13
  }
14
14
  ],
15
- "version": "0.6.1",
15
+ "version": "0.6.2",
16
16
  "packages": [
17
17
  {
18
18
  "registryType": "npm",
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/eurostat-mcp-server",
21
21
  "runtimeHint": "bun",
22
- "version": "0.6.1",
22
+ "version": "0.6.2",
23
23
  "packageArguments": [
24
24
  {
25
25
  "type": "positional",
@@ -110,7 +110,7 @@
110
110
  "registryBaseUrl": "https://registry.npmjs.org",
111
111
  "identifier": "@cyanheads/eurostat-mcp-server",
112
112
  "runtimeHint": "bun",
113
- "version": "0.6.1",
113
+ "version": "0.6.2",
114
114
  "packageArguments": [
115
115
  {
116
116
  "type": "positional",