clipwright-stabilize
MCP tool for video shake detection and OTIO timeline stabilize annotation generation.
Overview
Runs ffmpeg vidstabdetect to generate a .trf transform file,
estimates shake severity from the binary TRF1 data (best-effort heuristic),
and writes a stabilize directive to timeline-level
metadata["clipwright"]["stabilize"].
Performs detection only (OTIO annotation); realization (vidstabtransform application)
is done once by clipwright-render (design M3: separation of detection and application).
Severity estimation:
- Reads the binary TRF1 file produced by vidstabdetect.
- Scans all IEEE-754 little-endian doubles, computes mean absolute value.
- Normalises by a pinned heuristic constant (
_NORM_PX = 30.0 px) to derive a severity in[0.0, 1.0]. - Returns
severity=nullwhen the file cannot be parsed (non-fatal; render does not use severity).
Prerequisites
- Python 3.11 or later
- ffmpeg compiled with
--enable-libvidstabmust exist on PATH or full path set in environment variableCLIPWRIGHT_FFMPEG. Standard distribution builds (apt, brew, choco) may NOT include libvidstab. Use a build that explicitly enables the vidstab filter.
export CLIPWRIGHT_FFMPEG=/path/to/ffmpeg-with-libvidstab
export CLIPWRIGHT_FFPROBE=/path/to/ffprobe
MCP Tool
clipwright_detect_shake
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
media |
string |
required | Input video file path (video stream required) |
output |
string |
required | Output OTIO timeline path (.otio, same directory as media) |
options.shakiness |
int |
5 |
vidstabdetect shakiness 1-10 (higher = assume more shake) |
options.accuracy |
int |
15 |
vidstabdetect accuracy 1-15 (higher = more accurate / slower) |
options.smoothing |
int |
30 |
vidstabtransform smoothing window in frames 0-1000 |
timeline |
string | null |
null |
Existing OTIO timeline path (if specified, append stabilize directive) |
Return value
The tool returns a ToolResult envelope:
{
"ok": true,
"summary": "Shake analysis of video.mp4 complete. severity=0.312, shakiness=5, smoothing=30. Stabilize directive and video.stabilize.trf written; apply with clipwright-render.",
"data": {
"severity": 0.312,
"shakiness": 5,
"accuracy": 15,
"smoothing": 30,
"trf_basename": "video.stabilize.trf"
},
"artifacts": [
{"role": "timeline", "path": "out.otio", "format": "otio"},
{"role": "analysis", "path": "video.stabilize.trf", "format": "trf"}
],
"warnings": []
}
When libvidstab is not compiled into the ffmpeg build, the tool returns
UNSUPPORTED_OPERATION with installation guidance (no path or raw stderr exposed).
Dependencies
| Package | Purpose |
|---|---|
clipwright |
Shared types, envelope, errors, process.run |
mcp[cli] |
MCP server |
pydantic |
Parameter validation |
ffmpeg is invoked as a separate process (via PATH or environment variable) for license independence.
Detection and Render Two-Phase Flow
- detect (this tool):
ffmpeg -i <media> -vf "vidstabdetect=result=<stem>.stabilize.trf:shakiness=<n>:accuracy=<n>" -f null -generates.trfand saves the stabilize directive to OTIO annotation. - render (clipwright-render): reads
metadata["clipwright"]["stabilize"]and appliesvidstabtransform=input=<basename>:smoothing=<n>in the ffmpeg filter graph usingcwd=<trf parent directory>for Windows-safe relative path resolution.
Installation and Startup
Within a uv workspace:
uv run --package clipwright-stabilize clipwright-stabilize
Or install directly:
uv add clipwright-stabilize
clipwright-stabilize
Metadata
Release files for clipwright-stabilize 0.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| clipwright_stabilize-0.5.1.tar.gz | 14.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| clipwright_stabilize-0.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.3 kB
Release files / clipwright_stabilize-0.5.1.tar.gz
| Download URL | clipwright_stabilize-0.5.1.tar.gz |
|---|---|
| Size | 14.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c12ffc667da3e3695d031642922c52e5f5e7ebecf5860a14346e2b31e05f84f5
|
|
BLAKE2b-256 checksum How to use checksums |
c4dde8a92c203b6bcac703b7975e2bae231d89a85dc57c50d90f8ecf13c35755
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 25, 2026.
Transparency logRelease files / clipwright_stabilize-0.5.1-py3-none-any.whl
| Download URL | clipwright_stabilize-0.5.1-py3-none-any.whl |
|---|---|
| Size | 17.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7aa1225d1509d5b6b47ef7e03748a0470dc0f10b3d51e842ebff1a9731c40484
|
|
BLAKE2b-256 checksum How to use checksums |
4936f4fc8ef49a40a964dec329363829759afcbb866bcaea764c1498e478d450
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 25, 2026.
Transparency log