← 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 text-to-video

Skill instructions — Now says: **Membership check (required).** Creating tasks with `t2v_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 `t2v_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":3810},{"relative_path":"references/errors.md","size_in_bytes":7107},{"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":4281},{"relative_path":"references/errors.md","size_in_bytes":8026},{"relative_path":"references/workflow.md","size_in_...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -139,6 +139,13 @@
 Record the returned `credit` as the current credit balance, and compare it with the estimated cost
 when quoting in Step 2.
 
+**Membership check (required).** Creating tasks with `t2v_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

BEFORE
[
  {
    "relative_path": "references/auth.md",
    "size_in_bytes": 4896
  },
  {
    "relative_path": "references/credits.md",
    "size_in_bytes": 3810
  },
  {
    "relative_path": "references/errors.md",
    "size_in_bytes": 7107
  },
  {
    "relative_path": "references/workflow.md",
    "size_in_bytes": 6162
  }
]
AFTER
[
  {
    "relative_path": "references/auth.md",
    "size_in_bytes": 4896
  },
  {
    "relative_path": "references/credits.md",
    "size_in_bytes": 4281
  },
  {
    "relative_path": "references/errors.md",
    "size_in_bytes": 8026
  },
  {
    "relative_path": "references/workflow.md",
    "size_in_bytes": 6162
  }
]

changed /skill_md_contents

BEFORE
"---\nname: text-to-video\ndescription: Generate an AI video directly from a text prompt (Enkio / enkiomv.ai). Use this when the user has no source image and wants a video based only on a written description, says text-to-video / text generated video / text to video / AI generate a video clip, or asks which text-to-video models are supported, how many credits it costs, or how long the output can be. If there is an input image and the user wants to animate it, use the enkio:image-to-video skill instead; if multiple reference images should be combined, use the enkio:reference-to-video skill instead; if the transition must be fixed by a first frame + last frame, use the enkio:first-end-frame-video skill instead. The whole workflow is completed through the enkio MCP service.\n---\n\n# Text-to-video\n\nCall enkiomv.ai's text-to-video capability through the `enkio` MCP service: **no input image is\nrequired**. Provide only a prompt plus parameters such as quality, duration, and aspect ratio, and\nthe model directly generates a brand-new video.\n\n## Service binding\n\nAll capabilities in this skill come from the single `enkio` MCP server, which **must not be\nreplaced**:\n\n- Its tool namespace in Codex is **`mcp__enkio`**--Codex normalizes `-` in server names to `_`, and\n  tool names have no prefix. Every tool name below (such as `get_user_profile`) refers to the tool of\n  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- **Never substitute another brand's MCP under any circumstances** (`mcp__selfyz_ai` and\n  `mcp__enkio` are two separate services, accounts, and credit pools; cross-use will charge the\n  wrong account for real). Also do not mix in a `task_id` / `job_id`, credit balance, or artifact URL\n  obtained elsewhere.\n- When you need to explain which service this skill is connected to, rely on 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\nThe essential difference from the other three video skills: those three all start from images;\nthis skill **has no asset upload and no cropping step**. The prompt is the only content input.\n\nTasks are **asynchronous**: `t2v_create_task` immediately returns a `task_id`, and you must poll\n`t2v_get_task` yourself.\n\n```\n0 Log in / check balance -> 1 Choose model -> 2 Set parameters and quote (confirm before charging)\n-> 3 Create task (charges credits) -> 4 Poll -> 5 Download, preview, and deliver\n```\n\n## Hard constraints\n\n- **This skill uses its own independent `t2v_*` tools. Do not mix them with `i2v_*` tools**. The\n  text-to-video model list comes from a different upstream field. Passing an image-to-video model\n  name into `t2v_*` reports \"nonexistent text-to-video model\", and vice versa.\n- **Creating a task charges credits. Before submitting, you must tell the user the cost and obtain\n  explicit confirmation**. All query tools are free.\n- **`prompt` is required** and is the only content input for this mode. Empty or whitespace-only\n  prompts are rejected directly. Prompt quality almost determines output quality, so it must be\n  specific. See \"How to write prompts\" below.\n- **`ratio` must be a concrete aspect ratio (such as `16:9` / `9:16` / `1:1`), not `free`**.\n  There is no input image from which the canvas can be inferred, so the server cannot decide for\n  you. If omitted, it falls back to the model's default ratio, but **you should proactively confirm\n  landscape vs. portrait with the user**.\n- **Do not call `create_upload_url`, and do not perform any cropping**. Text-to-video does not\n  accept assets. Even if the user provides images, they are not usable for this mode--that request\n  should use `enkio:image-to-video` or `enkio:reference-to-video` instead.\n- **Do not construct or guess `user_id`, `example`, signatures, or similar parameters**. The server\n  already handles them, and they do not exist in the tool inputs.\n- Allowed values for `quality` / `duration` / `mode` **must come from `t2v_list_models`**, and the\n  four dimensions must form a combination that appears in `combinations`.\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- If a task's `task_status` is `fail`, do not retry blindly. First tell the user the\n  `task_reason`, then ask what to do. Retrying re-submits the task at the normal price--failed\n  credits are refunded automatically, and this billing rule was already disclosed when quoting\n  the cost, so no new price confirmation is needed here.\n- **Before showing a video, you must download it locally first**. Pasting the remote URL directly\n  cannot be previewed. See \"Showing artifacts\".\n\n## How to write prompts\n\nText-to-video has **no visual reference at all**; the model can understand the scene only from the\ntext. If the prompt lacks information, the result will be very random. Therefore the prompt should\ncover **subject + action + scene + camera + lighting/style**.\n\n```\n✅ An orange cat sits beside a neon street on a rainy night and yawns; the wet ground reflects the\n   sign lights, the camera slowly pushes in from the side, cool tones, cinematic feel\n✅ An aerial view sweeps over an autumn valley; golden forests ripple in the wind, morning fog has\n   not yet dispersed, and the camera keeps tracking forward\n❌ A cat                              <- Only the subject; action, scene, and camera are all left for the model to guess\n❌ Generate a beautiful video          <- No executable information at all\n```\n\nIf the user's description is too brief, **help fill it out first and then confirm**. Do not submit\nwith a single vague sentence--one submission is one charge. You may proactively ask: what is the\nsubject, what is it doing, what is the scene, what camera movement and mood are desired?\n\nThe prompt length must not exceed `prompt_limit_length`. The model's `prompt_hint` is the upstream\nprompt-writing hint, and `prompt_guide_url` is the upstream prompt guide page. You may summarize\nthese for the user, but do not open the page on the user's behalf.\n\nThe aspect ratio should match the content: portrait (`9:16`) fits character close-ups and short-form\nvideos; landscape (`16:9`) fits scenery and cinematic shots.\n\n## Showing artifacts\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed-preview media files\nfrom these domains**; if you paste the URL directly, the user cannot open it.\n\nUse a task-isolated working directory (so the user's repository is not polluted):\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-t2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideos cannot be embedded for preview. Give the absolute local path and also include the original\nremote URL so the user can save it themselves. If the download fails (non-200 / empty file), clearly\nstate \"preview download failed\" and provide the remote URL; do not falsely claim that it was shown.\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- Verify that the returned `brand` must be **Enkio**. If it is not, the call is connected to the\n  wrong service; stop immediately and tell the user.\n\nRecord the returned `credit` as the current credit balance, and compare it with the estimated cost\nwhen quoting in Step 2.\n\n## Step 1: Choose a model\n\n```\nt2v_list_models()\n-> { count, models: [ { model, model_name, model_desc, qualities, durations_sec,\n                       modes, ratios, default_ratio, movement_amplitudes, supports_audio,\n                       prompt_limit_length, prompt_hint, prompt_guide_url,\n                       combinations, ... } ] }\n```\n\n`models[].model` is the model identifier; all later calls use it. Briefly list the available models\nfor the user together with each model's supported resolutions, durations, modes, and aspect ratios,\nand let the user choose. If the user has no preference, choose a cost-effective default combination\nfrom `combinations` and explain why.\n\n`combinations` directly provides the credit cost for each \"mode + quality + duration\" combination;\nprioritize it when choosing parameters.\n\nIt is normal that the response **does not contain any image-related fields** (image count, crop,\nfirst/last frame).\n\n## Step 2: Set parameters and quote\n\n```\nt2v_get_options(model, quality?, duration?, mode?, audio?, ratio?)\n-> { model, model_name, quality, duration_sec, mode, audio, ratio, credit_cost,\n    prompt_required, prompt_limit_length, prompt_hint, prompt_guide_url, next_step }\n```\n\nOmitted parameters fall back to the model defaults, and the response explicitly states the final\neffective values.\n\n- Passing `free` or a value unsupported by the model for `ratio` reports an error directly. If it is\n  omitted, the model default ratio is used, but **landscape vs. portrait has a major impact on the\n  finished video, so proactively ask the user**.\n- `duration_sec` is the actual effective duration and is strongly tied to credits.\n\n**Tell the user both `credit_cost` and the Step 0 `credit` balance, then wait for confirmation**. If\nthe balance is insufficient, prompt the user to recharge first (see references/credits.md for the\nrecharge link and steps); do not force submission. This step is also when the prompt should be\nfinalized--confirm parameters and prompt together to avoid back-and-forth changes.\n\n## Step 3: Create the task (charges credits)\n\n```\nt2v_create_task(model, prompt, ratio?, quality?, duration?, mode?, audio?, movement_amplitude?)\n-> { task_id, task_status, model, quality, duration_sec, mode, ratio, credit_cost }\n```\n\n- `prompt` is **required**. See \"How to write prompts\" for wording.\n- Use the `ratio` confirmed in Step 2; it must be a concrete aspect ratio.\n- Parameters must match the set confirmed during the Step 2 quote, otherwise the actual charge may\n  not match the quote.\n- **Do not pass `image_urls`**--that parameter does not exist on `t2v_create_task`.\n\n## Step 4: Poll\n\n```\nt2v_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 5.\n- `task_status == \"fail\"`: relay `task_reason` to the user, then ask whether to adjust the\n  prompt and retry or give up. 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- Any other value: queued or generating; wait 10 seconds, query again, and briefly update the user.\n\n## Step 5: Download and deliver\n\nFollowing \"Showing artifacts\", download `video_url` to `$WORKDIR/result.mp4`, provide the local path\n+ original URL, and remind the user: the remote link points to temporary storage and may be cleaned\nup, and the local file under the system temporary directory may also be reclaimed by the system. The\nuser should save it to their own directory as soon as possible.\n\nDifferent generations from the same prompt will differ; this is normal. If the user is dissatisfied,\nprefer recommending **making the prompt more specific** (add subject details, camera movement,\nlighting, and mood) rather than immediately switching models and retrying.\n\n## Error handling\n\nFor login, connection, and service binding issues, see `references/auth.md` (**when not logged in,\nthe entire MCP namespace will not appear**; do not misdiagnose this as the plugin not being\ninstalled, and do not switch to another brand's MCP). See `references/errors.md` for common error\ncodes and handling; see `references/credits.md` for credits and billing rules; see\n`references/workflow.md` for each tool's response field structure.\n"
AFTER
"---\nname: text-to-video\ndescription: Generate an AI video directly from a text prompt (Enkio / enkiomv.ai). Use this when the user has no source image and wants a video based only on a written description, says text-to-video / text generated video / text to video / AI generate a video clip, or asks which text-to-video models are supported, how many credits it costs, or how long the output can be. If there is an input image and the user wants to animate it, use the enkio:image-to-video skill instead; if multiple reference images should be combined, use the enkio:reference-to-video skill instead; if the transition must be fixed by a first frame + last frame, use the enkio:first-end-frame-video skill instead. The whole workflow is completed through the enkio MCP service.\n---\n\n# Text-to-video\n\nCall enkiomv.ai's text-to-video capability through the `enkio` MCP service: **no input image is\nrequired**. Provide only a prompt plus parameters such as quality, duration, and aspect ratio, and\nthe model directly generates a brand-new video.\n\n## Service binding\n\nAll capabilities in this skill come from the single `enkio` MCP server, which **must not be\nreplaced**:\n\n- Its tool namespace in Codex is **`mcp__enkio`**--Codex normalizes `-` in server names to `_`, and\n  tool names have no prefix. Every tool name below (such as `get_user_profile`) refers to the tool of\n  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- **Never substitute another brand's MCP under any circumstances** (`mcp__selfyz_ai` and\n  `mcp__enkio` are two separate services, accounts, and credit pools; cross-use will charge the\n  wrong account for real). Also do not mix in a `task_id` / `job_id`, credit balance, or artifact URL\n  obtained elsewhere.\n- When you need to explain which service this skill is connected to, rely on 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\nThe essential difference from the other three video skills: those three all start from images;\nthis skill **has no asset upload and no cropping step**. The prompt is the only content input.\n\nTasks are **asynchronous**: `t2v_create_task` immediately returns a `task_id`, and you must poll\n`t2v_get_task` yourself.\n\n```\n0 Log in / check balance -> 1 Choose model -> 2 Set parameters and quote (confirm before charging)\n-> 3 Create task (charges credits) -> 4 Poll -> 5 Download, preview, and deliver\n```\n\n## Hard constraints\n\n- **This skill uses its own independent `t2v_*` tools. Do not mix them with `i2v_*` tools**. The\n  text-to-video model list comes from a different upstream field. Passing an image-to-video model\n  name into `t2v_*` reports \"nonexistent text-to-video model\", and vice versa.\n- **Creating a task charges credits. Before submitting, you must tell the user the cost and obtain\n  explicit confirmation**. All query tools are free.\n- **`prompt` is required** and is the only content input for this mode. Empty or whitespace-only\n  prompts are rejected directly. Prompt quality almost determines output quality, so it must be\n  specific. See \"How to write prompts\" below.\n- **`ratio` must be a concrete aspect ratio (such as `16:9` / `9:16` / `1:1`), not `free`**.\n  There is no input image from which the canvas can be inferred, so the server cannot decide for\n  you. If omitted, it falls back to the model's default ratio, but **you should proactively confirm\n  landscape vs. portrait with the user**.\n- **Do not call `create_upload_url`, and do not perform any cropping**. Text-to-video does not\n  accept assets. Even if the user provides images, they are not usable for this mode--that request\n  should use `enkio:image-to-video` or `enkio:reference-to-video` instead.\n- **Do not construct or guess `user_id`, `example`, signatures, or similar parameters**. The server\n  already handles them, and they do not exist in the tool inputs.\n- Allowed values for `quality` / `duration` / `mode` **must come from `t2v_list_models`**, and the\n  four dimensions must form a combination that appears in `combinations`.\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- If a task's `task_status` is `fail`, do not retry blindly. First tell the user the\n  `task_reason`, then ask what to do. Retrying re-submits the task at the normal price--failed\n  credits are refunded automatically, and this billing rule was already disclosed when quoting\n  the cost, so no new price confirmation is needed here.\n- **Before showing a video, you must download it locally first**. Pasting the remote URL directly\n  cannot be previewed. See \"Showing artifacts\".\n\n## How to write prompts\n\nText-to-video has **no visual reference at all**; the model can understand the scene only from the\ntext. If the prompt lacks information, the result will be very random. Therefore the prompt should\ncover **subject + action + scene + camera + lighting/style**.\n\n```\n✅ An orange cat sits beside a neon street on a rainy night and yawns; the wet ground reflects the\n   sign lights, the camera slowly pushes in from the side, cool tones, cinematic feel\n✅ An aerial view sweeps over an autumn valley; golden forests ripple in the wind, morning fog has\n   not yet dispersed, and the camera keeps tracking forward\n❌ A cat                              <- Only the subject; action, scene, and camera are all left for the model to guess\n❌ Generate a beautiful video          <- No executable information at all\n```\n\nIf the user's description is too brief, **help fill it out first and then confirm**. Do not submit\nwith a single vague sentence--one submission is one charge. You may proactively ask: what is the\nsubject, what is it doing, what is the scene, what camera movement and mood are desired?\n\nThe prompt length must not exceed `prompt_limit_length`. The model's `prompt_hint` is the upstream\nprompt-writing hint, and `prompt_guide_url` is the upstream prompt guide page. You may summarize\nthese for the user, but do not open the page on the user's behalf.\n\nThe aspect ratio should match the content: portrait (`9:16`) fits character close-ups and short-form\nvideos; landscape (`16:9`) fits scenery and cinematic shots.\n\n## Showing artifacts\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed-preview media files\nfrom these domains**; if you paste the URL directly, the user cannot open it.\n\nUse a task-isolated working directory (so the user's repository is not polluted):\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-t2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideos cannot be embedded for preview. Give the absolute local path and also include the original\nremote URL so the user can save it themselves. If the download fails (non-200 / empty file), clearly\nstate \"preview download failed\" and provide the remote URL; do not falsely claim that it was shown.\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- Verify that the returned `brand` must be **Enkio**. If it is not, the call is connected to the\n  wrong service; stop immediately and tell the user.\n\nRecord the returned `credit` as the current credit balance, and compare it with the estimated cost\nwhen quoting in Step 2.\n\n**Membership check (required).** Creating tasks with `t2v_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```\nt2v_list_models()\n-> { count, models: [ { model, model_name, model_desc, qualities, durations_sec,\n                       modes, ratios, default_ratio, movement_amplitudes, supports_audio,\n                       prompt_limit_length, prompt_hint, prompt_guide_url,\n                       combinations, ... } ] }\n```\n\n`models[].model` is the model identifier; all later calls use it. Briefly list the available models\nfor the user together with each model's supported resolutions, durations, modes, and aspect ratios,\nand let the user choose. If the user has no preference, choose a cost-effective default combination\nfrom `combinations` and explain why.\n\n`combinations` directly provides the credit cost for each \"mode + quality + duration\" combination;\nprioritize it when choosing parameters.\n\nIt is normal that the response **does not contain any image-related fields** (image count, crop,\nfirst/last frame).\n\n## Step 2: Set parameters and quote\n\n```\nt2v_get_options(model, quality?, duration?, mode?, audio?, ratio?)\n-> { model, model_name, quality, duration_sec, mode, audio, ratio, credit_cost,\n    prompt_required, prompt_limit_length, prompt_hint, prompt_guide_url, next_step }\n```\n\nOmitted parameters fall back to the model defaults, and the response explicitly states the final\neffective values.\n\n- Passing `free` or a value unsupported by the model for `ratio` reports an error directly. If it is\n  omitted, the model default ratio is used, but **landscape vs. portrait has a major impact on the\n  finished video, so proactively ask the user**.\n- `duration_sec` is the actual effective duration and is strongly tied to credits.\n\n**Tell the user both `credit_cost` and the Step 0 `credit` balance, then wait for confirmation**. If\nthe balance is insufficient, prompt the user to recharge first (see references/credits.md for the\nrecharge link and steps); do not force submission. This step is also when the prompt should be\nfinalized--confirm parameters and prompt together to avoid back-and-forth changes.\n\n## Step 3: Create the task (charges credits)\n\n```\nt2v_create_task(model, prompt, ratio?, quality?, duration?, mode?, audio?, movement_amplitude?)\n-> { task_id, task_status, model, quality, duration_sec, mode, ratio, credit_cost }\n```\n\n- `prompt` is **required**. See \"How to write prompts\" for wording.\n- Use the `ratio` confirmed in Step 2; it must be a concrete aspect ratio.\n- Parameters must match the set confirmed during the Step 2 quote, otherwise the actual charge may\n  not match the quote.\n- **Do not pass `image_urls`**--that parameter does not exist on `t2v_create_task`.\n\n## Step 4: Poll\n\n```\nt2v_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 5.\n- `task_status == \"fail\"`: relay `task_reason` to the user, then ask whether to adjust the\n  prompt and retry or give up. 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- Any other value: queued or generating; wait 10 seconds, query again, and briefly update the user.\n\n## Step 5: Download and deliver\n\nFollowing \"Showing artifacts\", download `video_url` to `$WORKDIR/result.mp4`, provide the local path\n+ original URL, and remind the user: the remote link points to temporary storage and may be cleaned\nup, and the local file under the system temporary directory may also be reclaimed by the system. The\nuser should save it to their own directory as soon as possible.\n\nDifferent generations from the same prompt will differ; this is normal. If the user is dissatisfied,\nprefer recommending **making the prompt more specific** (add subject details, camera movement,\nlighting, and mood) rather than immediately switching models and retrying.\n\n## Error handling\n\nFor login, connection, and service binding issues, see `references/auth.md` (**when not logged in,\nthe entire MCP namespace will not appear**; do not misdiagnose this as the plugin not being\ninstalled, and do not switch to another brand's MCP). See `references/errors.md` for common error\ncodes and handling; see `references/credits.md` for credits and billing rules; see\n`references/workflow.md` for each tool's response field structure.\n"
Full snapshot data
{
  "description": "Generate an AI video directly from a text prompt (Enkio / enkiomv.ai). Use this when the user has no source image and wants a video based only on a written description, says text-to-video / text generated video / text to video / AI generate a video clip, or asks which text-to-video models are supported, how many credits it costs, or how long the output can be. If there is an input image and the user wants to animate it, use the enkio:image-to-video skill instead; if multiple reference images should be combined, use the enkio:reference-to-video skill instead; if the transition must be fixed by a first frame + last frame, use the enkio:first-end-frame-video skill instead. The whole 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": 4281
    },
    {
      "relative_path": "references/errors.md",
      "size_in_bytes": 8026
    },
    {
      "relative_path": "references/workflow.md",
      "size_in_bytes": 6162
    }
  ],
  "name": "text-to-video",
  "skill_md_contents": "---\nname: text-to-video\ndescription: Generate an AI video directly from a text prompt (Enkio / enkiomv.ai). Use this when the user has no source image and wants a video based only on a written description, says text-to-video / text generated video / text to video / AI generate a video clip, or asks which text-to-video models are supported, how many credits it costs, or how long the output can be. If there is an input image and the user wants to animate it, use the enkio:image-to-video skill instead; if multiple reference images should be combined, use the enkio:reference-to-video skill instead; if the transition must be fixed by a first frame + last frame, use the enkio:first-end-frame-video skill instead. The whole workflow is completed through the enkio MCP service.\n---\n\n# Text-to-video\n\nCall enkiomv.ai's text-to-video capability through the `enkio` MCP service: **no input image is\nrequired**. Provide only a prompt plus parameters such as quality, duration, and aspect ratio, and\nthe model directly generates a brand-new video.\n\n## Service binding\n\nAll capabilities in this skill come from the single `enkio` MCP server, which **must not be\nreplaced**:\n\n- Its tool namespace in Codex is **`mcp__enkio`**--Codex normalizes `-` in server names to `_`, and\n  tool names have no prefix. Every tool name below (such as `get_user_profile`) refers to the tool of\n  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- **Never substitute another brand's MCP under any circumstances** (`mcp__selfyz_ai` and\n  `mcp__enkio` are two separate services, accounts, and credit pools; cross-use will charge the\n  wrong account for real). Also do not mix in a `task_id` / `job_id`, credit balance, or artifact URL\n  obtained elsewhere.\n- When you need to explain which service this skill is connected to, rely on 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\nThe essential difference from the other three video skills: those three all start from images;\nthis skill **has no asset upload and no cropping step**. The prompt is the only content input.\n\nTasks are **asynchronous**: `t2v_create_task` immediately returns a `task_id`, and you must poll\n`t2v_get_task` yourself.\n\n```\n0 Log in / check balance -> 1 Choose model -> 2 Set parameters and quote (confirm before charging)\n-> 3 Create task (charges credits) -> 4 Poll -> 5 Download, preview, and deliver\n```\n\n## Hard constraints\n\n- **This skill uses its own independent `t2v_*` tools. Do not mix them with `i2v_*` tools**. The\n  text-to-video model list comes from a different upstream field. Passing an image-to-video model\n  name into `t2v_*` reports \"nonexistent text-to-video model\", and vice versa.\n- **Creating a task charges credits. Before submitting, you must tell the user the cost and obtain\n  explicit confirmation**. All query tools are free.\n- **`prompt` is required** and is the only content input for this mode. Empty or whitespace-only\n  prompts are rejected directly. Prompt quality almost determines output quality, so it must be\n  specific. See \"How to write prompts\" below.\n- **`ratio` must be a concrete aspect ratio (such as `16:9` / `9:16` / `1:1`), not `free`**.\n  There is no input image from which the canvas can be inferred, so the server cannot decide for\n  you. If omitted, it falls back to the model's default ratio, but **you should proactively confirm\n  landscape vs. portrait with the user**.\n- **Do not call `create_upload_url`, and do not perform any cropping**. Text-to-video does not\n  accept assets. Even if the user provides images, they are not usable for this mode--that request\n  should use `enkio:image-to-video` or `enkio:reference-to-video` instead.\n- **Do not construct or guess `user_id`, `example`, signatures, or similar parameters**. The server\n  already handles them, and they do not exist in the tool inputs.\n- Allowed values for `quality` / `duration` / `mode` **must come from `t2v_list_models`**, and the\n  four dimensions must form a combination that appears in `combinations`.\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- If a task's `task_status` is `fail`, do not retry blindly. First tell the user the\n  `task_reason`, then ask what to do. Retrying re-submits the task at the normal price--failed\n  credits are refunded automatically, and this billing rule was already disclosed when quoting\n  the cost, so no new price confirmation is needed here.\n- **Before showing a video, you must download it locally first**. Pasting the remote URL directly\n  cannot be previewed. See \"Showing artifacts\".\n\n## How to write prompts\n\nText-to-video has **no visual reference at all**; the model can understand the scene only from the\ntext. If the prompt lacks information, the result will be very random. Therefore the prompt should\ncover **subject + action + scene + camera + lighting/style**.\n\n```\n✅ An orange cat sits beside a neon street on a rainy night and yawns; the wet ground reflects the\n   sign lights, the camera slowly pushes in from the side, cool tones, cinematic feel\n✅ An aerial view sweeps over an autumn valley; golden forests ripple in the wind, morning fog has\n   not yet dispersed, and the camera keeps tracking forward\n❌ A cat                              <- Only the subject; action, scene, and camera are all left for the model to guess\n❌ Generate a beautiful video          <- No executable information at all\n```\n\nIf the user's description is too brief, **help fill it out first and then confirm**. Do not submit\nwith a single vague sentence--one submission is one charge. You may proactively ask: what is the\nsubject, what is it doing, what is the scene, what camera movement and mood are desired?\n\nThe prompt length must not exceed `prompt_limit_length`. The model's `prompt_hint` is the upstream\nprompt-writing hint, and `prompt_guide_url` is the upstream prompt guide page. You may summarize\nthese for the user, but do not open the page on the user's behalf.\n\nThe aspect ratio should match the content: portrait (`9:16`) fits character close-ups and short-form\nvideos; landscape (`16:9`) fits scenery and cinematic shots.\n\n## Showing artifacts\n\nThe finished video is an Enkio **temporary remote URL**. Codex **cannot embed-preview media files\nfrom these domains**; if you paste the URL directly, the user cannot open it.\n\nUse a task-isolated working directory (so the user's repository is not polluted):\n\n```bash\nWORKDIR=\"${TMPDIR:-/tmp}/enkio-t2v/<task_id>\"\nmkdir -p \"$WORKDIR\"\ncurl -sS -L -o \"$WORKDIR/result.mp4\" \"<video_url>\"\n```\n\nVideos cannot be embedded for preview. Give the absolute local path and also include the original\nremote URL so the user can save it themselves. If the download fails (non-200 / empty file), clearly\nstate \"preview download failed\" and provide the remote URL; do not falsely claim that it was shown.\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- Verify that the returned `brand` must be **Enkio**. If it is not, the call is connected to the\n  wrong service; stop immediately and tell the user.\n\nRecord the returned `credit` as the current credit balance, and compare it with the estimated cost\nwhen quoting in Step 2.\n\n**Membership check (required).** Creating tasks with `t2v_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```\nt2v_list_models()\n-> { count, models: [ { model, model_name, model_desc, qualities, durations_sec,\n                       modes, ratios, default_ratio, movement_amplitudes, supports_audio,\n                       prompt_limit_length, prompt_hint, prompt_guide_url,\n                       combinations, ... } ] }\n```\n\n`models[].model` is the model identifier; all later calls use it. Briefly list the available models\nfor the user together with each model's supported resolutions, durations, modes, and aspect ratios,\nand let the user choose. If the user has no preference, choose a cost-effective default combination\nfrom `combinations` and explain why.\n\n`combinations` directly provides the credit cost for each \"mode + quality + duration\" combination;\nprioritize it when choosing parameters.\n\nIt is normal that the response **does not contain any image-related fields** (image count, crop,\nfirst/last frame).\n\n## Step 2: Set parameters and quote\n\n```\nt2v_get_options(model, quality?, duration?, mode?, audio?, ratio?)\n-> { model, model_name, quality, duration_sec, mode, audio, ratio, credit_cost,\n    prompt_required, prompt_limit_length, prompt_hint, prompt_guide_url, next_step }\n```\n\nOmitted parameters fall back to the model defaults, and the response explicitly states the final\neffective values.\n\n- Passing `free` or a value unsupported by the model for `ratio` reports an error directly. If it is\n  omitted, the model default ratio is used, but **landscape vs. portrait has a major impact on the\n  finished video, so proactively ask the user**.\n- `duration_sec` is the actual effective duration and is strongly tied to credits.\n\n**Tell the user both `credit_cost` and the Step 0 `credit` balance, then wait for confirmation**. If\nthe balance is insufficient, prompt the user to recharge first (see references/credits.md for the\nrecharge link and steps); do not force submission. This step is also when the prompt should be\nfinalized--confirm parameters and prompt together to avoid back-and-forth changes.\n\n## Step 3: Create the task (charges credits)\n\n```\nt2v_create_task(model, prompt, ratio?, quality?, duration?, mode?, audio?, movement_amplitude?)\n-> { task_id, task_status, model, quality, duration_sec, mode, ratio, credit_cost }\n```\n\n- `prompt` is **required**. See \"How to write prompts\" for wording.\n- Use the `ratio` confirmed in Step 2; it must be a concrete aspect ratio.\n- Parameters must match the set confirmed during the Step 2 quote, otherwise the actual charge may\n  not match the quote.\n- **Do not pass `image_urls`**--that parameter does not exist on `t2v_create_task`.\n\n## Step 4: Poll\n\n```\nt2v_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 5.\n- `task_status == \"fail\"`: relay `task_reason` to the user, then ask whether to adjust the\n  prompt and retry or give up. 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- Any other value: queued or generating; wait 10 seconds, query again, and briefly update the user.\n\n## Step 5: Download and deliver\n\nFollowing \"Showing artifacts\", download `video_url` to `$WORKDIR/result.mp4`, provide the local path\n+ original URL, and remind the user: the remote link points to temporary storage and may be cleaned\nup, and the local file under the system temporary directory may also be reclaimed by the system. The\nuser should save it to their own directory as soon as possible.\n\nDifferent generations from the same prompt will differ; this is normal. If the user is dissatisfied,\nprefer recommending **making the prompt more specific** (add subject details, camera movement,\nlighting, and mood) rather than immediately switching models and retrying.\n\n## Error handling\n\nFor login, connection, and service binding issues, see `references/auth.md` (**when not logged in,\nthe entire MCP namespace will not appear**; do not misdiagnose this as the plugin not being\ninstalled, and do not switch to another brand's MCP). See `references/errors.md` for common error\ncodes and handling; see `references/credits.md` for credits and billing rules; see\n`references/workflow.md` for each tool's response field structure.\n"
}

SHA-256 of public snapshot: 9e4a077ad4ae450fa2c67a5ce17551d061c88b45cd6f108bab2a6a400546faac