@umengfe/mcp-server-chart 0.0.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/LICENSE +21 -0
- package/README.md +273 -0
- package/build/charts/area.d.ts +51 -0
- package/build/charts/area.js +52 -0
- package/build/charts/bar.d.ts +49 -0
- package/build/charts/bar.js +53 -0
- package/build/charts/base.d.ts +34 -0
- package/build/charts/base.js +74 -0
- package/build/charts/boxplot.d.ts +47 -0
- package/build/charts/boxplot.js +45 -0
- package/build/charts/column.d.ts +49 -0
- package/build/charts/column.js +53 -0
- package/build/charts/district-map.d.ts +93 -0
- package/build/charts/district-map.js +85 -0
- package/build/charts/dual-axes.d.ts +47 -0
- package/build/charts/dual-axes.js +54 -0
- package/build/charts/fishbone-diagram.d.ts +28 -0
- package/build/charts/fishbone-diagram.js +55 -0
- package/build/charts/flow-diagram.d.ts +91 -0
- package/build/charts/flow-diagram.js +41 -0
- package/build/charts/funnel.d.ts +42 -0
- package/build/charts/funnel.js +37 -0
- package/build/charts/histogram.d.ts +36 -0
- package/build/charts/histogram.js +41 -0
- package/build/charts/index.d.ts +28 -0
- package/build/charts/index.js +56 -0
- package/build/charts/line.d.ts +50 -0
- package/build/charts/line.js +47 -0
- package/build/charts/liquid.d.ts +34 -0
- package/build/charts/liquid.js +42 -0
- package/build/charts/mind-map.d.ts +26 -0
- package/build/charts/mind-map.js +39 -0
- package/build/charts/network-graph.d.ts +91 -0
- package/build/charts/network-graph.js +41 -0
- package/build/charts/organization-chart.d.ts +114 -0
- package/build/charts/organization-chart.js +56 -0
- package/build/charts/path-map.d.ts +25 -0
- package/build/charts/path-map.js +25 -0
- package/build/charts/pie.d.ts +43 -0
- package/build/charts/pie.js +44 -0
- package/build/charts/pin-map.d.ts +35 -0
- package/build/charts/pin-map.js +34 -0
- package/build/charts/radar.d.ts +48 -0
- package/build/charts/radar.js +45 -0
- package/build/charts/sankey.d.ts +46 -0
- package/build/charts/sankey.js +43 -0
- package/build/charts/scatter.d.ts +47 -0
- package/build/charts/scatter.js +43 -0
- package/build/charts/treemap.d.ts +86 -0
- package/build/charts/treemap.js +55 -0
- package/build/charts/venn.d.ts +45 -0
- package/build/charts/venn.js +45 -0
- package/build/charts/violin.d.ts +47 -0
- package/build/charts/violin.js +45 -0
- package/build/charts/word-cloud.d.ts +42 -0
- package/build/charts/word-cloud.js +40 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +73 -0
- package/build/sdk.d.ts +6 -0
- package/build/sdk.js +24 -0
- package/build/server.d.ts +17 -0
- package/build/server.js +132 -0
- package/build/services/index.d.ts +3 -0
- package/build/services/index.js +9 -0
- package/build/services/sse.d.ts +2 -0
- package/build/services/sse.js +58 -0
- package/build/services/stdio.d.ts +2 -0
- package/build/services/stdio.js +21 -0
- package/build/services/streamable.d.ts +2 -0
- package/build/services/streamable.js +58 -0
- package/build/utils/callTool.d.ts +18 -0
- package/build/utils/callTool.js +130 -0
- package/build/utils/env.d.ts +12 -0
- package/build/utils/env.js +32 -0
- package/build/utils/generate.d.ts +25 -0
- package/build/utils/generate.js +68 -0
- package/build/utils/index.d.ts +3 -0
- package/build/utils/index.js +9 -0
- package/build/utils/logger.d.ts +28 -0
- package/build/utils/logger.js +57 -0
- package/build/utils/schema.d.ts +7 -0
- package/build/utils/schema.js +14 -0
- package/build/utils/validator.d.ts +34 -0
- package/build/utils/validator.js +76 -0
- package/package.json +65 -0
|
@@ -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,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.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 = (server_1, ...args_1) => __awaiter(void 0, [server_1, ...args_1], void 0, function* (server, endpoint = "/sse", port = 1122, host = "localhost") {
|
|
20
|
+
const app = (0, express_1.default)();
|
|
21
|
+
app.use(express_1.default.json());
|
|
22
|
+
const transports = {};
|
|
23
|
+
app.get(endpoint, (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
const transport = new sse_js_1.SSEServerTransport("/messages", res);
|
|
25
|
+
transports[transport.sessionId] = transport;
|
|
26
|
+
transport.onclose = () => {
|
|
27
|
+
delete transports[transport.sessionId];
|
|
28
|
+
logger_1.logger.info(`SSE Server disconnected: sessionId=${transport.sessionId}`);
|
|
29
|
+
};
|
|
30
|
+
yield server.connect(transport);
|
|
31
|
+
logger_1.logger.info(`SSE Server connected: sessionId=${transport.sessionId}`);
|
|
32
|
+
}));
|
|
33
|
+
app.post("/messages", (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
const sessionId = req.query.sessionId;
|
|
35
|
+
if (!sessionId) {
|
|
36
|
+
logger_1.logger.warn("SSE Server sessionId parameter is missing");
|
|
37
|
+
return res.status(400).send("Missing sessionId parameter");
|
|
38
|
+
}
|
|
39
|
+
const transport = transports[sessionId];
|
|
40
|
+
if (!transport) {
|
|
41
|
+
logger_1.logger.warn(`SSE Server session not found: sessionId=${sessionId}`);
|
|
42
|
+
return res.status(404).send("Session not found");
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
logger_1.logger.info(`SSE Server handling message: sessionId=${sessionId}`);
|
|
46
|
+
yield transport.handlePostMessage(req, res, req.body);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
logger_1.logger.error("SSE Server error handling message", e);
|
|
50
|
+
if (!res.headersSent)
|
|
51
|
+
res.status(500).send("Error handling request");
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
app.listen(port, host, () => {
|
|
55
|
+
logger_1.logger.success(`SSE Server listening on http://${host}:${port}${endpoint}`);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
exports.startSSEMcpServer = startSSEMcpServer;
|
|
@@ -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,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: "area" | "bar" | "boxplot" | "column" | "district-map" | "dual-axes" | "fishbone-diagram" | "flow-diagram" | "funnel" | "histogram" | "line" | "liquid" | "mind-map" | "network-graph" | "organization-chart" | "path-map" | "pie" | "pin-map" | "radar" | "sankey" | "scatter" | "treemap" | "venn" | "violin" | "word-cloud";
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,130 @@
|
|
|
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 logger_1 = require("./logger.js");
|
|
50
|
+
const validator_1 = require("./validator.js");
|
|
51
|
+
// Chart type mapping
|
|
52
|
+
const CHART_TYPE_MAP = {
|
|
53
|
+
generate_area_chart: "area",
|
|
54
|
+
generate_bar_chart: "bar",
|
|
55
|
+
generate_boxplot_chart: "boxplot",
|
|
56
|
+
generate_column_chart: "column",
|
|
57
|
+
generate_district_map: "district-map",
|
|
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_path_map: "path-map",
|
|
69
|
+
generate_pie_chart: "pie",
|
|
70
|
+
generate_pin_map: "pin-map",
|
|
71
|
+
generate_radar_chart: "radar",
|
|
72
|
+
generate_sankey_chart: "sankey",
|
|
73
|
+
generate_scatter_chart: "scatter",
|
|
74
|
+
generate_treemap_chart: "treemap",
|
|
75
|
+
generate_venn_chart: "venn",
|
|
76
|
+
generate_violin_chart: "violin",
|
|
77
|
+
generate_word_cloud_chart: "word-cloud",
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Call a tool to generate a chart based on the provided name and arguments.
|
|
81
|
+
* @param tool The name of the tool to call, e.g., "generate_area_chart".
|
|
82
|
+
* @param args The arguments for the tool, which should match the expected schema for the chart type.
|
|
83
|
+
* @returns
|
|
84
|
+
*/
|
|
85
|
+
function callTool(tool_1) {
|
|
86
|
+
return __awaiter(this, arguments, void 0, function* (tool, args = {}) {
|
|
87
|
+
logger_1.logger.info(`Calling tool: ${tool}`);
|
|
88
|
+
const chartType = CHART_TYPE_MAP[tool];
|
|
89
|
+
if (!chartType) {
|
|
90
|
+
logger_1.logger.error(`Unknown tool: ${tool}`);
|
|
91
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${tool}.`);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// Validate input using Zod before sending to API.
|
|
95
|
+
// Select the appropriate schema based on the chart type.
|
|
96
|
+
const schema = Charts[chartType].schema;
|
|
97
|
+
if (schema) {
|
|
98
|
+
// Use safeParse instead of parse and try-catch.
|
|
99
|
+
const result = zod_1.z.object(schema).safeParse(args);
|
|
100
|
+
if (!result.success) {
|
|
101
|
+
logger_1.logger.error(`Invalid parameters: ${result.error.message}`);
|
|
102
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Invalid parameters: ${result.error.message}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
content: [
|
|
107
|
+
{
|
|
108
|
+
type: "text",
|
|
109
|
+
text: `\`\`\`vis-chart
|
|
110
|
+
${JSON.stringify(Object.assign({ type: chartType }, args))}
|
|
111
|
+
\`\`\``,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
_meta: {
|
|
115
|
+
description: "This is the chart's spec and configuration, which can be renderred to corresponding chart by AntV GPT-Vis chart components.",
|
|
116
|
+
spec: Object.assign({ type: chartType }, args),
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
logger_1.logger.error(`Failed to generate chart: ${error.message || "Unknown error"}.`);
|
|
123
|
+
if (error instanceof types_js_1.McpError)
|
|
124
|
+
throw error;
|
|
125
|
+
if (error instanceof validator_1.ValidateError)
|
|
126
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, error.message);
|
|
127
|
+
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."}`);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the VIS_REQUEST_SERVER from environment variables.
|
|
3
|
+
*/
|
|
4
|
+
export declare function getVisRequestServer(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Get the `SERVICE_ID` from environment variables.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getServiceIdentifier(): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Get the list of disabled tools from environment variables.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDisabledTools(): string[];
|
|
@@ -0,0 +1,32 @@
|
|
|
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.getVisRequestServer = getVisRequestServer;
|
|
7
|
+
exports.getServiceIdentifier = getServiceIdentifier;
|
|
8
|
+
exports.getDisabledTools = getDisabledTools;
|
|
9
|
+
const node_process_1 = __importDefault(require("node:process"));
|
|
10
|
+
/**
|
|
11
|
+
* Get the VIS_REQUEST_SERVER from environment variables.
|
|
12
|
+
*/
|
|
13
|
+
function getVisRequestServer() {
|
|
14
|
+
return (node_process_1.default.env.VIS_REQUEST_SERVER ||
|
|
15
|
+
"https://antv-studio.alipay.com/api/gpt-vis");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the `SERVICE_ID` from environment variables.
|
|
19
|
+
*/
|
|
20
|
+
function getServiceIdentifier() {
|
|
21
|
+
return node_process_1.default.env.SERVICE_ID;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the list of disabled tools from environment variables.
|
|
25
|
+
*/
|
|
26
|
+
function getDisabledTools() {
|
|
27
|
+
const disabledTools = node_process_1.default.env.DISABLED_TOOLS;
|
|
28
|
+
if (!disabledTools || disabledTools === "undefined") {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
return disabledTools.split(",");
|
|
32
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Generate a chart URL using the provided configuration.
|
|
4
|
+
* @param type The type of chart to generate
|
|
5
|
+
* @param options Chart options
|
|
6
|
+
* @returns {Promise<string>} The generated chart URL.
|
|
7
|
+
* @throws {Error} If the chart generation fails.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateChartUrl(type: string, options: Record<string, any>): Promise<object>;
|
|
10
|
+
type ResponseResult = {
|
|
11
|
+
metadata: unknown;
|
|
12
|
+
/**
|
|
13
|
+
* @docs https://modelcontextprotocol.io/specification/2025-03-26/server/tools#tool-result
|
|
14
|
+
*/
|
|
15
|
+
content: CallToolResult["content"];
|
|
16
|
+
isError?: CallToolResult["isError"];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Generate a map
|
|
20
|
+
* @param tool - The tool name
|
|
21
|
+
* @param input - The input
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateMap(tool: string, input: unknown): Promise<ResponseResult>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
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.generateChartUrl = generateChartUrl;
|
|
16
|
+
exports.generateMap = generateMap;
|
|
17
|
+
const axios_1 = __importDefault(require("axios"));
|
|
18
|
+
const env_1 = require("./env.js");
|
|
19
|
+
/**
|
|
20
|
+
* Generate a chart URL using the provided configuration.
|
|
21
|
+
* @param type The type of chart to generate
|
|
22
|
+
* @param options Chart options
|
|
23
|
+
* @returns {Promise<string>} The generated chart URL.
|
|
24
|
+
* @throws {Error} If the chart generation fails.
|
|
25
|
+
*/
|
|
26
|
+
function generateChartUrl(type,
|
|
27
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
28
|
+
options) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
const url = (0, env_1.getVisRequestServer)();
|
|
31
|
+
const response = yield axios_1.default.post(url, Object.assign(Object.assign({ type }, options), { source: "mcp-server-chart" }), {
|
|
32
|
+
headers: {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const { success, errorMessage, resultObj } = response.data;
|
|
37
|
+
if (!success) {
|
|
38
|
+
throw new Error(errorMessage);
|
|
39
|
+
}
|
|
40
|
+
return resultObj;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate a map
|
|
45
|
+
* @param tool - The tool name
|
|
46
|
+
* @param input - The input
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
function generateMap(tool, input) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const url = (0, env_1.getVisRequestServer)();
|
|
52
|
+
const response = yield axios_1.default.post(url, {
|
|
53
|
+
serviceId: (0, env_1.getServiceIdentifier)(),
|
|
54
|
+
tool,
|
|
55
|
+
input,
|
|
56
|
+
source: "mcp-server-chart",
|
|
57
|
+
}, {
|
|
58
|
+
headers: {
|
|
59
|
+
"Content-Type": "application/json",
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const { success, errorMessage, resultObj } = response.data;
|
|
63
|
+
if (!success) {
|
|
64
|
+
throw new Error(errorMessage);
|
|
65
|
+
}
|
|
66
|
+
return resultObj;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -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,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,7 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const zodToJsonSchema: (schema: Record<string, z.ZodType<any>>) => import("zod-to-json-schema").JsonSchema7Type & {
|
|
3
|
+
$schema?: string | undefined;
|
|
4
|
+
definitions?: {
|
|
5
|
+
[key: string]: import("zod-to-json-schema").JsonSchema7Type;
|
|
6
|
+
} | undefined;
|
|
7
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.zodToJsonSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const zod_to_json_schema_1 = require("zod-to-json-schema");
|
|
6
|
+
// TODO: use zod v4 JSON to schema to replace zod-to-json-schema when v4 is stable
|
|
7
|
+
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
8
|
+
const zodToJsonSchema = (schema) => {
|
|
9
|
+
return (0, zod_to_json_schema_1.zodToJsonSchema)(zod_1.z.object(schema), {
|
|
10
|
+
rejectedAdditionalProperties: undefined,
|
|
11
|
+
$refStrategy: "none",
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
exports.zodToJsonSchema = zodToJsonSchema;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Error class for validation errors in zod.
|
|
3
|
+
*/
|
|
4
|
+
export declare class ValidateError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export type NodeEdgeDataType = {
|
|
8
|
+
nodes: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
}>;
|
|
11
|
+
edges: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
source: string;
|
|
14
|
+
target: string;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
export type TreeDataType = {
|
|
18
|
+
name: string;
|
|
19
|
+
children?: TreeDataType[];
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Valid node name is unique.
|
|
23
|
+
* Valid edge source and target are existing in nodes.
|
|
24
|
+
* Valid edge source edge target pair are unique.
|
|
25
|
+
* @param data
|
|
26
|
+
* @returns boolean
|
|
27
|
+
*/
|
|
28
|
+
export declare const validatedNodeEdgeDataSchema: (data: NodeEdgeDataType) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Valid TreeData name is unique.
|
|
31
|
+
* @param data
|
|
32
|
+
* @returns boolean
|
|
33
|
+
*/
|
|
34
|
+
export declare const validatedTreeDataSchema: (data: TreeDataType) => boolean;
|