@cyanheads/eurostat-mcp-server 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +6 -5
- package/CLAUDE.md +6 -5
- package/Dockerfile +7 -6
- package/README.md +36 -34
- package/changelog/0.10.x/0.10.0.md +40 -0
- package/changelog/0.10.x/0.10.1.md +27 -0
- package/dist/config/server-config.d.ts +1 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +9 -4
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/clamp-read-limit.d.ts +11 -0
- package/dist/mcp-server/tools/clamp-read-limit.d.ts.map +1 -0
- package/dist/mcp-server/tools/clamp-read-limit.js +14 -0
- package/dist/mcp-server/tools/clamp-read-limit.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.d.ts +10 -2
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.js +63 -10
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.d.ts +0 -1
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.js +14 -4
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-describe.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.d.ts +3 -3
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.js +113 -38
- package/dist/mcp-server/tools/definitions/eurostat-dataframe-query.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-download-dataset.tool.d.ts +101 -2
- 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 +60 -24
- 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.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js +10 -1
- 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 -6
- 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 +235 -53
- 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 +110 -5
- 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 +56 -26
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.d.ts +55 -2
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js +90 -22
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js.map +1 -1
- package/dist/mcp-server/tools/value-list-paging.d.ts +49 -0
- package/dist/mcp-server/tools/value-list-paging.d.ts.map +1 -0
- package/dist/mcp-server/tools/value-list-paging.js +73 -0
- package/dist/mcp-server/tools/value-list-paging.js.map +1 -0
- package/dist/services/canvas-accessor.d.ts +11 -1
- package/dist/services/canvas-accessor.d.ts.map +1 -1
- package/dist/services/canvas-accessor.js +13 -2
- package/dist/services/canvas-accessor.js.map +1 -1
- package/dist/services/eurostat-bulk/eurostat-bulk-service.d.ts +8 -4
- package/dist/services/eurostat-bulk/eurostat-bulk-service.d.ts.map +1 -1
- package/dist/services/eurostat-bulk/eurostat-bulk-service.js +131 -46
- package/dist/services/eurostat-bulk/eurostat-bulk-service.js.map +1 -1
- package/dist/services/eurostat-bulk/types.d.ts +1 -1
- package/dist/services/eurostat-bulk/types.d.ts.map +1 -1
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.d.ts +46 -4
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.d.ts.map +1 -1
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.js +146 -36
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.js.map +1 -1
- package/dist/services/eurostat-data/eurostat-data-service.d.ts +5 -0
- package/dist/services/eurostat-data/eurostat-data-service.d.ts.map +1 -1
- package/dist/services/eurostat-data/eurostat-data-service.js +144 -28
- package/dist/services/eurostat-data/eurostat-data-service.js.map +1 -1
- package/dist/services/eurostat-filters.d.ts +13 -0
- package/dist/services/eurostat-filters.d.ts.map +1 -0
- package/dist/services/eurostat-filters.js +21 -0
- package/dist/services/eurostat-filters.js.map +1 -0
- package/dist/services/eurostat-outage.d.ts +27 -0
- package/dist/services/eurostat-outage.d.ts.map +1 -0
- package/dist/services/eurostat-outage.js +44 -0
- package/dist/services/eurostat-outage.js.map +1 -0
- package/package.json +9 -9
- package/server.json +31 -17
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { CanvasIdSchema } from '@cyanheads/mcp-ts-core/canvas';
|
|
7
7
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
-
import {
|
|
8
|
+
import { decodeCursor, encodeCursor } from '@cyanheads/mcp-ts-core/utils';
|
|
9
|
+
import { filterTokens, fitPage, INLINE_BUDGET_BYTES, matchValues, utf8Bytes, } from '../value-list-paging.js';
|
|
10
|
+
import { acquireCanvas, getCanvas, isCanvasFailure, newTableName, } from '../../../services/canvas-accessor.js';
|
|
9
11
|
import { getEurostatDataService } from '../../../services/eurostat-data/eurostat-data-service.js';
|
|
10
12
|
import { GEO_LEVEL_VALUES } from '../../../services/eurostat-data/types.js';
|
|
13
|
+
import { outageAnswer } from '../../../services/eurostat-outage.js';
|
|
11
14
|
/**
|
|
12
15
|
* The staged value list: the same `{code, label}` pairs as the inline `values`,
|
|
13
16
|
* declared rather than sniffed. The service falls back to the code when Eurostat
|
|
@@ -17,17 +20,78 @@ const VALUE_TABLE_SCHEMA = [
|
|
|
17
20
|
{ name: 'code', type: 'VARCHAR', nullable: false },
|
|
18
21
|
{ name: 'label', type: 'VARCHAR', nullable: false },
|
|
19
22
|
];
|
|
23
|
+
/** Longest filter accepted: room for many words, while its echo and cursor stay small. */
|
|
24
|
+
const FILTER_MAX_CHARS = 500;
|
|
25
|
+
/** Page length when no limit was given: the byte budget alone ends the page. */
|
|
26
|
+
const NO_LIMIT = Number.MAX_SAFE_INTEGER;
|
|
27
|
+
/** A blank or whitespace-only string from a form client is "unset", never a value to validate. */
|
|
28
|
+
const blankAsUnset = (schema) => z.preprocess((value) => (typeof value === 'string' && value.trim() === '' ? undefined : value), schema);
|
|
29
|
+
const formatCount = (n) => n.toLocaleString('en-US');
|
|
30
|
+
/** The `content[]` text of the payload — `format()`'s body, shared with the byte measure. */
|
|
31
|
+
function renderText(result) {
|
|
32
|
+
const listed = result.values.length;
|
|
33
|
+
const partial = (of) => (listed < of ? ` — ${listed} listed below` : '');
|
|
34
|
+
const lines = [
|
|
35
|
+
`**Dimension:** ${result.dimensionLabel} (\`${result.dimensionCode}\`)`,
|
|
36
|
+
...(result.geoLevel ? [`**Geo level:** \`${result.geoLevel}\``] : []),
|
|
37
|
+
`**Total values:** ${result.totalCount}${result.matchCount === undefined ? partial(result.totalCount) : ''}`,
|
|
38
|
+
...(result.matchCount === undefined
|
|
39
|
+
? []
|
|
40
|
+
: [`**Matching filter:** ${result.matchCount}${partial(result.matchCount)}`]),
|
|
41
|
+
...(result.tableName
|
|
42
|
+
? [
|
|
43
|
+
`**Staged:** table \`${result.tableName}\` on canvas \`${result.canvasId}\` (stagedRowCount ${result.stagedRowCount}), columns code and label — inspect it with eurostat_dataframe_describe first, then join it in eurostat_dataframe_query`,
|
|
44
|
+
]
|
|
45
|
+
: []),
|
|
46
|
+
'',
|
|
47
|
+
];
|
|
48
|
+
for (const v of result.values) {
|
|
49
|
+
lines.push(`- \`${v.code}\` — ${v.label}`);
|
|
50
|
+
}
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
20
53
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
54
|
+
* The framework's `content[]` trailer for one page's enrichment: generic
|
|
55
|
+
* `**key:** value` lines, then the notice as a block quote, newline-joined. It
|
|
56
|
+
* is mirrored here so a page is measured as the caller receives it; a paging
|
|
57
|
+
* test pins the trailer the framework composes to this exact text, so the two
|
|
58
|
+
* cannot drift apart unnoticed.
|
|
26
59
|
*/
|
|
27
|
-
|
|
60
|
+
function renderTrailer(enrichment) {
|
|
61
|
+
const fields = [
|
|
62
|
+
...(enrichment.truncated ? ['**truncated:** true'] : []),
|
|
63
|
+
...(enrichment.nextCursor ? [`**nextCursor:** ${enrichment.nextCursor}`] : []),
|
|
64
|
+
...(enrichment.notice ? [`> ${enrichment.notice}`] : []),
|
|
65
|
+
];
|
|
66
|
+
return fields.length > 0 ? `\n\n${fields.join('\n')}` : '';
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Decode a cursor and confirm it belongs to this call in every binding the input
|
|
70
|
+
* alone settles; `undefined` when it does not. Malformed and mismatched cursors
|
|
71
|
+
* are refused alike: the recovery is the same, and the cursor is opaque. The
|
|
72
|
+
* effective geo level is left to the caller, which knows it only once the
|
|
73
|
+
* dimension's values are loaded.
|
|
74
|
+
*/
|
|
75
|
+
function readCursor(cursor, binding, ctx) {
|
|
76
|
+
try {
|
|
77
|
+
const state = decodeCursor(cursor, ctx);
|
|
78
|
+
if (typeof state.after === 'string' &&
|
|
79
|
+
state.dataset === binding.dataset &&
|
|
80
|
+
state.dimension === binding.dimension &&
|
|
81
|
+
state.filter === binding.filter) {
|
|
82
|
+
return { after: state.after, geoLevel: state.geoLevel, limit: state.limit };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Undecodable — the same refusal as one that decodes but belongs to another call.
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
/** The refusal of a cursor that is malformed or belongs to another call. */
|
|
91
|
+
const UNUSABLE_CURSOR = 'Unusable cursor: it is malformed, or was issued for a different dataset_code, dimension, geo_level or filter.';
|
|
28
92
|
export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values', {
|
|
29
93
|
title: 'Get Eurostat Dimension Values',
|
|
30
|
-
description: `List the valid values for a specific dimension in a Eurostat dataset (e.g., all unit codes for nama_10_gdp, all geo codes for a regional dataset). Use this when eurostat_get_dataset_info returns more values than the 10-item sample, or to confirm exact codes before querying. For the "geo" dimension, use geo_level to filter by NUTS hierarchy (country, nuts1, nuts2, nuts3). An invalid code matches nothing: eurostat_query_dataset names it in unmatchedValues, or in its no_results error when the query matched nothing at all, and Eurostat rejects it as a fault on eurostat_download_dataset; use this tool to verify codes first.
|
|
94
|
+
description: `List the valid values for a specific dimension in a Eurostat dataset (e.g., all unit codes for nama_10_gdp, all geo codes for a regional dataset). Use this when eurostat_get_dataset_info returns more values than the 10-item sample, or to confirm exact codes before querying. For the "geo" dimension, use geo_level to filter by NUTS hierarchy (country, nuts1, nuts2, nuts3). An invalid code matches nothing: eurostat_query_dataset names it in unmatchedValues, or in its no_results error when the query matched nothing at all, and Eurostat rejects it as a fault on eurostat_download_dataset; use this tool to verify codes first. To find one code in a long list, such as the 37,069 CN8 product codes of DS-045409, pass filter: words its code or label contains. A long list comes back a page at a time, each response held to ${formatCount(INLINE_BUDGET_BYTES)} bytes; a page with more after it carries nextCursor — pass it back as cursor for the next page. Pass canvas_id to also stage the whole list, whatever its length, as a two-column code/label table on that dataframe canvas: search it with SQL, or join it to a eurostat_download_dataset table, whose columns carry dimension codes only.`,
|
|
31
95
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
32
96
|
input: z.object({
|
|
33
97
|
dataset_code: z
|
|
@@ -42,7 +106,15 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
42
106
|
.enum(GEO_LEVEL_VALUES)
|
|
43
107
|
.optional()
|
|
44
108
|
.describe('NUTS hierarchy level filter — applies only when dimension is "geo"; passing it with any other dimension is rejected. Options: "aggregate" (EU/EA codes), "country" (2-letter codes, default), "nuts1" (3-char), "nuts2" (4-char), "nuts3" (5-char).'),
|
|
45
|
-
|
|
109
|
+
filter: blankAsUnset(z.string().max(FILTER_MAX_CHARS).optional()).describe(`Words to find, up to ${FILTER_MAX_CHARS} characters: keeps only values whose code and label, joined by a space, contain every whitespace-separated word as a substring — in any order, ignoring case and accents ("palma frankfurt" finds DE_EDDF_ES_LEPA, "zurich" finds Zürich). Punctuation is part of a word, and spellings are not transliterated ("münchen" does not find MUENCHEN). Runs over the whole list at the effective geo_level before paging and keeps Eurostat's order, with no ranking; matchCount counts the matches.`),
|
|
110
|
+
limit: z
|
|
111
|
+
.number()
|
|
112
|
+
.int()
|
|
113
|
+
.min(1)
|
|
114
|
+
.optional()
|
|
115
|
+
.describe(`Most values per page. No default and no maximum: without it a page holds as many whole values as fit ${formatCount(INLINE_BUDGET_BYTES)} bytes, and with it the page ends at whichever comes first. Fixed by the first call: on a call with cursor, the cursor carries that first limit and this field is ignored.`),
|
|
116
|
+
cursor: blankAsUnset(z.string().optional()).describe("Opaque nextCursor from the previous page; omit for the first page. It resumes after that page's last code and is bound to dataset_code, dimension, geo_level and filter, so send those unchanged. Cannot be combined with canvas_id on a deployment with a dataframe canvas."),
|
|
117
|
+
canvas_id: CanvasIdSchema.optional().describe('Also stage the values on this dataframe canvas as a table with two columns, code and label, holding every value the dimension lists at the geo_level requested (country when it is omitted), whatever filter and limit are. Pass the canvasId a eurostat_download_dataset or eurostat_query_dataset response returned, then search the staged table with SQL or join it to a download on the dimension column (e.g., d.geo = g.code). Only on a call without cursor; omit to return the values inline only: this tool never starts a canvas. Ignored on deployments without a dataframe canvas.'),
|
|
46
118
|
}),
|
|
47
119
|
output: z.object({
|
|
48
120
|
dimensionCode: z.string().describe('The dimension code that was queried.'),
|
|
@@ -60,10 +132,14 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
60
132
|
label: z.string().describe('Human-readable label for this value.'),
|
|
61
133
|
})
|
|
62
134
|
.describe('A dimension value code and label pair.'))
|
|
63
|
-
.describe(`
|
|
135
|
+
.describe(`This page of the dataset-available values, in Eurostat's order — for geo, the subset at geoLevel; with filter, only the matches. A page ends between whole values, at limit or at ${formatCount(INLINE_BUDGET_BYTES)} bytes per response surface, whichever comes first, and holds at least one value; truncated and nextCursor are set when more follow.`),
|
|
64
136
|
totalCount: z
|
|
65
137
|
.number()
|
|
66
|
-
.describe('Number of distinct values the dimension lists, after geoLevel filtering for geo —
|
|
138
|
+
.describe('Number of distinct values the dimension lists, after geoLevel filtering for geo — every one, whatever filter and paging apply.'),
|
|
139
|
+
matchCount: z
|
|
140
|
+
.number()
|
|
141
|
+
.optional()
|
|
142
|
+
.describe('Values matching filter across the whole list, before paging. Present only when filter was passed.'),
|
|
67
143
|
canvasId: z
|
|
68
144
|
.string()
|
|
69
145
|
.optional()
|
|
@@ -81,13 +157,15 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
81
157
|
truncated: z
|
|
82
158
|
.boolean()
|
|
83
159
|
.optional()
|
|
84
|
-
.describe('True when
|
|
85
|
-
|
|
86
|
-
|
|
160
|
+
.describe('True when more values follow this page — pass nextCursor as cursor to fetch them. Omitted on the last page.'),
|
|
161
|
+
nextCursor: z
|
|
162
|
+
.string()
|
|
163
|
+
.optional()
|
|
164
|
+
.describe("Opaque cursor for the next page. Pass it back as cursor with dataset_code, dimension, geo_level and filter unchanged; it resumes after this page's last code. Omitted on the last page."),
|
|
87
165
|
notice: z
|
|
88
166
|
.string()
|
|
89
167
|
.optional()
|
|
90
|
-
.describe('
|
|
168
|
+
.describe('On a page with more after it: whether limit or the response budget ended it, and the routes to the rest — nextCursor, filter, and canvas_id. Also explains a filter that matched nothing.'),
|
|
91
169
|
},
|
|
92
170
|
errors: [
|
|
93
171
|
{
|
|
@@ -105,13 +183,19 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
105
183
|
{
|
|
106
184
|
reason: 'conflicting_params',
|
|
107
185
|
code: JsonRpcErrorCode.ValidationError,
|
|
108
|
-
when: 'geo_level was combined with a dimension other than "geo", where it has no effect.',
|
|
109
|
-
recovery: 'Drop geo_level
|
|
186
|
+
when: 'geo_level was combined with a dimension other than "geo", where it has no effect; or, on a deployment with a dataframe canvas, canvas_id was combined with cursor, which would stage the list again on every page.',
|
|
187
|
+
recovery: 'Drop geo_level for a dimension other than "geo"; when paging with cursor, drop canvas_id — a first call that carried canvas_id staged every value.',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
reason: 'invalid_cursor',
|
|
191
|
+
code: JsonRpcErrorCode.InvalidParams,
|
|
192
|
+
when: 'The cursor is malformed, was issued for a different dataset_code, dimension, geo_level or filter, or resumes after a code the list no longer holds.',
|
|
193
|
+
recovery: 'Call again without cursor, keeping dataset_code, dimension, geo_level and filter, then page with the nextCursor that call returns.',
|
|
110
194
|
},
|
|
111
195
|
{
|
|
112
196
|
reason: 'upstream_fault',
|
|
113
197
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
114
|
-
when: "Eurostat returned a dataset structure or content constraint this server cannot read
|
|
198
|
+
when: "Eurostat returned a dataset structure or content constraint this server cannot read — malformed, truncated, not XML, or missing the requested dataset's dataflow — or the structure endpoint answered HTTP 5xx or could not be reached on every retry, which the error marks retryable.",
|
|
115
199
|
recovery: 'Retry in a few minutes, since a failed structure read is not cached. If it fails the same way, filter eurostat_query_dataset on the code in question: a code the dataset lacks comes back in unmatchedValues.',
|
|
116
200
|
},
|
|
117
201
|
{
|
|
@@ -119,10 +203,35 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
119
203
|
code: JsonRpcErrorCode.NotFound,
|
|
120
204
|
when: 'A canvas_id was supplied for staging but is unknown or its lifetime has elapsed.',
|
|
121
205
|
recovery: 'Pass the canvasId a recent eurostat_download_dataset or eurostat_query_dataset response returned, or omit canvas_id to list the values inline only.',
|
|
122
|
-
thrownBy: 'service',
|
|
123
206
|
},
|
|
124
207
|
],
|
|
125
208
|
async handler(input, ctx) {
|
|
209
|
+
/**
|
|
210
|
+
* Without a dataframe canvas canvas_id is ignored, so it cannot re-stage the
|
|
211
|
+
* list on every page and there is nothing to refuse.
|
|
212
|
+
*/
|
|
213
|
+
if (input.cursor && input.canvas_id && getCanvas()) {
|
|
214
|
+
throw ctx.fail('conflicting_params', 'canvas_id stages the whole list, so it belongs on the first call; sent with cursor it would stage the list again for every page.', {
|
|
215
|
+
recovery: {
|
|
216
|
+
hint: 'Drop canvas_id to keep paging with cursor; a first call that carried canvas_id has already staged every value. To stage the list now, call again with canvas_id and without cursor.',
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* A cursor is checked against everything the input settles before the
|
|
222
|
+
* dimension's values are loaded, so a cursor replayed for another dataset
|
|
223
|
+
* fails without downloading that dataset's structure.
|
|
224
|
+
*/
|
|
225
|
+
const tokens = input.filter ? filterTokens(input.filter) : [];
|
|
226
|
+
const filtered = tokens.length > 0;
|
|
227
|
+
const binding = {
|
|
228
|
+
dataset: input.dataset_code.toLowerCase(),
|
|
229
|
+
dimension: input.dimension,
|
|
230
|
+
filter: [...tokens].sort().join(' '),
|
|
231
|
+
};
|
|
232
|
+
const resume = input.cursor ? readCursor(input.cursor, binding, ctx) : undefined;
|
|
233
|
+
if (input.cursor && !resume)
|
|
234
|
+
throw ctx.fail('invalid_cursor', UNUSABLE_CURSOR);
|
|
126
235
|
const svc = getEurostatDataService();
|
|
127
236
|
let result;
|
|
128
237
|
try {
|
|
@@ -152,6 +261,14 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
152
261
|
},
|
|
153
262
|
});
|
|
154
263
|
}
|
|
264
|
+
if (reason === 'upstream_fault' && err.data?.retryable === true) {
|
|
265
|
+
throw ctx.fail('upstream_fault', err.message, {
|
|
266
|
+
retryable: true,
|
|
267
|
+
recovery: {
|
|
268
|
+
hint: `Eurostat's SDMX structure endpoint ${outageAnswer(err.data?.status)} on every attempt, so the "${input.dimension}" values of "${input.dataset_code}" cannot be listed — an upstream outage, not a fault in the request. A failed read is not cached, so retry in a few minutes.`,
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
}
|
|
155
272
|
if (reason === 'upstream_fault') {
|
|
156
273
|
throw ctx.fail('upstream_fault', err.message, {
|
|
157
274
|
recovery: {
|
|
@@ -170,7 +287,13 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
170
287
|
const canvas = input.canvas_id ? getCanvas() : undefined;
|
|
171
288
|
let staged;
|
|
172
289
|
if (canvas && result.values.length > 0) {
|
|
173
|
-
|
|
290
|
+
// Re-thrown so the declared recovery replaces the canvas service's generic one.
|
|
291
|
+
const instance = await acquireCanvas(canvas, input.canvas_id, ctx).catch((err) => {
|
|
292
|
+
if (isCanvasFailure(err, 'canvas_not_found')) {
|
|
293
|
+
throw ctx.fail('canvas_not_found', err.message, { canvasId: input.canvas_id }, { cause: err });
|
|
294
|
+
}
|
|
295
|
+
throw err;
|
|
296
|
+
});
|
|
174
297
|
const handle = await instance.registerTable(newTableName(), result.values, {
|
|
175
298
|
schema: VALUE_TABLE_SCHEMA,
|
|
176
299
|
signal: ctx.signal,
|
|
@@ -181,46 +304,105 @@ export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values',
|
|
|
181
304
|
tableName: handle.tableName,
|
|
182
305
|
};
|
|
183
306
|
}
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
307
|
+
const matched = filtered ? matchValues(result.values, tokens) : result.values;
|
|
308
|
+
const geoLevel = result.geoLevel ?? null;
|
|
309
|
+
/**
|
|
310
|
+
* Where this page starts: after the code the cursor names, wherever that code
|
|
311
|
+
* now sits, so a list that grew between calls still resumes after the right
|
|
312
|
+
* value. The codec's `offset` is recorded but never trusted for position.
|
|
313
|
+
*/
|
|
314
|
+
let start = 0;
|
|
315
|
+
let pageLimit = input.limit ?? NO_LIMIT;
|
|
316
|
+
if (resume) {
|
|
317
|
+
if (resume.geoLevel !== geoLevel)
|
|
318
|
+
throw ctx.fail('invalid_cursor', UNUSABLE_CURSOR);
|
|
319
|
+
const anchor = matched.findIndex(({ code }) => code === resume.after);
|
|
320
|
+
if (anchor < 0) {
|
|
321
|
+
throw ctx.fail('invalid_cursor', `Unusable cursor: it resumes after "${resume.after}", which the "${input.dimension}" values of "${input.dataset_code}" no longer list${filtered ? ' under this filter' : ''}.`);
|
|
322
|
+
}
|
|
323
|
+
start = anchor + 1;
|
|
324
|
+
pageLimit = resume.limit;
|
|
196
325
|
}
|
|
326
|
+
const filterEcho = input.filter?.trim().replace(/\s+/g, ' ');
|
|
327
|
+
const pool = filtered
|
|
328
|
+
? `${formatCount(matched.length)} values matching filter "${filterEcho}"`
|
|
329
|
+
: `${formatCount(matched.length)} "${input.dimension}" values`;
|
|
330
|
+
const canvasRoute = staged
|
|
331
|
+
? ` Every one of the ${formatCount(staged.stagedRowCount)} values is staged as table "${staged.tableName}" on canvas "${staged.canvasId}" — search it with eurostat_dataframe_query (e.g. SELECT code, label FROM ${staged.tableName} WHERE label ILIKE '%term%').`
|
|
332
|
+
: getCanvas()
|
|
333
|
+
? ` Or, on a call without cursor, pass canvas_id — the canvasId of a eurostat_query_dataset or eurostat_download_dataset response — to stage all ${formatCount(result.totalCount)} as a code/label table to search with eurostat_dataframe_query.`
|
|
334
|
+
: '';
|
|
335
|
+
const page = (k) => {
|
|
336
|
+
const values = matched.slice(start, start + k);
|
|
337
|
+
const output = {
|
|
338
|
+
...result,
|
|
339
|
+
values,
|
|
340
|
+
...(filtered && { matchCount: matched.length }),
|
|
341
|
+
...staged,
|
|
342
|
+
};
|
|
343
|
+
if (start + k < matched.length) {
|
|
344
|
+
const endedBy = k === pageLimit
|
|
345
|
+
? `limit ${formatCount(pageLimit)}`
|
|
346
|
+
: `the ${formatCount(INLINE_BUDGET_BYTES)}-byte response budget`;
|
|
347
|
+
return {
|
|
348
|
+
output,
|
|
349
|
+
enrichment: {
|
|
350
|
+
truncated: true,
|
|
351
|
+
nextCursor: encodeCursor({
|
|
352
|
+
offset: start + k,
|
|
353
|
+
limit: pageLimit,
|
|
354
|
+
after: values[k - 1]?.code,
|
|
355
|
+
...binding,
|
|
356
|
+
geoLevel,
|
|
357
|
+
}),
|
|
358
|
+
notice: `Values ${formatCount(start + 1)}–${formatCount(start + k)} of ${pool}, in Eurostat's order; ${endedBy} ended this page. Pass nextCursor as cursor for the next page, or ${filtered ? 'add words to filter' : 'pass filter (words of the code or label)'} to narrow the list.${canvasRoute}`,
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
// An empty page needs saying only when a cursor or filter emptied it.
|
|
363
|
+
if (values.length > 0 || !(input.cursor || filtered))
|
|
364
|
+
return { output, enrichment: {} };
|
|
365
|
+
return {
|
|
366
|
+
output,
|
|
367
|
+
enrichment: {
|
|
368
|
+
notice: input.cursor
|
|
369
|
+
? `No "${input.dimension}" values of "${input.dataset_code}" follow the code this cursor resumes after: the list ends there.`
|
|
370
|
+
: `No "${input.dimension}" value${result.geoLevel ? ` at geo_level "${result.geoLevel}"` : ''} of "${input.dataset_code}" matched filter "${filterEcho}": every word must appear in a value's code or label, in any order, ignoring case and accents. Drop or shorten a word, or ${staged
|
|
371
|
+
? `search all ${formatCount(staged.stagedRowCount)} values, staged as table "${staged.tableName}" on canvas "${staged.canvasId}", with eurostat_dataframe_query (e.g. SELECT code, label FROM ${staged.tableName} WHERE label ILIKE '%term%').`
|
|
372
|
+
: `call without filter to page through all ${formatCount(result.totalCount)}.`}`,
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
};
|
|
376
|
+
const measure = (k) => {
|
|
377
|
+
const { output, enrichment } = page(k);
|
|
378
|
+
return {
|
|
379
|
+
structured: utf8Bytes(JSON.stringify({ ...output, ...enrichment })),
|
|
380
|
+
text: utf8Bytes(renderText(output) + renderTrailer(enrichment)),
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
const costOf = (index) => {
|
|
384
|
+
const value = matched[start + index];
|
|
385
|
+
return {
|
|
386
|
+
structured: utf8Bytes(JSON.stringify(value)) + 1,
|
|
387
|
+
text: utf8Bytes(`- \`${value.code}\` — ${value.label}`) + 1,
|
|
388
|
+
};
|
|
389
|
+
};
|
|
390
|
+
const { output, enrichment } = page(fitPage(Math.min(pageLimit, matched.length - start), measure, costOf));
|
|
391
|
+
const { notice, ...fields } = enrichment;
|
|
392
|
+
ctx.enrich(fields);
|
|
393
|
+
if (notice)
|
|
394
|
+
ctx.enrich.notice(notice);
|
|
197
395
|
ctx.log.info('Dimension values fetched', {
|
|
198
396
|
datasetCode: input.dataset_code,
|
|
199
397
|
dimension: input.dimension,
|
|
200
398
|
totalCount: result.totalCount,
|
|
201
|
-
|
|
399
|
+
...(filtered && { matchCount: matched.length }),
|
|
400
|
+
shown: output.values.length,
|
|
401
|
+
hasMore: enrichment.truncated === true,
|
|
202
402
|
...(staged && { canvasId: staged.canvasId, tableName: staged.tableName }),
|
|
203
403
|
});
|
|
204
|
-
return
|
|
205
|
-
},
|
|
206
|
-
format: (result) => {
|
|
207
|
-
const lines = [
|
|
208
|
-
`**Dimension:** ${result.dimensionLabel} (\`${result.dimensionCode}\`)`,
|
|
209
|
-
...(result.geoLevel ? [`**Geo level:** \`${result.geoLevel}\``] : []),
|
|
210
|
-
`**Total values:** ${result.totalCount}${result.values.length < result.totalCount
|
|
211
|
-
? ` — the first ${result.values.length} are listed below`
|
|
212
|
-
: ''}`,
|
|
213
|
-
...(result.tableName
|
|
214
|
-
? [
|
|
215
|
-
`**Staged:** table \`${result.tableName}\` on canvas \`${result.canvasId}\` (stagedRowCount ${result.stagedRowCount}), columns code and label — inspect it with eurostat_dataframe_describe first, then join it in eurostat_dataframe_query`,
|
|
216
|
-
]
|
|
217
|
-
: []),
|
|
218
|
-
'',
|
|
219
|
-
];
|
|
220
|
-
for (const v of result.values) {
|
|
221
|
-
lines.push(`- \`${v.code}\` — ${v.label}`);
|
|
222
|
-
}
|
|
223
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
404
|
+
return output;
|
|
224
405
|
},
|
|
406
|
+
format: (result) => [{ type: 'text', text: renderText(result) }],
|
|
225
407
|
});
|
|
226
408
|
//# sourceMappingURL=eurostat-get-dimension-values.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurostat-get-dimension-values.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eurostat-get-dimension-values.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,107 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
/** Selects the advertised limit policy before registration. */
|
|
8
|
+
export declare const createEurostatQueryDataset: (clampLimits: boolean) => import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
dataset_code: z.ZodString;
|
|
10
|
+
filters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
11
|
+
geo_level: z.ZodOptional<z.ZodEnum<{
|
|
12
|
+
aggregate: "aggregate";
|
|
13
|
+
country: "country";
|
|
14
|
+
nuts1: "nuts1";
|
|
15
|
+
nuts2: "nuts2";
|
|
16
|
+
nuts3: "nuts3";
|
|
17
|
+
}>>;
|
|
18
|
+
since_period: z.ZodOptional<z.ZodString>;
|
|
19
|
+
until_period: z.ZodOptional<z.ZodString>;
|
|
20
|
+
last_n_periods: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
preview_limit: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
lang: z.ZodDefault<z.ZodEnum<{
|
|
23
|
+
DE: "DE";
|
|
24
|
+
EN: "EN";
|
|
25
|
+
FR: "FR";
|
|
26
|
+
}>>;
|
|
27
|
+
canvas_id: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
29
|
+
datasetCode: z.ZodString;
|
|
30
|
+
datasetLabel: z.ZodString;
|
|
31
|
+
dimensionsUsed: z.ZodArray<z.ZodString>;
|
|
32
|
+
observations: z.ZodArray<z.ZodObject<{
|
|
33
|
+
dimensions: z.ZodObject<{}, z.core.$loose>;
|
|
34
|
+
value: z.ZodNullable<z.ZodNumber>;
|
|
35
|
+
valueText: z.ZodOptional<z.ZodString>;
|
|
36
|
+
status: z.ZodOptional<z.ZodObject<{
|
|
37
|
+
code: z.ZodString;
|
|
38
|
+
label: z.ZodString;
|
|
39
|
+
}, z.core.$strip>>;
|
|
40
|
+
confStatus: z.ZodOptional<z.ZodObject<{
|
|
41
|
+
code: z.ZodString;
|
|
42
|
+
label: z.ZodString;
|
|
43
|
+
}, z.core.$strip>>;
|
|
44
|
+
}, z.core.$strip>>;
|
|
45
|
+
obsCount: z.ZodNumber;
|
|
46
|
+
truncated: z.ZodBoolean;
|
|
47
|
+
canvasId: z.ZodOptional<z.ZodString>;
|
|
48
|
+
tableName: z.ZodOptional<z.ZodString>;
|
|
49
|
+
stagedRowCount: z.ZodOptional<z.ZodNumber>;
|
|
50
|
+
timeRange: z.ZodObject<{
|
|
51
|
+
start: z.ZodOptional<z.ZodString>;
|
|
52
|
+
end: z.ZodOptional<z.ZodString>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
missingObsCount: z.ZodNumber;
|
|
55
|
+
unmatchedValues: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
56
|
+
}, z.core.$strip>, readonly [{
|
|
57
|
+
readonly reason: "not_found";
|
|
58
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
59
|
+
readonly when: "The dataset code does not exist (HTTP 404 carrying Eurostat error id 100).";
|
|
60
|
+
readonly recovery: "Use eurostat_search_datasets or eurostat_browse_themes to find a valid dataset code.";
|
|
61
|
+
}, {
|
|
62
|
+
readonly reason: "no_results";
|
|
63
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
64
|
+
readonly when: "The query matched no observation cells — including Eurostat HTTP-200 error id 100. The dataset is valid, but no cell carries a value or a status flag for that filter combination and period range. When Eurostat returns the empty table, the error names the filter values that matched nothing (data.unmatchedValues) and the selected periods that carry no value (data.matchedPeriods, the newest 24, with data.matchedPeriodCount counting all of them).";
|
|
65
|
+
readonly recovery: "Verify dimension values with eurostat_get_dimension_values and keep the period range inside the dataset coverage; both an unmatched value and an out-of-coverage range return no data rather than an error.";
|
|
66
|
+
}, {
|
|
67
|
+
readonly reason: "invalid_period";
|
|
68
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
69
|
+
readonly when: "since_period or until_period is not a period literal, or names a month, quarter, semester, trimester, week or day that does not exist, or since_period starts after until_period ends. Checked before any request; a period Eurostat itself rejects maps here too.";
|
|
70
|
+
readonly recovery: "Write since_period/until_period as YYYY, YYYY-MM, YYYY-MM-DD, YYYY-Qn (1–4), YYYY-Sn (1–2), YYYY-Tn (1–3), YYYY-Mnn (01–12), YYYY-Wnn (a week the year has, up to 53) or YYYY-Dnnn (a day the year has, up to 366), for example \"2020\", \"2020-01\" or \"2020-Q1\", with since_period starting no later than until_period ends.";
|
|
71
|
+
}, {
|
|
72
|
+
readonly reason: "async_response";
|
|
73
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
74
|
+
readonly when: "Eurostat returned an async warning or an HTTP-413 error array — the query matched too many observations, including an EXTRACTION_TOO_BIG refusal past Eurostat's 5,000,000-row limit.";
|
|
75
|
+
readonly retryable: false;
|
|
76
|
+
readonly recovery: "Filter on the dataset dimensions this query left unfiltered, or narrow the period range, then retry.";
|
|
77
|
+
}, {
|
|
78
|
+
readonly reason: "invalid_dimension";
|
|
79
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
80
|
+
readonly when: "A dimension code in filters does not exist in this dataset (HTTP 400, Eurostat error id 150), or a filter key names a request control (lang, format, geoLevel, sinceTimePeriod, untilTimePeriod, lastTimePeriod, in any case) rather than a dimension — rejected before any request, naming the input that sets it.";
|
|
81
|
+
readonly recovery: "Use eurostat_get_dataset_info to see valid dimension codes for this dataset; set a control through its own input (lang, geo_level, since_period, until_period, last_n_periods), not filters.";
|
|
82
|
+
}, {
|
|
83
|
+
readonly reason: "conflicting_params";
|
|
84
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
85
|
+
readonly when: "Mutually exclusive parameters were combined: \"geo\" filter + geo_level, since_period/until_period + last_n_periods, or a \"time\"/\"time_period\" filter + since_period, until_period or last_n_periods. Checked before any request; Eurostat's own refusal of two time selections maps here too.";
|
|
86
|
+
readonly recovery: "Keep one of each pair: filters.geo or geo_level; since_period/until_period or last_n_periods; filters.time or a period input.";
|
|
87
|
+
}, {
|
|
88
|
+
readonly reason: "canvas_not_found";
|
|
89
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
90
|
+
readonly when: "A canvas_id was supplied for staging but is unknown or its lifetime has elapsed.";
|
|
91
|
+
readonly recovery: "Omit canvas_id so the response starts a fresh canvas and returns its canvasId.";
|
|
92
|
+
}, {
|
|
93
|
+
readonly reason: "upstream_fault";
|
|
94
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
95
|
+
readonly when: "The Statistics API answered HTTP 5xx or could not be reached on every attempt of the retry loop. The error is marked retryable, except for HTTP 501, which is marked not retryable.";
|
|
96
|
+
readonly recovery: "The failure is on Eurostat's side, not in the request: when the error is marked retryable, call again in a few minutes.";
|
|
97
|
+
}], {
|
|
98
|
+
readonly appliedFilters: z.ZodObject<{
|
|
99
|
+
filters: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
|
|
100
|
+
geoLevel: z.ZodOptional<z.ZodString>;
|
|
101
|
+
sincePeriod: z.ZodOptional<z.ZodString>;
|
|
102
|
+
untilPeriod: z.ZodOptional<z.ZodString>;
|
|
103
|
+
lastNPeriods: z.ZodOptional<z.ZodNumber>;
|
|
104
|
+
}, z.core.$strip>;
|
|
105
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
106
|
+
}>;
|
|
107
|
+
/** Default-on read-limit policy; startup selects the deployment policy explicitly. */
|
|
7
108
|
export declare const eurostatQueryDataset: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
109
|
dataset_code: z.ZodString;
|
|
9
110
|
filters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
@@ -76,19 +177,23 @@ export declare const eurostatQueryDataset: import("@cyanheads/mcp-ts-core").Tool
|
|
|
76
177
|
}, {
|
|
77
178
|
readonly reason: "invalid_dimension";
|
|
78
179
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
79
|
-
readonly when: "A dimension code in filters does not exist in this dataset (HTTP 400, Eurostat error id 150).";
|
|
80
|
-
readonly recovery: "Use eurostat_get_dataset_info to see valid dimension codes for this dataset.";
|
|
180
|
+
readonly when: "A dimension code in filters does not exist in this dataset (HTTP 400, Eurostat error id 150), or a filter key names a request control (lang, format, geoLevel, sinceTimePeriod, untilTimePeriod, lastTimePeriod, in any case) rather than a dimension — rejected before any request, naming the input that sets it.";
|
|
181
|
+
readonly recovery: "Use eurostat_get_dataset_info to see valid dimension codes for this dataset; set a control through its own input (lang, geo_level, since_period, until_period, last_n_periods), not filters.";
|
|
81
182
|
}, {
|
|
82
183
|
readonly reason: "conflicting_params";
|
|
83
184
|
readonly code: JsonRpcErrorCode.ValidationError;
|
|
84
|
-
readonly when: "Mutually exclusive parameters were combined: \"geo\" filter + geo_level,
|
|
85
|
-
readonly recovery: "
|
|
185
|
+
readonly when: "Mutually exclusive parameters were combined: \"geo\" filter + geo_level, since_period/until_period + last_n_periods, or a \"time\"/\"time_period\" filter + since_period, until_period or last_n_periods. Checked before any request; Eurostat's own refusal of two time selections maps here too.";
|
|
186
|
+
readonly recovery: "Keep one of each pair: filters.geo or geo_level; since_period/until_period or last_n_periods; filters.time or a period input.";
|
|
86
187
|
}, {
|
|
87
188
|
readonly reason: "canvas_not_found";
|
|
88
189
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
89
190
|
readonly when: "A canvas_id was supplied for staging but is unknown or its lifetime has elapsed.";
|
|
90
191
|
readonly recovery: "Omit canvas_id so the response starts a fresh canvas and returns its canvasId.";
|
|
91
|
-
|
|
192
|
+
}, {
|
|
193
|
+
readonly reason: "upstream_fault";
|
|
194
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
195
|
+
readonly when: "The Statistics API answered HTTP 5xx or could not be reached on every attempt of the retry loop. The error is marked retryable, except for HTTP 501, which is marked not retryable.";
|
|
196
|
+
readonly recovery: "The failure is on Eurostat's side, not in the request: when the error is marked retryable, call again in a few minutes.";
|
|
92
197
|
}], {
|
|
93
198
|
readonly appliedFilters: z.ZodObject<{
|
|
94
199
|
filters: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eurostat-query-dataset.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-query-dataset.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"eurostat-query-dataset.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-query-dataset.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,+BAA+B,CAAC;AAkChF,+DAA+D;AAC/D,eAAO,MAAM,0BAA0B,gBAAiB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAohB3D,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAmC,CAAC"}
|