Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Reelsaw

OCI · GHCR.IO/OSBYTES/REELSAW

Drive a self-hosted Reelsaw: turn long videos into vertical clips, edit, re-render and export them.

52 Trust /100

Last scanned (11 hours ago)

Scores higher than 85% of OCI servers

Category Design and Media

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.Unverified
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to osbytes/reelsaw). View diagnostics → Pass
  • Clear OSI-approved license (AGPL-3.0).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability66
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 15138 tokens (~180/item across 84 items; 84 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management17
  • Stability observed for 5 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety95
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 11 of 14 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "test_webhook" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Partial
  • An AI judge read all 85 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

What we tested

Checks we ran (12)

  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Checks we could not complete (4)

These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.

  • Malware scan in Supply Chain Security (scores 0 for this)No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  • Known CVEs in Supply Chain Security (scores 0 for this)Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.
  • Install scripts in Supply Chain Security (scores 0 for this)Install-script risk not yet assessed.
  • Dependency health in Supply Chain Security (scores 0 for this)Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1
    • Package version: 0.31.0 → 0.32.0 functional
  • 2 Nov 26 +1
    • Stability: 0.03 → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • First check of Schema quality: unverified functional
    • Package version: 0.30.3 → 0.31.0 functional
    • Package version: 0.30.3 → 0.30.4 functional
  • 1 Nov 26 0
    • Stability: 0.00 → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • First check of Schema quality: unverified functional
    • Package version: 0.30.1 → 0.30.3 functional
    • Package version: 0.30.1 → 0.30.2 functional
  • 31 Oct 26 50

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed oci/ghcr.io/osbytes/reelsaw@0.32.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem oci
Reason Verified
Discovered via OCI referrers API
Source repo osbytes/reelsaw
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/osbytes/reelsaw/.github/workflows/release.yml@refs/tags/v0.32.0
Rekor log index 3692516147
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha256:8a5ba67d1f86b6ec86615ed771e8f7034facb010661648acfd2788c03b8f72d2

Background: How many MCP packages publish verified provenance →

MCP tools · 84 exposed · ~14,095 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
reanalyze_project ~186

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 wait_for_project. To only save settings use update_project; to resume a failure use retry_project.

NameTypeReqDescription
idstringyesProject id (from list_projects, search_clips or create_project)
settingsobject–Project settings; omit for the defaults (automatic clip count, 20–60 s clips, natural pauses, name fixes and the on-screen text scan on, filler removal off). Set refineDisfluency / disfluencyLlm true…

No output schema declared.

No examples provided.

refine_project ~147

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 replaced. Clips re-render afterwards. Returns { ok, steps }; then wait_for_project.

NameTypeReqDescription
idstringyesProject id (from list_projects, search_clips or create_project)
stepsarray–Which refine steps to re-run; default all
vocabularystring–Names and terms the transcript should spell this way; empty string clears it

No output schema declared.

No examples provided.

report_issue ~278

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, usage and error logs across every account, for queue, disk or machine problems that are not just one project. On hosted instances with telemetry, non-admins cannot download a zip.

NameTypeReqDescription
allClipsboolean–Include every rendered clip (default false)
clipIdsarray–Clips the problem shows up in (from get_project)
descriptionstringyesWhat went wrong (a sentence is enough)
instanceboolean–Admins only: include unfinished work, failed jobs, usage and error logs across every account
logsboolean–Include this project's log lines (default true)
previewsboolean–Include thumbnails and the selected clips' videos (default true)
projectIdstring–Project the report is about (from list_projects); omit for an account- or instance-level report
sourceboolean–Include the source video file (default false)
systemboolean–Include versions, machine resources, queue counts and recent errors (default true; ignored when not allowed)

No output schema declared.

No examples provided.

rerender_clip ~117

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 first and renders afterwards). For several clips of a project use rerender_clips.

NameTypeReqDescription
idstringyesClip id, not a project id (from get_project or search_clips)

No output schema declared.

No examples provided.

rerender_clips ~125

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 wait_for_project. For a single clip rerender_clip is enough.

