mcp-tools-for-agents
This server is a local MCP tool server that gives AI agents 34 real video, audio, and file-editing capabilities in a single no-runtime binary.
Files: list workspace files with filters and recursive search; permanently delete files.
Video analysis: probe metadata (duration, resolution, fps, codecs), detect scene changes, extract frames, and fetch info from URLs.
Video editing: cut with or without re-encode, concat with transitions, remove silence, add text overlays, banners, subtitles (.srt/.ass), burn subtitles, set metadata, add narration, sound effects, background music, fades, speed changes, zoom/Ken Burns, dynamic word-by-word subtitles, templates, thumbnails, smart face-aware cropping, and platform export presets.
Audio: extract audio tracks, transcribe speech with word/segment timestamps (Whisper), and normalize loudness to platform standards.
Media downloading: download videos from many websites via yt-dlp, and search/download free Freesound effects.
Background jobs: long running operations run as jobs with status and result retrieval.
Operational simplicity: auto-downloads FFmpeg/yt-dlp/Whisper models on demand, works with Claude Code, Claude Desktop, Cursor, and any MCP host.
Provides tools for video and audio processing via FFmpeg, including probing media, cutting and concatenating videos, detecting scenes, extracting frames, and extracting audio tracks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-tools-for-agents cut the first 10 seconds of intro.mp4"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-tools-for-agents
Dê mãos ao seu agente de IA. Um binário, nenhuma instalação.
Um servidor MCP local, em Rust, que entrega ao seu agente ferramentas reais de
vídeo, áudio e arquivos. Sem API, sem UI, sem runtime. São 36 tools compiladas em
um executável único: baixe o mcp-tools da sua plataforma, aponte o host MCP para
ele e pronto.
Funciona com Claude Code, Claude Desktop, Cursor e qualquer host MCP.
Por que Rust
O servidor precisa de um arquivo:
Binário único por plataforma. Linux (x86_64, arm64), macOS (Intel, Apple Silicon) e Windows. Sem runtime, sem dependência de sistema.
FFmpeg e yt-dlp sob demanda. Se não estiverem no PATH nem ao lado do binário, o servidor baixa os builds estáticos oficiais na primeira chamada e guarda em uma pasta de cache. Desligue com
MCP_AUTO_DOWNLOAD=false.Fonte e modelos embutidos. A DejaVu Sans Bold (para texto e legenda), o YuNet (detector de rosto do OpenCV Zoo) e o Silero VAD (detector de fala) vão dentro do executável.
Transcrição, visão e fala nativas.
transcribe_audiousa o whisper.cpp (whisper-rs);smart_croproda o YuNet eremove_silenceeadd_background_musicrodam o Silero VAD notract, runtime ONNX em Rust puro. Nada de OpenCV ou onnxruntime instalado.Mesmos princípios. Erro que ensina (
{error, code, hint}), workspace como fronteira, jobs em background, resposta sempre tipada, um arquivo por tool.
Related MCP server: DJAI Tools MCP
Em 60 segundos
Baixe o pacote da sua plataforma na página de releases (ou compile, abaixo), descompacte e rode:
WORKSPACE_DIR=/dados/videos ./mcp-tools # servidor no ar, via stdioNa primeira tool que precisar de FFmpeg (ou de yt-dlp) o binário é baixado para
o cache. Se preferir, coloque ffmpeg, ffprobe e yt-dlp ao lado do
mcp-tools ou no PATH: eles têm prioridade e nada é baixado.
Compilar do fonte
cargo build --release --features full # binário completo (transcrição + visão + fala)
cargo build --release # binário leve, sem os extrasRequisitos de build: Rust estável (1.85+); com --features full, também cmake
e um compilador C++ (o whisper.cpp é compilado e linkado estaticamente). O
executável fica em target/release/mcp-tools (~24 MB). No Linux ele depende só
da glibc e da libstdc++ do sistema, presentes em qualquer distribuição.
Plugar no agente
{
"mcpServers": {
"mcp-tools-for-agents": {
"command": "/caminho/mcp-tools",
"env": { "WORKSPACE_DIR": "/dados/videos" }
}
}
}Cole isso no .mcp.json (Claude Code), no claude_desktop_config.json (Claude
Desktop) ou no equivalente do seu host. Pronto: peça "corta os 10 primeiros
segundos do intro.mp4" e veja acontecer.
Claude Code neste repositório
Abrindo este repositório no Claude Code nada precisa ser compilado: o hook
SessionStart em .claude/settings.json roda scripts/install-mcp-tools.sh,
que baixa o mcp-tools da última release para bin/ (pasta ignorada pelo
git), e o .mcp.json sobe o servidor por scripts/mcp-tools-run.sh, que espera esse download terminar (ou baixa sozinho) antes de executar bin/mcp-tools. Para atualizar à mão ou
fixar uma versão:
sh scripts/install-mcp-tools.sh # última release
MCP_TOOLS_VERSION=v0.1.0 sh scripts/install-mcp-tools.sh # versão fixa
MCP_TOOLS_FORCE=true sh scripts/install-mcp-tools.sh # baixa de novoPublicar uma release
Automático. A cada merge em producao, o workflow .github/workflows/release.yml
cria a próxima tag vX.Y.Z, compila o binário completo (--features full) para
Linux x86_64 e arm64, macOS Intel e Apple Silicon e Windows, e anexa os pacotes
à release.
Tools
Domínio | Tool | O que faz |
files |
| Lista arquivos do workspace, com filtro por tipo |
files |
| Apaga um arquivo |
video |
| Duração, resolução, fps, codecs |
video |
| Recorta um trecho, com ou sem re-encode |
video |
| Junta vídeos em sequência, com corte seco ou 20 transições (fade, wipe, slide...) |
video |
| Corta as pausas em que ninguém fala, reconhecendo voz por rede neural (Silero VAD) ou por limiar em dB |
video |
| Encontra mudanças de cena |
video |
| Salva um frame como imagem |
video |
| Escreve título ou descrição sobre a imagem |
video |
| Gera um .srt a partir de trechos com tempos |
video |
| Grava legendas de um .srt ou .ass no vídeo, com cor, tamanho e posição |
video |
| Embute título, descrição e autor no arquivo |
video |
| Mistura um áudio de narração no vídeo |
video |
| Insere efeitos sonoros (vine boom, ding, whoosh) em instantes do vídeo, buscando no Freesound se preciso |
video |
| Lista os templates visuais disponíveis |
video |
| Shorts 9:16, quadrado, 16:9, título de abertura, marca d'água |
video |
| Faixa com fundo colorido e texto no topo ou rodapé, o tempo todo ou num intervalo |
video |
| Música de fundo em loop, com fade e ducking de |
video |
| Fade de entrada e saída na imagem e no som |
video |
| Acelera ou desacelera o vídeo todo ou um trecho, mantendo o tom da voz |
video |
| Punch-in de impacto ou zoom progressivo (Ken Burns) em um trecho |
video |
| Acende uma luz colorida de estúdio no fundo (halo radial, de cima, de baixo ou nas laterais), com presets de cor ou cor própria |
video |
| Tira o tremor de câmera na mão, com o vid.stab em dois passes |
video |
| Legenda animada palavra por palavra em .ass, com presets (hormozi, boxed, karaoke, pop, clean, neon), fonte, contorno e sombra |
video |
| Capa do vídeo com título grande, nos tamanhos de YouTube, Shorts e feed |
video |
| Reenquadra 16:9 para 9:16 seguindo o rosto de quem fala (feature |
video |
| Codifica o vídeo final com o preset de TikTok, Reels, Shorts, YouTube ou X, em H.264, H.265 ou AV1, pela placa de vídeo quando há uma |
audio |
| Separa a trilha de áudio |
audio |
| Transcreve fala com timestamps por trecho e por palavra (feature |
audio |
| Normaliza o volume para o loudness da plataforma (EBU R128, duas passadas) |
media |
| Título, duração, descrição e capítulos de uma URL, sem baixar |
media |
| Baixa o vídeo de qualquer site (yt-dlp) para o workspace |
media |
| Busca efeitos sonoros gratuitos no Freesound por descrição em texto |
media |
| Baixa um efeito do Freesound (MP3) para a pasta |
jobs |
| Estado de um job em background |
jobs |
| Saída de um job concluído |
Ative só o que precisa com MCP_DOMAINS=video,files.
O que é baixado, e quando
O binário não traz FFmpeg nem yt-dlp dentro (são ~150 MB e ~30 MB, com licenças próprias). Ele os procura nesta ordem e para na primeira que encontrar:
o caminho em
FFMPEG_BIN,FFPROBE_BINouYTDLP_BIN, se for um caminho;a pasta onde o
mcp-toolsestá;o
PATH;a pasta de cache (
MCP_CACHE_DIR);download, se
MCP_AUTO_DOWNLOAD=true(padrão).
O quê | De onde | Quando |
ffmpeg + ffprobe | builds estáticos BtbN (Linux, Windows) e evermeet.cx (macOS) | primeira tool de vídeo ou áudio |
yt-dlp | release oficial no GitHub (executável standalone, sem Python) | primeiro |
modelo Whisper ( | Hugging Face, repositório | primeiro |
fonte DejaVu | embutida; gravada no cache só se o sistema não tiver fonte | primeira tool com texto |
modelos YuNet e Silero VAD | embutidos no binário ( | nunca baixados |
Cache padrão: ~/.cache/mcp-tools-for-agents (Linux), ~/Library/Caches/mcp-tools-for-agents
(macOS), %LOCALAPPDATA%\mcp-tools-for-agents (Windows). Para um pacote 100% offline,
coloque esses arquivos na pasta do binário (ffmpeg, ffprobe, yt-dlp,
models/ggml-base.bin, fonts/DejaVuSans-Bold.ttf).
Download de qualquer fonte
download_video e get_video_info aceitam qualquer URL http(s). São três
tentativas, nesta ordem:
Extractor nativo do yt-dlp — cobre mais de mil sites.
Extractor genérico — lê o HTML da página e procura
<video>,<source>, HLS.m3u8, DASH.mpd, players conhecidos e JSON-LD.Varredura própria — o servidor busca a página, junta as mídias diretas e desce um nível nos
iframe.
Não há como baixar conteúdo com DRM nem páginas que exigem login. Nesses casos o
hint do erro diz para não insistir.
Efeitos sonoros do Freesound
add_sound_effects recebe uma lista de efeitos com o instante em que cada um
toca e aplica tudo em um único passo do ffmpeg. Cada efeito vem de query
(busca no Freesound), sound_id (resultado de search_sound_effects) ou
audio (arquivo do workspace). A chave da API já vem embutida em config.rs;
FREESOUND_API_KEY no ambiente substitui.
Features opcionais
Algumas tools dependem de bibliotecas pesadas, ligadas por feature do Cargo:
cargo build --release --features transcribe # whisper-rs: transcribe_audio
cargo build --release --features vision # tract + YuNet: smart_crop com mode="face"
cargo build --release --features vad # tract + Silero VAD: remove_silence e ducking com method="vad"
cargo build --release --features full # as três (é o que a release publica)Sem a feature, a tool continua registrada e devolve um erro unavailable
explicando como habilitar; smart_crop segue funcionando com mode="center" e
remove_silence e add_background_music com o limiar de dB (method="db").
O modelo do Silero VAD em core/models/silero_vad_16k.onnx é o oficial (16 kHz,
opset 15) com os nós If resolvidos para forma fixa, que o tract não traduz;
scripts/prepare-silero-vad.py regenera o arquivo a partir do original.
Configuração
Todas as variáveis estão em .env.example. As principais:
Variável | Padrão | Para quê |
|
| Nome ou caminho do yt-dlp |
|
| Baixar ffmpeg, yt-dlp e modelos sob demanda |
| cache do sistema | Onde os downloads ficam |
Como é por dentro
A árvore fica na raiz do crate (o Cargo.toml aponta para a raiz em vez de src/):
server.rs cria o McpServer, monta o Runtime e registra os domínios
config.rs único lugar que lê variáveis de ambiente (Settings)
core/ ffmpeg, paths, jobs, errors, binários externos, rede. Não conhece MCP.
domains/ um módulo por área, um arquivo por tool
tests/ espelha a estrutura acimaUma tool inteira, do jeito que todas são:
pub fn delete_file(runtime: &Runtime, path: &str) -> ToolResult<DeleteFileResult> {
let target = runtime.workspace.existing(path)?;
let size = std::fs::metadata(&target).map(|m| m.len()).unwrap_or(0);
std::fs::remove_file(&target).map_err(|error| {
ToolError::new(format!("Não foi possível apagar '{path}': {error}"), ErrorCode::NotFound)
})?;
Ok(DeleteFileResult { deleted: runtime.workspace.relative(&target), freed_bytes: size })
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Params {
/// Arquivo, relativo ao workspace.
pub path: String,
}
pub fn register(mcp: &mut McpServer, runtime: &Arc<Runtime>) {
let runtime = Arc::clone(runtime);
mcp.tool(
"delete_file",
"Apaga permanentemente um arquivo do workspace.\n\n\
Use para limpar saídas intermediárias. Não há lixeira nem desfazer.",
move |params: Params| guarded(delete_file(&runtime, ¶ms.path)),
);
}Função pura e testável em cima, registro com a description para o agente
embaixo. Err(ToolError) vira {error, code, hint} na resposta.
Contribuir
Quer uma tool nova? Copie domains/files/delete.rs, troque o miolo, escreva o
teste espelhado em tests/, adicione a linha na tabela acima. As regras
completas estão em .claude/rules/arquitetura.md, e se você usa Claude Code,
/nova-tool faz o roteiro.
Antes do PR, os três precisam passar:
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo testOs testes que usam ffmpeg são pulados quando o binário não está instalado.
Licença
MIT. A fonte DejaVu embutida segue a licença Bitstream Vera
(core/fonts/LICENSE-DejaVu.txt); o modelo YuNet é MIT (OpenCV Zoo).
Available Tools
11 toolsconcat_videosA
Junta dois ou mais vídeos na ordem informada em um único arquivo.
Os vídeos devem ter o mesmo codec e resolução (por exemplo, cortes do mesmo original). Os arquivos de entrada não são alterados.
Args: paths: Lista de vídeos, relativa ao workspace, na ordem desejada. output_name: Nome do arquivo de saída. Gerado automaticamente se omitido. background: Executa como job e devolve job_id.
Inputs: paths (required), background, output_name. Returns: result
cut_videoA
Corta o trecho entre start e end (segundos) e salva um novo arquivo.
O original não é modificado. Por padrão copia os streams sem re-encodar, o que é rápido mas corta no keyframe mais próximo. Use reencode=true para corte exato no frame. Para vídeos longos use background=true e acompanhe com job_status.
Args: path: Vídeo de origem, relativo ao workspace. start: Início do trecho em segundos. end: Fim do trecho em segundos. reencode: Re-encoda para corte exato (mais lento). background: Executa como job e devolve job_id.
Inputs: end (required), path (required), start (required), reencode, +1 more. Returns: result
delete_fileA
Apaga permanentemente um arquivo do workspace.
Use para limpar saídas intermediárias. Não há lixeira nem desfazer.
Args: path: Arquivo, relativo ao workspace.
Inputs: path (required). Returns: result
detect_scenesA
Detecta mudanças de cena e devolve os intervalos de cada cena.
Use para decidir onde cortar. Percorre o vídeo inteiro, então em vídeos longos prefira background=true.
Args: path: Vídeo, relativo ao workspace. threshold: Sensibilidade entre 0 e 1. Menor detecta mais cenas. background: Executa como job e devolve job_id.
Inputs: path (required), threshold, background. Returns: result
extract_audioA
Extrai a trilha de áudio de um vídeo para um arquivo separado.
Args: path: Vídeo, relativo ao workspace. audio_format: mp3, wav, aac ou flac. background: Executa como job e devolve job_id.
Inputs: path (required), background, audio_format. Returns: result
extract_frameA
Extrai um único frame do vídeo no instante informado e salva como imagem.
Útil para conferir visualmente o conteúdo antes de cortar.
Args: path: Vídeo, relativo ao workspace. time: Instante em segundos. image_format: png ou jpg.
Inputs: path (required), time (required), image_format. Returns: result
job_resultA
Obtém o resultado de um job que já terminou.
Retorna erro job_not_finished se ainda estiver rodando.
Args: job_id: Id devolvido pela tool que iniciou o job.
Inputs: job_id (required). Returns: result
job_statusA
Informa se um job em background está pending, running, done ou failed.
Quando estiver done, chame job_result para obter a saída.
Args: job_id: Id devolvido pela tool que iniciou o job.
Inputs: job_id (required). Returns: result
list_filesA
Lista os arquivos disponíveis no workspace.
Chame primeiro para descobrir com o que trabalhar. Não altera nada.
Args: directory: Subdiretório do workspace. Raiz por padrão. kind: Filtra por tipo: video, audio, image ou other. recursive: Inclui subdiretórios.
Inputs: kind, directory, recursive. Returns: result
probe_videoA
Lê duração, resolução, fps, codecs e tamanho de um vídeo.
Use antes de cortar ou concatenar para conhecer o arquivo. Não altera nada.
Args: path: Caminho do vídeo, relativo ao workspace.
Inputs: path (required). Returns: result
transcribe_audioA
Transcreve a fala de um áudio ou vídeo, com tempos de cada trecho.
Combine com cut_video para cortar por conteúdo falado. É lento, por isso roda em background por padrão.
Args: path: Áudio ou vídeo, relativo ao workspace. model_size: Modelo whisper: tiny, base, small, medium ou large-v3. language: Código do idioma (pt, en). Detecta automaticamente se omitido. background: Executa como job e devolve job_id.
Inputs: path (required), language, background, model_size. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Each tool targets a distinct operation: audio extraction, transcription, video probing, cutting, concatenation, scene detection, frame extraction, file listing/deletion, and job status/result retrieval. There is no meaningful overlap that would cause an agent to select the wrong tool.
All tool names follow the snake_case verb_noun convention (extract_audio, cut_video, detect_scenes, list_files, delete_file) except job_status and job_result, which are noun_noun but still clearly patterned and consistent with the job subsystem. The style is uniform and predictable.
11 tools is well within the ideal range for a focused media-processing server. Each tool covers a distinct need in the workflow: file discovery, inspection, editing, extraction, cleanup, and async job handling. No tool feels redundant or unnecessary.
The tool surface covers the core video/audio processing lifecycle: inspect, cut, concat, detect scenes, extract audio/frame, and transcribe, plus file and job management. Minor gaps exist such as no job cancellation or listing, and no upload tool, but these do not block the primary workflows.
Maintenance
Related MCP Connectors
FFmpeg as a service for AI agents: typed video editing tools, async jobs, downloadable outputs.
Video, audio, and image processing for AI agents: convert, transcribe, upscale - 150+ operations.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
PDF and image tools for AI agents: compress, merge, split, OCR, sign. Runs locally, never uploads.
Related MCP Servers
- AlicenseBqualityBmaintenanceProvides video and audio manipulation tools powered by FFmpeg, enabling AI assistants to perform media operations such as cutting, converting, and removing silence.6169 npm2MIT
- AlicenseAqualityDmaintenanceProvides AI agents with local file-processing capabilities for token counting, RAG chunking, CSV/JSON conversion, QR generation, and more, while keeping documents private on the user's machine.71MIT
- AlicenseBqualityDmaintenanceEnables AI agents to edit videos locally by inspecting media, applying templates, cutting clips, and delivering finished files, with memory of human preferences.185Apache 2.0
- AlicenseBqualityCmaintenanceEnables MCP-compatible agents to perform local FFmpeg-powered video editing on Linux, including probing media metadata, trimming and re-encoding clips, extracting audio to MP3, and burning SRT subtitles into MP4 files. All operations are confined to a configurable workspace directory, leaving source files untouched and refusing to overwrite existing outputs.4MIT