@cyanheads/imf-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/AGENTS.md +377 -0
- package/CLAUDE.md +377 -0
- package/Dockerfile +105 -0
- package/LICENSE +201 -0
- package/README.md +290 -0
- package/changelog/0.1.x/0.1.1.md +33 -0
- package/changelog/template.md +127 -0
- package/dist/config/server-config.d.ts +13 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +26 -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 +28 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts +7 -0
- package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/index.js +7 -0
- package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/imf-database.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/imf-database.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/imf-database.resource.js +61 -0
- package/dist/mcp-server/resources/definitions/imf-database.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +8 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.d.ts +26 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.js +96 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.d.ts +24 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.js +96 -0
- package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-get-database.tool.d.ts +39 -0
- package/dist/mcp-server/tools/definitions/imf-get-database.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-get-database.tool.js +155 -0
- package/dist/mcp-server/tools/definitions/imf-get-database.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-list-databases.tool.d.ts +19 -0
- package/dist/mcp-server/tools/definitions/imf-list-databases.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-list-databases.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/imf-list-databases.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.d.ts +57 -0
- package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.js +277 -0
- package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +136 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +22 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/services/canvas/canvas-accessor.d.ts +11 -0
- package/dist/services/canvas/canvas-accessor.d.ts.map +1 -0
- package/dist/services/canvas/canvas-accessor.js +13 -0
- package/dist/services/canvas/canvas-accessor.js.map +1 -0
- package/dist/services/imf-sdmx/imf-sdmx-service.d.ts +38 -0
- package/dist/services/imf-sdmx/imf-sdmx-service.d.ts.map +1 -0
- package/dist/services/imf-sdmx/imf-sdmx-service.js +415 -0
- package/dist/services/imf-sdmx/imf-sdmx-service.js.map +1 -0
- package/dist/services/imf-sdmx/types.d.ts +157 -0
- package/dist/services/imf-sdmx/types.d.ts.map +1 -0
- package/dist/services/imf-sdmx/types.js +6 -0
- package/dist/services/imf-sdmx/types.js.map +1 -0
- package/package.json +106 -0
- package/server.json +99 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview IMF SDMX 3.0 REST API service — fetches dataflows, data structures,
|
|
3
|
+
* and observations from api.imf.org. Implements caching via ctx.state and retry.
|
|
4
|
+
* @module services/imf-sdmx/imf-sdmx-service
|
|
5
|
+
*/
|
|
6
|
+
import { notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
8
|
+
const DATAFLOWS_CACHE_TTL = 3600; // 1 hour
|
|
9
|
+
const DSD_CACHE_TTL = 86_400; // 24 hours
|
|
10
|
+
export class ImfSdmxService {
|
|
11
|
+
baseUrl;
|
|
12
|
+
timeoutMs;
|
|
13
|
+
constructor(_config, _storage, baseUrl, timeoutMs) {
|
|
14
|
+
this.baseUrl = baseUrl.replace(/\/+$/, '');
|
|
15
|
+
this.timeoutMs = timeoutMs;
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Dataflow list
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Fetch all dataflows, with 1-hour caching. */
|
|
21
|
+
async fetchDataflows(ctx) {
|
|
22
|
+
const cacheKey = 'imf/dataflows/all';
|
|
23
|
+
const cached = await ctx.state.get(cacheKey);
|
|
24
|
+
if (cached) {
|
|
25
|
+
ctx.log.debug('Dataflows served from cache', { count: cached.length });
|
|
26
|
+
return cached;
|
|
27
|
+
}
|
|
28
|
+
const raw = await withRetry(async () => {
|
|
29
|
+
const url = `${this.baseUrl}/structure/dataflow`;
|
|
30
|
+
ctx.log.debug('Fetching dataflow list', { url });
|
|
31
|
+
const response = await fetchWithTimeout(url, this.timeoutMs, ctx, {
|
|
32
|
+
headers: { Accept: 'application/json' },
|
|
33
|
+
signal: ctx.signal,
|
|
34
|
+
});
|
|
35
|
+
const text = await response.text();
|
|
36
|
+
return this.parseJson(text, 'dataflow list');
|
|
37
|
+
}, {
|
|
38
|
+
operation: 'ImfSdmxService.fetchDataflows',
|
|
39
|
+
context: ctx,
|
|
40
|
+
maxRetries: 3,
|
|
41
|
+
baseDelayMs: 1000,
|
|
42
|
+
signal: ctx.signal,
|
|
43
|
+
});
|
|
44
|
+
const dataflows = this.normalizeDataflows(raw);
|
|
45
|
+
await ctx.state.set(cacheKey, dataflows, { ttl: DATAFLOWS_CACHE_TTL });
|
|
46
|
+
ctx.log.info('Dataflows fetched and cached', { count: dataflows.length });
|
|
47
|
+
return dataflows;
|
|
48
|
+
}
|
|
49
|
+
/** Find a dataflow by id, optionally constraining by agencyId/version. */
|
|
50
|
+
async findDataflow(dataflowId, agencyId, version, ctx) {
|
|
51
|
+
const all = await this.fetchDataflows(ctx);
|
|
52
|
+
return all.find((df) => df.id === dataflowId &&
|
|
53
|
+
(agencyId == null || df.agencyId === agencyId) &&
|
|
54
|
+
(version == null || df.version === version));
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Data structure (DSD + codelists)
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/** Fetch DSD with all codelists for a dataflow, with 24-hour caching. */
|
|
60
|
+
async fetchDataStructure(agencyId, dsdId, version, ctx) {
|
|
61
|
+
const cacheKey = `imf/dsd/${agencyId}/${dsdId}/${version}`;
|
|
62
|
+
const cached = await ctx.state.get(cacheKey);
|
|
63
|
+
if (cached) {
|
|
64
|
+
ctx.log.debug('DSD served from cache', { dsdId });
|
|
65
|
+
return cached;
|
|
66
|
+
}
|
|
67
|
+
const raw = await withRetry(async () => {
|
|
68
|
+
const url = `${this.baseUrl}/structure/datastructure/${encodeURIComponent(agencyId)}/${encodeURIComponent(dsdId)}/${encodeURIComponent(version)}?references=all`;
|
|
69
|
+
ctx.log.debug('Fetching data structure', { url });
|
|
70
|
+
const response = await fetchWithTimeout(url, this.timeoutMs, ctx, {
|
|
71
|
+
headers: { Accept: 'application/json' },
|
|
72
|
+
signal: ctx.signal,
|
|
73
|
+
});
|
|
74
|
+
const text = await response.text();
|
|
75
|
+
return this.parseJson(text, 'data structure');
|
|
76
|
+
}, {
|
|
77
|
+
operation: 'ImfSdmxService.fetchDataStructure',
|
|
78
|
+
context: ctx,
|
|
79
|
+
maxRetries: 3,
|
|
80
|
+
baseDelayMs: 1000,
|
|
81
|
+
signal: ctx.signal,
|
|
82
|
+
});
|
|
83
|
+
const structure = this.normalizeDsd(raw, agencyId, dsdId, version);
|
|
84
|
+
if (!structure)
|
|
85
|
+
return;
|
|
86
|
+
await ctx.state.set(cacheKey, structure, { ttl: DSD_CACHE_TTL });
|
|
87
|
+
return structure;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Fetch a dataflow's structure, resolving the DSD reference from the dataflow
|
|
91
|
+
* list if not provided.
|
|
92
|
+
*/
|
|
93
|
+
async fetchDataflowStructure(dataflowId, agencyId, version, ctx) {
|
|
94
|
+
const dataflow = await this.findDataflow(dataflowId, agencyId, version, ctx);
|
|
95
|
+
if (!dataflow) {
|
|
96
|
+
throw notFound(`Dataflow '${dataflowId}' not found`, {
|
|
97
|
+
reason: 'dataflow_not_found',
|
|
98
|
+
dataflowId,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Derive DSD id from the dataflow — IMF SDMX 3.0 uses DSD_<FLOW_ID> naming for most flows.
|
|
102
|
+
// We fetch the structure endpoint directly using the dataflow's agency+version.
|
|
103
|
+
const dsdId = `DSD_${dataflowId}`;
|
|
104
|
+
let structure;
|
|
105
|
+
try {
|
|
106
|
+
structure = await this.fetchDataStructure(dataflow.agencyId, dsdId, dataflow.version, ctx).catch(() => this.fetchDataflowStructureFallback(dataflowId, dataflow.agencyId, dataflow.version, ctx));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Both primary and fallback DSD fetch failed; throw a controlled message
|
|
110
|
+
// (the raw McpError would carry the upstream URL path in its message).
|
|
111
|
+
throw serviceUnavailable(`Structure unavailable for dataflow '${dataflowId}'`, {
|
|
112
|
+
reason: 'structure_unavailable',
|
|
113
|
+
dataflowId,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (!structure) {
|
|
117
|
+
throw serviceUnavailable(`Structure unavailable for dataflow '${dataflowId}'`, {
|
|
118
|
+
reason: 'structure_unavailable',
|
|
119
|
+
dataflowId,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Merge name/description from the dataflow into the structure.
|
|
123
|
+
const mergedDescription = structure.description ?? dataflow.description;
|
|
124
|
+
return {
|
|
125
|
+
...structure,
|
|
126
|
+
dataflowId,
|
|
127
|
+
name: structure.name || dataflow.name,
|
|
128
|
+
...(mergedDescription ? { description: mergedDescription } : {}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** Fallback: fetch structure using the dataflow endpoint path directly. */
|
|
132
|
+
async fetchDataflowStructureFallback(dataflowId, agencyId, version, ctx) {
|
|
133
|
+
const cacheKey = `imf/dsd-fb/${agencyId}/${dataflowId}/${version}`;
|
|
134
|
+
const cached = await ctx.state.get(cacheKey);
|
|
135
|
+
if (cached)
|
|
136
|
+
return cached;
|
|
137
|
+
const raw = await withRetry(async () => {
|
|
138
|
+
const url = `${this.baseUrl}/structure/dataflow/${encodeURIComponent(agencyId)}/${encodeURIComponent(dataflowId)}/${encodeURIComponent(version)}?references=all`;
|
|
139
|
+
ctx.log.debug('Fetching dataflow structure (fallback)', { url });
|
|
140
|
+
const response = await fetchWithTimeout(url, this.timeoutMs, ctx, {
|
|
141
|
+
headers: { Accept: 'application/json' },
|
|
142
|
+
signal: ctx.signal,
|
|
143
|
+
});
|
|
144
|
+
const text = await response.text();
|
|
145
|
+
return this.parseJson(text, 'dataflow structure (fallback)');
|
|
146
|
+
}, {
|
|
147
|
+
operation: 'ImfSdmxService.fetchDataflowStructureFallback',
|
|
148
|
+
context: ctx,
|
|
149
|
+
maxRetries: 3,
|
|
150
|
+
baseDelayMs: 1000,
|
|
151
|
+
signal: ctx.signal,
|
|
152
|
+
});
|
|
153
|
+
const structure = this.normalizeDsd(raw, agencyId, dataflowId, version);
|
|
154
|
+
if (structure) {
|
|
155
|
+
await ctx.state.set(cacheKey, structure, { ttl: DSD_CACHE_TTL });
|
|
156
|
+
}
|
|
157
|
+
return structure;
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Data query
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
/** Fetch observations for a dataflow key over a time range. No cache — always live. */
|
|
163
|
+
async fetchData(agencyId, dataflowId, version, key, startPeriod, endPeriod, ctx, signal) {
|
|
164
|
+
const queryParams = new URLSearchParams();
|
|
165
|
+
if (startPeriod)
|
|
166
|
+
queryParams.set('startPeriod', startPeriod);
|
|
167
|
+
if (endPeriod)
|
|
168
|
+
queryParams.set('endPeriod', endPeriod);
|
|
169
|
+
const qsStr = queryParams.toString();
|
|
170
|
+
const qs = qsStr ? `?${qsStr}` : '';
|
|
171
|
+
// Build a minimal RequestContextLike for fetchWithTimeout when no ctx provided
|
|
172
|
+
const now = new Date().toISOString();
|
|
173
|
+
const fetchCtx = ctx
|
|
174
|
+
? ctx
|
|
175
|
+
: { requestId: 'internal', timestamp: now };
|
|
176
|
+
const effectiveSignal = signal ?? ctx?.signal;
|
|
177
|
+
const raw = await withRetry(async () => {
|
|
178
|
+
const url = `${this.baseUrl}/data/dataflow/${encodeURIComponent(agencyId)}/${encodeURIComponent(dataflowId)}/${encodeURIComponent(version)}/${encodeURIComponent(key)}${qs}`;
|
|
179
|
+
if (ctx)
|
|
180
|
+
ctx.log.debug('Fetching data', { url });
|
|
181
|
+
const response = await fetchWithTimeout(url, this.timeoutMs, fetchCtx, {
|
|
182
|
+
headers: { Accept: 'application/json' },
|
|
183
|
+
...(effectiveSignal ? { signal: effectiveSignal } : {}),
|
|
184
|
+
});
|
|
185
|
+
const text = await response.text();
|
|
186
|
+
return this.parseJson(text, 'data query');
|
|
187
|
+
}, {
|
|
188
|
+
operation: 'ImfSdmxService.fetchData',
|
|
189
|
+
context: ctx,
|
|
190
|
+
maxRetries: 3,
|
|
191
|
+
baseDelayMs: 1000,
|
|
192
|
+
...(effectiveSignal ? { signal: effectiveSignal } : {}),
|
|
193
|
+
});
|
|
194
|
+
return this.decodeObservations(raw, dataflowId, key, startPeriod, endPeriod);
|
|
195
|
+
}
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// Normalizers
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
normalizeDataflows(raw) {
|
|
200
|
+
const flows = raw.data?.dataflows ?? [];
|
|
201
|
+
return flows.map((f) => ({
|
|
202
|
+
id: f.id,
|
|
203
|
+
agencyId: f.agencyID ?? 'IMF',
|
|
204
|
+
version: f.version ?? '1.0',
|
|
205
|
+
name: f.names?.en ?? f.id,
|
|
206
|
+
...(f.descriptions?.en ? { description: f.descriptions.en } : {}),
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
normalizeDsd(raw, agencyId, id, version) {
|
|
210
|
+
const dsds = raw.data?.dataStructures ?? [];
|
|
211
|
+
const codelists = raw.data?.codelists ?? [];
|
|
212
|
+
const dataflows = raw.data?.dataflows ?? [];
|
|
213
|
+
// Build a codelist map: id → entries
|
|
214
|
+
const clMap = new Map();
|
|
215
|
+
for (const cl of codelists) {
|
|
216
|
+
const entries = (cl.codes ?? []).map((c) => ({
|
|
217
|
+
id: c.id,
|
|
218
|
+
name: c.names?.en ?? c.id,
|
|
219
|
+
}));
|
|
220
|
+
clMap.set(cl.id, entries);
|
|
221
|
+
if (cl.agencyID) {
|
|
222
|
+
clMap.set(`${cl.agencyID}:${cl.id}`, entries);
|
|
223
|
+
clMap.set(`${cl.agencyID}:${cl.id}:${cl.version ?? '1.0'}`, entries);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const dsd = dsds[0];
|
|
227
|
+
if (!dsd)
|
|
228
|
+
return;
|
|
229
|
+
const dimList = dsd.dataStructureComponents?.dimensionList?.dimensions ?? [];
|
|
230
|
+
// IMF SDMX 3.0 uses `position` (SDMX 3.0 spec); legacy used `keyPosition`.
|
|
231
|
+
const sorted = [...dimList].sort((a, b) => (a.position ?? a.keyPosition ?? 0) - (b.position ?? b.keyPosition ?? 0));
|
|
232
|
+
// Derive the dataflow ID portion for IMF naming-convention codelist lookup.
|
|
233
|
+
// IMF SDMX 3.0 does not populate localRepresentation.enumeration — codelists are
|
|
234
|
+
// identified by naming convention: CL_<FLOW_ID>_<DIM_ID> (flow-specific) or
|
|
235
|
+
// CL_<DIM_ID> (shared). Try flow-specific first, then shared.
|
|
236
|
+
const flowIdForCl = id.replace(/^DSD_/, '');
|
|
237
|
+
const dimensions = sorted.map((d, idx) => {
|
|
238
|
+
const dimId = d.id ?? `DIM_${idx}`;
|
|
239
|
+
const enumRef = d.localRepresentation?.enumeration;
|
|
240
|
+
let codelist = [];
|
|
241
|
+
// 1. IMF naming convention (primary path — enumeration is null on SDMX 3.0).
|
|
242
|
+
// Also try the concept ID extracted from the conceptIdentity URN (e.g. FREQ from
|
|
243
|
+
// "urn:sdmx:...CS_MASTER_SYSTEM(1.0).FREQ") since some shared codelists use the
|
|
244
|
+
// concept ID rather than the dimension ID (e.g. FREQUENCY dim → CL_FREQ codelist).
|
|
245
|
+
const conceptId = typeof d.conceptIdentity === 'string' ? d.conceptIdentity.replace(/^.*\./, '') : undefined;
|
|
246
|
+
const conventionKeys = [
|
|
247
|
+
`CL_${flowIdForCl}_${dimId}`,
|
|
248
|
+
`CL_${dimId}`,
|
|
249
|
+
...(conceptId && conceptId !== dimId
|
|
250
|
+
? [`CL_${flowIdForCl}_${conceptId}`, `CL_${conceptId}`]
|
|
251
|
+
: []),
|
|
252
|
+
];
|
|
253
|
+
for (const k of conventionKeys) {
|
|
254
|
+
const found = clMap.get(k);
|
|
255
|
+
if (found && found.length > 0) {
|
|
256
|
+
codelist = found;
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// 2. Explicit enumeration reference (fallback for servers that populate it)
|
|
261
|
+
if (codelist.length === 0 && enumRef) {
|
|
262
|
+
const enumKeys = [
|
|
263
|
+
`${enumRef.agencyID ?? ''}:${enumRef.id ?? ''}:${enumRef.version ?? ''}`,
|
|
264
|
+
`${enumRef.agencyID ?? ''}:${enumRef.id ?? ''}`,
|
|
265
|
+
enumRef.id ?? '',
|
|
266
|
+
];
|
|
267
|
+
for (const k of enumKeys) {
|
|
268
|
+
const found = clMap.get(k);
|
|
269
|
+
if (found && found.length > 0) {
|
|
270
|
+
codelist = found;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
id: dimId,
|
|
277
|
+
name: dimId,
|
|
278
|
+
position: d.position ?? d.keyPosition ?? idx,
|
|
279
|
+
codelist,
|
|
280
|
+
};
|
|
281
|
+
});
|
|
282
|
+
// Build key format string from sorted dimension ids
|
|
283
|
+
const keyFormat = dimensions.map((d) => d.id).join('.');
|
|
284
|
+
// Get name from dataflow if available
|
|
285
|
+
const df = dataflows[0];
|
|
286
|
+
const name = dsd.names?.en ?? df?.names?.en ?? id;
|
|
287
|
+
const description = dsd.descriptions?.en ?? df?.descriptions?.en;
|
|
288
|
+
return {
|
|
289
|
+
dataflowId: id,
|
|
290
|
+
agencyId: dsd.agencyID ?? agencyId,
|
|
291
|
+
version: dsd.version ?? version,
|
|
292
|
+
name,
|
|
293
|
+
...(description ? { description } : {}),
|
|
294
|
+
keyFormat,
|
|
295
|
+
dimensions,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
decodeObservations(raw, dataflowId, key, startPeriod, endPeriod) {
|
|
299
|
+
const dataset = raw.data?.dataSets?.[0];
|
|
300
|
+
const structure = raw.data?.structures?.[0];
|
|
301
|
+
// Observation dimension (TIME_PERIOD)
|
|
302
|
+
const obsDims = structure?.dimensions?.observation ?? [];
|
|
303
|
+
const timeDim = obsDims[0];
|
|
304
|
+
const timeValues = timeDim?.values ?? [];
|
|
305
|
+
// Series attributes (UNIT, SCALE, DECIMALS, etc.)
|
|
306
|
+
const seriesAttrs = structure?.attributes?.series ?? [];
|
|
307
|
+
const obsAttrs = structure?.attributes?.observation ?? [];
|
|
308
|
+
// Find STATUS attribute index in observation attributes
|
|
309
|
+
const statusObsIdx = obsAttrs.findIndex((a) => a.id === 'STATUS');
|
|
310
|
+
// Find attribute indices in series attributes
|
|
311
|
+
const unitIdx = seriesAttrs.findIndex((a) => a.id === 'UNIT');
|
|
312
|
+
const scaleIdx = seriesAttrs.findIndex((a) => a.id === 'SCALE');
|
|
313
|
+
const decimalsIdx = seriesAttrs.findIndex((a) => a.id === 'DECIMALS_DISPLAYED');
|
|
314
|
+
const series = dataset?.series ?? {};
|
|
315
|
+
const observations = [];
|
|
316
|
+
let seriesAttributes = { unit: null, scale: null, decimals: null };
|
|
317
|
+
// Series-level dimensions for decoding the colon-separated series key ("0:0:0").
|
|
318
|
+
const seriesDims = structure?.dimensions?.series ?? [];
|
|
319
|
+
for (const [seriesKey, seriesData] of Object.entries(series)) {
|
|
320
|
+
// Decode the series key ("0:1:0") into dimension code values ("USA.NGDP_RPCH.A").
|
|
321
|
+
const seriesKeyParts = seriesKey.split(':');
|
|
322
|
+
const seriesCodeParts = seriesDims.map((dim, dimIdx) => {
|
|
323
|
+
const valIdx = parseInt(seriesKeyParts[dimIdx] ?? '0', 10);
|
|
324
|
+
const val = dim.values[valIdx];
|
|
325
|
+
return val?.id ?? val?.value ?? seriesKeyParts[dimIdx] ?? '';
|
|
326
|
+
});
|
|
327
|
+
const decodedSeriesKey = seriesCodeParts.join('.');
|
|
328
|
+
// Extract series-level attributes for the first series we find
|
|
329
|
+
if (seriesData.attributes) {
|
|
330
|
+
const attrs = seriesData.attributes;
|
|
331
|
+
seriesAttributes = {
|
|
332
|
+
unit: this.resolveAttrValue(unitIdx, attrs, seriesAttrs),
|
|
333
|
+
scale: this.resolveAttrValue(scaleIdx, attrs, seriesAttrs),
|
|
334
|
+
decimals: this.resolveDecimalsValue(decimalsIdx, attrs),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
// Decode observations
|
|
338
|
+
for (const [obsIdx, obsValues] of Object.entries(seriesData.observations ?? {})) {
|
|
339
|
+
const timeIdx = parseInt(obsIdx, 10);
|
|
340
|
+
// IMF SDMX 3.0 uses `value` field for time periods; fallback to `id` for legacy compat.
|
|
341
|
+
const timePeriod = timeValues[timeIdx]?.value ?? timeValues[timeIdx]?.id ?? obsIdx;
|
|
342
|
+
const rawValue = obsValues?.[0];
|
|
343
|
+
const value = rawValue != null && rawValue !== '' ? parseFloat(rawValue) : null;
|
|
344
|
+
let status = null;
|
|
345
|
+
if (statusObsIdx >= 0 && obsValues && obsValues[statusObsIdx + 1] != null) {
|
|
346
|
+
const statusCode = obsValues[statusObsIdx + 1];
|
|
347
|
+
const statusAttr = obsAttrs[statusObsIdx];
|
|
348
|
+
if (statusCode != null && statusAttr?.values) {
|
|
349
|
+
const idx2 = parseInt(statusCode, 10);
|
|
350
|
+
status = statusAttr.values[idx2]?.id ?? statusCode;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
observations.push({ series_key: decodedSeriesKey, time_period: timePeriod, value, status });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Sort observations by time_period
|
|
357
|
+
observations.sort((a, b) => a.time_period.localeCompare(b.time_period));
|
|
358
|
+
return {
|
|
359
|
+
dataflowId,
|
|
360
|
+
key,
|
|
361
|
+
...(startPeriod ? { startPeriod } : {}),
|
|
362
|
+
...(endPeriod ? { endPeriod } : {}),
|
|
363
|
+
observations,
|
|
364
|
+
seriesAttributes,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
resolveAttrValue(attrIdx, attrValues, attrDefs) {
|
|
368
|
+
if (attrIdx < 0 || attrIdx >= attrValues.length)
|
|
369
|
+
return null;
|
|
370
|
+
const raw = attrValues[attrIdx];
|
|
371
|
+
if (raw == null)
|
|
372
|
+
return null;
|
|
373
|
+
const def = attrDefs[attrIdx];
|
|
374
|
+
if (def?.values) {
|
|
375
|
+
const idx = parseInt(raw, 10);
|
|
376
|
+
if (!Number.isNaN(idx))
|
|
377
|
+
return def.values[idx]?.name ?? def.values[idx]?.id ?? raw;
|
|
378
|
+
}
|
|
379
|
+
return raw;
|
|
380
|
+
}
|
|
381
|
+
resolveDecimalsValue(attrIdx, attrValues) {
|
|
382
|
+
if (attrIdx < 0 || attrIdx >= attrValues.length)
|
|
383
|
+
return null;
|
|
384
|
+
const raw = attrValues[attrIdx];
|
|
385
|
+
if (raw == null)
|
|
386
|
+
return null;
|
|
387
|
+
const n = parseInt(raw, 10);
|
|
388
|
+
return Number.isNaN(n) ? null : n;
|
|
389
|
+
}
|
|
390
|
+
parseJson(text, context) {
|
|
391
|
+
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
392
|
+
throw serviceUnavailable(`IMF API returned HTML instead of JSON (${context})`);
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
return JSON.parse(text);
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
throw serviceUnavailable(`Failed to parse IMF API response as JSON (${context})`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// ---------------------------------------------------------------------------
|
|
403
|
+
// Init/accessor pattern
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
let _service;
|
|
406
|
+
export function initImfSdmxService(config, storage, baseUrl, timeoutMs) {
|
|
407
|
+
_service = new ImfSdmxService(config, storage, baseUrl, timeoutMs);
|
|
408
|
+
}
|
|
409
|
+
export function getImfSdmxService() {
|
|
410
|
+
if (!_service) {
|
|
411
|
+
throw new Error('ImfSdmxService not initialized — call initImfSdmxService() in setup()');
|
|
412
|
+
}
|
|
413
|
+
return _service;
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=imf-sdmx-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imf-sdmx-service.js","sourceRoot":"","sources":["../../../src/services/imf-sdmx/imf-sdmx-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Domain types for the IMF SDMX 3.0 service.
|
|
3
|
+
* @module services/imf-sdmx/types
|
|
4
|
+
*/
|
|
5
|
+
/** A single dataflow entry from the IMF SDMX structure/dataflow endpoint. */
|
|
6
|
+
export interface Dataflow {
|
|
7
|
+
agencyId: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
}
|
|
13
|
+
/** A single codelist entry: the machine code and human-readable name. */
|
|
14
|
+
export interface CodelistEntry {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
/** A single dimension in a dataflow's data structure definition. */
|
|
19
|
+
export interface Dimension {
|
|
20
|
+
codelist: CodelistEntry[];
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
position: number;
|
|
24
|
+
}
|
|
25
|
+
/** Fully-described dataflow including all dimensions and their codelists. */
|
|
26
|
+
export interface DataflowStructure {
|
|
27
|
+
agencyId: string;
|
|
28
|
+
dataflowId: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
dimensions: Dimension[];
|
|
31
|
+
/** Dimension names in keyPosition order, e.g. "COUNTRY.INDICATOR.FREQUENCY" */
|
|
32
|
+
keyFormat: string;
|
|
33
|
+
name: string;
|
|
34
|
+
version: string;
|
|
35
|
+
}
|
|
36
|
+
/** A decoded observation row. */
|
|
37
|
+
export interface Observation {
|
|
38
|
+
/** Dot-separated dimension codes for this series, e.g. "USA.NGDP_RPCH.A". */
|
|
39
|
+
series_key: string;
|
|
40
|
+
status: string | null;
|
|
41
|
+
time_period: string;
|
|
42
|
+
value: number | null;
|
|
43
|
+
}
|
|
44
|
+
/** Attributes carried per-series (unit, scale, decimals). */
|
|
45
|
+
export interface SeriesAttributes {
|
|
46
|
+
decimals: number | null;
|
|
47
|
+
scale: string | null;
|
|
48
|
+
unit: string | null;
|
|
49
|
+
}
|
|
50
|
+
/** Result of a data query, pre-spill. */
|
|
51
|
+
export interface DataQueryResult {
|
|
52
|
+
dataflowId: string;
|
|
53
|
+
endPeriod?: string;
|
|
54
|
+
key: string;
|
|
55
|
+
observations: Observation[];
|
|
56
|
+
seriesAttributes: SeriesAttributes;
|
|
57
|
+
startPeriod?: string;
|
|
58
|
+
}
|
|
59
|
+
/** Raw SDMX 3.0 JSON response shape (compact format). */
|
|
60
|
+
export interface SdmxDataResponse {
|
|
61
|
+
data?: {
|
|
62
|
+
dataSets?: Array<{
|
|
63
|
+
series?: Record<string, SdmxSeries>;
|
|
64
|
+
}>;
|
|
65
|
+
structures?: Array<SdmxStructure>;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export interface SdmxSeries {
|
|
69
|
+
attributes?: Array<string | null>;
|
|
70
|
+
observations?: Record<string, Array<string | null>>;
|
|
71
|
+
}
|
|
72
|
+
export interface SdmxStructure {
|
|
73
|
+
attributes?: {
|
|
74
|
+
series?: Array<SdmxAttributeDef>;
|
|
75
|
+
observation?: Array<SdmxAttributeDef>;
|
|
76
|
+
};
|
|
77
|
+
dimensions?: {
|
|
78
|
+
/** Series-level dimensions — values array lists the code for each index position in the series key. */
|
|
79
|
+
series?: Array<SdmxDimensionDef>;
|
|
80
|
+
observation?: Array<SdmxDimensionDef>;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export interface SdmxDimensionDef {
|
|
84
|
+
id: string;
|
|
85
|
+
/** IMF SDMX 3.0 uses `value` for observation dimension values (e.g. time periods);
|
|
86
|
+
* legacy SDMX 2.1 used `id`. Both are optional to handle either format. */
|
|
87
|
+
values: Array<{
|
|
88
|
+
id?: string;
|
|
89
|
+
value?: string;
|
|
90
|
+
name?: string;
|
|
91
|
+
}>;
|
|
92
|
+
}
|
|
93
|
+
export interface SdmxAttributeDef {
|
|
94
|
+
id: string;
|
|
95
|
+
values?: Array<{
|
|
96
|
+
id: string;
|
|
97
|
+
name?: string;
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
/** Raw SDMX structure response shape. */
|
|
101
|
+
export interface SdmxStructureResponse {
|
|
102
|
+
data?: {
|
|
103
|
+
dataflows?: Array<{
|
|
104
|
+
id: string;
|
|
105
|
+
agencyID?: string;
|
|
106
|
+
version?: string;
|
|
107
|
+
names?: Record<string, string>;
|
|
108
|
+
descriptions?: Record<string, string>;
|
|
109
|
+
structure?: {
|
|
110
|
+
id: string;
|
|
111
|
+
agencyID?: string;
|
|
112
|
+
version?: string;
|
|
113
|
+
};
|
|
114
|
+
}>;
|
|
115
|
+
dataStructures?: Array<{
|
|
116
|
+
id: string;
|
|
117
|
+
agencyID?: string;
|
|
118
|
+
version?: string;
|
|
119
|
+
names?: Record<string, string>;
|
|
120
|
+
descriptions?: Record<string, string>;
|
|
121
|
+
dataStructureComponents?: {
|
|
122
|
+
dimensionList?: {
|
|
123
|
+
dimensions?: Array<{
|
|
124
|
+
id?: string;
|
|
125
|
+
/** String URN in IMF SDMX 3.0 (e.g. "urn:sdmx:...=IMF.RES:CS_WEO(4.0).COUNTRY"). */
|
|
126
|
+
conceptIdentity?: string | {
|
|
127
|
+
id?: string;
|
|
128
|
+
urn?: string;
|
|
129
|
+
};
|
|
130
|
+
/** SDMX 3.0 position — IMF returns this field instead of keyPosition. */
|
|
131
|
+
position?: number;
|
|
132
|
+
/** Legacy SDMX 2.1 position field — absent on IMF SDMX 3.0. */
|
|
133
|
+
keyPosition?: number;
|
|
134
|
+
localRepresentation?: {
|
|
135
|
+
enumeration?: {
|
|
136
|
+
id?: string;
|
|
137
|
+
agencyID?: string;
|
|
138
|
+
version?: string;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
}>;
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
}>;
|
|
145
|
+
codelists?: Array<{
|
|
146
|
+
id: string;
|
|
147
|
+
agencyID?: string;
|
|
148
|
+
version?: string;
|
|
149
|
+
names?: Record<string, string>;
|
|
150
|
+
codes?: Array<{
|
|
151
|
+
id: string;
|
|
152
|
+
names?: Record<string, string>;
|
|
153
|
+
}>;
|
|
154
|
+
}>;
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/imf-sdmx/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/imf-sdmx/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|