Metadata-Version: 2.5
Name: kinocut
Version: 1.16.4
Summary: Trusted, guardrailed video editing for AI agents. FFmpeg, Hyperframes, repurposing tools, Python client, CLI, and MCP server.
Project-URL: Homepage, https://kinocut.dev/
Project-URL: Documentation, https://github.com/KyaniteLabs/kinocut#readme
Project-URL: Repository, https://github.com/KyaniteLabs/kinocut
Project-URL: Bug Tracker, https://github.com/KyaniteLabs/kinocut/issues
Project-URL: Changelog, https://github.com/KyaniteLabs/kinocut/blob/master/CHANGELOG.md
Project-URL: Discussions, https://github.com/KyaniteLabs/kinocut/discussions
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: agents,ai,ai-video,chroma-key,claude,claude-code,cli,codex,color-grading,cursor,editing,ffmpeg,hyperframes,mcp,mcp-server,model-context-protocol,stabilization,subtitle,subtitles,transcription,video,video-automation,video-processing,whisper
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Multimedia :: Sound/Audio
Classifier: Topic :: Multimedia :: Video
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: anyio>=4.14.2
Requires-Dist: click>=8.3.3
Requires-Dist: cryptography>=50.0.0
Requires-Dist: mcp<2,>=1.28.1
Requires-Dist: pydantic-settings>=2.14.2
Requires-Dist: pydantic>=2.13.2
Requires-Dist: pyjwt>=2.15.0
Requires-Dist: python-multipart>=0.0.31
Requires-Dist: rich>=15.0.0
Requires-Dist: starlette>=1.3.1
Provides-Extra: ai
Requires-Dist: basicsr>=1.4; (python_version < '3.13') and extra == 'ai'
Requires-Dist: demucs>=4.0; extra == 'ai'
Requires-Dist: imagehash>=4.3; extra == 'ai'
Requires-Dist: numpy>=2.0.0; extra == 'ai'
Requires-Dist: openai-whisper>=20231117; extra == 'ai'
Requires-Dist: opencv-contrib-python>=4.10; extra == 'ai'
Requires-Dist: pillow>=12.3.0; extra == 'ai'
Requires-Dist: realesrgan>=0.3; (python_version < '3.13') and extra == 'ai'
Requires-Dist: setuptools>=83.0.0; extra == 'ai'
Requires-Dist: torch>=2.13.0; extra == 'ai'
Requires-Dist: torchaudio>=2.0; extra == 'ai'
Requires-Dist: torchcodec>=0.8; extra == 'ai'
Requires-Dist: torchvision>=0.28.0; (python_version < '3.13') and extra == 'ai'
Requires-Dist: urllib3>=2.8.0; extra == 'ai'
Provides-Extra: ai-scene
Requires-Dist: imagehash>=4.3; extra == 'ai-scene'
Requires-Dist: pillow>=12.3.0; extra == 'ai-scene'
Provides-Extra: all-ai
Requires-Dist: basicsr>=1.4; (python_version < '3.13') and extra == 'all-ai'
Requires-Dist: demucs>=4.0; extra == 'all-ai'
Requires-Dist: imagehash>=4.3; extra == 'all-ai'
Requires-Dist: librosa>=0.10; extra == 'all-ai'
Requires-Dist: msgpack>=1.2.1; extra == 'all-ai'
Requires-Dist: numpy>=2.0.0; extra == 'all-ai'
Requires-Dist: openai-whisper>=20231117; extra == 'all-ai'
Requires-Dist: opencv-contrib-python>=4.10; extra == 'all-ai'
Requires-Dist: pillow>=12.3.0; extra == 'all-ai'
Requires-Dist: realesrgan>=0.3; (python_version < '3.13') and extra == 'all-ai'
Requires-Dist: scipy>=1.10; extra == 'all-ai'
Requires-Dist: setuptools>=83.0.0; extra == 'all-ai'
Requires-Dist: soundfile>=0.12; extra == 'all-ai'
Requires-Dist: torch>=2.13.0; extra == 'all-ai'
Requires-Dist: torchaudio>=2.0; extra == 'all-ai'
Requires-Dist: torchcodec>=0.8; extra == 'all-ai'
Requires-Dist: torchvision>=0.28.0; (python_version < '3.13') and extra == 'all-ai'
Requires-Dist: urllib3>=2.8.0; extra == 'all-ai'
Provides-Extra: audio
Requires-Dist: numpy>=1.24; extra == 'audio'
Provides-Extra: audio-ai
Requires-Dist: numpy>=1.24; extra == 'audio-ai'
Provides-Extra: audio-all
Requires-Dist: librosa>=0.10; extra == 'audio-all'
Requires-Dist: msgpack>=1.2.1; extra == 'audio-all'
Requires-Dist: numpy>=1.24; extra == 'audio-all'
Requires-Dist: scipy>=1.10; extra == 'audio-all'
Requires-Dist: soundfile>=0.12; extra == 'audio-all'
Requires-Dist: urllib3>=2.8.0; extra == 'audio-all'
Provides-Extra: audio-analysis
Requires-Dist: librosa>=0.10; extra == 'audio-analysis'
Requires-Dist: msgpack>=1.2.1; extra == 'audio-analysis'
Requires-Dist: numpy>=1.24; extra == 'audio-analysis'
Requires-Dist: soundfile>=0.12; extra == 'audio-analysis'
Requires-Dist: urllib3>=2.8.0; extra == 'audio-analysis'
Provides-Extra: audio-enhanced
Requires-Dist: numpy>=1.24; extra == 'audio-enhanced'
Requires-Dist: scipy>=1.10; extra == 'audio-enhanced'
Requires-Dist: soundfile>=0.12; extra == 'audio-enhanced'
Provides-Extra: audio-midi
Requires-Dist: numpy>=1.24; extra == 'audio-midi'
Provides-Extra: client
Requires-Dist: pillow>=12.3.0; extra == 'client'
Provides-Extra: dev
Requires-Dist: numpy>=1.26; extra == 'dev'
Requires-Dist: pillow>=12.3.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest-cov>=6.0; extra == 'dev'
Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: rich>=15.0.0; extra == 'dev'
Requires-Dist: ruff>=0.15.11; extra == 'dev'
Requires-Dist: scikit-learn>=1.3; extra == 'dev'
Requires-Dist: webcolors>=1.13; extra == 'dev'
Provides-Extra: hyperframes
Provides-Extra: image
Requires-Dist: numpy>=1.26; extra == 'image'
Requires-Dist: pillow>=12.3.0; extra == 'image'
Requires-Dist: scikit-learn>=1.3; extra == 'image'
Requires-Dist: webcolors>=1.13; extra == 'image'
Provides-Extra: image-ai
Requires-Dist: anthropic>=0.96.0; extra == 'image-ai'
Requires-Dist: numpy>=1.26; extra == 'image-ai'
Requires-Dist: pillow>=12.3.0; extra == 'image-ai'
Requires-Dist: scikit-learn>=1.3; extra == 'image-ai'
Requires-Dist: webcolors>=1.13; extra == 'image-ai'
Provides-Extra: object-matte
Requires-Dist: numpy>=1.26; extra == 'object-matte'
Requires-Dist: onnxruntime>=1.17; extra == 'object-matte'
Requires-Dist: pillow>=12.3.0; extra == 'object-matte'
Provides-Extra: stems
Requires-Dist: demucs>=4.0; extra == 'stems'
Requires-Dist: setuptools>=83.0.0; extra == 'stems'
Requires-Dist: torch>=2.13.0; extra == 'stems'
Requires-Dist: torchaudio>=2.0; extra == 'stems'
Requires-Dist: torchcodec>=0.8; extra == 'stems'
Provides-Extra: transcribe
Requires-Dist: openai-whisper>=20231117; extra == 'transcribe'
Requires-Dist: setuptools>=83.0.0; extra == 'transcribe'
Requires-Dist: torch>=2.13.0; extra == 'transcribe'
Requires-Dist: urllib3>=2.8.0; extra == 'transcribe'
Provides-Extra: upscale
Requires-Dist: basicsr>=1.4; (python_version < '3.13') and extra == 'upscale'
Requires-Dist: numpy>=2.0.0; extra == 'upscale'
Requires-Dist: opencv-contrib-python>=4.10; extra == 'upscale'
Requires-Dist: pillow>=12.3.0; extra == 'upscale'
Requires-Dist: realesrgan>=0.3; (python_version < '3.13') and extra == 'upscale'
Requires-Dist: setuptools>=83.0.0; extra == 'upscale'
Requires-Dist: torch>=2.13.0; extra == 'upscale'
Requires-Dist: torchvision>=0.28.0; (python_version < '3.13') and extra == 'upscale'
Requires-Dist: urllib3>=2.8.0; extra == 'upscale'
Description-Content-Type: text/markdown

