Hermoso
Server Details
Marketing on autopilot: 897 tools, usable alone. DM automations, ads on 12 platforms incl. AppLovin.
Glama couldn't complete the latest health check. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 66.0% over 32 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- hermoso-ai/hermoso
- GitHub Stars
- 0
- Server Listing
- Hermoso
TDQS
Scored across 183 tools
Each tool has a clearly defined purpose with extensive cross-referencing ('use X for this, not Y'), making even similar-sounding tools (generate_video vs render_ad vs make_explainer) distinguishable. The only duplicate is remix_static, which is explicitly documented as an alias for clone_static, so it does not cause real confusion.
The overwhelming majority follow a snake_case verb_noun pattern (post_to_*, list_*, generate_*, update_*), with no camelCase mixing. Minor deviations exist, such as noun-only names (billing_status, hermoso_capabilities, product_sizzle) and a few imperative verbs without objects (remember, forget), but these are isolated and do not undermine predictability.
With 183 tools, this is an extreme mismatch for an MCP server, far beyond the 3–15 typical range. Even though the descriptions are excellent and the server provides find_tools/enable_tools to manage discoverability, the sheer volume will bloat context windows and degrade tool selection reliability.
The set is exceptionally broad, covering creative generation, editing, publishing, scheduling, research, analytics, file storage, workspace management, and billing. However, there are notable gaps: no way to edit/delete published social posts (despite descriptions referencing manage_meta_post, manage_linkedin_post, delete_x_post), and no direct ad campaign management tools, leaving lifecycle coverage incomplete for several workflows.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
edit_video3 fields changed- changed
Input schema / properties / keepAudio / descriptionPrevious value: -"default true — keep the source clip’s audio track. Set false to return the edit silent"New value: +"default true: keep the source audio; false = silent" - added
Input schema / properties / previewAtAdded value: +{ + "description": "second to preview (default 0); resend with previewStill", + "type": "number" +} - changed
Input schema / properties / video / descriptionPrevious value: -"the source video URL (from a previous render, a job result, or list_library)"New value: +"the source video URL (a render, job result or list_library)"
- Changed
post_edit17 fields changed- changed
Input schema / properties / ops / items / properties / background / descriptionPrevious value: -"append_card: card background — hex or a color name ('red', 'navy'…); the user's stated color always wins over the brand palette"New value: +"append_card: hex or a colour name; the user's colour beats the brand palette" - added
Input schema / properties / ops / items / properties / bridge / properties / sound / descriptionAdded value: +"'auto' default, 'own', 'impact', 'whoosh', 'none', or an audio URL (find_sound)" - removed
Input schema / properties / ops / items / properties / bridge / properties / sound / enumRemoved value: -[ - "auto", - "own", - "impact", - "whoosh", - "none" -] - changed
Input schema / properties / ops / items / properties / card_html / descriptionPrevious value: -"append_card: your OWN full-frame card design as inline-styled HTML ({{logo}} inserts the real brand logo) — use when the standard layout cannot honor the request"New value: +"append_card: your OWN full-frame card as inline-styled HTML ({{logo}} = the brand logo)" - changed
Input schema / properties / ops / items / properties / corner / descriptionPrevious value: -"watermark corner (default br)"New value: +"watermark corner (default br), or x/y" - changed
Input schema / properties / ops / items / properties / headline / descriptionPrevious value: -"append_card: big line (defaults to the brand name)"New value: +"append_card: big line (default: brand name)" - added
Input schema / properties / ops / items / properties / intensity / anyOfAdded value: +[ + { + "enum": [ + "default", + "strong" + ], + "type": "string" + }, + { + "type": "number" + } +] - changed
Input schema / properties / ops / items / properties / intensity / descriptionPrevious value: -"grain look"New value: +"grain: or 0-1 (default 0.25)" - removed
Input schema / properties / ops / items / properties / intensity / enumRemoved value: -[ - "default", - "strong" -] - removed
Input schema / properties / ops / items / properties / intensity / typeRemoved value: -"string" - changed
Input schema / properties / ops / items / properties / position / descriptionPrevious value: -"text: where"New value: +"text: where, or x/y" - changed
Input schema / properties / ops / items / properties / seconds / descriptionPrevious value: -"fade_out 0.3-3s / append_card 2-5s / crossfade 0.2-1.5s"New value: +"fade_out 0.3-3s / append_card 2-5s / transition 0.2-1.5s" - changed
Input schema / properties / ops / items / properties / sub / descriptionPrevious value: -"append_card: the pill line (defaults to the website) / text: a smaller second line"New value: +"append_card: pill line (default: website) / text: a second, smaller line" - changed
Input schema / properties / ops / items / properties / transition / descriptionPrevious value: -"join"New value: +"join: 'cut' default, 'crossfade', or any ffmpeg xfade name (wipeleft…)" - removed
Input schema / properties / ops / items / properties / transition / enumRemoved value: -[ - "cut", - "crossfade" -] - added
Input schema / properties / ops / items / properties / xAdded value: +{ + "description": "text/watermark centre: 0-1 of frame, or px", + "type": "number" +} - added
Input schema / properties / ops / items / properties / yAdded value: +{ + "type": "number" +}
1 tool update
- Changed
post_edit2 fields changed- added
Input schema / properties / ops / items / properties / clips / items / properties / matchAdded value: +{} - added
Input schema / properties / ops / items / properties / matchAdded value: +{ + "description": "join: seam match, 'auto' default | 'off' | {grade,level,grain,blur,strength}" +}
1 tool update
- Changed
edit_video8 fields changed- changed
Input schema / properties / elements / descriptionPrevious value: -"OPTIONAL identity/product grounding (≤4): a creator portrait or the real product photo, so the edit restores the REAL thing instead of re-inventing it. Describe each one in the instruction. Leave out for a plain restyle"New value: +"OPTIONAL identity/product grounding (≤4): a creator portrait or the real product photo, so the edit restores the REAL thing. Describe each one in the instruction" - changed
Input schema / properties / instruction / descriptionPrevious value: -"the exact transformation to apply, in the user’s own words"New value: +"the change, in the user’s own words" - changed
Input schema / properties / interactionId / descriptionPrevious value: -"OPTIONAL: the interactionId an earlier Gemini Omni render or edit returned. The edit then continues that clip on the SAME Omni model from its own stored context (identity-true, no re-upload, usually cheaper). If that edit cannot run, the clip is edited by the video editor instead and the reply says so."New value: +"OPTIONAL: the interactionId an earlier Gemini Omni render or edit returned; the edit continues that clip on the same Omni model. If it cannot run, the video editor edits it and the reply says so." - added
Input schema / properties / lightingAdded value: +{ + "description": "default auto: keep the source light unless the change needs new light (night, a lamp, fire). 'preserve' or 'relight' forces it", + "enum": [ + "auto", + "preserve", + "relight" + ], + "type": "string" +} - added
Input schema / properties / literalAdded value: +{ + "description": "true = send the instruction exactly as written, with no preserve/lock wrapper", + "type": "boolean" +} - added
Input schema / properties / previewFirstFrameAdded value: +{ + "description": "true = edit ONE still of the first frame first and quote the clip; the paid clip does not run", + "type": "boolean" +} - added
Input schema / properties / previewStillAdded value: +{ + "description": "the still a previewFirstFrame call returned; the clip then matches the changed thing to it", + "type": "string" +} - added
Input schema / properties / referenceAdded value: +{ + "description": "OPTIONAL image URL that anchors the MATERIAL of what changes (a fabric, a finish, a colour swatch, the real product). Only its surface is used, never its framing or light", + "type": "string" +}
1 tool update
- Changed
hook_variants1 field changed- added
Input schema / properties / hooksAdded value: +{ + "description": "your own openings, one version each", + "items": { + "properties": { + "cutAt": { + "description": "url: override the found payoff cut", + "type": "number" + }, + "mechanic": { + "type": "string" + }, + "prompt": { + "type": "string" + }, + "start": { + "description": "url: skip the video’s own first seconds", + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
5 tool updates
- Changed
add_subtitles2 fields changed- added
Input schema / properties / autoAdded value: +{ + "enum": [ + "sentences", + "words" + ], + "type": "string" +} - added
Input schema / properties / wordsPerCueAdded value: +{ + "type": "number" +}
- Changed
analyze_video3 fields changed- added
Input schema / properties / anchorsAdded value: +{ + "description": "{afterWord|beforeWord|atWord, occurrence?, offset?} -> s", + "items": {}, + "type": "array" +} - changed
Input schema / properties / frames / descriptionPrevious value: -"true = also return the frames as images"New value: +"also return the frames as images" - added
Input schema / properties / wordsAdded value: +{ + "description": "true | 'only': each spoken word's start/end" +}
- Added
find_sound - Added
make_insert - Changed
post_edit1 field changed- added
Input schema / properties / ops / items / properties / textStyleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ] +}
8 tool updates
- Changed
clone_static1 field changed- changed
Input schema / properties / imageUrl / descriptionPrevious value: -"the URL of the static ad image to clone"New value: +"the URL of the static ad image to clone; a real person in it confirms their likeness consent"
- Changed
generate_avatar1 field changed- changed
Input schema / properties / image / descriptionPrevious value: -"local path or URL of the presenter portrait"New value: +"local path or URL of the presenter portrait; a real person’s photo confirms their likeness consent"
- Changed
generate_image1 field changed- changed
Input schema / properties / refImages / descriptionPrevious value: -"local file paths or URLs of product/logo references to composite in. ON THE POSE MODELS — any row hermoso_capabilities marks `needsRefs` with a `refsMax`, such as putting your product in someone’s hands or a virtual try-on — THE ORDER IS THE CONTRACT AND IT IS NOT A COMPOSITE: refImages[0] is the PERSON photo, and the rest (up to `refsMax` minus one) are the product or garment photos. Reversed, you get the product wearing the person. A 4th product is dropped and the reply says so."New value: +"local file paths or URLs of product/logo references to composite in. ON THE POSE MODELS — any row hermoso_capabilities marks `needsRefs` with a `refsMax`, such as putting your product in someone’s hands or a virtual try-on — THE ORDER IS THE CONTRACT AND IT IS NOT A COMPOSITE: refImages[0] is the PERSON photo, and the rest (up to `refsMax` minus one) are the product or garment photos. Reversed, you get the product wearing the person. A 4th product is dropped and the reply says so. A real person’s photo confirms their likeness consent."
- Changed
generate_video1 field changed- changed
Input schema / properties / refImage / descriptionPrevious value: -"local path or URL to anchor the first frame"New value: +"local path or URL to anchor the first frame; a real person’s photo here or in refImages confirms their likeness consent"
- Changed
recast_motion1 field changed- changed
Input schema / properties / image / descriptionPrevious value: -"the actor/character image URL (who should appear)"New value: +"the actor/character image URL (who should appear); a real person’s photo confirms their likeness consent"
- Changed
remix_static1 field changed- changed
Input schema / properties / imageUrl / descriptionPrevious value: -"the URL of the static ad image to clone"New value: +"the URL of the static ad image to clone; a real person in it confirms their likeness consent"
- Changed
render_ad1 field changed- changed
Input schema / properties / creator / descriptionPrevious value: -"CAST A SAVED CREATOR in this ad — their id from list_creators, or the name you know them by (“Sarah”). Their saved portrait becomes the on-camera identity for the whole spot, so the same face carries across every act and across every ad you render for this brand — and because we already have their picture, the character portrait this pipeline would otherwise generate is skipped, so casting somebody costs LESS than not casting them. Omit to let the ad cast a fresh person — EXCEPT for a CREATOR account (onboarded from their own @handle): their own saved likeness is cast by default on any plan with a person on camera, and the read-back says `default:true`; pass \"none\" to render without them. Refused for free, with nothing rendered, if the name matches nobody or more than one creator, if an explicitly named creator is cast on a plan with nobody on camera, or if they are a REAL person with no likeness consent on file."New value: +"CAST A SAVED CREATOR in this ad — their id from list_creators, or the name you know them by (“Sarah”). Their saved portrait becomes the on-camera identity for the whole spot, so the same face carries across every act and across every ad you render for this brand — and because we already have their picture, the character portrait this pipeline would otherwise generate is skipped, so casting somebody costs LESS than not casting them. Omit to let the ad cast a fresh person — EXCEPT for a CREATOR account (onboarded from their own @handle): their own saved likeness is cast by default on any plan with a person on camera, and the read-back says `default:true`; pass \"none\" to render without them. Refused for free, with nothing rendered, if the name matches nobody or more than one creator, or if an explicitly named creator is cast on a plan with nobody on camera. Casting a REAL person confirms their likeness consent."
- Changed
save_creator1 field changed- removed
Input schema / properties / consentedRemoved value: -{ - "description": "REAL people only: the user has confirmed that person consented to their likeness being used in ads", - "type": "boolean" -}
9 tool updates
- Changed
add_subtitles2 fields changed- changed
Input schema / properties / textStyle / anyOfPrevious value: -[ - { - "enum": [ - "pill", - "editorial", - "bold", - "minimal", - "handwritten", - "boxed" - ], - "type": "string" - }, - { - "properties": { - "background": { - "description": "none | pill | #hex box", - "type": "string" - }, - "color": { - "description": "#hex", - "type": "string" - }, - "font": { - "enum": [ - "sans", - "serif", - "elegant", - "condensed", - "hand" - ], - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "outline": { - "type": "boolean" - }, - "position": { - "enum": [ - "top", - "center", - "lower", - "bottom" - ], - "type": "string" - }, - "preset": { - "enum": [ - "pill", - "editorial", - "bold", - "minimal", - "handwritten", - "boxed" - ], - "type": "string" - }, - "shadow": { - "type": "boolean" - }, - "size": { - "anyOf": [ - { - "enum": [ - "s", - "m", - "l", - "xl" - ], - "type": "string" - }, - { - "type": "number" - } - ] - }, - "textCase": { - "enum": [ - "as-is", - "upper", - "lower", - "title" - ], - "type": "string" - }, - "tilt": { - "description": "degrees, ±12", - "type": "number" - }, - "weight": { - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "string" + }, + { + "properties": { + "background": { + "description": "none|pill|a colour", + "type": "string" + }, + "cardColor": { + "type": "string" + }, + "color": { + "description": "any CSS colour", + "type": "string" + }, + "describe": { + "description": "the look in words", + "type": "string" + }, + "font": { + "description": "sans|serif|elegant|condensed|hand or any Google Fonts family", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "outline": { + "type": "boolean" + }, + "outlineColor": { + "type": "string" + }, + "position": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "top|center|lower|bottom or 0.05-0.95 from the top" + }, + "preset": { + "type": "string" + }, + "shadow": { + "type": "boolean" + }, + "size": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "s|m|l|xl, '120px', or a 0.015-0.15 frame fraction" + }, + "subFont": { + "type": "string" + }, + "subItalic": { + "type": "boolean" + }, + "textCase": { + "enum": [ + "as-is", + "upper", + "lower", + "title" + ], + "type": "string" + }, + "tilt": { + "description": "degrees, ±45", + "type": "number" + }, + "weight": { + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / textStyle / descriptionPrevious value: -"the look: a preset or overrides; omit for the default"New value: +"the look: words, a preset or fields; omit for the default"
- Changed
analyze_video1 field changed- added
Input schema / properties / framesAdded value: +{ + "description": "true = also return the frames as images", + "type": "boolean" +}
- Changed
clip_video2 fields changed- changed
Input schema / properties / aspectRatio / descriptionPrevious value: -"clip shape — '9:16' (default) vertical for Reels/Shorts/TikTok; 'keep' leaves the source framing untouched"New value: +"clip shape: '9:16' (default), '1:1', '16:9', any 'W:H', or 'keep' for the source framing" - removed
Input schema / properties / aspectRatio / enumRemoved value: -[ - "9:16", - "1:1", - "16:9", - "keep" -]
- Added
generate_music - Changed
make_explainer3 fields changed- changed
Input schema / properties / music / descriptionPrevious value: -"music bed under the narration, measured to sit about 14 dB under the voice and sidechain-ducked beneath it. Omit and the KIDS and FAIRYTALE channels get their recommended bed COMPOSED for this film — those two are the only channels a bed is due on unasked, and it costs a small flat fee; every other channel ships dry. 'off' forces silence. 'library' takes a free curated track only, and ships dry when none is on file. NAME A MOOD — upbeat / calm / warm / epic / tense / playful / elegant / hype / chill / dramatic — to compose one on ANY channel, at the same fee. hermoso_capabilities reports the exact figure as explainerMusicCredits; quote it before you turn a bed on or pick a mood."New value: +"music bed under the narration, measured to sit about 14 dB under the voice and sidechain-ducked beneath it. Omit and the KIDS and FAIRYTALE channels get their recommended bed COMPOSED for this film — those two are the only channels a bed is due on unasked, and it costs a small flat fee; every other channel ships dry. 'off' forces silence. 'library' takes a free curated track only, and ships dry when none is on file. NAME A MOOD (upbeat / calm / warm / epic / tense / playful / elegant / hype / chill / dramatic) or DESCRIBE it in words to compose one on ANY channel, at the same fee. hermoso_capabilities reports the exact figure as explainerMusicCredits; quote it before you turn a bed on or pick a mood." - changed
Input schema / properties / style / descriptionPrevious value: -"visual style. 'cinematic' (default) is photoreal; the rest are non-photoreal styled looks — editorial_collage (halftone cutouts + marker accents), flat_vector, stickman, whiteboard, ink_marker, silhouette, storybook (gouache), paper_diorama, isometric, claymation, pixel_art, watercolor, fluffy_toy (felted plush), low_poly, stylized_3d (matte clay render), studio_3d (preschool toy 3D on a white sweep — the Kids default), mannequin (clay-render reenactment figures — a History alternate). Ask the user which they want rather than picking silently; a styled pick costs more (see the cost note)."New value: +"visual style: 'cinematic' (default, photoreal); styled shortcuts editorial_collage, flat_vector, stickman, whiteboard, ink_marker, silhouette, storybook, paper_diorama, isometric, claymation, pixel_art, watercolor, fluffy_toy, low_poly, stylized_3d, studio_3d (the Kids default), mannequin; or ANY look described in words ('80s anime cel animation'), locked across every frame. Ask rather than pick silently; a styled look costs more." - removed
Input schema / properties / style / enumRemoved value: -[ - "cinematic", - "editorial_collage", - "flat_vector", - "stickman", - "whiteboard", - "ink_marker", - "silhouette", - "storybook", - "paper_diorama", - "isometric", - "claymation", - "pixel_art", - "watercolor", - "fluffy_toy", - "low_poly", - "stylized_3d", - "studio_3d", - "mannequin" -]
- Changed
make_template_ad1 field changed- changed
Input schema / properties / config / descriptionPrevious value: -"the template config — MUST include config.template (one of the template ids above) plus that template's fields"New value: +"MUST include config.template: 'custom' or a preset id above, plus its fields"
- Changed
make_thumbnail7 fields changed- changed
Input schema / properties / font / descriptionPrevious value: -"headline font (default Anton). Alternatives incl. Bebas Neue, Oswald, Archivo Black, Montserrat, Inter, Playfair Display"New value: +"headline font: Anton (default) or any Google Fonts family" - changed
Input schema / properties / framework / descriptionPrevious value: -"concept framework id (default 'posed_portrait'); see the list in this description / hermoso_capabilities"New value: +"concept framework id (default 'posed_portrait'), or your own concept in words" - changed
Input schema / properties / headlinePlace / descriptionPrevious value: -"where the headline sits — never over the face (default 'bottom')"New value: +"bottom (default), top, center, or a 0-1 fraction from the top; never over the face" - removed
Input schema / properties / headlinePlace / enumRemoved value: -[ - "bottom", - "top", - "center" -] - changed
Input schema / properties / overlayStyle / descriptionPrevious value: -"headline style: 'beast' (default, white + heavy black stroke) / 'fire' / 'neon-lime' / 'clean-glass' / 'marker'"New value: +"headline style: beast (default), fire, neon-lime, clean-glass, marker, or your own CSS declarations" - changed
Input schema / properties / tweak / descriptionPrevious value: -"surgical pixel-faithful edit of a FINISHED thumbnail — needs sourceImage"New value: +"surgical pixel-faithful edit of a FINISHED thumbnail (needs sourceImage): kind emotion / background / background_color / rim_light, or any other kind with the edit in words as value" - removed
Input schema / properties / tweak / properties / kind / enumRemoved value: -[ - "emotion", - "background", - "background_color", - "rim_light" -]
- Changed
multiply_ad2 fields changed- changed
Input schema / properties / axes / descriptionPrevious value: -"which axes to vary (default: all four)"New value: +"what to vary: character, outfit, location, objects (default all four), or your own, e.g. \"season\"" - removed
Input schema / properties / axes / items / enumRemoved value: -[ - "character", - "outfit", - "location", - "objects" -]
- Changed
render_ad5 fields changed- added
Input schema / properties / music / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "string" + } +] - changed
Input schema / properties / music / descriptionPrevious value: -"licensed music bed on/off (default on)"New value: +"music bed: on (default), false, or the bed described in words ('lo-fi jazz, brushed drums')" - removed
Input schema / properties / music / typeRemoved value: -"boolean" - changed
Input schema / properties / textStyle / anyOfPrevious value: -[ - { - "enum": [ - "pill", - "editorial", - "bold", - "minimal", - "handwritten", - "boxed" - ], - "type": "string" - }, - { - "properties": { - "background": { - "description": "\"none\", \"pill\", or a #hex box", - "type": "string" - }, - "cardColor": { - "description": "#hex end card background", - "type": "string" - }, - "color": { - "description": "#hex", - "type": "string" - }, - "font": { - "enum": [ - "sans", - "serif", - "elegant", - "condensed", - "hand" - ], - "type": "string" - }, - "italic": { - "type": "boolean" - }, - "outline": { - "type": "boolean" - }, - "position": { - "enum": [ - "top", - "center", - "lower", - "bottom" - ], - "type": "string" - }, - "preset": { - "enum": [ - "pill", - "editorial", - "bold", - "minimal", - "handwritten", - "boxed" - ], - "type": "string" - }, - "shadow": { - "type": "boolean" - }, - "size": { - "anyOf": [ - { - "enum": [ - "s", - "m", - "l", - "xl" - ], - "type": "string" - }, - { - "type": "number" - } - ] - }, - "subFont": { - "enum": [ - "sans", - "serif", - "elegant", - "condensed", - "hand" - ], - "type": "string" - }, - "subItalic": { - "type": "boolean" - }, - "textCase": { - "enum": [ - "as-is", - "upper", - "lower", - "title" - ], - "type": "string" - }, - "tilt": { - "description": "degrees, ±12", - "type": "number" - }, - "weight": { - "type": "number" - } - }, - "type": "object" - } -]New value: +[ + { + "type": "string" + }, + { + "properties": { + "background": { + "description": "none|pill|a colour", + "type": "string" + }, + "cardColor": { + "type": "string" + }, + "color": { + "description": "any CSS colour", + "type": "string" + }, + "describe": { + "description": "the look in words", + "type": "string" + }, + "font": { + "description": "sans|serif|elegant|condensed|hand or any Google Fonts family", + "type": "string" + }, + "italic": { + "type": "boolean" + }, + "outline": { + "type": "boolean" + }, + "outlineColor": { + "type": "string" + }, + "position": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "top|center|lower|bottom or 0.05-0.95 from the top" + }, + "preset": { + "type": "string" + }, + "shadow": { + "type": "boolean" + }, + "size": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ], + "description": "s|m|l|xl, '120px', or a 0.015-0.15 frame fraction" + }, + "subFont": { + "type": "string" + }, + "subItalic": { + "type": "boolean" + }, + "textCase": { + "enum": [ + "as-is", + "upper", + "lower", + "title" + ], + "type": "string" + }, + "tilt": { + "description": "degrees, ±45", + "type": "number" + }, + "weight": { + "type": "number" + } + }, + "type": "object" + } +] - changed
Input schema / properties / textStyle / descriptionPrevious value: -"THE LOOK of captions and the end card — only meaningful with captions:true or endCard:true, and only when the user described a look. Presets: editorial (a large elegant serif title mid-frame with a small italic line under it, no box), bold (tall condensed caps with a black outline), minimal (small lowercase near the bottom), handwritten (tilted marker), boxed (dark words on a white box), pill (the plain default). Pass a preset name, or an object with a preset plus overrides. A caption written \"TITLE · small line\" puts the part after the middle dot on a second line. An invalid field is refused by name before anything renders."New value: +"THE LOOK of captions and the end card, only with captions or endCard and only when the user described one: the look in WORDS (\"chunky yellow comic letters, purple outline\"), a preset (editorial: big serif title + small italic line; bold: condensed caps, outline; minimal; handwritten; boxed; pill, the default), or fields. \"TITLE · small line\" puts the part after the dot on a second line."
1 tool update
- Changed
add_subtitles1 field changed- added
Input schema / properties / cuesAdded value: +{ + "description": "your own lines in seconds, no overlap, max 90 chars, no emoji", + "items": { + "properties": { + "end": { + "type": "number" + }, + "start": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "start", + "end" + ], + "type": "object" + }, + "maxItems": 400, + "type": "array" +}
1 tool update
- Changed
post_edit6 fields changed- added
Input schema / properties / ops / items / properties / bridge / properties / cutAt / descriptionAdded value: +"omit: found from the footage" - removed
Input schema / properties / ops / items / properties / bridge / properties / holdOnRemoved value: -{ - "enum": [ - "hook", - "clip" - ], - "type": "string" -} - changed
Input schema / properties / ops / items / properties / bridge / properties / kind / enumPrevious value: -[ - "impact", - "spoken", - "text" -]New value: +[ + "impact", + "text" +] - removed
Input schema / properties / ops / items / properties / bridge / properties / lineRemoved value: -{ - "type": "string" -} - changed
Input schema / properties / ops / items / properties / bridge / properties / sound / enumPrevious value: -[ - "impact", - "whoosh", - "none" -]New value: +[ + "auto", + "own", + "impact", + "whoosh", + "none" +] - removed
Input schema / properties / ops / items / properties / bridge / properties / voiceRemoved value: -{ - "description": "spoken: 'female'|'male'", - "type": "string" -}
1 tool update
- Changed
post_edit1 field changed- added
Input schema / properties / ops / items / properties / bridgeAdded value: +{ + "description": "join: connects the hook to the first clip", + "properties": { + "cutAt": { + "type": "number" + }, + "flash": { + "type": "boolean" + }, + "holdOn": { + "enum": [ + "hook", + "clip" + ], + "type": "string" + }, + "kind": { + "enum": [ + "impact", + "spoken", + "text" + ], + "type": "string" + }, + "line": { + "type": "string" + }, + "matchCut": { + "type": "number" + }, + "shake": { + "type": "boolean" + }, + "sound": { + "enum": [ + "impact", + "whoosh", + "none" + ], + "type": "string" + }, + "text": { + "type": "string" + }, + "then": { + "type": "string" + }, + "voice": { + "description": "spoken: 'female'|'male'", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" +}
1 tool update
- Changed
post_edit11 fields changed- added
Input schema / properties / ops / items / properties / clipsAdded value: +{ + "description": "join: the clips after this video", + "items": { + "properties": { + "end": { + "type": "number" + }, + "start": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / ops / items / properties / end / descriptionPrevious value: -"trim/mute window end (s)"New value: +"trim/mute/text window end (s)" - changed
Input schema / properties / ops / items / properties / op / enumPrevious value: -[ - "trim", - "speed", - "mute", - "audio_gain", - "fade_out", - "append_card", - "watermark", - "grain" -]New value: +[ + "trim", + "speed", + "mute", + "audio_gain", + "fade_out", + "append_card", + "watermark", + "grain", + "text", + "join" +] - added
Input schema / properties / ops / items / properties / positionAdded value: +{ + "description": "text: where", + "enum": [ + "top", + "center", + "lower", + "bottom" + ], + "type": "string" +} - changed
Input schema / properties / ops / items / properties / seconds / descriptionPrevious value: -"fade_out 0.3-3s / append_card 2-5s"New value: +"fade_out 0.3-3s / append_card 2-5s / crossfade 0.2-1.5s" - changed
Input schema / properties / ops / items / properties / start / descriptionPrevious value: -"trim/mute window start (s)"New value: +"trim/mute/text window start (s)" - added
Input schema / properties / ops / items / properties / styleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + ], + "description": "text: a look name or a textStyle" +} - changed
Input schema / properties / ops / items / properties / sub / descriptionPrevious value: -"append_card: the pill line (defaults to the brand website)"New value: +"append_card: the pill line (defaults to the website) / text: a smaller second line" - added
Input schema / properties / ops / items / properties / textAdded value: +{ + "description": "text: the words, verbatim", + "type": "string" +} - added
Input schema / properties / ops / items / properties / transitionAdded value: +{ + "description": "join", + "enum": [ + "cut", + "crossfade" + ], + "type": "string" +} - changed
Input schema / properties / videoUrl / descriptionPrevious value: -"the served URL of the video to edit"New value: +"the video to edit: a render / Library URL, a direct file, or a public post link"
2 tool updates
- Changed
list_published_posts1 field changed- added
Input schema / properties / cursorAdded value: +{ + "description": "nextCursor from a previous reply: the next, older page", + "type": "string" +}
- Changed
post_performance1 field changed- changed
Input schema / properties / days / descriptionPrevious value: -"look back N days (1-730), archived posts included; omit for the recent posts only"New value: +"look back N days (1-730) over the whole history; omit for the recent posts only"
15 tool updates
- Changed
duplicate_scheduled2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_performance1 field changed- added
Input schema / properties / daysAdded value: +{ + "description": "look back N days (1-730), archived posts included; omit for the recent posts only", + "type": "number" +}
- Changed
post_to_bluesky6 fields changed- added
Input schema / properties / allowDuplicateAdded value: +{ + "description": "post it even though an identical post was just made", + "type": "boolean" +} - added
Input schema / properties / hookAdded value: +{ + "description": "the post's angle — a list_hooks id or your own wording, reused exactly", + "type": "string" +} - added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "any stable string: a repeat within 24h returns the original post instead of posting again", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +} - added
Input schema / properties / subjectAdded value: +{ + "description": "what the post is about", + "type": "string" +}
- Changed
post_to_google_business2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_linkedin2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_linkedin_page2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_meta2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_pinterest2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_telegram6 fields changed- added
Input schema / properties / allowDuplicateAdded value: +{ + "description": "post it even though an identical post was just made", + "type": "boolean" +} - added
Input schema / properties / hookAdded value: +{ + "description": "the post's angle — a list_hooks id or your own wording, reused exactly", + "type": "string" +} - added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "any stable string: a repeat within 24h returns the original post instead of posting again", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +} - added
Input schema / properties / subjectAdded value: +{ + "description": "what the post is about", + "type": "string" +}
- Changed
post_to_tiktok2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_x2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_to_youtube2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
post_x_article2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
reschedule_post2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
- Changed
schedule_post2 fields changed- added
Input schema / properties / ideaIdAdded value: +{ + "description": "short id of the content-plan idea this post came from", + "type": "string" +} - added
Input schema / properties / recipeAdded value: +{ + "description": "the post's FORMAT id, e.g. \"slideshow\" or \"imessage_chat\" — post_performance groups by it, so reuse one id per format", + "type": "string" +}
1 tool update
- Changed
generate_image1 field changed- changed
Input schema / properties / aspectRatio / descriptionPrevious value: -"e.g. '1:1', '9:16', '16:9'"New value: +"e.g. '1:1', '9:16', '16:9', '4:5'. Each model draws its own list (hermoso_capabilities prints it per model, e.g. Nano Banana 2 goes to 1:8 and 8:1); a ratio the chosen model cannot draw is refused before anything is charged"
1 tool update
- Changed
save_creator3 fields changed- changed
Input schema / properties / image / descriptionPrevious value: -"public https url of the portrait (an existing render’s url, or any public photo). Not a local file path — upload it with upload_file first and save the url that returns"New value: +"REQUIRED except with useAnyway. public https url of the portrait (an existing render’s url, or any public photo). Not a local file path — upload it with upload_file first and save the url that returns" - added
Input schema / properties / useAnywayAdded value: +{ + "description": "only for a creator whose saved photo was flagged too unclear to cast (render_ad says so): true casts the current photo as it is, no new image needed", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "name", - "image" -]New value: +[ + "name" +]
1 tool update
- Changed
plan_ad1 field changed- added
Input schema / properties / draftAdded value: +{ + "description": "ONLY after a video refusal that offered a light draft: the {model, durationSeconds} it named. The plan is then authored to that length and priced on that model. Never invent one — a video the account cannot cover is refused BEFORE planning with the three options (image / add credits / this draft when one fits), and the user chooses.", + "properties": { + "durationSeconds": { + "type": "number" + }, + "model": { + "type": "string" + } + }, + "required": [ + "model", + "durationSeconds" + ], + "type": "object" +}
1 tool update
- Changed
render_ad1 field changed- changed
Input schema / properties / creator / descriptionPrevious value: -"CAST A SAVED CREATOR in this ad — their id from list_creators, or the name you know them by (“Sarah”). Their saved portrait becomes the on-camera identity for the whole spot, so the same face carries across every act and across every ad you render for this brand — and because we already have their picture, the character portrait this pipeline would otherwise generate is skipped, so casting somebody costs LESS than not casting them. Omit to let the ad cast a fresh person. Refused for free, with nothing rendered, if the name matches nobody or more than one creator, if the plan has nobody on camera, or if they are a REAL person with no likeness consent on file."New value: +"CAST A SAVED CREATOR in this ad — their id from list_creators, or the name you know them by (“Sarah”). Their saved portrait becomes the on-camera identity for the whole spot, so the same face carries across every act and across every ad you render for this brand — and because we already have their picture, the character portrait this pipeline would otherwise generate is skipped, so casting somebody costs LESS than not casting them. Omit to let the ad cast a fresh person — EXCEPT for a CREATOR account (onboarded from their own @handle): their own saved likeness is cast by default on any plan with a person on camera, and the read-back says `default:true`; pass \"none\" to render without them. Refused for free, with nothing rendered, if the name matches nobody or more than one creator, if an explicitly named creator is cast on a plan with nobody on camera, or if they are a REAL person with no likeness consent on file."
Related MCP Connectors
Run ads on Google, Meta, LinkedIn, TikTok and more from AI. 610+ tools across 14 platforms.
- adsOAuthcom.adspirer
Manage Google, Meta, Amazon, TikTok, LinkedIn & ChatGPT ads. 430 tools for campaigns & analytics.
- sendifaiOAuthcom.sendifai
335 MCP tools, 75 playbooks. AI-native CRM, email/SMS, events, OAuth.
Google & Meta Ads management with 100+ tools. Audit, create, and optimize campaigns.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAutomates marketing workflows across Google Ads, Meta Ads, and GA4, enabling content generation, scheduling, and analytics via a multi-agent pipeline.-
- AlicenseNot gradedqualityBmaintenanceCreate, launch, and manage Meta + Google ads from Claude and ChatGPT. Analytics, strategy, and autopilot automation for any store.1Apache 2.0
- AlicenseBqualityDmaintenanceFull-stack AI marketing toolkit with 41 MCP tools: SEO article generation in 55 languages, trend scouting (X/Reddit), competitor analysis, content gap detection, social media adaptations for 9 platforms, AI avatar video shorts, content ingestion (YouTube/PDF/web), lead magnets, and automated content autopilot.119MIT
- FlicenseNot gradedqualityDmaintenanceProvides 35 MCP tools for automated marketing campaigns, integrating event management, booking, and email marketing into a deterministic pipeline for AI agents.-
Glama MCP Gateway
Add one secure layer between your agents and this server.