cos-mcp 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/README.md +87 -0
- package/dist/index.js +110 -0
- package/dist/index.js.map +1 -0
- package/dist/server.js +339 -0
- package/dist/server.js.map +1 -0
- package/dist/services/ci/ai.service.js +185 -0
- package/dist/services/ci/ai.service.js.map +1 -0
- package/dist/services/ci/doc.service.js +175 -0
- package/dist/services/ci/doc.service.js.map +1 -0
- package/dist/services/ci/mateInsight.service.js +101 -0
- package/dist/services/ci/mateInsight.service.js.map +1 -0
- package/dist/services/ci/media.service.js +163 -0
- package/dist/services/ci/media.service.js.map +1 -0
- package/dist/services/ci/pic.service.js +99 -0
- package/dist/services/ci/pic.service.js.map +1 -0
- package/dist/services/cos/cos.service.js +139 -0
- package/dist/services/cos/cos.service.js.map +1 -0
- package/dist/services/utils.js +31 -0
- package/dist/services/utils.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateCode } from "../utils.js";
|
|
3
|
+
export const WaterMarkFontParamsSchema = z.object({
|
|
4
|
+
objectKey: z.string(),
|
|
5
|
+
text: z.string(),
|
|
6
|
+
});
|
|
7
|
+
export class CIPicService {
|
|
8
|
+
bucket;
|
|
9
|
+
region;
|
|
10
|
+
cos;
|
|
11
|
+
constructor(bucket, region, cos) {
|
|
12
|
+
this.bucket = bucket;
|
|
13
|
+
this.region = region;
|
|
14
|
+
this.cos = cos;
|
|
15
|
+
}
|
|
16
|
+
// 图片信息
|
|
17
|
+
async imageInfo(objectKey) {
|
|
18
|
+
try {
|
|
19
|
+
const result = await this.cos.request({
|
|
20
|
+
Bucket: this.bucket,
|
|
21
|
+
Region: this.region,
|
|
22
|
+
Method: "GET",
|
|
23
|
+
Key: objectKey,
|
|
24
|
+
Action: "imageInfo",
|
|
25
|
+
RawBody: false,
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
isSuccess: true,
|
|
29
|
+
message: "获取图片信息成功",
|
|
30
|
+
data: result,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
isSuccess: false,
|
|
36
|
+
message: "获取图片信息失败",
|
|
37
|
+
data: error,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async waterMarkFont(params) {
|
|
42
|
+
// 验证并解析参数
|
|
43
|
+
const validParams = WaterMarkFontParamsSchema.parse(params);
|
|
44
|
+
const { objectKey, text } = validParams;
|
|
45
|
+
const encodedText = Buffer.from(text).toString('base64')
|
|
46
|
+
.replace(/\+/g, '-')
|
|
47
|
+
.replace(/\//g, '_')
|
|
48
|
+
.replace(/=+$/, '');
|
|
49
|
+
try {
|
|
50
|
+
const imageProcessParams = [
|
|
51
|
+
'watermark/2', // 水印类型2表示文字水印
|
|
52
|
+
`text/${encodedText}`, // 使用动态文本
|
|
53
|
+
'scatype/3',
|
|
54
|
+
'spcent/20'
|
|
55
|
+
].join('/');
|
|
56
|
+
const lastDotIndex = objectKey.lastIndexOf('.');
|
|
57
|
+
const base = (lastDotIndex === -1)
|
|
58
|
+
? objectKey
|
|
59
|
+
: objectKey.substring(0, lastDotIndex);
|
|
60
|
+
const outPutFileid = `${base}_${generateCode(6)}`;
|
|
61
|
+
const result = await new Promise((resolve, reject) => {
|
|
62
|
+
this.cos.request({
|
|
63
|
+
Bucket: this.bucket, // 存储桶,必须字段
|
|
64
|
+
Region: this.region, // 存储桶所在地域,必须字段 如 ap-beijing
|
|
65
|
+
Key: objectKey, // 对象文件名,例如:folder/document.jpg。
|
|
66
|
+
Method: "POST", // 固定值
|
|
67
|
+
Action: "image_process", // 固定值
|
|
68
|
+
Headers: {
|
|
69
|
+
"Pic-Operations": JSON.stringify({
|
|
70
|
+
rules: [{ fileid: outPutFileid, rule: imageProcessParams }],
|
|
71
|
+
}),
|
|
72
|
+
},
|
|
73
|
+
}, function (error, data) {
|
|
74
|
+
if (error) {
|
|
75
|
+
// 处理请求失败
|
|
76
|
+
reject(error);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// 处理请求成功
|
|
80
|
+
resolve(data);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
isSuccess: true,
|
|
86
|
+
message: "添加水印成功",
|
|
87
|
+
data: result,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
isSuccess: false,
|
|
93
|
+
message: '添加水印失败',
|
|
94
|
+
data: error,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=pic.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pic.service.js","sourceRoot":"","sources":["../../../src/services/ci/pic.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export const UploadFileParamsSchema = z.object({
|
|
5
|
+
filePath: z.string(),
|
|
6
|
+
targetDir: z.string().optional(),
|
|
7
|
+
fileName: z.string().optional(),
|
|
8
|
+
});
|
|
9
|
+
export class CosService {
|
|
10
|
+
bucket;
|
|
11
|
+
region;
|
|
12
|
+
cos;
|
|
13
|
+
constructor(bucket, region, cos) {
|
|
14
|
+
this.bucket = bucket;
|
|
15
|
+
this.region = region;
|
|
16
|
+
this.cos = cos;
|
|
17
|
+
}
|
|
18
|
+
// /**
|
|
19
|
+
// * 上传文件到COS
|
|
20
|
+
// * @param params 上传参数
|
|
21
|
+
// * @returns 上传结果
|
|
22
|
+
// */
|
|
23
|
+
async uploadFile(params) {
|
|
24
|
+
// 验证并解析参数
|
|
25
|
+
const validParams = UploadFileParamsSchema.parse(params);
|
|
26
|
+
const { filePath, targetDir = "", fileName } = validParams;
|
|
27
|
+
try {
|
|
28
|
+
// 检查文件是否存在
|
|
29
|
+
if (!fs.existsSync(filePath)) {
|
|
30
|
+
return {
|
|
31
|
+
isSuccess: false,
|
|
32
|
+
message: "此路径上文件不存在",
|
|
33
|
+
data: "此路径上文件不存在: " + filePath,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// 确定文件名
|
|
37
|
+
const actualFileName = fileName || path.basename(filePath);
|
|
38
|
+
// 构建COS路径,确保正斜杠格式
|
|
39
|
+
let cosPath = actualFileName;
|
|
40
|
+
if (targetDir) {
|
|
41
|
+
// 规范化目标目录:移除头尾斜杠,然后加上结尾斜杠
|
|
42
|
+
const normalizedDir = targetDir.replace(/^\/+|\/+$/g, "");
|
|
43
|
+
cosPath = normalizedDir ? `${normalizedDir}/${actualFileName}` : actualFileName;
|
|
44
|
+
}
|
|
45
|
+
// 上传文件
|
|
46
|
+
const cosParams = {
|
|
47
|
+
Bucket: this.bucket,
|
|
48
|
+
Region: this.region,
|
|
49
|
+
Key: cosPath,
|
|
50
|
+
FilePath: filePath,
|
|
51
|
+
};
|
|
52
|
+
const result = await this.cos.uploadFile(cosParams);
|
|
53
|
+
return {
|
|
54
|
+
isSuccess: true,
|
|
55
|
+
message: "上传成功",
|
|
56
|
+
data: result,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
isSuccess: false,
|
|
62
|
+
message: "上传失败",
|
|
63
|
+
data: error,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async getObject(objectKey = "/") {
|
|
68
|
+
try {
|
|
69
|
+
// 下载文件
|
|
70
|
+
const cosParams = {
|
|
71
|
+
Bucket: this.bucket,
|
|
72
|
+
Region: this.region,
|
|
73
|
+
Key: objectKey,
|
|
74
|
+
};
|
|
75
|
+
const result = await this.cos.getObject(cosParams);
|
|
76
|
+
const content = String(result.Body);
|
|
77
|
+
return {
|
|
78
|
+
isSuccess: true,
|
|
79
|
+
message: "下载文件成功",
|
|
80
|
+
data: content,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
isSuccess: false,
|
|
86
|
+
message: "下载文件失败",
|
|
87
|
+
data: error,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 获取文件列表
|
|
92
|
+
async getBucket(Prefix = "") {
|
|
93
|
+
try {
|
|
94
|
+
const result = await this.cos.getBucket({
|
|
95
|
+
Bucket: this.bucket,
|
|
96
|
+
Region: this.region,
|
|
97
|
+
Prefix,
|
|
98
|
+
Delimiter: "",
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
isSuccess: true,
|
|
102
|
+
message: "获取列表成功",
|
|
103
|
+
data: result,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return {
|
|
108
|
+
isSuccess: false,
|
|
109
|
+
message: "获取列表失败",
|
|
110
|
+
data: error,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//获取带签名的objecturl
|
|
115
|
+
async getObjectUrl(ObjectKey) {
|
|
116
|
+
try {
|
|
117
|
+
const result = await new Promise((resolve, reject) => {
|
|
118
|
+
this.cos.getObjectUrl({
|
|
119
|
+
Bucket: this.bucket,
|
|
120
|
+
Region: this.region,
|
|
121
|
+
Key: ObjectKey
|
|
122
|
+
}, (error, data) => error ? reject(error) : resolve(data));
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
isSuccess: true,
|
|
126
|
+
message: "获取带签名 ObjectUrl 成功",
|
|
127
|
+
data: result,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return {
|
|
132
|
+
isSuccess: false,
|
|
133
|
+
message: "获取带签名 ObjectUrl 失败",
|
|
134
|
+
data: error,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=cos.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cos.service.js","sourceRoot":"","sources":["../../../src/services/cos/cos.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
// // 生成随机共 6 位 字母(a-z 不区分大小写) & 数字(0-9)
|
|
3
|
+
// export const randomString = () => {
|
|
4
|
+
// const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
5
|
+
// let result = "";
|
|
6
|
+
// for (let i = 0; i < 6; i++) {
|
|
7
|
+
// result += chars[Math.floor(Math.random() * chars.length)];
|
|
8
|
+
// }
|
|
9
|
+
// return result;
|
|
10
|
+
// };
|
|
11
|
+
export const generateCode = (length = 6, useSecure = true) => {
|
|
12
|
+
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ' + // 大写字母(排除 I, O)
|
|
13
|
+
'abcdefghjkmnpqrstuvwxyz' + // 小写字母(排除 i, l, o)
|
|
14
|
+
'23456789'; // 数字(排除 0, 1)
|
|
15
|
+
let code = '';
|
|
16
|
+
if (useSecure) {
|
|
17
|
+
// 使用加密安全的随机数
|
|
18
|
+
const randomBytes = crypto.randomBytes(length);
|
|
19
|
+
for (let i = 0; i < length; i++) {
|
|
20
|
+
code += chars[randomBytes[i] % chars.length];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// 使用普通随机数
|
|
25
|
+
for (let i = 0; i < length; i++) {
|
|
26
|
+
code += chars[Math.floor(Math.random() * chars.length)];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return code;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,yCAAyC;AACzC,sCAAsC;AACtC,oFAAoF;AACpF,qBAAqB;AACrB,kCAAkC;AAClC,iEAAiE;AACjE,MAAM;AACN,mBAAmB;AACnB,KAAK;AACL,MAAM,CAAC,MAAM,YAAY,GAAE,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE;IAC1D,MAAM,KAAK,GAAG,0BAA0B,GAAI,gBAAgB;QAClD,yBAAyB,GAAK,mBAAmB;QACjD,UAAU,CAAC,CAAmB,cAAc;IACtD,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,SAAS,EAAE,CAAC;QACd,aAAa;QACb,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,UAAU;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cos-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cos-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"dev": "nodemon --watch src -e ts --exec \"npm run build && node dist/index.js\"",
|
|
11
|
+
"dev:watch": "cross-env NODE_ENV=development tsup --watch",
|
|
12
|
+
"build": "tsc && shx chmod +x dist/index.js",
|
|
13
|
+
"watch": "tsc --watch",
|
|
14
|
+
"start": "npm run build && node ./dist/index.js",
|
|
15
|
+
"start:sse": "npm run build && node ./dist/index.js --connectType=sse",
|
|
16
|
+
"inspect": "npx @modelcontextprotocol/inspector",
|
|
17
|
+
"publish:release": "npm run build && npm publish --access public",
|
|
18
|
+
"publish:local": "npm run build && npm pack"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"cos",
|
|
27
|
+
"ci",
|
|
28
|
+
"upload",
|
|
29
|
+
"storage",
|
|
30
|
+
"ai"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "/"
|
|
35
|
+
},
|
|
36
|
+
"author": "shawnzhang,weiyankong",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"description": "基于MCP协议的腾讯云COS MCP Server,无需编码即可让大模型快速接入腾讯云存储(COS)和数据万象(CI)能力",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@modelcontextprotocol/sdk": "^1.9.0",
|
|
41
|
+
"cos-nodejs-sdk-v5": "^2.14.7",
|
|
42
|
+
"dotenv": "^16.4.7",
|
|
43
|
+
"express": "^4.21.2",
|
|
44
|
+
"yargs": "^17.7.2",
|
|
45
|
+
"zod": "^3.24.2"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/electron": "^1.4.38",
|
|
49
|
+
"@types/express": "^5.0.1",
|
|
50
|
+
"@types/node": "^22.13.10",
|
|
51
|
+
"@types/yargs": "^17.0.33",
|
|
52
|
+
"nodemon": "^3.1.9",
|
|
53
|
+
"shx": "^0.3.4",
|
|
54
|
+
"typescript": "^5.8.2"
|
|
55
|
+
}
|
|
56
|
+
}
|