NameTypeReqDescription
clipIdsarrayyesClip ids of that project (get_project), 1-200
projectIdstringyesProject id (from list_projects, search_clips or create_project)

No output schema declared.

No examples provided.

resend_webhook_delivery ~65

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 }.

NameTypeReqDescription
deliveryIdintegeryesDelivery id (from list_webhook_deliveries)

No output schema declared.

No examples provided.

restore_asset ~64

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 }.

NameTypeReqDescription
assetIdstringyesLibrary asset id (from delete_asset)

No output schema declared.

No examples provided.

restore_clip ~87

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.

NameTypeReqDescription
idstringyesClip id (from list_deleted or get_project → replacedClips)

No output schema declared.

No examples provided.

restore_layer_template ~54

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.

NameTypeReqDescription
templateIdstringyesLayer template id (list_layer_templates)

No output schema declared.

No examples provided.

restore_project ~92

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 resumes it. Returns { changed, status }.

NameTypeReqDescription
idstringyesProject id (from list_projects with deleted: true)

No output schema declared.

No examples provided.

retry_failures ~167

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 failures.retried. Hosted non-admins are refused.

NameTypeReqDescription
idsarray–Retry these rows instead of the current filter; omitted = every match of q/stage/since
limitinteger–Max items to retry this call, default 50
qstring–Same error substring as list_failures
sincestring–Same since filter as list_failures
stagestring–Same stage filter as list_failures

No output schema declared.

No examples provided.

retry_project ~96

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 clips use reanalyze_project instead.

NameTypeReqDescription
idstringyesProject id (from list_projects, search_clips or create_project)

No output schema declared.

No examples provided.

review_transcript_flags ~150

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, needsRerender, flags: [{ id, status, replacement }], hint }.

NameTypeReqDescription
decisionsarrayyesOne decision per fix
idstringyesProject id (from list_projects, search_clips or create_project)
rerenderboolean–Re-render the finished clips whose captions overlap a change (default true); false only saves, re-render later with rerender_clips

No output schema declared.

No examples provided.

revoke_media_link ~125

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.

NameTypeReqDescription
allboolean–Every share link you have
clipIdstring–Every link to this clip
linkIdstring–Link id (from get_media_links or list_media_links)
projectIdstring–Every link to this project's clips and zip

No output schema declared.

No examples provided.

rotate_webhook_secret ~75

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 }.

NameTypeReqDescription
idstringyesWebhook id (from list_webhooks)

No output schema declared.

No examples provided.

save_layer_template ~300

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 intro / outro only template). Returns the template { id, name, layerCount, layers, bumpers }. Use apply_layer_template to put it on clips

NameTypeReqDescription
bumpersobject–With layers: the intro / outro the template puts on clips ({ intro, introSec, outro, outroSec }; a slot left out = clips keep their own, null = none, an id = that video or image). With clipId the cli…
clipIdstring–Build the template from this clip's layers (get_project or search_clips). Pass clipId or layers, not both
layersarray–Or the layers themselves, each with a timing: { kind: asset|text|audio, id, timing: { mode: head|tail|fill|relative, start, end, minSec, maxSec }, ...the layer's own fields (assetId, x, y, w / text,…
namestringyesTemplate name (1-120 chars)

No output schema declared.

No examples provided.

search_assets ~264

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: a catalog / provider hit's provider + externalId go to add_asset.

NameTypeReqDescription
cursorstring–nextCursor from the previous page; omit for the first page
deletedboolean–library only: list your deleted items instead (their ids go to restore_asset)
kindstring–Only this kind of result
licensestring–freesound only: cc0 (default) or by (CC0 and CC-BY, attribution is stored)
limitinteger–Results per page (1-60, default 24)
qstring–What to look for, e.g. "whoosh", "arrow", "city at night"; empty lists everything in the source
sourcestring–library, catalog (default), pexels, pixabay, freesound, iconify, openverse, giphy or klipy

No output schema declared.

No examples provided.

search_clips ~107

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.

NameTypeReqDescription
limitinteger–Most clips to return (1-50, default 15)
qstringyesWords to find, e.g. "budget tips"

No output schema declared.

No examples provided.

set_clip_bumpers ~240

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 }.

NameTypeReqDescription
clipIdsarrayyesClip ids of that project (get_project), 1-200 per call
intro––"inherit" (alias "default") = follow the project, "none" = no bumper on this clip, or a library asset id
introSecnumber–Seconds an intro image shows on these clips (1-10)
outro––"inherit" (alias "default") = follow the project, "none" = no bumper on this clip, or a library asset id
outroSecnumber–Seconds an outro image shows on these clips (1-10)
projectIdstringyesProject the clips belong to (list_projects)
rerenderbooleanyestrue = re-render only these clips now; false = apply on their next render

No output schema declared.

No examples provided.

set_default_bumper ~85

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 }.

NameTypeReqDescription
assetId–yesLibrary asset id (search_assets with source library), or null for no default
slotstringyesWhich default to set

No output schema declared.

No examples provided.

set_email_preferences ~97

Turn topics of optional email on or off; omitted topics stay as they are. ready = the note sent when projects finish while you are away (Settings → Account, or the link in the email). Mail you need (password reset, verification) is not affected. Returns { ok, emailPreferences }.

NameTypeReqDescription
readyboolean–the note sent when projects finish while you are away: true to get it, false to stop it

No output schema declared.

No examples provided.

set_instance_settings ~2,114

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 provider needs both keys; email verification needs an email driver). Returns the same state as get_instance_settings.

