@avclabs.ai/media-mcp 0.2.0 → 0.3.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_CN.md ADDED
@@ -0,0 +1,633 @@
1
+ # media-mcp (Node.js)
2
+
3
+ [English](https://github.com/avclabs/media-mcp/blob/main/README.md) | 中文
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@avclabs.ai/media-mcp)](https://www.npmjs.com/package/@avclabs.ai/media-mcp)
6
+ [![Node.js >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
+
9
+ 基于 MCP 协议的视频增强、图片增强/上色/降噪与图像分割服务,作为 MCP Client-Server 与后端 HTTP Server 交互。
10
+
11
+ > **发布状态**:当前 npm `latest`(`0.2.1`)包含 3 个视频工具和 2 个 SAM3 工具。图片增强工具正在积极开发中,将在后续版本发布——下文已提前列出供尝鲜参考,但目前尚不包含在已发布的 npm 包中。
12
+
13
+ ## 功能
14
+
15
+ 提供以下 MCP Tools:
16
+
17
+ **视频增强**
18
+ - `create_task` - 创建视频增强任务(支持 URL 或本地文件上传)
19
+ - `get_task_status` - 查询任务状态
20
+ - `enhance_video_sync` - 同步增强视频(阻塞等待,默认45秒截断)
21
+
22
+ **图片增强(即将发布,暂不含于已发布的 npm 包)**
23
+ - `enhance_image_sync` - 图片画质增强与人脸优化(支持 URL 或本地文件上传)
24
+ - `colorize_image_sync` - 黑白照片上色(支持 URL 或本地文件上传)
25
+ - `denoise_image_sync` - 图片降噪去噪(支持 URL 或本地文件上传)
26
+ - `get_image_task_status` - 查询图片任务状态(同步工具超时后用于轮询)
27
+
28
+ **图像分割 (SAM3)**
29
+ - `sam3_predict` - SAM3 图像分割(支持本地路径、URL 或 Base64 图片)
30
+ - `get_sam3_task_status` - 查询 SAM3 任务状态(同步工具超时后用于轮询)
31
+
32
+ ## 前置要求
33
+
34
+ - **Node.js >= 18** (检查:`node --version`)
35
+ - **API Key** (用于身份认证,请联系服务提供方获取)
36
+
37
+ ## 懒人安装(推荐)
38
+
39
+ 如果你使用的 AI Agent 有确定的 MCP 配置路径,直接复制下面这句发给 AI:
40
+
41
+ ```
42
+ 帮我安装 npm 包 @avclabs.ai/media-mcp 作为 MCP server。我的 API Key 是:sk-xxxxxxxx。
43
+ ```
44
+
45
+ AI 会自动完成:
46
+ 1. 检测你使用的 MCP 客户端
47
+ 2. 找到配置文件路径
48
+ 3. 写入正确的配置
49
+ 4. 提示你重启客户端
50
+
51
+ ## 手动安装
52
+
53
+ 无需安装,直接在 MCP 客户端配置中使用 `npx` 运行。
54
+
55
+ ### 1. Claude Code(CLI)
56
+
57
+ 在 Claude Code 中运行:
58
+
59
+ ```
60
+ /mcp
61
+ ```
62
+
63
+ 查看输出中 **"User MCPs"** 对应的配置文件路径,然后编辑该文件。
64
+
65
+ 常见路径(如果 `/mcp` 不可用):
66
+ - **Windows**: `%USERPROFILE%\.claude.json`
67
+ - **macOS**: `~/.claude.json`
68
+ - **Linux**: `~/.claude.json`
69
+ - **旧版/备用**: `~/.claude/mcp.json`
70
+
71
+ 粘贴以下内容(将 `your-api-key` 替换为实际 API Key):
72
+
73
+ ```json
74
+ {
75
+ "mcpServers": {
76
+ "video-enhancement": {
77
+ "command": "npx",
78
+ "args": ["-y", "@avclabs.ai/media-mcp@latest"],
79
+ "env": {
80
+ "API_KEY": "your-api-key"
81
+ }
82
+ }
83
+ }
84
+ }
85
+ ```
86
+
87
+ 保存后运行 `/mcp` 验证是否加载成功。
88
+
89
+ ### 2. Cursor
90
+
91
+ 进入 **设置 > Tools & MCPs > Add New MCP Server**:
92
+
93
+ - **Name**:`video-enhancement`
94
+ - **Type**:`command`
95
+ - **Command**:
96
+ ```bash
97
+ env API_KEY=your-api-key npx -y @avclabs.ai/media-mcp@latest
98
+ ```
99
+
100
+ 或编辑 `~/.cursor/mcp.json`:
101
+
102
+ ```json
103
+ {
104
+ "mcpServers": {
105
+ "video-enhancement": {
106
+ "command": "npx",
107
+ "args": ["-y", "@avclabs.ai/media-mcp@latest"],
108
+ "env": {
109
+ "API_KEY": "your-api-key"
110
+ }
111
+ }
112
+ }
113
+ }
114
+ ```
115
+
116
+ ## 验证安装
117
+
118
+ 重启客户端后,确认工具是否加载成功:
119
+
120
+ 1. 或直接问 AI:"你有哪些可用的工具?"
121
+ 2. 当前 npm `latest=0.2.1` 应看到 `create_task`、`get_task_status`、`enhance_video_sync`、`sam3_predict`、`get_sam3_task_status`。
122
+ 3. 图片工具随后续版本发布后,还应能看到 `enhance_image_sync`、`colorize_image_sync`、`denoise_image_sync`、`get_image_task_status`。
123
+
124
+ ## 配置项
125
+
126
+ | 变量名 | 必填 | 默认值 | 说明 |
127
+ |---|---|---|---|
128
+ | `API_KEY` | **是** | - | API 认证密钥(视频、图片和 SAM3 服务共用) |
129
+ | `HTTP_API_BASE_URL` | 否 | `https://mcp.avc.ai/enhance` | 视频与图片共用的 HTTP 服务接口地址 |
130
+ | `IMAGE_API_BASE_URL` | 否 | 与 `HTTP_API_BASE_URL` 相同 | 可选图片接口覆盖;共享生产服务无需配置 |
131
+ | `SAM3_API_BASE_URL` | 否 | `https://mcp.avc.ai/sam` | SAM3 服务接口地址 |
132
+ | `SAM3_POLL_INTERVAL_MS` | 否 | `2000` | SAM3 轮询间隔(毫秒,`SAM3_POLL_INTERVAL` 为已弃用别名) |
133
+ | `SAM3_POLL_MAX_ATTEMPTS` | 否 | `25` | SAM3 最大状态查询次数;时间预算为 间隔 × 次数,任一限制先耗尽即截断等待 |
134
+
135
+ `IMAGE_API_BASE_URL` 是可选的图片端点覆盖参数,用于把图片请求指向自定义图片服务。省略时,图片与视频请求共用 `HTTP_API_BASE_URL` 服务——这也是生产服务器的推荐配置。
136
+
137
+ ### 自定义服务地址
138
+
139
+ ```json
140
+ {
141
+ "env": {
142
+ "HTTP_API_BASE_URL": "https://your-media-endpoint.com",
143
+ "API_KEY": "your-api-key",
144
+ "SAM3_API_BASE_URL": "https://your-sam3-endpoint.com"
145
+ }
146
+ }
147
+ ```
148
+
149
+ 或通过命令行参数:
150
+ ```bash
151
+ npx -y @avclabs.ai/media-mcp@latest --base-url https://your-media-endpoint.com --api-key your-api-key --sam3-base-url https://your-sam3-endpoint.com
152
+ ```
153
+
154
+ 可选的 `--image-base-url` 参数仅用于主动拆分公网图片端点的部署;当前 npm `latest` 版本不使用它(图片请求共用主端点)。
155
+
156
+ ## 推荐的工作流程
157
+
158
+ 本项目提供了**同步**和**异步**两种模式。
159
+
160
+ **由于 MCP Agent 对单个 tool 调用通常有约 60 秒的超时限制**,处理时间较长的任务(视频增强)强烈建议使用**异步模式**:
161
+
162
+ ### 异步模式(推荐)
163
+
164
+ **视频增强**:
165
+ 1. 调用 `create_task` 创建任务 → 立即获得 `task_id`
166
+ 2. 等待几秒后,调用 `get_task_status` 查询状态
167
+ 3. 如果 `status` 为 `processing`,继续等待并重复步骤 2
168
+ 4. 如果 `status` 为 `completed`,任务完成,结果中包含 `video_url`
169
+ 5. 如果 `status` 为 `failed`,任务失败,结果中包含 `error_message`
170
+
171
+ ### 同步模式(简单场景)
172
+
173
+ **视频增强**:
174
+ - 调用 `enhance_video_sync` → 服务器内部自动轮询
175
+ - 默认最多等待45秒
176
+ - 如果45秒内完成,直接返回结果
177
+ - 如果45秒未完成,返回 `task_id` 和提示,让 Agent 切换到 `get_task_status` 继续查询
178
+
179
+ **图像分割 (SAM3)**:
180
+ - 调用 `sam3_predict` → 服务器内部自动轮询
181
+ - 默认最多25次状态查询、约50秒时间预算(25次 × 2秒间隔,任一限制先耗尽即截断等待)
182
+ - 如果预算内完成,直接返回分割结果
183
+ - 如果预算内未完成,返回携带 `task_id` 的截断提示,告知任务仍在处理中
184
+
185
+ ## 使用示例
186
+
187
+ 配置完成后,用自然语言对 AI 说:
188
+
189
+ > "帮我把这个视频增强到 1080p:https://example.com/video.mp4"
190
+
191
+ > "把我桌面的 video.mp4 提升到 2k 画质"
192
+
193
+ > "帮我把这张图片画质增强一下:https://example.com/photo.jpg"
194
+
195
+ > "帮我把这张黑白照片上色:/Users/me/Desktop/old_photo.png"
196
+
197
+ > "帮我把这张图片降噪去噪:C:\\Users\\xxx\\noisy.jpg"
198
+
199
+ > "帮我分析这张图片,找出里面的所有物体:C:\\Users\\xxx\\photo.png"
200
+
201
+ > "用 SAM3 分割这张图片,prompt 是 'find all cars'"
202
+
203
+ AI 会根据任务复杂度自动选择同步或异步工具完成任务。
204
+
205
+ ## 提供的 Tools
206
+
207
+ ### 视频增强
208
+
209
+ #### create_task
210
+
211
+ 创建视频增强任务(异步)。
212
+
213
+ > **推荐使用**:适用于绝大多数场景,尤其是时长超过10秒的视频,可避免超时和长时间阻塞连接。
214
+
215
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
216
+ |---|---|---|---|---|
217
+ | `video_source` | string | 是 | - | 视频 URL 或本地文件路径(URL 必须公网可访问,不支持需要登录或签名的链接) |
218
+ | `type` | string | 否 | `url` | `url` 或 `local` |
219
+ | `resolution` | string | 否 | `720p` | `480p`、`540p`、`720p`、`1080p`、`2k` |
220
+
221
+ **返回值:**
222
+ ```json
223
+ {
224
+ "success": true,
225
+ "task_id": "xxx",
226
+ "status": "processing"
227
+ }
228
+ ```
229
+
230
+ #### get_task_status
231
+
232
+ 查询视频增强任务状态。
233
+
234
+ > 返回值中的 `status` 字段可能为:`processing`(处理中)、`completed`(已完成)、`failed`(失败)。如果 `status` 为 `processing`,你需要等待几秒后再次调用此工具轮询。
235
+
236
+ | 参数 | 类型 | 必填 |
237
+ |---|---|---|
238
+ | `task_id` | string | 是 |
239
+
240
+ **返回值:**
241
+ ```json
242
+ {
243
+ "success": true,
244
+ "task_id": "xxx",
245
+ "status": "completed",
246
+ "progress": 100,
247
+ "video_url": "https://...",
248
+ "message": "Task is still processing, please check again later"
249
+ }
250
+ ```
251
+
252
+ 其中 `message` 字段只在 `status` 为 `processing` 时出现,提示 Agent 继续等待。
253
+
254
+ #### enhance_video_sync
255
+
256
+ 同步增强视频(阻塞等待完成)。
257
+
258
+ > **仅适合短视频(预计处理时间 < 1 分钟)。** 如果任务在默认45秒等待预算内未完成,工具会提前返回并包含 `task_id`,你需要使用 `get_task_status` 继续查询。
259
+
260
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
261
+ |---|---|---|---|---|
262
+ | `video_source` | string | 是 | - | 视频 URL 或本地文件路径 |
263
+ | `type` | string | 否 | `url` | `url` 或 `local` |
264
+ | `resolution` | string | 否 | `720p` | 目标分辨率 |
265
+ | `poll_interval` | number | 否 | `5` | 轮询间隔(秒,0.5-30) |
266
+ | `timeout` | number | 否 | `45` | 同步等待超时时间(秒,1-45),超过后主动返回 |
267
+
268
+ **截断返回示例(默认45秒预算内未完成):**
269
+ ```json
270
+ {
271
+ "success": true,
272
+ "status": "processing",
273
+ "task_id": "xxx",
274
+ "message": "Task is still processing (waited 45 seconds, 9 status queries). Please use get_task_status to continue polling.",
275
+ "note": "The synchronous wait for this long-running task has been truncated. Switch to get_task_status polling."
276
+ }
277
+ ```
278
+
279
+ ### 图片增强
280
+
281
+ 提供三个图片处理工具,分别针对不同场景:
282
+
283
+ | 工具 | 功能 | 适用场景 |
284
+ |---|---|---|
285
+ | `enhance_image_sync` | 图片画质增强与人脸优化 | 模糊、低分辨率或画质下降的照片 |
286
+ | `colorize_image_sync` | 黑白照片上色 | 为老旧黑白照片恢复真实色彩 |
287
+ | `denoise_image_sync` | 图片降噪去噪 | 弱光环境下拍摄的噪点/颗粒感照片 |
288
+
289
+ 三个工具的参数和行为模式相同,均为**同步**调用——工具会阻塞直到图片处理完成或超时。
290
+
291
+ **支持的图片格式**:PNG、JPG、JPEG、BMP、WebP 等。
292
+
293
+ **两种上传方式**:
294
+ 1. **URL 上传**:提供公开可访问的图片 URL(`type: "url"`)
295
+ 2. **本地上传**:提供本地文件路径,MCP Server 自动上传到 TOS 对象存储(`type: "local"`,最大 100MB)
296
+
297
+ #### enhance_image_sync
298
+
299
+ 同步增强图片画质并优化人脸。
300
+
301
+ > 工具内部会创建任务并轮询结果。如果在超时时间内(默认 45 秒)处理完成,直接返回结果;否则提前返回 `task_id`,需用 `get_image_task_status` 继续轮询。
302
+
303
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
304
+ |---|---|---|---|---|
305
+ | `image_source` | string | 是 | - | 图片 URL 或本地文件路径(URL 必须公网可访问,不支持需要登录或签名的链接) |
306
+ | `type` | string | 否 | `url` | `url` 或 `local` |
307
+ | `scale` | number | 否 | `2` | 增强倍数(如 `2` 为 2 倍、`4` 为 4 倍放大) |
308
+ | `poll_interval` | number | 否 | `5` | 轮询间隔(秒,0.5-30) |
309
+ | `timeout` | number | 否 | `45` | 同步等待超时时间(秒,1-45),超过后主动返回 |
310
+
311
+ **正常完成返回:**
312
+ ```json
313
+ {
314
+ "success": true,
315
+ "task_id": "xxx",
316
+ "status": "completed",
317
+ "progress": 100,
318
+ "image_url": "https://..."
319
+ }
320
+ ```
321
+
322
+ **截断返回(默认45秒预算内未完成):**
323
+ ```json
324
+ {
325
+ "success": true,
326
+ "status": "processing",
327
+ "task_id": "xxx",
328
+ "message": "Task is still processing (waited 45 seconds, 9 status queries). Please use get_image_task_status to continue polling.",
329
+ "note": "The synchronous wait for this long-running task has been truncated. Switch to get_image_task_status polling."
330
+ }
331
+ ```
332
+
333
+ #### colorize_image_sync
334
+
335
+ 同步为黑白照片 AI 上色。
336
+
337
+ > 适合老旧黑白照片,AI 会为图片添加真实色彩。参数与返回格式与 `enhance_image_sync` 相同。
338
+
339
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
340
+ |---|---|---|---|---|
341
+ | `image_source` | string | 是 | - | 图片 URL 或本地文件路径(URL 必须公网可访问,不支持需要登录或签名的链接) |
342
+ | `type` | string | 否 | `url` | `url` 或 `local` |
343
+ | `poll_interval` | number | 否 | `5` | 轮询间隔(秒,0.5-30) |
344
+ | `timeout` | number | 否 | `45` | 同步等待超时时间(秒,1-45),超过后主动返回 |
345
+
346
+ **返回值:** 与 `enhance_image_sync` 相同。
347
+
348
+ #### denoise_image_sync
349
+
350
+ 同步为图片降噪去噪。
351
+
352
+ > 适合弱光环境或高 ISO 拍摄的噪点/颗粒感照片。参数与返回格式与 `enhance_image_sync` 相同。
353
+
354
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
355
+ |---|---|---|---|---|
356
+ | `image_source` | string | 是 | - | 图片 URL 或本地文件路径(URL 必须公网可访问,不支持需要登录或签名的链接) |
357
+ | `type` | string | 否 | `url` | `url` 或 `local` |
358
+ | `poll_interval` | number | 否 | `5` | 轮询间隔(秒,0.5-30) |
359
+ | `timeout` | number | 否 | `45` | 同步等待超时时间(秒,1-45),超过后主动返回 |
360
+
361
+ **返回值:** 与 `enhance_image_sync` 相同。
362
+
363
+ #### get_image_task_status
364
+
365
+ 查询图片处理任务状态。当同步工具超时后,用此工具轮询结果。
366
+
367
+ > 返回值中的 `status` 字段可能为:`processing`(处理中)、`completed`(已完成)、`failed`(失败)。如果 `status` 为 `processing`,等待几秒后再次调用此工具。
368
+
369
+ | 参数 | 类型 | 必填 |
370
+ |---|---|---|
371
+ | `task_id` | string | 是 |
372
+
373
+ **返回值:**
374
+ ```json
375
+ {
376
+ "success": true,
377
+ "task_id": "xxx",
378
+ "status": "completed",
379
+ "progress": 100,
380
+ "image_url": "https://...",
381
+ "message": "Task is still processing, please check again later"
382
+ }
383
+ ```
384
+
385
+ 其中 `message` 字段只在 `status` 为 `processing` 时出现,提示 Agent 继续等待。
386
+
387
+ #### 图片工具推荐工作流
388
+
389
+ 1. **大多数图片**:直接调用 `enhance_image_sync` / `colorize_image_sync` / `denoise_image_sync`,工具会完成全部流程并返回结果
390
+ 2. **如果被截断**:工具返回 `task_id`,然后用 `get_image_task_status` 轮询,直到 `status` 变为 `completed` 或 `failed`
391
+ 3. **如果失败**:查看 `error_message` 字段了解详情
392
+
393
+ ### 图像分割 (SAM3)
394
+
395
+ #### sam3_predict
396
+
397
+ 使用 SAM3 分割 API 分析图片,生成推理结果(masks、boxes、scores)。
398
+
399
+ **参数:**
400
+
401
+ 图片输入(三选一,必须提供其中一种):
402
+
403
+ - `imagePath` (string): 本地图片的绝对路径。支持常见图片格式(如 PNG、JPG、JPEG)。
404
+ - 示例:`"C:\\Users\\xxx\\photo.png"`、`"/home/user/images/cat.jpg"`
405
+ - 适用场景:用户明确提供了本地文件路径
406
+
407
+ - `imageUrl` (string): 公开可访问的图片 URL。
408
+ - 示例:`"https://example.com/photo.jpg"`
409
+ - 适用场景:图片已在网上,用户提供了链接
410
+ - 注意:URL 必须公开可访问,不支持需要登录或签名的链接
411
+
412
+ - `imageBase64` (string): Base64 编码的图片数据。
413
+ - 示例:`"iVBORw0KGgoAAAANSUhEUgAA..."`
414
+ - 适用场景:用户拖拽或上传了图片附件,Agent 将图片编码为 base64 后传入
415
+ - 注意:大图片的 base64 数据会比较大,传输时间可能稍长
416
+
417
+ 其他参数:
418
+
419
+ - `prompt` (string, required): 英文文本提示,用于指定要在图片中分割的目标物体。由于 SAM3 模型仅接受英文 prompt,建议传入英文描述。如果用户提供中文或其他非英文文本,Agent 会自动翻译为英文后调用。
420
+
421
+ **正常完成返回:**
422
+
423
+ 推理完成后,直接返回 JSON 字符串。该 JSON 包含以下三个字段:
424
+
425
+ - **`masks`**:二维数组。每个元素是一个与输入图片尺寸相同的二值掩码(取值为 0 或 1),用于标记检测到的物体在图片中的像素级位置。数组中的第 i 个掩码对应第 i 个检测到的物体实例。
426
+ - **`boxes`**:二维数组。每个元素是 `[x1, y1, x2, y2]` 格式的边界框坐标,表示检测到的物体在图片中的矩形区域。`x1`、`y1` 为左上角坐标,`x2`、`y2` 为右下角坐标。
427
+
428
+ 坐标系说明:以图片左上角为原点 `(0, 0)`,`x` 轴向右增长,`y` 轴向下增长,单位为像素。例如 `[120, 80, 300, 450]` 表示该物体区域从图片左边缘向右 120px、上边缘向下 80px 处开始,延伸至左边缘向右 300px、上边缘向下 450px 处结束,区域宽度为 `x2 - x1 = 180px`,高度为 `y2 - y1 = 370px`。
429
+ - **`scores`**:一维数组。每个元素是对应检测结果的置信度分数,取值范围为 0 到 1。分数越高,表示模型对该检测结果的把握越大。
430
+
431
+ 结果 JSON 内容示例:
432
+
433
+ ```json
434
+ {
435
+ "masks": [
436
+ [[0, 0, 1, ...], [0, 1, 1, ...], ...],
437
+ [[0, 0, 0, ...], [0, 0, 1, ...], ...]
438
+ ],
439
+ "boxes": [
440
+ [120, 80, 300, 450],
441
+ [400, 200, 600, 500]
442
+ ],
443
+ "scores": [0.95, 0.87]
444
+ }
445
+ ```
446
+
447
+ **截断返回示例(预算内未完成):**
448
+ ```json
449
+ {
450
+ "success": true,
451
+ "status": "processing",
452
+ "task_id": "xxx",
453
+ "message": "Task is still processing (waited 50 seconds, 25 status queries). Please use get_sam3_task_status to continue polling.",
454
+ "note": "The synchronous wait for this long-running task has been truncated. Switch to task status polling."
455
+ }
456
+ ```
457
+
458
+ **结果下载失败(任务已完成、结果缺失):**
459
+ 任务已完成但结果文件下载失败时,工具返回 `success: false`,同时携带 `task_id` 与 `status: "completed"`。请用该 `task_id` 调用 `get_sam3_task_status` 恢复结果,不要重新提交任务。
460
+ ```json
461
+ {
462
+ "success": false,
463
+ "task_id": "xxx",
464
+ "status": "completed",
465
+ "error": "Failed to download the completed result for task xxx: ...",
466
+ "note": "The task has completed; only the result download failed. Do not resubmit. Use get_sam3_task_status with this task_id to recover the result."
467
+ }
468
+ ```
469
+
470
+ #### get_sam3_task_status
471
+
472
+ 查询 SAM3 分割任务状态。当 `sam3_predict` 超时后,用此工具轮询结果。
473
+
474
+ > 返回值中的 `status` 字段可能为:`processing`(处理中)、`completed`(已完成)、`failed`(失败)。如果 `status` 为 `processing`,等待几秒后再次调用此工具。
475
+
476
+ | 参数 | 类型 | 必填 |
477
+ |---|---|---|
478
+ | `task_id` | string | 是 |
479
+
480
+ **已完成返回:**
481
+ ```json
482
+ {
483
+ "success": true,
484
+ "task_id": "xxx",
485
+ "status": "completed",
486
+ "result_url": "https://..."
487
+ }
488
+ ```
489
+
490
+ **处理中返回:**
491
+ ```json
492
+ {
493
+ "success": true,
494
+ "task_id": "xxx",
495
+ "status": "processing",
496
+ "message": "Task is still processing, please check again later."
497
+ }
498
+ ```
499
+
500
+ **失败返回:**
501
+ ```json
502
+ {
503
+ "success": false,
504
+ "task_id": "xxx",
505
+ "status": "failed",
506
+ "error": "Task failed"
507
+ }
508
+ ```
509
+
510
+ ## 常见问题
511
+
512
+ ### AVCLabs Media MCP 是免费的吗?
513
+
514
+ 注册即送免费额度,无需绑定信用卡。超出免费额度后按量付费:积分包($19.95 起)和月订阅($9.95/月起)。当前套餐见 https://mcp.avc.ai/pricing/ 。
515
+
516
+ ### 支持哪些 AI 客户端?
517
+
518
+ 任何兼容 MCP 的客户端。Claude Code、Cursor、Windsurf 有一键配置指南:https://mcp.avc.ai/docs/ (本包使用标准 MCP stdio 协议,其他 agent 使用相同的 `npx` 配置即可接入)。
519
+
520
+ ### 需要 GPU 或高性能硬件吗?
521
+
522
+ 不需要。视频增强与 SAM3 推理都在 AVCLabs 云端完成,本机只运行轻量的 MCP stdio 服务进程(Node.js 18+),普通笔记本即可。
523
+
524
+ ### API Key 在哪里获取?
525
+
526
+ 在 https://mcp.avc.ai/ 注册后在控制台创建。同一个 Key 同时用于视频增强、图片工具与 SAM3 分割。
527
+
528
+ ### `sam3_predict` 返回什么?
529
+
530
+ 文本提示所描述目标的像素级分割掩码(masks)、边界框(bounding boxes)和逐实例置信度分数——可直接用于合成、标注或后续分析。
531
+
532
+ ### Agent 调用工具时报超时怎么办?
533
+
534
+ 这是本项目重点解决的问题。MCP Agent(如 Claude、Cursor)对单个 tool 调用通常有约 60 秒的超时限制。如果任务处理时间超过此限制,Agent 会报错并切断连接。
535
+
536
+ **解决方案:**
537
+
538
+ 1. **优先使用异步工具**:对于视频增强等耗时任务,始终使用 `create_task` + `get_task_status`。这些工具每次调用都是瞬间返回的,不会触发超时。
539
+
540
+ 2. **同步工具的截断机制**:`enhance_video_sync` 已在内部设置了45秒的截断限制(默认 `timeout`)。如果任务未在预算内完成,工具会主动返回 `task_id`,并提示 Agent 使用 `get_task_status` 继续跟进。
541
+
542
+ 3. **SAM3 的截断机制**:`sam3_predict` 受两个独立限制约束:最多 `SAM3_POLL_MAX_ATTEMPTS` 次状态查询(默认25次)和时间预算 `SAM3_POLL_INTERVAL_MS × 次数`(默认 25 × 2秒 ≈ 50秒)。任一限制先耗尽即截断等待;返回的提示携带 `task_id` 以及实际经过时间和查询次数,远端任务继续运行。
543
+
544
+ 4. **调整 SAM3 轮询参数**(高级):两个限制相互独立,可以自由权衡间隔与次数(例如 `SAM3_POLL_INTERVAL_MS=1000` 配合 `SAM3_POLL_MAX_ATTEMPTS=50`,仍是约50秒预算、但查询频率翻倍)。如果任务通常几秒内完成,调低间隔可以更快发现完成状态。显式配置的非法值(非整数或超出允许范围)会在启动时直接报错退出,不会提交任何任务。等待预算只覆盖任务创建后的状态轮询——源准备、上传、任务提交和最后的结果下载都不计入,因此整个工具调用可能长于预算。
545
+
546
+ ### 拖拽附件后提示找不到文件?
547
+
548
+ 这是 stdio MCP 的已知限制。当通过 Agent 界面拖拽或上传附件时,文件路径通常不会自动传给 MCP Server。
549
+
550
+ **解决方法:**
551
+
552
+ 1. **同时提供路径**(推荐):拖拽图片后,在文字中补充说明图片的本地绝对路径:
553
+ > "请处理这张图片 `D:\\photos\\cat.jpg`,找出里面的猫"
554
+
555
+ 2. **等待自动编码**:Claude 可能会自动将图片编码为 base64 传入。如果成功,无需额外操作。
556
+
557
+ 3. **回答路径询问**:如果 Claude 询问图片路径,直接回复本地绝对路径即可。
558
+
559
+ ### 三种输入方式有优先级吗?
560
+
561
+ 没有严格优先级。Claude 会根据对话上下文自动选择最合适的方式:
562
+
563
+ - 你提供了本地路径 → 使用 `imagePath`
564
+ - 你提供了网络链接 → 使用 `imageUrl`
565
+ - 你拖拽了附件且没有路径 → 尝试 `imageBase64`
566
+
567
+ ### 支持哪些图片格式?
568
+
569
+ 支持常见格式:PNG、JPG、JPEG、BMP、WebP 等。建议优先使用 PNG 或 JPG。
570
+
571
+ ### URL 图片下载失败怎么办?
572
+
573
+ 确保 URL 是**公开可访问**的,不需要登录、Cookie 或签名。如果图片在需要身份验证的服务上(如私有 S3 Bucket、需要登录的图床),请先下载到本地再使用 `imagePath`。
574
+
575
+ ### Base64 图片太大怎么办?
576
+
577
+ 如果图片很大(如 4K 分辨率),base64 编码后的数据会非常大,可能导致传输变慢。建议:
578
+
579
+ 1. 使用 `imagePath` 代替
580
+ 2. 或先将图片压缩后再编码
581
+
582
+ ## 文件上传说明
583
+
584
+ 当 `type` 为 `"local"` 时,MCP Server 会:
585
+ 1. 读取本地文件
586
+ 2. 通过预签名 URL 直传到 TOS 对象存储
587
+ 3. **最大文件大小:100MB**
588
+
589
+ ## 故障排查
590
+
591
+ ### "command not found: npx"
592
+
593
+ 安装 Node.js >= 18:https://nodejs.org/
594
+
595
+ ### "API key is required: pass --api-key or set the API_KEY environment variable"
596
+
597
+ API Key 缺失,请检查配置中的 `env.API_KEY`。
598
+
599
+ ### MCP Server 在客户端显示红色/错误
600
+
601
+ 查看日志:
602
+ - **Claude Desktop macOS**:`~/Library/Logs/Claude/mcp*.log`
603
+ - **Claude Desktop Windows**:`%APPDATA%\Claude\logs\mcp*.log`
604
+ - **Cursor**:Output 面板 > MCP
605
+
606
+ ### "TOS 上传失败"
607
+
608
+ 通常是签名不匹配,请确认 `IMAGE_API_BASE_URL`(未配置时回落到 `HTTP_API_BASE_URL`)和 `API_KEY` 正确且有效。
609
+
610
+ ## 全局安装(可选)
611
+
612
+ 如果你不想每次都用 `npx`:
613
+
614
+ ```bash
615
+ npm install -g @avclabs.ai/media-mcp
616
+ ```
617
+
618
+ 然后在配置中使用 `"command": "media-mcp"` 配合 `"args": ["--api-key", "your-api-key"]` 。
619
+
620
+ ## 开发与发布
621
+
622
+ 本包运行在 MCP 客户端本机,并通过 npm 发布;它不是部署到远程服务器的 Node 常驻进程。发布前验证工作区:
623
+
624
+ ```bash
625
+ npm ci
626
+ npm run release:verify
627
+ ```
628
+
629
+ 维护者请查阅[发布指南](https://github.com/avclabs/media-mcp/blob/main/docs/RELEASE.md)了解当前发布状态、版本同步、发布顺序、冒烟测试以及与门户/后端部署的关系。
630
+
631
+ ## License
632
+
633
+ MIT License - 详见 [LICENSE](LICENSE) 文件
package/config.json CHANGED
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "baseUrl": "https://mcp.avc.ai/enhance",
3
+ "imageBaseUrl": null,
3
4
  "sam3BaseUrl": "https://mcp.avc.ai/sam"
4
5
  }
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function setupImageEnhancementTools(server: McpServer, baseUrl: string, apiKey: string): void;
3
+ //# sourceMappingURL=image-enhancement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-enhancement.d.ts","sourceRoot":"","sources":["../src/image-enhancement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAwEnG"}