Verified conversions across 205 color spaces: CSS strings, gamut checks, .cube LUTs
Reelsaw is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Drive a self-hosted Reelsaw: turn long videos into vertical clips, edit, re-render and export them.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user reelsaw-mcp '--' docker run -i --rm ghcr.io/osbytes/reelsaw:0.31.0 reelsaw mcp
# 2 — ask your agent for something these tools do
# list_projects, get_project, create_project and 79 more
Reelsaw costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Reelsaw as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. It has not been scanned here, so read the surface, and its source, before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Docker installed and running. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user reelsaw-mcp '--' docker run -i --rm ghcr.io/osbytes/reelsaw:0.31.0 reelsaw mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
82 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
Your projects, most recently updated first. Returns { projects: [{ id, title, status, stage, clips: "n/m rendered", url }], total, nextCursor }; pass nextCursor as cursor for the next page. deleted: true lists restorable deletes (storedBytes still count until purge_project). For every kind of…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | nextCursor from the previous page; omit for the first page |
| limit | integer | no | Projects per page (1-100, default 24) |
| deleted | boolean | no | true = only deleted projects that restore_project can still bring back |
One of your projects: status, settings, effective intro/outro, transcript summary, and every clip (id, title, hook, bounds, score, status, download links); replacedClips lists deleted or replaced clips for restore_clip. Returns the project object. For one clip's full detail use get_clip, for the…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — |
Start clipping a video from a URL (anything yt-dlp fetches) or a file you uploaded: POST /api/upload with the file as the body, header x-filename and your API key as Authorization: Bearer, then pass the uploadId it returns. Returns { id, title, status: "queued", next } at once; the pipeline…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sourceUrl | string | no | http(s) URL of the video; give this or uploadId |
| uploadId | string | no | Id returned by POST /api/upload (the file body, x-filename header, API key as Bearer); give this or sourceUrl |
| title | string | no | Project title (default: the video's own title) |
| metadata | no | Your own key/value strings (≤20 keys, 1 KB), returned by get_project and sent in every webhook for this project, e.g. { runId: "n8n-123" } | |
| settings | no | — | |
| introAssetId | string | no | Library asset id (search_assets with source library) for the intro of every clip; null = no intro; omitted = your default intro |
| outroAssetId | string | no | Same for the outro |
| introSec | number | no | Seconds an intro image shows (1-10) |
| outroSec | number | no | Seconds an outro image shows (1-10) |
Rename a project and/or change its saved settings (focus, instructions, clip length, maxClips, caption style, framing, pauses, refineEntities, refineDisfluency, disfluencyLlm, refineScenes); only the fields you pass change. Does not re-pick clips or re-render: reanalyze_project picks again with…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| title | string | no | New title |
| settings | no | Settings to change; keys left out keep their value. Intro/outro go through set_project_bumpers | |
| clear | array | no | Optional settings to reset to their default, e.g. maxClips (back to automatic) or focus |
| metadata | no | Replace the project's metadata (the whole map; {} clears it) |
Block until the project is done or failed, or timeoutSeconds pass. Returns { id, status, stage, stageProgress, stageDetail ({ done, total, etaSec } while a stage works in parts, else null), error, clips: [{ id, title, status }] }; on timeout the same with hint "Still running": call it again. Use…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| timeoutSeconds | integer | no | Longest to wait, seconds (1-120, default 60) |
The project's transcript as timed lines "[m:ss] text", optionally only a time range. Returns text; output longer than maxChars is cut with a note saying which fromSec to continue from. Use it to pick your own moments for create_clip.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| fromSec | number | no | Start of the range, seconds from the start of the video |
| toSec | number | no | End of the range, seconds |
| maxChars | integer | no | Cut the output at this many characters (1000-200000, default 60000) |
The captions of a clip's last render as an SRT or WebVTT file: the same lines and times as the video (intro included), even when the style has captions off. Returns the file text; VTT with words: true adds karaoke word timestamps. A clip rendered before caption files existed answers that it needs…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| format | string | no | srt (default) or vtt |
| words | boolean | no | VTT only: add a <timestamp> before every word after the first in each cue |
The project transcript as an SRT or WebVTT subtitle file, one cue per transcript segment, in source-video seconds. Returns the file text; VTT with words: true adds word timestamps. Use get_transcript to read it as plain timed lines instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| format | string | no | srt (default) or vtt |
| words | boolean | no | VTT only: add a <timestamp> before every word after the first in each cue |
Use an SRT or WebVTT file as the project's transcript instead of transcribing: right after create_project (only the video is fetched) or on a done or failed project (it then re-cleans the transcript and picks clips again). Give exactly one of text, uploadId or url. Returns { format, cues, words,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| text | string | no | The contents of the .srt or .vtt file |
| uploadId | string | no | Upload id of an .srt/.vtt file sent to POST /api/upload |
| url | string | no | http(s) link to a public .srt/.vtt file |
| format | string | no | auto (default) decides from the WEBVTT header |
| language | string | no | Language code of the text, e.g. en, es, ja (default: the existing transcript's, else unknown) |
Find your clips and projects by words in their title, hook or caption (every word must match; case-insensitive, typo-tolerant; best first). Returns { projects (max 8), clips (max limit) with ids, bounds and links, truncated? }. Use list_projects to browse instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | yes | Words to find, e.g. "budget tips" |
| limit | integer | no | Most clips to return (1-50, default 15) |
The project's pipeline history, newest first (the same events the Activity panel shows; live progress ticks are not stored): stage starts and completions, clip renders, retries, failures with reasons. Returns [{ at, type, ...details }]. Use it to find out why something failed or is slow;…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| limit | integer | no | Most events to return (1-200, default 50) |
Everything about one clip: text, bounds, scores, emphasis, layers (assets, text, sounds), render diagnostics, video/thumbnail/editor links, and what the next render will use with where each comes from: style { own, effective, from: clip|project|default }, framing { own, effective: { mode, adjust,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — |
Edit one clip (3 s-10 min): only the fields you pass change; style, layoutSections and layers replace the whole value (null = project's / none). Title, caption and hashtags apply at once; bounds, hook, framing, style, emphasis, layers and intro/outro are burned in and re-render (~1 min) unless…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| title | string | no | Clip title (1-120 chars) |
| hook | string | no | On-screen opening line (max 80 chars) |
| caption | string | no | Post caption, not burned in (max 300 chars) |
| hashtags | array | no | Hashtags without # (max 20); replaces the list |
| startSec | number | no | New start, seconds from the start of the source video |
| endSec | number | no | New end, seconds from the start of the source; clip must stay ≥3 s |
| layoutOverride | no | Framing for the whole clip; null = automatic | |
| layoutSections | array | no | Framing per time range (max 50), source seconds; replaces all sections; null or [] = automatic |
| style | no | Caption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project | |
| emphasis | array | no | Words the captions colour (max 30); replaces the list |
| layers | array | no | — |
| rerender | boolean | no | Re-render when a burned-in field changed (default true, same as the app); false = keep the old video until rerender_clip |
Add a clip from a time range of the source (needs a transcript). mode exact keeps your bounds (3 s-10 min); mode ai lets the model pick the best moment inside them (≥8 s). Returns the new clip summary { id, status: "preparing", queued: "prepare", hint }; preparation (title, hook, scores) is queued…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | yes | — | |
| startSec | number | yes | Range start, seconds from the start of the source video |
| endSec | number | yes | Range end, seconds |
| mode | string | no | exact = these bounds (default); ai = best moment inside them |
Delete one clip of a live project; a render in progress stops. It shows up on Deleted (list_deleted). Reversible: restore_clip brings it back for DELETED_RETENTION_DAYS (7 days by default). Storage still counts until purge_clip. For several clips of one project use delete_clips. Returns { changed,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — |
Delete several clips of one live project in one step (the selection bar's Delete); renders in progress stop. Each shows up on Deleted (list_deleted) and restore_clip brings it back for DELETED_RETENTION_DAYS. Already-deleted ids are skipped. Storage still counts until purge_clip. Returns {…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | yes | — | |
| clipIds | array | yes | Clip ids of that project (get_project), 1-200 |
Queue one clip for rendering again (after rerender: false edits, a failure, or an intro/outro change). Async: the new video replaces the old when done (usually under a minute); poll get_clip. Returns { step: render | prepare, renderQueued, hint } (prepare = it never got its AI title, which runs…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — |
Queue several clips of one project for rendering again in one step (after edits or failures). Finished and failed clips are queued, clips still rendering are skipped; each new video replaces the old when done. Returns { requested, rerendered, skipped, renderQueued, hint }; poll get_project or…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | yes | — | |
| clipIds | array | yes | Clip ids of that project (get_project), 1-200 |
Links anyone can download without an Authorization header, for a scheduler (Buffer, Metricool), Instagram's video_url, Zapier/Make or a person. Returns { clips: [{ clipId, links: { clip, thumb, srt, vtt } }], export } with each link's { linkId, url, expiresAt }; unrendered clips say why. The…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | yes | — | |
| clipIds | array | no | Only these clips; omitted = every rendered clip |
| kinds | array | no | Which files (default: clip): clip = the MP4, thumb = its JPEG, srt / vtt = its captions |
| export | boolean | no | Also a link to the zip of these clips with YouTube/TikTok metadata |
| ttlDays | integer | no | Days the links last (capped by the instance); null = never expires where allowed |
| label | string | no | A name for a separate link you can revoke on its own, e.g. "Buffer queue" |
Your share links, newest first. Returns { items: [{ id, kind, projectId, clipId, title, url (masked), label, source, state (active | expired | revoked), expiresAt, lastUsedAt, useCount }], nextCursor, total }. Use get_media_links for a full URL.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | no | Only this project's links |
| clipId | string | no | Only this clip's links |
| active | boolean | no | Only links that still work |
| cursor | string | no | nextCursor from the previous page |
| limit | integer | no | Links per page (1-100) |
Turn share links off now: one (linkId), a clip's (clipId), a project's (projectId) or all of yours (all: true). Give exactly one. Returns { revoked, message }. Anyone holding a revoked link gets a 404 from then on.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| linkId | string | no | Link id (from get_media_links or list_media_links) |
| clipId | string | no | Every link to this clip |
| projectId | string | no | Every link to this project's clips and zip |
| all | boolean | no | Every share link you have |
Your webhook endpoints. Returns [{ id, url (masked), description, events, status (active | failing | off), disabledReason, failingSince, lastDelivery }]. Reelsaw POSTs signed JSON (Standard Webhooks headers webhook-id, webhook-timestamp, webhook-signature) to each when a subscribed event happens.
No parameter schema on file.
Subscribe a URL to events: project.created, project.done (with every clip, share links and the zip), project.failed, clip.done (also re-renders), clip.failed. This is how a Zapier or Make app subscribes (delete_webhook unsubscribes). Returns { endpoint, secret }: the whsec_ signing secret is shown…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Where to POST (https) |
| events | array | yes | Events to send |
| description | string | no | Your label, e.g. "n8n clips workflow" |
Change a webhook's url, events or description, or turn it on or off (enabled). Turning it on clears a failure streak; turning it off cancels deliveries waiting to be sent (resend_webhook_delivery brings them back). Returns { endpoint, changed, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Webhook id (from list_webhooks) |
| url | string | no | New URL to POST to (https) |
| events | array | no | Replace the events it gets |
| description | string | no | New label; null clears it |
| enabled | boolean | no | Turn it on (true) or off (false) |
Remove a webhook (unsubscribe); nothing more is sent to it and its delivery log goes with it. Returns { ok, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Webhook id (from list_webhooks) |
A new signing secret for a webhook. Deliveries are signed with both the new and the old one for 24 h, so the receiver can switch; refused while a rotation is still open. Returns { secret, previousStopsAt, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Webhook id (from list_webhooks) |
Send a webhook.test delivery now and wait for the answer. Returns { ok, code, message, response (first 2 KB of what the receiver said) }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Webhook id (from list_webhooks) |
The delivery log, newest first. Returns { items: [{ id, endpointId, eventId, type, projectId, status (pending | sending | delivered | failed | cancelled), attempt, lastStatusCode, lastError, nextAttemptAt, deliveredAt }], nextCursor, total }. Failed deliveries were retried 8 times over about 22 h.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpointId | string | no | Only this webhook's deliveries (from list_webhooks) |
| status | string | no | Only deliveries in this state |
| projectId | string | no | Only deliveries about this project |
| cursor | integer | no | nextCursor from the previous page |
| limit | integer | no | Deliveries per page (1-100) |
Send a delivery again (a new series of attempts, same webhook-id and body, signed afresh). The webhook must be on. Returns { ok, deliveryId, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| deliveryId | integer | yes | Delivery id (from list_webhook_deliveries) |
A download link for a zip of the project's rendered clips with YouTube/TikTok metadata. Same conditions as the app's Export: the project must be live and at least one picked clip rendered, else the answer says why (not found, or nothing rendered yet). Returns { url, clips (rendered, in the zip),…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| clipIds | array | no | Only these clips (max 200; must be rendered clips of the project); omitted = every rendered clip |
A download link for an issue-report zip (the same file Report an issue in the app saves; admins may include instance-wide diagnostics). Returns { url, filename }; GET the url with the same Authorization header as this server. Admins may set instance true to include unfinished work, failed jobs,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| description | string | yes | What went wrong (a sentence is enough) |
| projectId | string | no | Project the report is about (from list_projects); omit for an account- or instance-level report |
| clipIds | array | no | Clips the problem shows up in (from get_project) |
| instance | boolean | no | Admins only: include unfinished work, failed jobs, usage and error logs across every account |
| logs | boolean | no | Include this project's log lines (default true) |
| system | boolean | no | Include versions, machine resources, queue counts and recent errors (default true; ignored when not allowed) |
| previews | boolean | no | Include thumbnails and the selected clips' videos (default true) |
| allClips | boolean | no | Include every rendered clip (default false) |
| source | boolean | no | Include the source video file (default false) |
Resume a failed or stuck project from its furthest completed stage: re-render unfinished clips if there are clips, else pick clips, refine or transcribe again. Finished clips, the transcript and the source are kept. Returns { queue } (the stage restarted); then wait_for_project. To pick different…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — |
Re-run refine steps on the existing transcript: entities (name spelling), disfluency (filler and repeat cuts), scenes (shot cuts); all three when steps is omitted. Optionally set the vocabulary (names and terms, comma separated; empty string clears it) first. Fixes you accepted or rejected may be…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| steps | array | no | Which refine steps to re-run; default all |
| vocabulary | string | no | Names and terms the transcript should spell this way; empty string clears it |
Pick clips again from the existing transcript (needs one), optionally with new settings. Clips you created or edited are kept; untouched AI picks are replaced and restorable with restore_clip for a while. Returns { kept, replaced } at once; the picking runs in the background, so follow with…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| settings | no | — |
Find assets. source "library" = your own uploads (name and tags; empty q lists all); omitted or "catalog" = the Reelsaw catalog (CC0, works offline); or a provider an admin enabled. Returns { provider, items: [{ provider, externalId, name, kind, license, durationSec }], nextCursor }. Adds nothing:…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | no | What to look for, e.g. "whoosh", "arrow", "city at night"; empty lists everything in the source |
| source | string | no | library, catalog (default), pexels, pixabay, freesound, iconify, openverse, giphy or klipy |
| kind | string | no | Only this kind of result |
| cursor | string | no | nextCursor from the previous page; omit for the first page |
| limit | integer | no | Results per page (1-60, default 24) |
| license | string | no | freesound only: cc0 (default) or by (CC0 and CC-BY, attribution is stored) |
| deleted | boolean | no | library only: list your deleted items instead (their ids go to restore_asset) |
Add from exactly one source: a public url or an uploadId (video, image, GIF, SVG or sound) becomes one of your library uploads; a search_assets catalog / provider hit (provider + externalId) materializes one instance-shared copy (checksum verified, license recorded; not listed in your library).…
No parameter schema on file.
Rename one of your own library items, replace its tags, or change how long a still image shows (deleted items too; shared catalog and provider items cannot be changed). Only labels change; nothing re-renders, except that a new image length applies on each project's next render. Returns { id, name,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| assetId | yes | — | |
| name | no | New name (1-120 chars) | |
| tags | no | Replaces the tags (lowercase words; max 20); [] clears them | |
| imageSeconds | number | no | Seconds a still image shows as an intro/outro (1-10); images only |
Delete one of your uploads: it leaves the library and your defaults and goes to Deleted. Projects and clips already using it keep rendering with it. Undo with restore_asset (list_deleted says how long it is kept); check asset_usage first. Returns { ok }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| assetId | yes | — |
Bring one of your deleted library items back (the id from delete_asset or list_deleted); restoring an item that is not deleted changes nothing. It does not become a default again. Returns { ok }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| assetId | yes | — |
Where a library item is used: as intro, outro, overlay or music on projects and clips (replaced clips left out), and in layer templates. Returns { projects: [{ id, title, slots, clips: [{ id, index, title, slots, via, overlays, music }] }], templates: [{ id, name, layers }] }. A deleted asset's…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| assetId | yes | — |
Make a library item your default intro or outro for projects you create from now on (assetId null clears it). Existing projects keep theirs; to change one use set_project_bumpers. Returns { ok }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slot | string | yes | Which default to set |
| assetId | string | yes | Library asset id (search_assets with source library), or null for no default |
Set one project's intro and/or outro: "default" (your current default), "none", or a library asset id; a slot left out is untouched, and introSec/outroSec are saved with the project. Clips with their own choice (set_clip_bumpers) keep it. Applies on each clip's next render; rerender: true…
No parameter schema on file.
Override the intro and/or outro of up to 200 clips of one project: "inherit" (follow the project), "none", or a library asset id; a slot left out is untouched. rerender: true re-renders only these clips. Returns { updated, rerendered }.
No parameter schema on file.
Your layer templates (layers that fit any clip length, plus an optional intro / outro), newest first. Returns { items: [{ id, name, layerCount, layers, bumpers, updatedAt }], nextCursor, total, deleted } (nextCursor goes in cursor; deleted = restorable). A layer has the clip-layer fields plus…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cursor | string | no | nextCursor from the previous page; omit for the first page |
| limit | integer | no | Templates per page (1-500, default 100) |
Create a template from exactly one of clipId (that clip's layers: spanning = fill, touching the start = head, touching the end = tail, else anchored to the nearer edge; plus the intro and outro the clip renders with) or layers (each with a timing, see list_layer_templates; [] with bumpers = an…
No parameter schema on file.
Rename a layer template, replace its layers (the whole list, each with a timing) and/or replace its intro / outro (bumpers; null = it sets neither); a field left out is untouched. Clips that already got the template keep what they have; apply_layer_template again to refresh them. Returns the…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | yes | — | |
| name | no | — | |
| layers | no | — | |
| bumpers | no | — |
Delete a template (it goes to Deleted) and drop it from your project defaults; clips that already got its layers keep them. Undo with restore_layer_template (list_deleted says how long it is kept). Returns { ok, clearedDefault } (it was your default and no longer is)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | yes | — |
Bring back a deleted layer template (the id from list_layer_templates deleted or list_deleted). It does not become a default again. Returns the template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | yes | — |
Make one clip's framing the whole project's, for a recording whose layout never changes (a slide deck with a webcam tile, a fixed camera): the clip's section at at (else its first framed section) gives the mode and its nudge / subject / crop, which become the project's reframe and reframeAdjust;…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| clipId | yes | — | |
| at | number | no | Seconds from the start of the source: which section of the clip to copy (default: its first section that is not plain automatic) |
| keepOverrides | boolean | no | Leave other clips' own sections in place; they still win over the project's framing (default false: clear them) |
| rerender | boolean | no | Re-render the finished clips now (default true) |
Write a template onto clips of one project (up to 200 clipIds, or all): its layers fitted to each clip's length, and the intro / outro it sets as each clip's own. Not linked afterwards. mode replace (default) swaps the clips' layers, add keeps them and adds. rerender true re-renders finished clips…
No parameter schema on file.
Delete one of your projects and all its clips; work in progress stops. Reversible: restore_project brings it back for DELETED_RETENTION_DAYS (7 days by default). Storage still counts until purge_project (or the retention sweep) removes it for good; minutes already used stay counted. Returns {…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| forgetDecisions | boolean | no | — |
Permanently remove a deleted project and its files so the storage is freed (find it with list_deleted or list_projects deleted: true). Minutes, hourly creates and first-video-free are not refunded. A project that is not deleted is refused: call delete_project first. What you decided about it…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| forgetDecisions | boolean | no | Also forget what Reelsaw learned from this project (its entries in the decision log); default false keeps them |
Bring back a deleted project with its clips and files (find it with list_deleted or list_projects deleted: true); restoring a project that is not deleted changes nothing. Refused if the account is already at its live project cap. A project that was processing comes back failed: retry_project…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — |
Bring back a deleted clip or one a re-analyze replaced (list_deleted or get_project → replacedClips); it goes to the end of the project's clips. Returns { changed, status, needsRerender }; needsRerender means it never finished, so call rerender_clip.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Clip id (from list_deleted or get_project → replacedClips) |
Restorable deletes (the Deleted page): one newest-first list of projects, clips of live projects, library items and templates. Returns { items: [{ kind, id, title, deletedAt, purgeAt, storedBytes, canPurge, … }], total, truncated } (max 200) plus keepDays / libraryDays / templateDays. purgeAt null…
No parameter schema on file.
Permanently remove a deleted clip of a live project and its rendered file so the storage is freed (find it with list_deleted). A clip that is not deleted is refused: call delete_clip first. Clips of a deleted project go with purge_project. Returns { storedBytes, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Clip id (from list_deleted) |
Permanently remove an already-deleted library upload and its files so the storage is freed (find it with list_deleted). Refused while a project, clip or live template still names it. An item that is not deleted is refused: call delete_asset first. Returns { storedBytes, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| assetId | yes | — |
Permanently remove an already-deleted layer template (find it with list_deleted). Templates hold no media files; this only drops the row. A template that is not deleted is refused: call delete_layer_template first. Returns { ok, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | yes | — |
Admins only: is a newer Reelsaw published? Returns { current, latest: { version, url, publishedAt }, available, checkedAt, error, upgrade: { command, note, docsUrl } }; available is null when the running build is not a release (from source). The server checks every few hours; refresh: true asks…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| refresh | boolean | no | true = ask GitHub now instead of returning the last answer (at most once a minute) |
Published Reelsaw versions from GitHub (reelsaw.com/releases): tag, date, a short summary and the change notes. Returns { releases, total, windowDays, commits, commitDays, releaseDays, truncated, fetchedAt, sourceUrl, error }; pass tag for one version. Cached for an hour.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many releases to return (1-100, default 20, newest first) |
| tag | string | no | Only this tag or version (v0.19.1 or 0.19.1) |
Admins only: the instance settings in force (sign-up mode, email verification, captcha, legal links, quotas, upload limits, retention, stall watchdog, update check, health details) and where each comes from. Returns { values, env, override, source: { KEY: "env" | "db" }, ignored: { KEY: reason },…
No parameter schema on file.
Admins only: every Reelsaw process that has checked in (API, worker, combined app): CPU, memory, disk (free/total MB, -1 = unmeasurable; diskLeasedMB = claimed by jobs in flight), GPU, render slots, queues it listens on, and its jobs. A worker out of disk drops the media queues from queues until…
No parameter schema on file.
Admins only: one failed project or clip (title, owner email, stage, full recorded reason, when). A clip whose project also failed is not returned — retry the project. Returns the item or null if it is gone (retried, deleted). Hosted non-admins are refused.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | project = the whole pipeline stopped; clip = one clip failed to prepare or render |
| id | string | yes | Project id or clip id |
Admins only: waiting, running and retrying job counts per pipeline stage with when the longest wait began (oldestWaitingAt), plus the jobs currently in flight (project title, attempt, started, and a retrying job's lastError). Returns { queues, active, truncated, error? }. Failed work is…
No parameter schema on file.
Admins only: failed projects and clips across the instance (owner email, stage, reason, when). A failed project's clips are not listed separately — retry the project. Returns { items, nextCursor, total, limit, truncated }. Filter with q (substring of the error), stage, since (ISO time). Hosted…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | no | Case-insensitive substring of the recorded error (e.g. disk, encoder, model) |
| stage | string | no | Pipeline stage that failed |
| since | string | no | ISO timestamp; only failures updated at or after this time |
| cursor | string | no | nextCursor from the previous page |
| limit | integer | no | Page size, default 50 |
Admins only: retry matching failed projects and clips through the same lifecycle as retry_project / rerender_clip (never a raw queue poke). Each item is its own transaction so live-job caps still apply. Cap 50 per call. Returns { retried, skipped, nextCursor }. Writes an admin event…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | no | Same error substring as list_failures |
| stage | string | no | Same stage filter as list_failures |
| since | string | no | Same since filter as list_failures |
| ids | array | no | Retry these rows instead of the current filter; omitted = every match of q/stage/since |
| limit | integer | no | Max items to retry this call, default 50 |
Admins only: change instance settings without a restart; every process applies them within seconds and the change is audited. Pass only the keys to change; null returns a key to the environment's value; an empty string clears an optional one (URLs, captcha). Validated as a whole (a captcha…
No parameter schema on file.
Hosted instances: your plan and subscription, the billing period, the limits in force with where each comes from (instance, plan, an admin's override), what you have used this period, whether renders carry a watermark, and the plans on offer. Returns { enabled, plan, reason, subscription, period,…
No parameter schema on file.
Hosted instances: a Stripe Checkout URL for a plan (or, when the account already pays, the Billing Portal page that confirms the plan change). Returns { url, kind: "checkout" | "change" }; a person must open it in a browser, an agent cannot pay. Plans and intervals come from get_billing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| plan | string | yes | Plan name from get_billing (e.g. creator, pro) |
| interval | string | no | Billing interval: month (default) or year |
The fixes Reelsaw made or suggests in a project's transcript: misheard names, fillers and repetitions to cut, and your own cuts and corrections. Returns { total, flags: [{ id, kind, subkind, status, start, end, heard, suggested, replacement, confidence }] }; status pending waits for your decision.…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| status | string | no | Only fixes in this state; omitted = all (pending = waiting for review, auto = applied automatically) |
| limit | integer | no | Most fixes to return (1-500, default 100) |
Accept or reject suggested transcript fixes (ids from list_transcript_flags), optionally with your own replacement text for an accepted name fix. The transcript is rebuilt; with rerender true (default) clips whose captions overlap a change are re-rendered. Returns { changed, rerendered,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| decisions | array | yes | One decision per fix |
| rerender | boolean | no | Re-render the finished clips whose captions overlap a change (default true); false only saves, re-render later with rerender_clips |
Make captions show "text" instead of the words spoken between startSec and endSec (a misheard name, say); the span must cover whole words. Returns { ok, flagId, rerendered, hint }. Undo it by passing the flagId to review_transcript_flags with status rejected.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| startSec | number | yes | Start of the words to correct, seconds from the start of the source video |
| endSec | number | yes | End of the words to correct, seconds |
| text | string | yes | What the captions should say for that span |
| rerender | boolean | no | Re-render finished clips whose captions overlap the span (default true) |
Remove the words spoken between startSec and endSec from the transcript, so captions and the rendered video skip them; the span must cover whole words. Returns { ok, flagId, rerendered, hint }. Undo it by passing the flagId to review_transcript_flags with status rejected.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| startSec | number | yes | Start of the words to cut, seconds from the start of the source video |
| endSec | number | yes | End of the words to cut, seconds |
| rerender | boolean | no | Re-render finished clips whose captions overlap the span (default true) |
The settings every new project starts with (Settings, Project defaults): language, vocabulary, instructions, focus, clip lengths, pauses, caption look and refine steps. Returns { projectDefaults }; keys you never set are absent and use the built-in value. Change them with set_project_defaults.
No parameter schema on file.
Replace the settings every new project starts with; existing projects keep theirs. Send the whole set you want: keys left out are cleared, {} clears all (read get_project_defaults first). Intro and outro change through set_default_bumper. Returns { ok, projectDefaults, hint }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| defaults | object | yes | The complete set of defaults, e.g. { language: "en", maxClips: 5, pauses: "tight" } |
Hide or keep text burned into the source video (captions, logos) for the whole project: hide covers it, keep leaves it, always shows it. Re-renders every finished clip so the set agrees. Returns { changed, needsRerender, rerendered, skipped, hint }; rerendered is how many clips were queued, so…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| sourceText | string | yes | hide = cover on-screen text in the source, keep = leave it, always = always show it |
Change the caption/hook look for the whole project (font, colors, size, position, words per line). Clears per-clip style overrides unless keepOverrides, and re-renders every finished clip unless rerender is false. Returns { changed, needsRerender, rerendered, skipped, hint }; rerendered is how…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | yes | — | |
| style | yes | The style fields to change; fields left out keep their value | |
| keepOverrides | boolean | no | Keep clips' own style overrides instead of clearing them (default false) |
| rerender | boolean | no | Re-render finished clips now (default true); false saves the style and the next render shows it |
Your decision log: what you accepted, rejected, cut, corrected, edited, deleted or restored, newest first, kept after a project is deleted so Reelsaw learns from it. Returns { summary: { enabled, total, projects, byKind }, items: [{ id, kind, explicit, projectId, clipId, before, after, context,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | Only this kind of decision |
| projectId | string | no | Only decisions about this project (it may already be deleted) |
| cursor | integer | no | nextCursor from the previous page |
| limit | integer | no | Page size (1-200, default 50) |
A page of your decision log in export form, oldest first, for evals. Returns { items (one decision each, the same objects reelsaw decisions export writes as JSON lines), cases: { disfluency: [eval cases in eval/fixtures/disfluency/cases.json shape, split dev/heldout by project] }, nextCursor }.…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | Only this kind of decision |
| since | string | no | Only decisions made at or after this ISO time |
| cursor | integer | no | nextCursor from the previous page |
| limit | integer | no | Page size (1-1000, default 200) |
Delete entries from your decision log so Reelsaw stops learning from them: one project's (projectId, live or already deleted forever) or, without projectId, all of them. Cannot be undone. Returns { forgotten, message }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | no | Only this project's decisions; omitted = everything |
Whether Reelsaw records your decisions (accepts, rejects, cuts, clip edits) to learn from (Settings → Learning, on by default). Off stops recording; what is already kept stays until forget_decisions. Returns { enabled }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| enabled | boolean | yes | true records decisions, false stops |
No parameter schema on file.
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under AGPL-3.0
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Reelsaw or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing ships as a container image. The scanner reads packages on npm and PyPI and public source; an image is neither, so there is no grade here — not a withheld one, an unmeasured one.
Release history
It installs from a container image rather than from a versioned package, so the command cannot be pinned to a release. The history below is for reading; the current release on file is 0.31.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Reelsaw can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.