# VibeSKU Clips

> AI 带货短视频神器：一张商品图，自动产出抖音/快手/小红书/TikTok Shop 卖货短视频

- **Type:** MCP server
- **Install:** `agentstack add mcp-ullrai-vibesku-clips`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [UllrAI](https://agentstack.voostack.com/s/ullrai)
- **Installs:** 0
- **Category:** [Content & Media](https://agentstack.voostack.com/c/content-and-media)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [UllrAI](https://github.com/UllrAI)
- **Source:** https://github.com/UllrAI/VibeSKU-Clips
- **Website:** https://Clips.VibeSKU.com/

## Install

```sh
agentstack add mcp-ullrai-vibesku-clips
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# VibeSKU Clips

[中文版](README.zh-CN.md) | English

VibeSKU Clips turns product material into a localised UGC video. An
operator submits a product link or images with a brief; the platform reads the
product, writes a market-specific script, optionally draws a storyboard,
generates the clip, checks it against a quality gate, and hands back the asset
with a delivery manifest.

The platform produces material and the manifest. Account login, publishing,
storefront links, product tagging, and performance observation stay with the
operations team.

## ✨ What it does

- **Product understanding.** Reads a product link, uploaded images, and a brief
  into recorded product facts. Anything the material does not support is flagged
  for a top-up rather than invented.
- **Localised scripts.** Output language and target market are separate
  settings, so Spanish for Mexico and Spanish for Spain are different scripts,
  each with its own voiceover, subtitles, and publish caption.
- **Three delivery formats.** Presenter, everyday scene, and how-to-use, each a
  production recipe with its own beat structure and rotating opening angles.
- **Talent references.** Upload a licensed photo or describe a fictional adult
  performer. Approved images guide each generated shot.
- **One clip at a time.** Product, talent, script, optional storyboard, and video
  form one guided path, with a human confirmation before each expensive step.
- **Measured quality checks.** FFprobe verifies media duration and streams;
  hosted ASR checks spoken words and supplies subtitle times. Operators review
  visual accuracy and performer consistency.
- **Review and regeneration.** Replace one shot or regenerate a full version
  while preserving the other shots and the existing final clip.
- **Exports with a manifest.** Every asset includes its reference number,
  product, language, market, talent, licence note, and disclosure line.
- **Asset and consumption records.** Products, talent, scripts, and approved
  clips keep their source, licence, and version lineage; analysis, scripting,
  rendering, retries, and regenerations are metered separately.

Delivery specification: selectable 15–120 seconds, 9:16 or 16:9 framing, and a
provider-compatible resolution, with cover, subtitles, publish caption, and a
synthetic-content disclosure.

## 🧱 How production runs

| Stage      | Job                   | What it does                                                                                      |
| :--------- | :-------------------- | :------------------------------------------------------------------------------------------------ |
| Intake     | `ugc.product.ingest`  | Imports the product page through Firecrawl, reads facts, and waits for review or missing material |
| Script     | `ugc.work.script`     | Writes one script from the confirmed product, talent, language, and market                        |
| Storyboard | `ugc.work.storyboard` | Draws one key frame per beat and stops for confirmation                                           |
| Video      | `ugc.work.video`      | Creates durable shot tasks and an immutable composition snapshot                                  |
| Shot       | `ugc.work.segment`    | Generates and archives one shot; cloud ASR/TTS checks its spoken track                            |
| Compose    | `ugc.work.compose`    | FFmpeg probes, normalizes, captions, and concatenates the final clip                              |

Jobs run on pg-boss through the repository's task-run outbox, so each step
survives a restart and can be retried on its own. Images go through Prism;
video uses the provider selected by `VIDEO_GENERATION_PROVIDER`, product-page
imports use Firecrawl, and scripting uses any OpenAI-compatible endpoint. Prism video is fixed to H3; lk666 also
offers Seedance 2.0 and 2.5, with each model exposing only its supported output
resolutions. The general worker runs provider jobs; a dedicated render worker
runs FFmpeg and FFprobe. Generated files stream into private R2 storage.

Business logic lives in `src/lib/ugc`, the job handlers in `src/lib/jobs/ugc`,
and the operator surfaces under `src/app/dashboard`.

## 🛠️ Tech Stack

| Category            | Technology                                                                                                                                             |
| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Framework**       | [Next.js](https://nextjs.org/) 16                                                                                                                      |
| **Language**        | [TypeScript](https://www.typescriptlang.org/)                                                                                                          |
| **UI**              | [React](https://react.dev/), [shadcn/ui](https://ui.shadcn.com/), [Tailwind v4](https://tailwindcss.com/), [Lucide React](https://lucide.dev/) (icons) |
| **Auth**            | [Better-Auth](https://better-auth.com/)                                                                                                                |
| **Database**        | [PostgreSQL](https://www.postgresql.org/)                                                                                                              |
| **ORM**             | [Drizzle ORM](https://orm.drizzle.team/)                                                                                                               |
| **Payments**        | [Stripe](https://stripe.com/)                                                                                                                          |
| **Media**           | Prism images, selectable Prism or lk666 video, Alibaba Cloud ASR/TTS, FFmpeg composition                                                               |
| **AI**              | [Vercel AI SDK](https://ai-sdk.dev/) v7, any OpenAI-compatible LLM endpoint                                                                            |
| **Email**           | [Resend](https://resend.com/), [React Email](https://react.email/)                                                                                     |
| **Forms**           | [React Hook Form](https://react-hook-form.com/), [Zod](https://zod.dev/)                                                                               |
| **Deployment**      | [Zeabur](https://zeabur.com/) or Docker                                                                                                                |
| **Package Manager** | [pnpm](https://pnpm.io/)                                                                                                                               |

## 🚀 Quick Start

### 1. Environment Setup

Ensure you have the following software installed in your development environment:

- [Node.js](https://nodejs.org/en/) 22 or newer
- [pnpm](https://pnpm.io/installation)

### 2. Project Clone & Installation

```bash
# Clone the repository
git clone https://github.com/UllrAI/VibeSKU-Clips.git

# Enter project directory
cd vibesku-clips

# Install dependencies with pnpm
pnpm install
```

### 3. Environment Configuration

The project is configured through environment variables. First, copy the example file:

```bash
cp .env.example .env
```

Then edit `.env` and fill in the core values plus the credentials for the
features enabled in `src/lib/config/site.js`.

#### Starter feature selection

`SITE_CONFIG` is the client-safe source of truth for brand, contact, links,
assets, and the static `emailAuth`, `billing`, `uploads`, and `ai` feature
switches. All features default to enabled. Disable an unused feature there before
removing its environment variables. Disabled features are removed from
navigation and guarded at their pages, APIs, plugins, and server actions.

If `emailAuth` is disabled, configure at least one complete OAuth provider so
the web sign-in flow remains usable. Credentials remain server-only and must
never be added to `SITE_CONFIG`.

#### Environment Variables

| Variable Name                  | Description                                                     | Example                                             |
| :----------------------------- | :-------------------------------------------------------------- | :-------------------------------------------------- |
| `DATABASE_URL`                 | **Required.** PostgreSQL connection string.                     | `postgresql://user:password@localhost:5432/db_name` |
| `JOB_DATABASE_URL`             | Optional pg-boss database; defaults to `DATABASE_URL`.          | `postgresql://user:password@localhost:5432/db_name` |
| `JOB_DB_POOL_SIZE`             | Optional pg-boss pool size per process; defaults to `3`.        | `3`                                                 |
| `WORKER_GRACEFUL_TIMEOUT_MS`   | Optional Worker SIGTERM drain deadline; defaults to 30 seconds. | `30000`                                             |
| `RATE_LIMIT_IP_HEADER`         | Optional trusted client-IP header; defaults to Zeabur.          | `x-forwarded-for`                                   |
| `NEXT_PUBLIC_APP_URL`          | **Required.** Public URL of your deployed app.                  | `http://localhost:3000` or `https://yourdomain.com` |
| `BING_SITE_VERIFICATION`       | Optional Bing Webmaster `msvalidate.01` verification token.     | Value issued for your deployed hostname             |
| `NEXT_PUBLIC_UMAMI_SCRIPT_URL` | Optional Umami tracker URL; set all three Umami variables.      | `https://analytics.example.com/script.js`           |
| `NEXT_PUBLIC_UMAMI_WEBSITE_ID` | Optional deployment-specific Umami website UUID.                | `00000000-0000-4000-8000-000000000000`              |
| `NEXT_PUBLIC_UMAMI_DOMAINS`    | Optional comma-separated host allowlist for this deployment.    | `yourdomain.com`                                    |
| `BETTER_AUTH_SECRET`           | **Required.** Random session secret, at least 32 characters.    | Generate with `openssl rand -base64 32`             |
| `RESEND_API_KEY`               | Required when `emailAuth` is enabled. Resend API key.           | `re_xxxxxxxxxxxxxxxx`                               |
| `RESEND_EMAIL_FROM`            | Required when `emailAuth` is enabled. Verified sender.          | `noreply@your-verified-domain.com`                  |
| `LLM_API_KEY`                  | Required when `ai` is enabled. Key for your LLM endpoint.       | `sk-...`                                            |
| `LLM_BASE_URL`                 | Optional OpenAI-compatible endpoint; defaults to OpenRouter.    | `https://openrouter.ai/api/v1`                      |
| `AI_DEFAULT_MODEL`             | Optional model id; defaults to `openai/gpt-5.6-luna`.           | `openai/gpt-5.6-luna`                               |
| `FIRECRAWL_API_BASE_URL`       | Optional Firecrawl-compatible API root.                         | `https://api.firecrawl.dev/v2`                      |
| `FIRECRAWL_API_KEY`            | **Required for product URL imports.** Worker-only API key.      | `fc-...`                                            |
| `VIDEO_GENERATION_PROVIDER`    | Video backend: `prism` or `lk666`; defaults to Prism.           | `lk666`                                             |
| `PRISM_API_BASE_URL`           | Prism root; staging outside production, production in prod.     | `https://staging-prism.ullrai.com/api/v1`           |
| `PRISM_API_KEY`                | **Required for rendering.** Prism API key for the chosen host.  | `pk_...`                                            |
| `PRISM_API_SECRET`             | **Required for rendering.** Prism secret for the chosen host.   | `sk_...`                                            |
| `LK666_API_BASE_URL`           | Optional lk666-compatible API root.                             | `https://api.lk888.ai`                              |
| `LK666_API_KEY`                | Required when the selected video backend is `lk666`.            | `sk-...`                                            |
| `DASHSCOPE_API_KEY`            | Required for hosted ASR on every video and optional TTS.        | `sk-...`                                            |
| `DASHSCOPE_ASR_BASE_URL`       | Optional ASR API root; defaults to Beijing DashScope.           | `https://dashscope.aliyuncs.com/api/v1`             |
| `DASHSCOPE_TTS_BASE_URL`       | Optional Qwen3-TTS API root; defaults to the ASR API root.      | `https://dashscope.aliyuncs.com/api/v1`             |
| `DASHSCOPE_TTS_VOICE`          | Optional multilingual Qwen3-TTS voice; defaults to `Cherry`.    | Supported Qwen3-TTS voice ID                        |
| `STRIPE_SECRET_KEY`            | Required for billing. Prefer a least-privilege restricted key.  | `rk_test_...` or `rk_live_...`                      |
| `STRIPE_ENVIRONMENT`           | Stripe mode; defaults to `test_mode`.                           | `test_mode` or `live_mode`                          |
| `STRIPE_WEBHOOK_SECRET`        | Required when `billing` is enabled. Endpoint signing secret.    | `whsec_your_webhook_secret`                         |
| `R2_ENDPOINT`                  | Required when `uploads` is enabled. R2 API endpoint.            | `https://.r2.cloudflarestorage.com`     |
| `R2_ACCESS_KEY_ID`             | Required when `uploads` is enabled. R2 access key ID.           | `your_r2_access_key_id`                             |
| `R2_SECRET_ACCESS_KEY`         | Required when `uploads` is enabled. R2 secret key.              | `your_r2_secret_access_key`                         |
| `R2_BUCKET_NAME`               | Required when `uploads` is enabled. R2 bucket name.             | `your_r2_bucket_name`                               |
| `GITHUB_CLIENT_ID`             | _Optional._ GitHub OAuth Client ID.                             | `your_github_client_id`                             |
| `GITHUB_CLIENT_SECRET`         | _Optional._ GitHub OAuth Client Secret.                         | `your_github_client_secret`                         |
| `GOOGLE_CLIENT_ID`             | _Optional._ Google OAuth Client ID.                             | `your_google_client_id`                             |
| `GOOGLE_CLIENT_SECRET`         | _Optional._ Google OAuth Client Secret.                         | `your_google_client_secret`                         |
| `LINKEDIN_CLIENT_ID`           | _Optional._ LinkedIn OAuth Client ID.                           | `your_linkedin_client_id`                           |
| `LINKEDIN_CLIENT_SECRET`       | _Optional._ LinkedIn OAuth Client Secret.                       | `your_linkedin_client_secret`                       |

> **Tip:** You can generate a secure key using the following command:
> `openssl rand -base64 32`
>
> **Optional local CLI auth:** for scripts, local agents, or quick terminal access, you can export `VIBESKU_CLIPS_CLI_API_KEY=ssk_...` instead of storing credentials in the CLI config.

#### Analytics

Umami tracking is optional and disabled unless all three public Umami variables
are set. Each deployment must create its own website in Umami and use its own
website ID; never copy the maintainer deployment's ID into a fork. The tracker
honors Do Not Track, excludes URL search parameters, and only records the hosts
listed in `NEXT_PUBLIC_UMAMI_DOMAINS`.

The stable event vocabulary is `cta_click`, `signup_click`, `signup_submit`,
`signup_link_sent`, `login_submit`, `login_link_sent`, `signup_success`,
`pricing_view`, `payment_start`, and `payment_success`.
Tracking is best-effort and never controls authentication or billing behavior.
Umami's accounting remains separate from provider webhooks and database records.

This configuration is cookieless, but operators remain responsible for their
privacy notice and any consent flow required by the data

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [UllrAI](https://github.com/UllrAI)
- **Source:** [UllrAI/VibeSKU-Clips](https://github.com/UllrAI/VibeSKU-Clips)
- **License:** MIT
- **Homepage:** https://Clips.VibeSKU.com/

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-ullrai-vibesku-clips
- Seller: https://agentstack.voostack.com/s/ullrai
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
