@studiomeyer/mcp-video 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- package/.github/workflows/ci.yml +34 -0
- package/CHANGELOG.md +24 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/USAGE.md +144 -0
- package/dist/handlers/capcut.d.ts +6 -0
- package/dist/handlers/capcut.js +229 -0
- package/dist/handlers/capcut.js.map +1 -0
- package/dist/handlers/editing.d.ts +6 -0
- package/dist/handlers/editing.js +242 -0
- package/dist/handlers/editing.js.map +1 -0
- package/dist/handlers/index.d.ts +2 -0
- package/dist/handlers/index.js +33 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/post-production.d.ts +5 -0
- package/dist/handlers/post-production.js +109 -0
- package/dist/handlers/post-production.js.map +1 -0
- package/dist/handlers/smart-screenshot.d.ts +5 -0
- package/dist/handlers/smart-screenshot.js +83 -0
- package/dist/handlers/smart-screenshot.js.map +1 -0
- package/dist/handlers/tts.d.ts +5 -0
- package/dist/handlers/tts.js +83 -0
- package/dist/handlers/tts.js.map +1 -0
- package/dist/handlers/video.d.ts +5 -0
- package/dist/handlers/video.js +127 -0
- package/dist/handlers/video.js.map +1 -0
- package/dist/lib/dual-transport.d.ts +42 -0
- package/dist/lib/dual-transport.js +208 -0
- package/dist/lib/dual-transport.js.map +1 -0
- package/dist/lib/logger.d.ts +12 -0
- package/dist/lib/logger.js +42 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/types.d.ts +16 -0
- package/dist/lib/types.js +15 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/schemas/capcut.d.ts +608 -0
- package/dist/schemas/capcut.js +411 -0
- package/dist/schemas/capcut.js.map +1 -0
- package/dist/schemas/editing.d.ts +822 -0
- package/dist/schemas/editing.js +466 -0
- package/dist/schemas/editing.js.map +1 -0
- package/dist/schemas/index.d.ts +2366 -0
- package/dist/schemas/index.js +15 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/post-production.d.ts +379 -0
- package/dist/schemas/post-production.js +268 -0
- package/dist/schemas/post-production.js.map +1 -0
- package/dist/schemas/smart-screenshot.d.ts +127 -0
- package/dist/schemas/smart-screenshot.js +122 -0
- package/dist/schemas/smart-screenshot.js.map +1 -0
- package/dist/schemas/tts.d.ts +220 -0
- package/dist/schemas/tts.js +194 -0
- package/dist/schemas/tts.js.map +1 -0
- package/dist/schemas/video.d.ts +236 -0
- package/dist/schemas/video.js +210 -0
- package/dist/schemas/video.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.js +239 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +1 -0
- package/dist/server.test.js +87 -0
- package/dist/server.test.js.map +1 -0
- package/dist/tools/engine/audio-mixer.d.ts +40 -0
- package/dist/tools/engine/audio-mixer.js +169 -0
- package/dist/tools/engine/audio-mixer.js.map +1 -0
- package/dist/tools/engine/audio.d.ts +22 -0
- package/dist/tools/engine/audio.js +73 -0
- package/dist/tools/engine/audio.js.map +1 -0
- package/dist/tools/engine/beat-sync.d.ts +31 -0
- package/dist/tools/engine/beat-sync.js +270 -0
- package/dist/tools/engine/beat-sync.js.map +1 -0
- package/dist/tools/engine/capture.d.ts +12 -0
- package/dist/tools/engine/capture.js +290 -0
- package/dist/tools/engine/capture.js.map +1 -0
- package/dist/tools/engine/chroma-key.d.ts +27 -0
- package/dist/tools/engine/chroma-key.js +154 -0
- package/dist/tools/engine/chroma-key.js.map +1 -0
- package/dist/tools/engine/concat.d.ts +49 -0
- package/dist/tools/engine/concat.js +149 -0
- package/dist/tools/engine/concat.js.map +1 -0
- package/dist/tools/engine/cursor.d.ts +26 -0
- package/dist/tools/engine/cursor.js +185 -0
- package/dist/tools/engine/cursor.js.map +1 -0
- package/dist/tools/engine/easing.d.ts +15 -0
- package/dist/tools/engine/easing.js +100 -0
- package/dist/tools/engine/easing.js.map +1 -0
- package/dist/tools/engine/editing.d.ts +158 -0
- package/dist/tools/engine/editing.js +541 -0
- package/dist/tools/engine/editing.js.map +1 -0
- package/dist/tools/engine/encoder.d.ts +31 -0
- package/dist/tools/engine/encoder.js +154 -0
- package/dist/tools/engine/encoder.js.map +1 -0
- package/dist/tools/engine/index.d.ts +30 -0
- package/dist/tools/engine/index.js +23 -0
- package/dist/tools/engine/index.js.map +1 -0
- package/dist/tools/engine/lut-presets.d.ts +25 -0
- package/dist/tools/engine/lut-presets.js +141 -0
- package/dist/tools/engine/lut-presets.js.map +1 -0
- package/dist/tools/engine/narrated-video.d.ts +63 -0
- package/dist/tools/engine/narrated-video.js +163 -0
- package/dist/tools/engine/narrated-video.js.map +1 -0
- package/dist/tools/engine/scenes.d.ts +17 -0
- package/dist/tools/engine/scenes.js +223 -0
- package/dist/tools/engine/scenes.js.map +1 -0
- package/dist/tools/engine/smart-screenshot.d.ts +80 -0
- package/dist/tools/engine/smart-screenshot.js +744 -0
- package/dist/tools/engine/smart-screenshot.js.map +1 -0
- package/dist/tools/engine/social-format.d.ts +66 -0
- package/dist/tools/engine/social-format.js +107 -0
- package/dist/tools/engine/social-format.js.map +1 -0
- package/dist/tools/engine/template-renderer.d.ts +45 -0
- package/dist/tools/engine/template-renderer.js +233 -0
- package/dist/tools/engine/template-renderer.js.map +1 -0
- package/dist/tools/engine/templates.d.ts +87 -0
- package/dist/tools/engine/templates.js +272 -0
- package/dist/tools/engine/templates.js.map +1 -0
- package/dist/tools/engine/text-animations.d.ts +33 -0
- package/dist/tools/engine/text-animations.js +192 -0
- package/dist/tools/engine/text-animations.js.map +1 -0
- package/dist/tools/engine/text-overlay.d.ts +27 -0
- package/dist/tools/engine/text-overlay.js +84 -0
- package/dist/tools/engine/text-overlay.js.map +1 -0
- package/dist/tools/engine/tts.d.ts +54 -0
- package/dist/tools/engine/tts.js +186 -0
- package/dist/tools/engine/tts.js.map +1 -0
- package/dist/tools/engine/types.d.ts +166 -0
- package/dist/tools/engine/types.js +13 -0
- package/dist/tools/engine/types.js.map +1 -0
- package/dist/tools/engine/voice-effects.d.ts +18 -0
- package/dist/tools/engine/voice-effects.js +215 -0
- package/dist/tools/engine/voice-effects.js.map +1 -0
- package/dist/tools/index.d.ts +32 -0
- package/dist/tools/index.js +23 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +56 -0
- package/scripts/check-deps.js +39 -0
- package/src/handlers/capcut.ts +245 -0
- package/src/handlers/editing.ts +260 -0
- package/src/handlers/index.ts +34 -0
- package/src/handlers/post-production.ts +136 -0
- package/src/handlers/smart-screenshot.ts +86 -0
- package/src/handlers/tts.ts +103 -0
- package/src/handlers/video.ts +137 -0
- package/src/lib/dual-transport.ts +272 -0
- package/src/lib/logger.ts +59 -0
- package/src/lib/types.ts +25 -0
- package/src/schemas/capcut.ts +418 -0
- package/src/schemas/editing.ts +476 -0
- package/src/schemas/index.ts +15 -0
- package/src/schemas/post-production.ts +273 -0
- package/src/schemas/smart-screenshot.ts +122 -0
- package/src/schemas/tts.ts +197 -0
- package/src/schemas/video.ts +211 -0
- package/src/server.test.ts +99 -0
- package/src/server.ts +289 -0
- package/src/tools/engine/audio-mixer.ts +244 -0
- package/src/tools/engine/audio.ts +115 -0
- package/src/tools/engine/beat-sync.ts +356 -0
- package/src/tools/engine/capture.ts +360 -0
- package/src/tools/engine/chroma-key.ts +202 -0
- package/src/tools/engine/concat.ts +242 -0
- package/src/tools/engine/cursor.ts +222 -0
- package/src/tools/engine/easing.ts +120 -0
- package/src/tools/engine/editing.ts +809 -0
- package/src/tools/engine/encoder.ts +208 -0
- package/src/tools/engine/index.ts +33 -0
- package/src/tools/engine/lut-presets.ts +235 -0
- package/src/tools/engine/narrated-video.ts +267 -0
- package/src/tools/engine/scenes.ts +309 -0
- package/src/tools/engine/smart-screenshot.ts +923 -0
- package/src/tools/engine/social-format.ts +146 -0
- package/src/tools/engine/template-renderer.ts +294 -0
- package/src/tools/engine/templates.ts +370 -0
- package/src/tools/engine/text-animations.ts +282 -0
- package/src/tools/engine/text-overlay.ts +143 -0
- package/src/tools/engine/tts.ts +284 -0
- package/src/tools/engine/types.ts +191 -0
- package/src/tools/engine/voice-effects.ts +258 -0
- package/src/tools/index.ts +67 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +7 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-production tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { jsonResponse } from '../lib/types.js';
|
|
5
|
+
import { logger } from '../lib/logger.js';
|
|
6
|
+
import { addBackgroundMusic, concatenateVideos, generateIntro, convertToSocialFormat, convertToAllFormats, addTextOverlays, } from '../tools/index.js';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
const OUTPUT_DIR = process.env.VIDEO_OUTPUT_DIR || './output';
|
|
9
|
+
export const postProductionHandlers = {
|
|
10
|
+
add_background_music: async (args) => {
|
|
11
|
+
try {
|
|
12
|
+
const config = {
|
|
13
|
+
videoPath: args.videoPath,
|
|
14
|
+
musicPath: args.musicPath,
|
|
15
|
+
outputPath: args.outputPath ?? addSuffix(args.videoPath, '-music'),
|
|
16
|
+
musicVolume: args.musicVolume ?? 0.25,
|
|
17
|
+
fadeInDuration: args.fadeInDuration ?? 2,
|
|
18
|
+
fadeOutDuration: args.fadeOutDuration ?? 3,
|
|
19
|
+
loopMusic: args.loopMusic ?? true,
|
|
20
|
+
};
|
|
21
|
+
const result = await addBackgroundMusic(config);
|
|
22
|
+
return jsonResponse({ success: true, outputPath: result });
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
26
|
+
logger.error(`add_background_music failed: ${msg}`);
|
|
27
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
concatenate_videos: async (args) => {
|
|
31
|
+
try {
|
|
32
|
+
const result = await concatenateVideos({
|
|
33
|
+
clips: args.clips,
|
|
34
|
+
outputPath: args.outputPath,
|
|
35
|
+
transition: args.transition ?? 'fade',
|
|
36
|
+
transitionDuration: args.transitionDuration ?? 1,
|
|
37
|
+
});
|
|
38
|
+
return jsonResponse({ success: true, outputPath: result });
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
42
|
+
logger.error(`concatenate_videos failed: ${msg}`);
|
|
43
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
generate_intro: async (args) => {
|
|
47
|
+
try {
|
|
48
|
+
const result = await generateIntro({
|
|
49
|
+
text: args.text,
|
|
50
|
+
subtitle: args.subtitle,
|
|
51
|
+
duration: args.duration ?? 3,
|
|
52
|
+
backgroundColor: args.backgroundColor ?? '#0a0a0a',
|
|
53
|
+
textColor: args.textColor ?? 'white',
|
|
54
|
+
outputPath: args.outputPath,
|
|
55
|
+
});
|
|
56
|
+
return jsonResponse({ success: true, outputPath: result });
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
60
|
+
logger.error(`generate_intro failed: ${msg}`);
|
|
61
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
convert_social_format: async (args) => {
|
|
65
|
+
try {
|
|
66
|
+
const result = await convertToSocialFormat({
|
|
67
|
+
inputPath: args.inputPath,
|
|
68
|
+
outputPath: args.outputPath,
|
|
69
|
+
format: args.format,
|
|
70
|
+
strategy: args.strategy ?? 'blur-background',
|
|
71
|
+
});
|
|
72
|
+
return jsonResponse({ success: true, outputPath: result, format: args.format });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
76
|
+
logger.error(`convert_social_format failed: ${msg}`);
|
|
77
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
convert_all_social_formats: async (args) => {
|
|
81
|
+
try {
|
|
82
|
+
const formats = args.formats;
|
|
83
|
+
const result = await convertToAllFormats(args.inputPath, args.outputDir ?? OUTPUT_DIR, formats ?? ['instagram-reel', 'instagram-feed', 'youtube', 'tiktok'], args.strategy ?? 'blur-background');
|
|
84
|
+
return jsonResponse({ success: true, files: result, totalFormats: Object.keys(result).length });
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
88
|
+
logger.error(`convert_all_social_formats failed: ${msg}`);
|
|
89
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
add_text_overlay: async (args) => {
|
|
93
|
+
try {
|
|
94
|
+
const result = await addTextOverlays(args.inputPath, args.outputPath, args.overlays);
|
|
95
|
+
return jsonResponse({ success: true, outputPath: result });
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
99
|
+
logger.error(`add_text_overlay failed: ${msg}`);
|
|
100
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
function addSuffix(filePath, suffix) {
|
|
105
|
+
const ext = path.extname(filePath);
|
|
106
|
+
const base = filePath.slice(0, -ext.length);
|
|
107
|
+
return `${base}${suffix}${ext}`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=post-production.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-production.js","sourceRoot":"","sources":["../../src/handlers/post-production.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Screenshot tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { jsonResponse } from '../lib/types.js';
|
|
5
|
+
import { logger } from '../lib/logger.js';
|
|
6
|
+
import { smartScreenshot } from '../tools/engine/smart-screenshot.js';
|
|
7
|
+
export const smartScreenshotHandlers = {
|
|
8
|
+
/**
|
|
9
|
+
* Take element-aware screenshots of specific page features
|
|
10
|
+
*/
|
|
11
|
+
screenshot_element: async (args) => {
|
|
12
|
+
try {
|
|
13
|
+
const config = {
|
|
14
|
+
url: args.url,
|
|
15
|
+
targets: normalizeTargetArgs(args.targets),
|
|
16
|
+
outputDir: args.outputDir,
|
|
17
|
+
viewport: args.viewport ?? { width: 1920, height: 1080 },
|
|
18
|
+
deviceScaleFactor: args.deviceScaleFactor ?? 1,
|
|
19
|
+
darkMode: args.darkMode ?? false,
|
|
20
|
+
includeFullPage: args.includeFullPage ?? false,
|
|
21
|
+
};
|
|
22
|
+
const result = await smartScreenshot(config);
|
|
23
|
+
return jsonResponse(result);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
27
|
+
logger.error(`screenshot_element failed: ${message}`);
|
|
28
|
+
return jsonResponse({ success: false, error: message }, true);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* Detect page features without taking screenshots
|
|
33
|
+
*/
|
|
34
|
+
detect_page_features: async (args) => {
|
|
35
|
+
try {
|
|
36
|
+
const config = {
|
|
37
|
+
url: args.url,
|
|
38
|
+
targets: ['all'],
|
|
39
|
+
viewport: args.viewport ?? { width: 1920, height: 1080 },
|
|
40
|
+
includeFullPage: false,
|
|
41
|
+
};
|
|
42
|
+
// Use smartScreenshot with includeFullPage=false to just detect
|
|
43
|
+
// We'll capture a quick version that only detects without taking actual screenshots
|
|
44
|
+
const result = await smartScreenshot(config);
|
|
45
|
+
return jsonResponse({
|
|
46
|
+
success: true,
|
|
47
|
+
url: args.url,
|
|
48
|
+
features: result.detected.map(f => ({
|
|
49
|
+
name: f.name,
|
|
50
|
+
selector: f.selector,
|
|
51
|
+
size: `${f.bounds.width}x${f.bounds.height}`,
|
|
52
|
+
position: `(${Math.round(f.bounds.x)}, ${Math.round(f.bounds.y)})`,
|
|
53
|
+
matchMethod: f.matchMethod,
|
|
54
|
+
confidence: f.confidence,
|
|
55
|
+
})),
|
|
56
|
+
total: result.detected.length,
|
|
57
|
+
screenshots: result.screenshots.map(s => ({
|
|
58
|
+
feature: s.feature,
|
|
59
|
+
path: s.path,
|
|
60
|
+
})),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
logger.error(`detect_page_features failed: ${message}`);
|
|
66
|
+
return jsonResponse({ success: false, error: message }, true);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
function normalizeTargetArgs(targets) {
|
|
71
|
+
if (!Array.isArray(targets)) {
|
|
72
|
+
return [String(targets)];
|
|
73
|
+
}
|
|
74
|
+
return targets.map(t => {
|
|
75
|
+
if (typeof t === 'string')
|
|
76
|
+
return t;
|
|
77
|
+
if (typeof t === 'object' && t !== null && 'feature' in t) {
|
|
78
|
+
return t;
|
|
79
|
+
}
|
|
80
|
+
return String(t);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=smart-screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-screenshot.js","sourceRoot":"","sources":["../../src/handlers/smart-screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS & Narrated Video tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { jsonResponse } from '../lib/types.js';
|
|
5
|
+
import { logger } from '../lib/logger.js';
|
|
6
|
+
import { generateSpeech, listElevenLabsVoices, createNarratedVideo, } from '../tools/index.js';
|
|
7
|
+
const OUTPUT_DIR = process.env.VIDEO_OUTPUT_DIR || './output';
|
|
8
|
+
export const ttsHandlers = {
|
|
9
|
+
generate_speech: async (args) => {
|
|
10
|
+
try {
|
|
11
|
+
const config = {
|
|
12
|
+
text: args.text,
|
|
13
|
+
outputPath: args.outputPath ?? `${OUTPUT_DIR}/speech-${Date.now()}.mp3`,
|
|
14
|
+
provider: args.provider,
|
|
15
|
+
language: args.language ?? 'en',
|
|
16
|
+
speed: args.speed,
|
|
17
|
+
elevenLabsVoice: args.elevenLabsVoice,
|
|
18
|
+
elevenLabsModel: args.elevenLabsModel,
|
|
19
|
+
openaiVoice: args.openaiVoice,
|
|
20
|
+
openaiModel: args.openaiModel,
|
|
21
|
+
stability: args.stability,
|
|
22
|
+
similarityBoost: args.similarityBoost,
|
|
23
|
+
};
|
|
24
|
+
const result = await generateSpeech(config);
|
|
25
|
+
return jsonResponse(result);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
29
|
+
logger.error(`generate_speech failed: ${msg}`);
|
|
30
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
list_voices: async () => {
|
|
34
|
+
try {
|
|
35
|
+
const voices = await listElevenLabsVoices();
|
|
36
|
+
return jsonResponse({
|
|
37
|
+
success: true,
|
|
38
|
+
voices,
|
|
39
|
+
totalVoices: voices.length,
|
|
40
|
+
premade: [
|
|
41
|
+
'rachel (F)', 'sarah (F)', 'emily (F)', 'charlotte (F)', 'alice (F)',
|
|
42
|
+
'brian (M)', 'adam (M)', 'daniel (M)', 'josh (M)', 'james (M)', 'liam (M)',
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
48
|
+
logger.error(`list_voices failed: ${msg}`);
|
|
49
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
create_narrated_video: async (args) => {
|
|
53
|
+
try {
|
|
54
|
+
const segments = args.segments.map((s) => ({
|
|
55
|
+
text: s.text,
|
|
56
|
+
scene: s.scene,
|
|
57
|
+
paddingAfter: s.paddingAfter,
|
|
58
|
+
}));
|
|
59
|
+
const hostname = new URL(args.url).hostname.replace(/^www\./, '').replace(/\./g, '-');
|
|
60
|
+
const defaultOutput = `${OUTPUT_DIR}/narrated-${hostname}-${new Date().toISOString().slice(0, 10)}`;
|
|
61
|
+
const result = await createNarratedVideo({
|
|
62
|
+
url: args.url,
|
|
63
|
+
segments,
|
|
64
|
+
outputPath: args.outputPath ?? defaultOutput,
|
|
65
|
+
provider: args.provider,
|
|
66
|
+
language: args.language ?? 'en',
|
|
67
|
+
viewport: args.viewport ?? 'desktop',
|
|
68
|
+
elevenLabsVoice: args.elevenLabsVoice,
|
|
69
|
+
openaiVoice: args.openaiVoice,
|
|
70
|
+
speed: args.speed,
|
|
71
|
+
backgroundMusicPath: args.backgroundMusicPath,
|
|
72
|
+
backgroundMusicVolume: args.backgroundMusicVolume,
|
|
73
|
+
});
|
|
74
|
+
return jsonResponse(result);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
78
|
+
logger.error(`create_narrated_video failed: ${msg}`);
|
|
79
|
+
return jsonResponse({ success: false, error: msg }, true);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=tts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/handlers/tts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Video recording tool handlers
|
|
3
|
+
*/
|
|
4
|
+
import { jsonResponse } from '../lib/types.js';
|
|
5
|
+
import { logger } from '../lib/logger.js';
|
|
6
|
+
import { recordWebsite } from '../tools/index.js';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
const OUTPUT_DIR = process.env.VIDEO_OUTPUT_DIR || './output';
|
|
9
|
+
export const videoHandlers = {
|
|
10
|
+
/**
|
|
11
|
+
* Full-featured website video recording
|
|
12
|
+
*/
|
|
13
|
+
record_website_video: async (args) => {
|
|
14
|
+
try {
|
|
15
|
+
const config = {
|
|
16
|
+
url: args.url,
|
|
17
|
+
outputPath: args.outputPath ?? generateOutputPath(args.url, 'video'),
|
|
18
|
+
viewport: args.viewport ?? 'desktop',
|
|
19
|
+
fps: args.fps ?? 60,
|
|
20
|
+
scenes: args.scenes,
|
|
21
|
+
cursor: args.cursor ?? { enabled: true },
|
|
22
|
+
encoding: {
|
|
23
|
+
codec: args.codec ?? 'h264',
|
|
24
|
+
crf: args.quality ?? 18,
|
|
25
|
+
},
|
|
26
|
+
darkMode: args.darkMode ?? false,
|
|
27
|
+
preloadContent: args.preloadContent ?? true,
|
|
28
|
+
dismissOverlays: args.dismissOverlays ?? true,
|
|
29
|
+
};
|
|
30
|
+
const result = await recordWebsite(config);
|
|
31
|
+
return jsonResponse(result);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
35
|
+
logger.error(`record_website_video failed: ${message}`);
|
|
36
|
+
return jsonResponse({ success: false, error: message }, true);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Quick scroll-through video
|
|
41
|
+
*/
|
|
42
|
+
record_website_scroll: async (args) => {
|
|
43
|
+
try {
|
|
44
|
+
const duration = args.duration ?? 12;
|
|
45
|
+
const easing = args.easing ?? 'showcase';
|
|
46
|
+
const config = {
|
|
47
|
+
url: args.url,
|
|
48
|
+
outputPath: args.outputPath ?? generateOutputPath(args.url, 'scroll'),
|
|
49
|
+
viewport: args.viewport ?? 'desktop',
|
|
50
|
+
fps: 60,
|
|
51
|
+
scenes: [
|
|
52
|
+
{ type: 'pause', duration: 1.5 },
|
|
53
|
+
{ type: 'scroll', to: 'bottom', duration, easing },
|
|
54
|
+
{ type: 'pause', duration: 2 },
|
|
55
|
+
],
|
|
56
|
+
cursor: { enabled: false },
|
|
57
|
+
encoding: { codec: 'h264', crf: 18 },
|
|
58
|
+
};
|
|
59
|
+
const result = await recordWebsite(config);
|
|
60
|
+
return jsonResponse(result);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
64
|
+
logger.error(`record_website_scroll failed: ${message}`);
|
|
65
|
+
return jsonResponse({ success: false, error: message }, true);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
/**
|
|
69
|
+
* Multi-device recording
|
|
70
|
+
*/
|
|
71
|
+
record_multi_device: async (args) => {
|
|
72
|
+
try {
|
|
73
|
+
const devices = args.devices ?? ['desktop', 'tablet', 'mobile'];
|
|
74
|
+
const duration = args.duration ?? 10;
|
|
75
|
+
const outputDir = args.outputDir ?? OUTPUT_DIR;
|
|
76
|
+
const results = {};
|
|
77
|
+
for (const device of devices) {
|
|
78
|
+
logger.info(`Recording ${device} viewport for ${args.url}...`);
|
|
79
|
+
const config = {
|
|
80
|
+
url: args.url,
|
|
81
|
+
outputPath: path.join(outputDir, generateOutputName(args.url, device)),
|
|
82
|
+
viewport: device,
|
|
83
|
+
fps: 60,
|
|
84
|
+
scenes: [
|
|
85
|
+
{ type: 'pause', duration: 1 },
|
|
86
|
+
{ type: 'scroll', to: 'bottom', duration, easing: 'showcase' },
|
|
87
|
+
{ type: 'pause', duration: 1.5 },
|
|
88
|
+
],
|
|
89
|
+
cursor: { enabled: device !== 'mobile' && device !== 'mobile-landscape' },
|
|
90
|
+
encoding: { codec: 'h264', crf: 18 },
|
|
91
|
+
};
|
|
92
|
+
const result = await recordWebsite(config);
|
|
93
|
+
results[device] = result;
|
|
94
|
+
}
|
|
95
|
+
return jsonResponse({
|
|
96
|
+
success: true,
|
|
97
|
+
devices: devices.length,
|
|
98
|
+
results,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
logger.error(`record_multi_device failed: ${message}`);
|
|
104
|
+
return jsonResponse({ success: false, error: message }, true);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Generate a descriptive output path from URL
|
|
110
|
+
*/
|
|
111
|
+
function generateOutputPath(url, prefix) {
|
|
112
|
+
const name = generateOutputName(url, prefix);
|
|
113
|
+
return path.join(OUTPUT_DIR, name);
|
|
114
|
+
}
|
|
115
|
+
function generateOutputName(url, suffix) {
|
|
116
|
+
try {
|
|
117
|
+
const hostname = new URL(url).hostname
|
|
118
|
+
.replace(/^www\./, '')
|
|
119
|
+
.replace(/\./g, '-');
|
|
120
|
+
const timestamp = new Date().toISOString().slice(0, 10);
|
|
121
|
+
return `${hostname}-${suffix}-${timestamp}`;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return `website-${suffix}-${Date.now()}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/handlers/video.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual Transport for MCP Servers — Stdio + Streamable HTTP
|
|
3
|
+
*
|
|
4
|
+
* Default: stdio (backward compatible, used by Claude Code via subprocess)
|
|
5
|
+
* --http: Streamable HTTP on configurable port (persistent HTTP microservice)
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* startDualTransport(createMcpServer, { serverName, serverVersion, defaultPort })
|
|
9
|
+
*
|
|
10
|
+
* HTTP mode flags:
|
|
11
|
+
* --http Enable HTTP transport
|
|
12
|
+
* --port=XXXX Override default port
|
|
13
|
+
* MCP_HTTP=1 Enable via env var
|
|
14
|
+
* MCP_PORT=XXXX Override port via env var
|
|
15
|
+
*/
|
|
16
|
+
/** Any MCP server that can connect to a transport */
|
|
17
|
+
type ConnectableServer = {
|
|
18
|
+
connect(transport: unknown): Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
/** Factory function that creates a fresh MCP server instance */
|
|
21
|
+
export type McpServerFactory = () => ConnectableServer;
|
|
22
|
+
export interface DualTransportOptions {
|
|
23
|
+
serverName: string;
|
|
24
|
+
serverVersion: string;
|
|
25
|
+
/** Default HTTP port (used when --http is active) */
|
|
26
|
+
defaultPort: number;
|
|
27
|
+
}
|
|
28
|
+
export interface TransportResult {
|
|
29
|
+
type: 'stdio' | 'http';
|
|
30
|
+
port?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Start an MCP server with dual transport support.
|
|
34
|
+
*
|
|
35
|
+
* @param createServer - Factory that creates a fresh MCP server (McpServer or Server)
|
|
36
|
+
* @param options - Server name, version, and default HTTP port
|
|
37
|
+
*
|
|
38
|
+
* For stdio: creates one server, connects to StdioServerTransport.
|
|
39
|
+
* For HTTP: creates a new server per session, connects to StreamableHTTPServerTransport.
|
|
40
|
+
*/
|
|
41
|
+
export declare function startDualTransport(createServer: McpServerFactory, options: DualTransportOptions): Promise<TransportResult>;
|
|
42
|
+
export {};
|