<!-- mcp-name: tech.kyanitelabs/kinocut -->

# Kinocut

Guarded local video editing for agents, with a CLI, Python client and MCP server.
Kinocut uses FFmpeg and ffprobe for media inspection, editing, subtitles, audio
and quality checks. Optional workflows include Hyperframes, Revideo and model-assisted
analysis.

## Install and inspect

Requires Python 3.11 or newer, plus FFmpeg and ffprobe on `PATH`.

```bash
pip install kinocut
kino doctor
kino info input.mp4
```

Agent plugins launch a specific published version through uv. Follow the
[plugin instructions](https://github.com/KyaniteLabs/kinocut/tree/master/plugins/kinocut)
for the host you use. Kinocut also provides `from kinocut import Client`; the
older `mcp_video` import remains supported.

## Output safety

Prefer new output paths. Replacing an existing output requires explicit
`overwrite=true` (CLI `--overwrite`). Existing non-media artifacts also require
evidence that the same durable job created them. Agent configuration homes are
protected. Use one writer per output, check the result, and require human
visual/audio review before publishing.

## Optional model calls and network use

Ordinary local FFmpeg editing and color grading need no account, model SDK or
API key. Kinocut's optional vision calls default to `KINOCUT_VISION_MODE=off`.
For observations with your chosen provider, prepare local images through
Kinocut and inspect them with the host agent's image tools, including local
models. Kinocut does not automatically inherit the host's model configuration.

Kinocut's own optional product-description adapter requires an
Anthropic-compatible endpoint and explicit local or remote configuration.
The separate sampled-frame Anthropic QC path also requires explicit remote
permission and configuration. A local/custom product route cannot activate it.

Installing packages downloads dependencies. URL inputs download requested media;
font and model-weight features may fetch assets from GitHub. Explicit Revideo
installation runs `npm ci` and may download renderer/browser dependencies.
Revideo telemetry defaults off. Hyperframes is a separately installed CLI:
Kinocut sets telemetry opt-outs, skips passive update checks and disables
implicit capture/snapshot model analysis. Docker rendering and browser previews
without a verified opt-out require explicit telemetry consent.

These controls are not a network sandbox. Inspect executable scenes and project
assets before use. See the
[vision and network policy](https://github.com/KyaniteLabs/kinocut/blob/master/docs/VISION_PRIVACY.md)
for configuration, supported preview versions and limits.

[Documentation](https://github.com/KyaniteLabs/kinocut#readme) ·
[Release notes](https://github.com/KyaniteLabs/kinocut/releases) ·
[Issues](https://github.com/KyaniteLabs/kinocut/issues) ·
[Website](https://kinocut.dev/)
