@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.
- package/AGENTS.md +1 -1
- package/CLAUDE.md +1 -1
- package/README.md +14 -12
- package/changelog/0.6.x/0.6.2.md +21 -0
- package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js +2 -2
- package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js +7 -4
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js +2 -2
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts +13 -1
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js +24 -3
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts +4 -3
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js +40 -21
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js.map +1 -1
- package/dist/services/eurostat-data/eurostat-data-service.d.ts +17 -55
- package/dist/services/eurostat-data/eurostat-data-service.d.ts.map +1 -1
- package/dist/services/eurostat-data/eurostat-data-service.js +88 -155
- package/dist/services/eurostat-data/eurostat-data-service.js.map +1 -1
- package/dist/services/eurostat-data/sdmx-metadata.d.ts +16 -0
- package/dist/services/eurostat-data/sdmx-metadata.d.ts.map +1 -0
- package/dist/services/eurostat-data/sdmx-metadata.js +330 -0
- package/dist/services/eurostat-data/sdmx-metadata.js.map +1 -0
- package/dist/services/eurostat-data/types.d.ts +21 -19
- package/dist/services/eurostat-data/types.d.ts.map +1 -1
- package/dist/services/eurostat-data/types.js +3 -3
- package/dist/services/eurostat-data/types.js.map +1 -1
- package/package.json +1 -1
- 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
|
|
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`
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
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
|
|
120
|
-
*
|
|
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
|
|
137
|
-
* describe the whole match
|
|
138
|
-
*
|
|
139
|
-
*
|
|
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
|
|
154
|
+
/** Observations matched upstream, before the inline preview bound. */
|
|
153
155
|
obsCount: number;
|
|
154
|
-
/** Decoded observations
|
|
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
|
|
165
|
-
*
|
|
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
|
-
*
|
|
180
|
+
* Decode safety limit and threshold for staging a full matched result.
|
|
179
181
|
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
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":"AAAA;;;GAGG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,uCAAuC;IACvC,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC;CACH;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,oEAAoE;IACpE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED
|
|
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
|
-
*
|
|
6
|
+
* Decode safety limit and threshold for staging a full matched result.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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;
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
113
|
+
"version": "0.6.2",
|
|
114
114
|
"packageArguments": [
|
|
115
115
|
{
|
|
116
116
|
"type": "positional",
|