{"apiVersion":"v1","directorySlug":"weftly-mcp-8bcbe70aa5","title":"Weftly","description":"The MCP server for video editing. Let Claude and other AI agents transcribe, summarize, and clip your videos in minutes. $0.50–$2.00 per job. No subscription, no API keys, no infrastructure to run.","pageUrl":"https://www.mcpbundles.com/skills/weftly-mcp-8bcbe70aa5","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://api.weftly.ai/mcp","hostedMcpUrl":null,"toolCount":13,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"ai.weftly/weftly-mcp-8bcbe70aa5","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"transcribe","description":"Transcribe 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/we","inputSchema":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"filename":{"type":"string"},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"transcribe","displayName":"transcribe","title":"transcribe","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"summarize","description":"Summarize 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","inputSchema":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"filename":{"type":"string"},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"summarize","displayName":"summarize","title":"summarize","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"find_clips","description":"START 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","inputSchema":{"type":"object","properties":{"query":{"type":"string","maxLength":500,"minLength":1},"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"filename":{"type":"string"},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"find_clips","displayName":"find_clips","title":"find_clips","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"extract_clip","description":"Cut and assemble a clip 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. Pass one segment for a simple cut, or multiple non-contiguous segments to compose a single mp4 highlight reel — same flat $0.50 either way. Two-call flow: (1) call with `source_job_id` + `segments` (ordered array of `{start, end, label?}` in source seconds, total duration capped at 30 minutes) to receive","inputSchema":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"segments":{"type":"array","items":{"type":"object","required":["start","end"],"properties":{"end":{"type":"number","minimum":0},"label":{"type":"string","maxLength":200},"start":{"type":"number","minimum":0}},"additionalProperties":false},"maxItems":50,"minItems":1},"source_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"include_transcript":{"type":"boolean"},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"extract_clip","displayName":"extract_clip","title":"extract_clip","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"extract_vertical_clip","description":"Cut a 9:16 vertical clip from any prior video job (find_clips, summarize, or video transcribe), suitable for direct upload to TikTok, Instagram Reels, or YouTube Shorts. Default output is 1080×1920 H.264 / AAC `.mp4` with center-cropped framing; audio loudness-normalized to -14 LUFS / -1.5 dBTP for short-form social. Single-segment only; clip duration must be at least 1 second, and no more than the selected profile's cap (240s for `tiktok-primary`/`tiktok-primary-720p`, 180s for `instagram-reels","inputSchema":{"type":"object","properties":{"end":{"type":"number","minimum":0},"start":{"type":"number","minimum":0},"t_ref":{"type":"number","minimum":0},"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profile":{"enum":["tiktok-primary","tiktok-primary-720p","instagram-reels","instagram-stories"],"type":"string"},"subject":{"enum":["center","manual","auto","subject_id","follow"],"type":"string"},"subject_id":{"type":"string","maxLength":64},"subject_box":{"type":"object","required":["x","y","w","h"],"properties":{"h":{"type":"number","exclusiveMinimum":0},"w":{"type":"number","exclusiveMinimum":0},"x":{"type":"number","minimum":0},"y":{"type":"number","minimum":0}},"additionalProperties":false},"source_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"subject_x_offset":{"type":"number","minimum":0},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"extract_vertical_clip","displayName":"extract_vertical_clip","title":"extract_vertical_clip","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"clips_vertical","description":"Batch-cut a set of your own chosen vertical 9:16 clips from a prior find_clips job in one purchase. Two-call flow: (1) call with `source_job_id` (a find_clips job id) and `clips` (1-5 objects `{start, end, title?}` in source seconds — your own picks from that job's `clip-candidates` output; nothing is auto-selected) to receive {job_id, payment_challenge}; (2) pay by credit card via the returned `payment_url` or Tempo USDC via mppx, then call again with `job_id` + `payment_credential` to start pr","inputSchema":{"type":"object","properties":{"clips":{"type":"array","items":{"type":"object","required":["start","end"],"properties":{"end":{"type":"number","minimum":0},"start":{"type":"number","minimum":0}},"additionalProperties":false},"maxItems":5,"minItems":1},"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profile":{"enum":["tiktok-primary","tiktok-primary-720p","instagram-reels","instagram-stories"],"type":"string"},"subject":{"enum":["follow","auto","center"],"type":"string"},"source_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"clips_vertical","displayName":"clips_vertical","title":"clips_vertical","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"clips_horizontal","description":"Batch-cut a set of your own chosen horizontal 16:9 clips from a prior find_clips job in one purchase, delivered as SEPARATE files. Two-call flow: (1) call with `source_job_id` (a find_clips job id) and `clips` (1-5 objects `{start, end, title?}` in source seconds — your own picks from that job's `clip-candidates` output; nothing is auto-selected) to receive {job_id, payment_challenge}; (2) pay by credit card via the returned `payment_url` or Tempo USDC via mppx, then call again with `job_id` + `","inputSchema":{"type":"object","properties":{"clips":{"type":"array","items":{"type":"object","required":["start","end"],"properties":{"end":{"type":"number","minimum":0},"start":{"type":"number","minimum":0}},"additionalProperties":false},"maxItems":5,"minItems":1},"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"clips_horizontal","displayName":"clips_horizontal","title":"clips_horizontal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"complete_upload","description":"Confirm 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.","inputSchema":{"type":"object","required":["job_id"],"properties":{"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false},"logicalName":"complete_upload","displayName":"complete_upload","title":"complete_upload","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_job_status","description":"Check 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 need","inputSchema":{"type":"object","required":["job_id"],"properties":{"format":{"enum":["srt","txt","vtt","json","words"],"type":"string"},"job_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false},"logicalName":"get_job_status","displayName":"get_job_status","title":"get_job_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mpp_smoke_test","description":"Smoke-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","inputSchema":{"type":"object","properties":{"payment_credential":{"type":"string"}},"additionalProperties":false},"logicalName":"mpp_smoke_test","displayName":"mpp_smoke_test","title":"mpp_smoke_test","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"publish_to_youtube","description":"Publish an existing video from a transcribe or summarize job to YouTube. Creates a paid publish job (flat $1.75 price) and stores the OAuth token. Captions are auto-generated from the session transcript if available. Workflow: create_job → pay → trigger_youtube_publish → poll get_youtube_publish_status. Requires a YouTube OAuth2 access token obtained independently via Google OAuth (scope: youtube.upload).","inputSchema":{"type":"object","required":["session_token","access_token","source_job_id","title","visibility"],"properties":{"visibility":{"enum":["private","unlisted","public"],"type":"string","default":"private"},"access_token":{"type":"string"},"refresh_token":{"type":"string"},"session_token":{"type":"string"},"source_job_id":{"type":"string"}},"additionalProperties":false},"logicalName":"publish_to_youtube","displayName":"publish_to_youtube","title":"publish_to_youtube","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"trigger_youtube_publish","description":"Start the YouTube upload after payment is confirmed. Call this after publish_to_youtube once payment_status is \"paid\". Returns immediately — the upload runs as a durable Workflow in the background. Poll get_youtube_publish_status to track progress.","inputSchema":{"type":"object","required":["session_token","job_id"],"properties":{"job_id":{"type":"string"},"session_token":{"type":"string"}},"additionalProperties":false},"logicalName":"trigger_youtube_publish","displayName":"trigger_youtube_publish","title":"trigger_youtube_publish","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_youtube_publish_status","description":"Check the status of a YouTube publish job. Poll periodically after trigger_youtube_publish — the upload takes 1-10 minutes depending on video size. Returns status (pending, publishing, completed, failed) and the youtube_video_url once complete.","inputSchema":{"type":"object","required":["session_token","job_id"],"properties":{"job_id":{"type":"string"},"session_token":{"type":"string"}},"additionalProperties":false},"logicalName":"get_youtube_publish_status","displayName":"get_youtube_publish_status","title":"get_youtube_publish_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Weftly&config=eyJ1cmwiOiAiaHR0cHM6Ly9hcGkud2VmdGx5LmFpL21jcCJ9"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Weftly%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.weftly.ai%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Weftly%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.weftly.ai%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Weftly&connectorUrl=https%3A%2F%2Fapi.weftly.ai%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Weftly\" --url \"https://api.weftly.ai/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/weftly-mcp-8bcbe70aa5","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/weftly-mcp-8bcbe70aa5/tools/{tool}","mcpServerUrl":"https://api.weftly.ai/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/weftly-mcp-8bcbe70aa5?live=1"}