Weftly
ai.weftly/weftlyVersion 0.39.0Find & cut horizontal and vertical video clips (Shorts/Reels), transcribe & summarize. Pay per job.
Status
Responds338 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 13:35 UTC
- Latency
- 338 ms
- Remotes responding
- 1 of 1
- Sign-in
- No sign-in
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://api.weftly.ai/mcpResponds338 msNo sign-in
Claude Code
claude mcp add --transport http weftly https://api.weftly.ai/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: weftly
Remote MCP server URL: https://api.weftly.ai/mcpCursor
{
"mcpServers": {
"weftly": {
"url": "https://api.weftly.ai/mcp"
}
}
}VS Code
code --add-mcp '{"name":"weftly","type":"http","url":"https://api.weftly.ai/mcp"}'Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
11 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
clips_from_jobCut one or more clips from any prior video job (find_clips, summarize, or video transcribe). Operates on a parent job — possessing the parent `source_job_id` is the capability, no upload step. Contrast with `clips_from_video`, which takes a local `filename` and uploads a video that has never been in Weftly before; use this tool whenever a video job already exists. Two choices are required on every new job, with no default — if the customer's intent is genuinely ambiguous, ask rather than guess: `orientation` (`horizontal` keeps the source framing; `vertical` crops to 9:16 for TikTok/Reels/Shorts) and `output` (`files` delivers one file per clip; `reel` concatenates every clip into a single file). Two-call flow: (1) call with `source_job_id` + `clips` (1+ objects `{start, end, title?}` in source seconds) + `orientation` + `output` to receive {job_id, payment_challenge}; (2) pay via MPP and call again with `job_id` + `payment_credential` to start processing. Price: `output: "reel"` bills a flat $0.50 regardless of segment count; `output: "files"` bills N × $0.50 for N clips, charged once for the whole batch (Stripe quantity). See /.well-known/mpp.json for the Tempo USDC rate. `output: "files"` caps a batch at 5 clips; `output: "reel"` concatenates every clip into one file, capped at 30 minutes of total output for `orientation: "horizontal"` or, for `orientation: "vertical"`, the selected profile's cap: 240s for `tiktok-primary` and `tiktok-primary-720p`, 180s for `instagram-reels`, 60s for `instagram-stories`. The 240s ceiling is an encode limit (crop+scale cost per segment against the container's own timeout), not a platform rule; the shorter profile caps are the destination's own limit. `orientation: "vertical"` accepts `profile` (default `tiktok-primary`; also `tiktok-primary-720p`, `instagram-reels`, `instagram-stories`) and `subject` (`center`/`auto`/`follow`, default `follow` — switches crop between active speakers across clip and segment boundaries, the mode th | Not declared | Not declared | Not declared | Not declared |
clips_from_videoFind clips in a video AND cut up to 5 of them, under ONE payment. This is the alternative to calling find_clips and then clips_from_job yourself — prefer it whenever the user wants clips delivered end-to-end from a video they have not yet uploaded. CARD PAYMENT ONLY — this chain authorizes a Stripe hold (up to $4.50) before the final price is known (the total depends on how many clips are found and delivered), a shape MPP push settlement cannot express. A caller with no card-checkout capability (a wallet-only MPP agent) should NOT call this tool — call find_clips then clips_from_job instead, paying per step in USDC. Two-call flow: (1) call with `filename` and `content_type` (video only) — and an optional `query` to switch clip discovery from "best clips" to matching specific content (e.g. "the part about pricing") — to receive {job_id, status: "awaiting_payment", checkout_url}; (2) once the user says they have authorized payment, call again with the SAME `job_id` (no other fields needed) to recover state — this returns the same checkout_url if still unauthorized, or an upload step once the card hold is authorized (the client performs the upload, never you). Retrying with a NEW call instead of the same `job_id` authorizes a SECOND card hold for the same video — always resume with `job_id`, exactly like every other job-creating tool here. The card hold authorizes the worst case (one $2.00 find_clips analysis plus up to 5 × $0.50 clips), not a charge — the customer is charged once, at the end, for exactly what was delivered (fewer clips than the maximum is normal, not a failure). Clips are auto-selected by score and delivered as a `clips-manifest` output alongside the transcript and clip candidates on the same job. Poll with get_job_status(job_id) for the transcript and candidates; the clips themselves land as the job progresses through its chained stages. Set `orientation` to choose the shape: `vertical` (the default) cuts 9:16 clips for TikTok, Reels and Shorts; `hor | Not declared | Not declared | Not declared | Not declared |
complete_uploadConfirm that the file has been uploaded (via HTTP PUT to the upload_url from transcribe or summarize) and start processing. Verifies that the file is present in storage and that the job has been paid. Returns status "processing". Poll get_job_status to track progress and retrieve download URLs when done. | Not declared | Not declared | Not declared | Not declared |
edit_from_multiple_camerasAssemble one continuous edit from 2 camera files of the same event that started rolling at different moments. It syncs the cameras from their audio (a clap or sharp sound in the first 30 seconds of every file is the fallback), picks the camera that frames each voice by diarization, and renders one video at the main camera's resolution and fps (1080p ceiling). Three calls: (1) call with `inputs` (array of `{filename, name?}`, index 0 = the main camera) to receive {job_id, payment_challenge}. (2) After payment, call again with `job_id` (+ `payment_credential` on the MPP rail) to receive `upload_urls[]`: one presigned PUT URL per camera, 1h expiry. (3) PUT every file to its URL, call complete_upload(job_id) once ALL are uploaded (a partial upload is rejected naming the missing indices), then poll get_job_status(job_id). Optional `offsets` (seconds per camera, `offsets[0]` = 0, others may be negative) skip clap detection for footage with no clap; optional `cuts` (`{source, start, end}` in each camera's own timeline) render exactly the angles you give and skip automatic selection; `show` (`speaker` default, or `listener`) and `n_speakers` tune automatic selection. Output: role `edit`, one H.264 video with audio loudness-normalized to -14 LUFS / -1.5 dBTP, as long as the main camera and at most 60 minutes. Flat price for the whole job regardless of camera count: $3.00, see /.well-known/mpp.json for the Tempo USDC rate. Allow about 1.5 minutes of processing per minute of footage, plus upload time. The result is a normal video job: pass its `job_id` to clips_from_job as `source_job_id` to cut clips from the finished edit (it stays in storage 72h). Use for multi-camera interviews, podcasts and panels; use clips_from_job instead to cut a single existing video. Voice-based selection only (no gaze). Retrying with `job_id` alone recovers the current state or fresh upload URLs. Failed jobs auto-refund. Payment: pay by credit card via the Stripe Checkout link (open the returned `p | Not declared | Not declared | Not declared | Not declared |
edit_from_transcriptCut and re-assemble a video from an edited copy of its own word-level transcript — the text-editing counterpart to clips_from_job's timestamp-based cutting. Operates on a parent job (find_clips, summarize, or video transcribe) that has a word-level transcript; possessing the parent `source_job_id` is the capability, no upload step. Get the editable text first via get_job_status(job_id, format: "edit") or the download route — one `[NNNN]`-marked line per sentence — then edit it in any text editor: delete words or whole lines, move whole lines, but do not add or change a word (a marker used twice, or any added/changed word, invalidates the whole edit and is rejected before payment). Two-call flow: (1) call with `source_job_id` + the full edited text as `edited_transcript` (sent inline, max 262144 UTF-8 bytes) + optional `title` to receive {job_id, payment_challenge} — an invalid edit is rejected here, before any charge, with the exact failing lines; (2) pay via MPP (Tempo USDC) or open the Stripe Checkout `payment_url` in a browser, then call again with `job_id` + `payment_credential` to start processing. Flat price: $1.00 — see /.well-known/mpp.json for the Tempo USDC rate. Up to 300 cuts and 60 minutes of output per call; repeated phrases match their first occurrence, left to right. Outputs: role `clip-video` (the edited video), plus `clip-srt` and `clip-words` re-timed to match the edit. Source must still be in storage (72h TTL for find_clips parents, 24h elsewhere — check `expires_at` from get_job_status on the parent). Use whenever the edit is easier to describe in text than in timestamps — tightening a clip or a short segment by deleting filler words and tangents, or reordering a handful of sentences; use `extract_clip` (via clips_from_job) instead when you already know the exact start/end seconds you want. Retrying with `job_id` alone recovers the current state. A rejected edit creates no job, so show its errors to the user from the response that returned them. | Not declared | Not declared | Not declared | Not declared |
find_clipsSTART HERE for any clip workflow on a video — `find_clips` is the canonical entry point and includes a full transcription as a free byproduct. **Do not call `transcribe` first**: doing so doubles the upload, doubles the spend, and produces the same transcript. Identify ranked candidate clips in a video — what to cut for highlights, social, or testimonials. Three-call flow: (1) call with `filename` (and optional `query`) to receive {job_id, payment_challenge}; (2) pay via MPP, then call with `job_id` + `payment_credential` to receive {upload_url} (presigned PUT, 1h expiry); (3) PUT the bytes, then complete_upload(job_id), then poll get_job_status(job_id). On completion, get_job_status returns three outputs: role `clip-candidates` (JSON matching /.well-known/weftly-clips-v1.schema.json — includes `source_job_id` and `source_expires_at`), role `transcript` (SRT, free byproduct), role `transcript-words` (JSON matching /.well-known/weftly-transcript-v2.schema.json, free byproduct). Each candidate carries `transcript_text` — the full text of what's in the clip — so callers can preview content before paying for clips_from_job. Optional `query` parameter switches to query mode (e.g., "they discuss pricing", "the part about hiring") with the same output shape; the `mode` field in clip-candidates.json indicates which mode produced the result. Flat price: $2.00 video — see /.well-known/mpp.json. **Source-reuse contract:** the source video stays in storage for 72h after find_clips completes. Hand the find_clips `job_id` (also returned as `source_job_id` in the candidates JSON) to `clips_from_job` as its `source_job_id` — within those 72h it cuts directly from the stored source: no re-upload, no re-transcribe, just $0.50 per cut (more for a multi-clip `output: "files"` batch). Pass the same `source_job_id` to as many `clips_from_job` calls as you need. Use for interviews, podcasts, sales calls, all-hands recordings. Retrying with `job_id` alone returns current state. Failed jobs | Not declared | Not declared | Not declared | Not declared |
get_job_statusCheck the status of a transcribe or summarize job. Returns the current state and, when completed, an `outputs` array. Each output has either `content` (returned inline) or a presigned, time-limited (1 hour) `download_url`. Small text outputs (e.g. `transcript` SRT, `clip-candidates`, `summary`) come inline as `content`; larger outputs — `transcript-words` JSON for any non-trivial recording, plus video outputs like `clip-video` / `clip-vertical-video` — come as a `download_url` to fetch when needed. Optionally pass `format` (srt, txt, vtt, json, words, edit) to get the transcript content inline in the top-level `transcript` field — `txt` and `vtt` are derived from the stored SRT; `json` is v1 (segments only); `words` is v2 (segments + per-word timestamps matching /.well-known/weftly-transcript-v2.schema.json); `edit` is a plain-text "[NNNN] words..." paragraph list, one line per paragraph, for editing by hand — send the edited text to edit_from_transcript to cut a re-timed video from it. Poll this periodically after calling complete_upload — wait at least 60 seconds between checks. For files under 10 minutes, jobs usually complete within 1-2 minutes. For long files (1hr+), expect 10-30 minutes. Derivative jobs (`extract_clip`, `extract_vertical_clip`, `publish_youtube`, `clips_vertical`, `clips_horizontal`, `edit_from_transcript`, `audio_from_job`) have no upload step and no `awaiting_upload`/`awaiting_complete_upload` states — a paid derivative job reports `processing` once its parent source is confirmed still in storage, or a terminal `source_expired` if the parent source has expired: stop polling, and re-run the parent job named in `source_job_id` to get a fresh source before retrying. `publish_youtube` is the one exception: its upload starts by itself as soon as payment settles, so a paid job goes straight to `publishing`. If it reports `awaiting_trigger` instead, the upload did not start — almost always because the YouTube account is not connected yet; connect i | Not declared | Not declared | Not declared | Not declared |
mpp_smoke_testSmoke-test the MPP payment plumbing end-to-end via this MCP server, for $0.01 USDC. Two-call flow: (1) call with no arguments to receive an MPP `payment_challenge`; (2) pay via MPP and call again with `payment_credential` set to the resulting Authorization header value (e.g. "Payment eyJ...") to receive {paid: true, timestamp, receipt_ref, payment_method}. Uses the exact same `createPayToAddress` + `createMppHandler` verification path as paid product tools (transcribe, summarize), so a green run here means real paid calls will work too. Stateless — no job is created, no database row written. Use this whenever you want to confirm a wallet, the MCP transport, the worker, and the production payment middleware are all healthy without paying a transcribe price. Cost: $0.01 USDC per attempt. | Not declared | Not declared | Not declared | Not declared |
publish_to_youtubePublish an existing video from a transcribe or summarize job to YouTube, storing the caller-supplied OAuth token. Price: Free. The upload starts automatically — once payment settles, if a price applies — with no separate trigger step. Captions are auto-generated from the session transcript if available. Poll get_job_status to track progress; it returns the YouTube URL when the job completes. Requires a YouTube OAuth2 access token obtained independently via Google OAuth (scope: youtube.upload). | Not declared | Not declared | Not declared | Not declared |
summarizeSummarize an audio or video file — returns both a text summary AND the full transcript (with per-word timestamps). Do not also call transcribe on the same file. Three-call flow: (1) call with `filename` to receive {job_id, payment_challenge}; (2) pay via MPP, then call with `job_id` + `payment_credential` to receive {upload_url} (presigned PUT, 1h expiry); (3) PUT the bytes, then complete_upload(job_id), then poll get_job_status(job_id). On completion, get_job_status returns three outputs: role `summary` (plain text), role `transcript` (SRT), and role `transcript-words` (JSON matching /.well-known/weftly-transcript-v2.schema.json, with segment-level and per-word timestamps). For other formats, pass `format=srt|txt|vtt|json|words|edit` to get_job_status to receive transcript content inline — `txt` and `vtt` are derived from SRT, `json` is v1 (segments only), `words` is v2 (segments + words), `edit` is a plain-text "[NNNN] words..." paragraph list for editing by hand. Flat price: audio $0.75, video $1.25 — see /.well-known/mpp.json for the authoritative table. Use for meetings, long-form interviews, lectures, and podcast episodes; the `words` output additionally supports creating clips, multicamera edits, or edit-video-from-transcript. Retrying any call with `job_id` alone returns current state (idempotent). Failed jobs auto-refund. | Not declared | Not declared | Not declared | Not declared |
transcribeTranscribe audio or video to text, including per-word timestamps for precise editing. Three-call flow: (1) call with `filename` to receive {job_id, payment_challenge}; (2) pay via MPP, then call with `job_id` + `payment_credential` to receive {upload_url} (presigned PUT, 1h expiry); (3) PUT the bytes, then complete_upload(job_id), then poll get_job_status(job_id). On completion, get_job_status returns two outputs: role `transcript` (SRT) and role `transcript-words` (JSON matching /.well-known/weftly-transcript-v2.schema.json, with segment-level and per-word timestamps). For other formats, pass `format=srt|txt|vtt|json|words|edit` to get_job_status to receive content inline — `txt` and `vtt` are derived from SRT, `json` is v1 (segments only), `words` is v2 (segments + words), `edit` is a plain-text "[NNNN] words..." paragraph list for editing by hand. Flat price: audio $0.50, video $1.00 — see /.well-known/mpp.json for the authoritative table. Use for podcasts, interviews, meetings, lectures, and especially for creating clips, multicamera edits, or edit-video-from-transcript where word boundaries matter. Retrying any call with `job_id` alone returns current state (idempotent). Failed jobs auto-refund. | Not declared | Not declared | Not declared | Not declared |
Details
- Registry status
- Active
- Published
- Nov 14, 2026
- Updated
- Nov 14, 2026
- Categories (suggested)
- Design and mediaSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared