video-context-mcp-server 0.40.1-beta → 0.42.0-beta

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.
Files changed (54) hide show
  1. package/README.md +129 -39
  2. package/dist/generated/version.d.ts +1 -1
  3. package/dist/generated/version.js +1 -1
  4. package/dist/index.js +4 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/services/ffmpeg.d.ts +11 -0
  7. package/dist/services/ffmpeg.d.ts.map +1 -1
  8. package/dist/services/ffmpeg.js +36 -0
  9. package/dist/services/ffmpeg.js.map +1 -1
  10. package/dist/services/providerRouter.d.ts +6 -5
  11. package/dist/services/providerRouter.d.ts.map +1 -1
  12. package/dist/services/providerRouter.js +36 -15
  13. package/dist/services/providerRouter.js.map +1 -1
  14. package/dist/services/qwenClient.d.ts +59 -0
  15. package/dist/services/qwenClient.d.ts.map +1 -0
  16. package/dist/services/qwenClient.js +174 -0
  17. package/dist/services/qwenClient.js.map +1 -0
  18. package/dist/services/s3Relay.d.ts +48 -0
  19. package/dist/services/s3Relay.d.ts.map +1 -0
  20. package/dist/services/s3Relay.js +117 -0
  21. package/dist/services/s3Relay.js.map +1 -0
  22. package/dist/tools/analyzeVideo.d.ts.map +1 -1
  23. package/dist/tools/analyzeVideo.js +15 -3
  24. package/dist/tools/analyzeVideo.js.map +1 -1
  25. package/dist/tools/extractFrames.d.ts.map +1 -1
  26. package/dist/tools/extractFrames.js +12 -3
  27. package/dist/tools/extractFrames.js.map +1 -1
  28. package/dist/tools/orchestrator.d.ts +4 -2
  29. package/dist/tools/orchestrator.d.ts.map +1 -1
  30. package/dist/tools/orchestrator.js +49 -15
  31. package/dist/tools/orchestrator.js.map +1 -1
  32. package/dist/tools/schemas.d.ts +20 -13
  33. package/dist/tools/schemas.d.ts.map +1 -1
  34. package/dist/tools/schemas.js +16 -6
  35. package/dist/tools/schemas.js.map +1 -1
  36. package/dist/tools/searchTimestamp.d.ts.map +1 -1
  37. package/dist/tools/searchTimestamp.js +22 -15
  38. package/dist/tools/searchTimestamp.js.map +1 -1
  39. package/dist/tools/summarizeVideo.d.ts.map +1 -1
  40. package/dist/tools/summarizeVideo.js +43 -8
  41. package/dist/tools/summarizeVideo.js.map +1 -1
  42. package/dist/tools/transcribeVideo.d.ts +1 -1
  43. package/dist/tools/transcribeVideo.d.ts.map +1 -1
  44. package/dist/tools/transcribeVideo.js +12 -2
  45. package/dist/tools/transcribeVideo.js.map +1 -1
  46. package/dist/utils/artifactCache.d.ts +1 -0
  47. package/dist/utils/artifactCache.d.ts.map +1 -1
  48. package/dist/utils/artifactCache.js +3 -0
  49. package/dist/utils/artifactCache.js.map +1 -1
  50. package/dist/utils/audioUtils.d.ts +26 -0
  51. package/dist/utils/audioUtils.d.ts.map +1 -1
  52. package/dist/utils/audioUtils.js +80 -0
  53. package/dist/utils/audioUtils.js.map +1 -1
  54. package/package.json +4 -2
package/README.md CHANGED
@@ -12,10 +12,10 @@ An MCP server that gives coding assistants (GitHub Copilot, Cursor, Claude Code)
12
12
  - 🖼️ **Frame Extraction** — Extract frames at specific timestamps or intervals
13
13
  - 🔍 **Timestamp Search** — Find the exact moment when something happens in a video
14
14
  - 📊 **Video Metadata** — Get duration, resolution, fps, codec, and other technical details
15
- - 🎙️ **Audio Transcription** — Transcribe speech with paragraph-level timestamps (`[MM:SS]`) using Deepgram, AssemblyAI, Groq/Whisper, or Gemini
15
+ - 🎙️ **Audio Transcription** — Transcribe speech with paragraph-level timestamps (`[MM:SS]`) or export as SRT/VTT subtitles and JSON using Deepgram, AssemblyAI, Groq/Whisper, or Gemini
16
16
  - 🔊 **Speaker Diarization** — Identify who said what (Deepgram and AssemblyAI)
