REST API
Workflow skills
Discover and read the canonical public skills through MCP or REST without a separate installation.
GET /api/v2/skills
READMCP twin: list_skills
Discover Ghostfeed’s public workflow skills. Read the relevant skill before composing a multi-step avatar, UGC image/video, or slideshow workflow. No separate skill installation is required to read these instructions.
No parameters.
{
"success": true,
"data": {
"skills": [
{
"uri": "skill://ghostfeed-avatars/SKILL.md",
"frontmatter": {
"name": "ghostfeed-avatars",
"description": "Drive Ghostfeed's avatar create/approve flow over MCP. Gather intent, generate drafts, let the user approve. Refined from real testing."
},
"resources": [
{
"uri": "skill://ghostfeed-avatars/SKILL.md",
"digest": "sha256:9acdb78a3185117dfab56aa864596f2812c0061942d2d1defb20b9f260c93fab",
"size": 5117
}
]
},
{
"uri": "skill://ghostfeed-slideshows/SKILL.md",
"frontmatter": {
"name": "ghostfeed-slideshows",
"description": "Build TikTok photo slideshows over MCP as the art director. Start a blank deck, search and cast every background, write the text, review, hand over the link. Refined from real founder dogfooding."
},
"resources": [
{
"uri": "skill://ghostfeed-slideshows/SKILL.md",
"digest": "sha256:5715f77866297583ffba0028b9aac667679109a67047173f242801f39787e0ac",
"size": 9916
}
]
},
{
"uri": "skill://ghostfeed-ugc-reactions/SKILL.md",
"frontmatter": {
"name": "ghostfeed-ugc-reactions",
"description": "Create and recreate UGC images and videos with Ghostfeed tools. Choose image creation, composition cloning, editing, prompt-directed motion, or Wan 3 reference-guided motion; use Brands, Product images, avatars, and saved source understanding as needed."
},
"resources": [
{
"uri": "skill://ghostfeed-ugc-reactions/SKILL.md",
"digest": "sha256:f0c2d51784c048d452f7acc38c9edfdc1cf7fa3f4b83e13ffaf079edb5b32132",
"size": 24633
}
]
}
],
"nextSteps": "Read the relevant skill with get_skill using its exact name. Skills explain how to combine tools; reading a skill does not execute its workflow."
}
}GET /api/v2/skills/read
READMCP twin: get_skill
Read one public workflow skill by name. Returns the canonical instructions and content digest. Follow the user’s goal and use the described tools; this call does not start generation or change shared settings.
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Exact skill name returned by list_skills."
}
},
"required": [
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}{
"success": true,
"data": {
"skill": {
"uri": "skill://ghostfeed-ugc-reactions/SKILL.md",
"frontmatter": {
"name": "ghostfeed-ugc-reactions",
"description": "Create and recreate UGC images and videos with Ghostfeed tools. Choose image creation, composition cloning, editing, prompt-directed motion, or Wan 3 reference-guided motion; use Brands, Product images, avatars, and saved source understanding as needed."
},
"resources": [
{
"uri": "skill://ghostfeed-ugc-reactions/SKILL.md",
"digest": "sha256:f0c2d51784c048d452f7acc38c9edfdc1cf7fa3f4b83e13ffaf079edb5b32132",
"size": 24633
}
]
},
"text": "---\nname: ghostfeed-ugc-reactions\ndescription: Create and recreate UGC images and videos with Ghostfeed tools. Choose image creation, composition cloning, editing, prompt-directed motion, or Wan 3 reference-guided motion; use Brands, Product images, avatars, and saved source understanding as needed.\n---\n\nTranslate the user's goal into the necessary tools. A request to “clone this\nvideo” can mean copying its composition, recreating its actions from analysis,\nor guiding a new performance with the original media. Choose the relevant parts;\nthere is no mandatory end-to-end sequence or MCP App wizard.\n\n## Choose the creative operation\n\n| Intent | Tool | Important inputs |\n| ----------------------------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |\n| Create an image from an idea or references | `generate_image` | `instruction`; optional `avatarId`, `productImageId`, and `referenceImages` |\n| Recreate a composition with a selected identity | `clone_image` | `composition`, required `avatarId`, optional `productImageId` and instructions |\n| Change an existing image | `edit_image` | `image` and `instruction`; preserves the original |\n| Animate from action you write | `generate_video_from_prompt` | `image`, selected `mode`, and `prompt` |\n| Guide motion or performance directly with media | `generate_video_from_reference` | `image`, Wan 3 `mode`, `reference`, and `guidance` |\n| Read or explicitly request source understanding, or prepare generation action | `get_reaction_template`, then `analyze_video` when needed | Saved `videoUnderstanding` first; `profile: \"understanding\"` only when missing/failed; model-specific action profiles when needed |\n\nEach creative call produces one output. Several references describe one output;\nthey are not a batch count. For several requested outputs, submit distinct calls\nwith distinct idempotency keys and track each generation.\n\n## Workspaces, models, and existing assets\n\nCall `get_me` and `list_workspaces` when establishing context. Pass the chosen\nworkspace slug or ID explicitly on every write. A Brand name and a workspace\nname are different identities; resolve each through its own discovery tool.\n\nUse `list_image_models` and `list_reaction_video_modes` to choose supported model\nIDs, reference types/counts, duration, resolution, audio behavior, and prices.\nDo not invent models or silently drop incompatible references. When a requested\ncombination is unsupported, explain the specific constraint and choose an\nappropriate alternative with the user.\n\nReuse a suitable existing image when the user's request permits it. Use\n`list_reaction_frames` and `get_image` to inspect it. Changing the video model or\naction does not inherently require generating another image. An old frame's\nexistence does not prove that the user liked it; respect their stated choice and\nany request to review the image before proceeding.\n\nFor avatars, use existing avatar discovery and creation tools. Load the\n`ghostfeed-avatars` skill when creating a new identity; its approval rules remain\nunchanged. Do not create a new avatar just to change a scene or garment.\n\n## Brands and Product images\n\n- `list_brands` / `get_brand` find saved marketing context and processing status.\n- `create_brand` creates a Brand from website information or explicit details.\n Website enrichment and Product image harvesting are asynchronous; inspect\n `get_brand` rather than assuming the images are ready immediately.\n- `update_brand` changes supported details.\n- `list_product_images` returns the Brand's directly owned Product image IDs.\n- To add files to a Brand, call `request_product_image_upload`, PUT bytes to its\n signed URL with the returned Content-Type, then call `add_product_images` with\n the returned upload keys and filenames. Repeat the same ordered inputs when\n retrying completion. Generic media uploads are a separate reference path.\n- Rename or remove a Product image only as requested, using the corresponding\n Product image tool. Collections are not required for UGC product references.\n\n`clone_image` selects the product-aware default whenever `productImageId` is\nsupplied. It inserts that product even when the composition has none, allowing\nnecessary pose/hand/placement changes while preserving avatar identity and\nproduct appearance. Template + product cloning without an avatar is unsupported.\nFor product-only scenes, use `generate_image` with instructions and supported\nreferences instead.\n\n## Source videos and uploads\n\nUse the source the user supplied or selected. When the request needs a source\nand none was supplied, discover appropriate sources with `list_reaction_templates` and `list_inspiration_reactions`. Library\n`firstFrameScene` and the saved `videoUnderstanding` help selection. Older rows\nmay expose `opensOn` and `motion` summaries instead; those are not full action\nprompts.\nImport a social link or inspiration into the workspace with\n`import_reaction_template` when a saved template is needed. Poll its generation.\nLong completed imports remain usable. Crop only when the chosen generation workflow\nneeds a shorter or cleaner reference range; `render_source_crop` supports visual\nselection in an Apps host.\n\n### Choose the part to recreate\n\nAfter importing a source for cloning, establish which part the user wants before\npreparing generation. A long organic video often combines a short creator hook,\na product demo, and sometimes a creator return. Do not assume the entire clip is\nthe intended motion reference. If the request does not already identify the part,\nask one concise question: the opening hook, the creator parts, or the whole video?\nRespect an explicit selection; do not ask again or force a hook-only workflow.\n\nRead `get_reaction_template` for source media, duration, and `videoUnderstanding`.\nImports create understanding at no user credit cost and remain processing until it\ncompletes. Its saved\nresult contains `understanding.firstFrameScene`, `generationPrompt`,\n`description`, `contentStructure`, `demoType`, simple timestamped `sections`,\nand optional visual format, editing complexity, and approximate transcript.\nNew cropped templates are exact media assets with their own\nunderstanding and crop-relative timestamps. Historical crops may also carry\n`sourceContext` for the whole original and `range` for the selected source interval.\nUse the cropped asset's sections to identify the requested part; whole-source\ncategories remain supporting context and never restrict generation.\nCropping a template currently starts a new understanding job for that cropped\nasset. The crop generation can succeed before that analysis finishes: read the\nnew template and wait for its understanding to complete before using its\ncrop-specific descriptions or generation prompt. Do not call `analyze_video` again for\nthe same crop unless its saved understanding is missing or failed and the user\nrequests a retry. The new analysis describes the crop's actual first frame and\naction; the whole source's first-frame scene and generation prompt must not be\npresented as facts about a later segment.\n\nIf understanding is absent on an older template, call `analyze_video` with\n`profile: \"understanding\"`; this explicitly enrolls that template in the same saved\nanalysis lifecycle. For `pending` or `processing`, wait briefly and poll the\ntemplate read or the same analysis request; both reuse the saved job. For `failed`,\nexplain that analysis failed and use `retryFailed: true` only when a retry is\nexplicitly requested. Do not loop retries. A new import remains unavailable\nuntil its understanding succeeds; older completed templates without this analysis\nretain their established generation fallback. The 120-second import limit still applies.\n\nSections and transcripts are approximate, not verified cut points or subtitles.\nWhen a boundary matters for motion control, inspect the source or use\n`get_source_frame` near the transition and confirm the crop preview. A still\nframe cannot verify speech or lip-sync. Do not invent timestamps. If the result\nand visible footage disagree, use the footage and explain the uncertainty.\n\n- **Reference-guided motion:** isolate the selected source range with\n `crop_reaction_template` when the reference includes unwanted demo or other\n footage. Use the user's supplied/approved range, poll completion, and pass the\n new template ID as the reference. Keep source audio aligned to the same range.\n An exact Crop request from the Apps selection authorizes that crop: use its\n supplied source and start/end times without asking for the same approval again.\n Use saved understanding and source inspection to choose one continuous range\n containing the complete requested part. This creates one clip, not an automatic\n collection of scene clips.\n- **Full-length reference clone:** when the user wants the whole source and a\n selected model limits reference duration, plan an ordered set of adjacent\n ranges that covers the requested interval. For Wan 3 Video Guided, each source\n reference must be at most 15 seconds. Wan 3 and MiniMax H3 Smart Motion use\n the measured source duration for the output, rounded up to a supported whole\n second. Wan 3 has a two-second minimum; H3 has a four-second minimum. Do not\n send `durationSeconds` for guided or motion-control calls; supplied values are\n rejected before billing. For a\n faithful clone, plan each range near a supported whole-second length.\n If a natural boundary leaves a fractional duration, adjust a nearby cut when\n the footage allows it, or explain the duration mismatch before generation.\n Place boundaries at natural changes in movement or scene, not mechanically\n at 15-second marks. Use the original\n understanding to propose boundaries, then inspect nearby source frames and\n the crop preview; its timestamps are approximate. Avoid an impractically\n short final range by adjusting an earlier boundary. Crop each range from the\n original source, poll each crop generation, and use its own starting frame/composition\n for the selected avatar. Generate one video per crop in source order, with\n separate idempotency keys. Do not silently switch to another model or offer\n one 15-second reference as a faithful clone of a longer performance. Price\n the complete plan, including any additional starting images, before paid\n generation. The outputs are independent takes: inspect transitions and do\n not promise seamless motion or audio. MCP currently has no video-stitching\n tool; provide the dashboard editor link for assembly and say clearly when\n the requested final combined video has not yet been delivered.\n- **Prompt-directed recreation:** read the source understanding, then write the\n `prompt` for only the selected section yourself. The backend does not write or\n insert the source's saved generation prompt for this tool. Cropping the\n original is unnecessary when only written action guides generation. If there\n is not enough evidence to write that action, resolve the missing detail\n before generation.\n- **Demo footage:** ask for or reuse the user's own product demonstration when\n it is needed in the result. Do not copy the source app's interface or present\n invented functionality as the user's product. A hook-only request needs no\n demo. For assembly beyond generation, provide the dashboard editing link.\n\nThese choices also apply to animation and other source formats. A category helps\ninterpret the footage; it does not decide what can be generated or override the\nuser's goal.\n\nFor local Image, Video, or Audio references:\n\n1. `request_media_upload` with filename, Content-Type, byte length, and a stable\n upload ID when retrying.\n2. PUT the bytes to the returned signed URL using its Content-Type.\n3. `complete_media_upload` with `uploadId`. Use the returned `mediaId` thereafter.\n\nAn upload URL alone is not a usable reference. Completion validates media and\nstores an immutable accepted asset with server-measured audio/video duration.\n\nSources for analysis use **exactly one** of\n`{ \"templateId\": \"...\" }`, `{ \"mediaId\": \"...\" }`, or `{ \"videoId\": \"...\" }`\nfor a completed generated video in the selected workspace. Reuse that video ID\ndirectly; downloading and reuploading the generated video is unnecessary.\nFrame extraction accepts only `{ \"templateId\": \"...\" }` or `{ \"mediaId\": \"...\" }`.\n`get_source_frame` accepts `source` and `timestampSeconds` and returns a saved\n`frameId`. It works directly on completed uploaded videos; template import is\nnot required. Repeating the source/timestamp reuses the saved frame. Audio-only\nuploads cannot supply an image frame or visual action analysis.\n\nImage references use explicit kinds, for example\n`{ \"kind\": \"frame\", \"frameId\": \"...\" }` or\n`{ \"kind\": \"upload\", \"mediaId\": \"...\" }`. Use returned IDs rather than inventing\nURLs or translating one kind of ID into another.\n\n## Images and composition\n\n`generate_image` supports text-only creation and multiple references without an\navatar when the selected model supports them. For identity or product-led\ncreation, supply the corresponding IDs and a concise scene instruction.\n\n`clone_image` accepts a template, saved frame, or completed uploaded image as\n`composition`. It requires an avatar and automatically chooses the applicable\nclone default. To copy a specific moment in a video, first obtain its saved\nframe with `get_source_frame`, then use that frame as the composition.\n\n`edit_image` makes a new image from a saved frame or completed uploaded image and\na requested change. The edit default preserves unrequested content. Follow the\nuser's requested review checkpoints; the tools do not require presenting every\nsystem prompt before execution.\n\n## Two ways to recreate a video\n\n### Action described by a prompt\n\nUse `generate_video_from_prompt` when written action controls the result. Supply\nthe complete `prompt` yourself. For a source recreation, read its saved\n`videoUnderstanding` and inspect the requested section, then write a prompt for\nthat result. The saved `generationPrompt` is context, not text the backend\nsilently submits. For older sources without understanding, use `analyze_video`\nto obtain source context. If the user supplies an exact prompt, preserve it.\n\nThe source supplies action text; this does not automatically make its video a\nmotion-control input. The starting image's composition source and the action\nsource can differ. Your prompt must not inherit unrelated source movement.\n\n### Performance guided by reference media\n\nUse `generate_video_from_reference` when motion Video or Audio directly guides\nthe output. A completed generated video can be the `reference` as\n`{ \"videoId\": \"...\" }`; in the additional `references` array use\n`{ \"kind\": \"video\", \"videoId\": \"...\" }`. Supply the starting image and explicit `reference`; it does not need\nto be the image's original source. Existing motion-control modes are\n`one_to_one_standard` and `one_to_one_clone_premium`. Their supported input and\nduration rules come from the catalogue; do not promise identical generated\npixels or unrestricted duration control.\n\nFor direct video cloning, recommend **Wan 3 Smart Motion — Video Guided** by\ndefault: `generate_video_from_reference` with `mode: \"wan_3\"` and\n`guidance: \"video_guided\"`. Check its reference limits and pricing first. Respect\nan explicitly selected model; when Wan 3 cannot support the requested input,\nexplain the constraint and choose a supported crop or alternative with the user.\nFor audio-led performance, use Wan 3 Smart Motion — Audio Guided when appropriate.\n\nUse dashboard model names in conversation: **Kling 2.6 Motion Control** maps to\n`one_to_one_standard`; **Kling 3 Motion Control** maps to\n`one_to_one_clone_premium`. These are compatibility IDs, not user-facing tier names.\nDo not describe these models as “1:1 Standard” or “1:1 Clone Premium”.\n\nFor “clone this video,” select the family that fits the user's requested result.\nPrompt recreation suits adapting the action. Reference guidance suits directly\nfollowing source motion/performance. Ask about this difference only when it\nmaterially changes the intended result and the request does not resolve it.\n\nFor a visible lip-sync performance to an existing sound, prefer supported\nvideo-guided motion when the user wants to keep that performance. Use a clean\nreference range and preserve the matching original audio when the selected\nmode supports it; check the catalogue's actual audio behavior. A transcript is\ncontext, not a replacement for the sound's delivery and timing. Music under\nsilent reactions or B-roll does not establish lip-sync. If overlays obscure the\nperformance, obtain a usable reference or explain the limitation. Do not promise\nexact mouth synchronization. New words or a new voice may need a different path.\n\n## Prompt-directed H3 and reference-guided Wan 3\n\n| Dashboard choice | Tool | Parameters |\n| --------------------------------- | ------------------------------- | ------------------------------------------- |\n| H3 | `generate_video_from_prompt` | `mode: \"minimax_h3\"` |\n| H3 Max | `generate_video_from_prompt` | `mode: \"minimax_h3_max\"` |\n| Wan 3 Smart Motion — Audio Guided | `generate_video_from_reference` | `mode: \"wan_3\"`, `guidance: \"audio_guided\"` |\n| Wan 3 Smart Motion — Video Guided | `generate_video_from_reference` | `mode: \"wan_3\"`, `guidance: \"video_guided\"` |\n\nDo not recommend H3 Smart Motion for new work. Its guided modes remain accepted\ntemporarily for compatibility with existing clients and saved setups. Use H3 or\nH3 Max for prompt-directed action and Wan 3 for new audio/video-guided work.\n\nBoth Smart Motion choices use one starting image plus one guidance source.\nDo not attach extra product images to guided modes; incorporate the product into\nthe starting image first if needed. Ordinary H3 has its own additional-reference\ncapabilities, and H3 Max has its own model settings.\n\n**Audio Guided:** the reference may be Audio or a Video whose audio the backend\nextracts. Video sources receive the appropriate audio-guided action preparation.\nAudio-only sources do not require visual analysis or a custom action prompt.\nThe backend selects supported output duration from the source. Duration-dependent action preparation is refreshed\nonly for legacy templates or direct media that lack a saved canonical generation prompt.\n\n**Video Guided:** supply a Video reference. Wan 3 Video Guided uses the\ninspectable `wan3-video-guided` system prompt by default, but needs no custom\naction prompt: the starting image and source video carry identity and motion.\nDo not analyze or write an action prompt unless the user asks to change the\nsource performance. For H3 Video Guided, new template imports reuse their canonical\nprovider-authored generation prompt; older templates and direct uploads fall\nback to motion-prompt analysis. Reference input duration can affect cost.\nFor either guided choice, `actionPrompt` can explicitly specify the action and\n`adaptation` expresses requested changes.\n\nRead `get_prompt_template` with `wan3-video-guided` to inspect or edit Wan 3's\ndefault system guidance before generation when needed. Passing `systemPrompt`\nreplaces that default exactly; `null` removes it. The submitted system text is\nsaved in `get_generation_prompt`. Other public guided modes do not receive a\ndefault system prompt.\n\n## Analysis and prompt transparency\n\n`analyze_video` has two purposes. `understanding` reads or explicitly starts the\nfree, asynchronous saved section analysis described above. For templates it uses\nthe same canonical record returned by `get_reaction_template`. Generation action preparation is\noptional: choose `standard`, `audio_guided`, or `video_guided`; audio-guided\nanalysis requires `outputDurationSeconds`. The generation tools use the same\npreparation automatically when source-derived action is requested.\n\nKeep these distinct:\n\n- An image's saved generation prompt.\n- A source video's factual understanding, section map, and provider-authored\n generation prompt.\n- A legacy source video's fallback motion-prompt analysis.\n- Any explicit caller-supplied system guidance.\n- The final submitted prompt and reference order.\n\nA frame may link to a source without storing an independent video action prompt.\nUse `get_image` for lineage. Do not substitute today's analysis or defaults when\nclaiming to reproduce a previous generation's actual settings.\n\nThe MCP adapter never invents a system prompt. Wan 3 Video Guided selects its\ninspectable backend default unless the caller overrides or removes it. Submitted\nsystem text is saved and can be inspected using `get_generation_prompt`.\nRetrieve saved nonbilling settings with `get_generation_setup`. Historical\nunavailable fields are not permission to invent missing settings.\n\n## Jobs, retries, and delivery\n\n- Agree on the proposed paid work and its estimated cost or a scoped budget\n before submitting it. Permission to import, inspect, or test is not permission\n to spend on additional analysis or generation. Respect an already approved\n scope and ceiling; ask again before expanding them. A retry is not permission\n to pay for a new output.\n- Supply a stable `idempotencyKey` before each paid request. Retry the identical\n request with that same key after a transport failure. A changed request or a\n deliberately new output needs a new key. If preparation ends with\n `preparation_expired`, the same key preserves that failure. Create a new key\n only for an explicitly requested retry, rather than repeatedly resubmitting.\n- Poll the returned generation ID with `get_generation`. Use the returned\n status and error information; do not resubmit merely because preparation or\n rendering is slow. Generation success is `succeeded`, not the board's\n `complete` label.\n- Use model pricing and `maxCredits` when a budget ceiling matters. Report\n actual credits from returned data, not a guessed amount.\n- Show images with `render_image_results`, videos with `render_video_result`,\n and history with `render_generation_gallery` in MCP Apps hosts. Use the\n supplied IDs, URLs, and generation-specific dashboard links. Apps support\n inspection and choices; the agent decides the creative workflow.\n- Apps buttons may send contextual, open-ended chat requests containing the\n selected asset and its saved context. Treat a Reference or Recreate selection\n as the starting point for the conversation: inspect the supplied context and\n ask only for creative intent that is still missing. Reuse existing answers and\n explicit instructions; do not make the user restate them. Selecting an asset\n does not itself approve paid generation. Follow the user's existing spending\n authorization and review preferences before a paid tool call.\n- Without App rendering, use the returned media and dashboard links. Do not\n claim an asset was generated or visually checked before it is available.\n\nLegacy reaction generation calls remain available during migration. Their\nnotices name the replacement process and the October 15, 2026 retirement date. Use the\nnew intent tools for new work; never repeat a successful paid legacy generation\njust to migrate its call. Slideshow workflows, finished-video editing, and\npublishing are outside this skill's UGC generation scope.\n"
}
}