@demox-site/mcp-server 1.0.0

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/dist/index.js ADDED
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { OAuthManager } from "./auth/OAuthManager.js";
6
+ import { DemoxClient } from "./api/DemoxClient.js";
7
+ import { logger } from "./utils/config.js";
8
+ /**
9
+ * Demox MCP Server
10
+ *
11
+ * 提供 Demox 平台的 MCP 接口,支持:
12
+ * - 部署静态网站
13
+ * - 查看网站列表
14
+ * - 删除网站
15
+ * - 管理网站
16
+ */
17
+ class DemoxMCPServer {
18
+ server;
19
+ oauthManager;
20
+ demoxClient = null;
21
+ constructor() {
22
+ logger.info("正在初始化 Demox MCP Server...");
23
+ this.server = new Server({
24
+ name: "@demox/mcp-server",
25
+ version: "1.0.0",
26
+ }, {
27
+ capabilities: {
28
+ tools: {},
29
+ },
30
+ });
31
+ this.oauthManager = new OAuthManager();
32
+ this.setupHandlers();
33
+ }
34
+ /**
35
+ * 设置请求处理器
36
+ */
37
+ setupHandlers() {
38
+ // 工具列表
39
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
40
+ return {
41
+ tools: [
42
+ {
43
+ name: "deploy_website",
44
+ description: "部署静态网站到 Demox 平台。支持传入本地文件路径、目录路径、ZIP 文件或 URL,系统会自动处理打包和上传。",
45
+ inputSchema: {
46
+ type: "object",
47
+ properties: {
48
+ zipFile: {
49
+ type: "string",
50
+ description: "文件或目录路径。支持:1) 本地目录(如 ./dist)- 自动打包 2) ZIP 文件(如 ./site.zip)- 直接上传 3) HTTP/HTTPS URL - 下载后部署 4) base64 编码的 ZIP 内容",
51
+ },
52
+ websiteId: {
53
+ type: "string",
54
+ description: "网站 ID(可选)。如果不提供,将创建新网站;如果提供,将更新现有网站",
55
+ },
56
+ fileName: {
57
+ type: "string",
58
+ description: "网站名称,用于标识和展示。如果不提供,会自动使用目录或文件名",
59
+ },
60
+ },
61
+ required: ["zipFile"],
62
+ },
63
+ },
64
+ {
65
+ name: "list_websites",
66
+ description: "获取用户在 Demox 平台上的所有网站列表,包括网站 ID、名称、URL 和创建时间",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {},
70
+ },
71
+ },
72
+ {
73
+ name: "get_website",
74
+ description: "获取指定网站的详细信息,包括文件列表、部署历史等",
75
+ inputSchema: {
76
+ type: "object",
77
+ properties: {
78
+ websiteId: {
79
+ type: "string",
80
+ description: "要查询的网站 ID",
81
+ },
82
+ },
83
+ required: ["websiteId"],
84
+ },
85
+ },
86
+ {
87
+ name: "delete_website",
88
+ description: "删除指定的网站及其所有文件。此操作不可撤销,请谨慎使用。",
89
+ inputSchema: {
90
+ type: "object",
91
+ properties: {
92
+ websiteId: {
93
+ type: "string",
94
+ description: "要删除的网站 ID",
95
+ },
96
+ },
97
+ required: ["websiteId"],
98
+ },
99
+ },
100
+ ],
101
+ };
102
+ });
103
+ // 工具调用
104
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
105
+ const { name, arguments: args } = request.params;
106
+ try {
107
+ // 确保已认证
108
+ let accessToken = await this.oauthManager.ensureAuthenticated();
109
+ // 延迟初始化客户端(需要 Token)
110
+ if (!this.demoxClient) {
111
+ this.demoxClient = new DemoxClient(accessToken);
112
+ }
113
+ // 路由到具体的处理方法
114
+ switch (name) {
115
+ case "deploy_website":
116
+ return await this.handleDeploy(args, accessToken);
117
+ case "list_websites":
118
+ return await this.handleList(accessToken);
119
+ case "get_website":
120
+ return await this.handleGet(args, accessToken);
121
+ case "delete_website":
122
+ return await this.handleDelete(args, accessToken);
123
+ default:
124
+ throw new Error(`未知工具: ${name}`);
125
+ }
126
+ }
127
+ catch (error) {
128
+ logger.error(`工具调用失败 (${name}):`, error.message);
129
+ // 检查是否是认证错误
130
+ const isAuthError = error.message.includes("Token") ||
131
+ error.message.includes("认证") ||
132
+ error.message.includes("登录") ||
133
+ error.message.includes("UNAUTHORIZED") ||
134
+ error.message.includes("401");
135
+ if (isAuthError) {
136
+ logger.info("检测到认证错误,自动触发登录流程...");
137
+ try {
138
+ // 自动触发登录
139
+ const newAccessToken = await this.oauthManager.authorize();
140
+ // 重新初始化客户端
141
+ this.demoxClient = new DemoxClient(newAccessToken);
142
+ logger.info("登录成功,正在重试工具调用...");
143
+ // 重新执行工具调用
144
+ switch (name) {
145
+ case "deploy_website":
146
+ return await this.handleDeploy(args, newAccessToken);
147
+ case "list_websites":
148
+ return await this.handleList(newAccessToken);
149
+ case "get_website":
150
+ return await this.handleGet(args, newAccessToken);
151
+ case "delete_website":
152
+ return await this.handleDelete(args, newAccessToken);
153
+ default:
154
+ throw new Error(`未知工具: ${name}`);
155
+ }
156
+ }
157
+ catch (loginError) {
158
+ logger.error("自动登录失败:", loginError.message);
159
+ return {
160
+ content: [
161
+ {
162
+ type: "text",
163
+ text: `❌ **自动登录失败**
164
+
165
+ 错误信息: ${loginError.message}
166
+
167
+ 请尝试手动运行以下命令完成登录:
168
+
169
+ \`\`\`bash
170
+ demox-mcp login
171
+ \`\`\`
172
+
173
+ 登录完成后,请重新调用此工具。`,
174
+ },
175
+ ],
176
+ isError: true,
177
+ };
178
+ }
179
+ }
180
+ return {
181
+ content: [
182
+ {
183
+ type: "text",
184
+ text: `❌ 错误: ${error.message}`,
185
+ },
186
+ ],
187
+ isError: true,
188
+ };
189
+ }
190
+ });
191
+ }
192
+ /**
193
+ * 处理网站部署
194
+ */
195
+ async handleDeploy(args, accessToken) {
196
+ const { zipFile, websiteId, fileName: providedFileName } = args;
197
+ // 参数验证
198
+ if (!zipFile) {
199
+ throw new Error("缺少必需参数: zipFile");
200
+ }
201
+ // 如果没有提供 fileName,尝试从路径推断
202
+ let fileName = providedFileName;
203
+ if (!fileName) {
204
+ if (zipFile.includes("/") || zipFile.includes("\\")) {
205
+ // 是路径:提取目录名或文件名
206
+ const parts = zipFile.split(/\/|\\/);
207
+ const lastPart = parts[parts.length - 1];
208
+ fileName = lastPart.replace(".zip", "") || "unnamed";
209
+ }
210
+ else {
211
+ fileName = "unnamed";
212
+ }
213
+ }
214
+ logger.info(`开始部署网站: ${fileName}`);
215
+ const result = await this.demoxClient.deployWebsite({
216
+ zipFile,
217
+ websiteId,
218
+ fileName,
219
+ }, accessToken);
220
+ return {
221
+ content: [
222
+ {
223
+ type: "text",
224
+ text: `✅ 网站部署成功!
225
+
226
+ **网站名称**: ${fileName}
227
+ **网站 ID**: ${result.websiteId}
228
+ **访问地址**: ${result.url}
229
+ **部署路径**: ${result.path}
230
+
231
+ 您现在可以访问上述地址查看您的网站了。`,
232
+ },
233
+ ],
234
+ };
235
+ }
236
+ /**
237
+ * 处理网站列表
238
+ */
239
+ async handleList(accessToken) {
240
+ logger.info("获取网站列表");
241
+ const websites = await this.demoxClient.listWebsites(accessToken);
242
+ if (websites.length === 0) {
243
+ return {
244
+ content: [
245
+ {
246
+ type: "text",
247
+ text: "您还没有部署任何网站。\n\n使用 deploy_website 工具来创建您的第一个网站吧!",
248
+ },
249
+ ],
250
+ };
251
+ }
252
+ // 格式化网站列表
253
+ const listText = websites
254
+ .map((site, index) => {
255
+ const date = new Date(site.createdAt).toLocaleString("zh-CN");
256
+ return `${index + 1}. **${site.fileName}**
257
+ - ID: \`${site.websiteId}\`
258
+ - URL: ${site.url}
259
+ - 创建时间: ${date}
260
+ `;
261
+ })
262
+ .join("\n");
263
+ return {
264
+ content: [
265
+ {
266
+ type: "text",
267
+ text: `📋 您的网站列表(共 ${websites.length} 个)
268
+
269
+ ${listText}`,
270
+ },
271
+ ],
272
+ };
273
+ }
274
+ /**
275
+ * 处理获取网站详情
276
+ */
277
+ async handleGet(args, accessToken) {
278
+ const { websiteId } = args;
279
+ if (!websiteId) {
280
+ throw new Error("缺少必需参数: websiteId");
281
+ }
282
+ logger.info(`获取网站详情: ${websiteId}`);
283
+ const website = await this.demoxClient.getWebsite(websiteId, accessToken);
284
+ if (!website) {
285
+ return {
286
+ content: [
287
+ {
288
+ type: "text",
289
+ text: `未找到网站: ${websiteId}`,
290
+ },
291
+ ],
292
+ };
293
+ }
294
+ const createdDate = new Date(website.createdAt).toLocaleString("zh-CN");
295
+ const updatedDate = new Date(website.updatedAt).toLocaleString("zh-CN");
296
+ return {
297
+ content: [
298
+ {
299
+ type: "text",
300
+ text: `**网站详情**
301
+
302
+ **名称**: ${website.fileName}
303
+ **ID**: \`${website.websiteId}\`
304
+ **URL**: ${website.url}
305
+ **路径**: ${website.path}
306
+ **创建时间**: ${createdDate}
307
+ **更新时间**: ${updatedDate}`,
308
+ },
309
+ ],
310
+ };
311
+ }
312
+ /**
313
+ * 处理删除网站
314
+ */
315
+ async handleDelete(args, accessToken) {
316
+ const { websiteId } = args;
317
+ if (!websiteId) {
318
+ throw new Error("缺少必需参数: websiteId");
319
+ }
320
+ logger.info(`删除网站: ${websiteId}`);
321
+ await this.demoxClient.deleteWebsite(websiteId, accessToken);
322
+ return {
323
+ content: [
324
+ {
325
+ type: "text",
326
+ text: `✅ 网站已删除
327
+
328
+ **网站 ID**: ${websiteId}
329
+
330
+ ⚠️ 注意:此操作不可撤销,网站的所有文件已被永久删除。`,
331
+ },
332
+ ],
333
+ };
334
+ }
335
+ /**
336
+ * 启动服务器
337
+ */
338
+ async start() {
339
+ const transport = new StdioServerTransport();
340
+ await this.server.connect(transport);
341
+ logger.info("✅ Demox MCP Server 已启动");
342
+ logger.info("等待工具调用...");
343
+ }
344
+ }
345
+ // 启动服务器
346
+ const server = new DemoxMCPServer();
347
+ server.start().catch((error) => {
348
+ logger.error("服务器启动失败:", error);
349
+ process.exit(1);
350
+ });
351
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 配置管理模块
3
+ */
4
+ export interface MCPConfig {
5
+ clientId: string;
6
+ authUrl: string;
7
+ apiBase: string;
8
+ serverEnv: string;
9
+ cloudFunctionUrl: string;
10
+ }
11
+ export declare function loadConfig(): MCPConfig;
12
+ /**
13
+ * Token 存储路径
14
+ */
15
+ export declare function getTokenPath(): string;
16
+ /**
17
+ * 日志工具
18
+ */
19
+ export declare class Logger {
20
+ private debugMode;
21
+ constructor();
22
+ debug(message: string, ...args: any[]): void;
23
+ info(message: string, ...args: any[]): void;
24
+ warn(message: string, ...args: any[]): void;
25
+ error(message: string, ...args: any[]): void;
26
+ }
27
+ export declare const logger: Logger;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,UAAU,IAAI,SAAS,CAiBtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAiBrC;AAED;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,SAAS,CAAU;;IAM3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAMrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * 配置管理模块
3
+ */
4
+ import os from "os";
5
+ import path from "path";
6
+ export function loadConfig() {
7
+ const clientId = process.env.DEMOX_CLIENT_ID || "demox-mcp-client";
8
+ const authUrl = process.env.DEMOX_AUTH_URL || "http://localhost:8080/#/mcp-authorize";
9
+ const apiBase = process.env.DEMOX_API_BASE || "https://demox.site";
10
+ const serverEnv = process.env.DEMOX_SERVER_ENV || "moyu-3g5pbxld00f4aead";
11
+ const cloudFunctionUrl = process.env.DEMOX_CLOUD_FUNCTION_URL ||
12
+ "https://cb.aigc.sx.cn/cloudfunction/mcp-api";
13
+ return {
14
+ clientId,
15
+ authUrl,
16
+ apiBase,
17
+ serverEnv,
18
+ cloudFunctionUrl,
19
+ };
20
+ }
21
+ /**
22
+ * Token 存储路径
23
+ */
24
+ export function getTokenPath() {
25
+ const platform = os.platform();
26
+ let configDir;
27
+ if (platform === "darwin") {
28
+ // macOS
29
+ configDir = path.join(os.homedir(), ".demox");
30
+ }
31
+ else if (platform === "win32") {
32
+ // Windows
33
+ configDir = path.join(os.homedir(), ".demox");
34
+ }
35
+ else {
36
+ // Linux
37
+ configDir = path.join(os.homedir(), ".demox");
38
+ }
39
+ return path.join(configDir, "token.json");
40
+ }
41
+ /**
42
+ * 日志工具
43
+ */
44
+ export class Logger {
45
+ debugMode;
46
+ constructor() {
47
+ this.debugMode = process.env.DEBUG === "demox:*" || process.env.DEBUG === "*";
48
+ }
49
+ debug(message, ...args) {
50
+ if (this.debugMode) {
51
+ console.error(`[DEBUG] ${message}`, ...args);
52
+ }
53
+ }
54
+ info(message, ...args) {
55
+ console.error(`[INFO] ${message}`, ...args);
56
+ }
57
+ warn(message, ...args) {
58
+ console.error(`[WARN] ${message}`, ...args);
59
+ }
60
+ error(message, ...args) {
61
+ console.error(`[ERROR] ${message}`, ...args);
62
+ }
63
+ }
64
+ export const logger = new Logger();
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,kBAAkB,CAAC;IACnE,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uCAAuC,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,oBAAoB,CAAC;IACnE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;IAC1E,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,6CAA6C,CAAC;IAEhD,OAAO;QACL,QAAQ;QACR,OAAO;QACP,OAAO;QACP,SAAS;QACT,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,IAAI,SAAiB,CAAC;IAEtB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,QAAQ;QACR,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,UAAU;QACV,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,QAAQ;QACR,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,MAAM;IACT,SAAS,CAAU;IAE3B;QACE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@demox-site/mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "Demox MCP Server - Deploy static websites with AI",
5
+ "main": "./dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "demox-mcp": "./dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx watch src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "cli": "tsx src/cli.ts",
15
+ "test": "vitest",
16
+ "prepublishOnly": "npm run build",
17
+ "lint": "eslint \"src/**/*.ts\""
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "model-context-protocol",
22
+ "demox",
23
+ "deployment",
24
+ "cloudbase"
25
+ ],
26
+ "author": "Demox Team",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@cloudbase/node-sdk": "^3.17.0",
30
+ "@modelcontextprotocol/sdk": "^1.0.4",
31
+ "adm-zip": "^0.5.10",
32
+ "commander": "^12.0.0",
33
+ "open": "^10.1.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^20.11.0",
37
+ "tsx": "^4.7.0",
38
+ "typescript": "^5.3.3"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md",
43
+ "LICENSE"
44
+ ],
45
+ "engines": {
46
+ "node": ">=18.0.0"
47
+ }
48
+ }