← EnkioCONTENT HISTORY

Update to Enkio

Snapshot Oct 26, 2026 · 06:08 UTC · version 1.0.1

Collection source: downloaded plugin package.

WHAT CHANGED

Instructions updated for first-end-frame-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.

Save Enkio and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

Skill instructions

Before

Oct 24, 2026 · 13:32 UTC

No removed lines (ordering may have changed)

After

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

Before

Oct 24, 2026 · 13:32 UTC

[{"relative_path":"references/auth.md","size_in_bytes":4896},{"relative_path":"references/credits.md","size_in_bytes":2802},{"relative_path":"references/errors.md","size_in_bytes":6974},{"relative_path":"references/workflow.md","size_in_...

After

Oct 26, 2026 · 06:08 UTC

[{"relative_path":"references/auth.md","size_in_bytes":4896},{"relative_path":"references/credits.md","size_in_bytes":3273},{"relative_path":"references/errors.md","size_in_bytes":7889},{"relative_path":"references/workflow.md","size_in_...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -104,6 +104,13 @@
 
 The returned `credit` is the current balance; record it for later.
 
+**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 That Supports First/End Frames
 
 ```
Full technical diff · 2 changed fields

changed /included_files

BEFORE
[
  {
    "relative_path": "references/auth.md",
    "size_in_bytes": 4896
  },
  {
    "relative_path": "references/credits.md",
    "size_in_bytes": 2802
  },
  {
    "relative_path": "references/errors.md",
    "size_in_bytes": 6974
  },
  {
    "relative_path": "references/workflow.md",
    "size_in_bytes": 6147
  }
]
AFTER
[
  {
    "relative_path": "references/auth.md",
    "size_in_bytes": 4896
  },
  {
    "relative_path": "references/credits.md",
    "size_in_bytes": 3273
  },
  {
    "relative_path": "references/errors.md",
    "size_in_bytes": 7889
  },
  {
    "relative_path": "references/workflow.md",
    "size_in_bytes": 6147
  }
]

changed /skill_md_contents

BEFORE
"---\nname: first-end-frame-video\ndescription: Generate transition videos from a fixed first-frame image and end-frame image (Enkio / enkiomv.ai). Use when the user wants a first/end-frame video, specifies a starting image and an ending image, asks to turn one image into another, or wants a transition, transformation, or outfit-change effect between two images. If there is only one image and no need to specify an ending image, use the enkio:image-to-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 whole flow is completed through the enkio MCP service.\n---\n\n# Fixed First/End-Frame Video Generation\n\nCall enkiomv.ai's image-to-video capability through the `enkio` MCP service to generate a video that\nsmoothly transitions from a **first-frame image + end-frame image**. The first frame of the finished\nvideo is exactly the first-frame image you provide, and the last frame is exactly the end-frame image you provide.\n\n## Service Binding\n\nAll capabilities in this skill come from the single `enkio` MCP server and **must not be replaced**:\n\n- Its tool namespace in Codex is **`mcp__enkio`**. Codex normalizes `-` in server names to `_`, and the\n  tool names themselves have no prefix. Every tool name mentioned below (such as `get_user_profile`) refers to\n  the tool of the same name 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- **Under no circumstances may you substitute another brand's MCP** (`mcp__selfyz_ai` and `mcp__enkio` are two\n  different services, two accounts, and two credit pools; cross-use will really charge the wrong account), and do\n  not mix in a `task_id` / `job_id`, credit balance, or artifact URL obtained elsewhere.\n- When you need to explain which service this skill is connected to, use the `brand` / `brand_website` returned by\n  `get_user_profile` and the value of `mcpServers.enkio.url` in this plugin's `.mcp.json`. Do not answer from\n  memory or guesswork; if `brand` is not Enkio, stop immediately and report an error.\n\nTasks are **asynchronous**: `i2v_create_task` returns `task_id` immediately, and you must poll\n`i2v_get_task` yourself.\n\n```\n0 Log in/check balance -> 1 Choose a model that supports first/end frames -> 2 Set parameters and quote (confirm before charging)\n-> 3 Crop both images to the same ratio -> 4 Upload each image to get URLs -> 5 Create the task (charges credits)\n-> 6 Poll -> 7 Download, preview, and deliver\n```\n\n## Hard Constraints (Specific to This Skill)\n\n- **You must choose a model whose `supports_fixed_end_frame` is true**, retrieved with\n  `i2v_list_models(end_frame=true)`. Ordinary image-to-video models will be rejected directly by the server if you pass two images.\n- **You must provide two images**: the `image_urls` order is fixed as `[first-frame URL, end-frame URL]`,\n  **If the order is wrong, the finished video will be reversed**. Before submission, confirm with the user which image\n  is the starting image and which is the ending image.\n- **Both images must be cropped to the same ratio**, and you **must not use the `free` ratio**. Inconsistent\n  first/end-frame sizes can cause a jump in the transition.\n- **The prompt should describe the process of changing from the first frame to the end frame**, not a standalone\n  description of either frame. The `fixed_end_frame_prompt_hint` returned by the model is the upstream guidance for\n  this scenario; prefer it.\n\n## General Hard Constraints\n\n- **Creating a task charges credits. Before submitting, you must explain the cost to the user and obtain explicit confirmation**.\n  All query tools are free.\n- **Images must be cropped before upload**. The crop specification is provided by `crop` from `i2v_get_options`, and\n  **the server does not accept image binaries; cropping is done locally**.\n- **Do not construct or guess parameters such as `user_id`, `example`, or signatures**. The server has already handled them,\n  and they do not exist in the tool inputs.\n- Allowed values for `quality` / `duration` / `mode` **must come from `i2v_list_models`**. Do not invent them.\n- Polling cadence: once every 10 seconds, with an upper limit of about 15 minutes; briefly report progress.\n- When `task_status` is `fail`, do not retry blindly. First tell the user the `task_reason`,\n  then ask whether to retry or give up. Retrying re-submits the task at the normal\n  price--failed credits are refunded automatically, and this billing rule was already disclosed\n  when quoting the cost, so no new price confirmation is needed here.\n- **Before showing the video, you must download it locally first**. A remote URL pasted directly cannot be previewed.\n\n## Showing the Artifact\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed-preview media files from these domains**;\nif you paste the URL directly, the user will not be able to open it.\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-i2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideo cannot be embedded for display. Provide the local absolute path, and also include the original remote URL.\nIf the download fails (non-200 / empty file), clearly state \"preview download failed\" and provide the remote URL.\nDo not falsely claim it 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 call is connected to the wrong service;\n  stop immediately and tell the user.\n\nThe returned `credit` is the current balance; record it for later.\n\n## Step 1: Choose a Model That Supports First/End Frames\n\n```\ni2v_list_models(end_frame=true)\n-> { end_frame_only: true, count, models: [...] }\n```\n\n**You must include `end_frame=true`**. All returned models support fixed first/end frames. If `count` is 0, there are\ncurrently no available models; tell the user truthfully and do not fall back to forcing a single-image model.\n\nList the selectable models for the user together with their supported resolutions, durations, and modes. If the user\nhas no preference, choose a cost-effective default combination from `combinations` and explain why.\n\n## Step 2: Set Parameters and Quote\n\n```\ni2v_get_options(model, quality?, duration?, mode?, ratio?, end_frame=true)\n-> { quality, duration_sec, mode, ratio, credit_cost, image_count, image_role, crop, ... }\n```\n\n**Remember to include `end_frame=true`**. The server will also validate whether the model supports the capability and\nwhether the ratio is legal, and will mark `image_count` as 2 and `image_role` as `[\"First frame\", \"End frame\"]`.\n\nIf the model's default ratio is `free`, the server will report an error requiring a fixed ratio instead. Choose a\nnon-`free` ratio from `ratios`, such as `9:16` for vertical video or `16:9` for horizontal video.\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).\n\n## Step 3: Crop Both Images to the Same Ratio\n\n`crop` provides the target ratio and pixel dimensions. **Run exactly the same crop command for the first frame and the end frame**:\n\n```bash\nW=<target_width>; H=<target_height>\nfor NAME in first end; do\n  ffmpeg -y -i \"<$NAME original image>\" \\\n    -vf \"crop='min(iw,ih*$W/$H)':'min(ih,iw*$H/$W)',scale=$W:$H\" \\\n    \"$WORKDIR/$NAME.jpg\"\ndone\n```\n\nIf ffmpeg is unavailable, use macOS's built-in `sips`:\n\n```bash\nfor NAME in first end; do\n  cp \"<$NAME original image>\" \"$WORKDIR/$NAME.jpg\"\n  sips --cropToHeightWidth \"$H\" \"$W\" \"$WORKDIR/$NAME.jpg\" >/dev/null\n  sips --resampleHeightWidth \"$H\" \"$W\" \"$WORKDIR/$NAME.jpg\" >/dev/null\ndone\n```\n\nAfter cropping, **you must verify that the two images have exactly identical dimensions** before continuing:\n\n```bash\nsips -g pixelWidth -g pixelHeight \"$WORKDIR/first.jpg\" \"$WORKDIR/end.jpg\"\n```\n\n## Step 4: Upload Each Image to Get URLs\n\n```\ncreate_upload_url() -> { upload_url, headers }\n```\n\nUpload the two images separately, and **remember clearly which URL is the first frame and which is the end frame**:\n\n```bash\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/first.jpg\" -H \"X-Client-Sn: <value from headers>\"\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/end.jpg\"   -H \"X-Client-Sn: <value from headers>\"\n# Each returns {\"c\":200,\"m\":\"Success\",\"d\":\"https://.../xxx.jpg\"}\n```\n\nThe `d` in the response is the image URL. If `c != 200`, it failed; report `m` to the user.\nUploaded files are **temporary storage and will be cleaned up periodically**. Submit the task as soon as possible after obtaining the URLs.\n\n## Step 5: Create the Task (Charges Credits)\n\n```\ni2v_create_task(model, image_urls=[<first-frame URL>, <end-frame URL>], prompt?, ratio?,\n                quality?, duration?, mode?, movement_amplitude?)\n-> { task_id, task_status, end_frame, credit_cost, ... }\n```\n\n- **`image_urls` must contain two elements, with the first being the first frame and the second being the end frame**.\n  The order must not be reversed.\n- `ratio` must match the ratio used for cropping in Step 3.\n- Parameters must match the combination confirmed during the Step 2 quote; otherwise the actual charge may not match the quote.\n- `prompt` describes **how the first frame changes into the end frame** (motion, camera movement, transition method),\n  referencing `fixed_end_frame_prompt_hint`.\n- The returned `end_frame` should be `true`; if it is `false`, only one image was passed, so stop and check.\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 retry after\n  adjustments or abandon the task. Retrying re-bills at the normal price (failed credits are\n  refunded automatically); this was already disclosed up front, so you do not need to reconfirm\n  the price.\n- Other values: queued or generating. Wait 10 seconds, query again, and briefly tell the user the progress.\n\n## Step 7: Download and Deliver\n\nFollow \"Showing the Artifact\" to download `video_url` to `$WORKDIR/result.mp4`, then provide the local path + original URL.\nWhen delivering, remind the user to check whether the first and end frames match expectations, and explain that both\nthe remote link and the local temporary file may be cleaned up, so they should save another copy promptly.\n\n## Error Handling\n\nFor login, connection, and service binding issues, see `references/auth.md` (**when not logged in, the entire MCP namespace\nwill not appear**; do not misjudge this as the plugin not being installed, and especially do not switch to another brand's MCP).\nCommon error codes and handling are in `references/errors.md`; credit and billing rules are in `references/credits.md`;\nreturn field structures for each tool are in `references/workflow.md`.\n"
AFTER
"---\nname: first-end-frame-video\ndescription: Generate transition videos from a fixed first-frame image and end-frame image (Enkio / enkiomv.ai). Use when the user wants a first/end-frame video, specifies a starting image and an ending image, asks to turn one image into another, or wants a transition, transformation, or outfit-change effect between two images. If there is only one image and no need to specify an ending image, use the enkio:image-to-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 whole flow is completed through the enkio MCP service.\n---\n\n# Fixed First/End-Frame Video Generation\n\nCall enkiomv.ai's image-to-video capability through the `enkio` MCP service to generate a video that\nsmoothly transitions from a **first-frame image + end-frame image**. The first frame of the finished\nvideo is exactly the first-frame image you provide, and the last frame is exactly the end-frame image you provide.\n\n## Service Binding\n\nAll capabilities in this skill come from the single `enkio` MCP server and **must not be replaced**:\n\n- Its tool namespace in Codex is **`mcp__enkio`**. Codex normalizes `-` in server names to `_`, and the\n  tool names themselves have no prefix. Every tool name mentioned below (such as `get_user_profile`) refers to\n  the tool of the same name 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- **Under no circumstances may you substitute another brand's MCP** (`mcp__selfyz_ai` and `mcp__enkio` are two\n  different services, two accounts, and two credit pools; cross-use will really charge the wrong account), and do\n  not mix in a `task_id` / `job_id`, credit balance, or artifact URL obtained elsewhere.\n- When you need to explain which service this skill is connected to, use the `brand` / `brand_website` returned by\n  `get_user_profile` and the value of `mcpServers.enkio.url` in this plugin's `.mcp.json`. Do not answer from\n  memory or guesswork; if `brand` is not Enkio, stop immediately and report an error.\n\nTasks are **asynchronous**: `i2v_create_task` returns `task_id` immediately, and you must poll\n`i2v_get_task` yourself.\n\n```\n0 Log in/check balance -> 1 Choose a model that supports first/end frames -> 2 Set parameters and quote (confirm before charging)\n-> 3 Crop both images to the same ratio -> 4 Upload each image to get URLs -> 5 Create the task (charges credits)\n-> 6 Poll -> 7 Download, preview, and deliver\n```\n\n## Hard Constraints (Specific to This Skill)\n\n- **You must choose a model whose `supports_fixed_end_frame` is true**, retrieved with\n  `i2v_list_models(end_frame=true)`. Ordinary image-to-video models will be rejected directly by the server if you pass two images.\n- **You must provide two images**: the `image_urls` order is fixed as `[first-frame URL, end-frame URL]`,\n  **If the order is wrong, the finished video will be reversed**. Before submission, confirm with the user which image\n  is the starting image and which is the ending image.\n- **Both images must be cropped to the same ratio**, and you **must not use the `free` ratio**. Inconsistent\n  first/end-frame sizes can cause a jump in the transition.\n- **The prompt should describe the process of changing from the first frame to the end frame**, not a standalone\n  description of either frame. The `fixed_end_frame_prompt_hint` returned by the model is the upstream guidance for\n  this scenario; prefer it.\n\n## General Hard Constraints\n\n- **Creating a task charges credits. Before submitting, you must explain the cost to the user and obtain explicit confirmation**.\n  All query tools are free.\n- **Images must be cropped before upload**. The crop specification is provided by `crop` from `i2v_get_options`, and\n  **the server does not accept image binaries; cropping is done locally**.\n- **Do not construct or guess parameters such as `user_id`, `example`, or signatures**. The server has already handled them,\n  and they do not exist in the tool inputs.\n- Allowed values for `quality` / `duration` / `mode` **must come from `i2v_list_models`**. Do not invent them.\n- Polling cadence: once every 10 seconds, with an upper limit of about 15 minutes; briefly report progress.\n- When `task_status` is `fail`, do not retry blindly. First tell the user the `task_reason`,\n  then ask whether to retry or give up. Retrying re-submits the task at the normal\n  price--failed credits are refunded automatically, and this billing rule was already disclosed\n  when quoting the cost, so no new price confirmation is needed here.\n- **Before showing the video, you must download it locally first**. A remote URL pasted directly cannot be previewed.\n\n## Showing the Artifact\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed-preview media files from these domains**;\nif you paste the URL directly, the user will not be able to open it.\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-i2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideo cannot be embedded for display. Provide the local absolute path, and also include the original remote URL.\nIf the download fails (non-200 / empty file), clearly state \"preview download failed\" and provide the remote URL.\nDo not falsely claim it 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 call is connected to the wrong service;\n  stop immediately and tell the user.\n\nThe returned `credit` is the current balance; record it for later.\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 That Supports First/End Frames\n\n```\ni2v_list_models(end_frame=true)\n-> { end_frame_only: true, count, models: [...] }\n```\n\n**You must include `end_frame=true`**. All returned models support fixed first/end frames. If `count` is 0, there are\ncurrently no available models; tell the user truthfully and do not fall back to forcing a single-image model.\n\nList the selectable models for the user together with their supported resolutions, durations, and modes. If the user\nhas no preference, choose a cost-effective default combination from `combinations` and explain why.\n\n## Step 2: Set Parameters and Quote\n\n```\ni2v_get_options(model, quality?, duration?, mode?, ratio?, end_frame=true)\n-> { quality, duration_sec, mode, ratio, credit_cost, image_count, image_role, crop, ... }\n```\n\n**Remember to include `end_frame=true`**. The server will also validate whether the model supports the capability and\nwhether the ratio is legal, and will mark `image_count` as 2 and `image_role` as `[\"First frame\", \"End frame\"]`.\n\nIf the model's default ratio is `free`, the server will report an error requiring a fixed ratio instead. Choose a\nnon-`free` ratio from `ratios`, such as `9:16` for vertical video or `16:9` for horizontal video.\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).\n\n## Step 3: Crop Both Images to the Same Ratio\n\n`crop` provides the target ratio and pixel dimensions. **Run exactly the same crop command for the first frame and the end frame**:\n\n```bash\nW=<target_width>; H=<target_height>\nfor NAME in first end; do\n  ffmpeg -y -i \"<$NAME original image>\" \\\n    -vf \"crop='min(iw,ih*$W/$H)':'min(ih,iw*$H/$W)',scale=$W:$H\" \\\n    \"$WORKDIR/$NAME.jpg\"\ndone\n```\n\nIf ffmpeg is unavailable, use macOS's built-in `sips`:\n\n```bash\nfor NAME in first end; do\n  cp \"<$NAME original image>\" \"$WORKDIR/$NAME.jpg\"\n  sips --cropToHeightWidth \"$H\" \"$W\" \"$WORKDIR/$NAME.jpg\" >/dev/null\n  sips --resampleHeightWidth \"$H\" \"$W\" \"$WORKDIR/$NAME.jpg\" >/dev/null\ndone\n```\n\nAfter cropping, **you must verify that the two images have exactly identical dimensions** before continuing:\n\n```bash\nsips -g pixelWidth -g pixelHeight \"$WORKDIR/first.jpg\" \"$WORKDIR/end.jpg\"\n```\n\n## Step 4: Upload Each Image to Get URLs\n\n```\ncreate_upload_url() -> { upload_url, headers }\n```\n\nUpload the two images separately, and **remember clearly which URL is the first frame and which is the end frame**:\n\n```bash\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/first.jpg\" -H \"X-Client-Sn: <value from headers>\"\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/end.jpg\"   -H \"X-Client-Sn: <value from headers>\"\n# Each returns {\"c\":200,\"m\":\"Success\",\"d\":\"https://.../xxx.jpg\"}\n```\n\nThe `d` in the response is the image URL. If `c != 200`, it failed; report `m` to the user.\nUploaded files are **temporary storage and will be cleaned up periodically**. Submit the task as soon as possible after obtaining the URLs.\n\n## Step 5: Create the Task (Charges Credits)\n\n```\ni2v_create_task(model, image_urls=[<first-frame URL>, <end-frame URL>], prompt?, ratio?,\n                quality?, duration?, mode?, movement_amplitude?)\n-> { task_id, task_status, end_frame, credit_cost, ... }\n```\n\n- **`image_urls` must contain two elements, with the first being the first frame and the second being the end frame**.\n  The order must not be reversed.\n- `ratio` must match the ratio used for cropping in Step 3.\n- Parameters must match the combination confirmed during the Step 2 quote; otherwise the actual charge may not match the quote.\n- `prompt` describes **how the first frame changes into the end frame** (motion, camera movement, transition method),\n  referencing `fixed_end_frame_prompt_hint`.\n- The returned `end_frame` should be `true`; if it is `false`, only one image was passed, so stop and check.\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 retry after\n  adjustments or abandon the task. Retrying re-bills at the normal price (failed credits are\n  refunded automatically); this was already disclosed up front, so you do not need to reconfirm\n  the price.\n- Other values: queued or generating. Wait 10 seconds, query again, and briefly tell the user the progress.\n\n## Step 7: Download and Deliver\n\nFollow \"Showing the Artifact\" to download `video_url` to `$WORKDIR/result.mp4`, then provide the local path + original URL.\nWhen delivering, remind the user to check whether the first and end frames match expectations, and explain that both\nthe remote link and the local temporary file may be cleaned up, so they should save another copy promptly.\n\n## Error Handling\n\nFor login, connection, and service binding issues, see `references/auth.md` (**when not logged in, the entire MCP namespace\nwill not appear**; do not misjudge this as the plugin not being installed, and especially do not switch to another brand's MCP).\nCommon error codes and handling are in `references/errors.md`; credit and billing rules are in `references/credits.md`;\nreturn field structures for each tool are in `references/workflow.md`.\n"
Full snapshot data
{
  "description": "Generate transition videos from a fixed first-frame image and end-frame image (Enkio / enkiomv.ai). Use when the user wants a first/end-frame video, specifies a starting image and an ending image, asks to turn one image into another, or wants a transition, transformation, or outfit-change effect between two images. If there is only one image and no need to specify an ending image, use the enkio:image-to-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 whole flow 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": 3273
    },
    {
      "relative_path": "references/errors.md",
      "size_in_bytes": 7889
    },
    {
      "relative_path": "references/workflow.md",
      "size_in_bytes": 6147
    }
  ],
  "name": "first-end-frame-video",
  "skill_md_contents": "---\nname: first-end-frame-video\ndescription: Generate transition videos from a fixed first-frame image and end-frame image (Enkio / enkiomv.ai). Use when the user wants a first/end-frame video, specifies a starting image and an ending image, asks to turn one image into another, or wants a transition, transformation, or outfit-change effect between two images. If there is only one image and no need to specify an ending image, use the enkio:image-to-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 whole flow is completed through the enkio MCP service.\n---\n\n# Fixed First/End-Frame Video Generation\n\nCall enkiomv.ai's image-to-video capability through the `enkio` MCP service to generate a video that\nsmoothly transitions from a **first-frame image + end-frame image**. The first frame of the finished\nvideo is exactly the first-frame image you provide, and the last frame is exactly the end-frame image you provide.\n\n## Service Binding\n\nAll capabilities in this skill come from the single `enkio` MCP server and **must not be replaced**:\n\n- Its tool namespace in Codex is **`mcp__enkio`**. Codex normalizes `-` in server names to `_`, and the\n  tool names themselves have no prefix. Every tool name mentioned below (such as `get_user_profile`) refers to\n  the tool of the same name 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- **Under no circumstances may you substitute another brand's MCP** (`mcp__selfyz_ai` and `mcp__enkio` are two\n  different services, two accounts, and two credit pools; cross-use will really charge the wrong account), and do\n  not mix in a `task_id` / `job_id`, credit balance, or artifact URL obtained elsewhere.\n- When you need to explain which service this skill is connected to, use the `brand` / `brand_website` returned by\n  `get_user_profile` and the value of `mcpServers.enkio.url` in this plugin's `.mcp.json`. Do not answer from\n  memory or guesswork; if `brand` is not Enkio, stop immediately and report an error.\n\nTasks are **asynchronous**: `i2v_create_task` returns `task_id` immediately, and you must poll\n`i2v_get_task` yourself.\n\n```\n0 Log in/check balance -> 1 Choose a model that supports first/end frames -> 2 Set parameters and quote (confirm before charging)\n-> 3 Crop both images to the same ratio -> 4 Upload each image to get URLs -> 5 Create the task (charges credits)\n-> 6 Poll -> 7 Download, preview, and deliver\n```\n\n## Hard Constraints (Specific to This Skill)\n\n- **You must choose a model whose `supports_fixed_end_frame` is true**, retrieved with\n  `i2v_list_models(end_frame=true)`. Ordinary image-to-video models will be rejected directly by the server if you pass two images.\n- **You must provide two images**: the `image_urls` order is fixed as `[first-frame URL, end-frame URL]`,\n  **If the order is wrong, the finished video will be reversed**. Before submission, confirm with the user which image\n  is the starting image and which is the ending image.\n- **Both images must be cropped to the same ratio**, and you **must not use the `free` ratio**. Inconsistent\n  first/end-frame sizes can cause a jump in the transition.\n- **The prompt should describe the process of changing from the first frame to the end frame**, not a standalone\n  description of either frame. The `fixed_end_frame_prompt_hint` returned by the model is the upstream guidance for\n  this scenario; prefer it.\n\n## General Hard Constraints\n\n- **Creating a task charges credits. Before submitting, you must explain the cost to the user and obtain explicit confirmation**.\n  All query tools are free.\n- **Images must be cropped before upload**. The crop specification is provided by `crop` from `i2v_get_options`, and\n  **the server does not accept image binaries; cropping is done locally**.\n- **Do not construct or guess parameters such as `user_id`, `example`, or signatures**. The server has already handled them,\n  and they do not exist in the tool inputs.\n- Allowed values for `quality` / `duration` / `mode` **must come from `i2v_list_models`**. Do not invent them.\n- Polling cadence: once every 10 seconds, with an upper limit of about 15 minutes; briefly report progress.\n- When `task_status` is `fail`, do not retry blindly. First tell the user the `task_reason`,\n  then ask whether to retry or give up. Retrying re-submits the task at the normal\n  price--failed credits are refunded automatically, and this billing rule was already disclosed\n  when quoting the cost, so no new price confirmation is needed here.\n- **Before showing the video, you must download it locally first**. A remote URL pasted directly cannot be previewed.\n\n## Showing the Artifact\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed-preview media files from these domains**;\nif you paste the URL directly, the user will not be able to open it.\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-i2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideo cannot be embedded for display. Provide the local absolute path, and also include the original remote URL.\nIf the download fails (non-200 / empty file), clearly state \"preview download failed\" and provide the remote URL.\nDo not falsely claim it 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 call is connected to the wrong service;\n  stop immediately and tell the user.\n\nThe returned `credit` is the current balance; record it for later.\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 That Supports First/End Frames\n\n```\ni2v_list_models(end_frame=true)\n-> { end_frame_only: true, count, models: [...] }\n```\n\n**You must include `end_frame=true`**. All returned models support fixed first/end frames. If `count` is 0, there are\ncurrently no available models; tell the user truthfully and do not fall back to forcing a single-image model.\n\nList the selectable models for the user together with their supported resolutions, durations, and modes. If the user\nhas no preference, choose a cost-effective default combination from `combinations` and explain why.\n\n## Step 2: Set Parameters and Quote\n\n```\ni2v_get_options(model, quality?, duration?, mode?, ratio?, end_frame=true)\n-> { quality, duration_sec, mode, ratio, credit_cost, image_count, image_role, crop, ... }\n```\n\n**Remember to include `end_frame=true`**. The server will also validate whether the model supports the capability and\nwhether the ratio is legal, and will mark `image_count` as 2 and `image_role` as `[\"First frame\", \"End frame\"]`.\n\nIf the model's default ratio is `free`, the server will report an error requiring a fixed ratio instead. Choose a\nnon-`free` ratio from `ratios`, such as `9:16` for vertical video or `16:9` for horizontal video.\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).\n\n## Step 3: Crop Both Images to the Same Ratio\n\n`crop` provides the target ratio and pixel dimensions. **Run exactly the same crop command for the first frame and the end frame**:\n\n```bash\nW=<target_width>; H=<target_height>\nfor NAME in first end; do\n  ffmpeg -y -i \"<$NAME original image>\" \\\n    -vf \"crop='min(iw,ih*$W/$H)':'min(ih,iw*$H/$W)',scale=$W:$H\" \\\n    \"$WORKDIR/$NAME.jpg\"\ndone\n```\n\nIf ffmpeg is unavailable, use macOS's built-in `sips`:\n\n```bash\nfor NAME in first end; do\n  cp \"<$NAME original image>\" \"$WORKDIR/$NAME.jpg\"\n  sips --cropToHeightWidth \"$H\" \"$W\" \"$WORKDIR/$NAME.jpg\" >/dev/null\n  sips --resampleHeightWidth \"$H\" \"$W\" \"$WORKDIR/$NAME.jpg\" >/dev/null\ndone\n```\n\nAfter cropping, **you must verify that the two images have exactly identical dimensions** before continuing:\n\n```bash\nsips -g pixelWidth -g pixelHeight \"$WORKDIR/first.jpg\" \"$WORKDIR/end.jpg\"\n```\n\n## Step 4: Upload Each Image to Get URLs\n\n```\ncreate_upload_url() -> { upload_url, headers }\n```\n\nUpload the two images separately, and **remember clearly which URL is the first frame and which is the end frame**:\n\n```bash\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/first.jpg\" -H \"X-Client-Sn: <value from headers>\"\ncurl -sS -X POST \"<upload_url>\" -F \"file=@$WORKDIR/end.jpg\"   -H \"X-Client-Sn: <value from headers>\"\n# Each returns {\"c\":200,\"m\":\"Success\",\"d\":\"https://.../xxx.jpg\"}\n```\n\nThe `d` in the response is the image URL. If `c != 200`, it failed; report `m` to the user.\nUploaded files are **temporary storage and will be cleaned up periodically**. Submit the task as soon as possible after obtaining the URLs.\n\n## Step 5: Create the Task (Charges Credits)\n\n```\ni2v_create_task(model, image_urls=[<first-frame URL>, <end-frame URL>], prompt?, ratio?,\n                quality?, duration?, mode?, movement_amplitude?)\n-> { task_id, task_status, end_frame, credit_cost, ... }\n```\n\n- **`image_urls` must contain two elements, with the first being the first frame and the second being the end frame**.\n  The order must not be reversed.\n- `ratio` must match the ratio used for cropping in Step 3.\n- Parameters must match the combination confirmed during the Step 2 quote; otherwise the actual charge may not match the quote.\n- `prompt` describes **how the first frame changes into the end frame** (motion, camera movement, transition method),\n  referencing `fixed_end_frame_prompt_hint`.\n- The returned `end_frame` should be `true`; if it is `false`, only one image was passed, so stop and check.\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 retry after\n  adjustments or abandon the task. Retrying re-bills at the normal price (failed credits are\n  refunded automatically); this was already disclosed up front, so you do not need to reconfirm\n  the price.\n- Other values: queued or generating. Wait 10 seconds, query again, and briefly tell the user the progress.\n\n## Step 7: Download and Deliver\n\nFollow \"Showing the Artifact\" to download `video_url` to `$WORKDIR/result.mp4`, then provide the local path + original URL.\nWhen delivering, remind the user to check whether the first and end frames match expectations, and explain that both\nthe remote link and the local temporary file may be cleaned up, so they should save another copy promptly.\n\n## Error Handling\n\nFor login, connection, and service binding issues, see `references/auth.md` (**when not logged in, the entire MCP namespace\nwill not appear**; do not misjudge this as the plugin not being installed, and especially do not switch to another brand's MCP).\nCommon error codes and handling are in `references/errors.md`; credit and billing rules are in `references/credits.md`;\nreturn field structures for each tool are in `references/workflow.md`.\n"
}

SHA-256 of public snapshot: c9c7d4ed4f2f1d0f3ce6236604a790cf2681f26c9f3834adcec1006e631f38b7