Kit para agentes
Un prompt para pegar, una skill que tu agente carga solo y recetas de FFmpeg para terminar anuncios.
Prompt para el agente
Pégalo al empezar una sesión de Claude Code, Codex o Cursor, después de conectar el servidor MCP.
Haces anuncios para tiendas online con Staglight usando sus herramientas MCP (servidor "staglight"). Docs: https://staglight.ai/es/docs
Reglas de gasto
- Antes de algo de pago, dime el precio (estimate_cost es gratis) y pregúntame una vez. Nunca gastes más de lo que aprobé.
- Envía max_credits y un idempotency_key nuevo (un UUID) en cada llamada de pago.
- Las herramientas de pago responden al momento con un job_id o run_id. Consulta get_job, get_ad o studio_get_run con wait_seconds=50 hasta que termine.
- Solo un enlace de producto ("hazme un anuncio para https://..."): studio_helper(studio=link_ad, name=link_scan, payload.url, siempre con un idempotency_key que el reintento repite, o el reintento vuelve a leer y a cobrar) lee esa página (el precio fijo y pequeño del análisis) y devuelve las fotos, el nombre y una línea; después studio_estimate y studio_run en link_ad con la mejor foto.
- Si se agota el tiempo de espera o hay un error, nunca repitas a ciegas una llamada de pago: primero llama a list_jobs con el mismo idempotency_key.
- Si se acaban los créditos, dame el enlace de buy_credits_link y para.
Cómo trabajar
- Si adjunto una foto o un clip del producto: upload_file y después create_product con su nombre y sus fotos. O usa list_products, o upload_from_url con un enlace directo al archivo.
- Un anuncio en video terminado: estimate_cost para create_ad (tier "draft" salvo que pida más calidad), dime el precio y, cuando diga que sí, llama a create_ad con auto=true y max_credits = el precio que aprobé. Si mi pedido es poco concreto, usa create_ad_from_brief con auto=true y el presupuesto que aprobé.
- Consulta get_ad hasta que esté succeeded y dame el archivo. Si se detiene (auto_stopped), dime por qué y cuánto cuesta seguir.
- Imágenes de producto (carrusel de tienda, anuncios estáticos, fotos UGC): el Estudio de anuncios con studio_list, studio_estimate, studio_run y después studio_get_run.
- Descarga los archivos terminados con curl -L -o en ./ads/ y termínalos con ffmpeg: 9:16 a 1080x1920, subtítulos, -14 LUFS.
- Mantén la etiqueta de contenido generado con IA. Nunca presentes un video estilo creador como la reseña de un cliente real.
Pídelo con tus palabras
Con el servidor MCP conectado, adjunta una foto del producto y di lo que quieres. El agente la sube, guarda el producto, te dice el precio, te pregunta una vez y te devuelve el archivo terminado. Por ejemplo:
- "Hazme un anuncio UGC de 15 segundos de este sérum para Reels. Que no pase de 3 dólares."
- "Aquí tienes 3 fotos de mi taza de cerámica. Guárdala como producto y hazme un video vertical del producto en español."
- "Convierte esta foto en un carrusel para mi tienda: fondo blanco, una foto de ambiente y un primer plano de la etiqueta."
- "Algo para TikTok que venda esta botella de agua a gente que va al gimnasio. Dime antes el precio."
Tu visto bueno fija un tope de créditos para todo el anuncio: nunca gasta más y, si el siguiente paso lo superara, se detiene a preguntarte.
Skill para Claude Code, Codex y Cursor
La skill le dice a tu agente cuándo usar Staglight, las reglas de gasto y cómo terminar los anuncios. Los agentes la cargan solos cuando la tarea encaja.
- SKILL.md para leerla primero.
- staglight-ads.zip con la skill, las recetas de FFmpeg y un script para terminar anuncios.
- Necesita el servidor MCP conectado, y curl y ffmpeg instalados en el equipo.
Claude Code
mkdir -p ~/.claude/skills && curl -sL -o /tmp/staglight-ads.zip https://staglight.ai/agent/staglight-ads.zip \
&& unzip -o /tmp/staglight-ads.zip -d ~/.claude/skills/
Codex y Cursor
mkdir -p ~/.agents/skills && curl -sL -o /tmp/staglight-ads.zip https://staglight.ai/agent/staglight-ads.zip \
&& unzip -o /tmp/staglight-ads.zip -d ~/.agents/skills/
Claude Code carga la skill en la sesión que tienes abierta; otros agentes pueden necesitar una sesión nueva para verla.
Archivos del plugin para Claude Code
Para equipos con su propio marketplace de plugins: la carpeta del plugin trae .claude-plugin/plugin.json, .mcp.json y la skill. Al instalarlo pide la clave y la guarda en el almacén seguro del sistema.
curl -sL -o staglight-plugin.zip https://staglight.ai/agent/staglight-plugin.zip && unzip -o staglight-plugin.zip
claude plugin validate ./staglight
Para una sola persona, el comando claude mcp add y la skill de arriba hacen lo mismo.
Terminar anuncios con FFmpeg
Descarga las tomas y termínalas en tu equipo. Salida: H.264 yuv420p, AAC a 48 kHz y +faststart para que el video empiece antes de cargarse entero. Los subtítulos necesitan FFmpeg compilado con libass.
finish_ad.sh ajusta una toma al formato, deja el volumen en -14 LUFS en dos pasadas y añade faststart:
curl -sLO https://staglight.ai/agent/staglight-ads/scripts/finish_ad.sh
bash finish_ad.sh take.mp4 final.mp4 9:16
Inspeccionar un archivo
Duración, tamaño, fotogramas por segundo y frecuencia de muestreo en JSON.
ffprobe -v error -show_entries format=duration:stream=codec_type,width,height,r_frame_rate,sample_rate -of json in.mp4
Encajar en 9:16 con bandas
Mantiene el cuadro entero y rellena hasta 1080x1920.
ffmpeg -i in.mp4 -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1,fps=30,format=yuv420p" \
-c:v libx264 -preset medium -crf 18 -c:a aac -b:a 192k -ar 48000 -ac 2 -movflags +faststart out_916.mp4
Llenar el 9:16 recortando al centro
Llena el cuadro y recorta los lados.
ffmpeg -i in.mp4 -vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1,fps=30,format=yuv420p" \
-c:v libx264 -crf 18 -c:a aac -b:a 192k -ar 48000 -movflags +faststart out_916.mp4
9:16 con fondo desenfocado
Para tomas de producto hechas en 16:9 o 1:1. El mapa 0:a? omite el audio si no lo hay.
ffmpeg -i in.mp4 -filter_complex "[0:v]split=2[bg][fg];[bg]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,gblur=sigma=40[bg];[fg]scale=1080:1920:force_original_aspect_ratio=decrease[fg];[bg][fg]overlay=(W-w)/2:(H-h)/2,setsar=1,fps=30,format=yuv420p[v]" \
-map "[v]" -map 0:a? -c:v libx264 -crf 18 -c:a aac -b:a 192k -movflags +faststart out_916.mp4
Unir clips de tamaños distintos
Una sola recodificación. El tercer clip no tiene sonido, así que recibe una pista en silencio igual de larga (5,04 s aquí, según ffprobe).
ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -filter_complex "
[0:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v0];
[1:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v1];
[2:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v2];
[0:a]aresample=48000,aformat=channel_layouts=stereo[a0];
[1:a]aresample=48000,aformat=channel_layouts=stereo[a1];
anullsrc=r=48000:cl=stereo,atrim=0:5.04[a2];
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -crf 18 -preset medium -c:a aac -b:a 192k -movflags +faststart joined.mp4
Incrustar subtítulos con estilo (ASS)
Pon PlayResX 1080 y PlayResY 1920 en el encabezado del .ass para que los márgenes cuadren en 9:16. Usa fuentes con ñ, á, ¿ y ¡.
ffmpeg -i in.mp4 -vf "ass=captions.ass:fontsdir=./fonts" -c:v libx264 -crf 18 -c:a copy -movflags +faststart captioned.mp4
Incrustar subtítulos SRT con estilo
MarginV sube los subtítulos por encima de los botones de la plataforma.
ffmpeg -i in.mp4 -vf "subtitles=captions.srt:fontsdir=./fonts:force_style='FontName=Archivo,FontSize=14,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,BorderStyle=1,Outline=3,Alignment=2,MarginV=160'" \
-c:v libx264 -crf 18 -c:a copy -movflags +faststart captioned.mp4
Volumen a -14 LUFS (dos pasadas)
La primera pasada mide. Copia los valores medidos de loud.txt en la segunda.
ffmpeg -hide_banner -i in.mp4 -af loudnorm=I=-14:TP=-1.0:LRA=11:print_format=json -f null - 2> loud.txt
ffmpeg -i in.mp4 -af "loudnorm=I=-14:TP=-1.0:LRA=11:measured_I=-20.3:measured_TP=-3.1:measured_LRA=6.2:measured_thresh=-30.6:offset=0.4:linear=true" \
-ar 48000 -c:v copy -c:a aac -b:a 192k out_loud.mp4
Voz en off sobre música que baja
La música baja mientras habla la voz y después la mezcla queda en -14 LUFS.
ffmpeg -i video.mp4 -i vo.wav -stream_loop -1 -i music.mp3 -filter_complex "
[1:a]aresample=48000,aformat=channel_layouts=stereo,asplit=2[vo][vokey];
[2:a]aresample=48000,aformat=channel_layouts=stereo,volume=0.35[mus];
[mus][vokey]sidechaincompress=threshold=0.03:ratio=8:attack=20:release=400[ducked];
[vo][ducked]amix=inputs=2:duration=longest:dropout_transition=0:normalize=0,loudnorm=I=-14:TP=-1.0:LRA=11[a]" \
-map 0:v -map "[a]" -c:v copy -c:a aac -b:a 192k -ar 48000 -shortest -movflags +faststart final.mp4
Logo
Abajo a la derecha, por encima de la zona donde Reels y TikTok ponen sus botones. Ajusta el margen a tu ubicación.
ffmpeg -i in.mp4 -i logo.png -filter_complex "[1:v]scale=220:-1,format=rgba,colorchannelmixer=aa=0.85[lg];[0:v][lg]overlay=W-w-40:H-h-260" \
-c:v libx264 -crf 18 -c:a copy -movflags +faststart branded.mp4
Recortar
El primer comando es rápido y corta en fotogramas clave. El segundo es exacto al fotograma.
ffmpeg -ss 2.0 -i in.mp4 -t 10 -c copy cut_fast.mp4
ffmpeg -ss 2.0 -i in.mp4 -t 10 -c:v libx264 -crf 18 -c:a aac cut_exact.mp4
Fotogramas
Primer fotograma, último fotograma (para continuar un clip desde ahí) y una hoja de contactos para revisar una toma.
ffmpeg -i in.mp4 -frames:v 1 first.png
ffmpeg -sseof -1 -i in.mp4 -update 1 -q:v 1 last.jpg
ffmpeg -i in.mp4 -vf "fps=1/2,scale=270:-2,tile=4x3" -frames:v 1 contact.jpg
Congelar el último fotograma
Dos segundos más para una pantalla final o una llamada a la acción.
ffmpeg -i in.mp4 -vf "tpad=stop_mode=clone:stop_duration=2" -af "apad=pad_dur=2" -c:v libx264 -crf 18 -c:a aac out.mp4
Otros formatos
4:5 para el feed, 1:1 y 16:9 a partir de la misma toma.
ffmpeg -i in.mp4 -vf "scale=1080:1350:force_original_aspect_ratio=increase,crop=1080:1350,setsar=1" -c:v libx264 -crf 18 -c:a copy out_45.mp4
ffmpeg -i in.mp4 -vf "scale=1080:1080:force_original_aspect_ratio=increase,crop=1080:1080,setsar=1" -c:v libx264 -crf 18 -c:a copy out_11.mp4
ffmpeg -i in.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,setsar=1" -c:v libx264 -crf 18 -c:a copy out_169.mp4
Quitar los metadatos técnicos
Solo quita las etiquetas de GPS, dispositivo y codificador. Mantén la etiqueta de contenido generado con IA en el anuncio.
ffmpeg -i in.mp4 -map 0 -map_metadata -1 -map_chapters -1 -c copy -fflags +bitexact out_clean.mp4