{"name":"io.github.pachote/nira-video-mcp","slug":"pachote-nira-video-mcp","title":"NIRA Video Production MCP","description":"Video production MCP: 55 tools — edit, grade, TTS captions, beat-sync, master, AI generate.","url":"https://mcp.market/server/pachote-nira-video-mcp","rating":null,"grade":"D","score":48,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":0,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/pachote/nira-video-mcp","website":null,"version":"1.0.3","remotes":[],"packages":[{"registryType":"pypi","identifier":"nira-video-mcp","version":"1.0.3","transport":{"type":"stdio"},"environmentVariables":[{"description":"Working directory for temp files and intermediate renders","format":"string","name":"VIDPROD_WORKSPACE"},{"description":"Default input directory Claude scans for source clips","format":"string","name":"VIDPROD_INPUT"},{"description":"Default output directory for rendered files","format":"string","name":"VIDPROD_OUTPUT"},{"description":"fal.ai API key for cloud AI video generation (Kling, Luma, Veo, Pika)","format":"string","isSecret":true,"name":"FAL_KEY"},{"description":"Path to Wan2GP installation for free local GPU video generation","format":"string","name":"WAN2GP_PATH"}]}],"tools":[{"name":"ai_gen_cancel","description":"Cancel a running AI video generation job. Returns: {render_id, state}","write_action":true,"price_micros":0,"input_schema":null},{"name":"ai_gen_fal","description":"Generate a video using a cloud AI model via fal.ai. model: kling-3.0 (best value), minimax-hailuo-2.3 (cheapest), luma-ray3 (best i2v), veo-3.1 (best quality), pika-2.2. image_path: optional reference image for image-to-video models. aspect_ratio: '16:9', '9:16', '1:1', '4:3'. Returns: {render_id, output_path, estimated_cost_usd} — background job.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ai_gen_list_models","description":"List all available AI video generation models with pricing and capabilities. Returns: {models: [...]}","write_action":false,"price_micros":0,"input_schema":null},{"name":"ai_gen_status","description":"Check the status of an AI video generation job. Returns: {render_id, state, progress, output_path, error}","write_action":false,"price_micros":0,"input_schema":null},{"name":"ai_gen_wan2gp","description":"Generate a video using local Wan2GP (FREE, runs on your 4090). prompt: describe the video you want to generate. duration_frames: number of frames (81=~3s, 121=~5s at 24fps). resolution: '832*480' (fast) or '1280*720' (HD) or '480*832' (vertical). steps: 8 = fast draft, 20 = quality. nsfw_mode: True = adds NSFW LoRA (wan_general_nsfw_v3 at 1.75). image_path: optional input image for image-to-video","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_add_music","description":"Add background music to a video, mixing with existing audio. music_volume: 0.1=very quiet background, 0.25=subtle, 0.5=equal mix. duck_under_voice: reduce music when original audio is loud (sidechain ducking). fade_out_s: music fade-out duration at end. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_detect_beats","description":"Detect BPM and beat timestamps for beat-synced video editing. Uses scipy STFT + autocorrelation (librosa-free, numpy 2.4 compatible). energy: 'low' (cut every 8 beats = slow/cinematic), 'medium' (every 4 beats = bar cuts), 'high' (every 2 beats = energetic). video_duration: if provided, filters cuts to within video length. Returns: {bpm, tempo_confidence, beat_times, cut_points, total_beats}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_duck_smart","description":"Smart sidechain audio ducking: music automatically ducks under voice/dialogue. video_path: video (or audio) containing the voice/narration track. music_path: background music file to duck. duck_db: how many dB to reduce music when voice is active. -12 = moderate, -20 = heavy. attack_ms/release_ms: how fast ducking engages and releases. Returns: {output_path, duck_db}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_extract","description":"Extract audio track from a video file. format: 'wav', 'mp3', 'aac', 'flac'. Returns: {output_path, duration_s}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_master","description":"Full professional mastering chain: EQ → compression → limiting → EBU R128 loudnorm. style: 'music' (-14 LUFS, presence boost, punchy comp), 'podcast' (-16 LUFS, speech-optimised), 'broadcast' (-23 LUFS, EBU R128 strict). target_lufs: override loudness target (ignored if style is 'broadcast'). Works on audio files and video files (passes video stream through unchanged). Returns: {output_path, style","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_mix","description":"Mix multiple audio/video files' audio tracks together. input_paths: up to 8 files to mix. volumes: per-track volume multipliers (1.0 = unity). Defaults to equal mix. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_normalize","description":"Normalize audio to a target loudness (EBU R128 two-pass). target_lufs: -16.0 = YouTube/streaming, -23.0 = broadcast/EBU R128, -14.0 = Spotify. Returns: {output_path, target_lufs}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_replace","description":"Replace the audio track of a video with a new audio file. mix_original: 0.0 = completely replace, 0.3 = 30% original + 70% new audio. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"aud_silence","description":"Remove audio from a video (mute / silent output). Returns: {output_path}","write_action":true,"price_micros":0,"input_schema":null},{"name":"proj_create","description":"Create a named video project to track multiple clips and settings. name: project name (used as identifier). clips: optional list of initial clip paths to add. Returns: {project_id, name, clip_count}","write_action":true,"price_micros":0,"input_schema":null},{"name":"proj_list","description":"List all projects, or get details for a specific project. project_id: if empty, lists all projects. If set, returns that project's clips. Returns: {projects: [...]} or {project: {..., clips: [...]}}","write_action":false,"price_micros":0,"input_schema":null},{"name":"proj_render","description":"Render all clips in a project as a single final video. Clips are concatenated in order with optional transitions between them. transition: 'none', 'fade', 'dissolve', 'wipeleft', 'wiperight'. music_path: optional background music track to add. Returns: {render_id, output_path} — runs as background job.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_cancel","description":"Cancel a running background render job. render_id: the render_id of the job to cancel. Returns: {render_id, state}","write_action":true,"price_micros":0,"input_schema":null},{"name":"render_list","description":"List all render jobs (running, completed, failed). Returns: {jobs: [...], counts: {running, done, failed, cancelled}}","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_status","description":"Check the status of any background render job. render_id: the render_id returned when a background job was started. Returns: {render_id, state, progress, output_path, error, description} States: pending, running, done, failed, cancelled","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_chapters","description":"Embed chapter markers into a video file. chapters: list of {title: str, start_s: float} dicts. Example: [{\"title\": \"Intro\", \"start_s\": 0}, {\"title\": \"Demo\", \"start_s\": 30}] Returns: {output_path, chapter_count}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_chromakey","description":"Remove green/blue screen and composite over a background. foreground_path: footage with green/blue screen. background_path: background video or image. key_color: 'green', 'blue', or hex like '0x3CB043'. similarity: 0.1 = tight key (needs clean lighting), 0.3 = loose key. blend: 0.0 = hard edge, 0.15 = soft anti-aliased edge. Returns: {output_path}","write_action":true,"price_micros":0,"input_schema":null},{"name":"vid_concat","description":"Concatenate multiple video clips in order. input_paths: list of paths to concat (must all be same resolution/fps for stream-copy). re_encode: True = re-encode to ensure compatibility (recommended). Returns: {output_path, duration_s, clip_count}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_export","description":"Export video with platform-optimized encoding preset. platform: youtube_4k, youtube_1080, youtube_shorts, tiktok, instagram_reels, instagram_feed, twitter, facebook, linkedin, prores_4444, prores_422, h265_4k, av1_web, gif, web_mp4, nirasynth_xxx. Returns: {output_path, platform, size_mb}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_export_hls","description":"Export video as HLS adaptive bitrate ladder (for streaming). Creates 3 renditions: 1080p, 720p, 480p + master playlist. output_subdir: directory name inside OUTPUT_DIR for HLS files. Returns: {playlist_path, renditions}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_filter","description":"Apply a raw FFmpeg -vf filter string to a video. filter_string: any valid FFmpeg video filter chain, e.g. 'eq=brightness=0.1:saturation=1.5' or 'gblur=sigma=5,vignette'. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_glitch","description":"Apply retro/glitch effects. style: 'vhs' = VHS tape look, 'rgb_split' = color channel separation, 'scanlines' = CRT scanline overlay, 'datamosh' = pixel smear effect. intensity: 1–15 (effect strength). Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_grade","description":"Apply a cinematic color grade preset. look: teal_orange, vintage_film, blockbuster, noir, warm_golden, cold_blue, lifted_blacks, flat. grain: 0=no grain, 5=subtle, 10=moderate, 18=heavy film grain. Returns: {output_path, look}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_grain","description":"Add cinematic film grain. Luma-only (more authentic). strength: 5=subtle, 10=moderate, 18=heavy analog film. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_halation","description":"Add cinematic film halation — red/orange glow around bright highlights. strength: 0.2=subtle, 0.45=authentic film, 0.8=heavy. glow_radius: gaussian blur radius for glow spread (default 18). Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_inspect","description":"Inspect a video file — returns duration, fps, resolution, codecs, size. path: absolute path inside workspace/input/output dirs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_list_workspace","description":"List video files available in the workspace/output directories. subdir: optional subdirectory name within OUTPUT_DIR to list. Returns dict with 'workspace', 'output', 'input' file lists.","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_loop","description":"Loop a video clip N times or to fill a target duration. loop_count: number of times to repeat (-1 if using total_duration_s). total_duration_s: if > 0, loop until this duration is reached. Returns: {output_path, duration_s}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_lower_third","description":"Add a professional animated lower third (name + job title) to a video. Accent bar slides in from left, then name and title fade up. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_lut","description":"Apply a .cube LUT file to a video. lut_path: path to .cube LUT file (must be in E:/NIRA_VIDEO_MCP/luts/ or workspace). intensity: 0.0–1.0 blend strength (1.0 = full LUT, 0.5 = 50% mix with original). chain_filters: optional additional -vf filters to append after LUT. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_manim_render","description":"Render a Manim Community animation from Python scene code. scene_code: complete Python source defining a Scene subclass. scene_class: name of the Scene class to render. quality: 'l'=480p, 'm'=720p, 'h'=1080p, 'k'=4K. Returns: {output_path, render_id} Runs as background job — poll render_status for completion.","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_metadata","description":"Read or write video file metadata (title, artist, year, comment, etc.). read_only: True = just return current metadata, no output file. metadata: dict of key/value pairs to embed (e.g. {\"title\": \"My Video\", \"year\": \"2026\"}). Returns: {output_path} when writing, or {metadata} when reading.","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_motion_blur","description":"Add motion blur by blending adjacent frames (simulates 180° film shutter). frames: 2=subtle, 4=cinematic, 8=heavy blur (slow motion look). Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_overlay","description":"Composite one video over another (picture-in-picture / watermark). base_path: background video. overlay_path: video or image to composite on top. x, y: pixel offset for overlay (top-left corner). opacity: 0.0–1.0. start_s / end_s: time range when overlay is visible (-1 = full duration). Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_probe","description":"Full ffprobe JSON dump for a video — all streams, format metadata. Use vid_inspect for a quick summary.","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_progress_bar","description":"Add an animated progress bar that fills across the video duration. position: 'top' or 'bottom'. color: hex color or named color. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_resize","description":"Resize video to target dimensions. fit: 'contain' = letterbox/pillarbox (no crop), 'cover' = crop to fill, 'stretch' = distort to exact size. Returns: {output_path, width, height}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_reverse","description":"Reverse a video clip (plays backwards). Audio is also reversed. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_speed","description":"Change video playback speed. speed: 0.25 = 4x slow motion, 0.5 = 2x slow, 1.0 = normal, 2.0 = 2x fast, 4.0 = 4x fast. Audio is pitch-shifted accordingly. Returns: {output_path, duration_s, speed}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_stabilize","description":"Stabilize shaky video footage (two-pass vidstab). smoothing: 10=moderate, 30=smooth, 100=locked-off tripod look. shakiness: 1–10, how shaky the source is. Returns: {output_path, render_id} — runs as background job (may take a while).","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_subtitles","description":"Add subtitles to a video from an SRT file. burn_in: True = render text into frames (compatible everywhere). False = add as soft subtitle track (MKV/MP4 container only). Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_text_overlay","description":"Add animated text overlay to a video. position: 'center', 'top', 'bottom', 'top_left', 'top_right', 'bottom_left', 'bottom_right', or 'x=100:y=200'. animation: 'fade', 'slide_up', 'typewriter', 'none'. duration_s: -1 = entire video. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_thumbnail","description":"Extract a single frame from a video as a JPEG image. timestamp_seconds: position in video to grab (default 1.0s). width: output thumbnail width in pixels (height auto-scaled).","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_thumbnail_sprite","description":"Generate a thumbnail sprite sheet (contact sheet) for video scrubbing UIs. interval_s: how many seconds between each thumbnail. thumb_width: width of each thumbnail in pixels. Returns: {output_path, count, columns}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_title_card","description":"Generate a standalone animated title card video (no input needed). Title slides up and fades in, then fades out. Use vid_concat to prepend it to another clip. Returns: {output_path, duration_s}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_transition","description":"Concatenate two clips with an xfade transition between them. transition: fade, dissolve, wipeleft, wiperight, wipeup, wipedown, slideleft, slideright, slideup, slidedown, circlecrop, rectcrop, distance, radial, smoothleft, smoothright, smoothup, smoothdown, circleopen, circleclose, vertopen, vertclose, horzopen, horzclose, fadegrays, pixelize. duration_s: length of the crossfade (default 1.0s). Re","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_trim","description":"Trim a video to a start/end time range. start_seconds: trim start (default 0). end_seconds: trim end (-1 = until end of file). re_encode: False = stream-copy (fast, may be slightly imprecise at cut points). True = re-encode (slow, frame-accurate). Returns: {output_path, duration_s}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_tts_caption","description":"Generate TTS voiceover from script using ElevenLabs, mix with video, and optionally produce SRT caption file with word-level timestamps. Requires ELEVENLABS_API_KEY environment variable. voice_id: ElevenLabs voice ID. Default = Rachel (calm narration). Other voices: AZnzlk1XvdvUeBnXmlld (Domi), TxGEqnHWrfWFTfGW9XjX (Josh/deep). mix_volume: volume of TTS voice in final mix (1.0 = full, 0.7 = slight","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_vignette","description":"Add a cinematic vignette (dark edges) to a video. strength: 0.2=subtle, 0.5=moderate, 0.8=heavy. Returns: {output_path}","write_action":false,"price_micros":0,"input_schema":null},{"name":"vid_waveform","description":"Generate an audio waveform image from a video file. Returns a PNG image showing the audio waveform.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":48,"grade":"D","scanned_at":"2026-09-27T17:06:02.477Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-27T17:06:02.468Z","components":{"code":{"score":20,"max":25,"notes":["17 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"exec.shell-true","severity":"medium","component":"code","title":"subprocess with shell=True","evidence":"nira_video_mcp-1.0.3/tools/ffmpeg_utils.py: …FFmpeg subprocess utilities. Never uses shell=True. \"\"\" import asyncio import json import …"}],"inputs":{"packages":[{"registryType":"pypi","identifier":"nira-video-mcp","version":"1.0.3","found":true,"license":"MIT","dependencyCount":4,"publishedAt":"2026-05-28T02:12:20.819647Z","repositoryUrl":"https://github.com/pachote/nira-video-mcp"}],"repo":{"found":false,"owner":"pachote","repo":"nira-video-mcp","error":"repo not found"},"icon":{"url":null,"source":"none"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":"MIT","lastPushAt":null,"score":0}}}},"grade_history":[],"reviews":[]}