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.
@@ -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
+ }