Update to Enkio
Snapshot Oct 26, 2026 · 06:08 UTC · version 1.0.1
Collection source: downloaded plugin package.
Instructions updated for image-to-video
Skill instructions — Now says: **Membership check (required).** Creating tasks with `i2v_create_task` requires an active membership. If `get_user_profile()` returns an `is_member` value...
Observed in instructions or declared skills. Runtime behavior has not been tested.
Up to 10 plugins free · no card required.
All fields and original values.
Skill instructions
Oct 24, 2026 · 13:32 UTC
No removed lines (ordering may have changed)
Oct 26, 2026 · 06:08 UTC
**Membership check (required).** Creating tasks with `i2v_create_task` requires an active membership. If `get_user_profile()` returns an `is_member` value other than `true`, stop here: call `get_pricing_url` and give the user the returne...
Supporting files
Oct 24, 2026 · 13:32 UTC
[{"relative_path":"references/auth.md","size_in_bytes":4896},{"relative_path":"references/credits.md","size_in_bytes":2847},{"relative_path":"references/errors.md","size_in_bytes":5844},{"relative_path":"references/workflow.md","size_in_...
Oct 26, 2026 · 06:08 UTC
[{"relative_path":"references/auth.md","size_in_bytes":4896},{"relative_path":"references/credits.md","size_in_bytes":3318},{"relative_path":"references/errors.md","size_in_bytes":6761},{"relative_path":"references/workflow.md","size_in_...
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
--- before +++ after @@ -103,6 +103,13 @@ The returned `credit` is the current credit balance. Record it and compare it with the estimated cost during the quote in Step 2. +**Membership check (required).** Creating tasks with `i2v_create_task` requires an active membership. If +`get_user_profile()` returns an `is_member` value other than `true`, stop here: call `get_pricing_url` +and give the user the returned `pricing_url` to open in a browser, signed in with the same Wondershare +account used to authorize this MCP, to purchase a membership. Do not continue with model selection, +uploads, quoting, or task creation; after the user says the purchase is complete, call +`get_user_profile()` again and continue only when `is_member` is `true`. + ## Step 1: Choose a model ```
Full technical diff · 2 changed fields
changed /included_files
[
{
"relative_path": "references/auth.md",
"size_in_bytes": 4896
},
{
"relative_path": "references/credits.md",
"size_in_bytes": 2847
},
{
"relative_path": "references/errors.md",
"size_in_bytes": 5844
},
{
"relative_path": "references/workflow.md",
"size_in_bytes": 5068
}
][
{
"relative_path": "references/auth.md",
"size_in_bytes": 4896
},
{
"relative_path": "references/credits.md",
"size_in_bytes": 3318
},
{
"relative_path": "references/errors.md",
"size_in_bytes": 6761
},
{
"relative_path": "references/workflow.md",
"size_in_bytes": 5068
}
]changed /skill_md_contents
"---\nname: image-to-video\ndescription: Generate an AI video from one image (Enkio / enkiomv.ai). Use this when the user wants to turn a photo into a video, make an image move, create image-to-video, add motion effects to a static image, or asks how many credits image-to-video costs and which models and resolutions are supported. If the user needs a fixed first-frame + end-frame transition effect, use the enkio:first-end-frame-video skill instead; if the user wants to combine multiple reference images into a new scene, use the enkio:reference-to-video skill instead. The entire workflow is completed through the enkio MCP service.\n---\n\n# Image-to-video\n\nUse the `enkio` MCP service to call enkiomv.ai's image-to-video capability and turn\n**one image** + a prompt into a video clip.\n\n## Service binding\n\nAll capabilities in this skill come from the single `enkio` MCP server, **and it cannot be\nreplaced**:\n\n- In Codex, its tool namespace is **`mcp__enkio`**--Codex normalizes `-` in server names to `_`, and\n tool names do not include a prefix. Every tool name mentioned below (such as `get_user_profile`)\n refers to the same-named tool under the `mcp__enkio` namespace.\n- **If the `mcp__enkio` namespace is not visible, the first judgment is \"not logged in\", not \"plugin\n not installed\"**: an MCP server that has not completed OAuth will not register its entire namespace.\n In this case, run `codex mcp login enkio` yourself (not the user), extract the plain `https://`\n authorization URL it prints, and give the user only that link to click -- do not lead with the\n `codex://mcp/login?server=enkio` deep link, since it silently does nothing unless the client has\n registered the `codex://` protocol handler. See `references/auth.md` for the full procedure, and\n explain that after login they must open a new conversation for it to take effect.\n- **Never substitute another brand's MCP under any circumstances** (`mcp__selfyz_ai` and\n `mcp__enkio` are two services, two accounts, and two credit pools; cross-use will charge real\n credits to the wrong account). Do not mix in a `task_id` / `job_id`, credit balance, or output URL\n obtained elsewhere.\n- When you need to explain which service this skill is connected to, use the `brand` /\n `brand_website` returned by `get_user_profile` and the value of `mcpServers.enkio.url` in this\n plugin's `.mcp.json`. Do not answer from memory or guesswork; if `brand` is not Enkio, stop\n immediately and report an error.\n\nTasks are **asynchronous**: `i2v_create_task` returns a `task_id` immediately, and you must poll\n`i2v_get_task` yourself.\n\n```\n0 Log in / check balance -> 1 Choose model -> 2 Decide parameters and quote (confirm before charging)\n-> 3 Crop the image locally -> 4 Upload and get URL -> 5 Create task (charges credits)\n-> 6 Poll -> 7 Download, display, and deliver\n```\n\n## Hard constraints\n\n- **Creating a task charges credits. Before submitting, you must explain the cost to the user and\n obtain explicit confirmation**. Query tools are all free.\n- **The image must be cropped to the target aspect ratio before upload**; otherwise the upstream\n service processes it by its own rules, and the composition of the finished video can easily drift.\n The crop specification is provided by `crop` returned from `i2v_get_options`. **The server does\n not accept image binaries; cropping is done locally**.\n- **Do not construct or guess parameters such as `user_id`, `example`, signatures, and so on**. The\n server already handles them, and these parameters do not exist in the tool inputs.\n- The selectable values for `quality` / `duration` / `mode` **must come from `i2v_list_models`**;\n do not invent them. These three parameters jointly determine the billing template; if the\n combination does not exist, the server will reject it directly.\n- Polling cadence: once every 10 seconds, with an upper limit of about 15 minutes. During that time,\n give the user brief progress updates; do not wait silently for a long time.\n- When the task `task_status` is `fail`, do not retry blindly. Tell the user the `task_reason`\n first, then ask what to do. Retrying re-submits the task at the normal price--failed credits\n are refunded automatically, and this billing rule was already disclosed when quoting the\n cost, so no new price confirmation is needed here.\n- **Before displaying a video, you must download it locally first**. Pasting the remote URL directly\n cannot provide a preview; see \"Displaying the output\".\n\n## Displaying the output\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed previews for media\nfiles from these domains**, and users cannot open a bare pasted URL.\n\nUse a per-task isolated working directory (so the user's repository is not polluted):\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-i2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideos cannot be embedded for display. Provide the local absolute path, and include the original\nremote URL as well so the user can save it themselves. If the download fails (non-200 / empty file),\nstate clearly that \"preview download failed\" and provide the remote URL; do not falsely claim that\nit has been displayed.\n\n## Step 0: Confirm service binding, login, and credit balance\n\n**First confirm that the `mcp__enkio` namespace exists.** If it does not exist, do not continue and\ndo not switch to another MCP. Tell the user that `enkio` is not logged in, then run\n`codex mcp login enkio` yourself, extract the plain `https://` authorization URL from its output, and\nhand the user only that link to click (do not lead with the unreliable\n`codex://mcp/login?server=enkio` deep link). See `references/auth.md` for details, and explain that\n**after login they must open a new Codex conversation** for it to take effect (the tool table in the\ncurrent conversation will not hot-refresh).\n\nAfter the namespace is ready, call `get_user_profile()`:\n\n- **Returns 401 / not logged in**: the token is invalid. Run `codex mcp logout enkio` then\n `codex mcp login enkio` yourself, relay the newly printed `https://` login URL to the user the same\n way as above (not the `codex://` deep link), and again they need to open a new conversation. See\n `references/auth.md`.\n- Validate that the returned `brand` must be **Enkio**. If not, it means the wrong service is\n connected; stop immediately and tell the user.\n\nThe returned `credit` is the current credit balance. Record it and compare it with the estimated\ncost during the quote in Step 2.\n\n## Step 1: Choose a model\n\n```\ni2v_list_models()\n-> { count, models: [ { model, model_name, model_desc, qualities, durations_sec,\n modes, ratios, default_ratio, movement_amplitudes,\n prompt_limit_length, prompt_hint, combinations, ... } ] }\n```\n\n`models[].model` is the model identifier; use it in all later calls. List the available models for\nuser selection, together with each model's supported resolutions, durations, and modes. If the user\nhas no preference, choose a cost-effective default combination from `combinations` and explain why.\n\n`combinations` directly gives the credit cost for each \"mode + quality + duration\" combination;\nprioritize it when choosing parameters.\n\n## Step 2: Decide parameters and quote\n\n```\ni2v_get_options(model, quality?, duration?, mode?, ratio?)\n-> { quality, duration_sec, mode, ratio, credit_cost, crop, prompt_limit_length, prompt_hint }\n```\n\nIf parameters are omitted, they fall back to the model defaults. The return value explicitly tells\nyou the final effective values.\n\n**Tell the user the `credit_cost` together with the `credit` balance from Step 0 and wait for\nconfirmation**. If the balance is insufficient, prompt the user to recharge first (see\nreferences/credits.md for the recharge link and steps); do not force a submission.\n\n## Step 3: Crop the image locally\n\nThe `crop` field gives the target aspect ratio and pixel dimensions:\n\n```\ncrop = { ratio, crop_required, target_width, target_height, strategy, hint }\n```\n\nWhen `crop_required` is `false` (the ratio is `free`), skip this step and upload the original image\ndirectly. Otherwise, first center-crop to the target aspect ratio, then scale to\n`target_width x target_height`:\n\n```bash\nW=<target_width>; H=<target_height>\nffmpeg -y -i \"<original image>\" \\\n -vf \"crop='min(iw,ih*$W/$H)':'min(ih,iw*$H/$W)',scale=$W:$H\" \\\n \"$WORKDIR/input.jpg\"\n```\n\nIf ffmpeg is unavailable, use macOS's built-in `sips`:\n\n```bash\ncp \"<original image>\" \"$WORKDIR/input.jpg\"\nsips --cropToHeightWidth \"$H\" \"$W\" \"$WORKDIR/input.jpg\" >/dev/null\nsips --resampleHeightWidth \"$H\" \"$W\" \"$WORKDIR/input.jpg\" >/dev/null\n```\n\nAfter cropping, confirm that the output file exists and that its dimensions are correct\n(`sips -g pixelWidth -g pixelHeight`) before proceeding to the next step.\n\n## Step 4: Upload and get a URL\n\n```\ncreate_upload_url() -> { upload_url, headers }\n```\n\n```bash\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/input.jpg\" -H \"X-Client-Sn: <value from headers>\"\n# -> {\"c\":200,\"m\":\"Success\",\"d\":\"https://.../input.jpg\"}\n```\n\nThe `d` field in the response is the image URL. `c != 200` means failure; report `m` to the user.\nUploaded files are **temporarily stored and cleaned up on a schedule**. Submit the task as soon as\nyou get the URL.\n\n## Step 5: Create the task (charges credits)\n\n```\ni2v_create_task(model, image_urls=[<image URL>], prompt?, ratio?, quality?, duration?,\n mode?, movement_amplitude?)\n-> { task_id, task_status, credit_cost, quality, duration_sec, mode, ratio }\n```\n\n- Pass exactly **one** image in `image_urls` (this skill is the single-image workflow).\n- `ratio` must **match** the ratio used for cropping in Step 3.\n- Parameters must match the set confirmed during the quote in Step 2; otherwise the actual charge\n may not match the quote.\n- `prompt` describes the action and camera movement you want in the scene. Its length must not\n exceed `prompt_limit_length`; the model's returned `prompt_hint` is upstream guidance for prompt\n writing and may be used as a reference.\n\n## Step 6: Poll\n\n```\ni2v_get_task(task_id) -> { task_status, task_reason, video_url, finished }\n```\n\n- `task_status == \"success\"`: `video_url` is the finished video; proceed to Step 7.\n- `task_status == \"fail\"`: relay `task_reason` to the user and ask whether to adjust parameters\n and retry or give up. Retrying re-bills at the normal price (failed credits are refunded\n automatically); this was already disclosed up front, so you do not need to reconfirm the\n price.\n- Other values: queued or generating. Wait 10 seconds, query again, and briefly update the user on\n progress.\n\n## Step 7: Download and deliver\n\nFollowing \"Displaying the output\", download `video_url` to `$WORKDIR/result.mp4`, provide the local\npath + original URL, and remind the user: the remote link points to temporary storage and will be\ncleaned up, and local files under the system temporary directory may also be reclaimed by the\nsystem. They should save the file to their own directory as soon as possible.\n\n## Error handling\n\nLogin, connection, and service-binding issues are covered in `references/auth.md` (**when not logged\nin, the entire MCP namespace will not appear**; do not misdiagnose it as the plugin being missing,\nand never switch to another brand's MCP).\nCommon error codes and handling are covered in `references/errors.md`; credit and billing rules are\ncovered in `references/credits.md`; each tool's returned field structure is covered in\n`references/workflow.md`.\n""---\nname: image-to-video\ndescription: Generate an AI video from one image (Enkio / enkiomv.ai). Use this when the user wants to turn a photo into a video, make an image move, create image-to-video, add motion effects to a static image, or asks how many credits image-to-video costs and which models and resolutions are supported. If the user needs a fixed first-frame + end-frame transition effect, use the enkio:first-end-frame-video skill instead; if the user wants to combine multiple reference images into a new scene, use the enkio:reference-to-video skill instead. The entire workflow is completed through the enkio MCP service.\n---\n\n# Image-to-video\n\nUse the `enkio` MCP service to call enkiomv.ai's image-to-video capability and turn\n**one image** + a prompt into a video clip.\n\n## Service binding\n\nAll capabilities in this skill come from the single `enkio` MCP server, **and it cannot be\nreplaced**:\n\n- In Codex, its tool namespace is **`mcp__enkio`**--Codex normalizes `-` in server names to `_`, and\n tool names do not include a prefix. Every tool name mentioned below (such as `get_user_profile`)\n refers to the same-named tool under the `mcp__enkio` namespace.\n- **If the `mcp__enkio` namespace is not visible, the first judgment is \"not logged in\", not \"plugin\n not installed\"**: an MCP server that has not completed OAuth will not register its entire namespace.\n In this case, run `codex mcp login enkio` yourself (not the user), extract the plain `https://`\n authorization URL it prints, and give the user only that link to click -- do not lead with the\n `codex://mcp/login?server=enkio` deep link, since it silently does nothing unless the client has\n registered the `codex://` protocol handler. See `references/auth.md` for the full procedure, and\n explain that after login they must open a new conversation for it to take effect.\n- **Never substitute another brand's MCP under any circumstances** (`mcp__selfyz_ai` and\n `mcp__enkio` are two services, two accounts, and two credit pools; cross-use will charge real\n credits to the wrong account). Do not mix in a `task_id` / `job_id`, credit balance, or output URL\n obtained elsewhere.\n- When you need to explain which service this skill is connected to, use the `brand` /\n `brand_website` returned by `get_user_profile` and the value of `mcpServers.enkio.url` in this\n plugin's `.mcp.json`. Do not answer from memory or guesswork; if `brand` is not Enkio, stop\n immediately and report an error.\n\nTasks are **asynchronous**: `i2v_create_task` returns a `task_id` immediately, and you must poll\n`i2v_get_task` yourself.\n\n```\n0 Log in / check balance -> 1 Choose model -> 2 Decide parameters and quote (confirm before charging)\n-> 3 Crop the image locally -> 4 Upload and get URL -> 5 Create task (charges credits)\n-> 6 Poll -> 7 Download, display, and deliver\n```\n\n## Hard constraints\n\n- **Creating a task charges credits. Before submitting, you must explain the cost to the user and\n obtain explicit confirmation**. Query tools are all free.\n- **The image must be cropped to the target aspect ratio before upload**; otherwise the upstream\n service processes it by its own rules, and the composition of the finished video can easily drift.\n The crop specification is provided by `crop` returned from `i2v_get_options`. **The server does\n not accept image binaries; cropping is done locally**.\n- **Do not construct or guess parameters such as `user_id`, `example`, signatures, and so on**. The\n server already handles them, and these parameters do not exist in the tool inputs.\n- The selectable values for `quality` / `duration` / `mode` **must come from `i2v_list_models`**;\n do not invent them. These three parameters jointly determine the billing template; if the\n combination does not exist, the server will reject it directly.\n- Polling cadence: once every 10 seconds, with an upper limit of about 15 minutes. During that time,\n give the user brief progress updates; do not wait silently for a long time.\n- When the task `task_status` is `fail`, do not retry blindly. Tell the user the `task_reason`\n first, then ask what to do. Retrying re-submits the task at the normal price--failed credits\n are refunded automatically, and this billing rule was already disclosed when quoting the\n cost, so no new price confirmation is needed here.\n- **Before displaying a video, you must download it locally first**. Pasting the remote URL directly\n cannot provide a preview; see \"Displaying the output\".\n\n## Displaying the output\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed previews for media\nfiles from these domains**, and users cannot open a bare pasted URL.\n\nUse a per-task isolated working directory (so the user's repository is not polluted):\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-i2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideos cannot be embedded for display. Provide the local absolute path, and include the original\nremote URL as well so the user can save it themselves. If the download fails (non-200 / empty file),\nstate clearly that \"preview download failed\" and provide the remote URL; do not falsely claim that\nit has been displayed.\n\n## Step 0: Confirm service binding, login, and credit balance\n\n**First confirm that the `mcp__enkio` namespace exists.** If it does not exist, do not continue and\ndo not switch to another MCP. Tell the user that `enkio` is not logged in, then run\n`codex mcp login enkio` yourself, extract the plain `https://` authorization URL from its output, and\nhand the user only that link to click (do not lead with the unreliable\n`codex://mcp/login?server=enkio` deep link). See `references/auth.md` for details, and explain that\n**after login they must open a new Codex conversation** for it to take effect (the tool table in the\ncurrent conversation will not hot-refresh).\n\nAfter the namespace is ready, call `get_user_profile()`:\n\n- **Returns 401 / not logged in**: the token is invalid. Run `codex mcp logout enkio` then\n `codex mcp login enkio` yourself, relay the newly printed `https://` login URL to the user the same\n way as above (not the `codex://` deep link), and again they need to open a new conversation. See\n `references/auth.md`.\n- Validate that the returned `brand` must be **Enkio**. If not, it means the wrong service is\n connected; stop immediately and tell the user.\n\nThe returned `credit` is the current credit balance. Record it and compare it with the estimated\ncost during the quote in Step 2.\n\n**Membership check (required).** Creating tasks with `i2v_create_task` requires an active membership. If\n`get_user_profile()` returns an `is_member` value other than `true`, stop here: call `get_pricing_url`\nand give the user the returned `pricing_url` to open in a browser, signed in with the same Wondershare\naccount used to authorize this MCP, to purchase a membership. Do not continue with model selection,\nuploads, quoting, or task creation; after the user says the purchase is complete, call\n`get_user_profile()` again and continue only when `is_member` is `true`.\n\n## Step 1: Choose a model\n\n```\ni2v_list_models()\n-> { count, models: [ { model, model_name, model_desc, qualities, durations_sec,\n modes, ratios, default_ratio, movement_amplitudes,\n prompt_limit_length, prompt_hint, combinations, ... } ] }\n```\n\n`models[].model` is the model identifier; use it in all later calls. List the available models for\nuser selection, together with each model's supported resolutions, durations, and modes. If the user\nhas no preference, choose a cost-effective default combination from `combinations` and explain why.\n\n`combinations` directly gives the credit cost for each \"mode + quality + duration\" combination;\nprioritize it when choosing parameters.\n\n## Step 2: Decide parameters and quote\n\n```\ni2v_get_options(model, quality?, duration?, mode?, ratio?)\n-> { quality, duration_sec, mode, ratio, credit_cost, crop, prompt_limit_length, prompt_hint }\n```\n\nIf parameters are omitted, they fall back to the model defaults. The return value explicitly tells\nyou the final effective values.\n\n**Tell the user the `credit_cost` together with the `credit` balance from Step 0 and wait for\nconfirmation**. If the balance is insufficient, prompt the user to recharge first (see\nreferences/credits.md for the recharge link and steps); do not force a submission.\n\n## Step 3: Crop the image locally\n\nThe `crop` field gives the target aspect ratio and pixel dimensions:\n\n```\ncrop = { ratio, crop_required, target_width, target_height, strategy, hint }\n```\n\nWhen `crop_required` is `false` (the ratio is `free`), skip this step and upload the original image\ndirectly. Otherwise, first center-crop to the target aspect ratio, then scale to\n`target_width x target_height`:\n\n```bash\nW=<target_width>; H=<target_height>\nffmpeg -y -i \"<original image>\" \\\n -vf \"crop='min(iw,ih*$W/$H)':'min(ih,iw*$H/$W)',scale=$W:$H\" \\\n \"$WORKDIR/input.jpg\"\n```\n\nIf ffmpeg is unavailable, use macOS's built-in `sips`:\n\n```bash\ncp \"<original image>\" \"$WORKDIR/input.jpg\"\nsips --cropToHeightWidth \"$H\" \"$W\" \"$WORKDIR/input.jpg\" >/dev/null\nsips --resampleHeightWidth \"$H\" \"$W\" \"$WORKDIR/input.jpg\" >/dev/null\n```\n\nAfter cropping, confirm that the output file exists and that its dimensions are correct\n(`sips -g pixelWidth -g pixelHeight`) before proceeding to the next step.\n\n## Step 4: Upload and get a URL\n\n```\ncreate_upload_url() -> { upload_url, headers }\n```\n\n```bash\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/input.jpg\" -H \"X-Client-Sn: <value from headers>\"\n# -> {\"c\":200,\"m\":\"Success\",\"d\":\"https://.../input.jpg\"}\n```\n\nThe `d` field in the response is the image URL. `c != 200` means failure; report `m` to the user.\nUploaded files are **temporarily stored and cleaned up on a schedule**. Submit the task as soon as\nyou get the URL.\n\n## Step 5: Create the task (charges credits)\n\n```\ni2v_create_task(model, image_urls=[<image URL>], prompt?, ratio?, quality?, duration?,\n mode?, movement_amplitude?)\n-> { task_id, task_status, credit_cost, quality, duration_sec, mode, ratio }\n```\n\n- Pass exactly **one** image in `image_urls` (this skill is the single-image workflow).\n- `ratio` must **match** the ratio used for cropping in Step 3.\n- Parameters must match the set confirmed during the quote in Step 2; otherwise the actual charge\n may not match the quote.\n- `prompt` describes the action and camera movement you want in the scene. Its length must not\n exceed `prompt_limit_length`; the model's returned `prompt_hint` is upstream guidance for prompt\n writing and may be used as a reference.\n\n## Step 6: Poll\n\n```\ni2v_get_task(task_id) -> { task_status, task_reason, video_url, finished }\n```\n\n- `task_status == \"success\"`: `video_url` is the finished video; proceed to Step 7.\n- `task_status == \"fail\"`: relay `task_reason` to the user and ask whether to adjust parameters\n and retry or give up. Retrying re-bills at the normal price (failed credits are refunded\n automatically); this was already disclosed up front, so you do not need to reconfirm the\n price.\n- Other values: queued or generating. Wait 10 seconds, query again, and briefly update the user on\n progress.\n\n## Step 7: Download and deliver\n\nFollowing \"Displaying the output\", download `video_url` to `$WORKDIR/result.mp4`, provide the local\npath + original URL, and remind the user: the remote link points to temporary storage and will be\ncleaned up, and local files under the system temporary directory may also be reclaimed by the\nsystem. They should save the file to their own directory as soon as possible.\n\n## Error handling\n\nLogin, connection, and service-binding issues are covered in `references/auth.md` (**when not logged\nin, the entire MCP namespace will not appear**; do not misdiagnose it as the plugin being missing,\nand never switch to another brand's MCP).\nCommon error codes and handling are covered in `references/errors.md`; credit and billing rules are\ncovered in `references/credits.md`; each tool's returned field structure is covered in\n`references/workflow.md`.\n"Full snapshot data
{
"description": "Generate an AI video from one image (Enkio / enkiomv.ai). Use this when the user wants to turn a photo into a video, make an image move, create image-to-video, add motion effects to a static image, or asks how many credits image-to-video costs and which models and resolutions are supported. If the user needs a fixed first-frame + end-frame transition effect, use the enkio:first-end-frame-video skill instead; if the user wants to combine multiple reference images into a new scene, use the enkio:reference-to-video skill instead. The entire workflow is completed through the enkio MCP service.",
"included_files": [
{
"relative_path": "references/auth.md",
"size_in_bytes": 4896
},
{
"relative_path": "references/credits.md",
"size_in_bytes": 3318
},
{
"relative_path": "references/errors.md",
"size_in_bytes": 6761
},
{
"relative_path": "references/workflow.md",
"size_in_bytes": 5068
}
],
"name": "image-to-video",
"skill_md_contents": "---\nname: image-to-video\ndescription: Generate an AI video from one image (Enkio / enkiomv.ai). Use this when the user wants to turn a photo into a video, make an image move, create image-to-video, add motion effects to a static image, or asks how many credits image-to-video costs and which models and resolutions are supported. If the user needs a fixed first-frame + end-frame transition effect, use the enkio:first-end-frame-video skill instead; if the user wants to combine multiple reference images into a new scene, use the enkio:reference-to-video skill instead. The entire workflow is completed through the enkio MCP service.\n---\n\n# Image-to-video\n\nUse the `enkio` MCP service to call enkiomv.ai's image-to-video capability and turn\n**one image** + a prompt into a video clip.\n\n## Service binding\n\nAll capabilities in this skill come from the single `enkio` MCP server, **and it cannot be\nreplaced**:\n\n- In Codex, its tool namespace is **`mcp__enkio`**--Codex normalizes `-` in server names to `_`, and\n tool names do not include a prefix. Every tool name mentioned below (such as `get_user_profile`)\n refers to the same-named tool under the `mcp__enkio` namespace.\n- **If the `mcp__enkio` namespace is not visible, the first judgment is \"not logged in\", not \"plugin\n not installed\"**: an MCP server that has not completed OAuth will not register its entire namespace.\n In this case, run `codex mcp login enkio` yourself (not the user), extract the plain `https://`\n authorization URL it prints, and give the user only that link to click -- do not lead with the\n `codex://mcp/login?server=enkio` deep link, since it silently does nothing unless the client has\n registered the `codex://` protocol handler. See `references/auth.md` for the full procedure, and\n explain that after login they must open a new conversation for it to take effect.\n- **Never substitute another brand's MCP under any circumstances** (`mcp__selfyz_ai` and\n `mcp__enkio` are two services, two accounts, and two credit pools; cross-use will charge real\n credits to the wrong account). Do not mix in a `task_id` / `job_id`, credit balance, or output URL\n obtained elsewhere.\n- When you need to explain which service this skill is connected to, use the `brand` /\n `brand_website` returned by `get_user_profile` and the value of `mcpServers.enkio.url` in this\n plugin's `.mcp.json`. Do not answer from memory or guesswork; if `brand` is not Enkio, stop\n immediately and report an error.\n\nTasks are **asynchronous**: `i2v_create_task` returns a `task_id` immediately, and you must poll\n`i2v_get_task` yourself.\n\n```\n0 Log in / check balance -> 1 Choose model -> 2 Decide parameters and quote (confirm before charging)\n-> 3 Crop the image locally -> 4 Upload and get URL -> 5 Create task (charges credits)\n-> 6 Poll -> 7 Download, display, and deliver\n```\n\n## Hard constraints\n\n- **Creating a task charges credits. Before submitting, you must explain the cost to the user and\n obtain explicit confirmation**. Query tools are all free.\n- **The image must be cropped to the target aspect ratio before upload**; otherwise the upstream\n service processes it by its own rules, and the composition of the finished video can easily drift.\n The crop specification is provided by `crop` returned from `i2v_get_options`. **The server does\n not accept image binaries; cropping is done locally**.\n- **Do not construct or guess parameters such as `user_id`, `example`, signatures, and so on**. The\n server already handles them, and these parameters do not exist in the tool inputs.\n- The selectable values for `quality` / `duration` / `mode` **must come from `i2v_list_models`**;\n do not invent them. These three parameters jointly determine the billing template; if the\n combination does not exist, the server will reject it directly.\n- Polling cadence: once every 10 seconds, with an upper limit of about 15 minutes. During that time,\n give the user brief progress updates; do not wait silently for a long time.\n- When the task `task_status` is `fail`, do not retry blindly. Tell the user the `task_reason`\n first, then ask what to do. Retrying re-submits the task at the normal price--failed credits\n are refunded automatically, and this billing rule was already disclosed when quoting the\n cost, so no new price confirmation is needed here.\n- **Before displaying a video, you must download it locally first**. Pasting the remote URL directly\n cannot provide a preview; see \"Displaying the output\".\n\n## Displaying the output\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed previews for media\nfiles from these domains**, and users cannot open a bare pasted URL.\n\nUse a per-task isolated working directory (so the user's repository is not polluted):\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-i2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideos cannot be embedded for display. Provide the local absolute path, and include the original\nremote URL as well so the user can save it themselves. If the download fails (non-200 / empty file),\nstate clearly that \"preview download failed\" and provide the remote URL; do not falsely claim that\nit has been displayed.\n\n## Step 0: Confirm service binding, login, and credit balance\n\n**First confirm that the `mcp__enkio` namespace exists.** If it does not exist, do not continue and\ndo not switch to another MCP. Tell the user that `enkio` is not logged in, then run\n`codex mcp login enkio` yourself, extract the plain `https://` authorization URL from its output, and\nhand the user only that link to click (do not lead with the unreliable\n`codex://mcp/login?server=enkio` deep link). See `references/auth.md` for details, and explain that\n**after login they must open a new Codex conversation** for it to take effect (the tool table in the\ncurrent conversation will not hot-refresh).\n\nAfter the namespace is ready, call `get_user_profile()`:\n\n- **Returns 401 / not logged in**: the token is invalid. Run `codex mcp logout enkio` then\n `codex mcp login enkio` yourself, relay the newly printed `https://` login URL to the user the same\n way as above (not the `codex://` deep link), and again they need to open a new conversation. See\n `references/auth.md`.\n- Validate that the returned `brand` must be **Enkio**. If not, it means the wrong service is\n connected; stop immediately and tell the user.\n\nThe returned `credit` is the current credit balance. Record it and compare it with the estimated\ncost during the quote in Step 2.\n\n**Membership check (required).** Creating tasks with `i2v_create_task` requires an active membership. If\n`get_user_profile()` returns an `is_member` value other than `true`, stop here: call `get_pricing_url`\nand give the user the returned `pricing_url` to open in a browser, signed in with the same Wondershare\naccount used to authorize this MCP, to purchase a membership. Do not continue with model selection,\nuploads, quoting, or task creation; after the user says the purchase is complete, call\n`get_user_profile()` again and continue only when `is_member` is `true`.\n\n## Step 1: Choose a model\n\n```\ni2v_list_models()\n-> { count, models: [ { model, model_name, model_desc, qualities, durations_sec,\n modes, ratios, default_ratio, movement_amplitudes,\n prompt_limit_length, prompt_hint, combinations, ... } ] }\n```\n\n`models[].model` is the model identifier; use it in all later calls. List the available models for\nuser selection, together with each model's supported resolutions, durations, and modes. If the user\nhas no preference, choose a cost-effective default combination from `combinations` and explain why.\n\n`combinations` directly gives the credit cost for each \"mode + quality + duration\" combination;\nprioritize it when choosing parameters.\n\n## Step 2: Decide parameters and quote\n\n```\ni2v_get_options(model, quality?, duration?, mode?, ratio?)\n-> { quality, duration_sec, mode, ratio, credit_cost, crop, prompt_limit_length, prompt_hint }\n```\n\nIf parameters are omitted, they fall back to the model defaults. The return value explicitly tells\nyou the final effective values.\n\n**Tell the user the `credit_cost` together with the `credit` balance from Step 0 and wait for\nconfirmation**. If the balance is insufficient, prompt the user to recharge first (see\nreferences/credits.md for the recharge link and steps); do not force a submission.\n\n## Step 3: Crop the image locally\n\nThe `crop` field gives the target aspect ratio and pixel dimensions:\n\n```\ncrop = { ratio, crop_required, target_width, target_height, strategy, hint }\n```\n\nWhen `crop_required` is `false` (the ratio is `free`), skip this step and upload the original image\ndirectly. Otherwise, first center-crop to the target aspect ratio, then scale to\n`target_width x target_height`:\n\n```bash\nW=<target_width>; H=<target_height>\nffmpeg -y -i \"<original image>\" \\\n -vf \"crop='min(iw,ih*$W/$H)':'min(ih,iw*$H/$W)',scale=$W:$H\" \\\n \"$WORKDIR/input.jpg\"\n```\n\nIf ffmpeg is unavailable, use macOS's built-in `sips`:\n\n```bash\ncp \"<original image>\" \"$WORKDIR/input.jpg\"\nsips --cropToHeightWidth \"$H\" \"$W\" \"$WORKDIR/input.jpg\" >/dev/null\nsips --resampleHeightWidth \"$H\" \"$W\" \"$WORKDIR/input.jpg\" >/dev/null\n```\n\nAfter cropping, confirm that the output file exists and that its dimensions are correct\n(`sips -g pixelWidth -g pixelHeight`) before proceeding to the next step.\n\n## Step 4: Upload and get a URL\n\n```\ncreate_upload_url() -> { upload_url, headers }\n```\n\n```bash\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/input.jpg\" -H \"X-Client-Sn: <value from headers>\"\n# -> {\"c\":200,\"m\":\"Success\",\"d\":\"https://.../input.jpg\"}\n```\n\nThe `d` field in the response is the image URL. `c != 200` means failure; report `m` to the user.\nUploaded files are **temporarily stored and cleaned up on a schedule**. Submit the task as soon as\nyou get the URL.\n\n## Step 5: Create the task (charges credits)\n\n```\ni2v_create_task(model, image_urls=[<image URL>], prompt?, ratio?, quality?, duration?,\n mode?, movement_amplitude?)\n-> { task_id, task_status, credit_cost, quality, duration_sec, mode, ratio }\n```\n\n- Pass exactly **one** image in `image_urls` (this skill is the single-image workflow).\n- `ratio` must **match** the ratio used for cropping in Step 3.\n- Parameters must match the set confirmed during the quote in Step 2; otherwise the actual charge\n may not match the quote.\n- `prompt` describes the action and camera movement you want in the scene. Its length must not\n exceed `prompt_limit_length`; the model's returned `prompt_hint` is upstream guidance for prompt\n writing and may be used as a reference.\n\n## Step 6: Poll\n\n```\ni2v_get_task(task_id) -> { task_status, task_reason, video_url, finished }\n```\n\n- `task_status == \"success\"`: `video_url` is the finished video; proceed to Step 7.\n- `task_status == \"fail\"`: relay `task_reason` to the user and ask whether to adjust parameters\n and retry or give up. Retrying re-bills at the normal price (failed credits are refunded\n automatically); this was already disclosed up front, so you do not need to reconfirm the\n price.\n- Other values: queued or generating. Wait 10 seconds, query again, and briefly update the user on\n progress.\n\n## Step 7: Download and deliver\n\nFollowing \"Displaying the output\", download `video_url` to `$WORKDIR/result.mp4`, provide the local\npath + original URL, and remind the user: the remote link points to temporary storage and will be\ncleaned up, and local files under the system temporary directory may also be reclaimed by the\nsystem. They should save the file to their own directory as soon as possible.\n\n## Error handling\n\nLogin, connection, and service-binding issues are covered in `references/auth.md` (**when not logged\nin, the entire MCP namespace will not appear**; do not misdiagnose it as the plugin being missing,\nand never switch to another brand's MCP).\nCommon error codes and handling are covered in `references/errors.md`; credit and billing rules are\ncovered in `references/credits.md`; each tool's returned field structure is covered in\n`references/workflow.md`.\n"
}SHA-256 of public snapshot: 33535427b5d8350275e6d7fb394c18f96907eea51b031f7cd450e83e94d4621c