Mediallm — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mediallm (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<pre> ███╗ ███╗███████╗██████╗ ██╗ █████╗ ██╗ ██╗ ███╗ ███╗ ████╗ ████║██╔════╝██╔══██╗██║██╔══██╗██║ ██║ ████╗ ████║ ██╔████╔██║█████╗ ██║ ██║██║███████║██║ ██║ ██╔████╔██║ ██║╚██╔╝██║██╔══╝ ██║ ██║██║██╔══██║██║ ██║ ██║╚██╔╝██║ ██║ ╚═╝ ██║███████╗██████╔╝██║██║ ██║███████╗███████╗██║ ╚═╝ ██║ ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ </pre>
<div align="center">
Natural language to FFmpeg, instantly and privately
Privacy-First • Local LLM • FFmpeg made effortless
<p align="center"> <a href="https://mediallm.arunbrahma.com/">Documentation</a> • <a href="#installation">Installation</a> • <a href="#quick-start">Quick Start</a> • <a href="#usage">Usage</a> • <a href="#configuration">Configuration</a> • <a href="#contributing">Contributing</a> </p>
</div>
MediaLLM transforms media processing by bridging the gap between human language and FFmpeg complexity. This Python package enables you to manipulate videos, audio files, images, and subtitles using simple, conversational commands powered by local AI models.
Instead of memorizing complex FFmpeg syntax, simply describe what you want: "convert this video to MP4," "extract the audio as high-quality MP3," or "compress this video to a smaller size." MediaLLM understands your intent and generates the precise commands needed, all while keeping your data completely private through local processing.
Whether you're a developer automating video workflows, a content creator resizing clips for social media, or someone who just needs to convert files without diving into technical manuals, MediaLLM meets you where you are.
| Component | Version | macOS | Linux | |
|---|---|---|---|---|
| Python | 3.10+ | brew install python | sudo apt install python3 | |
| FFmpeg | Latest | brew install ffmpeg | sudo apt install ffmpeg | |
| Ollama | Latest | brew install ollama | curl -fsSL https://ollama.com/install.sh | sh |
# Install from PyPI
pip install mediallm
# Alternative: using uv (faster)
uv add mediallm
# Development installation
git clone https://github.com/iamarunbrahma/mediallm.git
cd mediallm
pip install -e .# Install from PyPI
pip install mediallm-mcp
# Alternative: using uv (faster)
uv add mediallm-mcp# 1. Start Ollama and pull a model
ollama serve
ollama pull llama3.1:latest
# 2. Convert media with natural language
mediallm "convert video.mp4 to MP3 audio"
mediallm "convert video.mov to MP4 format"
mediallm "extract audio from movie.mp4 as high quality MP3"
# 3. Preview commands before execution
mediallm --dry-run "compress large-video.mkv to smaller size"# Video Conversions
mediallm "convert video.mov to MP4 format"
mediallm "convert video.avi to MP4"
mediallm "convert video.flv to MP4 format"
mediallm "compress large-video.mp4 to smaller size"
# Audio Operations
mediallm "extract audio from movie.mp4 as high quality MP3"
mediallm "convert video.mp4 to MP3 audio"
# Image Operations
mediallm "extract thumbnail from video.mp4"
mediallm "convert image.jpg to PNG format"
# Trimming
mediallm "trim video.mp4 from start to 30 seconds"import mediallm
# Initialize MediaLLM
ml = mediallm.MediaLLM()
# Scan workspace for media files
files = ml.scan_workspace()
print(f"Found {len(files['videos'])} videos")
# Generate commands from natural language
request = "convert video.mp4 to high-quality MP3"
commands = ml.generate_command(request)
# Execute generated commands
for cmd in commands:
print(f"Running: {' '.join(cmd)}")
# subprocess.run(cmd) # Execute the commandMediaLLM works out-of-the-box with sensible defaults. Customize only if needed:
Common Adjustments:
MEDIALLM_MODEL - Switch between different Ollama models (default: llama3.1:latest)MEDIALLM_OUTPUT_DIR - Change where converted files are saved (default: current directory)Advanced Settings:
MEDIALLM_OLLAMA_HOST - Connect to Ollama on a different machine (default: http://localhost:11434)MEDIALLM_TIMEOUT - Increase for complex operations (default: 60s)MEDIALLM_DRY_RUN - Always preview commands without executing (default: false)Set via environment variables or create a .env file in your project directory.
<div align="center">
┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐
│ Natural Language │ │ Local LLM │ │ FFmpeg Commands │ │ Media Output │
│ "convert vid.mp4" │ --> │ (Ollama) │ --> │ ffmpeg -i ... │ --> │ output.mp4 │
│ │ │ │ │ │ │ │
└───────────────────┘ └───────────────────┘ └───────────────────┘ └───────────────────┘</div>
MediaLLM includes an MCP (Model Context Protocol) server for integration with AI agents:
# Default: STDIO transport (for Claude Desktop, etc.)
mediallm-mcp
# SSE transport (for web integrations)
mediallm-mcp --sse --port 3001
# HTTP transport (for custom integrations)
mediallm-mcp --http --port 3001# Build the Docker image
cd packages/mediallm-mcp
docker build -t mediallm-mcp .
# Run with volume mounting and port mapping for HTTP access
docker run -it --rm \
-p 8080:8080 \
-v /path/to/your/media:/workspace \
mediallm-mcp
# MCP endpoint (default path): http://localhost:8080/mcp
# Customize path via CLI: mediallm-mcp --http --path /api/mcpAdd to .mcp.json in your project root:
{
"mcpServers": {
"mediallm-mcp": {
"command": "uvx",
"args": ["mediallm-mcp"]
}
}
}Add to your claude_desktop_config.json:
Config file location:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"mediallm-mcp": {
"command": "uvx",
"args": ["mediallm-mcp"]
}
}
}Or manually create .cursor/mcp.json in your project (or edit the global ~/.cursor/mcp.json):
{
"mcpServers": {
"mediallm-mcp": {
"command": "uvx",
"args": ["mediallm-mcp"]
}
}
}MEDIALLM_WORKSPACE - Specify media directory (default: current working directory)MEDIALLM_MODEL - Override LLM model (default: llama3.1:latest)MEDIALLM_OLLAMA_HOST - Ollama server URL (default: http://localhost:11434)MEDIALLM_OUTPUT_DIR - Output directory (default: current working directory)Available Tools:
generate_command - Convert natural language to FFmpeg commandsscan_workspace - Discover media files in directories# Enable verbose logging
mediallm-mcp --debug
# Test alternate transports with debug
mediallm-mcp --sse --port 3001 --debug
mediallm-mcp --http --port 3001 --debugIf the server is not detected:
mediallm-mcp --helpIf you see "MCP error -32001: Request timed out" in MCP Inspector, set:
Help make MediaLLM better for everyone! Whether you're fixing bugs, adding features, or improving documentation, your contributions matter.
Get Started:
make help to see available development commandsHave Ideas or Issues?
MIT License - use it, modify it, share it. See LICENSE for the fine print.
<div align="center">
Made by [Arun Brahma](https://github.com/iamarunbrahma)
⭐ Star on GitHub • 🐛 Report Issues
</div>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.