NameTypeReqDescription
ADMIN_EVENT_RETENTION_DAYS––Prune the admin event log after this many days. 0 = keep forever.
ALLOW_PRIVATE_SOURCE_URLSboolean|null–Let link sources point at LAN or loopback hosts (a NAS). Off, they are blocked (SSRF guard).
ALLOW_PRIVATE_WEBHOOK_URLSboolean|null–Let webhook URLs point at LAN or loopback hosts (a self-hosted n8n next to Reelsaw), over http too. Off, they must be public https (SSRF guard).
BLOCK_DISPOSABLE_EMAILSboolean|null–Refuse sign-ups from known temporary-address domains (a vendored list of about 120k domains).
CAPTCHA_PROVIDER––Bot protection on sign-up, sign-in and password reset: cloudflare-turnstile, google-recaptcha or hcaptcha; empty = off. Needs both keys.
CAPTCHA_SECRET_KEY––Secret captcha key the server verifies with; stored encrypted, never shown again; empty = unset.
CAPTCHA_SITE_KEY––Public captcha key the browser widget uses; empty = unset.
CATALOG_URL––Where the Reelsaw catalog manifest (sounds, icons, stickers) is fetched from, hourly; the starter pack bundled with Reelsaw is used until a newer one arrives.
CLIP_RETENTION_DAYS––Delete rendered clip files this many days after rendering; the clip stays and can be re-rendered. 0 = keep forever.
DECISION_RETENTION_DAYS––Prune users' recorded decisions (accepts, rejects, edits Reelsaw learns from) older than this. They outlive deleted projects until then. 0 = keep forever.
DELETED_RETENTION_DAYS––Deleted projects and replaced clips stay restorable this long, then rows and files go. 0 = keep forever.
DISFLUENCY_LLMboolean|null–Model pass on top of rule-based disfluency detection. Off by default. Ignored when disfluency removal is off. Turn on so projects may opt in via disfluencyLlm.
DISFLUENCY_REMOVALboolean|null–Detect fillers, repetitions and false starts after transcription. Off by default; turn on so projects may opt in via refineDisfluency.
EVENT_PROJECT_DONE_READY_EMAIL_DELAY_MINUTES––Minutes to wait after the first project in a batch finishes before emailing that the clips are ready, so several projects land in one note. Sent only when an email driver is set and the account has n…
EVENT_RETENTION_DAYS––Prune project events older than this; each project keeps its run skeleton. 0 = keep forever.
FREESOUND_API_KEY––Freesound API key (free): enables sound effects in Browse. Stored encrypted; empty = provider hidden.
GIPHY_API_KEY––Giphy API key: enables GIFs and stickers in Browse. Stored encrypted; empty = provider hidden.
HEALTH_DETAILSboolean|null–Include machine numbers in GET /api/health for anonymous callers (private networks only). Admins always get them.
ICONIFY_API_URL––Iconify API used for icon search; the public one by default, or your own self-hosted instance (https).
KLIPY_API_KEY––Klipy API key: enables GIF search in Browse (experimental). Stored encrypted; empty = provider hidden.
LLM_CALL_TIMEOUT_SECONDS––Longest one model call may take (all its HTTP attempts together) before its step is stopped and retried. 0 = auto: 120 s for a hosted model, 600 s for a self-hosted one, and for a self-hosted transcr…
LLM_USAGE_RETENTION_DAYS––Prune model and transcription usage rows older than this. 0 = keep forever.
MAX_LIVE_JOBS_PER_USER––Queued plus running jobs an account's own requests may add to. 0 = unlimited.
MAX_NEW_PROJECTS_PER_HOUR––Projects an account may create per hour. 0 = unlimited.
MAX_PROJECTS_PER_USER––Projects an account may keep. 0 = unlimited. Admins can override per user on the Users page.
MAX_REQUESTS_PER_HOUR––Changes an account may make per hour. 0 = unlimited.
MAX_REQUESTS_PER_MINUTE––Changes (API mutations, MCP tool calls) an account may make per minute. 0 = unlimited. Admins can override per user on the Users page.
MAX_RERENDERS_PER_HOUR––Re-renders, hand-made clips and re-runs (re-analyze, refine) an account may ask for per hour. 0 = unlimited.
MAX_SIGNUPS_PER_IP_PER_DAY––Accounts one network address may create per day. 0 = unlimited. Needs TRUST_PROXY behind a reverse proxy.
MAX_SOURCE_FILE_MB––Largest file a link source may download (yt-dlp --max-filesize), in MB.
MAX_SOURCE_MINUTES_PER_DAY––Minutes of source video an account may add per day (UTC). 0 = unlimited.
MAX_SOURCE_MINUTES_PER_MONTH––Minutes of source video an account may add per period: its billing period when it has a plan, else the calendar month (UTC). 0 = unlimited.
MAX_STORAGE_MB––MB of sources, uploads, renders and intros/outros an account may keep (deleted items count until they are deleted forever). 0 = unlimited.
MAX_UPLOAD_MB––Largest accepted file upload, in MB.
MAX_WEBHOOKS_PER_USER––Webhook endpoints an account may add. 0 = unlimited. Admins can override per user on the Users page.
MEDIA_LINK_ALLOW_NEVERboolean|null–Owners may make a share link that never expires (they can still revoke it).
MEDIA_LINK_RETENTION_DAYS––Delete revoked and expired share links this many days after they stopped working. 0 = keep forever.
MEDIA_LINK_TTL_DAYS––Share links last this many days unless the owner picks less.
OPENVERSE_ENABLEDboolean|null–Show Openverse (Creative Commons images and audio, no key) in Browse. Off by default until you have checked its limits for your use.
PEXELS_API_KEY––Pexels API key (free): enables stock photos and portrait videos in Browse. Stored encrypted; empty = provider hidden.
PIXABAY_API_KEY––Pixabay API key (free): enables photos, illustrations, vectors and videos in Browse. Stored encrypted; empty = provider hidden.
PRIVACY_URL––Privacy policy link shown on the sign-up form; empty = none.
REFINE_SCENESboolean|null–Scan the video for on-screen text (burned-in captions, watermarks, slides) during refine. On by default; off closes the ceiling (projects opt out via refineScenes). Shot cuts are always detected.
REQUIRE_EMAIL_VERIFICATIONboolean|null–New users must click the verification link before they can sign in. The link works for 24 hours and is single-use; an expired one offers a new send. Needs an email driver in .env.
SCRATCH_CACHE_HOURS––With an S3 store, drop a worker's local copies of the sources and rendered clips of finished projects after this many idle hours; a job pulls them back from the bucket when it needs them, and a worke…
SIGNUP_MODE––Who may sign up: open (anyone, right for a public instance with email confirmation), approval (new accounts wait for an admin; a private box) or closed (nobody). The first account is always the admin.
SOURCE_RETENTION_DAYS––Delete stored source videos this many days after upload; the project stays and Retry re-fetches. 0 = keep forever.
STAGE_IDLE_TIMEOUT_MINUTES––A stage made of checkpointed steps (finding moments) is stopped when no step has finished for this long; Retry continues where it stopped. 0 = auto: 1.5 times the model call timeout.
STALL_MINUTES––A running job with no progress for this long is reported as stalled (log and UI).
STEP_RETENTION_DAYS––Drop the saved checkpoints (finding-moments windows) of a finished project this many days after it last changed; a Retry sooner than that reuses them. 0 = keep forever.
TERMS_URL––Terms of service link shown on the sign-up form; empty = none.
TRANSCRIPT_CORRECTIONboolean|null–After transcription, fix misheard names with the language model. On by default; off closes the ceiling so no project runs it (projects opt out via refineEntities).
UPDATE_CHECKboolean|null–Ask GitHub for the latest release and tell admins when a newer Reelsaw exists. Only the request leaves the machine.
WATERMARK_NON_ADMINSboolean|null–Burn a small watermark into the clips of accounts that are not admins. A paid plan removes it, and an admin can switch it per user on the Users page.
WATERMARK_TEXT––The watermark text, e.g. your site name.
WEBHOOK_DELIVERY_RETENTION_DAYS––Delete webhook delivery log rows older than this. 0 = keep forever.

