@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,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wordCloud = void 0;
4
+ const zod_1 = require("zod");
5
+ const utils_1 = require("../utils/index.js");
6
+ const base_1 = require("./base.js");
7
+ // Word cloud data schema
8
+ const data = zod_1.z.object({
9
+ text: zod_1.z.string(),
10
+ value: zod_1.z.number(),
11
+ });
12
+ // Word cloud input schema
13
+ const schema = {
14
+ data: zod_1.z
15
+ .array(data)
16
+ .describe("Data for word cloud chart, it should be an array of objects, each object contains a `text` field and a `value` field, such as, [{ value: 4.272, text: '形成' }].")
17
+ .nonempty({ message: "Word cloud chart data cannot be empty." }),
18
+ style: zod_1.z
19
+ .object({
20
+ backgroundColor: base_1.BackgroundColorSchema,
21
+ palette: base_1.PaletteSchema,
22
+ texture: base_1.TextureSchema,
23
+ })
24
+ .optional()
25
+ .describe("Style configuration for the chart with a JSON object, optional."),
26
+ theme: base_1.ThemeSchema,
27
+ width: base_1.WidthSchema,
28
+ height: base_1.HeightSchema,
29
+ title: base_1.TitleSchema,
30
+ };
31
+ // Word cloud tool descriptor
32
+ const tool = {
33
+ name: "generate_word_cloud_chart",
34
+ description: "Generate a word cloud chart to show word frequency or weight through text size variation, such as, analyzing common words in social media, reviews, or feedback.",
35
+ inputSchema: (0, utils_1.zodToJsonSchema)(schema),
36
+ annotations: {
37
+ title: "Generate Word Cloud Chart",
38
+ readOnlyHint: true,
39
+ },
40
+ };
41
+ exports.wordCloud = {
42
+ schema,
43
+ tool,
44
+ };
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/build/index.js ADDED
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const node_util_1 = require("node:util");
5
+ const server_1 = require("./server.js");
6
+ const logger_1 = require("./utils/logger.js");
7
+ // Parse command line arguments
8
+ const { values } = (0, node_util_1.parseArgs)({
9
+ options: {
10
+ transport: {
11
+ type: "string",
12
+ short: "t",
13
+ default: "stdio",
14
+ },
15
+ host: {
16
+ type: "string",
17
+ short: "h",
18
+ default: "localhost",
19
+ },
20
+ port: {
21
+ type: "string",
22
+ short: "p",
23
+ default: "1122",
24
+ },
25
+ endpoint: {
26
+ type: "string",
27
+ short: "e",
28
+ default: "", // We'll handle defaults per transport type
29
+ },
30
+ help: {
31
+ type: "boolean",
32
+ short: "H",
33
+ },
34
+ },
35
+ });
36
+ // Display help information if requested
37
+ if (values.help) {
38
+ console.log(`
39
+ MCP Server Chart CLI
40
+
41
+ Options:
42
+ --transport, -t Specify the transport protocol: "stdio", "sse", or "streamable" (default: "stdio")
43
+ --host, -h Specify the host for SSE or streamable transport (default: localhost)
44
+ --port, -p Specify the port for SSE or streamable transport (default: 1122)
45
+ --endpoint, -e Specify the endpoint for the transport:
46
+ - For SSE: default is "/sse"
47
+ - For streamable: default is "/mcp"
48
+ --help, -H Show this help message
49
+ `);
50
+ process.exit(0);
51
+ }
52
+ // Run in the specified transport mode
53
+ const transport = values.transport.toLowerCase();
54
+ if (transport === "sse") {
55
+ logger_1.logger.setIsStdio(false);
56
+ const port = Number.parseInt(values.port, 10);
57
+ // Use provided endpoint or default to "/sse" for SSE
58
+ const endpoint = values.endpoint || "/sse";
59
+ const host = values.host || "localhost";
60
+ (0, server_1.runSSEServer)(host, port, endpoint).catch(console.error);
61
+ }
62
+ else if (transport === "streamable") {
63
+ logger_1.logger.setIsStdio(false);
64
+ const port = Number.parseInt(values.port, 10);
65
+ // Use provided endpoint or default to "/mcp" for streamable
66
+ const endpoint = values.endpoint || "/mcp";
67
+ const host = values.host || "localhost";
68
+ (0, server_1.runHTTPStreamableServer)(host, port, endpoint).catch(console.error);
69
+ }
70
+ else {
71
+ logger_1.logger.setIsStdio(true);
72
+ (0, server_1.runStdioServer)().catch(console.error);
73
+ }
package/build/sdk.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Exports the API for the `@standby/mcp-server-chart` package.
3
+ * This includes chart generation capabilities and utility functions.
4
+ */
5
+ export * from "./charts";
6
+ export { callTool } from "./utils";
package/build/sdk.js ADDED
@@ -0,0 +1,24 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.callTool = void 0;
18
+ /**
19
+ * Exports the API for the `@standby/mcp-server-chart` package.
20
+ * This includes chart generation capabilities and utility functions.
21
+ */
22
+ __exportStar(require("./charts/index.js"), exports);
23
+ var utils_1 = require("./utils/index.js");
24
+ Object.defineProperty(exports, "callTool", { enumerable: true, get: function () { return utils_1.callTool; } });
@@ -0,0 +1,17 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ /**
3
+ * Creates and configures an MCP server for chart generation.
4
+ */
5
+ export declare function createServer(): Server;
6
+ /**
7
+ * Runs the server with stdio transport.
8
+ */
9
+ export declare function runStdioServer(): Promise<void>;
10
+ /**
11
+ * Runs the server with SSE transport.
12
+ */
13
+ export declare function runSSEServer(host?: string, port?: number, endpoint?: string): Promise<void>;
14
+ /**
15
+ * Runs the server with HTTP streamable transport.
16
+ */
17
+ export declare function runHTTPStreamableServer(host?: string, port?: number, endpoint?: string): Promise<void>;
@@ -0,0 +1,151 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.createServer = createServer;
46
+ exports.runStdioServer = runStdioServer;
47
+ exports.runSSEServer = runSSEServer;
48
+ exports.runHTTPStreamableServer = runHTTPStreamableServer;
49
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
50
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
51
+ const Charts = __importStar(require("./charts/index.js"));
52
+ const services_1 = require("./services/index.js");
53
+ const callTool_1 = require("./utils/callTool.js");
54
+ const env_1 = require("./utils/env.js");
55
+ const image_server_1 = require("./utils/image-server.js");
56
+ const local_render_1 = require("./utils/local-render.js");
57
+ const logger_1 = require("./utils/logger.js");
58
+ /**
59
+ * Initialize local rendering.
60
+ * Starts the image server and waits for it to be ready.
61
+ */
62
+ function initLocalRendering() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const customDir = (0, env_1.getChartImageDir)();
65
+ if (customDir) {
66
+ (0, local_render_1.setOutputDir)(customDir);
67
+ }
68
+ const port = (0, env_1.getImageServerPort)();
69
+ yield (0, image_server_1.startImageServer)("localhost", port);
70
+ logger_1.logger.info(`Local rendering mode enabled (image server port: ${port})`);
71
+ });
72
+ }
73
+ /**
74
+ * Creates and configures an MCP server for chart generation.
75
+ */
76
+ function createServer() {
77
+ const server = new index_js_1.Server({
78
+ name: "mcp-server-chart",
79
+ version: "0.8.x",
80
+ }, {
81
+ capabilities: {
82
+ tools: {},
83
+ },
84
+ });
85
+ setupToolHandlers(server);
86
+ server.onerror = (e) => {
87
+ logger_1.logger.error("Server encountered an error, shutting down", e);
88
+ };
89
+ process.on("SIGINT", () => __awaiter(this, void 0, void 0, function* () {
90
+ logger_1.logger.info("SIGINT received, shutting down server...");
91
+ yield server.close();
92
+ process.exit(0);
93
+ }));
94
+ return server;
95
+ }
96
+ /**
97
+ * Gets enabled tools based on environment variables.
98
+ */
99
+ function getEnabledTools() {
100
+ const disabledTools = (0, env_1.getDisabledTools)();
101
+ const allCharts = Object.values(Charts);
102
+ if (disabledTools.length === 0) {
103
+ return allCharts;
104
+ }
105
+ return allCharts.filter((chart) => !disabledTools.includes(chart.tool.name));
106
+ }
107
+ /**
108
+ * Sets up tool handlers for the MCP server.
109
+ */
110
+ function setupToolHandlers(server) {
111
+ logger_1.logger.info("setting up tool handlers...");
112
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, () => __awaiter(this, void 0, void 0, function* () {
113
+ return ({
114
+ tools: getEnabledTools().map((chart) => chart.tool),
115
+ });
116
+ }));
117
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation>
118
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, (request) => __awaiter(this, void 0, void 0, function* () {
119
+ logger_1.logger.info("calling tool", request.params.name, request.params.arguments);
120
+ return yield (0, callTool_1.callTool)(request.params.name, request.params.arguments);
121
+ }));
122
+ logger_1.logger.info("tool handlers set up");
123
+ }
124
+ /**
125
+ * Runs the server with stdio transport.
126
+ */
127
+ function runStdioServer() {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ yield initLocalRendering();
130
+ const server = createServer();
131
+ yield (0, services_1.startStdioMcpServer)(server);
132
+ });
133
+ }
134
+ /**
135
+ * Runs the server with SSE transport.
136
+ */
137
+ function runSSEServer() {
138
+ return __awaiter(this, arguments, void 0, function* (host = "localhost", port = 1122, endpoint = "/sse") {
139
+ yield initLocalRendering();
140
+ yield (0, services_1.startSSEMcpServer)(createServer, endpoint, port, host);
141
+ });
142
+ }
143
+ /**
144
+ * Runs the server with HTTP streamable transport.
145
+ */
146
+ function runHTTPStreamableServer() {
147
+ return __awaiter(this, arguments, void 0, function* (host = "localhost", port = 1122, endpoint = "/mcp") {
148
+ yield initLocalRendering();
149
+ yield (0, services_1.startHTTPStreamableServer)(createServer, endpoint, port, host);
150
+ });
151
+ }
@@ -0,0 +1,3 @@
1
+ export { startStdioMcpServer } from "./stdio";
2
+ export { startSSEMcpServer } from "./sse";
3
+ export { startHTTPStreamableServer } from "./streamable";
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startHTTPStreamableServer = exports.startSSEMcpServer = exports.startStdioMcpServer = void 0;
4
+ var stdio_1 = require("./stdio.js");
5
+ Object.defineProperty(exports, "startStdioMcpServer", { enumerable: true, get: function () { return stdio_1.startStdioMcpServer; } });
6
+ var sse_1 = require("./sse.js");
7
+ Object.defineProperty(exports, "startSSEMcpServer", { enumerable: true, get: function () { return sse_1.startSSEMcpServer; } });
8
+ var streamable_1 = require("./streamable.js");
9
+ Object.defineProperty(exports, "startHTTPStreamableServer", { enumerable: true, get: function () { return streamable_1.startHTTPStreamableServer; } });
@@ -0,0 +1,2 @@
1
+ import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export declare const startSSEMcpServer: (createServer: () => Server, endpoint?: string, port?: number, host?: string) => Promise<void>;
@@ -0,0 +1,59 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.startSSEMcpServer = void 0;
16
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
17
+ const express_1 = __importDefault(require("express"));
18
+ const logger_1 = require("../utils/logger.js");
19
+ const startSSEMcpServer = (createServer_1, ...args_1) => __awaiter(void 0, [createServer_1, ...args_1], void 0, function* (createServer, endpoint = "/sse", port = 1122, host = "localhost") {
20
+ const app = (0, express_1.default)();
21
+ app.use(express_1.default.json());
22
+ const connections = {};
23
+ app.get(endpoint, (req, res) => __awaiter(void 0, void 0, void 0, function* () {
24
+ const server = createServer();
25
+ const transport = new sse_js_1.SSEServerTransport("/messages", res);
26
+ connections[transport.sessionId] = transport;
27
+ transport.onclose = () => {
28
+ delete connections[transport.sessionId];
29
+ logger_1.logger.info(`SSE Server disconnected: sessionId=${transport.sessionId}`);
30
+ };
31
+ yield server.connect(transport);
32
+ logger_1.logger.info(`SSE Server connected: sessionId=${transport.sessionId}`);
33
+ }));
34
+ app.post("/messages", (req, res) => __awaiter(void 0, void 0, void 0, function* () {
35
+ const sessionId = req.query.sessionId;
36
+ if (!sessionId) {
37
+ logger_1.logger.warn("SSE Server sessionId parameter is missing");
38
+ return res.status(400).send("Missing sessionId parameter");
39
+ }
40
+ const transport = connections[sessionId];
41
+ if (!transport) {
42
+ logger_1.logger.warn(`SSE Server session not found: sessionId=${sessionId}`);
43
+ return res.status(404).send("Session not found");
44
+ }
45
+ try {
46
+ logger_1.logger.info(`SSE Server handling message: sessionId=${sessionId}`);
47
+ yield transport.handlePostMessage(req, res, req.body);
48
+ }
49
+ catch (e) {
50
+ logger_1.logger.error("SSE Server error handling message", e);
51
+ if (!res.headersSent)
52
+ res.status(500).send("Error handling request");
53
+ }
54
+ }));
55
+ app.listen(port, host, () => {
56
+ logger_1.logger.success(`SSE Server listening on http://${host}:${port}${endpoint}`);
57
+ });
58
+ });
59
+ exports.startSSEMcpServer = startSSEMcpServer;
@@ -0,0 +1,2 @@
1
+ import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export declare function startStdioMcpServer(server: Server): Promise<void>;
@@ -0,0 +1,21 @@
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.startStdioMcpServer = startStdioMcpServer;
13
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
14
+ const logger_1 = require("../utils/logger.js");
15
+ function startStdioMcpServer(server) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const transport = new stdio_js_1.StdioServerTransport();
18
+ yield server.connect(transport);
19
+ logger_1.logger.success("Stdio MCP Server started");
20
+ });
21
+ }
@@ -0,0 +1,2 @@
1
+ import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export declare const startHTTPStreamableServer: (createServer: () => Server, endpoint?: string, port?: number, host?: string) => Promise<void>;
@@ -0,0 +1,58 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.startHTTPStreamableServer = void 0;
16
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
17
+ const cors_1 = __importDefault(require("cors"));
18
+ const express_1 = __importDefault(require("express"));
19
+ const logger_1 = require("../utils/logger.js");
20
+ const startHTTPStreamableServer = (createServer_1, ...args_1) => __awaiter(void 0, [createServer_1, ...args_1], void 0, function* (createServer, endpoint = "/mcp", port = 1122, host = "localhost") {
21
+ const app = (0, express_1.default)();
22
+ app.use(express_1.default.json());
23
+ app.use((0, cors_1.default)({ origin: "*", exposedHeaders: ["Mcp-Session-Id"] }));
24
+ app.post(endpoint, (req, res) => __awaiter(void 0, void 0, void 0, function* () {
25
+ // In stateless mode, create a new transport for each request to prevent
26
+ // request ID collisions. Different clients may use the same JSON-RPC request IDs,
27
+ // which would cause responses to be routed to the wrong HTTP connections if
28
+ // the transport state is shared.
29
+ try {
30
+ const server = createServer();
31
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
32
+ sessionIdGenerator: undefined,
33
+ enableJsonResponse: true,
34
+ });
35
+ res.on("close", () => {
36
+ transport.close();
37
+ logger_1.logger.info("HTTP Streamable Server response closed");
38
+ });
39
+ yield server.connect(transport);
40
+ yield transport.handleRequest(req, res, req.body);
41
+ logger_1.logger.info("HTTP Streamable Server response connected");
42
+ }
43
+ catch (e) {
44
+ logger_1.logger.error("HTTP Streamable Server response error", e);
45
+ if (!res.headersSent) {
46
+ res.status(500).json({
47
+ jsonrpc: "2.0",
48
+ error: { code: -32603, message: "Internal server error" },
49
+ id: null,
50
+ });
51
+ }
52
+ }
53
+ }));
54
+ app.listen(port, host, () => {
55
+ logger_1.logger.success(`Streamable HTTP Server listening on http://${host}:${port}${endpoint}`);
56
+ });
57
+ });
58
+ exports.startHTTPStreamableServer = startHTTPStreamableServer;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Call a tool to generate a chart based on the provided name and arguments.
3
+ * @param tool The name of the tool to call, e.g., "generate_area_chart".
4
+ * @param args The arguments for the tool, which should match the expected schema for the chart type.
5
+ * @returns
6
+ */
7
+ export declare function callTool(tool: string, args?: object): Promise<{
8
+ content: {
9
+ type: string;
10
+ text: string;
11
+ }[];
12
+ _meta: {
13
+ description: string;
14
+ spec: {
15
+ type: "line" | "area" | "sankey" | "treemap" | "bar" | "column" | "scatter" | "pie" | "funnel" | "radar" | "histogram" | "boxplot" | "violin" | "waterfall" | "liquid" | "word-cloud" | "venn" | "dual-axes" | "network-graph" | "mind-map" | "organization-chart" | "flow-diagram" | "fishbone-diagram";
16
+ };
17
+ };
18
+ }>;
@@ -0,0 +1,129 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.callTool = callTool;
46
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
47
+ const zod_1 = require("zod");
48
+ const Charts = __importStar(require("../charts/index.js"));
49
+ const generate_1 = require("./generate.js");
50
+ const logger_1 = require("./logger.js");
51
+ const validator_1 = require("./validator.js");
52
+ // Chart type mapping
53
+ const CHART_TYPE_MAP = {
54
+ generate_area_chart: "area",
55
+ generate_bar_chart: "bar",
56
+ generate_boxplot_chart: "boxplot",
57
+ generate_column_chart: "column",
58
+ generate_dual_axes_chart: "dual-axes",
59
+ generate_fishbone_diagram: "fishbone-diagram",
60
+ generate_flow_diagram: "flow-diagram",
61
+ generate_funnel_chart: "funnel",
62
+ generate_histogram_chart: "histogram",
63
+ generate_line_chart: "line",
64
+ generate_liquid_chart: "liquid",
65
+ generate_mind_map: "mind-map",
66
+ generate_network_graph: "network-graph",
67
+ generate_organization_chart: "organization-chart",
68
+ generate_pie_chart: "pie",
69
+ generate_radar_chart: "radar",
70
+ generate_sankey_chart: "sankey",
71
+ generate_scatter_chart: "scatter",
72
+ generate_treemap_chart: "treemap",
73
+ generate_venn_chart: "venn",
74
+ generate_violin_chart: "violin",
75
+ generate_waterfall_chart: "waterfall",
76
+ generate_word_cloud_chart: "word-cloud",
77
+ };
78
+ /**
79
+ * Call a tool to generate a chart based on the provided name and arguments.
80
+ * @param tool The name of the tool to call, e.g., "generate_area_chart".
81
+ * @param args The arguments for the tool, which should match the expected schema for the chart type.
82
+ * @returns
83
+ */
84
+ function callTool(tool_1) {
85
+ return __awaiter(this, arguments, void 0, function* (tool, args = {}) {
86
+ logger_1.logger.info(`Calling tool: ${tool}`);
87
+ const chartType = CHART_TYPE_MAP[tool];
88
+ if (!chartType) {
89
+ logger_1.logger.error(`Unknown tool: ${tool}`);
90
+ throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${tool}.`);
91
+ }
92
+ try {
93
+ // Validate input using Zod before sending to API.
94
+ // Select the appropriate schema based on the chart type.
95
+ const schema = Charts[chartType].schema;
96
+ if (schema) {
97
+ // Use safeParse instead of parse and try-catch.
98
+ const result = zod_1.z.object(schema).safeParse(args);
99
+ if (!result.success) {
100
+ logger_1.logger.error(`Invalid parameters: ${result.error.message}`);
101
+ throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Invalid parameters: ${result.error.message}`);
102
+ }
103
+ }
104
+ const url = yield (0, generate_1.generateChartUrl)(chartType, args);
105
+ logger_1.logger.info(`Generated chart URL: ${url}`);
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: url,
111
+ },
112
+ ],
113
+ _meta: {
114
+ description: "This is the chart's spec and configuration, which can be renderred to corresponding chart by AntV GPT-Vis chart components.",
115
+ spec: Object.assign({ type: chartType }, args),
116
+ },
117
+ };
118
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation>
119
+ }
120
+ catch (error) {
121
+ logger_1.logger.error(`Failed to generate chart: ${error.message || "Unknown error"}.`);
122
+ if (error instanceof types_js_1.McpError)
123
+ throw error;
124
+ if (error instanceof validator_1.ValidateError)
125
+ throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, error.message);
126
+ throw new types_js_1.McpError(types_js_1.ErrorCode.InternalError, `Failed to generate chart: ${(error === null || error === void 0 ? void 0 : error.message) || "Unknown error."}`);
127
+ }
128
+ });
129
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Get the list of disabled tools from environment variables.
3
+ */
4
+ export declare function getDisabledTools(): string[];
5
+ /**
6
+ * Get the custom output directory for chart images, if set.
7
+ */
8
+ export declare function getChartImageDir(): string | undefined;
9
+ /**
10
+ * Get the port for the local image server.
11
+ */
12
+ export declare function getImageServerPort(): number;