@avclabs.ai/media-mcp 0.2.1 → 0.4.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 +250 -35
- package/README_CN.md +250 -35
- package/config.json +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +32 -80
- package/dist/server.js.map +1 -1
- package/package.json +22 -25
- package/dist/sam3.d.ts +0 -3
- package/dist/sam3.d.ts.map +0 -1
- package/dist/sam3.js +0 -167
- package/dist/sam3.js.map +0 -1
- package/dist/video-enhancement.d.ts +0 -3
- package/dist/video-enhancement.d.ts.map +0 -1
- package/dist/video-enhancement.js +0 -236
- package/dist/video-enhancement.js.map +0 -1
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACnH,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,sFAAsF;AACtF,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAG,sBAAsB,CAAC;QACxC,GAAG,EAAE,eAAe,CAAC,IAAI,EAAE;YACzB,YAAY,EAAE,SAAS;YACvB,kBAAkB,EAAE,cAAc;YAClC,WAAW,EAAE,QAAQ;YACrB,iBAAiB,EAAE,aAAa;YAChC,sBAAsB,EAAE,oBAAoB;YAC5C,0BAA0B,EAAE,qBAAqB;SAClD,CAAC;QACF,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC;IAEH,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;QAC9E,mCAAmC;QACnC,0BAA0B,CAAC,MAAM,EAAE,UAAU,CAAC,qBAAqB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAExF,mCAAmC;QACnC,0BAA0B,CAAC,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAElF,sBAAsB;QACtB,cAAc,CACZ,MAAM,EACN,UAAU,CAAC,cAAc,EACzB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,kBAAkB,EAC7B,UAAU,CAAC,mBAAmB,CAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@avclabs.ai/media-mcp",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "MCP Server for video enhancement and image segmentation (SAM3)",
|
|
4
|
+
"version": "0.4.0",
|
|
5
|
+
"description": "Legacy all-in-one MCP Server for video enhancement, image enhancement/colorization/denoising, and image segmentation (SAM3). Prefer the per-function packages @avclabs.ai/video-mcp, @avclabs.ai/image-mcp, and @avclabs.ai/sam3-mcp.",
|
|
6
6
|
"mcpName": "io.github.avclabs/media-mcp",
|
|
7
|
-
"main": "dist/
|
|
8
|
-
"types": "dist/
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
9
16
|
"bin": {
|
|
10
17
|
"media-mcp": "dist/server.js"
|
|
11
18
|
},
|
|
@@ -19,39 +26,29 @@
|
|
|
19
26
|
"scripts": {
|
|
20
27
|
"build": "tsc",
|
|
21
28
|
"dev": "tsc --watch",
|
|
22
|
-
"prepare": "npm run build",
|
|
23
29
|
"prepublishOnly": "npm run build"
|
|
24
30
|
},
|
|
25
31
|
"keywords": [
|
|
26
32
|
"mcp",
|
|
27
33
|
"model-context-protocol",
|
|
28
34
|
"video",
|
|
35
|
+
"image",
|
|
29
36
|
"enhancement",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"server"
|
|
33
|
-
"claude",
|
|
34
|
-
"anthropic"
|
|
37
|
+
"colorization",
|
|
38
|
+
"denoising",
|
|
39
|
+
"server"
|
|
35
40
|
],
|
|
36
|
-
"author": "Your Name <your.email@example.com>",
|
|
37
41
|
"license": "MIT",
|
|
38
42
|
"repository": {
|
|
39
43
|
"type": "git",
|
|
40
|
-
"url": "git+https://github.com/avclabs/media-mcp.git"
|
|
44
|
+
"url": "git+https://github.com/avclabs/media-mcp.git",
|
|
45
|
+
"directory": "packages/media-mcp"
|
|
41
46
|
},
|
|
42
|
-
"bugs": {
|
|
43
|
-
"url": "https://github.com/avclabs/media-mcp/issues"
|
|
44
|
-
},
|
|
45
|
-
"homepage": "https://github.com/avclabs/media-mcp#readme",
|
|
46
47
|
"dependencies": {
|
|
47
|
-
"@
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
},
|
|
52
|
-
"devDependencies": {
|
|
53
|
-
"@types/node": "^20.0.0",
|
|
54
|
-
"typescript": "^5.4.0"
|
|
48
|
+
"@avclabs.ai/media-mcp-core": "^0.1.0",
|
|
49
|
+
"@avclabs.ai/video-mcp": "^0.1.0",
|
|
50
|
+
"@avclabs.ai/image-mcp": "^0.1.0",
|
|
51
|
+
"@avclabs.ai/sam3-mcp": "^0.1.0"
|
|
55
52
|
},
|
|
56
53
|
"mcpServer": {
|
|
57
54
|
"command": "npx",
|
|
@@ -64,7 +61,7 @@
|
|
|
64
61
|
"HTTP_API_BASE_URL": "https://mcp.avc.ai/enhance",
|
|
65
62
|
"SAM3_API_BASE_URL": "https://mcp.avc.ai/sam"
|
|
66
63
|
},
|
|
67
|
-
"description": "视频增强 + SAM3 图像分割 MCP
|
|
64
|
+
"description": "视频增强 + 图片增强/上色/降噪 + SAM3 图像分割 MCP 服务(全量 9 工具;推荐改用按功能拆分的 video-mcp / image-mcp / sam3-mcp)",
|
|
68
65
|
"setup": "需要替换 env.API_KEY 为你的 API Key"
|
|
69
66
|
},
|
|
70
67
|
"engines": {
|
package/dist/sam3.d.ts
DELETED
package/dist/sam3.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sam3.d.ts","sourceRoot":"","sources":["../src/sam3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAcpE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,IAAI,CAsCN"}
|
package/dist/sam3.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
import FormData from 'form-data';
|
|
6
|
-
const Sam3PredictSchema = z.object({
|
|
7
|
-
imagePath: z.string().optional().describe('Absolute path of a local image file (e.g. C:\\\\Users\\\\xxx\\\\photo.png)'),
|
|
8
|
-
imageUrl: z.string().url().optional().describe('Publicly accessible URL of the image to process'),
|
|
9
|
-
imageBase64: z.string().optional().describe('Base64-encoded image data. Use this when the image is provided as an attachment without a local path'),
|
|
10
|
-
prompt: z.string().describe('Text prompt for mask generation. Must be in English. If the user provides Chinese or other non-English text, translate it to English before calling this tool'),
|
|
11
|
-
});
|
|
12
|
-
export function setupSam3Tools(server, baseUrl, apiKey, pollInterval, pollMaxAttempts) {
|
|
13
|
-
const client = axios.create({
|
|
14
|
-
baseURL: baseUrl.replace(/\/$/, ''),
|
|
15
|
-
headers: {
|
|
16
|
-
'X-API-Key': apiKey,
|
|
17
|
-
'Content-Type': 'application/json',
|
|
18
|
-
},
|
|
19
|
-
timeout: 60000,
|
|
20
|
-
});
|
|
21
|
-
server.tool('sam3_predict', `Analyze an image using the SAM3 segmentation API to generate inference results (masks, boxes, scores).
|
|
22
|
-
The image can be provided in one of three ways:
|
|
23
|
-
1. imagePath: Absolute path of a local image file (e.g. C:\\Users\\xxx\\photo.png). Use this when the user provides a local file path.
|
|
24
|
-
2. imageUrl: Publicly accessible URL of the image (e.g. https://example.com/photo.jpg). Use this when the user provides a web link.
|
|
25
|
-
3. imageBase64: Base64-encoded image data. Use this when the user uploads or drags-and-drops an image as an attachment and no local path is available.
|
|
26
|
-
In this case, encode the image content as base64 and pass it via this parameter.
|
|
27
|
-
If the user mentions an uploaded image but does not provide a path, URL, or base64 data, ask the user for the local absolute path.
|
|
28
|
-
Prompt must be in English. If the user provides Chinese or other non-English text, translate it to English before calling this tool.`, Sam3PredictSchema.shape, async (args) => {
|
|
29
|
-
try {
|
|
30
|
-
if (!apiKey) {
|
|
31
|
-
throw new Error('SAM3 API Key not configured. Please set API_KEY environment variable or --api-key argument.');
|
|
32
|
-
}
|
|
33
|
-
const result = await sam3PredictTool(client, pollInterval, pollMaxAttempts, args);
|
|
34
|
-
return {
|
|
35
|
-
content: [{ type: 'text', text: result }],
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
40
|
-
return {
|
|
41
|
-
content: [{ type: 'text', text: JSON.stringify({ success: false, error: errorMessage }, null, 2) }],
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
async function getSam3PostSignature(client, fileName) {
|
|
47
|
-
const response = await client.post('/get_postsignature_url', {
|
|
48
|
-
file_type: 'image',
|
|
49
|
-
file_name: fileName,
|
|
50
|
-
});
|
|
51
|
-
const data = response.data;
|
|
52
|
-
if (data.code !== 0) {
|
|
53
|
-
throw new Error(`get_postsignature_url error: ${data.message || 'unknown error'}`);
|
|
54
|
-
}
|
|
55
|
-
return data.data;
|
|
56
|
-
}
|
|
57
|
-
async function uploadImageToTos(url, sigData, tosKey, buffer, fileName) {
|
|
58
|
-
const formData = new FormData();
|
|
59
|
-
formData.append('key', tosKey);
|
|
60
|
-
formData.append('policy', sigData.policy);
|
|
61
|
-
formData.append('x-tos-algorithm', sigData.algorithm);
|
|
62
|
-
formData.append('x-tos-credential', sigData.credential);
|
|
63
|
-
formData.append('x-tos-date', sigData.date);
|
|
64
|
-
formData.append('x-tos-signature', sigData.signature);
|
|
65
|
-
formData.append('file', buffer, fileName);
|
|
66
|
-
const response = await axios.post(url, formData, {
|
|
67
|
-
headers: formData.getHeaders(),
|
|
68
|
-
maxBodyLength: Infinity,
|
|
69
|
-
maxContentLength: Infinity,
|
|
70
|
-
});
|
|
71
|
-
if (response.status >= 400) {
|
|
72
|
-
throw new Error(`TOS upload failed: ${response.status} ${response.statusText}`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async function sam3Predict(client, fileId, prompt) {
|
|
76
|
-
const response = await client.post('/predict', { file_id: fileId, prompt });
|
|
77
|
-
return response.data.task_id;
|
|
78
|
-
}
|
|
79
|
-
async function downloadSam3Result(url) {
|
|
80
|
-
const response = await axios.get(url);
|
|
81
|
-
return response.data;
|
|
82
|
-
}
|
|
83
|
-
async function prepareImageBuffer(args) {
|
|
84
|
-
const { imagePath, imageUrl, imageBase64 } = args;
|
|
85
|
-
if (!imagePath && !imageUrl && !imageBase64) {
|
|
86
|
-
throw new Error('Missing image input: must provide one of imagePath, imageUrl, or imageBase64');
|
|
87
|
-
}
|
|
88
|
-
let buffer;
|
|
89
|
-
let fileName;
|
|
90
|
-
if (imagePath) {
|
|
91
|
-
if (!fs.existsSync(imagePath)) {
|
|
92
|
-
throw new Error(`Local file does not exist: ${imagePath}`);
|
|
93
|
-
}
|
|
94
|
-
fileName = path.basename(imagePath);
|
|
95
|
-
buffer = fs.readFileSync(imagePath);
|
|
96
|
-
}
|
|
97
|
-
else if (imageUrl) {
|
|
98
|
-
const response = await axios.get(imageUrl, { responseType: 'arraybuffer' });
|
|
99
|
-
buffer = Buffer.from(response.data);
|
|
100
|
-
fileName = path.basename(new URL(imageUrl).pathname) || 'image.png';
|
|
101
|
-
}
|
|
102
|
-
else if (imageBase64) {
|
|
103
|
-
buffer = Buffer.from(imageBase64, 'base64');
|
|
104
|
-
fileName = 'image.png';
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
throw new Error('Missing image input: must provide one of imagePath, imageUrl, or imageBase64');
|
|
108
|
-
}
|
|
109
|
-
return { buffer, fileName };
|
|
110
|
-
}
|
|
111
|
-
async function sam3CreateTask(client, buffer, fileName, prompt) {
|
|
112
|
-
const signatureData = await getSam3PostSignature(client, fileName);
|
|
113
|
-
const { url, origin_policy } = signatureData;
|
|
114
|
-
if (!url) {
|
|
115
|
-
throw new Error('Missing upload URL in post signature response');
|
|
116
|
-
}
|
|
117
|
-
const keyObj = JSON.parse(origin_policy).conditions.find((c) => 'key' in c);
|
|
118
|
-
const tosKey = keyObj ? keyObj.key : new URL(url).pathname.slice(1);
|
|
119
|
-
const fileId = new URL(url).pathname.split('/').pop();
|
|
120
|
-
if (!fileId) {
|
|
121
|
-
throw new Error('Could not extract file_id from upload URL');
|
|
122
|
-
}
|
|
123
|
-
await uploadImageToTos(url, signatureData, tosKey, buffer, fileName);
|
|
124
|
-
const taskId = await sam3Predict(client, fileId, prompt);
|
|
125
|
-
return taskId;
|
|
126
|
-
}
|
|
127
|
-
async function getSam3Result(client, taskId) {
|
|
128
|
-
const response = await client.get(`/predict/result/${encodeURIComponent(taskId)}`);
|
|
129
|
-
return response.data;
|
|
130
|
-
}
|
|
131
|
-
async function getSam3PredictResult(client, taskId, pollInterval, pollMaxAttempts) {
|
|
132
|
-
for (let attempt = 0; attempt < pollMaxAttempts; attempt++) {
|
|
133
|
-
const data = await getSam3Result(client, taskId);
|
|
134
|
-
if (data.status === 'completed') {
|
|
135
|
-
return data;
|
|
136
|
-
}
|
|
137
|
-
if (data.status === 'failed') {
|
|
138
|
-
throw new Error(`Task failed: ${data.error_message || 'unknown error'}`);
|
|
139
|
-
}
|
|
140
|
-
await sleep(pollInterval);
|
|
141
|
-
}
|
|
142
|
-
return {
|
|
143
|
-
success: true,
|
|
144
|
-
status: 'processing',
|
|
145
|
-
task_id: taskId,
|
|
146
|
-
message: `Task is still processing (waited about ${Math.round(pollMaxAttempts * pollInterval / 1000)} seconds). Please retry later or record this task_id for manual follow-up.`,
|
|
147
|
-
note: 'The synchronous wait for this long-running task has been truncated.',
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
async function sam3PredictTool(client, pollInterval, pollMaxAttempts, args) {
|
|
151
|
-
if (!args.prompt) {
|
|
152
|
-
throw new Error('Missing argument: prompt');
|
|
153
|
-
}
|
|
154
|
-
const { buffer, fileName } = await prepareImageBuffer(args);
|
|
155
|
-
const taskId = await sam3CreateTask(client, buffer, fileName, args.prompt);
|
|
156
|
-
const taskResult = await getSam3PredictResult(client, taskId, pollInterval, pollMaxAttempts);
|
|
157
|
-
if (taskResult.success === true && taskResult.status === 'processing') {
|
|
158
|
-
return JSON.stringify(taskResult, null, 2);
|
|
159
|
-
}
|
|
160
|
-
const resultUrl = taskResult.result;
|
|
161
|
-
const resultJson = await downloadSam3Result(resultUrl);
|
|
162
|
-
return JSON.stringify(resultJson, null, 2);
|
|
163
|
-
}
|
|
164
|
-
function sleep(ms) {
|
|
165
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=sam3.js.map
|
package/dist/sam3.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sam3.js","sourceRoot":"","sources":["../src/sam3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-enhancement.d.ts","sourceRoot":"","sources":["../src/video-enhancement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoGnG"}
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
import FormData from 'form-data';
|
|
6
|
-
// Schemas
|
|
7
|
-
const CreateTaskSchema = z.object({
|
|
8
|
-
video_source: z.string().describe('Video URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
|
|
9
|
-
type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote video, local=local file'),
|
|
10
|
-
resolution: z.enum(['480p', '540p', '720p', '1080p', '2k']).default('720p').describe('Target resolution, default 720p'),
|
|
11
|
-
});
|
|
12
|
-
const GetTaskStatusSchema = z.object({
|
|
13
|
-
task_id: z.string().describe('Task ID'),
|
|
14
|
-
});
|
|
15
|
-
const EnhanceVideoSyncSchema = z.object({
|
|
16
|
-
video_source: z.string().describe('Video URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
|
|
17
|
-
type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote video, local=local file'),
|
|
18
|
-
resolution: z.enum(['480p', '540p', '720p', '1080p', '2k']).default('720p').describe('Target resolution, default 720p'),
|
|
19
|
-
poll_interval: z.number().default(5).describe('Polling interval in seconds, default 5'),
|
|
20
|
-
timeout: z.number().default(50).describe('Synchronous wait timeout in seconds, default 50. Returns task_id early when exceeded, use get_task_status to continue polling'),
|
|
21
|
-
});
|
|
22
|
-
export function setupVideoEnhancementTools(server, baseUrl, apiKey) {
|
|
23
|
-
const client = axios.create({
|
|
24
|
-
baseURL: baseUrl.replace(/\/$/, ''),
|
|
25
|
-
headers: {
|
|
26
|
-
'Authorization': `Bearer ${apiKey}`,
|
|
27
|
-
'Content-Type': 'application/json',
|
|
28
|
-
},
|
|
29
|
-
timeout: 60000,
|
|
30
|
-
});
|
|
31
|
-
// create_task tool
|
|
32
|
-
server.tool('create_task', `Create a video enhancement task (asynchronous).
|
|
33
|
-
|
|
34
|
-
Two upload methods are supported:
|
|
35
|
-
1. URL upload: provide a video URL
|
|
36
|
-
2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
|
|
37
|
-
|
|
38
|
-
Parameters:
|
|
39
|
-
- video_source: video URL or local file path
|
|
40
|
-
- type: "url" or "local"
|
|
41
|
-
- resolution: target resolution
|
|
42
|
-
|
|
43
|
-
After creating a task, a task_id is returned immediately. Use get_task_status to poll for results until status becomes "completed" or "failed".`, CreateTaskSchema.shape, async (args) => {
|
|
44
|
-
try {
|
|
45
|
-
const result = await createTask(client, args.video_source, args.type, args.resolution);
|
|
46
|
-
return {
|
|
47
|
-
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
52
|
-
return {
|
|
53
|
-
content: [{ type: 'text', text: JSON.stringify({ success: false, error: errorMessage }, null, 2) }],
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
// get_task_status tool
|
|
58
|
-
server.tool('get_task_status', 'Query video enhancement task status. The status field can be: processing, completed, or failed. If status is processing, wait a few seconds and call this tool again to poll.', GetTaskStatusSchema.shape, async (args) => {
|
|
59
|
-
try {
|
|
60
|
-
const result = await getTaskStatus(client, args.task_id);
|
|
61
|
-
return {
|
|
62
|
-
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
67
|
-
return {
|
|
68
|
-
content: [{ type: 'text', text: JSON.stringify({ success: false, error: errorMessage }, null, 2) }],
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
// enhance_video_sync tool
|
|
73
|
-
server.tool('enhance_video_sync', `Synchronously enhance video (blocks until completion).
|
|
74
|
-
|
|
75
|
-
Two upload methods are supported:
|
|
76
|
-
1. URL upload: provide a video URL
|
|
77
|
-
2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
|
|
78
|
-
|
|
79
|
-
Parameters:
|
|
80
|
-
- video_source: video URL or local file path
|
|
81
|
-
- type: "url" or "local"
|
|
82
|
-
- resolution: target resolution
|
|
83
|
-
- poll_interval: polling interval in seconds
|
|
84
|
-
- timeout: synchronous wait timeout in seconds, default 50
|
|
85
|
-
|
|
86
|
-
Best for short videos (estimated processing time < 1 minute). If the task is not completed within 50 seconds, the tool returns early with a task_id. Use get_task_status to continue polling.`, EnhanceVideoSyncSchema.shape, async (args) => {
|
|
87
|
-
try {
|
|
88
|
-
const result = await enhanceVideoSync(client, args.video_source, args.type, args.resolution, args.poll_interval, args.timeout);
|
|
89
|
-
return {
|
|
90
|
-
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
95
|
-
return {
|
|
96
|
-
content: [{ type: 'text', text: JSON.stringify({ success: false, error: errorMessage }, null, 2) }],
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
function checkLocalFile(filePath) {
|
|
102
|
-
if (!fs.existsSync(filePath)) {
|
|
103
|
-
throw new Error(`File does not exist: ${filePath}`);
|
|
104
|
-
}
|
|
105
|
-
const stats = fs.statSync(filePath);
|
|
106
|
-
const maxSize = 100 * 1024 * 1024;
|
|
107
|
-
if (stats.size > maxSize) {
|
|
108
|
-
throw new Error('File size exceeds 100MB limit');
|
|
109
|
-
}
|
|
110
|
-
return { filePath, fileName: path.basename(filePath) };
|
|
111
|
-
}
|
|
112
|
-
async function getTosSignature(client, fileName) {
|
|
113
|
-
const response = await client.post('/api/v3/contents/generations/tos-signature', {
|
|
114
|
-
file_type: 'video',
|
|
115
|
-
file_name: fileName,
|
|
116
|
-
});
|
|
117
|
-
const data = response.data;
|
|
118
|
-
if (data.code !== 0 && data.code !== 200) {
|
|
119
|
-
throw new Error(data.message || 'Failed to get TOS signature');
|
|
120
|
-
}
|
|
121
|
-
return data.data;
|
|
122
|
-
}
|
|
123
|
-
async function uploadToTos(filePath, signatureData) {
|
|
124
|
-
const formData = new FormData();
|
|
125
|
-
const objectKey = decodeURIComponent(new URL(signatureData.url).pathname.slice(1));
|
|
126
|
-
formData.append('key', objectKey);
|
|
127
|
-
const fieldMapping = {
|
|
128
|
-
algorithm: 'x-tos-algorithm',
|
|
129
|
-
credential: 'x-tos-credential',
|
|
130
|
-
date: 'x-tos-date',
|
|
131
|
-
signature: 'x-tos-signature',
|
|
132
|
-
};
|
|
133
|
-
for (const [key, value] of Object.entries(signatureData)) {
|
|
134
|
-
if (key === 'url' || key === 'origin_policy')
|
|
135
|
-
continue;
|
|
136
|
-
const formKey = fieldMapping[key] || key;
|
|
137
|
-
formData.append(formKey, String(value));
|
|
138
|
-
}
|
|
139
|
-
const fileName = path.basename(filePath);
|
|
140
|
-
formData.append('file', fs.createReadStream(filePath), fileName);
|
|
141
|
-
const response = await axios.post(signatureData.url, formData, {
|
|
142
|
-
headers: formData.getHeaders(),
|
|
143
|
-
maxBodyLength: Infinity,
|
|
144
|
-
maxContentLength: Infinity,
|
|
145
|
-
});
|
|
146
|
-
if (response.status >= 400) {
|
|
147
|
-
const debugInfo = JSON.stringify({
|
|
148
|
-
status: response.status,
|
|
149
|
-
statusText: response.statusText,
|
|
150
|
-
data: response.data,
|
|
151
|
-
url: signatureData.url,
|
|
152
|
-
signatureFields: Object.keys(signatureData),
|
|
153
|
-
fileName,
|
|
154
|
-
fileSize: fs.statSync(filePath).size,
|
|
155
|
-
}, null, 2);
|
|
156
|
-
throw new Error(`TOS upload failed: ${response.status} ${response.statusText}\nDebug info: ${debugInfo}`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
function parseFileIdFromUrl(url) {
|
|
160
|
-
const pathname = new URL(url).pathname;
|
|
161
|
-
const segments = pathname.split('/');
|
|
162
|
-
return decodeURIComponent(segments.pop() || '');
|
|
163
|
-
}
|
|
164
|
-
async function createTask(client, videoSource, sourceType, resolution) {
|
|
165
|
-
let contentItem;
|
|
166
|
-
if (sourceType === 'local') {
|
|
167
|
-
const fileInfo = checkLocalFile(videoSource);
|
|
168
|
-
const signatureData = await getTosSignature(client, fileInfo.fileName);
|
|
169
|
-
await uploadToTos(videoSource, signatureData);
|
|
170
|
-
const fileId = parseFileIdFromUrl(signatureData.url);
|
|
171
|
-
contentItem = { type: 'video_file', file_id: fileId, file_name: fileInfo.fileName };
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
contentItem = { type: 'video_url', video_url: { url: videoSource } };
|
|
175
|
-
}
|
|
176
|
-
const payload = { model: 'avc-enhance', content: [contentItem], resolution };
|
|
177
|
-
const response = await client.post('/api/v3/contents/generations/tasks', payload);
|
|
178
|
-
const data = response.data;
|
|
179
|
-
if (data.code !== 0 && data.code !== 200) {
|
|
180
|
-
return { success: false, error: data.message };
|
|
181
|
-
}
|
|
182
|
-
return { success: true, task_id: data.data.task_id, status: data.data.status };
|
|
183
|
-
}
|
|
184
|
-
async function getTaskStatus(client, taskId) {
|
|
185
|
-
const response = await client.get(`/api/v3/contents/generations/tasks/${taskId}`);
|
|
186
|
-
const data = response.data;
|
|
187
|
-
if (data.code !== 0 && data.code !== 200) {
|
|
188
|
-
return { success: false, error: data.message };
|
|
189
|
-
}
|
|
190
|
-
const result = data.data;
|
|
191
|
-
return {
|
|
192
|
-
success: true,
|
|
193
|
-
task_id: result.task_id,
|
|
194
|
-
status: result.status,
|
|
195
|
-
progress: result.progress || 0,
|
|
196
|
-
video_url: result.video_url,
|
|
197
|
-
debug_video_url_length: result.video_url?.length,
|
|
198
|
-
debug_video_url_full: result.video_url,
|
|
199
|
-
error_message: result.error_message,
|
|
200
|
-
created_at: result.created_at,
|
|
201
|
-
updated_at: result.updated_at,
|
|
202
|
-
message: result.status === 'processing' ? 'Task is still processing, please check again later' : undefined,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
async function enhanceVideoSync(client, videoSource, sourceType, resolution, pollInterval, timeout) {
|
|
206
|
-
const createResult = await createTask(client, videoSource, sourceType, resolution);
|
|
207
|
-
if (!createResult.success) {
|
|
208
|
-
return createResult;
|
|
209
|
-
}
|
|
210
|
-
const taskId = createResult.task_id;
|
|
211
|
-
const startTime = Date.now();
|
|
212
|
-
while (true) {
|
|
213
|
-
const status = await getTaskStatus(client, taskId);
|
|
214
|
-
if (!status.success) {
|
|
215
|
-
return status;
|
|
216
|
-
}
|
|
217
|
-
if (status.status === 'completed' || status.status === 'failed') {
|
|
218
|
-
return status;
|
|
219
|
-
}
|
|
220
|
-
const elapsed = (Date.now() - startTime) / 1000;
|
|
221
|
-
if (elapsed >= timeout) {
|
|
222
|
-
return {
|
|
223
|
-
success: true,
|
|
224
|
-
status: 'processing',
|
|
225
|
-
task_id: taskId,
|
|
226
|
-
message: `Task is still processing (waited ${timeout} seconds). Please use get_task_status to continue polling.`,
|
|
227
|
-
note: 'The synchronous wait for this long-running task has been truncated. Switch to get_task_status polling.',
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
await sleep(pollInterval * 1000);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
function sleep(ms) {
|
|
234
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
235
|
-
}
|
|
236
|
-
//# sourceMappingURL=video-enhancement.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-enhancement.js","sourceRoot":"","sources":["../src/video-enhancement.ts"],"names":[],"mappings":"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"}
|