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.

Weftly

REMOTE · API.WEFTLY.AI · SCANNED SEP 20

Find & cut horizontal and vertical video clips (Shorts/Reels), transcribe & summarize. Pay per job.

Available components

0 this week 73 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security49
Transport & Reachability100
Schema Quality & AI Usability74
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 7499 tokens (~499/item across 15 items; 13 tools + 2 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 Management100
  • No destabilizing schema changes in the last 30 days.Pass
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 Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "publish_to_youtube" implies "publish" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 15 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
  • Supports UI / widget rendering.Pass
Install

How do I install the Weftly MCP server?

Weftly is a hosted endpoint at https://api.weftly.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.weftly.ai

# add to Claude Code
claude mcp add --transport http ai-weftly-weftly 'https://api.weftly.ai/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "ai-weftly-weftly": {
      "url": "https://api.weftly.ai/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "ai-weftly-weftly": {
      "type": "http",
      "url": "https://api.weftly.ai/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.ai-weftly-weftly]
url = "https://api.weftly.ai/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-weftly-weftly": {
      "type": "remote",
      "url": "https://api.weftly.ai/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-weftly-weftly --url 'https://api.weftly.ai/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  ai-weftly-weftly:
    url: "https://api.weftly.ai/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "ai-weftly-weftly": {
      "Transport": "http",
      "Url": "https://api.weftly.ai/mcp"
    }
  }
}
# add to Vellum
assistant mcp add ai-weftly-weftly -t streamable-http -u 'https://api.weftly.ai/mcp'
// mcp.json
{
  "mcpServers": {
    "ai-weftly-weftly": {
      "type": "http",
      "url": "https://api.weftly.ai/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

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 Sept 26 0
    • Server version: 0.30.9 → 0.30.10 functional
  • 2 Sept 26 0
    • Server version: 0.30.8 → 0.30.9 functional
  • 30 Aug 26 0
    • Tool “get_job_status” rewrote its description, which is the text the model reads security
    • Server version: 0.30.6 → 0.30.8 functional
    • Server version: 0.30.5 → 0.30.6 functional
    • Server version: 0.30.4 → 0.30.5 functional
  • 29 Aug 26 0
    • Server version: 0.30.3 → 0.30.4 functional
    • Server version: 0.30.1 → 0.30.3 functional
  • 27 Aug 26 0
    • Server version: 0.29.1 → 0.30.1 functional
  • 26 Aug 26 −1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 0
    • Stability: 0.97 → pass security
    • Tool “extract_vertical_clip” rewrote its description, which is the text the model reads security
    • Schema quality: 441 → 493 functional
    • Server version: 0.28.1 → 0.29.1 functional
    • New tool “clips_horizontal” functional
    • New tool “clips_vertical” functional
    • “extract_vertical_clip” reworded the description of “end” cosmetic
  • 24 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

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 20 Sept 2026 · Probed https://api.weftly.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=weftly.ai CN=WE1,O=Google Trust Services,C=US 1 Aug 2026 30 Oct 2026 ECDSA 256 ECDSA-SHA256 5182270b554af4a2134ce8e644dbb741
SANs: weftly.ai, api.weftly.ai, *.api.weftly.ai
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of api.weftly.ai. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ai. present 3799 8 Verified
weftly.ai. present 2371 13 Verified
api.weftly.ai. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.weftly.ai/mcp Verified 200
http (plaintext) http://api.weftly.ai/mcp Served over HTTP 200
MCP tools · 13 exposed · ~6,717 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
clips_horizontal ~671

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` + `payment_credential` to start processing. Poll get_job_status(job_id); outputs are roles `clip-1-video` through `clip-N-video` (one .mp4 per requested clip, source framing and resolution preserved) plus `clips-manifest` (JSON) recording each clip's timing, output role, and any per-clip failure — a batch delivering fewer than N clips is not refunded, only one delivering zero is. Price: N × $0.50 per clip, charged once for the whole batch (Stripe quantity) rather than once per clip — see /.well-known/mpp.json for the Tempo USDC rate. No `profile` or `subject` parameters: horizontal keeps the source framing, so there is no crop to aim. **Choose deliberately between this and extract_clip**: extract_clip with several `segments` concatenates them into ONE highlight reel at the single-clip price, while this cuts N SEPARATE files at N × that price. Use this when each moment stands alone; use extract_clip when you want one file, need per-clip transcripts, or need more than 5 moments from one source. Use clips_vertical instead for 9:16 social output. Source must still be in storage — check `expires_at` on the find_clips parent via get_job_status. Retrying with `job_id` alone recovers the current state.

NameTypeReqDescription
clipsarrayYour own chosen clips (1-5) from source_job_id's clip-candidates output — nothing is auto-selected. Each is cut as a SEPARATE horizontal file; the batch is charged N × the per-clip price as one payme…
job_idstringJob ID returned from a previous clips_horizontal call. Include along with payment_credential to confirm payment and trigger processing. Also include alone to recover the current state.
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ..."). clips_horizontal accepts Tempo USDC and Stripe SPT — see the challenge's WWW-Authenticate header or /.well-known/mpp.j…
source_job_idstringJob ID of a prior find_clips job. Possessing this id is the capability — clips_horizontal is not session-bound, so a user can come back from a different session within the parent's TTL and still cut.…

No output schema declared.

No examples provided.

clips_vertical ~915

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 processing. Poll get_job_status(job_id); outputs are roles `clip-1-video` through `clip-N-video` (one 1080×1920 .mp4 per requested clip, loudness-normalized to -14 LUFS / -1.5 dBTP) plus `clips-manifest` (JSON) recording each clip's timing, output role, and any per-clip failure — a batch delivering fewer than N clips is not refunded, only one delivering zero is. Price: N × $0.50 per clip, charged once for the whole batch (Stripe quantity) rather than once per clip — see /.well-known/mpp.json for the Tempo USDC rate. Optional `profile` (default `tiktok-primary`; also `tiktok-primary-720p`, `instagram-reels`, `instagram-stories`) and `subject` (default `follow`, switches crop between active speakers; `auto` and `center` are opt-outs) apply to every clip in the batch. Use this once find_clips has surfaced candidates you like, to cut several in one purchase instead of one extract_vertical_clip call per clip; use extract_vertical_clip directly instead when you need per-clip framing control or more than 5 clips from one source. Source must still be in storage — check `expires_at` on the find_clips parent via get_job_status. Retrying with `job_id` alone recovers the current state.

NameTypeReqDescription
clipsarrayYour own chosen clips (1-5) from source_job_id's clip-candidates output — nothing is auto-selected. Each is cut as a separate vertical clip; the batch is charged N × the per-clip price as one payment…
job_idstringJob ID returned from a previous clips_vertical call. Include along with payment_credential to confirm payment and trigger processing. Also include alone to recover the current state.
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ..."). clips_vertical accepts Tempo USDC and Stripe SPT — see the challenge's WWW-Authenticate header or /.well-known/mpp.jso…
profilestringOptional encoding profile applied to every clip in the batch. Default: tiktok-primary (1080×1920 H.264 fast preset, CRF 22, 6 Mbps cap). tiktok-primary-720p: 720×1280, CBR 3 Mbps. instagram-reels: 10…
source_job_idstringJob ID of a prior find_clips job. Possessing this id is the capability — clips_vertical is not session-bound, so a user can come back from a different session within the parent's TTL and still cut. R…
subjectstringOptional reframing strategy applied to every clip in the batch. Default: "follow" — cuts between active-speaker framings across each clip, the mode that makes multi-speaker interview clips usable. "a…

No output schema declared.

No examples provided.

complete_upload ~89

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.

NameTypeReqDescription
job_idstringyesThe job_id returned from a previous transcribe or summarize call.

No output schema declared.

No examples provided.

extract_clip ~702

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 {job_id, payment_challenge}; (2) pay via MPP and call with `job_id` + `payment_credential` to start processing. No upload step. Poll get_job_status(job_id) for completion; outputs are role `clip-video` (the assembled .mp4, frame-accurate boundaries with 15ms audio fades at segment joins; audio loudness-normalized to -14 LUFS / -1.5 dBTP for clean, consistent playback) and — when `include_transcript: true` (default) — roles `clip-srt` + `clip-words` (transcripts stitched and time-shifted to match the assembled video). Set `include_transcript: false` to skip transcript outputs. Payment: pay by credit card via the Stripe Checkout link (open the returned `payment_url` in any browser) or Tempo USDC via mppx; the challenge's WWW-Authenticate header and /.well-known/mpp.json are authoritative for which methods are offered. Source must still be in storage (72h TTL for find_clips parents, 24h elsewhere — check `expires_at` from get_job_status on the parent). Multiple extract_clip calls against one parent are independent paid jobs. Failed jobs auto-refund.

NameTypeReqDescription
include_transcriptbooleanDefault true. When true, the pipeline writes clip-srt + clip-words outputs stitched to match the assembled video. Set false to skip and just receive the .mp4.
job_idstringJob ID returned from a previous extract_clip call. Include along with payment_credential to confirm payment and trigger processing. Also include alone to recover the current state.
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ..."). extract_clip accepts Tempo USDC and Stripe SPT — see the challenge's WWW-Authenticate header or /.well-known/mpp.json…
segmentsarrayOrdered array of source-relative segments to cut and concatenate into the output. Single segment for a simple cut; multiple segments compose a single mp4 from non-contiguous moments — same flat $0.50…
source_job_idstringJob ID of any prior video job (find_clips, summarize, or video transcribe). Possessing this id is the capability — extract_clip is not session-bound, so a user can come back from a different session…
titlestringOptional title for the assembled clip. Surfaces in get_job_status and download filenames; doesn't affect the cut itself.

No output schema declared.

No examples provided.

extract_vertical_clip ~1,413

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`, 60s for `instagram-stories`). Operates on a parent job — possessing the parent `source_job_id` is the capability, no upload step. Two-call flow: (1) call with `source_job_id` + `start` + `end` (in source seconds) to receive {job_id, payment_challenge}; (2) pay via MPP and call with `job_id` + `payment_credential` to start processing. Poll get_job_status(job_id) for completion; output is role `clip-vertical-video` (the `.mp4`). Flat price: $0.50 per clip. Payment: pay by credit card via the Stripe Checkout link (open the returned `payment_url` in any browser) or Tempo USDC via mppx. Optional `profile` parameter selects the encoding profile (default `tiktok-primary`). Allowed values: `tiktok-primary` (1080×1920, fast preset, CRF 22), `tiktok-primary-720p` (720×1280, CBR 3 Mbps — half-resolution mobile-optimized, ~40% faster wall time), `instagram-reels` (1080×1920, slow preset, CBR 4 Mbps), `instagram-stories` (same encode shape as instagram-reels). All four profiles loudness-normalize identically. Optional `subject` parameter controls reframing (default `center`, preserves today's behavior): `auto` locks onto the longest-tracked face from the parent's subjects-sidecar (or runs inline detection if the parent has none); `subject_id` (with `subject_id` param naming a face_N from the sidecar) locks onto a specific subject; `follow` switches crop between active speakers across the clip using the sidecar's active_speaker_timeline; `manual` accepts caller-supplied framing via `su…

NameTypeReqDescription
endnumberSource-relative end time in seconds (must be > start; end - start must be at least 1s, and no more than the selected profile's cap — 240s for tiktok-primary/tiktok-primary-720p, 180s for instagram-re…
job_idstringJob ID returned from a previous extract_vertical_clip call. Include along with payment_credential to confirm payment and trigger processing. Also include alone to recover the current state.
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ..."). extract_vertical_clip accepts Tempo USDC and Stripe SPT — see the challenge's WWW-Authenticate header or /.well-known/…
profilestringOptional encoding profile. Default: tiktok-primary (1080×1920 H.264 fast preset, CRF 22, 6 Mbps cap). tiktok-primary-720p: 720×1280, CBR 3 Mbps — half-resolution mobile-optimized, ~40% faster wall ti…
source_job_idstringJob ID of any prior video job (find_clips, summarize, or video transcribe). Possessing this id is the capability — extract_vertical_clip is not session-bound, so a user can come back from a different…
startnumberSource-relative start time in seconds. Required on the first call.
subjectstringOptional reframing strategy. Default: "center" (hardcoded center crop, today's behavior). "auto": lock onto the longest-tracked face from the parent find_clips job's subjects-sidecar (or run inline d…
subject_boxobjectFor subject="manual" — bounding box of the subject in source pixels. Crop centers on the box center.
subject_idstringRequired when subject="subject_id". Subject id from the parent's subjects-sidecar (e.g. "face_0").
subject_x_offsetnumberFor subject="manual" — direct crop x-offset in source pixels (alternative to subject_box).
t_refnumberFor subject="manual" with subject_box — source-seconds timestamp the box applies to. Informational in v1.
titlestringOptional title for the assembled clip. Surfaces in get_job_status and download filenames; doesn't affect the cut itself.

No output schema declared.

No examples provided.

find_clips ~730

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_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 extract_clip. 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 `extract_clip` or `extract_vertical_clip` as their `source_job_id` — within those 72h they cut directly from the stored source: no re-upload, no re-transcribe, just $0.50 per cut. Pass the same `source_job_id` to as many extract calls as you need. Use for interviews, podcasts, sales calls, all-hands recordings. Retrying with `job_id` alone returns current state. Failed jobs auto-refund.

NameTypeReqDescription
filenamestringFilename with extension (e.g. "podcast.mp3"). Required on the first call — used to infer media type (audio vs video) and label outputs. Supported extensions: mp3, wav, m4a, ogg, flac, mp4, mov, webm,…
job_idstringJob ID returned from a previous call. Include along with payment_credential to confirm payment and receive the presigned upload URL. Also include alone to recover the current challenge/state if the o…
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ...") obtained by paying the challenge returned from the first call. Include with job_id to verify payment and receive the up…
querystringOptional. Switches the analyzer from "best clips" discovery mode to query mode — finds segments matching this content (e.g., "they discuss pricing", "the part about hiring"). Same output shape either…

No output schema declared.

No examples provided.

get_job_status ~540

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 needed. Optionally pass `format` (srt, txt, vtt, json, words) 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). 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`) 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. Also use this to recover from lost state: if the original challenge was lost, call get_job_status(job_id) to retrieve a fresh challenge (status "awaiting_payment") or the upload URL (status "awaiting_upload").

NameTypeReqDescription
formatstringWhen the job is completed, return the transcript inline in this format instead of only a download URL. Options: "srt" (SubRip with timestamps), "txt" (plain text — no timestamps), "vtt" (WebVTT), "js…
job_idstringyesThe job_id returned from a previous transcribe or summarize call.

No output schema declared.

No examples provided.

get_youtube_publish_status ~87

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.

NameTypeReqDescription
job_idstringyesJob ID returned by publish_to_youtube
session_tokenstringyesSession token

No output schema declared.

No examples provided.

mpp_smoke_test ~256

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

NameTypeReqDescription
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ...") obtained by paying the challenge returned from the first call. Include to verify payment and receive {paid: true}. Omit…

No output schema declared.

No examples provided.

publish_to_youtube ~265

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

NameTypeReqDescription
access_tokenstringyesYouTube OAuth2 access token — the caller is responsible for obtaining this via Google OAuth
descriptionstringYouTube video description (max 5000 characters)
refresh_tokenstringYouTube OAuth2 refresh token — if provided, the Workflow will refresh the access token automatically before uploading
session_tokenstringyesSession token from create_session, create_transcript, or create_summary
source_job_idstringyesJob ID of an existing transcribe or summarize job in this session whose video to publish. The Workflow will auto-generate captions if no transcript is found.
titlestringyesYouTube video title (max 100 characters)
visibilitystringyesYouTube video visibility: "private" (default), "unlisted", or "public"

No output schema declared.

No examples provided.

summarize ~498

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 `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` 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). 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.

NameTypeReqDescription
filenamestringFilename with extension (e.g. "podcast.mp3"). Required on the first call — used to infer media type (audio vs video) and label outputs. Supported extensions: mp3, wav, m4a, ogg, flac, mp4, mov, webm,…
job_idstringJob ID returned from a previous call. Include along with payment_credential to confirm payment and receive the presigned upload URL. Also include alone to recover the current challenge/state if the o…
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ...") obtained by paying the challenge returned from the first call. Include with job_id to verify payment and receive the up…

No output schema declared.

No examples provided.

transcribe ~467

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/weftly-transcript-v2.schema.json, with segment-level and per-word timestamps). For other formats, pass `format=srt|txt|vtt|json|words` 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). 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.

NameTypeReqDescription
filenamestringFilename with extension (e.g. "podcast.mp3"). Required on the first call — used to infer media type (audio vs video) and label outputs. Supported extensions: mp3, wav, m4a, ogg, flac, mp4, mov, webm,…
job_idstringJob ID returned from a previous call. Include along with payment_credential to confirm payment and receive the presigned upload URL. Also include alone to recover the current challenge/state if the o…
payment_credentialstringMPP payment credential (full Authorization header value, e.g. "Payment eyJ...") obtained by paying the challenge returned from the first call. Include with job_id to verify payment and receive the up…

No output schema declared.

No examples provided.

trigger_youtube_publish ~84

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.

NameTypeReqDescription
job_idstringyesJob ID returned by publish_to_youtube
session_tokenstringyesSession token

No output schema declared.

No examples provided.

Common questions

What is the Weftly MCP server?

Weftly is an MCP server listed in the public MCP registry as ai.weftly/weftly. Find & cut horizontal and vertical video clips (Shorts/Reels), transcribe & summarize. Pay per job. This page covers its hosted endpoint (https://api.weftly.ai/mcp).

Is the Weftly MCP server safe to use?

Weftly scores 73 out of 100 on VerifyMCP. 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 Weftly MCP server expose?

Weftly exposes 13 tools: transcribe, summarize, find_clips, extract_clip, extract_vertical_clip, and 8 more. Their descriptions and schemas cost roughly 6,717 tokens of context every time the server is loaded.

Does the Weftly MCP server require authentication?

No. We connected to Weftly without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Weftly MCP server still maintained?

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