No output schema declared.

No examples provided.

set_learning ~70

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 }.

NameTypeReqDescription
enabledbooleanyestrue records decisions, false stops

No output schema declared.

No examples provided.

set_project_bumpers ~269

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 re-renders finished clips now. Returns { rerendered }. set_default_bumper changes future projects instead.

NameTypeReqDescription
intro––"default" = your current default intro/outro, "none" = no bumper, or a library asset id (see list_bumpers)
introSecnumber–Seconds an intro image shows in this project (1-10); videos keep their own length. Saved with the project
outro––"default" = your current default intro/outro, "none" = no bumper, or a library asset id (see list_bumpers)
outroSecnumber–Seconds an outro image shows in this project (1-10). Saved with the project
projectIdstringyesProject id (list_projects or create_project)
rerenderbooleanyestrue = re-render the project's finished clips now; false = apply on their next render

No output schema declared.

No examples provided.

set_project_defaults ~100

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 }.

NameTypeReqDescription
defaultsobjectyesThe complete set of defaults, e.g. { language: "en", maxClips: 5, pauses: "tight" }

No output schema declared.

No examples provided.

set_project_source_text ~158

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 follow with wait_for_project; skipped clips were still preparing or rendering and need rerender_clips once done (needsRerender is true).

NameTypeReqDescription
idstringyesProject id (from list_projects, search_clips or create_project)
sourceTextstringyeshide = cover on-screen text in the source, keep = leave it, always = always show it

No output schema declared.

No examples provided.

test_webhook ~58

Send a webhook.test delivery now and wait for the answer. Returns { ok, code, message, response (first 2 KB of what the receiver said) }.

NameTypeReqDescription
idstringyesWebhook id (from list_webhooks)

No output schema declared.

No examples provided.

update_asset ~156

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, tags, durationSec, previousName }.

NameTypeReqDescription
assetIdstringyesLibrary asset id (from search_assets)
imageSecondsnumber–Seconds a still image shows as an intro/outro (1-10); images only
namestring–New name (1-120 chars)
tagsarray–Replaces the tags (lowercase words; max 20); [] clears them

No output schema declared.

No examples provided.

update_clip ~459

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 rerender is false. Returns the clip summary plus { changed, needsRerender, rerendered, hint }; poll get_clip until done.

