VibeStudio is a high-performance, headless video editing server designed for AI assistants. Built entirely in Bash and based on the Model Context Protocol (MCP), it delivers advanced FFmpeg functionality with zero runtime dependencies.
💡 Note: Heads up! Make sure your volume’s on
result.mp4
It exposes powerful media editing tools—video, audio, and more—as lightweight, local shell commands. This makes it ideal for AI agents needing reliable, fast, and traceable tool-based workflows.
Zero runtime overhead – no Python, Node.js, or other runtimes required
Fully self-contained – pure Bash scripts, easy to inspect and audit
No frameworks – no servers, RPC layers, or glue code
MCP-compatible – integrates seamlessly with any assistant that supports tool calls
Debug-friendly – transparent, traceable CLI commands with clear inputs/outputs
Format Conversion: Convert between video formats (MP4, AVI, MKV, MOV, etc.)
Video Trimming: Extract specific portions of videos with frame-accurate precision
Video Merging: Seamlessly concatenate multiple videos
Video Resizing: Change video dimensions for any platform
Subtitle Addition: Burn subtitles directly into videos
Frame Extraction: Export video frames as high-quality images
Image to Video: Create videos from image sequences
Video Filters: Apply professional filters (blur, sharpen, rotate, color correction)
Enable verbose logging by modifying the log level in ffmpegserver.sh or checking the full logs:
# Watch logs in real-time
tail -f logs/ffmpegserver.log
# Check last 50 log entries
tail -n 50 logs/ffmpegserver.log
Run these tests to ensure VibeStudio is properly installed:
Test 1: Check Core Dependencies
# Check if jq is installed
jq --version
# Expected: jq-1.6 or higher# Check if FFmpeg is installed
ffmpeg -version
# Expected: ffmpeg version details# Check if mcpserver_core.sh exists
ls -la mcpserver_core.sh
# Expected: File should exist with execute permissions
Test 2: Test MCP Server Initialization
# Test server initializationecho'{"jsonrpc": "2.0", "method": "initialize", "params": {"clientInfo": {"name": "test"}}, "id": 1}'| ./ffmpegserver.sh | jq
# Expected: JSON response with serverInfo and capabilities
Test 3: List Available Tools
# List all available toolsecho'{"jsonrpc": "2.0", "method": "tools/list", "id": 2}'| ./ffmpegserver.sh | jq
# Expected: JSON response with array of 14 tools
Test 4: Test Media Info Tool (with sample file)
# First, create a test video file
ffmpeg -f lavfi -i testsrc=duration=1:size=320x240:rate=30 -f lavfi -i sine=frequency=1000:duration=1 test_video.mp4
# Test get_media_info toolecho'{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "get_media_info", "arguments": {"input_file": "test_video.mp4"}}, "id": 3}'| ./ffmpegserver.sh
# Expected: JSON response with media information (duration, codecs, resolution)
Test 5: Test Error Handling
# Test with non-existent fileecho'{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "get_media_info", "arguments": {"input_file": "non_existent.mp4"}}, "id": 4}'| ./ffmpegserver.sh
# Expected: JSON error response with "File not found" message# Test with invalid methodecho'{"jsonrpc": "2.0", "method": "invalid_method", "id": 5}'| ./ffmpegserver.sh
# Expected: JSON error response with code -32601
# Check if logging is working
tail -n 20 logs/ffmpegserver.log
# Expected: Log entries for all the above test commands
Test 7: Full Integration Test
# Create a simple test video and process it
ffmpeg -f lavfi -i testsrc=duration=3:size=640x480:rate=30 -f lavfi -i sine=frequency=1000:duration=3 test_source.mp4
# Extract a 1-second clipecho'{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "trim_media", "arguments": {"input_file": "test_source.mp4", "output_file": "test_trimmed.mp4", "start_time": "00:00:01", "duration": "00:00:01"}}, "id": 6}'| ./ffmpegserver.sh
# Check if output was created
ls -la test_trimmed.mp4
# Expected: File should exist with size > 0# Clean up test files
rm -f test_video.mp4 test_source.mp4 test_trimmed.mp4
Your VibeStudio installation should have this structure: