SuperCMO
PYPI · SUPERCMO-SKILLS · SCANNED AUG 18
Marketing media generation — image, video, voice — for AI agents. BYO keys.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency35
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability66
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 4932 tokens (~274/item across 18 items; 18 tools + 0 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 Management23
- Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
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
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
pypi · supercmo-skills
claude mcp add supercmohq-supercmo -- uvx supercmo-skills
codex mcp add supercmohq-supercmo -- uvx supercmo-skills
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"supercmohq-supercmo": {
"type": "local",
"command": [
"uvx",
"supercmo-skills"
],
"enabled": true
}
}
} openclaw mcp add supercmohq-supercmo --command uvx --arg supercmo-skills
mcp_servers:
supercmohq-supercmo:
command: "uvx"
args: ["supercmo-skills"] {
"mcpServers": {
"supercmohq-supercmo": {
"command": "uvx",
"args": [
"supercmo-skills"
]
}
}
} 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.
- 18 Aug 26 +16
- Malware scan: unverified → pass ▲ security
- 17 Aug 26 −15
- Malware scan: pass → unverified ▼ security
- Schema quality: 5725 → 4932 ▲ functional
- Package version: 0.1.17 → 0.1.18 functional
- 16 Aug 26 +1
- Stability: 0.13 → unverified ▼ security
- Schema quality: 3704 → 5725 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.1.16 → 0.1.17 functional
- 15 Aug 26 0
- Stability: 0.10 → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.1.15 → 0.1.16 functional
- 14 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Aug 26 0
- Stability: 0.03 → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.1.12 → 0.1.15 functional
- Package version: 0.1.12 → 0.1.14 functional
- Package version: 0.1.12 → 0.1.13 functional
- 12 Aug 26 +16
- Malware scan: unverified → pass ▲ security
- Stability: unverified → 0.03 ▲ functional
- Package version: 0.1.9 → 0.1.12 functional
- Package version: 0.1.9 → 0.1.11 functional
- Package version: 0.1.9 → 0.1.10 functional
- 11 Aug 26 50
First indexed and scored.
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 18 Aug 2026 · Analysed pypi/supercmo-skills@0.1.18
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
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.
audio_generate ~417
For a user's voiceover request, load the `generating-audio` skill BEFORE calling this — it picks the right model and voice and prepares the script for reading aloud (this tool does none of that, and calling it raw gives a flat, mispronounced read). Turn written text into spoken audio: voiceovers, narration, ad reads, character lines, or any script read aloud. Pass `requests`: ONE object per clip (wrap even a single clip — `{ requests: [ { text } ] }`); add more objects (up to 10) to generate DIFFERENT lines in one call — a single approval covers the batch. Each result carries the spoken audio plus a local file `path`, or a structured error with a hint. This generates speech and nothing else: no sound effects, music, or ambience, no re-voicing an existing recording, and no dubbing a video. If the user asks for one of those, say so plainly rather than substituting a different tool. Every request needs a `voice` — the `voice_id` of a row from list_voices. There is no default voice. Models differ in expressiveness, language coverage, speed, price, and per-request character limit — call list_audio_models to compare them. Set dry_run=true to preview the exact requests without generating (no credits spent).Each entry in `results` is one of three things: finished media; a `{status:"pending", ...}` job handle to rejoin with job_status; or a failure carrying `ok: false` and an `error`. A failed entry is terminal — report its `error` and never poll or re-submit it. Read every entry rather than the top-level counters alone.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the requests that would be sent (keys masked), make no API call. |
| requests | array | yes | One object per audio clip (wrap even a single clip); add more objects to generate different lines in one call (up to 10). |
No output schema declared.
No examples provided.
caption_video ~272
Burn styled, social-style captions into a video from a word-timed transcript — local ffmpeg, no credits. The usual chain is transcribe -> caption_video: run transcribe on the video (or its voiceover) to get word timestamps, then pass those here. Captions are styled and positioned with a font bundled in the package (no system-font dependency); optional karaoke highlights each word as it is spoken. Timestamps are relative to the video's own audio (t=0). Returns the output file `path` with its duration, resolution, and size, or a structured error with a hint. Requires ffmpeg. Set dry_run=true to preview without rendering.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the planned output and line count; run no ffmpeg. |
| output | string | – | Optional output file path. Omit to write a default filename into the media output directory. |
| style | object | – | Optional caption styling. |
| transcript | array | yes | The words to show, in order — each an object with the word text and its timing in seconds. This is exactly the `words` list transcribe returns. |
| video | string | yes | The video to caption — a local file path (e.g. a video_generate `path`) or an http(s) video URL. |
No output schema declared.
No examples provided.
image_analysis ~211
Look at an image (a local file path or an image URL) and answer a question about it — returns text, not a new image. Use to read a product photo (category, materials, on-pack text, distinctive details), to judge whether a shot is product-only or shows a face, or to describe any image's content, layout, or text. Give a specific 'prompt' for a focused answer; omit it for a general description. Set dry_run=true to preview the request without spending.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the request that would be sent (key and image masked), make no API call. |
| image | string | yes | The image to analyze — a local file path or an http(s) image URL. |
| prompt | string | – | The question to answer about the image — e.g. 'What product is this, how is it used, how does it open, and what color/material/label details define it?' Omit for a general description. |
No output schema declared.
No examples provided.
image_generate ~417
For a user's image request, load the `generating-images` skill BEFORE calling this — it picks the right model and builds the prompt (this tool does neither, and calling it raw gives weak, inconsistent results). Generate one or many still images from text prompts, optionally guided by reference images (a product photo, a character, a style or composition to follow). Pass `requests`: ONE object per image (wrap even a single image — `{ requests: [ { prompt } ] }`). Generate a batch of DIFFERENT images in a SINGLE call by adding more request objects (up to 10), each with its own prompt/model/aspect_ratio/resolution/reference_images; a single approval covers the whole batch. Each result carries a hosted image URL plus a local file `path`, or a structured error with a hint. Use for graphics, mockups, product/marketing visuals, logos, concept art, or to render a product or character from a supplied reference. Images are polled for you; a heavy image (large model / 4k / big batch) that runs long returns `{status:"pending", ...}` (a job handle, not an error) — pass that exact handle to `job_status` to retrieve it, and never re-submit a pending image. Set dry_run=true to preview the exact requests and cost without generating (no credits spent).Each entry in `results` is one of three things: finished media; a `{status:"pending", ...}` job handle to rejoin with job_status; or a failure carrying `ok: false` and an `error`. A failed entry is terminal — report its `error` and never poll or re-submit it. Read every entry rather than the top-level counters alone.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the requests that would be sent (keys masked), make no API call. |
| requests | array | yes | One object per image (wrap even a single image); add more objects to batch different images in one call (up to 10). |
No output schema declared.
No examples provided.
job_status ~263
Retrieve a long-running generation that was submitted earlier but hasn't finished — any result from a generation tool that came back as `{status:"pending", ...}` (a job handle, not media). Pass the exact pending handle object(s) in `jobs`; NEVER re-submit a pending job with the tool that created it — that starts (and bills) a new one. Each job comes back one of three ways: **finished** (a hosted URL plus a local file `path`); still **pending** (`{status:"pending", ...}`), in which case call job_status again with the same handle after a short wait; or **failed**, carrying `ok: false` and an `error`. A failed job is terminal — it will never finish, so report the error and never poll or re-submit that handle. A batch can mix all three, so read every entry in `results` rather than the top-level counters alone. This works for any kind of pending generation and only rejoins an existing job — it neither starts nor bills a new one.
| Name | Type | Req | Description |
|---|---|---|---|
| jobs | array | yes | The pending job handle object(s) to retrieve — each exactly as returned by a prior video_generate / job_status call. Add more than one to retrieve a batch in one call. |
No output schema declared.
No examples provided.
list_audio_models ~152
List the available speech models — for each, its strengths, price, per-request character limit, language coverage, and the audio types it supports — plus the output formats audio_generate accepts. Every model works with every voice, so voices are a separate concern — use list_voices for those. This is the authoritative source for what a model accepts; call it when choosing a model for an open-ended request, or to check a value before setting it. Pass an optional 'query' to filter models by use-case keyword (e.g. 'expressive', 'long-form', 'fast').
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | – | Optional keyword to filter models by use-case (matches the name, display name, and strengths). |
No output schema declared.
No examples provided.
list_image_models ~164
List the available image-generation models (with strengths, price, the aspect ratios each accepts and how many reference images it takes), plus the valid aspect ratios and resolution tiers that image_generate accepts. Use when you need to choose a model and don't already have one in mind (e.g. an open-ended request), or to check the valid aspect_ratio / resolution values, or how many reference images a model will take, before calling image_generate — most of the time the model is the default or already specified. Pass an optional 'query' to filter models by use-case keyword (e.g. 'text', 'photorealistic', 'fast').
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | – | Optional keyword to filter models by use-case (matches the name, display name, and strengths). |
No output schema declared.
No examples provided.
list_research_sources ~118
List the available research sources for social_research — every platform, its endpoints, and each endpoint's required and optional params plus per-call cost. Call this FIRST whenever you need competitor ads, profiles, posts, comments, transcripts, or platform search and don't already know the exact platform + endpoint + params. Pass an optional 'query' to filter by platform, endpoint, or keyword (e.g. 'ads', 'reddit', 'comments').
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | – | Optional keyword to filter sources by platform, endpoint, or description. |
No output schema declared.
No examples provided.
list_video_models ~167
List the available video-generation models with, for each, its full schema: modes (text / image / first-last-frame / reference), the aspect ratios, durations and resolutions it accepts, which media it takes (start/end frame and reference image/video/audio with max counts), whether it has native audio, plus strengths and price. This is the authoritative source for a model's exact ranges — call it when choosing a model for an open-ended request, or to check what a model accepts before setting aspect_ratio / duration / resolution / media. Pass an optional 'query' to filter by use-case keyword (e.g. 'cinematic', 'fast', 'audio').
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | – | Optional keyword to filter models by use-case (matches the name, display name, and strengths). |
No output schema declared.
No examples provided.
list_voices ~392
Find a voice to speak with, and get the `voice_id` that audio_generate requires. Returns the voices saved in the active ElevenLabs account — the user's own on their key, or the shared SuperCMO set on a managed key — each with its gender, accent, age, use-case and a `preview_url` you can hand the user so they hear it before committing. Filter by what the brief actually demands (a stated gender or accent is not negotiable) and keep `limit` small: offer a few candidates with their previews rather than a long list. A voice missing the attribute you filtered on is kept rather than dropped, because a voice the user cloned themselves often carries no labels at all. If the account holds no voices the result says so — a newly created ElevenLabs account starts empty, and voices must be added in the ElevenLabs dashboard before anything can be spoken.
| Name | Type | Req | Description |
|---|---|---|---|
| accent | string | – | Filter by accent as the provider labels it (e.g. 'american', 'british', 'indian', 'australian'). Free text, since the set grows. |
| age | string | – | Filter by apparent age of the voice. |
| gender | string | – | Filter by voice gender. Apply whenever the user stated one. |
| language | string | – | Filter by primary language as a short code (e.g. 'en', 'hi', 'es'). |
| limit | integer | – | How many voices to return. Keep it small — a handful of good candidates beats a catalogue. |
| search | string | – | Free-text match over name, description and labels (e.g. 'warm', 'storyteller'). Passed to the provider. |
| use_case | string | – | Filter by what the voice is built for (e.g. 'advertisement', 'conversational', 'narrative_story', 'social_media', 'informative_educational'). |
No output schema declared.
No examples provided.
setup_status ~153
Check which SuperCMO media-generation keys are configured and which capabilities (image / video / audio) are ready — the setup doctor. Call this FIRST when a user is setting up SuperCMO, asks which keys they need, or a generation failed with 'no_provider_configured'. Returns each vendor key (set/missing, what it enables, where to get it), managed-key state, and per-capability readiness. Set check=true for a FREE key-validity probe where one exists (never a paid generation). Reports only key NAMES and set/missing — never key values.
| Name | Type | Req | Description |
|---|---|---|---|
| check | boolean | – | If true, also run a FREE key-validity probe where a provider implements one (no paid call). |
No output schema declared.
No examples provided.
social_research ~356
Pull read-only structured public data from social platforms and ad libraries — competitor ads (Meta/Facebook + Instagram, LinkedIn), profiles, posts, comments, transcripts, hashtag/keyword search, and subreddit / trend discovery. Two steps: call list_research_sources FIRST to see the platforms, their endpoints, and each endpoint's params; then call this with `platform`, `endpoint`, and a `params` object built from that endpoint's required/optional params. Returns the source's structured JSON in `data` (the shape varies by endpoint), or a structured error naming the missing or unknown params. Use for competitor and market research, audience listening, and trend discovery — this is read-only public data, not posting and not private data. Set dry_run=true to preview the exact request without spending.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the request that would be sent (key masked), make no API call. |
| endpoint | string | yes | The endpoint on that platform — e.g. 'company_ads', 'profile', 'posts', 'comments', 'search', 'hashtag'. Call list_research_sources for each platform's endpoints. |
| params | object | – | The endpoint's query parameters as an object — e.g. {"handle": "nike"} or {"companyName": "Nike", "country": "US"}. list_research_sources lists the required and optional params for each endpoint; a m… |
| platform | string | yes | The platform to query — e.g. 'meta_ad_library', 'instagram', 'tiktok', 'youtube', 'reddit', 'x', 'linkedin', 'linkedin_ads'. Call list_research_sources for the full set. |
No output schema declared.
No examples provided.
transcribe ~180
Transcribe speech from an audio or video file into text with word-level timestamps. Use it to caption a video (chain transcribe -> caption_video), to read a voiceover back, or to analyse a competitor ad's spoken script. `audio` is a local file path or an http(s) URL (audio or video). Returns {ok, text, words:[{word, start, end}], duration, language}, or a structured error. Set dry_run=true to preview the request without spending.
| Name | Type | Req | Description |
|---|---|---|---|
| audio | string | yes | The audio or video to transcribe — a local file path or an http(s) URL. |
| dry_run | boolean | – | If true, preview the request (key masked); make no API call. |
| language | string | – | Optional ISO language-code hint (e.g. 'en'); omit to auto-detect. |
No output schema declared.
No examples provided.
url_extraction ~254
Extract structured data from a web page — a product listing (Amazon, Shopify, AliExpress, any store) or any URL — guided by a prompt and/or a JSON schema. Returns the requested fields (e.g. name, brand, price, description, specs) and any gallery image URLs as a compact JSON object, plus page metadata — not the page's full text. Use when you need specific data or image URLs from a page. Set dry_run=true to preview the exact request without spending.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the request that would be sent (key masked), make no API call. |
| prompt | string | – | What to extract, in plain language — e.g. 'product name, brand, price, currency, variant, full description, feature bullets, specs, and all product-gallery image URLs (front/side/back/close-up/packag… |
| schema | object | – | Optional JSON Schema describing the exact shape to return. Use for a strict, typed result; omit to let the prompt guide the extraction. |
| url | string | yes | The page URL to extract from (an http(s) URL). |
No output schema declared.
No examples provided.
video_analysis ~233
Watch a video (a local file path or a video URL) and answer a question about it — returns text, not a new video. Use to read a supplied or reference clip before generating: its subject and setting, the key actions, the camera work and motion, the pacing, and the gist of any audio, so a new prompt can animate or match it instead of contradicting it. Give a specific 'prompt' for a focused answer; omit it for a general breakdown. Analyzes a clip inline, so a very large file may be rejected — trim or link a shorter clip if so. Set dry_run=true to preview the request without spending.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the request that would be sent (key and video masked), make no API call. |
| prompt | string | – | The question to answer about the video — e.g. 'What happens, and what camera movement, pacing, and audio does it use?' Omit for a general breakdown. |
| video | string | yes | The video to analyze — a local file path or an http(s) video URL. |
No output schema declared.
No examples provided.
video_generate ~396
For a user's video request, load the `generating-videos` skill BEFORE calling this — it picks the right model and builds the motion prompt (this tool does neither, and calling it raw gives weak, generic clips). Generate one or many short video clips from text prompts, optionally guided by a start (and end) frame or by reference images, videos, or audio. Pass `requests`: ONE object per clip (wrap even a single clip — `{ requests: [ { prompt } ] }`); add more objects (up to 10) to batch DIFFERENT clips in one call, and repeat an object for variations of one prompt — a single approval covers the batch. Models differ in the aspect ratios, durations, resolutions, and media they accept — call list_video_models to check. Video generation is long-running: each clip is submitted and polled for you. A clip that finishes in time returns a hosted video URL plus a local file `path`; a clip still generating returns `{status:"pending", ...}` (a job handle, NOT an error) — pass that exact handle to `job_status` to retrieve it, and never re-submit a pending clip. Set dry_run=true to preview the exact requests without generating (no credits spent).Each entry in `results` is one of three things: finished media; a `{status:"pending", ...}` job handle to rejoin with job_status; or a failure carrying `ok: false` and an `error`. A failed entry is terminal — report its `error` and never poll or re-submit it. Read every entry rather than the top-level counters alone.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the requests that would be sent (keys masked), make no API call. |
| requests | array | yes | One object per clip (wrap even a single clip); add more objects to batch different clips in one call (up to 10). |
No output schema declared.
No examples provided.
video_overlay ~302
Stamp a logo, timed text, and a branded end card onto a video — local ffmpeg, no credits. Overlay a logo watermark at a chosen corner, drop in timed text (CTAs, offers, captions you place yourself), and/or append an end-card image as a short closing still. Pass at least one of logo / texts / end_card. Text is rendered with a bundled font (no system-font dependency). Returns the output file `path` with its duration and resolution, or a structured error. Requires ffmpeg. Set dry_run=true to preview.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, return the plan; run no ffmpeg. |
| end_card | string | – | Optional end-card image (path or URL) appended as a closing still. |
| end_card_duration | number | – | How long the end card holds, in seconds (default 3). |
| logo | string | – | Optional logo image (PNG with transparency recommended) — path or URL. |
| logo_position | string | – | Where the logo sits (default bottom-right). |
| logo_scale | number | – | Logo width as a fraction of the video width (default 0.15). |
| output | string | – | Optional output file path. Omit to write a default filename into the media output directory. |
| texts | array | – | Timed text overlays. |
| video | string | yes | The video to decorate — a local file path or an http(s) video URL. |
No output schema declared.
No examples provided.
video_stitch ~485
Join finished video clips into one file, in the order given, with a hard cut between each and each clip's audio kept — this assembles existing clips, it does not generate new video. Use it to build a video longer than a single model clip: generate the shots with video_generate, then stitch them. Do NOT use it for a single clip, or for a batch of clips meant to stay separate. Three optional layers, each its own parameter: lay a voiceover over the picture (pass `narration` — ONE take per clip, in clip order, NOT one joined track; each take is aligned to its own clip so nothing drifts), lay a background-music track under the whole thing (pass `music`), or burn in subtitles from an SRT file (pass `subtitles`); clips of different sizes are scaled to a common frame. Returns the output file `path` with its duration, resolution, and size, or a structured error with a hint. Requires ffmpeg on the system. Set dry_run=true to preview the plan without running anything.
| Name | Type | Req | Description |
|---|---|---|---|
| clips | array | yes | The clips to join, in play order — local file paths (e.g. the `path` a video_generate result returns) or direct http(s) video URLs. At least two. |
| dry_run | boolean | – | If true, return the planned output path and inputs; run no ffmpeg. |
| music | string | – | Optional audio file (a local path or a URL) laid under the whole video as background music, mixed below the clips' own audio. |
| narration | array | – | Optional voiceover — ONE audio take per clip, in the same order and the same count as `clips`. Each take is padded with silence to its clip's length, so take N is heard over clip N with no timecodes… |
| output | string | – | Optional output file path. Omit to write a default filename into the media output directory. |
| subtitles | string | – | Optional SRT subtitle file (a local path or a URL) burned into the video. |
No output schema declared.
No examples provided.