NameTypeReqDescription
captionstring–Post caption, not burned in (max 300 chars)
emphasisarray–Words the captions colour (max 30); replaces the list
endSecnumber–New end, seconds from the start of the source; clip must stay ≥3 s
hashtagsarray–Hashtags without # (max 20); replaces the list
hookstring–On-screen opening line (max 80 chars)
idstringyesClip id (from get_project or search_clips)
layers––Everything laid over or played under the clip, one list (max 30): kind asset = a library image/GIF/video (search_assets with source library; logos, stickers, b-roll), kind text = a line of text, kind…
layoutOverride––Framing for the whole clip; null = automatic
layoutSections––Framing per time range (max 50), source seconds; replaces all sections; null or [] = automatic
rerenderboolean–Re-render when a burned-in field changed (default true, same as the app); false = keep the old video until rerender_clip
startSecnumber–New start, seconds from the start of the source video
style––Caption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project
titlestring–Clip title (1-120 chars)

No output schema declared.

No examples provided.

update_layer_template ~130

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 template.

NameTypeReqDescription
bumpers–––
layersarray–The template's layers, each with a timing (max 30)
namestring–Template name (1-120 chars)
templateIdstringyesLayer template id (list_layer_templates)

No output schema declared.

No examples provided.

update_project ~223

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 the new selection settings, refine_project re-runs refine steps, rerender_clips applies style changes. Returns { changed, needsReanalyze, needsRefine, needsRerender, hint }.

NameTypeReqDescription
cleararray–Optional settings to reset to their default, e.g. maxClips (back to automatic) or focus
idstringyesProject id (from list_projects, search_clips or create_project)
metadataobject–Replace the project's metadata (the whole map; {} clears it)
settingsobject–Settings to change; keys left out keep their value. Intro/outro go through set_project_bumpers
titlestring–New title

No output schema declared.

No examples provided.

update_project_style ~197

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 many clips were queued, skipped how many were still preparing or rendering (they need rerender_clips once done). For one clip use update_clip { style }.

NameTypeReqDescription
idstringyesProject id (from list_projects, search_clips or create_project)
keepOverridesboolean–Keep clips' own style overrides instead of clearing them (default false)
rerenderboolean–Re-render finished clips now (default true); false saves the style and the next render shows it
styleobjectyesThe style fields to change; fields left out keep their value

No output schema declared.

No examples provided.

update_webhook ~134

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 }.

NameTypeReqDescription
description––New label; null clears it
enabledboolean–Turn it on (true) or off (false)
eventsarray–Replace the events it gets
idstringyesWebhook id (from list_webhooks)
urlstring–New URL to POST to (https)

No output schema declared.

No examples provided.

wait_for_project ~133

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 get_project instead for a non-blocking look with full clip details.

NameTypeReqDescription
idstringyesProject id (from create_project or list_projects)
timeoutSecondsinteger–Longest to wait, seconds (1-120, default 60)

No output schema declared.

No examples provided.

Install

How do I install the Reelsaw MCP server?

Reelsaw runs locally as a container image, launched with docker run --rm -i ghcr.io/osbytes/reelsaw:0.32.0 reelsaw mcp, plus the required -e, which you supply. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/osbytes/reelsaw

# add to Claude Code
claude mcp add osbytes-reelsaw -- docker run --rm -i ghcr.io/osbytes/reelsaw:0.32.0 reelsaw mcp

Incomplete: the registry marks -e as required and gives no value we can show, so it is not in this command. Add it before you run it.

Common questions

What is the Reelsaw MCP server?

Reelsaw is an MCP server listed in the public MCP registry as io.github.osbytes/reelsaw. Drive a self-hosted Reelsaw: turn long videos into vertical clips, edit, re-render and export them. This page covers its container image (ghcr.io/osbytes/reelsaw).

Is the Reelsaw MCP server safe to use?

Reelsaw scores 52 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Reelsaw MCP server expose?

Reelsaw exposes 84 tools: list_projects, get_project, create_project, update_project, wait_for_project, and 79 more. Their descriptions and schemas cost roughly 14,095 tokens of context every time the server is loaded.

Is the Reelsaw MCP server still maintained?

Reelsaw is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Reelsaw MCP server under?

Reelsaw declares the AGPL-3.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the Reelsaw MCP server?

VerifyMCP ran 12 checks on Reelsaw, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about Reelsaw: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.