@cyanheads/eurostat-mcp-server 0.3.0 → 0.5.0
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/CLAUDE.md +1 -1
- package/Dockerfile +16 -3
- package/README.md +50 -7
- package/dist/config/server-config.d.ts +2 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +14 -0
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +28 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.d.ts +40 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.js +113 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.d.ts +34 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.js +98 -0
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts +93 -0
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js +362 -0
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.js.map +1 -0
- 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.js +2 -2
- 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 +9 -0
- 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 +68 -10
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js +3 -3
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js.map +1 -1
- package/dist/services/canvas-accessor.d.ts +31 -0
- package/dist/services/canvas-accessor.d.ts.map +1 -0
- package/dist/services/canvas-accessor.js +64 -0
- package/dist/services/canvas-accessor.js.map +1 -0
- package/dist/services/eurostat-bulk/eurostat-bulk-service.d.ts +89 -0
- package/dist/services/eurostat-bulk/eurostat-bulk-service.d.ts.map +1 -0
- package/dist/services/eurostat-bulk/eurostat-bulk-service.js +501 -0
- package/dist/services/eurostat-bulk/eurostat-bulk-service.js.map +1 -0
- package/dist/services/eurostat-bulk/types.d.ts +98 -0
- package/dist/services/eurostat-bulk/types.d.ts.map +1 -0
- package/dist/services/eurostat-bulk/types.js +82 -0
- package/dist/services/eurostat-bulk/types.js.map +1 -0
- package/dist/services/eurostat-data/eurostat-data-service.d.ts +63 -8
- package/dist/services/eurostat-data/eurostat-data-service.d.ts.map +1 -1
- package/dist/services/eurostat-data/eurostat-data-service.js +107 -13
- package/dist/services/eurostat-data/eurostat-data-service.js.map +1 -1
- package/dist/services/eurostat-data/types.d.ts +30 -0
- package/dist/services/eurostat-data/types.d.ts.map +1 -1
- package/dist/services/eurostat-data/types.js +4 -0
- package/dist/services/eurostat-data/types.js.map +1 -1
- package/package.json +2 -1
- package/server.json +85 -3
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
-
import {
|
|
7
|
+
import { acquireCanvas, getCanvas, newTableName } from '../../../services/canvas-accessor.js';
|
|
8
|
+
import { getEurostatDataService, observationRowSchema, } from '../../../services/eurostat-data/eurostat-data-service.js';
|
|
8
9
|
import { GEO_LEVEL_VALUES, OBS_CAP } from '../../../services/eurostat-data/types.js';
|
|
9
10
|
export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
10
11
|
title: 'Query Eurostat Dataset',
|
|
11
|
-
description: 'Fetch statistical data from a Eurostat dataset with dimension filters. Returns decoded observations with dimension codes and labels, numeric values, and status flags (e.g., "p" = provisional, "e" = estimated). Call eurostat_get_dataset_info first to discover valid dimension codes and values. Apply filters to keep the result set manageable — large unfiltered queries may trigger an async response error. Use filters.geo for specific country/region codes, or geo_level for NUTS hierarchy filtering (mutually exclusive). Use last_n_periods for the N most recent periods without knowing the end date.',
|
|
12
|
+
description: 'Fetch statistical data from a Eurostat dataset with dimension filters. Returns decoded observations with dimension codes and labels, numeric values, and status flags (e.g., "p" = provisional, "e" = estimated), capped at 5,000 inline rows. Call eurostat_get_dataset_info first to discover valid dimension codes and values. Apply filters to keep the result set manageable — large unfiltered queries may trigger an async response error. Use filters.geo for specific country/region codes, or geo_level for NUTS hierarchy filtering (mutually exclusive). Use last_n_periods for the N most recent periods without knowing the end date. This tool fetches a slice: past the inline cap, either narrow the filters, or — on a deployment that runs a dataframe canvas — read the staged SQL table this response names in tableName with eurostat_dataframe_query rather than re-querying Eurostat. When the target is a whole dataset rather than a slice, eurostat_download_dataset reads the SDMX bulk endpoint instead and is the cheaper route.',
|
|
12
13
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
13
14
|
input: z.object({
|
|
14
15
|
dataset_code: z.string().min(1).describe('Dataset code (e.g., "nama_10_gdp"). Required.'),
|
|
@@ -38,6 +39,10 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
38
39
|
.enum(['EN', 'FR', 'DE'])
|
|
39
40
|
.default('EN')
|
|
40
41
|
.describe('Language for labels in the response. Default is "EN". Options: "EN", "FR", "DE".'),
|
|
42
|
+
canvas_id: z
|
|
43
|
+
.string()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe('Reuse an existing dataframe canvas, so a result staged by this call lands beside earlier ones and can be joined against them. Pass a canvasId from a previous response; omit to start a fresh canvas. Ignored on deployments without a dataframe canvas, and when the result fits inline and nothing is staged.'),
|
|
41
46
|
}),
|
|
42
47
|
output: z.object({
|
|
43
48
|
datasetCode: z.string().describe('Dataset code as provided.'),
|
|
@@ -70,11 +75,23 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
70
75
|
.describe('Status flag for this observation. Omitted for normal observations.'),
|
|
71
76
|
})
|
|
72
77
|
.describe('A single decoded observation with dimension values, numeric value, and optional status.'))
|
|
73
|
-
.describe('Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods
|
|
78
|
+
.describe('Decoded observations, capped at 5,000 rows. Past the cap these are the first 5,000 the response enumerates — the leading combinations of the dataset dimensions, neither a sample nor the most recent periods. When tableName is set, these same rows and every row past the cap are staged on the dataframe canvas; when it is absent, narrow the query with dimension filters or a period range to choose which observations you get, or switch to eurostat_download_dataset when the whole dataset is what is wanted.'),
|
|
74
79
|
obsCount: z.number().describe('Total number of observations matched (before any cap).'),
|
|
75
80
|
truncated: z
|
|
76
81
|
.boolean()
|
|
77
|
-
.describe('True when the result exceeded 5,000 observations
|
|
82
|
+
.describe('True when the result exceeded 5,000 observations, so the returned rows are a prefix of the match rather than all of it. When tableName is set, the whole match is on the canvas and reachable with eurostat_dataframe_query; when it is absent, narrowing the query with dimension filters, or downloading the dataset with eurostat_download_dataset, is what brings the rest into reach.'),
|
|
83
|
+
canvasId: z
|
|
84
|
+
.string()
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('Dataframe canvas holding the staged result. Pass to eurostat_dataframe_describe, eurostat_dataframe_query, or a later eurostat_query_dataset call. Omitted when nothing was staged.'),
|
|
87
|
+
tableName: z
|
|
88
|
+
.string()
|
|
89
|
+
.optional()
|
|
90
|
+
.describe('Canvas table holding every matched observation in flat form — one code column per dimension plus a "_label" companion, then obs_value, obs_flag, obs_flag_label. Omitted when nothing was staged: either the result fit under the cap, or this deployment runs without a dataframe canvas.'),
|
|
91
|
+
stagedRowCount: z
|
|
92
|
+
.number()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe('Rows written to the canvas table. Matches obsCount. Omitted alongside tableName when nothing was staged.'),
|
|
78
95
|
timeRange: z
|
|
79
96
|
.object({
|
|
80
97
|
start: z
|
|
@@ -106,7 +123,7 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
106
123
|
notice: z
|
|
107
124
|
.string()
|
|
108
125
|
.optional()
|
|
109
|
-
.describe('Guidance when the result was
|
|
126
|
+
.describe('Guidance when the result was capped at 5,000 rows — where the rest of the match is, or how to narrow the query. Omitted for uncapped results.'),
|
|
110
127
|
},
|
|
111
128
|
enrichmentTrailer: {
|
|
112
129
|
appliedFilters: {
|
|
@@ -161,6 +178,12 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
161
178
|
when: 'Mutually exclusive parameters were combined: "geo" filter + geo_level, or since_period/until_period + last_n_periods.',
|
|
162
179
|
recovery: 'Use "geo" or geo_level (not both); use since_period/until_period or last_n_periods (not both).',
|
|
163
180
|
},
|
|
181
|
+
{
|
|
182
|
+
reason: 'canvas_not_found',
|
|
183
|
+
code: JsonRpcErrorCode.NotFound,
|
|
184
|
+
when: 'A canvas_id was supplied for staging but is unknown or its lifetime has elapsed.',
|
|
185
|
+
recovery: 'Omit canvas_id so the response starts a fresh canvas and returns its canvasId.',
|
|
186
|
+
},
|
|
164
187
|
],
|
|
165
188
|
async handler(input, ctx) {
|
|
166
189
|
const svc = getEurostatDataService();
|
|
@@ -204,13 +227,37 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
204
227
|
}
|
|
205
228
|
// The service caps `observations` while decoding, so its length says nothing about how
|
|
206
229
|
// large the match was. `obsCount` is the full total and is what truncation turns on.
|
|
207
|
-
const { appliedFilters, ...queryResult } = result;
|
|
230
|
+
const { appliedFilters, rows, ...queryResult } = result;
|
|
208
231
|
const truncated = result.obsCount > OBS_CAP;
|
|
232
|
+
/**
|
|
233
|
+
* Stage the whole match only when the cap actually bit. Under the cap the
|
|
234
|
+
* caller already holds every row, so a canvas table would duplicate the
|
|
235
|
+
* response and burn a per-tenant canvas slot for nothing.
|
|
236
|
+
*
|
|
237
|
+
* `rows()` is a generator over the response body already in memory, so this
|
|
238
|
+
* costs no extra upstream request and never builds the full row set as an
|
|
239
|
+
* array — the canvas appender pulls one row at a time.
|
|
240
|
+
*/
|
|
241
|
+
const canvas = truncated ? getCanvas() : undefined;
|
|
242
|
+
let staged;
|
|
243
|
+
if (canvas) {
|
|
244
|
+
const instance = await acquireCanvas(canvas, input.canvas_id, ctx);
|
|
245
|
+
const handle = await instance.registerTable(newTableName(), rows(), {
|
|
246
|
+
schema: observationRowSchema(result.dimensionsUsed),
|
|
247
|
+
signal: ctx.signal,
|
|
248
|
+
});
|
|
249
|
+
staged = {
|
|
250
|
+
canvasId: instance.canvasId,
|
|
251
|
+
tableName: handle.tableName,
|
|
252
|
+
stagedRowCount: handle.rowCount,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
209
255
|
ctx.log.info('Dataset query complete', {
|
|
210
256
|
datasetCode: input.dataset_code,
|
|
211
257
|
obsCount: result.obsCount,
|
|
212
258
|
truncated,
|
|
213
259
|
missingObsCount: result.missingObsCount,
|
|
260
|
+
...(staged && { canvasId: staged.canvasId, tableName: staged.tableName }),
|
|
214
261
|
});
|
|
215
262
|
// Sourced from the service's applied set, not raw input: a zero-length filter array is
|
|
216
263
|
// dropped from the upstream request, so echoing it back would claim a restriction that
|
|
@@ -225,9 +272,11 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
225
272
|
},
|
|
226
273
|
});
|
|
227
274
|
if (truncated) {
|
|
228
|
-
ctx.enrich.notice(
|
|
275
|
+
ctx.enrich.notice(staged
|
|
276
|
+
? `Inline rows capped at ${OBS_CAP.toLocaleString()} of ${result.obsCount.toLocaleString()} matched. All ${staged.stagedRowCount.toLocaleString()} are staged as table "${staged.tableName}" on canvas "${staged.canvasId}" — reach them with eurostat_dataframe_query, or narrow the query with dimension filters (geo, unit, na_item) to shrink what Eurostat sends.`
|
|
277
|
+
: `Result capped at ${OBS_CAP.toLocaleString()} of ${result.obsCount.toLocaleString()} matched rows. Add dimension filters (geo, unit, na_item) or a period range to bring the rest into reach, or call eurostat_download_dataset when the whole dataset is what is wanted.`);
|
|
229
278
|
}
|
|
230
|
-
return { ...queryResult, truncated };
|
|
279
|
+
return { ...queryResult, truncated, ...staged };
|
|
231
280
|
},
|
|
232
281
|
format: (result) => {
|
|
233
282
|
// An absent period bound is named as unreported rather than rendered as a blank, so
|
|
@@ -235,12 +284,21 @@ export const eurostatQueryDataset = tool('eurostat_query_dataset', {
|
|
|
235
284
|
const UNREPORTED = 'not reported by Eurostat';
|
|
236
285
|
const { start, end } = result.timeRange;
|
|
237
286
|
const period = start || end ? `${start ?? UNREPORTED} – ${end ?? UNREPORTED}` : UNREPORTED;
|
|
287
|
+
const truncationNote = !result.truncated
|
|
288
|
+
? ''
|
|
289
|
+
: result.tableName
|
|
290
|
+
? ' — inline rows capped at 5,000; the whole match is staged on the canvas below'
|
|
291
|
+
: ' — result capped at 5,000 rows. Add dimension filters, or call eurostat_download_dataset for the whole dataset.';
|
|
238
292
|
const lines = [
|
|
239
293
|
`# ${result.datasetLabel} (\`${result.datasetCode}\`)`,
|
|
240
294
|
`**Observations:** ${result.obsCount} (${result.missingObsCount} missing) | **Period:** ${period}`,
|
|
241
|
-
`**Truncated:** ${result.truncated}${
|
|
242
|
-
`**Dimensions:** ${result.dimensionsUsed.join(', ')}
|
|
295
|
+
`**Truncated:** ${result.truncated}${truncationNote}`,
|
|
296
|
+
`**Dimensions:** ${result.dimensionsUsed.join(', ')}`,
|
|
243
297
|
];
|
|
298
|
+
if (result.tableName) {
|
|
299
|
+
lines.push(`**Staged:** table \`${result.tableName}\` on canvas \`${result.canvasId}\` (stagedRowCount ${result.stagedRowCount}) — query it with eurostat_dataframe_query`);
|
|
300
|
+
}
|
|
301
|
+
lines.push('');
|
|
244
302
|
// Render every observation so content[] carries the same rows as structuredContent —
|
|
245
303
|
// both surfaces are already bounded by the row cap the decoder applies.
|
|
246
304
|
for (const obs of result.observations) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurostat-query-dataset.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-query-dataset.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"eurostat-query-dataset.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-query-dataset.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
|
7
7
|
import { getEurostatCatalogueService } from '../../../services/eurostat-catalogue/eurostat-catalogue-service.js';
|
|
8
8
|
export const eurostatSearchDatasets = tool('eurostat_search_datasets', {
|
|
9
9
|
title: 'Search Eurostat Datasets',
|
|
10
|
-
description: 'Search the Eurostat catalogue by keyword. Returns matching datasets with codes, descriptions, period coverage, and theme breadcrumbs. Use this to discover dataset codes before calling eurostat_get_dataset_info or
|
|
10
|
+
description: 'Search the Eurostat catalogue by keyword. Returns matching datasets with codes, descriptions, period coverage, and theme breadcrumbs. Use this to discover dataset codes before calling eurostat_get_dataset_info, then eurostat_query_dataset for a slice of a dataset or eurostat_download_dataset for the whole of one. Results are limited to datasets and predefined tables — folders are excluded.',
|
|
11
11
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
12
12
|
input: z.object({
|
|
13
13
|
query: z
|
|
@@ -33,7 +33,7 @@ export const eurostatSearchDatasets = tool('eurostat_search_datasets', {
|
|
|
33
33
|
.object({
|
|
34
34
|
code: z
|
|
35
35
|
.string()
|
|
36
|
-
.describe('Dataset code (e.g., "nama_10_gdp"). Use this in eurostat_get_dataset_info and
|
|
36
|
+
.describe('Dataset code (e.g., "nama_10_gdp"). Use this in eurostat_get_dataset_info, eurostat_query_dataset, and eurostat_download_dataset.'),
|
|
37
37
|
label: z.string().describe('Human-readable dataset title.'),
|
|
38
38
|
type: z
|
|
39
39
|
.enum(['dataset', 'table'])
|
|
@@ -131,7 +131,7 @@ export const eurostatSearchDatasets = tool('eurostat_search_datasets', {
|
|
|
131
131
|
});
|
|
132
132
|
return {
|
|
133
133
|
datasets,
|
|
134
|
-
nextStep: `Pass a "code" value to eurostat_get_dataset_info to inspect dimensions,
|
|
134
|
+
nextStep: `Pass a "code" value to eurostat_get_dataset_info to inspect dimensions, to eurostat_query_dataset to fetch a slice, or to eurostat_download_dataset to pull the whole dataset.`,
|
|
135
135
|
};
|
|
136
136
|
},
|
|
137
137
|
format: (result) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurostat-search-datasets.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-search-datasets.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAE1G,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,0BAA0B,EAAE;IACrE,KAAK,EAAE,0BAA0B;IACjC,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"eurostat-search-datasets.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-search-datasets.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Module-level accessor for the framework's optional DataCanvas
|
|
3
|
+
* service, plus the acquire helper every canvas-touching handler goes through.
|
|
4
|
+
* @module services/canvas-accessor
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import type { CanvasInstance, DataCanvas } from '@cyanheads/mcp-ts-core/canvas';
|
|
8
|
+
/** Wired from `setup(core)` in `src/index.ts`. `undefined` when canvas is off. */
|
|
9
|
+
export declare function setCanvas(canvas: DataCanvas | undefined): void;
|
|
10
|
+
/**
|
|
11
|
+
* The DataCanvas service, or `undefined` when `CANVAS_PROVIDER_TYPE` is not
|
|
12
|
+
* `duckdb`. Callers branch on the absence rather than assuming a canvas exists:
|
|
13
|
+
* the server is a supported configuration with and without one.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCanvas(): DataCanvas | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* A fresh handle for one staged table. Distinct per call — every staging call is
|
|
18
|
+
* its own result set, and a reused name would replace the previous table.
|
|
19
|
+
*/
|
|
20
|
+
export declare function newTableName(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Acquire a canvas, translating a scratch-directory permission failure into an
|
|
23
|
+
* error that names the variable to change.
|
|
24
|
+
*
|
|
25
|
+
* DuckDB writes spill files under `CANVAS_TEMP_PATH`, whose directory is created
|
|
26
|
+
* on the first acquire. A container running as a non-root user against a
|
|
27
|
+
* root-owned or read-only path otherwise surfaces a bare `EACCES … mkdir` with
|
|
28
|
+
* nothing to connect it to a configuration knob.
|
|
29
|
+
*/
|
|
30
|
+
export declare function acquireCanvas(canvas: DataCanvas, canvasId: string | undefined, ctx: Context): Promise<CanvasInstance>;
|
|
31
|
+
//# sourceMappingURL=canvas-accessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-accessor.d.ts","sourceRoot":"","sources":["../../src/services/canvas-accessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAKhF,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,UAAU,GAAG,SAAS,CAElD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAoBD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,cAAc,CAAC,CAYzB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Module-level accessor for the framework's optional DataCanvas
|
|
3
|
+
* service, plus the acquire helper every canvas-touching handler goes through.
|
|
4
|
+
* @module services/canvas-accessor
|
|
5
|
+
*/
|
|
6
|
+
import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
let _canvas;
|
|
8
|
+
/** Wired from `setup(core)` in `src/index.ts`. `undefined` when canvas is off. */
|
|
9
|
+
export function setCanvas(canvas) {
|
|
10
|
+
_canvas = canvas;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The DataCanvas service, or `undefined` when `CANVAS_PROVIDER_TYPE` is not
|
|
14
|
+
* `duckdb`. Callers branch on the absence rather than assuming a canvas exists:
|
|
15
|
+
* the server is a supported configuration with and without one.
|
|
16
|
+
*/
|
|
17
|
+
export function getCanvas() {
|
|
18
|
+
return _canvas;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A fresh handle for one staged table. Distinct per call — every staging call is
|
|
22
|
+
* its own result set, and a reused name would replace the previous table.
|
|
23
|
+
*/
|
|
24
|
+
export function newTableName() {
|
|
25
|
+
return `df_${globalThis.crypto.randomUUID().slice(0, 8)}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Errno codes meaning the configured scratch root cannot be written to.
|
|
29
|
+
*
|
|
30
|
+
* `ENOENT` is deliberately absent — `mkdir` is recursive, so a missing parent
|
|
31
|
+
* is created rather than reported.
|
|
32
|
+
*/
|
|
33
|
+
const UNWRITABLE_ERRNOS = new Set(['EACCES', 'EPERM', 'EROFS', 'ENOSPC']);
|
|
34
|
+
/** First `errno` code found on an error or any link of its `cause` chain. */
|
|
35
|
+
function errnoOf(err) {
|
|
36
|
+
for (let cur = err, depth = 0; cur instanceof Error && depth < 5; depth++) {
|
|
37
|
+
const code = cur.code;
|
|
38
|
+
if (typeof code === 'string' && UNWRITABLE_ERRNOS.has(code))
|
|
39
|
+
return code;
|
|
40
|
+
cur = cur.cause;
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Acquire a canvas, translating a scratch-directory permission failure into an
|
|
46
|
+
* error that names the variable to change.
|
|
47
|
+
*
|
|
48
|
+
* DuckDB writes spill files under `CANVAS_TEMP_PATH`, whose directory is created
|
|
49
|
+
* on the first acquire. A container running as a non-root user against a
|
|
50
|
+
* root-owned or read-only path otherwise surfaces a bare `EACCES … mkdir` with
|
|
51
|
+
* nothing to connect it to a configuration knob.
|
|
52
|
+
*/
|
|
53
|
+
export async function acquireCanvas(canvas, canvasId, ctx) {
|
|
54
|
+
try {
|
|
55
|
+
return await canvas.acquire(canvasId, ctx);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const errno = errnoOf(err);
|
|
59
|
+
if (!errno)
|
|
60
|
+
throw err;
|
|
61
|
+
throw serviceUnavailable(`DataCanvas could not create its scratch directory (${errno}). Point CANVAS_TEMP_PATH at a directory the server process can write to, or set CANVAS_PROVIDER_TYPE=none to run without the dataframe tools.`, { reason: 'canvas_unavailable', errno }, { cause: err instanceof Error ? err : undefined });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=canvas-accessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-accessor.js","sourceRoot":"","sources":["../../src/services/canvas-accessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,IAAI,OAA+B,CAAC;AAEpC,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,MAA8B;IACtD,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1E,6EAA6E;AAC7E,SAAS,OAAO,CAAC,GAAY;IAC3B,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,YAAY,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1E,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IAClB,CAAC;IACD,OAAO;AACT,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAkB,EAClB,QAA4B,EAC5B,GAAY;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,MAAM,GAAG,CAAC;QACtB,MAAM,kBAAkB,CACtB,sDAAsD,KAAK,gJAAgJ,EAC3M,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,EACvC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAClD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Eurostat Bulk Service — streaming client for the SDMX 2.1 TSV
|
|
3
|
+
* dissemination endpoint. Builds the positional dimension key, sniffs gzip off
|
|
4
|
+
* the stream, enforces a byte budget mid-transfer, classifies XML SOAP faults
|
|
5
|
+
* and the asynchronous queue envelope, and expands the wide TSV layout into
|
|
6
|
+
* one row per observation.
|
|
7
|
+
* @module services/eurostat-bulk/eurostat-bulk-service
|
|
8
|
+
*/
|
|
9
|
+
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
10
|
+
import type { ColumnSchema } from '@cyanheads/mcp-ts-core/canvas';
|
|
11
|
+
import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
|
|
12
|
+
import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
|
|
13
|
+
import { type BulkDownload, type TsvHeader } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Translate an XML body from the SDMX endpoint into the declared error contract.
|
|
16
|
+
*
|
|
17
|
+
* Two unrelated shapes arrive as XML and neither is data. A `S:Fault` envelope
|
|
18
|
+
* accompanies a 4xx and names the problem in a numeric `faultcode`. The
|
|
19
|
+
* `syncResponse` envelope arrives on **HTTP 200** carrying a queue ticket
|
|
20
|
+
* instead of the dataset — parsed as TSV it yields a header row of XML, so it is
|
|
21
|
+
* detected here rather than downstream.
|
|
22
|
+
*
|
|
23
|
+
* Always throws.
|
|
24
|
+
*/
|
|
25
|
+
export declare function classifyXmlBody(xml: string, datasetCode: string): never;
|
|
26
|
+
/**
|
|
27
|
+
* Split one wide-TSV cell into its value and flags.
|
|
28
|
+
*
|
|
29
|
+
* The grammar, read off live responses, is `<value>` `SPACE` `<flags>`, where
|
|
30
|
+
* flags is `<obs_flag>` optionally followed by `@<conf_status>` and either part
|
|
31
|
+
* may be empty: `429634.3 `, `3853937.0 p`, `: `, `: @C`. A cell that is empty
|
|
32
|
+
* on both sides of the split is not an observation at all and yields
|
|
33
|
+
* `undefined` — distinct from `: `, which is an observation Eurostat reports as
|
|
34
|
+
* unavailable.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseCell(cell: string): {
|
|
37
|
+
conf: string | null;
|
|
38
|
+
flag: string | null;
|
|
39
|
+
value: number | null;
|
|
40
|
+
} | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Parse the header line of a wide TSV body.
|
|
43
|
+
*
|
|
44
|
+
* The first tab-separated field is the comma-joined dimension list with
|
|
45
|
+
* `\TIME_PERIOD` appended to the last name; the remaining fields are the period
|
|
46
|
+
* codes, each padded with a trailing space Eurostat does not strip.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseHeader(line: string): TsvHeader;
|
|
49
|
+
/**
|
|
50
|
+
* Build the positional dimension key the SDMX path takes.
|
|
51
|
+
*
|
|
52
|
+
* The key is a dot-separated segment carrying one position per dimension **in
|
|
53
|
+
* dataset order excluding time**; empty means wildcard and `+` means OR. The
|
|
54
|
+
* count must match exactly — a key with one position too few or too many is
|
|
55
|
+
* rejected upstream with faultcode 140 — so positions are emitted for every
|
|
56
|
+
* dimension in `dimensionOrder`, filtered or not, and never only for the
|
|
57
|
+
* dimensions the caller named.
|
|
58
|
+
*
|
|
59
|
+
* Returns `undefined` when no filter applies. An all-wildcard key is accepted
|
|
60
|
+
* by Eurostat, but omitting the segment asks the same question without staking
|
|
61
|
+
* the request on this server's copy of the dimension order being current.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildKeyPath(dimensionOrder: string[], filters: Record<string, string[]>): string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Canvas column schema for {@link BulkRow}, declared rather than sniffed.
|
|
66
|
+
*
|
|
67
|
+
* Inference reads only the leading rows, which types an all-integer measure
|
|
68
|
+
* prefix as `BIGINT` — serialized back out as a string — and types an
|
|
69
|
+
* all-missing prefix from nulls alone. Every column is nullable: a measure is
|
|
70
|
+
* routinely unavailable, and flags are the exception rather than the rule.
|
|
71
|
+
*/
|
|
72
|
+
export declare function bulkRowSchema(dimensions: string[]): ColumnSchema[];
|
|
73
|
+
export declare class EurostatBulkService {
|
|
74
|
+
constructor(_config: AppConfig, _storage: StorageService);
|
|
75
|
+
private buildUrl;
|
|
76
|
+
/**
|
|
77
|
+
* Start a bulk download: issue the request, classify the response, parse the
|
|
78
|
+
* header, and hand back a generator over the body.
|
|
79
|
+
*
|
|
80
|
+
* The request is made once with no retry. A bulk body streams for up to
|
|
81
|
+
* `EUROSTAT_BULK_TIMEOUT_MS`, so re-running it on a transient failure costs
|
|
82
|
+
* the caller another full transfer for a request that is already the most
|
|
83
|
+
* expensive one this server makes; the failure is surfaced instead.
|
|
84
|
+
*/
|
|
85
|
+
startDownload(datasetCode: string, dimensionOrder: string[], filters: Record<string, string[]>, sinceP: string | undefined, untilP: string | undefined, ctx: Context): Promise<BulkDownload>;
|
|
86
|
+
}
|
|
87
|
+
export declare function initEurostatBulkService(config: AppConfig, storage: StorageService): void;
|
|
88
|
+
export declare function getEurostatBulkService(): EurostatBulkService;
|
|
89
|
+
//# sourceMappingURL=eurostat-bulk-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-bulk-service.d.ts","sourceRoot":"","sources":["../../../src/services/eurostat-bulk/eurostat-bulk-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAO/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,EACL,KAAK,YAAY,EAWjB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAmCpB;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,CAmCvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAchF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAkBnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAChC,MAAM,GAAG,SAAS,CAapB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAUlE;AAED,qBAAa,mBAAmB;IAI9B,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAI;IAE5D,OAAO,CAAC,QAAQ;IAiBhB;;;;;;;;OAQG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACjC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,YAAY,CAAC,CAyDvB;CACF;AA6RD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAExF;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAO5D"}
|