@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.
Files changed (65) hide show
  1. package/AGENTS.md +377 -0
  2. package/CLAUDE.md +377 -0
  3. package/Dockerfile +105 -0
  4. package/LICENSE +201 -0
  5. package/README.md +290 -0
  6. package/changelog/0.1.x/0.1.1.md +33 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +13 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +26 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +28 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/prompts/definitions/index.d.ts +7 -0
  17. package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
  18. package/dist/mcp-server/prompts/definitions/index.js +7 -0
  19. package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/imf-database.resource.d.ts +9 -0
  21. package/dist/mcp-server/resources/definitions/imf-database.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/imf-database.resource.js +61 -0
  23. package/dist/mcp-server/resources/definitions/imf-database.resource.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/index.d.ts +9 -0
  25. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/index.js +8 -0
  27. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.d.ts +26 -0
  29. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.js +96 -0
  31. package/dist/mcp-server/tools/definitions/imf-dataframe-describe.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.d.ts +24 -0
  33. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.js +96 -0
  35. package/dist/mcp-server/tools/definitions/imf-dataframe-query.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/imf-get-database.tool.d.ts +39 -0
  37. package/dist/mcp-server/tools/definitions/imf-get-database.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/imf-get-database.tool.js +155 -0
  39. package/dist/mcp-server/tools/definitions/imf-get-database.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.d.ts +19 -0
  41. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.js +88 -0
  43. package/dist/mcp-server/tools/definitions/imf-list-databases.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.d.ts +57 -0
  45. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.js +277 -0
  47. package/dist/mcp-server/tools/definitions/imf-query-dataset.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/index.d.ts +136 -0
  49. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/index.js +22 -0
  51. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  52. package/dist/services/canvas/canvas-accessor.d.ts +11 -0
  53. package/dist/services/canvas/canvas-accessor.d.ts.map +1 -0
  54. package/dist/services/canvas/canvas-accessor.js +13 -0
  55. package/dist/services/canvas/canvas-accessor.js.map +1 -0
  56. package/dist/services/imf-sdmx/imf-sdmx-service.d.ts +38 -0
  57. package/dist/services/imf-sdmx/imf-sdmx-service.d.ts.map +1 -0
  58. package/dist/services/imf-sdmx/imf-sdmx-service.js +415 -0
  59. package/dist/services/imf-sdmx/imf-sdmx-service.js.map +1 -0
  60. package/dist/services/imf-sdmx/types.d.ts +157 -0
  61. package/dist/services/imf-sdmx/types.d.ts.map +1 -0
  62. package/dist/services/imf-sdmx/types.js +6 -0
  63. package/dist/services/imf-sdmx/types.js.map +1 -0
  64. package/package.json +106 -0
  65. package/server.json +99 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @fileoverview Server-specific environment variable configuration for imf-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
