@cloudbase/cloudbase-mcp 1.6.0 → 1.7.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/README.md +154 -159
- package/dist/auth.js +4 -0
- package/dist/cloudbase-manager.js +81 -10
- package/dist/index.js +3 -0
- package/dist/interactive-server.js +2447 -0
- package/dist/tools/env.js +61 -13
- package/dist/tools/hosting.js +70 -110
- package/dist/tools/interactive.js +198 -0
- package/dist/tools/setup.js +48 -8
- package/dist/utils/logger.js +119 -0
- package/package.json +7 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
export var LogLevel;
|
|
5
|
+
(function (LogLevel) {
|
|
6
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
7
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
8
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
9
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
10
|
+
})(LogLevel || (LogLevel = {}));
|
|
11
|
+
class Logger {
|
|
12
|
+
enabled;
|
|
13
|
+
level;
|
|
14
|
+
logFile;
|
|
15
|
+
useConsole;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
// 默认开启
|
|
18
|
+
this.enabled = options.enabled ?? true;
|
|
19
|
+
this.level = options.level ?? LogLevel.INFO;
|
|
20
|
+
this.useConsole = options.console ?? false;
|
|
21
|
+
// 默认日志文件路径
|
|
22
|
+
this.logFile = options.logFile ?? path.join(os.tmpdir(), 'cloudbase-mcp.log');
|
|
23
|
+
}
|
|
24
|
+
async writeLog(level, message, data) {
|
|
25
|
+
if (!this.enabled || level < this.level)
|
|
26
|
+
return;
|
|
27
|
+
const timestamp = new Date().toISOString();
|
|
28
|
+
const levelName = LogLevel[level];
|
|
29
|
+
const logMessage = data
|
|
30
|
+
? `[${timestamp}] [${levelName}] ${message} ${JSON.stringify(data, null, 2)}`
|
|
31
|
+
: `[${timestamp}] [${levelName}] ${message}`;
|
|
32
|
+
// 输出到控制台(仅在调试模式下)
|
|
33
|
+
if (this.useConsole && process.env.NODE_ENV === 'development') {
|
|
34
|
+
console.error(logMessage); // 使用 stderr 避免污染 stdout
|
|
35
|
+
}
|
|
36
|
+
// 写入日志文件
|
|
37
|
+
if (this.logFile) {
|
|
38
|
+
try {
|
|
39
|
+
await fs.appendFile(this.logFile, logMessage + '\n');
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// 静默处理日志写入错误,避免影响主要功能
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
debug(message, data) {
|
|
47
|
+
this.writeLog(LogLevel.DEBUG, message, data);
|
|
48
|
+
}
|
|
49
|
+
info(message, data) {
|
|
50
|
+
this.writeLog(LogLevel.INFO, message, data);
|
|
51
|
+
}
|
|
52
|
+
warn(message, data) {
|
|
53
|
+
this.writeLog(LogLevel.WARN, message, data);
|
|
54
|
+
}
|
|
55
|
+
error(message, data) {
|
|
56
|
+
this.writeLog(LogLevel.ERROR, message, data);
|
|
57
|
+
}
|
|
58
|
+
// 设置日志级别
|
|
59
|
+
setLevel(level) {
|
|
60
|
+
this.level = level;
|
|
61
|
+
}
|
|
62
|
+
// 启用/禁用日志
|
|
63
|
+
setEnabled(enabled) {
|
|
64
|
+
this.enabled = enabled;
|
|
65
|
+
}
|
|
66
|
+
// 获取日志文件路径
|
|
67
|
+
getLogFile() {
|
|
68
|
+
return this.logFile;
|
|
69
|
+
}
|
|
70
|
+
// 清理日志文件
|
|
71
|
+
async clearLogs() {
|
|
72
|
+
if (this.logFile) {
|
|
73
|
+
try {
|
|
74
|
+
await fs.writeFile(this.logFile, '');
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// 静默处理
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// 读取日志内容
|
|
82
|
+
async getLogs(maxLines = 1000) {
|
|
83
|
+
if (!this.logFile)
|
|
84
|
+
return [];
|
|
85
|
+
try {
|
|
86
|
+
const content = await fs.readFile(this.logFile, 'utf-8');
|
|
87
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
88
|
+
// 返回最近的 maxLines 行
|
|
89
|
+
return lines.slice(-maxLines);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return [`读取日志文件失败: ${error instanceof Error ? error.message : String(error)}`];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 获取日志状态信息
|
|
96
|
+
getStatus() {
|
|
97
|
+
return {
|
|
98
|
+
enabled: this.enabled,
|
|
99
|
+
level: LogLevel[this.level],
|
|
100
|
+
logFile: this.logFile,
|
|
101
|
+
useConsole: this.useConsole
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 创建全局 logger 实例
|
|
106
|
+
export const logger = new Logger({
|
|
107
|
+
enabled: process.env.MCP_DEBUG === 'true',
|
|
108
|
+
level: LogLevel.INFO,
|
|
109
|
+
console: process.env.NODE_ENV === 'development'
|
|
110
|
+
});
|
|
111
|
+
// 便捷的导出函数
|
|
112
|
+
export const debug = (message, data) => logger.error(message, data);
|
|
113
|
+
export const info = (message, data) => logger.info(message, data);
|
|
114
|
+
export const warn = (message, data) => logger.warn(message, data);
|
|
115
|
+
export const error = (message, data) => logger.error(message, data);
|
|
116
|
+
// 日志管理函数
|
|
117
|
+
export const getLogs = (maxLines) => logger.getLogs(maxLines);
|
|
118
|
+
export const getLoggerStatus = () => logger.getStatus();
|
|
119
|
+
export const clearLogs = () => logger.clearLogs();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudbase/cloudbase-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "腾讯云开发 MCP Server,支持静态托管/环境查询/",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -30,11 +30,17 @@
|
|
|
30
30
|
"@cloudbase/toolbox": "^0.7.5",
|
|
31
31
|
"@modelcontextprotocol/sdk": "1.9.0",
|
|
32
32
|
"@types/unzipper": "^0.10.11",
|
|
33
|
+
"cors": "^2.8.5",
|
|
34
|
+
"express": "^5.1.0",
|
|
35
|
+
"open": "^10.1.2",
|
|
33
36
|
"unzipper": "^0.12.3",
|
|
37
|
+
"ws": "^8.18.2",
|
|
34
38
|
"zod": "^3.24.3"
|
|
35
39
|
},
|
|
36
40
|
"devDependencies": {
|
|
41
|
+
"@types/express": "^5.0.3",
|
|
37
42
|
"@types/node": "^22.14.1",
|
|
43
|
+
"@types/ws": "^8.18.1",
|
|
38
44
|
"typescript": "^5.8.3"
|
|
39
45
|
}
|
|
40
46
|
}
|