@cyanheads/eurostat-mcp-server 0.1.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/CLAUDE.md +391 -0
- package/Dockerfile +98 -0
- package/LICENSE +201 -0
- package/README.md +303 -0
- package/changelog/0.1.x/0.1.0.md +20 -0
- package/changelog/0.1.x/0.1.1.md +21 -0
- package/changelog/template.md +119 -0
- package/dist/config/server-config.d.ts +12 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +28 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.d.ts +28 -0
- package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js +49 -0
- package/dist/mcp-server/resources/definitions/eurostat-dataset.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.d.ts +30 -0
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.js +85 -0
- package/dist/mcp-server/tools/definitions/eurostat-browse-themes.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.d.ts +40 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js +106 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts +31 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js +68 -0
- package/dist/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts +70 -0
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js +152 -0
- package/dist/mcp-server/tools/definitions/eurostat-query-dataset.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.d.ts +31 -0
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js +107 -0
- package/dist/mcp-server/tools/definitions/eurostat-search-datasets.tool.js.map +1 -0
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.d.ts +53 -0
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.d.ts.map +1 -0
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.js +254 -0
- package/dist/services/eurostat-catalogue/eurostat-catalogue-service.js.map +1 -0
- package/dist/services/eurostat-catalogue/types.d.ts +48 -0
- package/dist/services/eurostat-catalogue/types.d.ts.map +1 -0
- package/dist/services/eurostat-catalogue/types.js +6 -0
- package/dist/services/eurostat-catalogue/types.js.map +1 -0
- package/dist/services/eurostat-data/eurostat-data-service.d.ts +36 -0
- package/dist/services/eurostat-data/eurostat-data-service.d.ts.map +1 -0
- package/dist/services/eurostat-data/eurostat-data-service.js +278 -0
- package/dist/services/eurostat-data/eurostat-data-service.js.map +1 -0
- package/dist/services/eurostat-data/types.d.ts +109 -0
- package/dist/services/eurostat-data/types.d.ts.map +1 -0
- package/dist/services/eurostat-data/types.js +13 -0
- package/dist/services/eurostat-data/types.js.map +1 -0
- package/package.json +81 -0
- package/server.json +127 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Server-specific environment variable configuration for eurostat-mcp-server.
|
|
3
|
+
* @module config/server-config
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
declare const ServerConfigSchema: z.ZodObject<{
|
|
7
|
+
baseUrl: z.ZodDefault<z.ZodString>;
|
|
8
|
+
requestTimeoutMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export declare function getServerConfig(): z.infer<typeof ServerConfigSchema>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=server-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAG3C,QAAA,MAAM,kBAAkB;;;iBAYtB,CAAC;AAIH,wBAAgB,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAMpE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Server-specific environment variable configuration for eurostat-mcp-server.
|
|
3
|
+
* @module config/server-config
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { parseEnvConfig } from '@cyanheads/mcp-ts-core/config';
|
|
7
|
+
const ServerConfigSchema = z.object({
|
|
8
|
+
baseUrl: z
|
|
9
|
+
.string()
|
|
10
|
+
.url()
|
|
11
|
+
.default('https://ec.europa.eu/eurostat/api/dissemination')
|
|
12
|
+
.describe('Eurostat API base URL'),
|
|
13
|
+
requestTimeoutMs: z.coerce
|
|
14
|
+
.number()
|
|
15
|
+
.int()
|
|
16
|
+
.positive()
|
|
17
|
+
.default(30_000)
|
|
18
|
+
.describe('HTTP request timeout in milliseconds'),
|
|
19
|
+
});
|
|
20
|
+
let _config;
|
|
21
|
+
export function getServerConfig() {
|
|
22
|
+
_config ??= parseEnvConfig(ServerConfigSchema, {
|
|
23
|
+
baseUrl: 'EUROSTAT_BASE_URL',
|
|
24
|
+
requestTimeoutMs: 'EUROSTAT_REQUEST_TIMEOUT_MS',
|
|
25
|
+
});
|
|
26
|
+
return _config;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=server-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,OAAO,CAAC,iDAAiD,CAAC;SAC1D,QAAQ,CAAC,uBAAuB,CAAC;IACpC,gBAAgB,EAAE,CAAC,CAAC,MAAM;SACvB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,sCAAsC,CAAC;CACpD,CAAC,CAAC;AAEH,IAAI,OAAuD,CAAC;AAE5D,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,cAAc,CAAC,kBAAkB,EAAE;QAC7C,OAAO,EAAE,mBAAmB;QAC5B,gBAAgB,EAAE,6BAA6B;KAChD,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview eurostat-mcp-server MCP server entry point.
|
|
4
|
+
* @module index
|
|
5
|
+
*/
|
|
6
|
+
import { createApp } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { eurostatDatasetResource } from './mcp-server/resources/definitions/eurostat-dataset.resource.js';
|
|
8
|
+
import { eurostatBrowseThemes } from './mcp-server/tools/definitions/eurostat-browse-themes.tool.js';
|
|
9
|
+
import { eurostatGetDatasetInfo } from './mcp-server/tools/definitions/eurostat-get-dataset-info.tool.js';
|
|
10
|
+
import { eurostatGetDimensionValues } from './mcp-server/tools/definitions/eurostat-get-dimension-values.tool.js';
|
|
11
|
+
import { eurostatQueryDataset } from './mcp-server/tools/definitions/eurostat-query-dataset.tool.js';
|
|
12
|
+
import { eurostatSearchDatasets } from './mcp-server/tools/definitions/eurostat-search-datasets.tool.js';
|
|
13
|
+
import { initEurostatCatalogueService } from './services/eurostat-catalogue/eurostat-catalogue-service.js';
|
|
14
|
+
import { initEurostatDataService } from './services/eurostat-data/eurostat-data-service.js';
|
|
15
|
+
await createApp({
|
|
16
|
+
tools: [
|
|
17
|
+
eurostatSearchDatasets,
|
|
18
|
+
eurostatBrowseThemes,
|
|
19
|
+
eurostatGetDatasetInfo,
|
|
20
|
+
eurostatGetDimensionValues,
|
|
21
|
+
eurostatQueryDataset,
|
|
22
|
+
],
|
|
23
|
+
resources: [eurostatDatasetResource],
|
|
24
|
+
prompts: [],
|
|
25
|
+
instructions: 'Eurostat MCP server — EU statistical data across 8,933 datasets.\n' +
|
|
26
|
+
'Workflow: eurostat_search_datasets or eurostat_browse_themes to find a dataset code → ' +
|
|
27
|
+
'eurostat_get_dataset_info to see dimensions → ' +
|
|
28
|
+
'eurostat_get_dimension_values to list valid filter values → ' +
|
|
29
|
+
'eurostat_query_dataset to fetch observations.\n' +
|
|
30
|
+
'Apply dimension filters to avoid async response errors on large datasets.',
|
|
31
|
+
setup(core) {
|
|
32
|
+
initEurostatCatalogueService(core.config, core.storage);
|
|
33
|
+
initEurostatDataService(core.config, core.storage);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+DAA+D,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,0BAA0B,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+DAA+D,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,MAAM,iEAAiE,CAAC;AACzG,OAAO,EAAE,4BAA4B,EAAE,MAAM,6DAA6D,CAAC;AAC3G,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAE5F,MAAM,SAAS,CAAC;IACd,KAAK,EAAE;QACL,sBAAsB;QACtB,oBAAoB;QACpB,sBAAsB;QACtB,0BAA0B;QAC1B,oBAAoB;KACrB;IACD,SAAS,EAAE,CAAC,uBAAuB,CAAC;IACpC,OAAO,EAAE,EAAE;IACX,YAAY,EACV,oEAAoE;QACpE,wFAAwF;QACxF,gDAAgD;QAChD,8DAA8D;QAC9D,iDAAiD;QACjD,2EAA2E;IAC7E,KAAK,CAAC,IAAI;QACR,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resource for fetching Eurostat dataset metadata by URI.
|
|
3
|
+
* @module mcp-server/resources/definitions/eurostat-dataset.resource
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
export declare const eurostatDatasetResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
|
|
7
|
+
dataset_code: z.ZodString;
|
|
8
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
9
|
+
code: z.ZodString;
|
|
10
|
+
label: z.ZodString;
|
|
11
|
+
dimensions: z.ZodArray<z.ZodObject<{
|
|
12
|
+
code: z.ZodString;
|
|
13
|
+
label: z.ZodString;
|
|
14
|
+
valuesCount: z.ZodNumber;
|
|
15
|
+
sampleValues: z.ZodArray<z.ZodObject<{
|
|
16
|
+
code: z.ZodString;
|
|
17
|
+
label: z.ZodString;
|
|
18
|
+
}, z.core.$strip>>;
|
|
19
|
+
}, z.core.$strip>>;
|
|
20
|
+
timeRange: z.ZodObject<{
|
|
21
|
+
start: z.ZodString;
|
|
22
|
+
end: z.ZodString;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
obsCount: z.ZodNumber;
|
|
25
|
+
lastUpdated: z.ZodString;
|
|
26
|
+
metadataUrl: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>, undefined>;
|
|
28
|
+
//# sourceMappingURL=eurostat-dataset.resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-dataset.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/eurostat-dataset.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAGrD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;6BA+ClC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resource for fetching Eurostat dataset metadata by URI.
|
|
3
|
+
* @module mcp-server/resources/definitions/eurostat-dataset.resource
|
|
4
|
+
*/
|
|
5
|
+
import { resource, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { getEurostatDataService } from '../../../services/eurostat-data/eurostat-data-service.js';
|
|
7
|
+
export const eurostatDatasetResource = resource('eurostat://dataset/{dataset_code}', {
|
|
8
|
+
name: 'eurostat-dataset-info',
|
|
9
|
+
description: 'Dataset metadata for a Eurostat dataset — dimensions, time range, observation count, and last-updated date. Equivalent to eurostat_get_dataset_info but accessible as a resource URI for cache-injectable context.',
|
|
10
|
+
mimeType: 'application/json',
|
|
11
|
+
params: z.object({
|
|
12
|
+
dataset_code: z.string().describe('Dataset code (e.g., "nama_10_gdp").'),
|
|
13
|
+
}),
|
|
14
|
+
output: z.object({
|
|
15
|
+
code: z.string().describe('Dataset code.'),
|
|
16
|
+
label: z.string().describe('Human-readable dataset title.'),
|
|
17
|
+
dimensions: z
|
|
18
|
+
.array(z
|
|
19
|
+
.object({
|
|
20
|
+
code: z.string().describe('Dimension code.'),
|
|
21
|
+
label: z.string().describe('Dimension name.'),
|
|
22
|
+
valuesCount: z.number().describe('Number of distinct values.'),
|
|
23
|
+
sampleValues: z
|
|
24
|
+
.array(z
|
|
25
|
+
.object({
|
|
26
|
+
code: z.string().describe('Value code.'),
|
|
27
|
+
label: z.string().describe('Value label.'),
|
|
28
|
+
})
|
|
29
|
+
.describe('A dimension value code and label pair.'))
|
|
30
|
+
.describe('First 10 values for orientation.'),
|
|
31
|
+
})
|
|
32
|
+
.describe('A dataset dimension with its valid values.'))
|
|
33
|
+
.describe('Dataset dimensions.'),
|
|
34
|
+
timeRange: z
|
|
35
|
+
.object({
|
|
36
|
+
start: z.string().describe('Earliest available period.'),
|
|
37
|
+
end: z.string().describe('Most recent available period.'),
|
|
38
|
+
})
|
|
39
|
+
.describe('Overall data coverage period.'),
|
|
40
|
+
obsCount: z.number().describe('Total number of observations.'),
|
|
41
|
+
lastUpdated: z.string().describe('ISO 8601 timestamp of last data update.'),
|
|
42
|
+
metadataUrl: z.string().optional().describe('Link to ESMS metadata page, when available.'),
|
|
43
|
+
}),
|
|
44
|
+
async handler(params, ctx) {
|
|
45
|
+
const svc = getEurostatDataService();
|
|
46
|
+
return svc.getDatasetInfo(params.dataset_code, ctx);
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=eurostat-dataset.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-dataset.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/eurostat-dataset.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAE3F,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,mCAAmC,EAAE;IACnF,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,oNAAoN;IACtN,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KACzE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC3D,UAAU,EAAE,CAAC;aACV,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAC9D,YAAY,EAAE,CAAC;iBACZ,KAAK,CACJ,CAAC;iBACE,MAAM,CAAC;gBACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;aAC3C,CAAC;iBACD,QAAQ,CAAC,wCAAwC,CAAC,CACtD;iBACA,QAAQ,CAAC,kCAAkC,CAAC;SAChD,CAAC;aACD,QAAQ,CAAC,4CAA4C,CAAC,CAC1D;aACA,QAAQ,CAAC,qBAAqB,CAAC;QAClC,SAAS,EAAE,CAAC;aACT,MAAM,CAAC;YACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACxD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC1D,CAAC;aACD,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KAC3F,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;QACrC,OAAO,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for browsing the Eurostat theme hierarchy.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurostat-browse-themes.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const eurostatBrowseThemes: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
theme_code: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
10
|
+
items: z.ZodArray<z.ZodObject<{
|
|
11
|
+
code: z.ZodString;
|
|
12
|
+
label: z.ZodString;
|
|
13
|
+
type: z.ZodEnum<{
|
|
14
|
+
dataset: "dataset";
|
|
15
|
+
table: "table";
|
|
16
|
+
folder: "folder";
|
|
17
|
+
}>;
|
|
18
|
+
hasChildren: z.ZodBoolean;
|
|
19
|
+
dataStart: z.ZodOptional<z.ZodString>;
|
|
20
|
+
dataEnd: z.ZodOptional<z.ZodString>;
|
|
21
|
+
obsCount: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
23
|
+
parentPath: z.ZodArray<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>, readonly [{
|
|
25
|
+
readonly reason: "not_found";
|
|
26
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
27
|
+
readonly when: "The provided theme_code does not exist as a folder in the TOC.";
|
|
28
|
+
readonly recovery: "Call eurostat_browse_themes without theme_code to see valid root themes, then navigate from there.";
|
|
29
|
+
}]>;
|
|
30
|
+
//# sourceMappingURL=eurostat-browse-themes.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-browse-themes.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-browse-themes.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;GAqG/B,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for browsing the Eurostat theme hierarchy.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurostat-browse-themes.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getEurostatCatalogueService } from '../../../services/eurostat-catalogue/eurostat-catalogue-service.js';
|
|
8
|
+
export const eurostatBrowseThemes = tool('eurostat_browse_themes', {
|
|
9
|
+
title: 'Browse Eurostat Theme Hierarchy',
|
|
10
|
+
description: 'Navigate the Eurostat theme tree. Without theme_code returns the 11 top-level theme folders (Economy, Population, Transport, etc.) — the practical starting points. With a theme_code returns its immediate children: subtheme folders and datasets in that branch. Use this for structured discovery when you know the domain but not the dataset code, or to drill down from a broad topic to a specific dataset. Pair with eurostat_search_datasets for keyword-based discovery.',
|
|
11
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
12
|
+
input: z.object({
|
|
13
|
+
theme_code: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Folder code to expand (e.g., "econ", "reg"). Omit to list the 11 top-level theme folders.'),
|
|
17
|
+
}),
|
|
18
|
+
output: z.object({
|
|
19
|
+
items: z
|
|
20
|
+
.array(z
|
|
21
|
+
.object({
|
|
22
|
+
code: z
|
|
23
|
+
.string()
|
|
24
|
+
.describe('Theme or dataset code. Pass to theme_code to drill into a folder, or use as dataset_code for data tools.'),
|
|
25
|
+
label: z.string().describe('Human-readable name.'),
|
|
26
|
+
type: z
|
|
27
|
+
.enum(['folder', 'dataset', 'table'])
|
|
28
|
+
.describe('Item type: "folder" has sub-items; "dataset"/"table" can be queried for data.'),
|
|
29
|
+
hasChildren: z
|
|
30
|
+
.boolean()
|
|
31
|
+
.describe('True when this folder contains sub-items. Only meaningful for type "folder".'),
|
|
32
|
+
dataStart: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Earliest data period (e.g., "1995"). Omitted for folders and when not reported.'),
|
|
36
|
+
dataEnd: z
|
|
37
|
+
.string()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Most recent data period. Omitted for folders and when not reported.'),
|
|
40
|
+
obsCount: z
|
|
41
|
+
.number()
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Approximate observation count. Omitted for folders and when not reported.'),
|
|
44
|
+
})
|
|
45
|
+
.describe('A theme folder, dataset, or table entry.'))
|
|
46
|
+
.describe('Immediate children of the requested theme, or the 11 root themes if theme_code was omitted.'),
|
|
47
|
+
parentPath: z
|
|
48
|
+
.array(z.string())
|
|
49
|
+
.describe('Breadcrumb from root to the requested theme (e.g., ["Economy and finance", "National accounts"]). Empty when browsing root.'),
|
|
50
|
+
}),
|
|
51
|
+
errors: [
|
|
52
|
+
{
|
|
53
|
+
reason: 'not_found',
|
|
54
|
+
code: JsonRpcErrorCode.NotFound,
|
|
55
|
+
when: 'The provided theme_code does not exist as a folder in the TOC.',
|
|
56
|
+
recovery: 'Call eurostat_browse_themes without theme_code to see valid root themes, then navigate from there.',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
async handler(input, ctx) {
|
|
60
|
+
const svc = getEurostatCatalogueService();
|
|
61
|
+
const themeCode = input.theme_code && input.theme_code.trim() ? input.theme_code.trim() : undefined;
|
|
62
|
+
const { items, parentPath } = await svc.browse(themeCode, ctx);
|
|
63
|
+
ctx.log.info('Theme browse complete', { themeCode, itemCount: items.length });
|
|
64
|
+
return { items, parentPath };
|
|
65
|
+
},
|
|
66
|
+
format: (result) => {
|
|
67
|
+
const lines = [];
|
|
68
|
+
if (result.parentPath.length > 0) {
|
|
69
|
+
lines.push(`**Path:** ${result.parentPath.join(' › ')}\n`);
|
|
70
|
+
}
|
|
71
|
+
lines.push(`**${result.items.length} item${result.items.length !== 1 ? 's' : ''}**\n`);
|
|
72
|
+
for (const item of result.items) {
|
|
73
|
+
const icon = item.type === 'folder' ? '📁' : '📊';
|
|
74
|
+
lines.push(`${icon} **${item.label}**`);
|
|
75
|
+
lines.push(` **Code:** ${item.code} | **Type:** ${item.type}${item.hasChildren ? ' (has children)' : ''}`);
|
|
76
|
+
if (item.dataStart || item.dataEnd) {
|
|
77
|
+
lines.push(` **Period:** ${item.dataStart ?? '?'} – ${item.dataEnd ?? '?'}`);
|
|
78
|
+
}
|
|
79
|
+
if (item.obsCount != null)
|
|
80
|
+
lines.push(` **Observations:** ${item.obsCount.toLocaleString()}`);
|
|
81
|
+
}
|
|
82
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=eurostat-browse-themes.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-browse-themes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-browse-themes.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAE1G,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE;IACjE,KAAK,EAAE,iCAAiC;IACxC,WAAW,EACT,qdAAqd;IACvd,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;IAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,2FAA2F,CAC5F;KACJ,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC;aACL,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CACP,0GAA0G,CAC3G;YACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAClD,IAAI,EAAE,CAAC;iBACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;iBACpC,QAAQ,CACP,+EAA+E,CAChF;YACH,WAAW,EAAE,CAAC;iBACX,OAAO,EAAE;iBACT,QAAQ,CACP,8EAA8E,CAC/E;YACH,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,iFAAiF,CAClF;YACH,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,qEAAqE,CAAC;YAClF,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,2EAA2E,CAC5E;SACJ,CAAC;aACD,QAAQ,CAAC,0CAA0C,CAAC,CACxD;aACA,QAAQ,CACP,6FAA6F,CAC9F;QACH,UAAU,EAAE,CAAC;aACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,CACP,6HAA6H,CAC9H;KACJ,CAAC;IACF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,gEAAgE;YACtE,QAAQ,EACN,oGAAoG;SACvG;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,GAAG,GAAG,2BAA2B,EAAE,CAAC;QAC1C,MAAM,SAAS,GACb,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACvF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CACR,eAAe,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAChG,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;gBACvB,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for fetching metadata about a specific Eurostat dataset.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurostat-get-dataset-info.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const eurostatGetDatasetInfo: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
dataset_code: z.ZodString;
|
|
9
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
10
|
+
code: z.ZodString;
|
|
11
|
+
label: z.ZodString;
|
|
12
|
+
dimensions: z.ZodArray<z.ZodObject<{
|
|
13
|
+
code: z.ZodString;
|
|
14
|
+
label: z.ZodString;
|
|
15
|
+
valuesCount: z.ZodNumber;
|
|
16
|
+
sampleValues: z.ZodArray<z.ZodObject<{
|
|
17
|
+
code: z.ZodString;
|
|
18
|
+
label: z.ZodString;
|
|
19
|
+
}, z.core.$strip>>;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
timeRange: z.ZodObject<{
|
|
22
|
+
start: z.ZodString;
|
|
23
|
+
end: z.ZodString;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
obsCount: z.ZodNumber;
|
|
26
|
+
lastUpdated: z.ZodString;
|
|
27
|
+
metadataUrl: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, z.core.$strip>, readonly [{
|
|
29
|
+
readonly reason: "not_found";
|
|
30
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
31
|
+
readonly when: "The dataset code does not exist or is not available for dissemination.";
|
|
32
|
+
readonly recovery: "Use eurostat_search_datasets or eurostat_browse_themes to find a valid dataset code.";
|
|
33
|
+
}, {
|
|
34
|
+
readonly reason: "async_response";
|
|
35
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
36
|
+
readonly when: "Eurostat returned an async response (query too large for the API).";
|
|
37
|
+
readonly retryable: true;
|
|
38
|
+
readonly recovery: "This is unexpected for a metadata call; retry in a few seconds. If it persists, the dataset may be unusually large.";
|
|
39
|
+
}]>;
|
|
40
|
+
//# sourceMappingURL=eurostat-get-dataset-info.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-get-dataset-info.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqHjC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for fetching metadata about a specific Eurostat dataset.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurostat-get-dataset-info.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getEurostatDataService } from '../../../services/eurostat-data/eurostat-data-service.js';
|
|
8
|
+
export const eurostatGetDatasetInfo = tool('eurostat_get_dataset_info', {
|
|
9
|
+
title: 'Get Eurostat Dataset Info',
|
|
10
|
+
description: 'Fetch metadata for a Eurostat dataset: dimensions with valid values, time range, observation count, and last-update date. Call this before eurostat_query_dataset to discover what dimension codes are valid (unit, na_item, geo, etc.). Uses a minimal Statistics API call (most recent period only) to extract dimension structure. Returns up to 10 sample values per dimension for orientation; use eurostat_get_dimension_values to list the full set for large dimensions.',
|
|
11
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
12
|
+
input: z.object({
|
|
13
|
+
dataset_code: z
|
|
14
|
+
.string()
|
|
15
|
+
.min(1)
|
|
16
|
+
.describe('Dataset code (e.g., "nama_10_gdp"). Use eurostat_search_datasets or eurostat_browse_themes to find codes.'),
|
|
17
|
+
}),
|
|
18
|
+
output: z.object({
|
|
19
|
+
code: z.string().describe('Dataset code as provided.'),
|
|
20
|
+
label: z.string().describe('Human-readable dataset title.'),
|
|
21
|
+
dimensions: z
|
|
22
|
+
.array(z
|
|
23
|
+
.object({
|
|
24
|
+
code: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe('Dimension code (e.g., "unit", "geo", "na_item"). Use these as filter keys in eurostat_query_dataset.'),
|
|
27
|
+
label: z.string().describe('Human-readable dimension name (e.g., "Unit of measure").'),
|
|
28
|
+
valuesCount: z
|
|
29
|
+
.number()
|
|
30
|
+
.describe('Number of distinct values in this dimension for the most recent period.'),
|
|
31
|
+
sampleValues: z
|
|
32
|
+
.array(z
|
|
33
|
+
.object({
|
|
34
|
+
code: z.string().describe('Dimension value code.'),
|
|
35
|
+
label: z.string().describe('Human-readable label for this value.'),
|
|
36
|
+
})
|
|
37
|
+
.describe('A dimension value code and label pair.'))
|
|
38
|
+
.describe('First 10 dimension values for orientation. Use eurostat_get_dimension_values for the full list.'),
|
|
39
|
+
})
|
|
40
|
+
.describe('A dataset dimension with its valid values.'))
|
|
41
|
+
.describe('All dimensions of the dataset with their valid codes and labels.'),
|
|
42
|
+
timeRange: z
|
|
43
|
+
.object({
|
|
44
|
+
start: z.string().describe('Earliest available period (e.g., "1975").'),
|
|
45
|
+
end: z.string().describe('Most recent available period (e.g., "2024").'),
|
|
46
|
+
})
|
|
47
|
+
.describe('Overall data coverage period for this dataset.'),
|
|
48
|
+
obsCount: z
|
|
49
|
+
.number()
|
|
50
|
+
.describe('Total number of observations in the full dataset (all periods).'),
|
|
51
|
+
lastUpdated: z.string().describe('ISO 8601 timestamp of the most recent data update.'),
|
|
52
|
+
metadataUrl: z
|
|
53
|
+
.string()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe('URL to the ESMS HTML metadata page for this dataset. Omitted when not provided by Eurostat.'),
|
|
56
|
+
}),
|
|
57
|
+
errors: [
|
|
58
|
+
{
|
|
59
|
+
reason: 'not_found',
|
|
60
|
+
code: JsonRpcErrorCode.NotFound,
|
|
61
|
+
when: 'The dataset code does not exist or is not available for dissemination.',
|
|
62
|
+
recovery: 'Use eurostat_search_datasets or eurostat_browse_themes to find a valid dataset code.',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
reason: 'async_response',
|
|
66
|
+
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
67
|
+
when: 'Eurostat returned an async response (query too large for the API).',
|
|
68
|
+
retryable: true,
|
|
69
|
+
recovery: 'This is unexpected for a metadata call; retry in a few seconds. If it persists, the dataset may be unusually large.',
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
async handler(input, ctx) {
|
|
73
|
+
const svc = getEurostatDataService();
|
|
74
|
+
const meta = await svc.getDatasetInfo(input.dataset_code, ctx);
|
|
75
|
+
ctx.log.info('Dataset info fetched', {
|
|
76
|
+
datasetCode: input.dataset_code,
|
|
77
|
+
dimensionCount: meta.dimensions.length,
|
|
78
|
+
obsCount: meta.obsCount,
|
|
79
|
+
});
|
|
80
|
+
return meta;
|
|
81
|
+
},
|
|
82
|
+
format: (result) => {
|
|
83
|
+
const lines = [
|
|
84
|
+
`# ${result.label}`,
|
|
85
|
+
`**Code:** ${result.code}`,
|
|
86
|
+
`**Period:** ${result.timeRange.start} – ${result.timeRange.end}`,
|
|
87
|
+
`**Observations:** ${result.obsCount.toLocaleString()}`,
|
|
88
|
+
`**Last updated:** ${result.lastUpdated}`,
|
|
89
|
+
];
|
|
90
|
+
if (result.metadataUrl)
|
|
91
|
+
lines.push(`**Metadata:** ${result.metadataUrl}`);
|
|
92
|
+
lines.push(`\n## Dimensions (${result.dimensions.length})`);
|
|
93
|
+
for (const dim of result.dimensions) {
|
|
94
|
+
lines.push(`\n### ${dim.label} (\`${dim.code}\`) — ${dim.valuesCount} value${dim.valuesCount !== 1 ? 's' : ''}`);
|
|
95
|
+
if (dim.sampleValues.length > 0) {
|
|
96
|
+
const samples = dim.sampleValues.map((v) => `\`${v.code}\` ${v.label}`).join(', ');
|
|
97
|
+
lines.push(`Sample: ${samples}`);
|
|
98
|
+
if (dim.valuesCount > dim.sampleValues.length) {
|
|
99
|
+
lines.push(`_(${dim.valuesCount - dim.sampleValues.length} more — use eurostat_get_dimension_values for the full list)_`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=eurostat-get-dataset-info.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-get-dataset-info.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-get-dataset-info.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for listing all valid values for a specific Eurostat dataset dimension.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurostat-get-dimension-values.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const eurostatGetDimensionValues: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
dataset_code: z.ZodString;
|
|
9
|
+
dimension: z.ZodString;
|
|
10
|
+
geo_level: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
aggregate: "aggregate";
|
|
12
|
+
country: "country";
|
|
13
|
+
nuts1: "nuts1";
|
|
14
|
+
nuts2: "nuts2";
|
|
15
|
+
nuts3: "nuts3";
|
|
16
|
+
}>>;
|
|
17
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
18
|
+
dimensionCode: z.ZodString;
|
|
19
|
+
dimensionLabel: z.ZodString;
|
|
20
|
+
values: z.ZodArray<z.ZodObject<{
|
|
21
|
+
code: z.ZodString;
|
|
22
|
+
label: z.ZodString;
|
|
23
|
+
}, z.core.$strip>>;
|
|
24
|
+
totalCount: z.ZodNumber;
|
|
25
|
+
}, z.core.$strip>, readonly [{
|
|
26
|
+
readonly reason: "not_found";
|
|
27
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
28
|
+
readonly when: "The dataset code or dimension code does not exist.";
|
|
29
|
+
readonly recovery: "Verify the dataset code with eurostat_search_datasets and the dimension code with eurostat_get_dataset_info.";
|
|
30
|
+
}]>;
|
|
31
|
+
//# sourceMappingURL=eurostat-get-dimension-values.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eurostat-get-dimension-values.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/eurostat-get-dimension-values.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;GA2ErC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool for listing all valid values for a specific Eurostat dataset dimension.
|
|
3
|
+
* @module mcp-server/tools/definitions/eurostat-get-dimension-values.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getEurostatDataService } from '../../../services/eurostat-data/eurostat-data-service.js';
|
|
8
|
+
import { GEO_LEVEL_VALUES } from '../../../services/eurostat-data/types.js';
|
|
9
|
+
export const eurostatGetDimensionValues = tool('eurostat_get_dimension_values', {
|
|
10
|
+
title: 'Get Eurostat Dimension Values',
|
|
11
|
+
description: 'List all 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) — country is the default. Invalid dimension_value codes passed to eurostat_query_dataset silently return no data; use this tool to verify codes first.',
|
|
12
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
13
|
+
input: z.object({
|
|
14
|
+
dataset_code: z.string().min(1).describe('Dataset code (e.g., "nama_10_gdp").'),
|
|
15
|
+
dimension: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe('Dimension code to retrieve values for (e.g., "unit", "na_item", "geo"). Use eurostat_get_dataset_info to see available dimensions.'),
|
|
19
|
+
geo_level: z
|
|
20
|
+
.enum(GEO_LEVEL_VALUES)
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('NUTS hierarchy level filter — only relevant when dimension is "geo". Options: "aggregate" (EU/EA codes), "country" (2-letter codes, default), "nuts1" (3-char), "nuts2" (4-char), "nuts3" (5-char).'),
|
|
23
|
+
}),
|
|
24
|
+
output: z.object({
|
|
25
|
+
dimensionCode: z.string().describe('The dimension code that was queried.'),
|
|
26
|
+
dimensionLabel: z.string().describe('Human-readable dimension name.'),
|
|
27
|
+
values: z
|
|
28
|
+
.array(z
|
|
29
|
+
.object({
|
|
30
|
+
code: z
|
|
31
|
+
.string()
|
|
32
|
+
.describe('Dimension value code. Use these as filter values in eurostat_query_dataset.'),
|
|
33
|
+
label: z.string().describe('Human-readable label for this value.'),
|
|
34
|
+
})
|
|
35
|
+
.describe('A dimension value code and label pair.'))
|
|
36
|
+
.describe('All valid values for this dimension in the dataset.'),
|
|
37
|
+
totalCount: z.number().describe('Total number of distinct values returned.'),
|
|
38
|
+
}),
|
|
39
|
+
errors: [
|
|
40
|
+
{
|
|
41
|
+
reason: 'not_found',
|
|
42
|
+
code: JsonRpcErrorCode.NotFound,
|
|
43
|
+
when: 'The dataset code or dimension code does not exist.',
|
|
44
|
+
recovery: 'Verify the dataset code with eurostat_search_datasets and the dimension code with eurostat_get_dataset_info.',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
async handler(input, ctx) {
|
|
48
|
+
const svc = getEurostatDataService();
|
|
49
|
+
const result = await svc.getDimensionValues(input.dataset_code, input.dimension, input.geo_level, ctx);
|
|
50
|
+
ctx.log.info('Dimension values fetched', {
|
|
51
|
+
datasetCode: input.dataset_code,
|
|
52
|
+
dimension: input.dimension,
|
|
53
|
+
totalCount: result.totalCount,
|
|
54
|
+
});
|
|
55
|
+
return result;
|
|
56
|
+
},
|
|
57
|
+
format: (result) => {
|
|
58
|
+
const lines = [
|
|
59
|
+
`**Dimension:** ${result.dimensionLabel} (\`${result.dimensionCode}\`)`,
|
|
60
|
+
`**Total values:** ${result.totalCount}\n`,
|
|
61
|
+
];
|
|
62
|
+
for (const v of result.values) {
|
|
63
|
+
lines.push(`- \`${v.code}\` — ${v.label}`);
|
|
64
|
+
}
|
|
65
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=eurostat-get-dimension-values.tool.js.map
|
|
@@ -0,0 +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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"}
|