Install any skill in seconds. Free to start, no credit card required.
Get Started Free →MCP server for AI agents to create video ads via Streamable HTTP. Primary auth is OAuth 2.1 + Dynamic Client Registration (the modern Claude Desktop / Claude.ai / ChatGPT / Cursor "Connect" flow); long-lived API keys remain supported for headless clients.
.claude/skills/prizmad-mcp-server/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 11 |
| gemini-3.1-pro-preview | 100% | 2 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 70% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 106% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 82% | 0% |
Prizmad exposes a remote Model Context Protocol (MCP) server. Any MCP-compatible host (Claude Desktop, Claude.ai web, ChatGPT, Cursor, Continue, Zed, Claude Code CLI, n8n, custom SDKs) connects and drives the full UGC video studio programmatically.
https://prizmad.com/api/mcpstreamable-httpModern MCP clients click Add custom connector → enter the MCP URL and the OAuth flow runs automatically:
https://prizmad.com/api/mcp → 401 with WWW-Authenticate: Bearer resource_metadata="…"./.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server.POST /oauth/register (RFC 7591 Dynamic Client Registration) — no manual app pre-registration needed.https://prizmad.com/oauth/authorize → user signs in (NextAuth) → consent screen → redirect back with code.code for an RS256 JWT (audience https://prizmad.com/api/mcp).https://prizmad.com/api/mcp with Authorization: Bearer <jwt>. Refresh tokens rotate; PKCE S256 mandatory.Compatible clients: Claude Desktop, Claude.ai, ChatGPT, Cursor, Zed, Claude Code CLI. Same-origin design (authorize/token/register all live on prizmad.com) sidesteps the Claude.ai web bug that ignores cross-origin authorization endpoints.
json{ "mcpServers": { "prizmad": { "transport": "streamable-http", "url": "https://prizmad.com/api/mcp" } } }
The Connect flow handles the Bearer token automatically. To pre-fill an existing API key instead, add "headers": { "Authorization": "Bearer przmad_sk_live_..." }.
json{ "mcpServers": { "prizmad": { "command": "npx", "args": ["-y", "@prizmad/mcp-server"], "env": { "PRIZMAD_API_KEY": "przmad_sk_live_..." } } } }
Or via the generic bridge: ["mcp-remote", "https://prizmad.com/api/mcp"].
| Path | When | Token shape | |---|---|---| | OAuth 2.1 Authorization Code + PKCE + DCR | Interactive clients (Claude Desktop, etc.) | RS256 JWT (1 h), refresh rotated (30 d) | | OAuth 2.0 client_credentials | Headless / server-to-server | HS256 JWT (1 h) | | API key (Bearer) | Quickest for dev, scripts, internal tools | przmad_sk_live_... |
All three resolve to the same per-user identity. Discovery: /.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource, /.well-known/jwks.json.
| Tool | Auth | Purpose | |------|:----:|---------| | list_templates | No | Full template catalog with features and token costs | | list_avatars | No | Built-in avatar presets with recommended voices | | recommend_template | No | Pick top-3 templates from intent + constraints (voice / avatar / duration / budget). Use this before create_video instead of guessing from the catalog. | | list_my_videos | Yes | Recent projects with projectUrl / shareUrl / downloadUrl | | upload_image | Yes | Upload an image (URL or base64) → returns prizmad.com-hosted URL for use as productImages / avatar | | create_video | Yes | Start a render. Returns videoId. | | get_video_status | Yes | Snapshot status by default; with wait: true it blocks server-side and streams notifications/progress until terminal (up to 10 min) — preferred over polling. | | get_download_url | Yes | Authenticated download URL on prizmad.com for a completed video | | create_video_batch | Yes | Launch up to 20 renders in parallel; pre-checks total token cost |
list_templates and list_avatars are deliberately public so an agent can browse before authenticating.
create_video (and per-item in create_video_batch)All optional; omit any field for a randomised pick at render time.
captionStyle — on-video subtitles| Value | Look | |-------|------| | classic | TikTok yellow highlight, white sans-serif (default fallback) | | bold-impact | MrBeast / Hormozi — uppercase Anton with heavy black stroke and green highlight | | karaoke | Active word colour-sweeps left-to-right as it's spoken | | pop | Active word springs up in scale, inactive words dim | | bounce | Active word hops up with a low-damping spring (Fredoka) | | neon | Pink/cyan glowing halo (Audiowide) | | typewriter | Characters reveal one-by-one with a blinking caret (JetBrains Mono) | | glow | Soft white halo, gentle scale on the active word (Montserrat) |
musicStyle — background musicenergetic, friendly, professional, luxury, funny, cinematic, lo-fi, hip-hop, acoustic.
ctaStyle — end-card| Value | Look | |-------|------| | classic | Solid dark backdrop, centered title + price, green "LINK BELOW" pill | | blurred-photo | First creative blurred behind minimal cream title + price + circled down-arrow | | dark-solid | Same minimal layout on a solid warm-dark backdrop |
imageStyle — lighting/palette preset for AI creatives (10 options)warm-golden, bright-neutral, cool-diffused, window-light, earthy-ambient, studio-clean, moody-dramatic, pastel-soft, nordic-minimal, sunset-warm.
imagePromptHint, videoPromptHint, musicPromptHint — each ≤ 400 chars, layered on top of style presets.
get_video_status returns three URLs once rendering is complete — they map cleanly:
| Field | Goes to | |---|---| | projectUrl | https://prizmad.com/projects/<id> — owner-only dashboard with player, remix, edit, asset library. Primary link when handing the result back to the signed-in user. | | shareUrl | https://prizmad.com/share/<token> — public share page, useful only when forwarding the video to someone outside the account. | | downloadUrl | https://prizmad.com/api/v1/videos/<id>/download — authenticated mp4 stream proxied via prizmad.com. |
The raw Vercel Blob URL is never surfaced to the agent.
textrecommend_template ─► create_video ─► get_video_status (wait: true) ─► projectUrl + downloadUrl
recommend_template({ intent, hasVoiceover, hasAvatar, targetDurationSec, maxTokens }) — pick a template.upload_image if the agent wants to attach product photos that aren't yet on the web.create_video with templateId + productUrl (scraped) or explicit productTitle / productDescription / productImages + any customisation. Returns videoId.get_video_status({ videoId, wait: true }) — blocks server-side, streams progress, returns the final payload when ready (3–8 minutes typical, capped at 10 min).projectUrl to the user.For bulk campaigns use create_video_batch (1–20 per request).
/api/v1/videos returns 403 with a clear upgrade message otherwise).create_video debits the caller's Prizmad token balance.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 12,036 | 9,842 | -18% | 1 | 1 | 0% | 1,890 | 2,948 | +56% | 0 | 0 | — |
case-04 | fail→pass | 15,276 | 13,132 | -14% | 1 | 1 | 0% | 2,932 | 4,986 | +70% | 0 | 0 | — |
case-05 | fail→pass | 8,514 | 5,050 | -41% | 1 | 1 | 0% | 1,785 | 3,107 | +74% | 0 | 0 | — |
case-01 | fail→fail | 6,825 | 6,854 | +0% | 1 | 1 | 0% | 1,150 | 2,580 | +124% | 0 | 0 | — |
case-02 | fail→fail | 9,350 | 11,520 | +23% | 1 | 1 | 0% | 841 | 3,467 | +312% | 0 | 0 | — |
case-06 | fail→pass | 8,965 | 2,508 | -72% | 1 | 1 | 0% | 1,396 | 2,647 | +90% | 0 | 0 | — |
case-07 | fail→pass | 12,525 | 2,357 | -81% | 1 | 1 | 0% | 1,248 | 2,573 | +106% | 0 | 0 | — |
case-08 | fail→pass | 8,394 | 2,069 | -75% | 1 | 1 | 0% | 1,356 | 2,473 | +82% | 0 | 0 | — |
case-09 | fail→pass | 13,710 | 2,446 | -82% | 1 | 1 | 0% | 2,141 | 2,591 | +21% | 0 | 0 | — |
case-10 | pass→pass | 10,218 | 1,782 | -83% | 1 | 1 | 0% | 1,787 | 2,447 | +37% | 0 | 0 | — |
case-11 | fail→pass | 6,247 | 1,244 | -80% | 1 | 1 | 0% | 997 | 2,342 | +135% | 0 | 0 | — |
case-12 | pass→pass | 7,135 | 1,797 | -75% | 1 | 1 | 0% | 1,374 | 2,452 | +78% | 0 | 0 | — |
case-13 | fail→pass | 10,501 | 1,323 | -87% | 1 | 1 | 0% | 1,633 | 2,375 | +45% | 0 | 0 | — |
case-14 | fail→pass | 15,584 | 1,396 | -91% | 1 | 1 | 0% | 1,494 | 2,435 | +63% | 0 | 0 | — |
case-15 | fail→pass | 10,597 | 1,469 | -86% | 1 | 1 | 0% | 1,570 | 2,396 | +53% | 0 | 0 | — |
case-16 | pass→pass | 7,604 | 1,784 | -77% | 1 | 1 | 0% | 966 | 2,366 | +145% | 0 | 0 | — |
case-17 | pass→pass | 8,230 | 1,935 | -76% | 1 | 1 | 0% | 1,393 | 2,363 | +70% | 0 | 0 | — |
case-18 | fail→pass | 8,735 | 1,970 | -77% | 1 | 1 | 0% | 1,197 | 2,492 | +108% | 0 | 0 | — |
case-19 | fail→pass | 10,552 | 4,198 | -60% | 1 | 1 | 0% | 1,943 | 3,062 | +58% | 0 | 0 | — |
case-20 | pass→pass | 8,449 | 7,228 | -14% | 1 | 1 | 0% | 1,727 | 3,586 | +108% | 0 | 0 | — |
case-21 | pass→pass | 11,643 | 20,819 | +79% | 1 | 1 | 0% | 2,526 | 4,633 | +83% | 0 | 0 | — |
case-22 | pass→pass | 11,924 | 9,992 | -16% | 1 | 1 | 0% | 2,270 | 4,456 | +96% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.