17
- - 🔊 **Audio-Enhanced Analysis** — Auto-transcribes audio and injects transcripts into AI prompts for richer results (GLM/Kimi only)
18
- - 🔄 **Multi-Provider Support** — Choose between GLM-4.6V, Kimi K2.5, or Gemini
17
+ - 🔊 **Audio-Enhanced Analysis** — Auto-transcribes audio and injects transcripts into AI prompts for richer results (GLM/Kimi/Qwen)
18
+ - 🔄 **Multi-Provider Support** — Choose between GLM-4.6V, Qwen3.5, Kimi K2.5, or Gemini
19
19
  - 🎯 **Smart Video Handling** — Extracts keyframes from long videos to reduce token usage
20
20
  - ⭐ **Pro tier** — Extended frame extraction, multi-platform downloads, higher resolution. [Learn more ↓](#pro)
21
21
 
@@ -62,6 +62,7 @@ Create or update `.vscode/mcp.json` in your workspace:
62
62
  "command": "video-context-mcp",
63
63
  "env": {
64
64
  "Z_AI_API_KEY": "your-zai-key",
65
+ "DASHSCOPE_API_KEY": "your-dashscope-key",
65
66
  "MOONSHOT_API_KEY": "your-moonshot-key",
66
67
  "GEMINI_API_KEY": "your-gemini-key",
67
68
  "DEEPGRAM_API_KEY": "your-deepgram-key",
@@ -89,6 +90,7 @@ Add to your Cursor MCP configuration (global or project-level):
89
90
  "command": "video-context-mcp",
90
91
  "env": {
91
92
  "Z_AI_API_KEY": "your-zai-key",
93
+ "DASHSCOPE_API_KEY": "your-dashscope-key",
92
94
  "MOONSHOT_API_KEY": "your-moonshot-key",
93
95
  "GEMINI_API_KEY": "your-gemini-key",
94
96
  "DEEPGRAM_API_KEY": "your-deepgram-key",
@@ -110,6 +112,7 @@ Add to your Cursor MCP configuration (global or project-level):
110
112
  ```bash
111
113
  claude mcp add \
112
114
  --env Z_AI_API_KEY=your-zai-key \
115
+ --env DASHSCOPE_API_KEY=your-dashscope-key \
113
116
  --env MOONSHOT_API_KEY=your-moonshot-key \
114
117
  --env GEMINI_API_KEY=your-gemini-key \
115
118
  --env DEEPGRAM_API_KEY=your-deepgram-key \
@@ -133,6 +136,7 @@ Create `.mcp.json` in your project root:
133
136
  "command": "video-context-mcp",
134
137
  "env": {
135
138
  "Z_AI_API_KEY": "your-zai-key",
139
+ "DASHSCOPE_API_KEY": "your-dashscope-key",
136
140
  "MOONSHOT_API_KEY": "your-moonshot-key",
137
141
  "GEMINI_API_KEY": "your-gemini-key",
138
142
  "DEEPGRAM_API_KEY": "your-deepgram-key",
@@ -162,6 +166,7 @@ Use `npx -y video-context-mcp-server@latest` as the command instead of `video-co
162
166
  "args": ["-y", "video-context-mcp-server@latest"],
163
167
  "env": {
164
168
  "Z_AI_API_KEY": "your-zai-key",
169
+ "DASHSCOPE_API_KEY": "your-dashscope-key",
165
170
  "MOONSHOT_API_KEY": "your-moonshot-key",
166
171
  "GEMINI_API_KEY": "your-gemini-key",
167
172
  "DEEPGRAM_API_KEY": "your-deepgram-key",
@@ -178,6 +183,7 @@ Use `npx -y video-context-mcp-server@latest` as the command instead of `video-co
178
183
  ```bash
179
184
  claude mcp add \
180
185
  --env Z_AI_API_KEY=your-zai-key \
186
+ --env DASHSCOPE_API_KEY=your-dashscope-key \
181
187
  --env MOONSHOT_API_KEY=your-moonshot-key \
182
188
  --env GEMINI_API_KEY=your-gemini-key \
183
189
  --env DEEPGRAM_API_KEY=your-deepgram-key \
@@ -194,14 +200,14 @@ claude mcp add \
194
200
 
195
201
  ## Available Tools
196
202
 
197
- | Tool | Description | Key Parameters |
198
- | ------------------ | ------------------------------------ | ---------------------------------------------------------------------------- |
199
- | `analyze_video` | Ask questions about video content | `videoPath`, `question`, `provider?` |
200
- | `summarize_video` | Generate a structured video summary | `videoPath`, `provider?` |
201
- | `extract_frames` | Extract frames from a video | `videoPath`, `mode`, `count/intervalSec/timestamps`, `maxImages?`, `offset?` |
202
- | `search_timestamp` | Find when something specific happens | `videoPath`, `query`, `provider?` |
203
- | `get_video_info` | Get video metadata | `videoPath` |
204
- | `transcribe_video` | Transcribe audio/speech from a video | `videoPath`, `provider?`, `language?`, `diarize?`, `translate?` |
203
+ | Tool | Description | Key Parameters |
204
+ | ------------------ | ------------------------------------ | ------------------------------------------------------------------------------------------- |
205
+ | `analyze_video` | Ask questions about video content | `videoPath`, `question`, `provider?` |
206
+ | `summarize_video` | Generate a structured video summary | `videoPath`, `provider?` |
207
+ | `extract_frames` | Extract frames from a video | `videoPath`, `mode`, `count/intervalSec/timestamps/sceneThreshold`, `maxImages?`, `offset?` |
208
+ | `search_timestamp` | Find when something specific happens | `videoPath`, `query`, `provider?` |
209
+ | `get_video_info` | Get video metadata | `videoPath` |
210
+ | `transcribe_video` | Transcribe audio/speech from a video | `videoPath`, `provider?`, `language?`, `diarize?`, `translate?`, `outputFormat?` |
205
211
 
206
212
  All tools accept local file paths, `file://` URIs, and remote `http(s)` URLs. Remote videos are downloaded automatically.
207
213
 
@@ -215,12 +221,18 @@ All tools accept local file paths, `file://` URIs, and remote `http(s)` URLs. Re
215
221
 
216
222
  > "Extract 5 evenly-spaced frames from `./recording.mp4`"
217
223
 
224
+ > "Extract frames at scene changes from `./video.mp4`" (set `mode: scene`)
225
+
218
226
  > "At what timestamp does the person wave in `./clip.mp4`?"
219
227
 
220
228
  > "Transcribe `./interview.mp4` with speaker diarization using AssemblyAI"
221
229
 
222
230
  > "Transcribe this Spanish video and translate it to English: `./video.mp4`"
223
231
 
232
+ > "Generate SRT subtitles for `./interview.mp4`" (set `outputFormat: srt`)
233
+
234
+ > "Export a WebVTT subtitle file from `./talk.mp4`" (set `outputFormat: vtt`)
235
+
224
236
  **Remote video files** (direct URLs — works for all users)
225
237
 
226
238
  > "Analyze this video: `https://example.com/product-demo.mp4`"
@@ -241,19 +253,21 @@ All tools accept local file paths, `file://` URIs, and remote `http(s)` URLs. Re
241
253
 
242
254
  ### Video Providers
243
255
 
244
- Set all three keys to get the full fallback chain. The server will try GLM first, then Kimi, then Gemini, so having all keys ensures it never gets stuck without a working provider:
256
+ Set all keys to get the full fallback chain. The server will try GLM first, then Qwen, then Kimi, then Gemini, so having all keys ensures it never gets stuck without a working provider:
245
257
 
246
- | Provider | Key | Link |
247
- | -------------------------------------- | ------------------ | ------------------------------------------------- |
248
- | **GLM-4.6V** (default, free-tier) | `Z_AI_API_KEY` | [Get key](https://z.ai/manage-apikey/apikey-list) |
249
- | **Kimi K2.5** | `MOONSHOT_API_KEY` | [Get key](https://platform.moonshot.ai) |
250
- | **Gemini 3 Flash Preview** (free-tier) | `GEMINI_API_KEY` | [Get key](https://aistudio.google.com/app/apikey) |
258
+ | Provider | Key | Link |
259
+ | -------------------------------------- | ------------------- | --------------------------------------------------------------------------------------------- |
260
+ | **GLM-4.6V** (default, free-tier) | `Z_AI_API_KEY` | [Get key](https://z.ai/manage-apikey/apikey-list) |
261
+ | **Qwen3.5** (free credits) | `DASHSCOPE_API_KEY` | [Get key](https://modelstudio.console.alibabacloud.com/ap-southeast-1?tab=dashboard#/api-key) |
262
+ | **Kimi K2.5** | `MOONSHOT_API_KEY` | [Get key](https://platform.moonshot.ai) |
263
+ | **Gemini 3 Flash Preview** (free-tier) | `GEMINI_API_KEY` | [Get key](https://aistudio.google.com/app/apikey) |
251
264
 
252
265
  When a provider's API key is missing or its API call fails at runtime, tools automatically fall back through the remaining providers in priority order, starting from the configured default:
253
266
 
254
- - GLM default (standard): **GLM → Kimi → Gemini**
255
- - Kimi default: **Kimi → GLM → Gemini**
256
- - Gemini default: **Gemini → GLM → Kimi**
267
+ - GLM default (standard): **GLM → Qwen → Kimi → Gemini**
268
+ - Qwen default: **Qwen → GLM → Kimi → Gemini**
269
+ - Kimi default: **Kimi → GLM → Qwen → Gemini**
270
+ - Gemini default: **Gemini → GLM → Qwen → Kimi**
257
271
 
258
272
  ### Audio Providers
259
273
 
@@ -274,17 +288,72 @@ When an audio key is missing or an audio API call fails at runtime, tools automa
274
288
 
275
289
  ### Video Providers
276
290
 
277
- | Feature | GLM-4.6V (default) | Kimi K2.5 | Gemini 3 Flash Preview |
278
- | -------------- | ------------------------------------ | ---------------------------------------------- | ---------------------------------------------- |
279
- | Price | Free tier available (GLM-4.6V-Flash) | $0.60 input / $3.00 output per 1M tokens | Free tier available |
280
- | Video formats | mp4, avi, mov, wmv, webm, m4v | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp |
281
- | Context window | 128K tokens | 256K tokens | 1M tokens |
282
- | Max file size | ~20 MB (base64) | 100 MB | 2 GB |
283
- | Best for | **Default** — free, good accuracy | Broader format support | Last-resort fallback only |
291
+ | Feature | GLM-4.6V (default) | Qwen3.5 | Kimi K2.5 | Gemini 3 Flash Preview |
292
+ | -------------- | ------------------------------------ | --------------------------------- | ---------------------------------------------- | ---------------------------------------------- |
293
+ | Price | Free tier available (GLM-4.6V-Flash) | Free credits (1M tokens, 90 days) | $0.60 input / $3.00 output per 1M tokens | Free tier available |
294
+ | Video formats | mp4, avi, mov, wmv, webm, m4v | mp4, avi, mov, wmv, webm, m4v | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp |
295
+ | Context window | 128K tokens | 128K tokens | 256K tokens | 1M tokens |
296
+ | Max file size | ~12 MB (base64) | ~10 MB (base64) | 100 MB | 2 GB |
297
+ | Best for | **Default** — free, good accuracy | Free alternative to GLM | Broader format support | Last-resort fallback only |
298
+
299
+ **GLM-4.6V** is the default — it offers a free tier, making it a good zero-cost starting point. **Qwen3.5** offers free credits (1M tokens for 90 days) with a similar feature set. **Kimi K2.5** is a paid alternative with broader format support. **Gemini** is also free and used as a last-resort fallback — despite superior technical specs, it has proven inaccurate for video analysis in practice.
300
+
301
+ Set `VIDEO_MCP_DEFAULT_PROVIDER=qwen`, `kimi`, or `gemini` to change the default.
302
+
303
+ <details>
304
+ <summary><strong>Automatic S3 relay: bypass the 10 MB local file limit with Qwen and GLM</strong></summary>
305
+
306
+ **GLM-4.6V** and **Qwen3.5** both accept direct video URLs, but base64-encoding a local file caps out at **10–12 MB**. Set `AWS_S3_BUCKET` to have the server automatically upload local videos (and platform downloads from YouTube, Bilibili, etc.) to S3 and pass a presigned URL to GLM/Qwen — no manual upload step needed.
307
+
308
+ **Why it works**: Qwen and GLM require the server to serve `Content-Length` and `Content-Type` headers alongside the video. AWS S3 provides these automatically.
309
+
310
+ **One-time setup**
311
+
312
+ ```bash
313
+ # 1. Create a bucket
314
+ aws s3 mb s3://my-video-analysis
315
+
316
+ # 2. Add AWS_S3_BUCKET to your .vscode/mcp.json env block
317
+ ```
318
+
319
+ AWS credentials are resolved automatically in this order:
320
+
321
+ 1. **Environment variables** — add these to your `mcp.json` env block (no AWS CLI required):
322
+ ```jsonc
323
+ // .vscode/mcp.json — env section
324
+ {
325
+ "AWS_S3_BUCKET": "my-video-analysis",
326
+ "AWS_ACCESS_KEY_ID": "AKIA...",
327
+ "AWS_SECRET_ACCESS_KEY": "your-secret-key",
328
+ "AWS_REGION": "us-east-1",
329
+ }
330
+ ```
331
+ 2. **`~/.aws/credentials`** — if you have the AWS CLI configured, credentials are picked up automatically; only `AWS_S3_BUCKET` is needed:
332
+ ```jsonc
333
+ // .vscode/mcp.json — env section
334
+ {
335
+ "AWS_S3_BUCKET": "my-video-analysis",
336
+ }
337
+ ```
338
+ 3. **IAM instance role / ECS task role** — for AWS-hosted environments.
339
+
340
+ That's it. Every time you analyze a local video (or a YouTube/Bilibili download) with GLM or Qwen, the server uploads it to S3, uses the presigned URL, and leaves the object in the bucket for reuse.
341
+
342
+ **Optional:** Set `AWS_S3_RELAY_CLEANUP=true` to delete all relayed objects when the MCP server session ends. Objects uploaded during a session are reused across multiple tool calls before being cleaned up at exit.
343
+
344
+ **Cost**: AWS S3 free tier covers 5 GB storage + 20K GET requests/month for 12 months. After the free tier, storage is roughly $0.023/GB/month.
345
+
346
+ **Still want direct URLs?** Pass a presigned URL manually:
347
+
348
+ ```bash
349
+ aws s3 cp my-video.mp4 s3://my-video-analysis/my-video.mp4
350
+ aws s3 presign s3://my-video-analysis/my-video.mp4 --expires-in 3600
351
+ # returns: https://my-video-analysis.s3.amazonaws.com/my-video.mp4?X-Amz-...
352
+ ```
284
353
 
285
- **GLM-4.6V** is the default it offers a free tier, making it a good zero-cost starting point. **Kimi K2.5** is a paid alternative with broader format support. **Gemini** is also free and used as a last-resort fallback — despite superior technical specs, it has proven inaccurate for video analysis in practice.
354
+ Then pass the URL directly to `analyze_video` or `summarize_video`.
286
355
 
287
- Set `VIDEO_MCP_DEFAULT_PROVIDER=kimi` or `gemini` to change the default.
356
+ </details>
288
357
 
289
358
  ### Audio Providers
290
359
 
@@ -305,12 +374,23 @@ Set `AUDIO_MCP_DEFAULT_PROVIDER` to change the default.
305
374
 
306
375
  ### Core
307
376
 
308
- | Variable | Description | Default |
309
- | ---------------------------- | -------------------------------------------------- | ------- |
310
- | `Z_AI_API_KEY` | Z.AI API key for GLM-4.6V | — |
311
- | `MOONSHOT_API_KEY` | Moonshot AI API key for Kimi K2.5 | — |
312
- | `GEMINI_API_KEY` | Google API key for Gemini | — |
313
- | `VIDEO_MCP_DEFAULT_PROVIDER` | Default video provider: `glm`, `kimi`, or `gemini` | `glm` |
377
+ | Variable | Description | Default |
378
+ | ---------------------------- | ---------------------------------------------------------- | ------- |
379
+ | `Z_AI_API_KEY` | Z.AI API key for GLM-4.6V | — |
380
+ | `DASHSCOPE_API_KEY` | Alibaba Cloud API key for Qwen3.5 | — |
381
+ | `MOONSHOT_API_KEY` | Moonshot AI API key for Kimi K2.5 | — |
382
+ | `GEMINI_API_KEY` | Google API key for Gemini | |
383
+ | `VIDEO_MCP_DEFAULT_PROVIDER` | Default video provider: `glm`, `qwen`, `kimi`, or `gemini` | `glm` |
384
+
385
+ ### S3 Relay
386
+
387
+ | Variable | Description | Default |
388
+ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
389
+ | `AWS_S3_BUCKET` | S3 bucket name for automatic video relay. When set, local videos (and platform downloads) are uploaded to S3 and GLM/Qwen receive a presigned URL — bypassing the 10–12 MB base64 limit. | — |
390
+ | `AWS_ACCESS_KEY_ID` | AWS access key ID. Required if you are not using `~/.aws/credentials` or an IAM role. | — |
391
+ | `AWS_SECRET_ACCESS_KEY` | AWS secret access key. Required alongside `AWS_ACCESS_KEY_ID`. | — |
392
+ | `AWS_REGION` | AWS region for the S3 bucket (e.g. `us-east-1`). Required if not set in `~/.aws/config`. | — |
393
+ | `AWS_S3_RELAY_CLEANUP` | When `true`, delete all relayed S3 objects when the MCP server session ends (process exit). Default: objects are kept in the bucket for reuse across sessions. | — |
314
394
 
315
395
  ### Audio
316
396
 
@@ -320,7 +400,7 @@ Set `AUDIO_MCP_DEFAULT_PROVIDER` to change the default.
320
400
  | `ASSEMBLYAI_API_KEY` | AssemblyAI API key | — |
321
401
  | `GROQ_API_KEY` | Groq API key for Whisper transcription | — |
322
402
  | `AUDIO_MCP_DEFAULT_PROVIDER` | Default audio provider: `deepgram`, `assemblyai`, `groq`, or `gemini`. Falls back in that order when the selected key is missing. | `deepgram` |
323
- | `AUDIO_ENHANCE_VIDEO_ANALYSIS` | Inject audio transcripts into `analyze_video`/`summarize_video` prompts (GLM/Kimi only). `auto` = transcribe when audio track detected; `true` = always; `false` = disabled. | `auto` |
403
+ | `AUDIO_ENHANCE_VIDEO_ANALYSIS` | Inject audio transcripts into `analyze_video`/`summarize_video` prompts (GLM/Kimi/Qwen). `auto` = transcribe when audio track detected; `true` = always; `false` = disabled. | `auto` |
324
404
 
325
405
  ### Caching
326
406
 
@@ -393,9 +473,15 @@ vmcp cache clear:all --yes # skip confirmation
393
473
 
394
474
  ### Video Summarization
395
475
 
396
- | Variable | Description | Default |
397
- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
398
- | `VIDEO_MCP_MAX_FRAMES` | Max keyframes for `summarize_video` (GLM/Kimi only; Gemini uploads full video). **Free**: clamped 5–50. **Pro**: default 100; set `0` for uncapped. Either way, trailing frames are automatically dropped if the total payload exceeds the provider's size limit (12 MB for GLM, 80 MB for Kimi). | `50` free / `100` pro |
476
+ | Variable | Description | Default |
477
+ | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
478
+ | `VIDEO_MCP_MAX_FRAMES` | Max keyframes for `summarize_video` (GLM/Kimi/Qwen only; Gemini uploads full video). **Free**: clamped 5–50. **Pro**: default 100; set `0` for uncapped. Either way, trailing frames are automatically dropped if the total payload exceeds the provider's size limit (12 MB for GLM, 10 MB for Qwen, 80 MB for Kimi). | `50` free / `100` pro |
479
+
480
+ ### Qwen
481
+
482
+ | Variable | Description | Default |
483
+ | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
484
+ | `QWEN_BASE_URL` | Override the DashScope API endpoint. Use for regional routing: Singapore (default), Virginia (`https://dashscope-us.aliyuncs.com/compatible-mode/v1/chat/completions`), or Beijing (`https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`). | `https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions` |
399
485
 
400
486
  ### yt-dlp (Platform Downloads)
401
487
 
@@ -424,6 +510,7 @@ vmcp cache clear:all --yes # skip confirmation
424
510
  "command": "video-context-mcp",
425
511
  "env": {
426
512
  "Z_AI_API_KEY": "your-zai-key",
513
+ "DASHSCOPE_API_KEY": "your-dashscope-key",
427
514
  "MOONSHOT_API_KEY": "your-moonshot-key",
428
515
  "GEMINI_API_KEY": "your-gemini-key",
429
516
  "DEEPGRAM_API_KEY": "your-deepgram-key",
@@ -439,6 +526,7 @@ vmcp cache clear:all --yes # skip confirmation
439
526
  "YT_DLP_PATH": "/usr/local/bin/yt-dlp",
440
527
  "YT_DLP_COOKIES_FILE": "/path/to/cookies.txt",
441
528
  "YT_DLP_IMPERSONATE": "chrome",
529
+ "AWS_S3_BUCKET": "my-video-analysis",
442
530
  "VIDEO_MCP_LICENSE_KEY": "your-license-key"
443
531
  }
444
532
  }
@@ -559,6 +647,7 @@ Use this `.vscode/mcp.json` to run the local build (never commit this file):
559
647
  "args": ["${workspaceFolder}/dist/index.js"],
560
648
  "env": {
561
649
  "Z_AI_API_KEY": "your-zai-key",
650
+ "DASHSCOPE_API_KEY": "your-dashscope-key",
562
651
  "MOONSHOT_API_KEY": "your-moonshot-key",
563
652
  "GEMINI_API_KEY": "your-gemini-key",
564
653
  "VIDEO_MCP_DEFAULT_PROVIDER": "glm",
@@ -605,6 +694,7 @@ Proprietary — All Rights Reserved. No part of this software may be copied, mod
605
694
  - [MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk) by Anthropic
606
695
  - [Kimi K2.5](https://github.com/MoonshotAI/Kimi-K2.5) by Moonshot AI
607
696
  - [GLM-4.6V](https://docs.z.ai/guides/vlm/glm-4.6v) by Z.AI
697
+ - [Qwen3.5](https://bailian.console.alibabacloud.com/ap-southeast-1/) by Alibaba Cloud
608
698
  - [Deepgram](https://www.deepgram.com/) for audio transcription
609
699
  - [AssemblyAI](https://www.assemblyai.com/) for audio transcription
610
700
  - [Groq/Whisper](https://console.groq.com/) for audio transcription
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.40.1-beta";
1
+ export declare const VERSION = "0.42.0-beta";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by scripts/sync-version.ts — do not edit
2
- export const VERSION = '0.40.1-beta';
2
+ export const VERSION = '0.42.0-beta';
3
3
  //# sourceMappingURL=version.js.map
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ import { setLoggerServer } from './utils/logger.js';
12
12
  import { initLicenseValidation } from './utils/license.js';
13
13
  import { sweepStaleTempDirs } from './utils/tempFiles.js';
14
14
  import { sweepExpiredCacheDirs } from './utils/artifactCache.js';
15
+ import { registerSessionCleanup } from './services/s3Relay.js';
15
16
  import { triggerUpdateCheck, waitForUpdateCheck, wrapWithUpdateNotice, } from './utils/updateCheck.js';
16
17
  import { VERSION } from './generated/version.js';
17
18
  import { analyzeVideoSchema, summarizeVideoSchema, extractFramesSchema, searchTimestampSchema, getVideoInfoSchema, transcribeVideoSchema, } from './tools/schemas.js';
@@ -31,6 +32,8 @@ async function main() {
31
32
  });
32
33
  // Wire up the logger so tools can emit progress notifications
33
34
  setLoggerServer(server);
35
+ // Register S3 relay session-end cleanup (no-op unless AWS_S3_RELAY_CLEANUP=true)
36
+ registerSessionCleanup();
34
37
  // Clean up orphaned temp directories from previous runs that were killed mid-call
35
38
  sweepStaleTempDirs().catch(() => { }); // fire-and-forget
36
39
  // Remove expired per-video artifact directories from the persistent cache
@@ -58,7 +61,7 @@ async function main() {
58
61
  // Tool 2: summarize_video - Generate structured video summary
59
62
  server.registerTool('summarize_video', {
60
63
  title: 'Summarize Video',
61
- description: 'Generate a structured summary of the video including overview, key scenes, and timeline. For long videos (>5 min), extracts keyframes to reduce token usage (unless using Gemini, which processes natively).',
64
+ description: "Generate a structured summary of the video including overview, key scenes, and timeline. For long videos (>5 min), extracts keyframes to reduce token usage (unless using Gemini, which processes natively). Provider options: 'glm' (default), 'qwen', 'kimi', 'gemini'.",
62
65
  inputSchema: summarizeVideoSchema,
63
66
  }, withUpdateCheck(summarizeVideoTool));
64
67
  // Tool 3: extract_frames - Extract frames from video
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,17 @@ export declare function extractFramesAtInterval(videoPath: string, intervalSec:
57
57
  * @returns Array of JPEG buffers (same order as timestamps)
58
58
  */
59
59
  export declare function extractFramesAtTimestamps(videoPath: string, timestamps: number[]): Promise<Buffer[]>;
60
+ /**
61
+ * Detect scene change timestamps using ffmpeg's scene detection filter.
62
+ *
63
+ * Runs the `select='gt(scene,T)',showinfo` filter with no output (null muxer)
64
+ * and parses `pts_time:` values from the showinfo stderr output.
65
+ *
66
+ * @param videoPath - Path to the video file
67
+ * @param threshold - Scene change sensitivity (0.1–0.9; default recommended: 0.3)
68
+ * @returns Sorted array of timestamps (in seconds) where scene changes were detected
69
+ */
70
+ export declare function detectSceneTimestamps(videoPath: string, threshold: number): Promise<number[]>;
60
71
  /**
61
72
  * Extract audio from a video file to a compressed .m4a file
62
73
  * @param videoPath - Path to the video file
@@ -1 +1 @@
1
- {"version":3,"file":"ffmpeg.d.ts","sourceRoot":"","sources":["../../src/services/ffmpeg.ts"],"names":[],"mappings":"AASA,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,IAAI,CAQjC;AA+BD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA2BxB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf"}
1
+ {"version":3,"file":"ffmpeg.d.ts","sourceRoot":"","sources":["../../src/services/ffmpeg.ts"],"names":[],"mappings":"AASA,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,IAAI,CAQjC;AA+BD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA2BxB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -198,6 +198,42 @@ export async function extractFramesAtTimestamps(videoPath, timestamps) {
198
198
  await rm(tempDir, { recursive: true, force: true });
199
199
  }
200
200
  }
201
+ /**
202
+ * Detect scene change timestamps using ffmpeg's scene detection filter.
203
+ *
204
+ * Runs the `select='gt(scene,T)',showinfo` filter with no output (null muxer)
205
+ * and parses `pts_time:` values from the showinfo stderr output.
206
+ *
207
+ * @param videoPath - Path to the video file
208
+ * @param threshold - Scene change sensitivity (0.1–0.9; default recommended: 0.3)
209
+ * @returns Sorted array of timestamps (in seconds) where scene changes were detected
210
+ */
211
+ export async function detectSceneTimestamps(videoPath, threshold) {
212
+ const stderrLines = [];
213
+ await new Promise((resolve, reject) => {
214
+ ffmpeg(videoPath)
215
+ .outputOptions([
216
+ `-vf select='gt(scene,${threshold})',showinfo`,
217
+ '-vsync vfr',
218
+ '-an',
219
+ '-f null',
220
+ ])
221
+ .output('-')
222
+ .on('stderr', (line) => stderrLines.push(line))
223
+ .on('end', () => resolve())
224
+ .on('error', reject)
225
+ .run();
226
+ });
227
+ const timestamps = [];
228
+ const regex = /pts_time:([\d.]+)/;
229
+ for (const line of stderrLines) {
230
+ const match = regex.exec(line);
231
+ if (match) {
232
+ timestamps.push(parseFloat(match[1]));
233
+ }
234
+ }
235
+ return timestamps.sort((a, b) => a - b);
236
+ }
201
237
  /**
202
238
  * Extract audio from a video file to a compressed .m4a file
203
239
  * @param videoPath - Path to the video file
@@ -1 +1 @@
1
- {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/services/ffmpeg.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/services/ffmpeg.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,17 @@
2
2
  * Provider Selection
3
3
  * Determines which AI backend to use based on user preference
4
4
  */
5
- export type VideoProvider = 'glm' | 'kimi' | 'gemini';
5
+ export type VideoProvider = 'glm' | 'kimi' | 'gemini' | 'qwen';
6
6
  /**
7
7
  * Validate that the selected provider has a configured API key
8
- * @param provider - User-specified provider ('glm', 'kimi', or 'gemini')
8
+ * @param provider - User-specified provider ('glm', 'kimi', 'gemini', or 'qwen')
9
9
  * @param hasKimiKey - Whether Kimi API key is available
10
10
  * @param hasGLMKey - Whether GLM API key is available
11
11
  * @param hasGeminiKey - Whether Gemini API key is available
12
+ * @param hasQwenKey - Whether Qwen API key is available
12
13
  * @returns The validated provider
13
14
  */
14
- export declare function selectProvider(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean): VideoProvider;
15
+ export declare function selectProvider(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean): VideoProvider;
15
16
  /**
16
17
  * Result type returned by resolveProviderWithFallback.
17
18
  * When `fallbackFrom` is set, the caller should notify the user that the
@@ -33,7 +34,7 @@ export type ProviderResult = {
33
34
  * Returns a ProviderResult with `fallbackFrom` set if a fallback occurred.
34
35
  * Throws only when no provider API key is available at all.
35
36
  */
36
- export declare function resolveProviderWithFallback(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean): ProviderResult;
37
+ export declare function resolveProviderWithFallback(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean): ProviderResult;
37
38
  /**
38
39
  * Get the default provider from environment variable
39
40
  */
@@ -52,7 +53,7 @@ export declare function getDefaultProvider(): VideoProvider;
52
53
  * This is used for runtime error-based fallback: if the first provider's API call
53
54
  * throws (overloaded, timeout, 5xx, etc.), the caller retries with the next entry.
54
55
  */
55
- export declare function getRuntimeFallbackChain(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean): VideoProvider[];
56
+ export declare function getRuntimeFallbackChain(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean): VideoProvider[];
56
57
  /**
57
58
  * Get the maximum number of frames to extract for summarization.
58
59
  *
@@ -1 +1 @@
1
- {"version":3,"file":"providerRouter.d.ts","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAErD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,aAAa,CAiBf;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,cAAc,CAqBhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAUlD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,aAAa,EAAE,CAcjB;AAQD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAQzC"}
1
+ {"version":3,"file":"providerRouter.d.ts","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,EAC7B,UAAU,GAAE,OAAe,GAC1B,aAAa,CAyBf;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,EAC7B,UAAU,GAAE,OAAe,GAC1B,cAAc,CAsBhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAWlD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,EAC7B,UAAU,GAAE,OAAe,GAC1B,aAAa,EAAE,CAejB;AAQD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAQzC"}