{"serverId":"mcp-registry/io.github.hermoso-ai/hermoso","tools":[{"name":"analyze_video","fixed":{"name":"analyze_video","description":"A video ad's structure: verbatim transcript (voiceover + on-screen text), beat list, duration and sampled frame times; study a reference before remixing it. ~A transcription call.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["url"],"properties":{"url":{"type":"string","description":"the video URL (a served /generated/ path or a public http(s) video)"},"words":{"description":"true | 'only': each spoken word's start/end","type":"string"},"frames":{"type":"boolean","description":"also return the frames as images"},"anchors":{"type":"array","items":{},"description":"{afterWord|beforeWord|atWord, occurrence?, offset?} -> s"}}},"annotations":{"title":"Analyze video","readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"title":"Analyze video"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: words. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":196,"tokensAfter":200},{"name":"hook_variants","fixed":{"name":"hook_variants","description":"HOOK MULTIPLIER: give ONE finished video ad N NEW OPENING HOOKS, N complete versions to A/B test. A planned hook replaces the first ~1.5-4 s (ends at the source's first cut there, else 3 s; hookSeconds overrides) with a new silent shot on a DIFFERENT named mechanic (list_hooks); the rest of the footage and the WHOLE original soundtrack stay, so every version keeps the source's length, and nobody in the hook talks or shows text. hooks[] adds your own openings: {url} a FOUND viral hook (post link ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["video"],"properties":{"plan":{"description":"the `plan` object a previous dryRun returned, to render exactly those hooks without planning again","type":"string"},"count":{"type":"number","description":"how many hook versions, 1-5 (default 3)"},"hooks":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"cutAt":{"type":"number","description":"url: override the found payoff cut"},"start":{"type":"number","description":"url: skip the video’s own first seconds"},"prompt":{"type":"string"},"mechanic":{"type":"string"}}},"description":"your own openings, one version each"},"notes":{"type":"string","description":"anything the hooks must respect, e.g. \"keep it calm\", \"show the product in every hook\""},"video":{"type":"string","description":"the finished video to give new hooks: its served file URL"},"dryRun":{"type":"boolean","description":"true = return the plan and the quote, render nothing"},"useBrand":{"type":"boolean","description":"false = send no brand name or product photo (for a video that is not this workspace brand’s)"},"resolution":{"enum":["480p","720p","1080p"],"type":"string","description":"render tier for the new opening. Defaults to the source’s OWN tier so the hook matches the rest of the ad; a lower tier costs a lot less and is scaled into the source’s canvas (visibly softer for the first seconds). dryRun quotes whichever you pick."},"hookSeconds":{"type":"number","description":"where the CURRENT hook ends, in seconds (1.5-4). Omit to use the first shot cut."},"productImage":{"type":"string","description":"product photo URL used as a reference in hooks that show the product (defaults to the workspace brand’s first product photo)"}}},"annotations":{"title":"New opening hooks for a video","readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"title":"New opening hooks for a video"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: plan. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":646,"tokensAfter":650},{"name":"make_series","fixed":{"name":"make_series","description":"CONTENT FACTORY: turn ONE topic into a SERIES of faceless short videos (narration over pictures, no presenter), optionally in the STYLE of a trending reference video. Give `topic` (\"make a video about…\"), `episodes` (1-10, default 1) or your own `episodeTitles`, `durationSeconds` (20-120 per episode, default 30) and optionally `reference` (a TikTok / Reel / YouTube Short / Facebook / X link or a video file URL whose look, pacing, opening hook and caption style every episode copies; never its wor","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"plan":{"description":"the `plan` a planOnly call returned, to run it without planning again","type":"string"},"style":{"type":"string","description":"override the look in words (e.g. \"flat 2D cartoon\") instead of the reference's"},"topic":{"type":"string","description":"what the series is about, in the user's words"},"voice":{"enum":["female","male"],"type":"string","description":"narrator; default follows the reference"},"format":{"enum":["explainer","faceless_channel"],"type":"string","description":"renderer lane: 'explainer' (default; exact length) or 'faceless_channel' (2K, whole 10s blocks)"},"jobIds":{"type":"array","items":{"type":"string"},"description":"SCHEDULE MODE: the episode job ids to schedule (finished ones are booked)"},"confirm":{"type":"boolean","description":"REQUIRED true to start rendering (real spend). Without it you get a free quote"},"captions":{"type":"boolean","description":"burn subtitles of every spoken word. Default: on only when the reference itself burns its spoken words as subtitles, otherwise off; nothing else is ever put on screen (no app screens, URLs, cards or stickers) unless the user asks"},"episodes":{"type":"number","description":"how many episodes, 1-10 (default 1)"},"planOnly":{"type":"boolean","description":"write the episode plan and style card, render nothing (a small planning charge)"},"schedule":{"type":"object","required":["channels","at"],"properties":{"at":{"type":"string"},"channels":{"type":"array","items":{"type":"string"}},"timezone":{"type":"string"},"everyHours":{"type":"number"}},"description":"SCHEDULE MODE: where and when the first episode posts; the rest follow every `everyHours` (default 24)"},"reference":{"type":"string","description":"a video link whose style every episode copies"},"aspectRatio":{"enum":["9:16","16:9","1:1"],"type":"string","description":"default: the reference's shape, else 9:16"},"postCaptions":{"type":"array","items":{"type":"string"},"description":"SCHEDULE MODE: one post caption per episode, in order (default: the episode title)"},"episodeTitles":{"type":"array","items":{"type":"string"},"description":"your own episode titles, in order (sets the episode count)"},"durationSeconds":{"type":"number","description":"length of EACH episode, 20-120 seconds (default 30)"}}},"annotations":{"title":"Make a series of faceless short videos (Content Factory)","readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"title":"Make a series of faceless short videos (Content Factory)"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: plan. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":810,"tokensAfter":815}],"toolsChanged":3,"tokensSaved":0,"todo":[{"tool":"add_subtitles","params":["auto","wordsPerCue"]},{"tool":"append_to_notion_page","params":["includeSchedule","swipefileCollection"]},{"tool":"clear_sheet_range","params":["confirm","sheetUrl","spreadsheetId"]},{"tool":"delete_linkedin_lead_subscription","params":["subscriptionId"]},{"tool":"duplicate_scheduled","params":["link","title","imageUrl","videoUrl","visibility"]},{"tool":"export_schedule_to_notion","params":["dataSourceId","parentPageId"]},{"tool":"find_creators","params":["minAvgViews"]},{"tool":"find_sound","params":["url","pick","query"]},{"tool":"format_sheet","params":["sheetUrl","autoResize","boldHeader","spreadsheetId"]},{"tool":"get_linkedin_lead","params":["leadId"]},{"tool":"list_linkedin_lead_events","params":["limit"]},{"tool":"list_linkedin_lead_subscriptions","params":["leadType"]},{"tool":"list_linkedin_leads","params":["until"]},{"tool":"list_notion_pages","params":["type"]},{"tool":"make_insert","params":["image","sound","video","seconds","soundEnd","soundStart","videoStart"]},{"tool":"manage_sheet_tabs","params":["action","confirm","sheetUrl","confirmCells","spreadsheetId"]},{"tool":"post_to_tiktok","params":["disableComment"]},{"tool":"reschedule_post","params":["link","visibilityByChannel"]},{"tool":"run_post_refill","params":["redo"]},{"tool":"save_to_notion","params":["title","dataSourceId"]},{"tool":"set_competitor_watch","params":["auto","dryRun","cadence"]},{"tool":"set_post_refill","params":["forgetCaptionEdits"]},{"tool":"update_brand","params":["logo","name","audience","category","positioning","profileType"]},{"tool":"update_doc","params":["confirm"]},{"tool":"update_saved_creator","params":["status"]},{"tool":"update_sheet","params":["sheetUrl","spreadsheetId"]}],"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."}