@standby/mcp-server-chart 0.9.10

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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +285 -0
  3. package/build/charts/area.d.ts +41 -0
  4. package/build/charts/area.js +56 -0
  5. package/build/charts/bar.d.ts +41 -0
  6. package/build/charts/bar.js +57 -0
  7. package/build/charts/base.d.ts +30 -0
  8. package/build/charts/base.js +79 -0
  9. package/build/charts/boxplot.d.ts +40 -0
  10. package/build/charts/boxplot.js +50 -0
  11. package/build/charts/column.d.ts +41 -0
  12. package/build/charts/column.js +57 -0
  13. package/build/charts/dual-axes.d.ts +43 -0
  14. package/build/charts/dual-axes.js +59 -0
  15. package/build/charts/fishbone-diagram.d.ts +32 -0
  16. package/build/charts/fishbone-diagram.js +59 -0
  17. package/build/charts/flow-diagram.d.ts +39 -0
  18. package/build/charts/flow-diagram.js +45 -0
  19. package/build/charts/funnel.d.ts +36 -0
  20. package/build/charts/funnel.js +41 -0
  21. package/build/charts/histogram.d.ts +36 -0
  22. package/build/charts/histogram.js +45 -0
  23. package/build/charts/index.d.ts +26 -0
  24. package/build/charts/index.js +52 -0
  25. package/build/charts/line.d.ts +41 -0
  26. package/build/charts/line.js +52 -0
  27. package/build/charts/liquid.d.ts +39 -0
  28. package/build/charts/liquid.js +46 -0
  29. package/build/charts/mind-map.d.ts +30 -0
  30. package/build/charts/mind-map.js +43 -0
  31. package/build/charts/network-graph.d.ts +39 -0
  32. package/build/charts/network-graph.js +45 -0
  33. package/build/charts/organization-chart.d.ts +49 -0
  34. package/build/charts/organization-chart.js +60 -0
  35. package/build/charts/pie.d.ts +37 -0
  36. package/build/charts/pie.js +48 -0
  37. package/build/charts/radar.d.ts +38 -0
  38. package/build/charts/radar.js +49 -0
  39. package/build/charts/sankey.d.ts +43 -0
  40. package/build/charts/sankey.js +47 -0
  41. package/build/charts/scatter.d.ts +39 -0
  42. package/build/charts/scatter.js +47 -0
  43. package/build/charts/treemap.d.ts +44 -0
  44. package/build/charts/treemap.js +59 -0
  45. package/build/charts/venn.d.ts +37 -0
  46. package/build/charts/venn.js +49 -0
  47. package/build/charts/violin.d.ts +40 -0
  48. package/build/charts/violin.js +50 -0
  49. package/build/charts/waterfall.d.ts +44 -0
  50. package/build/charts/waterfall.js +73 -0
  51. package/build/charts/word-cloud.d.ts +36 -0
  52. package/build/charts/word-cloud.js +44 -0
  53. package/build/index.d.ts +2 -0
  54. package/build/index.js +73 -0
  55. package/build/sdk.d.ts +6 -0
  56. package/build/sdk.js +24 -0
  57. package/build/server.d.ts +17 -0
  58. package/build/server.js +151 -0
  59. package/build/services/index.d.ts +3 -0
  60. package/build/services/index.js +9 -0
  61. package/build/services/sse.d.ts +2 -0
  62. package/build/services/sse.js +59 -0
  63. package/build/services/stdio.d.ts +2 -0
  64. package/build/services/stdio.js +21 -0
  65. package/build/services/streamable.d.ts +2 -0
  66. package/build/services/streamable.js +58 -0
  67. package/build/utils/callTool.d.ts +18 -0
  68. package/build/utils/callTool.js +129 -0
  69. package/build/utils/env.d.ts +12 -0
  70. package/build/utils/env.js +38 -0
  71. package/build/utils/generate.d.ts +4 -0
  72. package/build/utils/generate.js +35 -0
  73. package/build/utils/image-server.d.ts +18 -0
  74. package/build/utils/image-server.js +66 -0
  75. package/build/utils/index.d.ts +3 -0
  76. package/build/utils/index.js +9 -0
  77. package/build/utils/local-render.d.ts +17 -0
  78. package/build/utils/local-render.js +121 -0
  79. package/build/utils/logger.d.ts +28 -0
  80. package/build/utils/logger.js +57 -0
  81. package/build/utils/schema.d.ts +4 -0
  82. package/build/utils/schema.js +12 -0
  83. package/build/utils/spec-translator.d.ts +12 -0
  84. package/build/utils/spec-translator.js +515 -0
  85. package/build/utils/validator.d.ts +34 -0
  86. package/build/utils/validator.js +76 -0
  87. package/package.json +66 -0
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDisabledTools = getDisabledTools;
7
+ exports.getChartImageDir = getChartImageDir;
8
+ exports.getImageServerPort = getImageServerPort;
9
+ const node_process_1 = __importDefault(require("node:process"));
10
+ /**
11
+ * Get the list of disabled tools from environment variables.
12
+ */
13
+ function getDisabledTools() {
14
+ const disabledTools = node_process_1.default.env.DISABLED_TOOLS;
15
+ if (!disabledTools || disabledTools === "undefined") {
16
+ return [];
17
+ }
18
+ return disabledTools.split(",");
19
+ }
20
+ /**
21
+ * Get the custom output directory for chart images, if set.
22
+ */
23
+ function getChartImageDir() {
24
+ return node_process_1.default.env.CHART_IMAGE_DIR;
25
+ }
26
+ /**
27
+ * Get the port for the local image server.
28
+ */
29
+ function getImageServerPort() {
30
+ const raw = node_process_1.default.env.IMAGE_SERVER_PORT;
31
+ if (!raw)
32
+ return 18900;
33
+ const port = Number.parseInt(raw, 10);
34
+ if (Number.isNaN(port) || port < 1 || port > 65535) {
35
+ throw new Error(`Invalid IMAGE_SERVER_PORT '${raw}': must be a number between 1 and 65535.`);
36
+ }
37
+ return port;
38
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Generate a chart URL by rendering locally with @antv/g2-ssr.
3
+ */
4
+ export declare function generateChartUrl(type: string, options: Record<string, any>): Promise<string>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.generateChartUrl = generateChartUrl;
13
+ const image_server_1 = require("./image-server.js");
14
+ const local_render_1 = require("./local-render.js");
15
+ const logger_1 = require("./logger.js");
16
+ const spec_translator_1 = require("./spec-translator.js");
17
+ /**
18
+ * Generate a chart URL by rendering locally with @antv/g2-ssr.
19
+ */
20
+ function generateChartUrl(type,
21
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation>
22
+ options) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const g2Spec = (0, spec_translator_1.translateToG2Spec)(type, options);
25
+ if (!g2Spec) {
26
+ throw new Error(`Unsupported chart type for local rendering: '${type}'`);
27
+ }
28
+ const width = options.width || 600;
29
+ const height = options.height || 400;
30
+ const filePath = yield (0, local_render_1.renderG2SpecToFile)(g2Spec, width, height);
31
+ const url = (0, image_server_1.filePathToUrl)(filePath);
32
+ logger_1.logger.info(`Generated chart URL: ${url}`);
33
+ return url;
34
+ });
35
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Start a local HTTP server to serve rendered chart images.
3
+ * Only starts once; subsequent calls resolve immediately.
4
+ * Returns a promise that resolves when the server is listening.
5
+ */
6
+ export declare function startImageServer(host?: string, port?: number): Promise<void>;
7
+ /**
8
+ * Get the URL prefix for served chart images.
9
+ */
10
+ export declare function getImageUrlPrefix(): string;
11
+ /**
12
+ * Convert a local file path to a URL served by the image server.
13
+ */
14
+ export declare function filePathToUrl(filePath: string): string;
15
+ /**
16
+ * Check if the image server has been started.
17
+ */
18
+ export declare function isImageServerRunning(): boolean;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startImageServer = startImageServer;
7
+ exports.getImageUrlPrefix = getImageUrlPrefix;
8
+ exports.filePathToUrl = filePathToUrl;
9
+ exports.isImageServerRunning = isImageServerRunning;
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const express_1 = __importDefault(require("express"));
12
+ const local_render_1 = require("./local-render.js");
13
+ const logger_1 = require("./logger.js");
14
+ let imageServerStarted = false;
15
+ let imageServerPort = 18900;
16
+ let imageServerHost = "localhost";
17
+ /**
18
+ * Start a local HTTP server to serve rendered chart images.
19
+ * Only starts once; subsequent calls resolve immediately.
20
+ * Returns a promise that resolves when the server is listening.
21
+ */
22
+ function startImageServer(host = "localhost", port = 18900) {
23
+ if (imageServerStarted)
24
+ return Promise.resolve();
25
+ imageServerHost = host;
26
+ imageServerPort = port;
27
+ return new Promise((resolve, reject) => {
28
+ const app = (0, express_1.default)();
29
+ const dir = (0, local_render_1.getOutputDir)();
30
+ app.use("/charts", express_1.default.static(dir));
31
+ const server = app.listen(port, host);
32
+ server.on("listening", () => {
33
+ imageServerStarted = true;
34
+ logger_1.logger.info(`Image server listening on http://${host}:${port}/charts`);
35
+ resolve();
36
+ });
37
+ server.on("error", (err) => {
38
+ if (err.code === "EADDRINUSE") {
39
+ logger_1.logger.error(`Image server port ${port} is already in use. Set IMAGE_SERVER_PORT to a different port.`);
40
+ }
41
+ else {
42
+ logger_1.logger.error(`Image server failed to start: ${err.message}`, err);
43
+ }
44
+ reject(err);
45
+ });
46
+ });
47
+ }
48
+ /**
49
+ * Get the URL prefix for served chart images.
50
+ */
51
+ function getImageUrlPrefix() {
52
+ return `http://${imageServerHost}:${imageServerPort}/charts`;
53
+ }
54
+ /**
55
+ * Convert a local file path to a URL served by the image server.
56
+ */
57
+ function filePathToUrl(filePath) {
58
+ const filename = node_path_1.default.basename(filePath);
59
+ return `${getImageUrlPrefix()}/${filename}`;
60
+ }
61
+ /**
62
+ * Check if the image server has been started.
63
+ */
64
+ function isImageServerRunning() {
65
+ return imageServerStarted;
66
+ }
@@ -0,0 +1,3 @@
1
+ export { callTool } from "./callTool";
2
+ export { generateChartUrl } from "./generate";
3
+ export { zodToJsonSchema } from "./schema";
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.zodToJsonSchema = exports.generateChartUrl = exports.callTool = void 0;
4
+ var callTool_1 = require("./callTool.js");
5
+ Object.defineProperty(exports, "callTool", { enumerable: true, get: function () { return callTool_1.callTool; } });
6
+ var generate_1 = require("./generate.js");
7
+ Object.defineProperty(exports, "generateChartUrl", { enumerable: true, get: function () { return generate_1.generateChartUrl; } });
8
+ var schema_1 = require("./schema.js");
9
+ Object.defineProperty(exports, "zodToJsonSchema", { enumerable: true, get: function () { return schema_1.zodToJsonSchema; } });
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Get (and ensure exists) the output directory for chart images.
3
+ */
4
+ export declare function getOutputDir(): string;
5
+ /**
6
+ * Override the output directory (e.g. from env var).
7
+ */
8
+ export declare function setOutputDir(dir: string): void;
9
+ /**
10
+ * Render a G2 spec to a PNG file locally using @antv/g2-ssr.
11
+ * Returns the file path to the generated PNG image.
12
+ */
13
+ export declare function renderG2SpecToFile(spec: Record<string, any>, width?: number, height?: number): Promise<string>;
14
+ /**
15
+ * Render a G2 spec to a PNG buffer.
16
+ */
17
+ export declare function renderG2SpecToBuffer(spec: Record<string, any>, width?: number, height?: number): Promise<Buffer>;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.getOutputDir = getOutputDir;
49
+ exports.setOutputDir = setOutputDir;
50
+ exports.renderG2SpecToFile = renderG2SpecToFile;
51
+ exports.renderG2SpecToBuffer = renderG2SpecToBuffer;
52
+ const node_crypto_1 = __importDefault(require("node:crypto"));
53
+ const node_fs_1 = __importDefault(require("node:fs"));
54
+ const node_os_1 = __importDefault(require("node:os"));
55
+ const node_path_1 = __importDefault(require("node:path"));
56
+ const logger_1 = require("./logger.js");
57
+ let createChartFn = null;
58
+ function getCreateChart() {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ if (!createChartFn) {
61
+ const mod = yield Promise.resolve().then(() => __importStar(require("@antv/g2-ssr")));
62
+ createChartFn = mod.createChart;
63
+ }
64
+ return createChartFn;
65
+ });
66
+ }
67
+ /** Directory where rendered chart images are stored */
68
+ let outputDir = node_path_1.default.join(node_os_1.default.tmpdir(), "mcp-chart-images");
69
+ /**
70
+ * Get (and ensure exists) the output directory for chart images.
71
+ */
72
+ function getOutputDir() {
73
+ try {
74
+ if (!node_fs_1.default.existsSync(outputDir)) {
75
+ node_fs_1.default.mkdirSync(outputDir, { recursive: true });
76
+ }
77
+ }
78
+ catch (err) {
79
+ logger_1.logger.error(`Failed to create chart image directory: ${outputDir}`, err);
80
+ throw new Error(`Cannot create chart image directory '${outputDir}': ${err.message}`);
81
+ }
82
+ return outputDir;
83
+ }
84
+ /**
85
+ * Override the output directory (e.g. from env var).
86
+ */
87
+ function setOutputDir(dir) {
88
+ outputDir = dir;
89
+ }
90
+ /**
91
+ * Render a G2 spec to a PNG file locally using @antv/g2-ssr.
92
+ * Returns the file path to the generated PNG image.
93
+ */
94
+ function renderG2SpecToFile(spec_1) {
95
+ return __awaiter(this, arguments, void 0, function* (
96
+ // biome-ignore lint/suspicious/noExplicitAny: G2 spec is loosely typed
97
+ spec, width = 600, height = 400) {
98
+ const createChart = yield getCreateChart();
99
+ const chart = yield createChart(Object.assign({ width,
100
+ height, imageType: "png" }, spec));
101
+ const dir = getOutputDir();
102
+ const filename = `chart-${Date.now()}-${node_crypto_1.default.randomUUID().slice(0, 8)}.png`;
103
+ const filePath = node_path_1.default.join(dir, filename);
104
+ chart.exportToFile(filePath.replace(/\.png$/, ""));
105
+ logger_1.logger.info(`Chart rendered locally: ${filePath}`);
106
+ return filePath;
107
+ });
108
+ }
109
+ /**
110
+ * Render a G2 spec to a PNG buffer.
111
+ */
112
+ function renderG2SpecToBuffer(spec_1) {
113
+ return __awaiter(this, arguments, void 0, function* (
114
+ // biome-ignore lint/suspicious/noExplicitAny: G2 spec is loosely typed
115
+ spec, width = 600, height = 400) {
116
+ const createChart = yield getCreateChart();
117
+ const chart = yield createChart(Object.assign({ width,
118
+ height, imageType: "png" }, spec));
119
+ return chart.toBuffer();
120
+ });
121
+ }
@@ -0,0 +1,28 @@
1
+ declare function setIsStdio(isStdio: boolean): void;
2
+ /**
3
+ * Log info message
4
+ */
5
+ declare function info(message: string, ...args: unknown[]): void;
6
+ /**
7
+ * Log warning message
8
+ */
9
+ declare function warn(message: string, ...args: unknown[]): void;
10
+ /**
11
+ * Log error message
12
+ */
13
+ declare function error(message: string, error?: unknown): void;
14
+ /**
15
+ * Log success message
16
+ */
17
+ declare function success(message: string, ...args: unknown[]): void;
18
+ /**
19
+ * Logger object for backward compatibility
20
+ */
21
+ export declare const logger: {
22
+ info: typeof info;
23
+ warn: typeof warn;
24
+ error: typeof error;
25
+ success: typeof success;
26
+ setIsStdio: typeof setIsStdio;
27
+ };
28
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logger = void 0;
4
+ /**
5
+ * Unified logger for consistent logging across the application
6
+ */
7
+ const prefix = "[MCP-Server-Chart]";
8
+ /**
9
+ * Indicates if the logger is in stdio mode.
10
+ * When true, logs are directed to stderr for info, warn, and success messages, using console.error.
11
+ * When false, logs are directed to stdout.
12
+ */
13
+ let IS_STDIO = true;
14
+ function setIsStdio(isStdio) {
15
+ IS_STDIO = isStdio;
16
+ }
17
+ function getPrefix() {
18
+ const timestamp = new Date().toISOString();
19
+ return `${prefix} ${timestamp}`;
20
+ }
21
+ /**
22
+ * Log info message
23
+ */
24
+ function info(message, ...args) {
25
+ const fn = IS_STDIO ? console.error : console.log;
26
+ fn(`${getPrefix()} ℹ️ ${message}`, ...args);
27
+ }
28
+ /**
29
+ * Log warning message
30
+ */
31
+ function warn(message, ...args) {
32
+ const fn = IS_STDIO ? console.warn : console.log;
33
+ fn(`${getPrefix()} ⚠️ ${message}`, ...args);
34
+ }
35
+ /**
36
+ * Log error message
37
+ */
38
+ function error(message, error) {
39
+ console.error(`${getPrefix()} ❌ ${message}`, error || "");
40
+ }
41
+ /**
42
+ * Log success message
43
+ */
44
+ function success(message, ...args) {
45
+ const fn = IS_STDIO ? console.error : console.log;
46
+ fn(`${getPrefix()} ✅ ${message}`, ...args);
47
+ }
48
+ /**
49
+ * Logger object for backward compatibility
50
+ */
51
+ exports.logger = {
52
+ info,
53
+ warn,
54
+ error,
55
+ success,
56
+ setIsStdio,
57
+ };
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const zodToJsonSchema: (schema: Record<string, z.ZodType<any>>) => z.core.ZodStandardJSONSchemaPayload<z.ZodObject<{
3
+ [x: string]: z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>;
4
+ }, z.core.$strip>>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.zodToJsonSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation>
6
+ const zodToJsonSchema = (schema) => {
7
+ return zod_1.z.object(schema).toJSONSchema({
8
+ io: "input",
9
+ target: "draft-07",
10
+ });
11
+ };
12
+ exports.zodToJsonSchema = zodToJsonSchema;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Translates MCP server chart input arguments into @antv/g2 spec format.
3
+ * Each chart type's custom schema is mapped to a G2 declarative spec
4
+ * that can be rendered by @antv/g2-ssr.
5
+ */
6
+ type Args = Record<string, any>;
7
+ /**
8
+ * Translate an MCP chart type + args into a G2 spec.
9
+ * Returns null for unknown chart types.
10
+ */
11
+ export declare function translateToG2Spec(chartType: string, args: Args): object | null;
12
+ export {};