+ .default('https://api.imf.org/external/sdmx/3.0')
11
+ .describe('IMF SDMX 3.0 base URL'),
12
+ requestTimeoutMs: z.coerce
13
+ .number()
14
+ .default(30_000)
15
+ .describe('Per-request timeout in milliseconds'),
16
+ });
17
+ let _config;
18
+ /** Returns the parsed, cached server configuration. */
19
+ export function getServerConfig() {
20
+ _config ??= parseEnvConfig(ServerConfigSchema, {
21
+ baseUrl: 'IMF_BASE_URL',
22
+ requestTimeoutMs: 'IMF_REQUEST_TIMEOUT_MS',
23
+ });
24
+ return _config;
25
+ }
26
+ //# 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,OAAO,CAAC,uCAAuC,CAAC;SAChD,QAAQ,CAAC,uBAAuB,CAAC;IACpC,gBAAgB,EAAE,CAAC,CAAC,MAAM;SACvB,MAAM,EAAE;SACR,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,qCAAqC,CAAC;CACnD,CAAC,CAAC;AAEH,IAAI,OAAuD,CAAC;AAE5D,uDAAuD;AACvD,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,cAAc,CAAC,kBAAkB,EAAE;QAC7C,OAAO,EAAE,cAAc;QACvB,gBAAgB,EAAE,wBAAwB;KAC3C,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview imf-mcp-server MCP server entry point.
4
+ * @module index
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,28 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview imf-mcp-server MCP server entry point.
4
+ * @module index
5
+ */
6
+ import { createApp } from '@cyanheads/mcp-ts-core';
7
+ import { getServerConfig } from './config/server-config.js';
8
+ import { allPromptDefinitions } from './mcp-server/prompts/definitions/index.js';
9
+ import { allResourceDefinitions } from './mcp-server/resources/definitions/index.js';
10
+ import { allToolDefinitions } from './mcp-server/tools/definitions/index.js';
11
+ import { setCanvas } from './services/canvas/canvas-accessor.js';
12
+ import { initImfSdmxService } from './services/imf-sdmx/imf-sdmx-service.js';
13
+ await createApp({
14
+ tools: allToolDefinitions,
15
+ resources: allResourceDefinitions,
16
+ prompts: allPromptDefinitions,
17
+ instructions: 'IMF SDMX 3.0 macroeconomic data server. Keyless — no API key required.\n' +
18
+ 'Workflow: imf_list_databases → imf_get_database → imf_query_dataset\n' +
19
+ 'Country codes are ISO 3-letter (USA, GBR, DEU — not US, GB, DE).\n' +
20
+ 'Large multi-country queries spill to DataCanvas; use imf_dataframe_query for SQL analysis.\n' +
21
+ 'Key legacy note: the IFS monolithic database is decomposed — use CPI, ER, IL, MFS_* instead.',
22
+ setup(core) {
23
+ const cfg = getServerConfig();
24
+ initImfSdmxService(core.config, core.storage, cfg.baseUrl, cfg.requestTimeoutMs);
25
+ setCanvas(core.canvas);
26
+ },
27
+ });
28
+ //# 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,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,SAAS,CAAC;IACd,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,sBAAsB;IACjC,OAAO,EAAE,oBAAoB;IAC7B,YAAY,EACV,0EAA0E;QAC1E,uEAAuE;QACvE,oEAAoE;QACpE,8FAA8F;QAC9F,8FAA8F;IAChG,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACjF,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Barrel export for IMF MCP prompt definitions.
3
+ * No prompts — this is a pure data server.
4
+ * @module mcp-server/prompts/definitions/index
5
+ */
6
+ export declare const allPromptDefinitions: never[];
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,oBAAoB,EAAE,KAAK,EAAO,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Barrel export for IMF MCP prompt definitions.
3
+ * No prompts — this is a pure data server.
4
+ * @module mcp-server/prompts/definitions/index
5
+ */
6
+ export const allPromptDefinitions = [];
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAY,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Resource: imf://database/{dataflow_id} — stable metadata for a dataflow.
3
+ * @module mcp-server/resources/definitions/imf-database.resource
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ export declare const imfDatabaseResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
7
+ dataflow_id: z.ZodString;
8
+ }, z.core.$strip>, undefined, undefined>;
9
+ //# sourceMappingURL=imf-database.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-database.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/imf-database.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIrD,eAAO,MAAM,mBAAmB;;wCAqE9B,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @fileoverview Resource: imf://database/{dataflow_id} — stable metadata for a dataflow.
3
+ * @module mcp-server/resources/definitions/imf-database.resource
4
+ */
5
+ import { resource, z } from '@cyanheads/mcp-ts-core';
6
+ import { notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getImfSdmxService } from '../../../services/imf-sdmx/imf-sdmx-service.js';
8
+ export const imfDatabaseResource = resource('imf://database/{dataflow_id}', {
9
+ name: 'imf-database',
10
+ title: 'IMF Dataflow Metadata',
11
+ description: 'Metadata for a single IMF SDMX dataflow — dimensions with full codelists, key_format, name, and description. ' +
12
+ 'Stable URI-addressable reference for known dataflow IDs (WEO, BOP, CPI, etc.).',
13
+ mimeType: 'application/json',
14
+ params: z.object({
15
+ dataflow_id: z
16
+ .string()
17
+ .describe('Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI.'),
18
+ }),
19
+ async handler(params, ctx) {
20
+ const svc = getImfSdmxService();
21
+ const dataflow = await svc.findDataflow(params.dataflow_id, undefined, undefined, ctx);
22
+ if (!dataflow) {
23
+ throw notFound(`Dataflow '${params.dataflow_id}' not found`, {
24
+ reason: 'dataflow_not_found',
25
+ dataflowId: params.dataflow_id,
26
+ });
27
+ }
28
+ let structure;
29
+ try {
30
+ structure = await svc.fetchDataflowStructure(params.dataflow_id, dataflow.agencyId, dataflow.version, ctx);
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : String(err);
34
+ if (msg.includes('not found')) {
35
+ throw notFound(`Dataflow '${params.dataflow_id}' not found`, {
36
+ reason: 'dataflow_not_found',
37
+ dataflowId: params.dataflow_id,
38
+ }, { cause: err });
39
+ }
40
+ throw serviceUnavailable(`Structure unavailable for dataflow '${params.dataflow_id}'`, {
41
+ reason: 'structure_unavailable',
42
+ dataflowId: params.dataflow_id,
43
+ }, { cause: err });
44
+ }
45
+ return {
46
+ dataflow_id: structure.dataflowId,
47
+ agency_id: structure.agencyId,
48
+ version: structure.version,
49
+ name: structure.name,
50
+ ...(structure.description ? { description: structure.description } : {}),
51
+ key_format: structure.keyFormat,
52
+ dimensions: structure.dimensions.map((dim) => ({
53
+ id: dim.id,
54
+ name: dim.name,
55
+ position: dim.position,
56
+ codelist: dim.codelist,
57
+ })),
58
+ };
59
+ },
60
+ });
61
+ //# sourceMappingURL=imf-database.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-database.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/imf-database.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,8BAA8B,EAAE;IAC1E,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EACT,+GAA+G;QAC/G,gFAAgF;IAClF,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,CAAC,kEAAkE,CAAC;KAChF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,CAAC,aAAa,MAAM,CAAC,WAAW,aAAa,EAAE;gBAC3D,MAAM,EAAE,oBAAoB;gBAC5B,UAAU,EAAE,MAAM,CAAC,WAAW;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,SAAiE,CAAC;QACtE,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAC1C,MAAM,CAAC,WAAW,EAClB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,EAChB,GAAG,CACJ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,MAAM,QAAQ,CACZ,aAAa,MAAM,CAAC,WAAW,aAAa,EAC5C;oBACE,MAAM,EAAE,oBAAoB;oBAC5B,UAAU,EAAE,MAAM,CAAC,WAAW;iBAC/B,EACD,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;YACJ,CAAC;YACD,MAAM,kBAAkB,CACtB,uCAAuC,MAAM,CAAC,WAAW,GAAG,EAC5D;gBACE,MAAM,EAAE,uBAAuB;gBAC/B,UAAU,EAAE,MAAM,CAAC,WAAW;aAC/B,EACD,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;QACJ,CAAC;QAED,OAAO;YACL,WAAW,EAAE,SAAS,CAAC,UAAU;YACjC,SAAS,EAAE,SAAS,CAAC,QAAQ;YAC7B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,UAAU,EAAE,SAAS,CAAC,SAAS;YAC/B,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7C,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Barrel export for all IMF MCP resource definitions.
3
+ * @module mcp-server/resources/definitions/index
4
+ */
5
+ export { imfDatabaseResource } from './imf-database.resource.js';
6
+ export declare const allResourceDefinitions: import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
7
+ dataflow_id: import("zod").ZodString;
8
+ }, import("zod/v4/core").$strip>, undefined, undefined>[];
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjE,eAAO,MAAM,sBAAsB;;yDAAwB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Barrel export for all IMF MCP resource definitions.
3
+ * @module mcp-server/resources/definitions/index
4
+ */
5
+ export { imfDatabaseResource } from './imf-database.resource.js';
6
+ import { imfDatabaseResource } from './imf-database.resource.js';
7
+ export const allResourceDefinitions = [imfDatabaseResource];
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @fileoverview Tool: imf_dataframe_describe — list DataCanvas tables and columns.
3
+ * @module mcp-server/tools/definitions/imf-dataframe-describe.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const imfDataframeDescribe: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ canvas_id: z.ZodString;
9
+ }, z.core.$strip>, z.ZodObject<{
10
+ canvas_id: z.ZodString;
11
+ tables: z.ZodArray<z.ZodObject<{
12
+ name: z.ZodString;
13
+ row_count: z.ZodNumber;
14
+ columns: z.ZodArray<z.ZodObject<{
15
+ name: z.ZodString;
16
+ type: z.ZodString;
17
+ }, z.core.$strip>>;
18
+ }, z.core.$strip>>;
19
+ table_count: z.ZodNumber;
20
+ }, z.core.$strip>, readonly [{
21
+ readonly reason: "canvas_not_found";
22
+ readonly code: JsonRpcErrorCode.NotFound;
23
+ readonly when: "canvas_id does not match any registered DataCanvas table (expired, wrong session, or canvas disabled)";
24
+ readonly recovery: "Re-run imf_query_dataset to obtain a fresh canvas_id; ensure CANVAS_PROVIDER_TYPE=duckdb is set.";
25
+ }], undefined>;
26
+ //# sourceMappingURL=imf-dataframe-describe.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-dataframe-describe.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/imf-dataframe-describe.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;;;;;;;;;;;;;;;;;;cA0G/B,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @fileoverview Tool: imf_dataframe_describe — list DataCanvas tables and columns.
3
+ * @module mcp-server/tools/definitions/imf-dataframe-describe.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getCanvas } from '../../../services/canvas/canvas-accessor.js';
8
+ export const imfDataframeDescribe = tool('imf_dataframe_describe', {
9
+ description: 'List DataCanvas tables and columns staged by a prior imf_query_dataset call. ' +
10
+ "Returns each table's name, row count, and column schema (name + DuckDB type). " +
11
+ 'Required before imf_dataframe_query to discover the table and column names for SQL.',
12
+ annotations: {
13
+ readOnlyHint: true,
14
+ idempotentHint: true,
15
+ openWorldHint: false,
16
+ },
17
+ input: z.object({
18
+ canvas_id: z
19
+ .string()
20
+ .describe('Canvas ID returned by imf_query_dataset when results were too large for inline delivery.'),
21
+ }),
22
+ output: z.object({
23
+ canvas_id: z.string().describe('Canvas session ID that was introspected.'),
24
+ tables: z
25
+ .array(z
26
+ .object({
27
+ name: z.string().describe('Table name — use this in imf_dataframe_query SQL.'),
28
+ row_count: z.number().describe('Number of rows in this table.'),
29
+ columns: z
30
+ .array(z
31
+ .object({
32
+ name: z
33
+ .string()
34
+ .describe('Column name — use this in SELECT and WHERE clauses.'),
35
+ type: z.string().describe('DuckDB column type, e.g. VARCHAR, DOUBLE, BIGINT.'),
36
+ })
37
+ .describe('A single column definition.'))
38
+ .describe('Column schema for this table.'),
39
+ })
40
+ .describe('A single canvas table with its schema.'))
41
+ .describe('All tables registered on this canvas.'),
42
+ table_count: z.number().describe('Total number of tables on the canvas.'),
43
+ }),
44
+ errors: [
45
+ {
46
+ reason: 'canvas_not_found',
47
+ code: JsonRpcErrorCode.NotFound,
48
+ when: 'canvas_id does not match any registered DataCanvas table (expired, wrong session, or canvas disabled)',
49
+ recovery: 'Re-run imf_query_dataset to obtain a fresh canvas_id; ensure CANVAS_PROVIDER_TYPE=duckdb is set.',
50
+ },
51
+ ],
52
+ async handler(input, ctx) {
53
+ const canvas = getCanvas();
54
+ if (!canvas) {
55
+ throw ctx.fail('canvas_not_found', 'DataCanvas is not enabled. Set CANVAS_PROVIDER_TYPE=duckdb.', ctx.recoveryFor('canvas_not_found'));
56
+ }
57
+ let instance;
58
+ try {
59
+ instance = await canvas.acquire(input.canvas_id, ctx);
60
+ }
61
+ catch {
62
+ throw ctx.fail('canvas_not_found', `Canvas '${input.canvas_id}' not found or expired`, {
63
+ canvasId: input.canvas_id,
64
+ ...ctx.recoveryFor('canvas_not_found'),
65
+ });
66
+ }
67
+ const tableInfos = await instance.describe();
68
+ ctx.log.info('Canvas described', { canvasId: input.canvas_id, tables: tableInfos.length });
69
+ return {
70
+ canvas_id: instance.canvasId,
71
+ tables: tableInfos.map((t) => ({
72
+ name: t.name,
73
+ row_count: t.rowCount,
74
+ columns: t.columns.map((c) => ({ name: c.name, type: c.type })),
75
+ })),
76
+ table_count: tableInfos.length,
77
+ };
78
+ },
79
+ format: (result) => {
80
+ const lines = [
81
+ `**Canvas:** \`${result.canvas_id}\``,
82
+ `**Tables:** ${result.table_count}\n`,
83
+ ];
84
+ for (const t of result.tables) {
85
+ lines.push(`### ${t.name} (${t.row_count} rows)`);
86
+ lines.push('| Column | Type |');
87
+ lines.push('|:-------|:-----|');
88
+ for (const col of t.columns) {
89
+ lines.push(`| ${col.name} | ${col.type} |`);
90
+ }
91
+ lines.push('');
92
+ }
93
+ return [{ type: 'text', text: lines.join('\n') }];
94
+ },
95
+ });
96
+ //# sourceMappingURL=imf-dataframe-describe.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-dataframe-describe.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/imf-dataframe-describe.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @fileoverview Tool: imf_dataframe_query — run read-only SQL SELECT against a DataCanvas table.
3
+ * @module mcp-server/tools/definitions/imf-dataframe-query.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const imfDataframeQuery: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ canvas_id: z.ZodString;
9
+ sql: z.ZodString;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
12
+ row_count: z.ZodNumber;
13
+ }, z.core.$strip>, readonly [{
14
+ readonly reason: "canvas_not_found";
15
+ readonly code: JsonRpcErrorCode.NotFound;
16
+ readonly when: "canvas_id does not match any registered DataCanvas table (expired, wrong session, or canvas disabled)";
17
+ readonly recovery: "Re-run imf_query_dataset to obtain a fresh canvas_id; ensure CANVAS_PROVIDER_TYPE=duckdb is set.";
18
+ }, {
19
+ readonly reason: "invalid_sql";
20
+ readonly code: JsonRpcErrorCode.InvalidParams;
21
+ readonly when: "sql does not start with SELECT — DML and DDL statements are not permitted";
22
+ readonly recovery: "Rewrite the statement as a SELECT query referencing tables from imf_dataframe_describe.";
23
+ }], undefined>;
24
+ //# sourceMappingURL=imf-dataframe-query.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-dataframe-query.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/imf-dataframe-query.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,iBAAiB;;;;;;;;;;;;;;;;cAmH5B,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @fileoverview Tool: imf_dataframe_query — run read-only SQL SELECT against a DataCanvas table.
3
+ * @module mcp-server/tools/definitions/imf-dataframe-query.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getCanvas } from '../../../services/canvas/canvas-accessor.js';
8
+ export const imfDataframeQuery = tool('imf_dataframe_query', {
9
+ description: 'Run a read-only SQL SELECT against a DataCanvas table staged by imf_query_dataset. ' +
10
+ 'Supports multi-country comparisons, time-series aggregation, and cross-indicator joins. ' +
11
+ 'Requires imf_dataframe_describe first to discover table and column names. ' +
12
+ 'Only SELECT statements are accepted — DML and DDL are rejected.',
13
+ annotations: {
14
+ readOnlyHint: true,
15
+ idempotentHint: true,
16
+ openWorldHint: false,
17
+ },
18
+ input: z.object({
19
+ canvas_id: z
20
+ .string()
21
+ .describe('Canvas ID returned by imf_query_dataset when results were too large for inline delivery.'),
22
+ sql: z
23
+ .string()
24
+ .describe('Read-only SQL SELECT statement. Must start with SELECT. ' +
25
+ 'Reference tables by the names returned by imf_dataframe_describe. ' +
26
+ "Example: SELECT time_period, value FROM spilled_abc123 WHERE time_period >= '2010' ORDER BY time_period."),
27
+ }),
28
+ output: z.object({
29
+ rows: z
30
+ .array(z
31
+ .record(z.string(), z.unknown())
32
+ .describe('A result row — keys are the selected column names, values match the column DuckDB types (string, number, null).'))
33
+ .describe('Query result rows, capped at the canvas row limit (default 10,000).'),
34
+ row_count: z.number().describe('Total matching rows before the cap — may exceed rows.length.'),
35
+ }),
36
+ errors: [
37
+ {
38
+ reason: 'canvas_not_found',
39
+ code: JsonRpcErrorCode.NotFound,
40
+ when: 'canvas_id does not match any registered DataCanvas table (expired, wrong session, or canvas disabled)',
41
+ recovery: 'Re-run imf_query_dataset to obtain a fresh canvas_id; ensure CANVAS_PROVIDER_TYPE=duckdb is set.',
42
+ },
43
+ {
44
+ reason: 'invalid_sql',
45
+ code: JsonRpcErrorCode.InvalidParams,
46
+ when: 'sql does not start with SELECT — DML and DDL statements are not permitted',
47
+ recovery: 'Rewrite the statement as a SELECT query referencing tables from imf_dataframe_describe.',
48
+ },
49
+ ],
50
+ async handler(input, ctx) {
51
+ const canvas = getCanvas();
52
+ if (!canvas) {
53
+ throw ctx.fail('canvas_not_found', 'DataCanvas is not enabled. Set CANVAS_PROVIDER_TYPE=duckdb.', ctx.recoveryFor('canvas_not_found'));
54
+ }
55
+ // Validate SQL starts with SELECT
56
+ if (!/^\s*SELECT\s/i.test(input.sql)) {
57
+ throw ctx.fail('invalid_sql', 'SQL must be a SELECT statement. DML and DDL are not permitted.', ctx.recoveryFor('invalid_sql'));
58
+ }
59
+ let instance;
60
+ try {
61
+ instance = await canvas.acquire(input.canvas_id, ctx);
62
+ }
63
+ catch {
64
+ throw ctx.fail('canvas_not_found', `Canvas '${input.canvas_id}' not found or expired`, {
65
+ canvasId: input.canvas_id,
66
+ ...ctx.recoveryFor('canvas_not_found'),
67
+ });
68
+ }
69
+ const result = await instance.query(input.sql, { signal: ctx.signal });
70
+ ctx.log.info('Canvas query executed', {
71
+ canvasId: input.canvas_id,
72
+ rowCount: result.rowCount,
73
+ });
74
+ return { rows: result.rows, row_count: result.rowCount };
75
+ },
76
+ format: (result) => {
77
+ if (result.rows.length === 0) {
78
+ return [{ type: 'text', text: `**0 rows** (${result.row_count} total)` }];
79
+ }
80
+ const columns = Object.keys(result.rows[0]);
81
+ const lines = [
82
+ `**${result.row_count} row${result.row_count === 1 ? '' : 's'}**\n`,
83
+ `| ${columns.join(' | ')} |`,
84
+ `| ${columns.map(() => ':---').join(' | ')} |`,
85
+ ];
86
+ for (const row of result.rows) {
87
+ const cells = columns.map((col) => {
88
+ const v = row[col];
89
+ return v == null ? '—' : String(v);
90
+ });
91
+ lines.push(`| ${cells.join(' | ')} |`);
92
+ }
93
+ return [{ type: 'text', text: lines.join('\n') }];
94
+ },
95
+ });
96
+ //# sourceMappingURL=imf-dataframe-query.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-dataframe-query.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/imf-dataframe-query.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Tool: imf_get_database — fetch a dataflow's dimension list and codelists.
3
+ * @module mcp-server/tools/definitions/imf-get-database.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const imfGetDatabase: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ dataflow_id: z.ZodString;
9
+ agency_id: z.ZodOptional<z.ZodString>;
10
+ version: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ dataflow_id: z.ZodString;
13
+ agency_id: z.ZodString;
14
+ version: z.ZodString;
15
+ name: z.ZodString;
16
+ description: z.ZodOptional<z.ZodString>;
17
+ key_format: z.ZodString;
18
+ dimensions: z.ZodArray<z.ZodObject<{
19
+ id: z.ZodString;
20
+ name: z.ZodString;
21
+ position: z.ZodNumber;
22
+ codelist: z.ZodArray<z.ZodObject<{
23
+ id: z.ZodString;
24
+ name: z.ZodString;
25
+ }, z.core.$strip>>;
26
+ codelist_truncated: z.ZodBoolean;
27
+ }, z.core.$strip>>;
28
+ }, z.core.$strip>, readonly [{
29
+ readonly reason: "dataflow_not_found";
30
+ readonly code: JsonRpcErrorCode.NotFound;
31
+ readonly when: "dataflow_id does not match any known dataflow on api.imf.org";
32
+ readonly recovery: "Call imf_list_databases to browse available dataflow IDs.";
33
+ }, {
34
+ readonly reason: "structure_unavailable";
35
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
36
+ readonly when: "api.imf.org returns non-200 on the DSD endpoint";
37
+ readonly recovery: "Retry after a short wait; the IMF SDMX 3.0 portal is occasionally slow.";
38
+ }], undefined>;
39
+ //# sourceMappingURL=imf-get-database.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imf-get-database.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/imf-get-database.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8KzB,CAAC"}