{"serverId":"mcp-registry/ai.weftly/weftly","tools":[{"name":"complete_upload","fixed":{"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)$","description":"The job_id returned from a previous transcribe or summarize call."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":209,"tokensAfter":209},{"name":"find_clips","fixed":{"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,"description":"Optional. 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 way; the `mode` field in clip-candidates.json tells consumers how to interpret per-candidate scoring."},"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)$","description":"Job 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 original response was lost."},"filename":{"type":"string","description":"Filename 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, mkv."},"payment_credential":{"type":"string","description":"MPP 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 upload URL."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":549,"tokensAfter":549},{"name":"get_job_status","fixed":{"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","edit"],"type":"string","description":"When 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), \"json\" (v1, segments only), \"words\" (v2, segments + per-word timestamps matching /.well-known/weftly-transcript-v2.schema.json), \"edit\" (plain text, one \"[NNNN] words...\" line per paragraph — edit it and send it to edit_from_transcript to cut a re-timed video from it). Omit for download URLs only."},"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)$","description":"The job_id returned from a previous transcribe or summarize call."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":430,"tokensAfter":430},{"name":"summarize","fixed":{"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)$","description":"Job 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 original response was lost."},"filename":{"type":"string","description":"Filename 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, mkv."},"payment_credential":{"type":"string","description":"MPP 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 upload URL."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":444,"tokensAfter":444}],"toolsChanged":4,"tokensSaved":0,"todo":[{"tool":"clips_from_job","params":["clips","job_id","output","profile","subject","captions","orientation","source_job_id","include_transcript","payment_credential"]},{"tool":"clips_from_video","params":["query","job_id","captions","filename","job_type","thread_id","orientation","content_type"]},{"tool":"edit_from_transcript","params":["title","job_id","source_job_id","edited_transcript","payment_credential"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}