We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bermingham85/mcp-puppet-pipeline'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
// MCP Server Extension Loader
// This automatically injects the video tools into your running MCP server
const WebSocket = require('ws');
const fs = require('fs');
const path = require('path');
const { VideoProcessingTools } = require('./mcp-video-tools');
// Configuration
const MCP_SERVER = 'ws://localhost:3000/mcp';
const VIDEO_PATH = 'C:\\puppet_production\\rendernet_media_vid_NS5ozVwpwE.mp4';
// Deploy tools to MCP server
async function deployTools() {
console.log('π§ Injecting Video Processing Tools into MCP Server...\n');
// First, register the tools with the server
const toolRegistration = {
jsonrpc: '2.0',
id: 'register_tools',
method: 'system.register_tools',
params: {
tools: [
{
name: 'extract_video_frame',
description: 'Extract frame(s) from video at specified timestamps',
inputSchema: {
type: 'object',
properties: {
video_path: { type: 'string' },
output_path: { type: 'string' },
timestamp: { type: ['string', 'number'] },
smart_selection: { type: 'boolean' }
},
required: ['video_path', 'output_path']
}
},
{
name: 'auto_puppet_from_video',
description: 'Fully automated video to puppet pipeline with smart frame selection',
inputSchema: {
type: 'object',
properties: {
video_path: { type: 'string' },
character_name: { type: 'string' },
full_production: { type: 'boolean' }
},
required: ['video_path']
}
},
{
name: 'create_content_package',
description: 'Generate complete content package from video source',
inputSchema: {
type: 'object',
properties: {
video_path: { type: 'string' },
package_name: { type: 'string' },
platforms: { type: 'array' }
},
required: ['video_path']
}
}
]
}
};
// Try to register tools
const ws = new WebSocket(MCP_SERVER);
return new Promise((resolve, reject) => {
ws.on('open', () => {
console.log('β
Connected to MCP Server');
// If registration isn't supported, proceed directly to execution
ws.send(JSON.stringify(toolRegistration));
setTimeout(() => {
// Proceed with execution
executeAutomatedPipeline(ws);
}, 1000);
});
ws.on('message', (data) => {
const response = JSON.parse(data.toString());
console.log('π¨ Server Response:', response);
if (response.id === 'register_tools') {
console.log('β
Tools registered successfully');
}
});
ws.on('error', (err) => {
console.error('β Connection error:', err.message);
console.log('\nπ Attempting fallback deployment...');
fallbackDeployment();
});
});
}
// Execute the automated pipeline
async function executeAutomatedPipeline(ws) {
console.log('\n㪠Starting Automated Video Processing Pipeline...\n');
// Step 1: Extract optimal frame
console.log('πΈ Step 1: Extracting optimal frame from video...');
const extractRequest = {
jsonrpc: '2.0',
id: 'extract_frame',
method: 'extract_video_frame',
params: {
video_path: VIDEO_PATH,
output_path: 'C:\\puppet_production\\auto_frame.jpg',
timestamp: 'auto',
smart_selection: true
}
};
ws.send(JSON.stringify(extractRequest));
// Wait for frame extraction
setTimeout(() => {
// Step 2: Run puppet pipeline
console.log('π¨ Step 2: Generating puppet variations...');
const pipelineRequest = {
jsonrpc: '2.0',
id: 'puppet_pipeline',
method: 'hybrid_puppet_pipeline',
params: {
reference_image_path: 'C:\\puppet_production\\auto_frame.jpg',
character_name: 'RenderNet_AutoCharacter',
proof_of_concept: false,
create_affogato_character: true,
scene_generations: [
{
scene_prompt: 'Character as action hero in cinematic poster with explosions and dramatic lighting',
output_path: 'C:\\puppet_production\\auto_outputs\\action_hero.png',
quality: 'Plus'
},
{
scene_prompt: 'Character in futuristic cyberpunk city at night with neon reflections',
output_path: 'C:\\puppet_production\\auto_outputs\\cyberpunk.png',
quality: 'Plus'
},
{
scene_prompt: 'Character in professional business environment with modern office',
output_path: 'C:\\puppet_production\\auto_outputs\\business.png',
quality: 'Plus'
},
{
scene_prompt: 'Character in magical fantasy realm with mystical effects',
output_path: 'C:\\puppet_production\\auto_outputs\\fantasy.png',
quality: 'Plus'
}
],
voice_videos: [
{
image_path: 'C:\\puppet_production\\auto_outputs\\action_hero.png',
script: 'Welcome to the next generation of AI-powered content creation. Let me show you what\'s possible.',
voice_id: '21m00Tcm4TlvDq8ikWAM',
output_path: 'C:\\puppet_production\\auto_outputs\\intro_video.mp4',
duration: 7
},
{
image_path: 'C:\\puppet_production\\auto_outputs\\cyberpunk.png',
script: 'The future is here, and it\'s more incredible than we imagined.',
voice_id: '21m00Tcm4TlvDq8ikWAM',
output_path: 'C:\\puppet_production\\auto_outputs\\future_video.mp4',
duration: 5
}
]
}
};
ws.send(JSON.stringify(pipelineRequest));
console.log('β³ Processing... This may take a few minutes...\n');
}, 3000);
// Monitor results
ws.on('message', (data) => {
const response = JSON.parse(data.toString());
if (response.id === 'extract_frame') {
console.log('β
Frame extracted successfully');
console.log(' Location:', response.result?.frame_path);
}
if (response.id === 'puppet_pipeline') {
console.log('β
Puppet pipeline completed');
console.log(' Generated assets:', response.result);
// Create summary
generateSummary(response.result);
ws.close();
}
});
}
// Fallback deployment if MCP server doesn't support registration
async function fallbackDeployment() {
console.log('π Running direct automation...\n');
const { exec } = require('child_process');
// Create output directories
const dirs = [
'C:\\puppet_production\\auto_outputs',
'C:\\puppet_production\\frames',
'C:\\puppet_production\\puppets',
'C:\\puppet_production\\scenes',
'C:\\puppet_production\\videos'
];
for (const dir of dirs) {
await fs.promises.mkdir(dir, { recursive: true });
}
// Extract frame using ffmpeg directly
console.log('πΈ Extracting frame with ffmpeg...');
exec(`ffmpeg -i "${VIDEO_PATH}" -ss 2 -vframes 1 -q:v 2 "C:\\puppet_production\\auto_frame.jpg" -y`,
(error, stdout, stderr) => {
if (!error) {
console.log('β
Frame extracted');
// Call puppet pipeline via WebSocket
const ws = new WebSocket(MCP_SERVER);
ws.on('open', () => {
const request = {
jsonrpc: '2.0',
id: Date.now(),
method: 'hybrid_puppet_pipeline',
params: {
reference_image_path: 'C:\\puppet_production\\auto_frame.jpg',
character_name: 'RenderNet_Auto',
proof_of_concept: true,
create_affogato_character: true,
scene_generations: [
{
scene_prompt: 'Character in dynamic action scene',
output_path: 'C:\\puppet_production\\auto_outputs\\scene1.png',
quality: 'Plus'
}
]
}
};
console.log('π¨ Running puppet pipeline...');
ws.send(JSON.stringify(request));
});
ws.on('message', (data) => {
const response = JSON.parse(data.toString());
console.log('β
Pipeline complete!');
console.log(response);
generateSummary(response.result);
ws.close();
process.exit(0);
});
} else {
console.error('Error extracting frame:', error);
}
}
);
}
// Generate summary of results
function generateSummary(results) {
console.log('\n' + '='.repeat(60));
console.log('π AUTOMATION COMPLETE - SUMMARY');
console.log('='.repeat(60));
console.log('β
Video processed:', VIDEO_PATH);
console.log('β
Frame extracted: C:\\puppet_production\\auto_frame.jpg');
console.log('β
Puppet variations generated');
console.log('β
Scene images created');
console.log('β
Voice videos produced');
console.log('\nπ Output Directory: C:\\puppet_production\\auto_outputs\\');
console.log('='.repeat(60));
// Save summary to file
const summary = {
timestamp: new Date().toISOString(),
source_video: VIDEO_PATH,
outputs: results,
status: 'complete'
};
fs.writeFileSync(
'C:\\puppet_production\\automation_summary.json',
JSON.stringify(summary, null, 2)
);
console.log('\nπΎ Summary saved to automation_summary.json');
console.log('π Full automation successful!\n');
}
// Main execution
console.log('=' .repeat(60));
console.log('π MCP VIDEO PROCESSING AUTOMATION SYSTEM');
console.log('=' .repeat(60));
// Check dependencies
const checkDependencies = () => {
try {
require('ws');
return true;
} catch {
console.log('π¦ Installing required dependencies...');
require('child_process').execSync('npm install ws', { stdio: 'inherit' });
return true;
}
};
if (checkDependencies()) {
deployTools().catch(err => {
console.error('Deployment error:', err);
console.log('\nπ Attempting fallback...');
fallbackDeployment();
});
}